progress
Scannednpx machina-cli add skill remenoscodes/claude-language-coach/progress --openclawLanguage Coaching — Progress Report
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.
Target Language
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."
Instructions
- Parse the language argument
- Determine configured languages by reading the
# Language Coaching Configsection from the user's CLAUDE.md - For each target language:
a. Read
~/.claude/coaching/{language}-coaching.jsonusing the Read tool b. If JSON missing but.mdexists: 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 below - For
allmode: generate a per-language report for each configured language, then a cross-language summary at the end
CRITICAL RULES
- READ-ONLY: Never write to or modify any file. No JSON updates, no MD regeneration, no session tracking.
- No conversation analysis: Do not scan user messages for language errors. This is purely historical analytics.
- No coaching blocks: Do not append correction, teaching, immersion, or SRS review blocks.
- Data as-is: Report the data from the JSON files exactly. Do not infer corrections or create new patterns.
Flag Mapping
en→ 🇬🇧 Englishes→ 🇪🇸 Españolfr→ 🇫🇷 Françaisde→ 🇩🇪 Deutschit→ 🇮🇹 Italianoja→ 🇯🇵 日本語ko→ 🇰🇷 한국어nl→ 🇳🇱 Nederlands
Report Format
Generate the following sections in order. Omit a section only when noted.
Section 1: Header
{flag} {Language} — Progress Report
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Level: {level} | Active since: {active_since} | Sessions: {stats.total_sessions}
Section 2: Overview (always shown)
## 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).
Section 3: Pattern Analysis (shown when patterns array is non-empty)
## 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:
- If
next_reviewis not null: show "Due: {date} ({interval_days}d, ease {ease_factor})" - If
next_reviewis 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 total
Sort 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."
Section 4: SRS Status (shown when any pattern has non-null next_review)
## 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.
Section 5: Vocabulary (shown when vocabulary array is non-empty)
## Vocabulary ({vocabulary array length} terms)
| Term | POS | Translation | Taught | Shown | Used |
|------|-----|-------------|--------|-------|------|
For each vocabulary entry, extract fields with fallbacks for legacy schema:
- Term:
target_termorterm - POS:
part_of_speechorpos - Translation:
source_termortranslation_enortranslation_ptbr - Taught:
first_taught(short date format) - Shown:
times_shown - Used:
times_used_by_useror 0
Sort 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:
- If mode is
corrective: "Your {language} mode iscorrective— only mistakes are corrected. Switch tobothfor vocabulary teaching." - If mode is
activeorboth: "Vocabulary will be acquired through active teaching and immersion blocks over time."
Section 6: Session Timeline (shown when sessions array is non-empty)
## 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:
- Corrections: length of
patterns_addressed - Vocab Taught: length of
vocabulary_taught - SRS Reviews:
srs_reviews - Notes: truncate
notesto 40 chars if longer
If 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.
Section 7: Insights (always shown)
## 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, orspellingwith 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: phraseorimmersion: sentence): Note that immersion mode is active and contributing to vocabulary acquisition.
Rules:
- Maximum 5 insights per language
- Be encouraging about progress, honest about persistent patterns
- Use data to support each insight (cite numbers)
- Do not repeat information already visible in the tables above — add interpretation
Close the report with:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Cross-Language Summary (for 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.
Important
- This is a PURE ANALYTICS skill — no corrections, no teaching, no file writes
- Focus on longitudinal trends, not single-session observations
- All dates displayed in short format (e.g., "Feb 22") for readability
- When data is sparse, acknowledge it honestly and set expectations
- Use tables for structured data, prose for insights
Source
git clone https://github.com/remenoscodes/claude-language-coach/blob/main/skills/progress/SKILL.mdView on GitHub Overview
This read-only analytics skill generates a longitudinal progress report for a user’s language learning journey. It reads coaching data for configured languages and surfaces metrics, trends, and insights without modifying any files.
How This Skill Works
The skill parses the target language argument and reads the corresponding coaching data from ~/.claude/coaching/{language}-coaching.json for each configured language as defined in the CLAUDE.md '# Language Coaching Config' section. If a JSON file is present, it generates a full report based on the data; if only an MD exists, it instructs the user to migrate by running a migration command; if no data exists, it prompts to start a session or run setup. The process is strictly read-only and reports data exactly as stored.
When to Use It
- Review long-term progress for a single language across months
- Compare progress across multiple configured languages
- Identify trends in sessions, vocabulary growth, and corrections
- Detect data gaps when a language has no structured coaching data
- Prepare a concise summary for coaching reviews or progress meetings
Quick Start
- Step 1: Run the progress command with a target language code (e.g., /progress en).
- Step 2: Review Section 1 (Header) and Section 2 (Overview) for a quick read on activity and growth.
- Step 3: If data is missing, migrate to JSON when prompted or start a new coaching session.
Best Practices
- Verify the target language code matches the supported values (en, es, fr, it, de, ja, ko, nl, all)
- Ensure CLAUDE.md properly defines configured languages to avoid missing reports
- Count unique projects in sessions to get an accurate session total
- Treat MD-only data as pending migration until JSON is available
- Use consistent elapsed-time phrasing (today, days, weeks, months) across reports
Example Use Cases
- Progress for English (en) over 6 months showing total sessions, vocabulary growth, and corrections
- Multi-language progress comparing Spanish (es) and French (fr) for a shared time frame
- German (de) report with active patterns and SRS-like status indicators
- Cross-language summary for all configured languages
- No data scenario prompting setup or new coaching session