diff --git a/CHANGELOG.md b/CHANGELOG.md index ac65655..f8f5c2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ Sections dated before 2026-09-19 predate the cycle and stay as they are. - fix(doctor, test-stack-up): **in a cloud container, a missing Docker daemon is now reported as normal, with the Docker-free route, instead of a warning that says to start it.** The Claude Code on the web container has the docker CLI but no daemon, and the agent cannot start one. Doctor used to WARN "docker daemon is not responding … sudo systemctl start docker", so sessions tried, failed, and reported "cannot start the docker daemon" as a blocker, until the user said to use `mxcli run --local`. Now the cloud lane prints: no Docker here, normal, do not try to start it; build check = exec.sh's mxbuild gate; run the app = `./mxcli run --local`. On a desktop (Docker or Podman, stopped or absent) the warning and start hint stay, plus one line saying a container is optional: the mxbuild gate needs none, and Studio Pro's Run Locally or `mxcli run --local` runs the app. The no-runtime text no longer says the build check needs Docker. `test-stack-up.sh` with the app down and no reachable Docker/Podman now stops with the Docker-free route instead of failing inside `mxcli docker run`. — MendixMau - fix(gate-check): **the stage-decision readers now read only the Decisions table, and Stage 7 accepts a dated CONFIRMED.** `has_confirmed_decision` (Stages 3 and 4) and the Stage 7 cutover check scanned every pipe row in the register, so an Open-questions row numbered 4 or 7 with Status CONFIRMED passed that stage with no decision behind it. Both now count only rows under a header whose first cell is `Stage`; a register with no such header keeps the old every-row scan. Stage 7 also matched the status string-exactly, so `CONFIRMED 2026-08-10` failed there while passing every other stage (TD-07); it now uses the same word-anchored match. Positive control: the pre-fix script passes Stages 4 and 7 on an Open-questions-only register and fails Stage 7 on the dated status. Fixture T13–T15 in `test-bug03-gates.sh` — MendixMau - learn(bug-logs): **`BUG-DRAFT-grant-association-generalization-member`** — a member association owned by another module's entity cannot be named in a `grant` statement, so `revoke` + `re-grant` silently drops that member access and `mx check` reports CE0066; patch-only workaround provided. Found fixing a guest-groups association in a Mendix app (mxcli v0.23.0, Mendix 11.12.2). — MendixMau +- fix(routing, init-project, sync-project, agents): **routing tables are trigger lists now, not reading lists, and no setup file tells a session to read the whole runbook any more.** The line above every baseline table said "read a row when its Stage(s) cell names your stage", so a build session was told to read all 23 Stage 5 files, about 121k tokens, before touching the project, and every agent template was headed "Skills this agent must load". The runbook already said "How to read this file: not whole", but the `CLAUDE.local.md` that `init-project.sh` writes said "Read conversion-runbook.md FIRST — every session", and the ritual `sync-project.sh` appends said "re-read it in full" (~24k tokens, carried on every later call). Now: open a row's file when its trigger happens in this session and stage, never the table ahead, and a page task never opens the microflow rows; agent templates say the same above their table; the runbook row, `init-project.sh` and the ritual say "§1b plus your own stage's section, not the whole file". No row changed tier, so every trigger stays visible to the main session and to each agent. Found by the context report behind `bin/context-audit.sh`. Existing projects pick the new wording up through `bin/sync-project.sh` where the block is marked; a hand-written `CLAUDE.local.md` needs the two lines edited by hand. — MendixMau - chore(inbox): **triage of `contrib/inbox/`: removed 15 promoted/obsolete files, gave the rest neutral names and scrubbed identifiers.** Gone: the ten machine-diff `*-patches.md` files from 2026-09-14, the 2026-09-27 field-project patch file, the built company-brain idea, and three already-promoted or superseded bug dumps. Kept for now: `2026-09-27-mxcli-upstream-issues.md`, because five drafts under `bug-logs/pending-github-issues/` cite it as their source. Four remaining files were renamed to `field-project-{a,b,c}` names; project and app names, home-style paths and personal names inside the 17 remaining entries were replaced with neutral labels or placeholders (technical content unchanged). — MendixMau - learn(learned-mdl-preflight, learned-detection-gaps, microflow-preflight, testing-shape, learned-mdl-cannot-express, learned-page-patterns, rest-integration-first-time-right, journey-proof, learned-datagrid-customcontent-binding): **the skills side of BUG-142 to BUG-154.** STOP row 12 rewritten shorter for v0.24.0 — `ContentParams` takes a bare attribute or a quoted literal only, and the `toString(Attr)` fix it taught no longer builds; row 14 notes a narrowing `grant` merges, row 23 that `diff` prints false `-`/`~` lines. Detection gaps: the ContentParams row now covers any object-bound `dynamictext` and says check passes `if … then … else`; reserved words cover entities; new CE1870 row. microflow-preflight: CONV013 false positive and doc-comment round-trip resolved from "Not verified"; error handler without `return` is the second merge-overlap shape. testing-shape: `--test-endpoint` writes into the working model until a clean stop; `run --local` starts with scheduled events off (new register row). Also: five cannot-express rows (tab badge, validate-while-typing, AppTitle, always-open nav groups, sidebar toggle / page-load / Marketplace layout) and the DG2 `emptyplaceholder` correction; control-bar attributes, nested list view `Editable` and REPLACE-not-re-run-safe in page patterns; v0.24.0 REST bullets; two OQL journey traps. Triages three inbox notes (ContentParams, REST/JSON/page field notes, scheduled events) — card-disbursement requirements-driven build - fix(project-bin/check-design-reaches-app.sh): **the model directory now comes from `find_model_dir`, and a knob file it cannot read is a fault, never clean.** #162 added a one-level `app/*.mpr` probe; this replaces it with `find_model_dir` in `_common.sh` (`$PROJECT_ROOT`, `$MPR_FILE`, the `app/` probe), plus an `app/theme` / `app/deployment` probe when no `.mpr` is found. The fault is the part #162 did not cover: a missing knob file, or one that declares no knobs, printed "knobs bound 0 of 0" under `clean` with exit 0; it now reports `FAULT … UNMEASURED` and exits 2. The knob file can also be passed as a third argument. Fixture: `tests/wave2/test-design-reaches-app.sh` cases 9–10 (both layouts, with and without an `.mpr`, missing and empty knob file, overrides). Field run: a Stage 5 obligation pass on a two-tree Mendix 11.14 app, 0 of 0 before, 26 of 30 knobs and 157 of 157 tokens after, with no arguments — a two-tree greenfield build diff --git a/README.md b/README.md index 4399fa6..3694cca 100644 --- a/README.md +++ b/README.md @@ -757,7 +757,7 @@ The "When to use which skill" table above is *situational* — load a skill when -Read a row when its Stage(s) cell says *every stage* or names the stage the register (PROJECT.md) says you are in. Rows for other stages are not this session's reading. +Each row is a trigger, not a reading list: open a row's file when the first column happens in this session, and only rows whose Stage(s) cell says *every stage* or names the stage the register (PROJECT.md) says you are in. Do not read the table ahead — a build session that only writes pages never opens the microflow rows. | Always relevant for | Reference this | Stage(s) | |---|---|---| @@ -765,7 +765,7 @@ Read a row when its Stage(s) cell says *every stage* or names the stage the regi | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict | `skills/degrade-to-judgement.md` | every stage | | Any time an exit code, a tool's output or a subagent's report is about to become a stated finding — verify before you conclude | `skills/tool-output-is-not-ground-truth.md` | every stage | | Before obeying any learned-* STOP or workaround that costs a detour — probe the binary you actually have, then stamp the verdict back into the rule | `skills/retesting-learned-rules.md` | every stage | -| Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only | `skills/conversion-runbook.md` | P,0,1,2,3,4,5,6,7 | +| Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only | `skills/conversion-runbook.md` | P,0,1,2,3,4,5,6,7 | | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order | `skills/query-the-model.md` | P,0,1,2,3,4,5,6,7 | | Putting a question TO the user — any gate, any stage: ask in chat not in a file, two named options plus your recommendation, one batch per gate then end the turn | `skills/interview-protocol.md` | P,0,1,2,3,4,5,6,7 | | Any stage transition — the 2+1 format every CAC uses, and the one-register rule (answers land in PROJECT.md, never in a separate state file). The seven CACs themselves are routed per stage in the situational table | `skills/checkpoints/checkpoint-template.md` | 0,1,2,3,4,6,7 | diff --git a/ROUTING.md b/ROUTING.md index bac15e8..c9e7af5 100644 --- a/ROUTING.md +++ b/ROUTING.md @@ -32,7 +32,7 @@ picks the row up. That is the whole procedure — there is no second list to rem | Always relevant for | Load this | Agent(s) | Stage(s) | Tier | |---|---|---|---|---| -| Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only | `skills/conversion-runbook.md` | all | P,0,1,2,3,4,5,6,7 | baseline | +| Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only | `skills/conversion-runbook.md` | all | P,0,1,2,3,4,5,6,7 | baseline | | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order | `skills/query-the-model.md` | all | P,0,1,2,3,4,5,6,7 | baseline | | Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot | `skills/skills-over-scripts.md` | all | - | baseline | | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict | `skills/degrade-to-judgement.md` | all | - | baseline | diff --git a/agents/architect-agent.md b/agents/architect-agent.md index b91b31b..b516779 100644 --- a/agents/architect-agent.md +++ b/agents/architect-agent.md @@ -22,14 +22,16 @@ You own architecture and build-plan decisions for {{PROJECT}}. Hard rule: you ne - **Domain glossary (5–10 terms):** {{GLOSSARY}} - **Where the truth lives:** BRDs at {{BRD_PATH}}, decisions in {{PROJECT_MD_PATH}}, architecture artifacts in {{ARCHITECTURE_DIR}} -## Skills this agent must load +## Skills — open each one when its trigger fires +Open a file when its When cell happens in your task, not all of them at the start. A page task never opens the microflow rows; a microflow task never opens the page rows. + | Load this | When | |---|---| -| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only | +| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only | | `skills/query-the-model.md` | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order | | `skills/skills-over-scripts.md` | Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot | | `skills/degrade-to-judgement.md` | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict | diff --git a/agents/ba-agent.md b/agents/ba-agent.md index 4aa7046..fe26e19 100644 --- a/agents/ba-agent.md +++ b/agents/ba-agent.md @@ -28,13 +28,15 @@ You run discovery and the interview gates for {{PROJECT}}. You never touch the ` ## Ground rules -## Skills this agent must load +## Skills — open each one when its trigger fires +Open a file when its When cell happens in your task, not all of them at the start. A page task never opens the microflow rows; a microflow task never opens the page rows. + | Load this | When | |---|---| -| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only | +| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only | | `skills/query-the-model.md` | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order | | `skills/skills-over-scripts.md` | Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot | | `skills/degrade-to-judgement.md` | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict | diff --git a/agents/gate-agent.md b/agents/gate-agent.md index da87938..ea9c3fb 100644 --- a/agents/gate-agent.md +++ b/agents/gate-agent.md @@ -19,14 +19,16 @@ back to v1 and deleting `mprcontents/`, and `test` writes too. Two consecutive r comparable, and the project's write-approval rule applies to them. Confirm against the project's own bug log before running anything you have not run here before. -## Skills this agent must load +## Skills — open each one when its trigger fires +Open a file when its When cell happens in your task, not all of them at the start. A page task never opens the microflow rows; a microflow task never opens the page rows. + | Load this | When | |---|---| -| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only | +| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only | | `skills/query-the-model.md` | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order | | `skills/skills-over-scripts.md` | Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot | | `skills/degrade-to-judgement.md` | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict | diff --git a/agents/mdl-agent.md b/agents/mdl-agent.md index 6e1a210..999bbce 100644 --- a/agents/mdl-agent.md +++ b/agents/mdl-agent.md @@ -25,14 +25,16 @@ architecture, build plan, BRDs) live in the **`## Wiring` block of the project-r the single source of truth. Read that block at the start of every task and resolve paths from it. When a rule below names an asset (e.g. "the wireframe", "the brief"), it means the path from that block. -## Skills this agent must load +## Skills — open each one when its trigger fires +Open a file when its When cell happens in your task, not all of them at the start. A page task never opens the microflow rows; a microflow task never opens the page rows. + | Load this | When | |---|---| -| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only | +| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only | | `skills/query-the-model.md` | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order | | `skills/skills-over-scripts.md` | Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot | | `skills/degrade-to-judgement.md` | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict | diff --git a/agents/review-agent.md b/agents/review-agent.md index 8caaaed..478c9a8 100644 --- a/agents/review-agent.md +++ b/agents/review-agent.md @@ -26,13 +26,15 @@ protects: you have no Write or Edit tool, and you never run `mxcli exec`. ## Why you exist -## Skills this agent must load +## Skills — open each one when its trigger fires +Open a file when its When cell happens in your task, not all of them at the start. A page task never opens the microflow rows; a microflow task never opens the page rows. + | Load this | When | |---|---| -| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only | +| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only | | `skills/query-the-model.md` | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order | | `skills/skills-over-scripts.md` | Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot | | `skills/degrade-to-judgement.md` | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict | diff --git a/agents/test-agent.md b/agents/test-agent.md index 9120497..caf8c9f 100644 --- a/agents/test-agent.md +++ b/agents/test-agent.md @@ -18,14 +18,16 @@ changes and are out of scope regardless of what a test failure seems to call for proves the model is wrong, that is a finding you report, not a fix you make. `mxcli -c "SHOW ..."` and `"DESCRIBE ..."` reads are always fine, and are how you ground every name you use. -## Skills this agent must load +## Skills — open each one when its trigger fires +Open a file when its When cell happens in your task, not all of them at the start. A page task never opens the microflow rows; a microflow task never opens the page rows. + | Load this | When | |---|---| -| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only | +| `skills/conversion-runbook.md` | Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only | | `skills/query-the-model.md` | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order | | `skills/skills-over-scripts.md` | Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot | | `skills/degrade-to-judgement.md` | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict | diff --git a/bin/init-project.sh b/bin/init-project.sh index 307fe99..463a1e0 100755 --- a/bin/init-project.sh +++ b/bin/init-project.sh @@ -325,8 +325,9 @@ someone else pushed to a shared repo. CI that genuinely wants the old behaviour This project uses the shared toolkit at \`$TOOLKIT_ROOT\`. For ANY pipeline work (analysis, BRDs, architecture, design, build plan, build, test, cutover): -1. **Read \`$TOOLKIT_ROOT/skills/conversion-runbook.md\` FIRST — every session.** It is the - executable spec. The toolkit README and toolkit-guide.html are orientation only; stage +1. **Read \`$TOOLKIT_ROOT/skills/conversion-runbook.md\` §1b plus your own stage's section FIRST — + every session; not the whole file** (\`bin/gate-check.sh \` prints the line + spans). It is the executable spec. The toolkit README and toolkit-guide.html are orientation only; stage summaries anywhere are routing, not deliverable lists. 2. **Before producing any stage artifact, open that stage's owning skill** and follow its full output list (e.g. Stage 3 design work = \`design-artifacts.md\`, incl. one wireframe diff --git a/bin/lib/skill-routing.sh b/bin/lib/skill-routing.sh index 4c9b095..c776ea8 100644 --- a/bin/lib/skill-routing.sh +++ b/bin/lib/skill-routing.sh @@ -192,7 +192,7 @@ routing_render() { done ;; readme-baseline|baseline) - echo "Read a row when its Stage(s) cell says *every stage* or names the stage the register (PROJECT.md) says you are in. Rows for other stages are not this session's reading." + echo "Each row is a trigger, not a reading list: open a row's file when the first column happens in this session, and only rows whose Stage(s) cell says *every stage* or names the stage the register (PROJECT.md) says you are in. Do not read the table ahead — a build session that only writes pages never opens the microflow rows." echo "" if [ "$view" = "baseline" ]; then echo "| Always relevant for | Reference this (under \`${prefix%/}/\`) | Stage(s) |" @@ -236,6 +236,8 @@ routing_render() { ;; agent:*) local who="${view#agent:}" + echo "Open a file when its When cell happens in your task, not all of them at the start. A page task never opens the microflow rows; a microflow task never opens the page rows." + echo "" echo "| Load this | When |" echo "|---|---|" local t diff --git a/bin/lib/skill-routing.tsv b/bin/lib/skill-routing.tsv index d1f4289..fad34c6 100644 --- a/bin/lib/skill-routing.tsv +++ b/bin/lib/skill-routing.tsv @@ -62,7 +62,7 @@ # protocol-staleness ack on every routing edit. # # name path when agents stages tier group -conversion-runbook skills/conversion-runbook.md Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only all P,0,1,2,3,4,5,6,7 baseline spine +conversion-runbook skills/conversion-runbook.md Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only all P,0,1,2,3,4,5,6,7 baseline spine query-the-model skills/query-the-model.md Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order all P,0,1,2,3,4,5,6,7 baseline spine skills-over-scripts skills/skills-over-scripts.md Before writing any .js or .sh for a check, gate or report — and before adding a rule to an existing one: judgement goes in a skill, code only fetches facts a reader cannot all - baseline spine degrade-to-judgement skills/degrade-to-judgement.md Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict all - baseline spine diff --git a/bin/sync-project.sh b/bin/sync-project.sh index 879c9ad..9133e15 100755 --- a/bin/sync-project.sh +++ b/bin/sync-project.sh @@ -631,7 +631,7 @@ if [ -f "$CL" ] && ! grep -q "Session-start ritual" "$CL"; then 3. \`$TOOLKIT_ROOT/bin/status.sh --brief\` — where, done/overdue, next action; post it as the session's first message (same step as init-project writes for new projects). 4. If the commit differs from \`PROJECT.md\`'s \`Toolkit commit:\` line: re-read - \`$TOOLKIT_ROOT/skills/conversion-runbook.md\` in full, then update that line. + \`$TOOLKIT_ROOT/skills/conversion-runbook.md\` §1b plus your stage's section, then update that line. 5. State in chat which commit you're working from. gate-check blocks all gates on a mismatch. EOF echo "Updated: CLAUDE.local.md — appended the session-start ritual." diff --git a/skills/conversion-runbook.md b/skills/conversion-runbook.md index 3ea98b4..9eb993e 100644 --- a/skills/conversion-runbook.md +++ b/skills/conversion-runbook.md @@ -17,7 +17,7 @@ table; a skill missing here is a skill no agent will find. -Read a row when its Stage(s) cell says *every stage* or names the stage the register (PROJECT.md) says you are in. Rows for other stages are not this session's reading. +Each row is a trigger, not a reading list: open a row's file when the first column happens in this session, and only rows whose Stage(s) cell says *every stage* or names the stage the register (PROJECT.md) says you are in. Do not read the table ahead — a build session that only writes pages never opens the microflow rows. | Always relevant for | Reference this | Stage(s) | |---|---|---| @@ -25,7 +25,7 @@ Read a row when its Stage(s) cell says *every stage* or names the stage the regi | Any pass whose input is missing, stale or unresolvable — before recording UNMEASURED, N/A or a silent skip: name what was missing, say what you assessed against instead, still deliver a verdict | `skills/degrade-to-judgement.md` | every stage | | Any time an exit code, a tool's output or a subagent's report is about to become a stated finding — verify before you conclude | `skills/tool-output-is-not-ground-truth.md` | every stage | | Before obeying any learned-* STOP or workaround that costs a detour — probe the binary you actually have, then stamp the verdict back into the rule | `skills/retesting-learned-rules.md` | every stage | -| Any pipeline work at all — every session, before producing any stage artifact (not just "when unsure"); READMEs and the guide are orientation only | `skills/conversion-runbook.md` | P,0,1,2,3,4,5,6,7 | +| Any pipeline work at all — every session, before producing any stage artifact: read §1b plus your own stage's section, not the whole file (gate-check.sh prints the line spans); READMEs and the guide are orientation only | `skills/conversion-runbook.md` | P,0,1,2,3,4,5,6,7 | | Any question before asking the user or writing anything — query the model, then read the source, then ask the human, in that order | `skills/query-the-model.md` | P,0,1,2,3,4,5,6,7 | | Putting a question TO the user — any gate, any stage: ask in chat not in a file, two named options plus your recommendation, one batch per gate then end the turn | `skills/interview-protocol.md` | P,0,1,2,3,4,5,6,7 | | Any stage transition — the 2+1 format every CAC uses, and the one-register rule (answers land in PROJECT.md, never in a separate state file). The seven CACs themselves are routed per stage in the situational table | `skills/checkpoints/checkpoint-template.md` | 0,1,2,3,4,6,7 |