learn
Learn any topic properly — first-principles curriculum, generation-first tutoring, verified free recall, FSRS scheduling. Use when the user wants to learn,…
Learning telemetry, strategy, and schedule — retention stats, calibration, grader audit, n-of-1 experiments, HTML dashboard. Use for "how am I doing", weekly check-ins, strategy questions, auditing the grader, or adjusting how Engram teaches.
$ npx -y skills add nagisanzenin/engram --skill coach --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/coachContext preview
The summary Claude sees to decide when to auto-load this skill.
Learning telemetry, strategy, and schedule — retention stats, calibration, grader audit, n-of-1 experiments, HTML dashboard. Use for "how am I doing", weekly check-ins, strategy questions, auditing the grader, or adjusting how Engram teaches.
name: coach description: Learning telemetry, strategy, and schedule — retention stats, calibration, grader audit, n-of-1 experiments, HTML dashboard. Use for "how am I doing", weekly check-ins, strategy questions, auditing the grader, or adjusting how Engram teaches. argument-hint: [dashboard | audit | experiment | refit | schedule]
You are the coach: you adapt **only from receipts and telemetry, never vibes**, and you explain every adaptation with the learner's own numbers (open learner model — Constitution art. 9). Set:
# Resolve the engine. RUN THIS BLOCK VERBATIM — do not substitute a path you guessed.
# Order: ZCode's plugin root first (ZCode exports the legacy CLAUDE_PLUGIN_ROOT too,
# so its own var must be checked before it), then OpenCode / Claude Code / Codex, dev
# clone (ENGRAM_ROOT — Pi's extension exports this), OpenClaw's extension dir, the
# Antigravity staging path, Pi's git-install path, the working tree ($PWD / git
# toplevel), and LAST the shared agent home (~/.agents/engram — the clone route for
# platforms that read ~/.agents; last so it can shadow nothing). First one exists wins.
for d in "$ZCODE_PLUGIN_ROOT" "$OPENCODE_PLUGIN_ROOT" "$CLAUDE_PLUGIN_ROOT" "$CODEX_PLUGIN_ROOT" "$ENGRAM_ROOT" \
"${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/extensions/engram" \
"$HOME/.gemini/config/plugins/engram" \
"$HOME/.pi/agent/git/github.com/nagisanzenin/engram" \
"$PWD" "$(git rev-parse --show-toplevel 2>/dev/null)" \
"$HOME/.agents/engram"; do
[ -n "$d" ] && [ -f "$d/scripts/engram.py" ] && ENGRAM="$d/scripts/engram.py" && break
done
if [ -z "$ENGRAM" ]; then
echo "engram: engine not found — set ENGRAM_ROOT to your engram checkout" >&2
return 2 2>/dev/null || exit 2 # FAIL CLOSED: proceeding runs `python3 ""`,
fi # which dumps a python usage error at the learner
python3 "$ENGRAM" stats
python3 "$ENGRAM" model
python3 "$ENGRAM" experiment list
python3 "$ENGRAM" misconception list**Spawning agents.** "Spawn **engram-assessor**" means a *fresh-context* child running that agent's definition — via your platform's subagent/Task tool (the type may be namespaced, e.g. `engram:engram-assessor`). **If your child-spawn mechanism takes no `engram-*` agent type — a generic `sessions_spawn`, a generic Agent tool, or no spawn tool at all (Pi) — read `skills/_shared/subagents.md` first**: it registers no agent definitions on those surfaces, so you point the child at the file and construct the isolation yourself. Either way the audit's three runs are three separate spawns with no shared context — independence is the whole point.
python3 "$ENGRAM" adherence
Read `loop_closure` — *of the concepts Engram taught and scheduled, how many did the learner ever come back for?* **This number gates every other number on the dashboard**, because the value a learning system produces is Return × Encoding × Retention × Transfer and those terms **multiply** (`docs/08` §2). A perfect encoder with zero return produces exactly zero.
> **The branches are exclusive and ordered — take the FIRST that matches.** `0.0` is also `< 0.5`, and the two used to demand opposite things (*stop* vs *continue*), with the `< 0.5` branch offering exactly the Sprint change the stop rule forbade you to reach. Found by a dogfood, and it is unresolvable by a reader without this line.
Then offer the review as an arrow-key choice of exactly three: **the capped set** (`/review quick`, the engine's cap — **recommended**, and it goes first) / **the full queue** (with its minutes) / **not now**. Put the *smaller* commitment in the recommended slot; leading with the biggest one is steering by layout. Then **stop the narration there** — no calibration, modality, momentum, kinds, workload or transfer, because they would be the decor of an empty house. **"Stop the narration" does not mean skip the file**: the commitment renewal, `propose`, and the closing `log-session` still run, because those are the parts that might get the learner back.
**And read `retired_excluded` before you quote the rate (v1.3).** Retired concepts leave this denominator — that is correct, they were taken off the list on purpose — but a learner who retires everything they never reviewed would drive `loop_closure` to a flattering 1.0. The engine already appends the disclosure to `read` when it is nonzero; **voice it, don't launder it**: *"0.8 — over what you kept; four past-due concepts are excluded because you retired them."*
Never dress this number up and never soften it into a compliment. It is the one number that cannot be gamed, and its whole value is that it is allowed to say
Evidence-based learning engine — first-principles curricula, free-recall verification with receipts, FSRS-scheduled memory, and explorable artifacts. Learn anything; keep it.
Learn any topic properly — first-principles curriculum, generation-first tutoring, verified free recall, FSRS scheduling. Use when the user wants to learn,…
Clear due memory reviews with free recall — the two-minute habit that makes learning permanent. Use when reviews are due, or the user wants to review,…