# Progress

> 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.

- Skill: `kubilaiswf/progress` (Agent Skill)
- Install (CLI): `npx skillmds@latest add kubilaiswf/progress`
- Raw SKILL.md: https://api.skillmd.com/api/skills/kubilaiswf/progress/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: kubilaiswf (https://skillmd.com/u/kubilaiswf)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/kubilaiswf/progress

---


# Progress — Learner Dashboard

Read-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.**

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

1. 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.
2. 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.
3. **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").
4. **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.
5. **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.

