$ARGUMENTS
Resolve the target first
This skill runs the review pass for one learning loop. Read the first argument as the target:
| Target |
Learning dir |
Observations live in |
Pass notes go in |
Back-stamp |
agentic-build |
experiments/01-agentic-build/learning/ |
one file per sighting in observations/ |
reviews/NNN-YYYY-MM-DD-pass.md |
a graduated-into: stamp on the observation file, after Brian's nod only |
market-read-lab |
experiments/00-market-read-lab/learning/ |
rows in a single observations.md table |
passes/NNN-YYYY-MM-DD-pass.md |
none in v0 — grep lessons.md for a row to see if it's already used |
If no known target was given, ask Brian which one — do not guess or default. Everything below operates inside the resolved <target>/learning/, and defers to that target's AGENTS.md for every rule that differs between the two.
Purpose
Run one review / consolidate pass: read every observation, cluster the repeats, and propose lessons. This is the out-of-band half of the learning loop — the verb that turns raw observations into candidate rules for Brian to gate.
This is the single hardest step to get right. The prior system (Market Read Lab's old triage.md) died here by over-compressing — ~345 observations collapsed to ~2, each fused to a fix. Your job is the opposite instinct: propose sparingly, preserve divergence, and leave most observations untouched. The "left unconsolidated" count is the honest half of the work, not an afterthought.
What this is not
- Not a single incoming change/PR review (for Agentic Build, that's
review-change).
- Not capture — you never write observations here; agents do that in-band during their own runs (for Agentic Build,
/agent-learning-mine can also feed them retroactively).
- Not a promotion gate — you only ever propose (
state: proposed); Brian decides (the gate + states live in lessons.md).
- Not an editor of live skills/recipes — you never sharpen the thing a lesson improves; that happens after Brian approves, elsewhere.
Required context — defer to these, don't restate them
Read these inside your resolved <target>/learning/. They are the contract, and this skill defers to them for every rule, closed set, route, and file shape.
AGENTS.md — the contract: kinds, the Anti-Merge Law, the immutability + stamp policy, graduation triggers. Authoritative for everything that differs between targets.
lessons.md — the lesson lifecycle, states, routes, graduation gate, and the two self-tests. The first lesson block models the shape.
brian.md — the protected Brian lane and its entry format.
- the pass-note template (
reviews/_TEMPLATE.md or passes/_TEMPLATE.md, per the table above) — the exact note shape you will write, including the Anti-Merge attestation.
- the observation grain — Agentic Build:
observations/_TEMPLATE.md; Market Read Lab: the column legend atop observations.md.
- prior pass notes — dedupe context only. The raw observations are the source; don't let the tidy view become your evidence corpus.
Task
- Ground in the contract. Read the files above for your target. The rules live there; this skill is only the procedure and the judgment.
- Read every raw observation first — all of them (every file in
observations/, or every row of observations.md), including ones a prior pass already used (they're context for the shape, even when spent). Only then read prior passes and lessons as dedupe context. A single agent reads the whole corpus; it's thin — do not fan out or build machinery.
- Cluster by SHAPE, not topic — group by shared underlying pressure / failure mode, not surface subject. (The over- and under-cluster traps: see How to judge well.)
- Gate each cluster. Propose a lesson only for a cluster that earns graduation per the gate in
lessons.md, and only if it passes both self-tests there. Most clusters — and nearly all singletons — will not qualify. That's correct.
- Propose, don't promote. For each cluster that earns it, append a lesson to
lessons.md at state: proposed, in the shape the first lesson models. For a Brian-taste correction, propose a brian.md candidate in the pass note instead — don't write it into brian.md; that lane holds accepted entries only, and the entry lands there on Brian's nod.
- Assign the route now, per your target's routes in
lessons.md. Capture stayed dumb on purpose; routing is decided here. Record it on the lesson row, not the observation.
- Promote and stamp nothing this pass — follow your target's stamp policy in
AGENTS.md. (Agentic Build: leave the graduated-into: stamp for after Brian's nod, brian-correction included — an in-pass stamp on a later-rejected entry leaves a dangling ref, the very thing this loop exists to prevent. Market Read Lab: there is no stamp in v0 — a proposed lesson just lists its source rows.) Either way, a pass graduates nothing.
- Write the pass note. Copy your target's template into its pass-notes folder as
NNN-YYYY-MM-DD-pass.md — NNN is the next zero-padded, monotonically increasing number (highest existing prefix + 1). Fill the "deliberately left unconsolidated" list honestly and the Anti-Merge attestation truthfully.
- Hand Brian the decision surface (see Final Response). Stop. Do not sharpen any skill.
How to judge well
The contract says what the rules are. This is how to apply them without repeating the last system's mistakes.
- Cluster by shape, but don't sand off the edges. Two observations cluster when they'd be fixed by the same rule, not when they're vaguely "about docs" or "about counting." If stating the shared rule forces you to hedge ("usually", "in cases like"), you've over-clustered — split it back apart. A cluster you can't state crisply isn't a cluster yet.
- Singletons are the asset, not backlog to clear. A lone, non-severe sighting almost never earns a lesson — it waits for a 2nd. Park the idea by naming it in the "left" list ("watching for a 2nd sighting"), not by proposing from n=1. The single-sighting exceptions are exactly the ones the gate in
lessons.md names — don't widen them.
- Keep the
left count honest — and large. Most observations should sit unconsolidated most passes. A pass that consumes everything is the 345→2 failure running in the other direction. If your "left" list is short, distrust yourself: re-read what you consolidated and ask whether each really earned it.
- Test 1 (
lessons.md) is the real filter — apply it ruthlessly before proposing. Strip every company name, packet id, and run slug out of the rule. If a sharp, general rule survives → it's a lesson. If it dissolves into one case → it's still an observation; leave it.
- "What does it replace?" gates additive lessons. A lesson that corrects an existing recipe/skill/convention is strong. A lesson that only adds a new rule with nothing retired is suspect — default to not proposing it (this mirrors Brian's own simplify-don't-add reflex).
- Severe
risk-miss bypasses the cadence, not the gate. If a miss could affect store correctness, a contract, live behavior, write authority, or Brian's decision surface, surface it in this pass even below the normal review threshold. Still do the self-tests and route it honestly.
- Compress only by adding. If you feel the urge to tighten, merge, or summarize an observation's text — stop. That's the Anti-Merge Law (
AGENTS.md); compression is only a new lesson pointing back at the raw notes.
Output
- Append/advance any earned lessons in
<target>/learning/lessons.md (state: proposed); propose brian-correction clusters as brian.md candidates in the pass note — don't write brian.md.
- Promote and stamp nothing — a pass graduates nothing (follow the target's stamp policy in
AGENTS.md).
- Write the pass note from the template into the target's pass-notes folder (
reviews/ or passes/), as NNN-YYYY-MM-DD-pass.md.
- No live skill, recipe, or convention is edited.
Final Response
End with a short decision surface for Brian:
- target + pass-note path
- proposed — each lesson id + one-line rule + route, and any
brian.md candidate, all awaiting his approval
- left — how many observations stayed unconsolidated, and the one or two you most want a second opinion on
- the Anti-Merge attestation, in one line
No live skill or recipe was edited; nothing was promoted or stamped — every entry awaits your nod.
1---2name: learning-review3description: $ARGUMENTS4---56$ARGUMENTS78## Resolve the target first910This skill runs the review pass for **one** learning loop. Read the first argument as the target:1112| Target | Learning dir | Observations live in | Pass notes go in | Back-stamp |13|---|---|---|---|---|14| `agentic-build` | `experiments/01-agentic-build/learning/` | one file per sighting in `observations/` | `reviews/NNN-YYYY-MM-DD-pass.md` | a `graduated-into:` stamp on the observation file, after Brian's nod only |15| `market-read-lab` | `experiments/00-market-read-lab/learning/` | rows in a single `observations.md` table | `passes/NNN-YYYY-MM-DD-pass.md` | none in v0 — grep `lessons.md` for a row to see if it's already used |1617**If no known target was given, ask Brian which one — do not guess or default.** Everything below operates inside the resolved `<target>/learning/`, and defers to that target's `AGENTS.md` for every rule that differs between the two.1819## Purpose2021Run one **review / consolidate pass**: read every observation, cluster the repeats, and **propose** lessons. This is the out-of-band half of the learning loop — the verb that turns raw observations into candidate rules for Brian to gate.2223This is the single hardest step to get right. The prior system (Market Read Lab's old `triage.md`) died here by over-compressing — ~345 observations collapsed to ~2, each fused to a fix. Your job is the opposite instinct: **propose sparingly, preserve divergence, and leave most observations untouched.** The "left unconsolidated" count is the honest half of the work, not an afterthought.2425## What this is not2627- **Not** a single incoming change/PR review (for Agentic Build, that's `review-change`).28- **Not** capture — you never *write* observations here; agents do that in-band during their own runs (for Agentic Build, `/agent-learning-mine` can also feed them retroactively).29- **Not** a promotion gate — you only ever propose (`state: proposed`); Brian decides (the gate + states live in `lessons.md`).30- **Not** an editor of live skills/recipes — you never sharpen the thing a lesson improves; that happens after Brian approves, elsewhere.3132## Required context — defer to these, don't restate them3334Read these inside your resolved `<target>/learning/`. They are the contract, and this skill defers to them for **every** rule, closed set, route, and file shape.3536- `AGENTS.md` — the contract: kinds, the Anti-Merge Law, the immutability + stamp policy, graduation triggers. **Authoritative for everything that differs between targets.**37- `lessons.md` — the lesson lifecycle, states, routes, graduation gate, and the two self-tests. The first lesson block models the shape.38- `brian.md` — the protected Brian lane and its entry format.39- the pass-note template (`reviews/_TEMPLATE.md` or `passes/_TEMPLATE.md`, per the table above) — the exact note shape you will write, including the Anti-Merge attestation.40- the observation grain — Agentic Build: `observations/_TEMPLATE.md`; Market Read Lab: the column legend atop `observations.md`.41- prior pass notes — dedupe context only. The raw observations are the source; don't let the tidy view become your evidence corpus.4243## Task44451. **Ground in the contract.** Read the files above for your target. The rules live there; this skill is only the procedure and the judgment.462. **Read every raw observation first** — all of them (every file in `observations/`, or every row of `observations.md`), including ones a prior pass already used (they're context for the shape, even when spent). Only then read prior passes and lessons as dedupe context. A single agent reads the whole corpus; it's thin — do not fan out or build machinery.473. **Cluster by SHAPE, not topic** — group by shared underlying pressure / failure mode, not surface subject. (The over- and under-cluster traps: see *How to judge well*.)484. **Gate each cluster.** Propose a lesson only for a cluster that earns graduation per the gate in `lessons.md`, and only if it passes both self-tests there. Most clusters — and nearly all singletons — will *not* qualify. That's correct.495. **Propose, don't promote.** For each cluster that earns it, append a lesson to `lessons.md` at `state: proposed`, in the shape the first lesson models. For a Brian-taste correction, *propose* a `brian.md` candidate in the pass note instead — don't write it into `brian.md`; that lane holds accepted entries only, and the entry lands there on Brian's nod.506. **Assign the route now**, per your target's routes in `lessons.md`. Capture stayed dumb on purpose; routing is decided here. Record it on the lesson row, not the observation.517. **Promote and stamp nothing this pass** — follow your target's stamp policy in `AGENTS.md`. (Agentic Build: leave the `graduated-into:` stamp for after Brian's nod, `brian-correction` included — an in-pass stamp on a later-rejected entry leaves a dangling ref, the very thing this loop exists to prevent. Market Read Lab: there is no stamp in v0 — a proposed lesson just *lists* its source rows.) Either way, a pass graduates nothing.528. **Write the pass note.** Copy your target's template into its pass-notes folder as `NNN-YYYY-MM-DD-pass.md` — NNN is the next zero-padded, monotonically increasing number (highest existing prefix + 1). Fill the "deliberately left unconsolidated" list honestly and the Anti-Merge attestation truthfully.539. **Hand Brian the decision surface** (see Final Response). Stop. Do not sharpen any skill.5455## How to judge well5657The contract says *what* the rules are. This is *how* to apply them without repeating the last system's mistakes.5859- **Cluster by shape, but don't sand off the edges.** Two observations cluster when they'd be fixed by the *same* rule, not when they're vaguely "about docs" or "about counting." If stating the shared rule forces you to hedge ("usually", "in cases like"), you've over-clustered — split it back apart. A cluster you can't state crisply isn't a cluster yet.60- **Singletons are the asset, not backlog to clear.** A lone, non-severe sighting almost never earns a lesson — it waits for a 2nd. Park the *idea* by naming it in the "left" list ("watching for a 2nd sighting"), not by proposing from n=1. The single-sighting exceptions are exactly the ones the gate in `lessons.md` names — don't widen them.61- **Keep the `left` count honest — and large.** Most observations should sit unconsolidated most passes. A pass that consumes everything is the 345→2 failure running in the other direction. If your "left" list is short, distrust yourself: re-read what you consolidated and ask whether each really earned it.62- **Test 1 (`lessons.md`) is the real filter — apply it ruthlessly before proposing.** Strip every company name, packet id, and run slug out of the rule. If a sharp, general rule survives → it's a lesson. If it dissolves into one case → it's still an observation; leave it.63- **"What does it replace?" gates additive lessons.** A lesson that corrects an existing recipe/skill/convention is strong. A lesson that only adds a new rule with nothing retired is suspect — default to not proposing it (this mirrors Brian's own simplify-don't-add reflex).64- **Severe `risk-miss` bypasses the cadence, not the gate.** If a miss could affect store correctness, a contract, live behavior, write authority, or Brian's decision surface, surface it in this pass even below the normal review threshold. Still do the self-tests and route it honestly.65- **Compress only by adding.** If you feel the urge to tighten, merge, or summarize an observation's text — stop. That's the Anti-Merge Law (`AGENTS.md`); compression is only a new lesson pointing back at the raw notes.6667## Output6869- Append/advance any earned lessons in `<target>/learning/lessons.md` (`state: proposed`); propose `brian-correction` clusters as `brian.md` candidates in the pass note — don't write `brian.md`.70- Promote and stamp nothing — a pass graduates nothing (follow the target's stamp policy in `AGENTS.md`).71- Write the pass note from the template into the target's pass-notes folder (`reviews/` or `passes/`), as `NNN-YYYY-MM-DD-pass.md`.72- No live skill, recipe, or convention is edited.7374## Final Response7576End with a short decision surface for Brian:7778- target + pass-note path79- **proposed** — each lesson id + one-line rule + route, and any `brian.md` candidate, all awaiting his approval80- **left** — how many observations stayed unconsolidated, and the one or two you most want a second opinion on81- the Anti-Merge attestation, in one line82- `No live skill or recipe was edited; nothing was promoted or stamped — every entry awaits your nod.`