April 2026 · DSLM · Transparency
Every student goal in Edooqoo shows a 0–100% progress bar. The number is not magic and it is not arbitrary. It comes from up to three signals combined in a specific, transparent way. This article explains the mechanism in plain language so you can trust it, override it when you need to, and understand the dash ("—") when it appears.
Goal Progress measures how far a student has come against the learning elements you defined for that goal. It is not a measure of how many lessons happened, how much money was paid, or how engaged the student feels. It is strictly: "for the things you said this goal requires, how mastered are they?"
This means goals with zero defined elements show "—", not 0%. There is nothing to measure yet.
If a learning element under your goal matches a tracked skill in the student's DSLM (Dynamic Student Learning Model), Edooqoo uses the behavioral mastery score from real lessons — a 0–100 number that updates every time the student completes a relevant exercise.
Example: your goal is "Order food and drinks in restaurants" and one element is "Polite phrasing". The DSLM tracks a micro-skill called "Politeness register". After four worksheets touching that micro-skill, the system has a mastery score of 72. That 72 becomes the score for that element.
If an element does not match any tracked skill, Edooqoo falls back to your manual star rating on that element (1–5 stars). The conversion is straightforward: rating × 20. Five stars = 100%. Three stars = 60%. Zero stars (unrated) = excluded from the average entirely.
Example: same goal has an element "Salary negotiation phrases". There is no specific micro-skill that matches "salary negotiation", so the system uses your 4-star rating → 80%.
You can set a manual progress percentage on any goal. This number combines with the computed value using MAX, not average: the final shown percentage is the higher of the two.
Edooqoo tracks three levels of language skills with decreasing granularity:
| Level | Example | Has its own mastery score? |
|---|---|---|
| Skill | "Speaking" | Yes |
| Micro-skill | "Phone calls" | Yes |
| Nano-skill | "Leaving voicemails" | No (too granular) |
Goal elements are matched against Skills and Micro-skills only. Nano-skills are deliberately excluded from automatic matching because they're too narrow — there isn't enough data to form a reliable mastery aggregate at that level. When you add an element like "Leaving voicemails", the system tries to find its parent micro-skill ("Phone calls") via the optional nano_skill_link tag. If no match exists, the system falls back to your star rating — by design, because at the nano-skill level, your manual judgment IS the most reliable signal.
Once each rated element has a score (from Signal 1 or Signal 2), the goal score is the simple arithmetic mean of those scores. Unrated elements without any skill match are skipped entirely — they don't count as 0%.
Example with three elements:
Computed = (72 + 80) / 2 = 76%.
For the "Main Goal" banner at the top of the student panel, Edooqoo aggregates across all goals — supporting, additional, and main alike — by treating their elements as one combined pool. This avoids favoring goals with fewer elements. The same priority and MAX rules apply.
The dash appears when the system has nothing reliable to show:
It is intentionally not shown as 0% — that would be misleading. 0% means "tracked at zero". "—" means "nothing to track yet".
Below each progress bar Edooqoo writes a small "Sources:" label, e.g.:
This is honesty in the UI: you can always see what fed the number.
The algorithm is stable and intentionally simple. The following invariants will not change without a major version bump:
Don't use it to hide low scores — the algorithm will ignore your override in that direction. Improve the underlying ratings or skill metrics instead.