Longitudinal language learning progress report with metrics, trends, and insights
Generate a longitudinal progress report for the user's language learning journey. This is a read-only analytics skill — it does NOT modify coaching files, analyze conversation messages, or generate coaching blocks.
The target language is: $ARGUMENTS (default to all if empty or not specified).
Supported values: en, es, fr, it, de, ja, ko, nl, all.
If the argument is not recognized, respond: "Unknown language code: {arg}. Supported: en, es, fr, it, de, ja, ko, nl, all."
# Language Coaching Config section from the user's CLAUDE.md~/.claude/coaching/{language}-coaching.json using the Read tool
b. If JSON missing but .md exists: tell the user — "Run /lang {code} first to migrate to structured format, then re-run /progress."
c. If neither file exists: tell the user — "No coaching data for {language}. Start a session or run /claude-language-coach:setup."
d. If JSON exists: generate the full report belowall mode: generate a per-language report for each configured language, then a cross-language summary at the enden → 🇬🇧 Englishes → 🇪🇸 Españolfr → 🇫🇷 Françaisde → 🇩🇪 Deutschit → 🇮🇹 Italianoja → 🇯🇵 日本語ko → 🇰🇷 한국어nl → 🇳🇱 NederlandsGenerate the following sections in order. Omit a section only when noted.
{flag} {Language} — Progress Report
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Level: {level} | Active since: {active_since} | Sessions: {stats.total_sessions}
## Overview
- Learning {language} since {active_since} ({N days/weeks/months ago})
- {stats.total_sessions} coaching sessions across {count unique projects in sessions} project(s)
- {stats.total_corrections} corrections | {stats.patterns_active} active patterns | {stats.patterns_resolved} resolved
- {stats.vocabulary_size} vocabulary terms acquired
Calculate time elapsed from active_since to today. Use "today" if same day, "N days" if < 7, "N weeks" if < 30, "N months" otherwise.
Count unique projects from sessions[].project values (excluding duplicates).
## Pattern Analysis
### Active Patterns ({count where resolved=false})
| Pattern | Type | Corrections | First Seen | Last Seen | SRS Status |
|---------|------|-------------|------------|-----------|------------|
Sort by times_corrected descending (most persistent first). For SRS Status column:
next_review is not null: show "Due: {date} ({interval_days}d, ease {ease_factor})"next_review is null: show "—"### By Type
Group patterns by type. For each type: count patterns and sum times_corrected. Show as:
{type}: {count} pattern(s) ({sum} corrections) — {percentage}% of totalSort by sum descending. Calculate percentage as sum / stats.total_corrections * 100.
### Most Persistent
Show top 3 patterns by times_corrected (skip if fewer than 1):
1. **{native_form}** — {times_corrected} corrections, {times_correct_since_last_error} correct usages
{explanation}
### Resolved Patterns ({count where resolved=true})
If resolved > 0: show table with native_form, target_correction, times_corrected, last_correct_usage (as resolution date).
If resolved == 0: show "No patterns resolved yet. Patterns resolve after 21+ days of correct usage with 5+ consecutive correct uses."
## SRS (Spaced Repetition)
### Due for Review
List patterns where next_review <= today and resolved=false, sorted by next_review ascending:
- **{native_form}** — {overdue_days} day(s) overdue (due: {next_review}, interval: {interval_days}d, ease: {ease_factor})
If next_review == today: show "due today" instead of "0 day(s) overdue".
If none due: show "No reviews due today."
### Upcoming Reviews
List patterns where next_review > today and resolved=false, sorted by next_review ascending:
- **{native_form}** — due {next_review} (interval: {interval_days}d)
If none upcoming: show "No upcoming reviews scheduled."
### SRS Health
- Patterns under SRS: {count with non-null next_review and resolved=false}
- Average ease factor: {mean of ease_factor, rounded to 2 decimals}
- Interval range: {min interval_days}d – {max interval_days}d
If no patterns have SRS fields activated: show "SRS will activate after your first pattern correction." instead of the whole section.
## Vocabulary ({vocabulary array length} terms)
| Term | POS | Translation | Taught | Shown | Used |
|------|-----|-------------|--------|-------|------|
For each vocabulary entry, extract fields with fallbacks for legacy schema:
target_term or termpart_of_speech or possource_term or translation_en or translation_ptbrfirst_taught (short date format)times_showntimes_used_by_user or 0Sort by first_taught descending (newest first).
### Acquisition Rate
- {vocabulary_size / total_sessions} terms per session (avg)
If total_sessions is 0, show "—" instead of dividing by zero.
If vocabulary array is empty: show "No vocabulary taught yet." and explain based on mode:
corrective: "Your {language} mode is corrective — only mistakes are corrected. Switch to both for vocabulary teaching."active or both: "Vocabulary will be acquired through active teaching and immersion blocks over time."## Session Timeline
### Recent Sessions
| Date | Project | Corrections | Vocab Taught | SRS Reviews | Notes |
|------|---------|-------------|-------------|-------------|-------|
Show the last 10 sessions from the sessions array (sorted by date descending). For each session:
patterns_addressedvocabulary_taughtsrs_reviewsnotes to 40 chars if longerIf more than 10 sessions: add "(showing last 10 of {N} sessions)" below the table.
### Activity
- Sessions this week: {count where date is within current ISO week}
- Sessions this month: {count where date is within current month}
- Current streak: {consecutive calendar days with sessions, counting back from most recent} day(s)
- Longest streak: {max consecutive calendar days with sessions} day(s)
For streak calculation: check consecutive dates in the sessions array (each date counts once regardless of multiple entries). Work backward from the most recent session date. If only 1 session exists, streak is "1 day".
If current streak equals longest streak, omit "Longest streak" line.
## Insights
Generate 3-5 actionable insights based on the data. Choose from these templates (in priority order):
Weakest pattern type (when patterns exist): Identify the type with the highest total corrections. "Weakest area: {type} ({sum} of {total} corrections, {pct}%). {brief advice}."
Native interference (when patterns of type interference, false_friend, or spelling with L1 influence exist): "Native interference: {count} patterns show direct {native_language} influence. {brief explanation of why this is normal for their level}."
SRS trajectory (when SRS patterns exist): Comment on SRS state — all new (interval=1d), progressing (mixed intervals), or nearing resolution (interval >= 14d).
Vocabulary-correction balance (when one side is 0): If vocabulary is 0 but patterns > 0, suggest mode change. If patterns are 0 but vocabulary > 0, celebrate clean usage.
Session frequency (when sessions > 3): Comment on regularity. Daily sessions accelerate SRS. Gaps reset momentum.
Resolution progress (when any pattern has times_correct_since_last_error >= 3): Highlight patterns close to resolving.
Early stage (when total_sessions < 5): "Getting started: {N} sessions so far. Patterns build naturally with daily use. First resolutions typically happen after 3-4 weeks."
Immersion active (when the language config has immersion: phrase or immersion: sentence): Note that immersion mode is active and contributing to vocabulary acquisition.
Rules:
Close the report with:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
all mode only)After all individual language reports, add:
## Cross-Language Summary
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
| Language | Level | Sessions | Patterns (active/resolved) | Vocabulary | Last Active |
|----------|-------|----------|---------------------------|------------|-------------|
One row per configured language. Last Active = stats.last_session or "never" if null.