Progress — Learner Dashboard
Read-only view over the learner's state (formats in ../teach/references/state-format.md). Present it in the learner's language. Change no files.
Because this skill writes nothing, it never touches the streak: opening a dashboard is not study activity. Report streak.days exactly as stored and leave last_study_date alone — the study day is recorded by teach, quiz, exam, and review under the idempotent-per-calendar-day rule in state-format.md.
Flow
- Read
~/.claude/tutor/profile.json and every courses/*/ (resolve ~ to an absolute path yourself). No state at all → explain the system in three lines and offer to start a course with the teach skill.
- Render, per course:
Music Theory — Harmony Unit 3/6 · Lesson 2
Mastery ████████░░░░░░░ 9 mastered · 5 learned · 6 learning · 12 new
Quizzes U1 85% · U2 92% Midterm: pending (after U3)
Reviews 7 due today · next batch Fri · 4 cards retired
Weak secondary dominants · cadence identification (2 open misconceptions)
- Use the exact four status names from state-format.md (
new, learning, learned, mastered). Never invent buckets and never fold learned into mastered — that would violate the honesty rules below.
- The due count excludes retired cards. Count only cards with
due ≤ today and retired not true, so this number matches what a review session would actually ask. Report retirements separately; they are the durable milestone and worth seeing.
- Global footer: streak (neutral framing), XP and level, and the calibration trend.
- Calibration trend — show it once there are at least three assessments whose
predicted is a number. predicted and score are both fractions from 0 to 1, so take the mean of score − predicted and state it in percentage points: "your predictions run about 10 points under your scores — you underestimate yourself."
- Skip assessments with
"predicted": null; they were refused, not missing. If fewer than three numeric predictions exist, say the trend isn't available yet, and if the nulls carry per-item "sure / not sure" summaries in their note, report that pattern instead ("on the items you marked sure, you were right 9 times out of 10").
- Progress evidence, not just numbers: one concrete then-versus-now line pulled from state history. "March 10: couldn't name the chord under a melody note → today: analyzing a modulation you'd never seen." Specific beats flattering.
- One recommended next action with a reason, chosen by priority: ≥ 5 non-retired cards due → the review skill · a finished unit with no quiz → the quiz skill · remediation pending → the teach skill for a re-teach · otherwise → the teach skill to continue. Name the skill and let the learner invoke it however they installed it (
/review, /tutor:review, or just "review my cards"). Offer it; don't command it — the learner chooses.
Honesty rules
Report exactly what the state files say — no rounding up, no motivational inflation. If the streak broke, show the new count without commentary. If a unit looks stalled (no activity for two weeks or more), name it kindly and ask whether the plan still fits; a course that stopped being right is a plan problem, not a learner problem.
1---2name: progress3description: Show the learner's tutor dashboard — courses, mastery map, streak, due reviews, weak spots, and recommended next step. Use when the user asks how they're doing, where they left off, or for their learning progress/stats.4---56# Progress — Learner Dashboard78Read-only view over the learner's state (formats in [../teach/references/state-format.md](../teach/references/state-format.md)). Present it in the learner's language. **Change no files.**910Because this skill writes nothing, it never touches the streak: opening a dashboard is not study activity. Report `streak.days` exactly as stored and leave `last_study_date` alone — the study day is recorded by teach, quiz, exam, and review under the idempotent-per-calendar-day rule in state-format.md.1112## Flow13141. Read `~/.claude/tutor/profile.json` and every `courses/*/` (resolve `~` to an absolute path yourself). No state at all → explain the system in three lines and offer to start a course with the **teach** skill.152. Render, per course:1617```18Music Theory — Harmony Unit 3/6 · Lesson 219 Mastery ████████░░░░░░░ 9 mastered · 5 learned · 6 learning · 12 new20 Quizzes U1 85% · U2 92% Midterm: pending (after U3)21 Reviews 7 due today · next batch Fri · 4 cards retired22 Weak secondary dominants · cadence identification (2 open misconceptions)23```2425 - Use the exact four status names from state-format.md (`new`, `learning`, `learned`, `mastered`). Never invent buckets and never fold `learned` into `mastered` — that would violate the honesty rules below.26 - **The due count excludes retired cards.** Count only cards with `due` ≤ today and `retired` not `true`, so this number matches what a review session would actually ask. Report retirements separately; they are the durable milestone and worth seeing.273. **Global footer:** streak (neutral framing), XP and level, and the calibration trend.28 - **Calibration trend** — show it once there are **at least three assessments whose `predicted` is a number**. `predicted` and `score` are both fractions from 0 to 1, so take the mean of `score − predicted` and state it in percentage points: "your predictions run about 10 points under your scores — you underestimate yourself."29 - Skip assessments with `"predicted": null`; they were refused, not missing. If fewer than three numeric predictions exist, say the trend isn't available yet, and if the nulls carry per-item "sure / not sure" summaries in their `note`, report that pattern instead ("on the items you marked *sure*, you were right 9 times out of 10").304. **Progress evidence, not just numbers:** one concrete then-versus-now line pulled from state history. "March 10: couldn't name the chord under a melody note → today: analyzing a modulation you'd never seen." Specific beats flattering.315. **One recommended next action** with a reason, chosen by priority: ≥ 5 non-retired cards due → the **review** skill · a finished unit with no quiz → the **quiz** skill · remediation pending → the **teach** skill for a re-teach · otherwise → the **teach** skill to continue. Name the skill and let the learner invoke it however they installed it (`/review`, `/tutor:review`, or just "review my cards"). Offer it; don't command it — the learner chooses.3233## Honesty rules3435Report exactly what the state files say — no rounding up, no motivational inflation. If the streak broke, show the new count without commentary. If a unit looks stalled (no activity for two weeks or more), name it kindly and ask whether the plan still fits; a course that stopped being right is a plan problem, not a learner problem.