learn playbook
Compress retro findings into durable, actionable rules: targeted lessons that reach the playbooks, steps, agents and skills they name, plus one-line project facts in the repo's own CLAUDE.md.
Learning is a playbook, not a skill — it is driven by /playbook:
/playbook learn
Why
The retro playbook records what happened on a set of shipped plans. Learn turns those observations into rules booping obeys on every future plan; without it, retros pile up unread and the same friction repeats sprint after sprint.
The unit of work is a standalone retrospective — retrospectives/{slug}.md at awaiting-learning, never a plan directory. It reads that file and each plan in its plans: list, proposes a small set of updates, and writes nothing until you confirm the whole set. The retrospective then walks awaiting-learning → done; the plans it covers are done before the run starts and stay done throughout.
What it does
Six steps, in dependency order:
| Step | What it does |
|---|---|
intake |
Resolve the retrospective and its working set; validate the entry status |
extract-candidates |
Decompose the retro into atomic rules, each routed to a single destination |
dedup-sweep |
Filtered read of existing lessons and the repo CLAUDE.md — update vs create vs conflict |
review-table |
Present the unified review table; you accept, reject rows, or add your own |
write |
Write the accepted items, one pass per target type |
transition |
Close the retrospective at done and commit |
The run workdir is the vault root and every booping playbook-state / booping playbook-transition call passes --target retrospectives/{slug}.md, so a stopped run is resumable.
What it writes
Two destinations, and every accepted finding lands in exactly one of them. A candidate that would span both is decomposed into one row per destination before writing.
- Targeted lessons at
{vault}/_lessons/{N}_{title}.md— each carrying atargets:frontmatter list naming the playbooks, playbook steps, agents and skills the rule applies to. A rule that should only reach one worker agent or one skill is a lesson targeting it, not a separate file.Nis a monotonic counter, keeping the directory chronological. - The repo's own
CLAUDE.md— a finding that is a project fact aiding fresh-agent project understanding (a layout path, a CLI command, a code-side convention) becomes a one-line bullet there. Those edits are committed in the repo working tree, not the vault, and never touch the global~/.claude/CLAUDE.md.
See Vault for the directory layout and how each file reaches the active context.
Targets are fetched, never guessed
A _lessons/ file with no valid targets: reaches nothing, so routing has to be exact. Before proposing, the run reads the target space: a table of contents of every discovered playbook, then a targets fetch for only the playbooks a candidate touches, listing their step names and addressable agents. Entries come from that fetch, and the exact targets: entry each lesson carries is assigned in the review table before the lesson is written into the vault's _lessons/.
---
id: 7
title: Name every artifact path absolutely
targets:
- groom/draft-plan
- agent:booping-developer
retro: retrospectives/202608031129_flat-lessons.md
created: 2026-08-03
---
Target forms are {playbook}, {playbook}/{step}, agent:{id} and skill:{name} — exact names only, no globs. See Playbooks → Lessons for where each one surfaces.
Legacy lessons/
{vault}/lessons/ is read by nothing and written by nothing — only a _lessons/ file with a valid targets: list reaches a run. Nothing moves between the two on its own; while the legacy directory still holds files, a render of any playbook emits a non-blocking note asking you to migrate them.
Update-vs-create sweep
Before drafting proposals, dedup-sweep reads the existing lessons and the repo CLAUDE.md to check whether each candidate is genuinely new. A candidate that duplicates or refines an existing rule becomes an update to that rule rather than a near-duplicate; one that contradicts a rule is flagged a conflict for you to resolve in the review table — that is what keeps the lesson set from accumulating redundant or self-contradicting rules over many sprints.
The review table
Every candidate appears in a single review table before anything is written — one row per landing site, with columns #, Target, Type, Rule, Example and Targets. Target is the exact destination path — a _lessons/ file, or the repo's CLAUDE.md. The Targets column carries the exact targets: entries the lesson will be written with — a playbook, a {playbook}/{step}, an agent:{id} or a skill:{name}, drawn from the fetched target space and copied verbatim into the file's targets: list — so the routing is assigned here, before anything lands in _lessons/; a CLAUDE.md row carries —, since its path is its routing. You accept all, reject rows by number (e.g. 2 5), or append your own row in the same shape. Nothing is written until you respond; table acceptance is the consent for the whole write pass — there are no per-row prompts.
Best practices
Review every proposed update
The run proposes — you commit. Read each proposed lesson and CLAUDE.md bullet before approving. Three things to check:
- Actionability. A lesson should tell a future run what to do, not just describe the past. "Be careful with migrations" is a description; "Run
manage.py migrate --planbefore applying any migration generated this session" is a rule. - Right home. A rule that only matters for one step belongs in a lesson targeting that step, not one targeting the whole playbook where every run pays the context cost.
- Direction. A lesson should point forward. If the proposed update is really a complaint about the past plan, send it back — it is retro material, not lesson material.
Shit in, shit out
Proposals come from whatever the retro says. Accepting them blindly produces conflicting and useless rules: redundant overlaps, contradictions with existing lessons, vague platitudes that fire on every plan and steer none. Review every proposal as if you were writing it — because once you approve, you are.
The second half of the same warning as retro: a sloppy retro produces sloppy lesson proposals, and a rubber-stamped write pass puts those proposals on disk where they steer every future sprint.