pi-gauntlet 7.22.0 → 7.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## v7.23.0 - 2026-10-20
4
+
5
+ ### Changed
6
+
7
+ - **Skill references are read once per session.** `/skill:brainstorming` reads `reference/ticket-acceptance.md` at first use; checklist steps 4 and 8 read it only when a restored session or a fresh-start redraw has nothing in context. The shared "Project overrides" block in all 20 skills reads the overrides file once per session and skips the read when an earlier skill already loaded it.
8
+ - **`/skill:subagent-driven-development` fits one read.** SKILL.md drops the older-runtime plain-`tasks:` fallback and the hardcoded 7.4.0 preflight; one guard before the first wave reads the pi-cohort floor from the installed pi-gauntlet `package.json`, resolves both packages from `pi list` by their installed package name (pinned, local-path, and filtered entries resolve), and stops with `pi-cohort >= X.Y.Z required, found <version>`, `pi-cohort not installed`, `cannot read peer floor`, or `cannot parse pi-cohort version <value>` before any dispatch. The happy-path runner moves verbatim to `reference/happy-path-run.md`, read only when a plan declares a happy path.
9
+ - **Implementer dispatch template is scope plus pointer.** `implementer-prompt.md` keeps the task paste, `SCOPED_TEST_COMMANDS`, `TEST_CONTRACT`, the met/unmet evidence lines, and the `**Status:**` enum; escalation, self-review, code-organization, and commit prose now live only in the `implementer` persona.
10
+ - **pi-cohort floor is 7.4.3**, pinned to the newest published pi-cohort at release time; `/skill:release` refuses a release whose declared floor is behind `npm view pi-cohort version`.
11
+
12
+ ### Added
13
+
14
+ - **`npm test` size and floor lints.** Every `skills/**/*.md` and `agents/*.md` must stay under 50,000 bytes and 2,000 lines (the `read` tool's single-call cap); `package.json`'s `peerDependencies["pi-cohort"]` must be exactly `>=X.Y.Z` and match the README install floor.
15
+ - Eval samples for the read-once brainstorming steps, the package-derived preflight stop and late happy-path read, and the trimmed implementer template (`eval/{brainstorming,subagent-driven-development,implementer}`).
16
+
17
+ ## v7.22.1 - 2026-10-20
18
+
19
+ ### Fixed
20
+
21
+ - **`/skill:gauntlet-handoff` finds cohort's `handoff` skill by path.** pi-cohort >= 7.4.3 marks `handoff` command-only, which drops it from the session skill list the skill used to search, so every run stopped with "not in the session skill list". Step 2 now resolves the pi-cohort package root from `pi list` and reads `<root>/skills/handoff/SKILL.md` directly.
22
+
3
23
  ## v7.22.0 - 2026-10-20
4
24
 
5
25
  ### Added
package/README.md CHANGED
@@ -122,9 +122,9 @@ Run by a human against pi-cohort >= 7.1.0, before a pi-gauntlet release claims t
122
122
  ## Requirements
123
123
 
124
124
  - [pi-coding-agent](https://github.com/earendil-works/pi) ≥ 0.85.1 - tested minimum for sequential `phase_tracker` tool execution, which persists a tracker update before a later tool call in the same model message.
125
- - [pi-cohort](https://github.com/jjuraszek/pi-cohort) >= 7.4.1 - required peer package, including binary-safe worktree patches. Skills that dispatch agents (`requesting-code-review`, `subagent-driven-development`, `dispatching-parallel-agents`, `writing-plans`, `forge-skill`, `shape-ticket`, `roasting-the-spec`) call `subagent({})`, which pi-cohort provides. pi-gauntlet does not vendor the dispatch tool; without pi-cohort those skills have nothing to call. Gauntlet execution dispatches explicitly use `async: false`; do not enable pi-cohort's incompatible `forceTopLevelAsync` setting. See pi-cohort's [dispatch configuration](https://github.com/jjuraszek/pi-cohort/blob/main/doc/configuration.md) for that setting's owner and semantics. A wave of N >= 1 tasks dispatches its implementers and first spec reviews as one chain call.
125
+ - [pi-cohort](https://github.com/jjuraszek/pi-cohort) >= 7.4.3 - required peer package, including binary-safe worktree patches. Skills that dispatch agents (`requesting-code-review`, `subagent-driven-development`, `dispatching-parallel-agents`, `writing-plans`, `forge-skill`, `shape-ticket`, `roasting-the-spec`) call `subagent({})`, which pi-cohort provides. pi-gauntlet does not vendor the dispatch tool; without pi-cohort those skills have nothing to call. Gauntlet execution dispatches explicitly use `async: false`; do not enable pi-cohort's incompatible `forceTopLevelAsync` setting. See pi-cohort's [dispatch configuration](https://github.com/jjuraszek/pi-cohort/blob/main/doc/configuration.md) for that setting's owner and semantics. A wave of N >= 1 tasks dispatches its implementers and first spec reviews as one chain call. `subagent-driven-development` stops before dispatch on unsupported installs; there is no older-runtime fallback.
126
126
 
127
- Both packages must be listed in your `.pi/settings.json#packages` array (pi adds them automatically when you `pi install`). pi-gauntlet and pi-cohort are versioned independently but release together whenever dispatch semantics change - pin compatible versions of both.
127
+ Both packages must be listed in your `.pi/settings.json#packages` array (pi adds them automatically when you `pi install`). pi-gauntlet and pi-cohort are versioned independently but release together whenever dispatch semantics change - pin compatible versions of both. At each pi-gauntlet release, set the pi-cohort peer minimum and README floor together to the newest released pi-cohort version; `/skill:release` checks the registry before proceeding.
128
128
 
129
129
  ## Install
130
130
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-gauntlet",
3
- "version": "7.22.0",
3
+ "version": "7.23.0",
4
4
  "description": "Opinionated, gated workflow skills, subagent personas, and runtime extensions for the pi coding agent.",
5
5
  "author": "Jacek Juraszek",
6
6
  "type": "module",
@@ -62,7 +62,7 @@
62
62
  "test": "node scripts/ci.mjs"
63
63
  },
64
64
  "peerDependencies": {
65
- "pi-cohort": ">=7.4.1"
65
+ "pi-cohort": ">=7.4.3"
66
66
  },
67
67
  "dependencies": {
68
68
  "yaml": "^2.9.0"
@@ -44,11 +44,11 @@ Work through the items below **in order**. After a user answer or completed side
44
44
 
45
45
  2. **Set up the worktree** - see [Worktree First](#worktree-first).
46
46
  3. **Gather context** - read [Ticket Handling](#ticket-handling), then follow [`gatherer.md`](gatherer.md) without a human stop.
47
- 4. **Understand the idea against the draft** - read [Ticket Handling](#ticket-handling), then see [Understand the idea](#3-understand-the-idea).
47
+ 4. **Understand the idea against the draft** - if `reference/ticket-acceptance.md` is not already in context this session (restored entry, or a redraw after a fresh start), read [Ticket Handling](#ticket-handling) before the rest of this step; then see [Understand the idea](#3-understand-the-idea).
48
48
  5. **Propose 2-3 approaches** - see [Explore approaches](#4-explore-approaches).
49
49
  6. **Present the design** - see [Present the design in two rounds](#6-present-the-design-in-two-rounds).
50
50
  7. **Write the spec** - read [Spec Self-Review](#spec-self-review-before-user-review-gate) before writing; follow steps 1-5.
51
- 8. **Spec self-review (lint)** - read [Ticket Handling](#ticket-handling), then run the inline checks in [Spec Self-Review](#spec-self-review-before-user-review-gate).
51
+ 8. **Spec self-review (lint)** - if `reference/ticket-acceptance.md` is not already in context this session (restored entry, or a redraw after a fresh start), read [Ticket Handling](#ticket-handling) before the rest of this step; then run the inline checks in [Spec Self-Review](#spec-self-review-before-user-review-gate).
52
52
  9. **Critique pass (auto-dispatched)** - use [Spec Council](#spec-council).
53
53
  10. **Re-run placeholder scan** - follow [Spec Self-Review](#spec-self-review-before-user-review-gate).
54
54
  11. **Generate spec summary** - follow [User Review Gate](#user-review-gate).
@@ -148,7 +148,7 @@ Use two rounds, targeting 300-500 words each, with one approval each; revisions
148
148
 
149
149
  ## Ticket Handling
150
150
 
151
- Read [Ticket Handling](reference/ticket-acceptance.md) before gathering context or step-4/8 entry, even with no ticket; unreadable -> stop with a blocking error, never reconstruct from memory.
151
+ Read [Ticket Handling](reference/ticket-acceptance.md) at first use - before gathering context, even with no ticket. Steps 4 and 8 carry the same read behind an in-context check so a restored session (`gauntlet-resume` routes there) loads it once; a same-session redraw or a second brainstorm in one session reuses the content already in context. Unreadable -> stop with a blocking error, never reconstruct from memory.
152
152
 
153
153
  ## First-Feature Oversight (Early Project Stages)
154
154
 
@@ -186,7 +186,7 @@ Classify first. Redraw test: the change alters the problem statement, adds or re
186
186
 
187
187
  Amend -> `read` `reference/amendment-surface.md` and follow it (unreadable -> stop with a blocking error; never improvise the grammar). Apply its [Standing grants](reference/amendment-surface.md#standing-grants) boundaries.
188
188
 
189
- Redraw: keep the worktree and the approved spec file. `plan_tracker({ action: "clear" })`, `phase_tracker({ action: "reset" })`, `phase_tracker({ action: "start", phase: "brainstorm" })`, delete the plan file, resume at checklist step 4 with the approved spec as the draft (steps 2-3 skipped). Spec-writing overwrites it; the full gate follows.
189
+ Redraw: keep the worktree and the approved spec file. `plan_tracker({ action: "clear" })`, `phase_tracker({ action: "reset" })`, `phase_tracker({ action: "start", phase: "brainstorm" })`, delete the plan file, resume at checklist step 4 with the approved spec as the draft (steps 2-3 skipped); step 4's first-use check covers the read. Spec-writing overwrites it; the full gate follows.
190
190
 
191
191
  ## Red Flags — STOP
192
192
 
@@ -207,6 +207,6 @@ Redraw: keep the worktree and the approved spec file. `plan_tracker({ action: "c
207
207
 
208
208
  ## Project overrides
209
209
 
210
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
210
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
211
211
 
212
212
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -440,6 +440,6 @@ nested resources" (the decision that made it so).
440
440
 
441
441
  ## Project overrides
442
442
 
443
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context - check it for project-specific routing tables, service paths, and verification commands. `## Response channels` and `## Issue tracker` are the named extension points for this skill.
443
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context - check it for project-specific routing tables, service paths, and verification commands. `## Response channels` and `## Issue tracker` are the named extension points for this skill.
444
444
 
445
445
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -408,7 +408,7 @@ unset (no body edits).
408
408
 
409
409
  If a gauntlet overrides file exists - checked in order:
410
410
  `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`,
411
- `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read
411
+ `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read
412
412
  and apply `## conventions` whenever present, without a relevance
413
413
  judgment.
414
414
  Give this skill's named section precedence over conflicting
@@ -224,6 +224,6 @@ After agents return:
224
224
 
225
225
  ## Project overrides
226
226
 
227
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
227
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
228
228
 
229
229
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -434,6 +434,6 @@ Once the merge (and any deploy) has landed, `/skill:check-delivery <ticket-ref>`
434
434
 
435
435
  ## Project overrides
436
436
 
437
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
437
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
438
438
 
439
439
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -81,6 +81,6 @@ Run after adding a rule or rewording a discipline rule.
81
81
 
82
82
  ## Project overrides
83
83
 
84
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context - check it for project-specific routing tables, service paths, and verification commands.
84
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context - check it for project-specific routing tables, service paths, and verification commands.
85
85
 
86
86
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -75,6 +75,6 @@ These bind every rendered report, menu, and external payload (review bodies, rep
75
75
 
76
76
  ## Project overrides
77
77
 
78
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context - check it for project-specific routing tables, service paths, and verification commands. `## PR gate` keys are read in step 2 (`reference/assessment.md`); `## comms style` extends the wording rules. `## cleanup` steps run on the `cleanup` pick (`reference/cleanup.md`).
78
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context - check it for project-specific routing tables, service paths, and verification commands. `## PR gate` keys are read in step 2 (`reference/assessment.md`); `## comms style` extends the wording rules. `## cleanup` steps run on the `cleanup` pick (`reference/cleanup.md`).
79
79
 
80
80
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -22,7 +22,8 @@ loop: tracker state is extension state no subagent can read.
22
22
  ## Boundaries
23
23
 
24
24
  - Reads: `../gauntlet-resume/reference/brief-contract.md` in full (resolve against this
25
- skill's directory) before any other action; the transcript; git metadata by path.
25
+ skill's directory) before any other action; the transcript; git metadata by path;
26
+ `pi list` output; cohort's `skills/handoff/SKILL.md`.
26
27
  - Writes: only an append to the brief cohort wrote, wherever the resolved path puts it
27
28
  (a repository-local `--out` included). Never a second file, never the trackers, never
28
29
  any other repository file.
@@ -58,12 +59,15 @@ loop: tracker state is extension state no subagent can read.
58
59
  `node -p "require('os').tmpdir()"`; the authoritative path is the one cohort
59
60
  reports in step 2.
60
61
  2. **Run cohort's handoff procedure.** A skill cannot expand `/skill:handoff` (pi expands
61
- skill commands on typed input only). Find `handoff` in the session skill list, `Read`
62
- its `SKILL.md` at the location listed there, and follow its procedure with the output
63
- option resolved in step 1 - the brief's core (six headings, ending at `## Skills loaded`)
64
- is cohort's to write, by cohort's rules. Absent from the skill list -> STOP: "cohort
65
- `handoff` skill not in the session skill list - install or upgrade to pi-cohort >= 7.1.0".
66
- No fallback to the `/handoff` prompt.
62
+ skill commands on typed input only), and cohort's `handoff` is command-only
63
+ (`disable-model-invocation: true`), so it is absent from the session skill list.
64
+ Locate it by path: run `pi list`; the indented path under the `pi-cohort` entry
65
+ (`npm:pi-cohort`, or a local path ending in `/pi-cohort`) is the package root. `Read` `<root>/skills/handoff/SKILL.md` and follow its procedure with the
66
+ output option resolved in step 1 - the brief's core (six headings, ending at
67
+ `## Skills loaded`) is cohort's to write, by cohort's rules. No `pi-cohort` entry, or
68
+ the file missing -> STOP: "cohort `handoff` skill not found at
69
+ `<root>/skills/handoff/SKILL.md` - install or upgrade to pi-cohort >= 7.1.0". No
70
+ fallback to the `/handoff` prompt.
67
71
  3. **Take the path from the report.** Cohort's procedure ends with `Handoff written: <abs
68
72
  path>` or `Handoff not written: <reason>`. `Handoff not written` -> STOP with that reason.
69
73
  Otherwise that path is the brief; line 1 not starting `# Handoff:` -> STOP with the path.
@@ -105,7 +109,7 @@ loop: tracker state is extension state no subagent can read.
105
109
 
106
110
  If a gauntlet overrides file exists - checked in order:
107
111
  `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`,
108
- `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read
112
+ `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read
109
113
  and apply `## conventions` whenever present, without a relevance
110
114
  judgment.
111
115
  Give this skill's named section precedence over conflicting
@@ -36,7 +36,7 @@ Nothing else: no preamble, no restated digest, no file written before item 1 is
36
36
 
37
37
  If a gauntlet overrides file exists - checked in order:
38
38
  `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`,
39
- `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read
39
+ `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read
40
40
  and apply `## conventions` whenever present, without a relevance
41
41
  judgment.
42
42
  Give this skill's named section precedence over conflicting
@@ -156,7 +156,7 @@ owning skill **without** its reset-bearing entry:
156
156
  ## Project overrides
157
157
  If a gauntlet overrides file exists - checked in order:
158
158
  `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`,
159
- `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read
159
+ `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read
160
160
  and apply `## conventions` whenever present, without a relevance
161
161
  judgment.
162
162
  Give this skill's named section precedence over conflicting
@@ -258,6 +258,6 @@ for product behavior the CLI doesn't expose.
258
258
 
259
259
  ## Project overrides
260
260
 
261
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context - check it for project-specific routing tables, service paths, and verification commands. `## Issue tracker` is the named extension point for this skill.
261
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context - check it for project-specific routing tables, service paths, and verification commands. `## Issue tracker` is the named extension point for this skill.
262
262
 
263
263
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -177,6 +177,6 @@ No performative agreement. Technical rigor always.
177
177
 
178
178
  ## Project overrides
179
179
 
180
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
180
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
181
181
 
182
182
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -79,6 +79,6 @@ See template at: `code-reviewer.md` in this skill directory
79
79
 
80
80
  ## Project overrides
81
81
 
82
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
82
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
83
83
 
84
84
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -183,6 +183,6 @@ Single pass — no automatic re-roast loop. The user can invoke this skill again
183
183
 
184
184
  ## Project overrides
185
185
 
186
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
186
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
187
187
 
188
188
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -324,6 +324,6 @@ Read this when applying the AC integrity gate (drafting, repairing, or adjudicat
324
324
 
325
325
  ## Project overrides
326
326
 
327
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context - check it for project-specific routing tables, service paths, and verification commands.
327
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context - check it for project-specific routing tables, service paths, and verification commands.
328
328
 
329
329
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -120,6 +120,8 @@ Implementer prompt templates must instruct subagents to return one of these stat
120
120
 
121
121
  ## Dispatch
122
122
 
123
+ For the fan-out + worktree + patch-integration + conflict mechanics, see `dispatching-parallel-agents`.
124
+
123
125
  Pass the implementation worktree as top-level `cwd`. For per-patch spec reviews, use [Spec-review snapshots](#spec-review-snapshots) instead.
124
126
 
125
127
  ```ts
@@ -164,7 +166,7 @@ Run every plan task through this loop in a wave of N >= 1 tasks. Run waves in se
164
166
  **Per-wave loop:**
165
167
 
166
168
  1. **Independence check.** Parse the wave's tasks' `Files:` blocks; assert pairwise-disjoint (mechanical, mirroring `wave-file-disjointness`: `Test`/`Test` on one path is not overlap, `Test` vs another task's `Create`/`Modify` is, `Modify`/`Modify` is). Runtime-resource disjointness (DB/schema, port, fixture, external service, shared temp path) is not machine-checkable here — trust the plan's wave grouping, which `writing-plans`' D5 contract guarantees. Either kind of overlap → the wave is mis-grouped; split it into one-task waves and note it.
167
- 2. **Start, then dispatch.** Record `WAVE_BASE_SHA` with `git -C <worktree> rev-parse HEAD` before dispatch; keep it fixed through the wave's commit. Mark every wave index `in_progress` in increasing index order. Use the once-per-phase preflight below to choose exactly one initial chain (including one-task waves), or the fallback implementer fan-out.
169
+ 2. **Start, then dispatch.** Record `WAVE_BASE_SHA` with `git -C <worktree> rev-parse HEAD` before dispatch; keep it fixed through the wave's commit. Mark every wave index `in_progress` in increasing index order. Run the once-per-phase preflight below before dispatching exactly one initial chain (including one-task waves).
168
170
  3. **Read the result once.** Read statuses, verdicts, patches, and reports as specified below. All implementers `DONE` and all verdicts `COMPLIANT` -> step 4. Any other outcome -> [Chain stopped or failed](#chain-stopped-or-failed). The ticket's `FAIL` means a spec gap (`NEEDS_REWORK`), not a structured verdict or an SR `stopOn` condition.
169
171
  4. **Integrate.** Run `git -C <worktree> apply --index <patch-path>` for each accepted task's patch sequentially. This stages additions as well as tracked changes for review. On an apply failure, drop that task from the wave; finish steps 5-7 for the survivors, then re-dispatch the dropped task as a one-task wave from the new committed HEAD. With zero surviving patches, skip steps 5-7 and retry the failed task from the unchanged clean HEAD under [When a Subagent Fails](#when-a-subagent-fails)'s two-attempt limit; dispatch no empty review or commit. Keep its tracker index `in_progress` until its own wave commits.
170
172
  5. **Test gate.** Run the wave's `SCOPED_TEST_COMMANDS` (union of its tasks' `Tests:` commands) on the integrated tree as `(cd "<worktree>" && <command>)` for each command — the full verification set is the verify phase's job, run once. On failure, dispatch one plain in-place `implementer` in the branch checkout with the failing output, the owning task's full text, and the wave's `SCOPED_TEST_COMMANDS`, under [When a Subagent Fails](#when-a-subagent-fails), then rerun the scoped gate. After the repaired tree passes, stage repair deliverables with `git -C <worktree> add -A` and dispatch spec review for every affected task against the integrated checkout before the initial CR; prior SR acceptance does not cover the repair. Pass each affected task's full text, absolute spec path, `Spec:` anchors, `Tests:` block, and `- Test:` paths; record its review tree per [Fix delta](#fix-delta). Resolve SR findings through [Fix-Loop Rounds](#fix-loop-rounds), with repairs in place and the scoped gate rerun. Never dispatch a nested wave from this dirty checkout: children cannot see integrated siblings from the old HEAD.
@@ -177,18 +179,51 @@ Run every plan task through this loop in a wave of N >= 1 tasks. Run waves in se
177
179
 
178
180
  **Caveat:** each task must be independently runnable and verifiable in a fresh worktree — no reliance on uncommitted local state. `pi-cohort` symlinks `node_modules`; repos needing other per-worktree setup must account for it.
179
181
 
180
- Requires pi-cohort >= 7.4.0 for `treePath` (`stopOn` is 7.3.0); below it, the preflight turns the chain off and the wave runs as today's two fan-outs.
181
-
182
- Before the first wave, run this lookup once per implement phase, observing both commands' failures (use shell pipeline failure detection):
182
+ Run this guard once per implement phase before the first wave. Stop on any error before dispatch; read the peer floor from the installed gauntlet package, not the consumer repository.
183
183
 
184
+ <!-- pi-cohort-preflight-shell -->
184
185
  ```bash
185
- set -o pipefail
186
- COHORT_DIR=$(pi list | grep -A1 'pi-cohort$' | tail -1 | tr -d ' ')
187
- COHORT_VERSION=$(node -p "require('$COHORT_DIR/package.json').version")
186
+ PI_PACKAGES=$(pi list) || { echo 'pi-cohort not installed' >&2; exit 1; }
187
+ export PI_PACKAGES
188
+ node <<'NODE'
189
+ const { readFileSync } = require('node:fs');
190
+ const { join } = require('node:path');
191
+ const lines = process.env.PI_PACKAGES.split('\n');
192
+ function directory(name) {
193
+ for (let i = 0; i < lines.length - 1; i++) {
194
+ const source = lines[i].match(/^(\s+)\S/);
195
+ const path = lines[i + 1].match(/^(\s+)\S/);
196
+ if (!source || !path || path[1].length <= source[1].length) continue;
197
+ const dir = lines[++i].trim();
198
+ try {
199
+ if (JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8')).name === name) return dir;
200
+ } catch {}
201
+ }
202
+ }
203
+ function fail(message) { console.error(message); process.exit(1); }
204
+ const cohort = directory('pi-cohort');
205
+ if (!cohort) fail('pi-cohort not installed');
206
+ let installed;
207
+ try { installed = JSON.parse(readFileSync(join(cohort, 'package.json'), 'utf8')).version; }
208
+ catch { fail('pi-cohort not installed'); }
209
+ let peer;
210
+ try {
211
+ peer = JSON.parse(readFileSync(join(directory('pi-gauntlet'), 'package.json'), 'utf8')).peerDependencies['pi-cohort'];
212
+ } catch { fail('cannot read peer floor'); }
213
+ if (typeof peer !== 'string' || !/^>=\d+\.\d+\.\d+$/.test(peer)) fail('cannot read peer floor');
214
+ const floor = peer.slice(2);
215
+ if (typeof installed !== 'string' || !/^\d+\.\d+\.\d+$/.test(installed)) fail(`cannot parse pi-cohort version ${installed}`);
216
+ const minimum = floor.split('.').map(Number);
217
+ const actual = installed.split('.').map(Number);
218
+ for (let i = 0; i < 3; i++) {
219
+ if (actual[i] < minimum[i]) fail(`pi-cohort >= ${floor} required, found ${installed}`);
220
+ if (actual[i] > minimum[i]) break;
221
+ }
222
+ NODE
223
+ PREFLIGHT_STATUS=$?
224
+ [[ "$PREFLIGHT_STATUS" == 0 ]] || exit "$PREFLIGHT_STATUS"
188
225
  ```
189
226
 
190
- Compare the three semver components numerically against 7.4.0, not lexicographically. On a lower or unparseable version, or either command's failure, use the two fan-outs for every wave in this run. Note `pi-cohort <version>: chain disabled` once with the observed version; display `unknown` and the lookup failure when discovery failed. A 7.3.x runtime must never receive the chain: it passes the literal tree reference to SR. The package peer floor is declarative; pi-managed packages do not auto-install peers.
191
-
192
227
  Pass the implementation worktree's absolute path as top-level `cwd`. Per-task `cwd` outranks step and run `cwd`; only the SR tasks override it. Rule and rationale for editing dispatches: `dispatching-parallel-agents` "pi-cohort Integration".
193
228
 
194
229
  ```bash
@@ -234,29 +269,10 @@ subagent({
234
269
 
235
270
  Count the clean code-wave path as one chain plus one separate CR `subagent()` call; integration and tests remain parent actions between them. Use positional 1-based `impl_<n>` and `sr_<n>` names; map results to plan indices by wave position. Keep `context`, `async`, and top-level `cwd` invocation-level; `worktree`, `concurrency`, and `stopOn` step-level; `as`, `outputSchema`, `cwd`, `output`, `acceptance`, and `task` per-task. Give the SR step neither `worktree` nor `stopOn`, and its tasks no `outputSchema`.
236
271
 
237
- Tell SR to start from diff hunks carrying `file:line`, read every touched file in full from its materialized tree, read deleted files from `WAVE_BASE_SHA`, and never run tests. Pass the authoritative spec's absolute implementation-worktree path; SR reads the anchored ranges itself (never inline excerpts; authority hierarchy in `./spec-reviewer-prompt.md`; anchor-less tasks are task-text-only). Output references resolve only in `task` strings and `cwd` (`treePath` only), never `reads:`; paste no diff into the chain payload. Rely on pi-cohort's `structured_output` injection only for implementers carrying `outputSchema`; 7.4.0 orders an enabled acceptance report before that call. Keep SR schema-free because no `stopOn` reads its verdict. Disable acceptance on each initial chained SR task with `none` and a nonempty reason because the parent reads each `Verdict:` line and review trees are staged by design: risky-word inference precedes read-only inference, non-none explicit levels only raise the inferred level, and `checked` or higher requires no staged files; snapshot-backed spec reviews and code review carry no `acceptance` field. Keep prompts and persona vocabularies unchanged.
272
+ Tell SR to start from diff hunks carrying `file:line`, read every touched file in full from its materialized tree, read deleted files from `WAVE_BASE_SHA`, and never run tests. Pass the authoritative spec's absolute implementation-worktree path; SR reads the anchored ranges itself (never inline excerpts; authority hierarchy in `./spec-reviewer-prompt.md`; anchor-less tasks are task-text-only). Output references resolve only in `task` strings and `cwd` (`treePath` only), never `reads:`; paste no diff into the chain payload. Rely on pi-cohort's `structured_output` injection only for implementers carrying `outputSchema`; the runtime orders an enabled acceptance report before that call. Keep SR schema-free because no `stopOn` reads its verdict. Disable acceptance on each initial chained SR task with `none` and a nonempty reason because the parent reads each `Verdict:` line and review trees are staged by design: risky-word inference precedes read-only inference, non-none explicit levels only raise the inferred level, and `checked` or higher requires no staged files; snapshot-backed spec reviews and code review carry no `acceptance` field. Keep prompts and persona vocabularies unchanged.
238
273
 
239
274
  Read the tool-result text, not `details`: read implementer statuses from fenced JSON in `## Outputs` and the `## Stop` line; read SR verdicts from the `Verdict:` line of each SR `output:` report, one of `COMPLIANT`, `NEEDS_REWORK`, or `OUT_OF_SCOPE_CHANGES`. Read patch locations from `Artifacts:`: `<Artifacts dir>/worktree-diffs/step-0/task-<i>-implementer.patch`, with 0-based wave position `<i>`. Use these artifact patches for integration and later repairs. Exit-0 reports are the known `output:` files. A nonzero task has no `output:` file and no bound output. Recover its prose from its session `subagent-artifacts` output file (`<runId>_implementer_<index>_output.md`, defined by pi-cohort `src/shared/artifacts.ts`), matching the run/task identity in the result or session transcript. Use the same source-defined per-agent naming for a failed reviewer. Do not use the chain's empty `parallel-0/` directories for failed prose. If artifacts are disabled, missing, or cannot be unambiguously matched, enter [When a Subagent Fails](#when-a-subagent-fails) with the visible diagnostic; never invent a status. Keep SR's large-wave `outputMode: "file-only"` hint; read the report itself, not its `Output saved to:` pointer. Carry its full contents verbatim under `## Previous review report (re-review trigger)` on re-review.
240
275
 
241
- **Older-runtime fallback only:** use this plain implementer fan-out, then the snapshot-backed SR fan-out below. Keep the same report-path wave/task mapping.
242
-
243
- ```ts
244
- subagent({
245
- context: "fresh",
246
- async: false,
247
- cwd: "/abs/path/to/this/worktree", // REQUIRED: the worktree path, else children branch from main
248
- worktree: true, // each task in its own git worktree, branched from cwd's HEAD
249
- concurrency: 4, // default; cap = wave size
250
- tasks: [
251
- // do NOT set per-task cwd under worktree:true — it must equal the top-level cwd or the run errors
252
- { agent: "implementer", task: "<task text + owned files + SCOPED_TEST_COMMANDS + status protocol>", output: "<REPORT_DIR>/wave1-task1.md" },
253
- { agent: "implementer", task: "<task text + owned files + SCOPED_TEST_COMMANDS + status protocol>", output: "<REPORT_DIR>/wave1-task2.md" },
254
- ],
255
- })
256
- ```
257
-
258
- For the fan-out + worktree + patch-integration + conflict mechanics, see `dispatching-parallel-agents`.
259
-
260
276
  ### Chain stopped or failed
261
277
 
262
278
  Route the result already read in step 3; retain all successful sibling patches and verdicts. Inspect failed tasks regardless of whether `## Stop` is also present: pi-cohort evaluates the stop condition before checking sibling failures, so both can coexist. Read exit-0 statuses from `## Outputs` when present or their `output:` reports; recover failed-task prose using the session-artifact rule above, including its unavailable-artifact fallback. Treat `## Stop` as a matched exit-0 status, not proof that every sibling succeeded. For `DONE_WITH_CONCERNS` alongside a nonzero `BLOCKED`, judge the concerns, diagnose the failed task, and retain accepted siblings:
@@ -266,7 +282,6 @@ Route the result already read in step 3; retain all successful sibling patches a
266
282
  | Exit-0 stop (`## Stop`) with no failed siblings | Siblings finished, statuses remain in `## Outputs`, and no SR step ran. Judge `DONE_WITH_CONCERNS`, handle `NEEDS_CONTEXT` and `BLOCKED` per the status table, then snapshot accepted patches and use the ordinary SR fan-out below. |
267
283
  | Chain error, with or without `## Stop` | Identify and diagnose every failed task from the result, including prose `**Status:**` / `Verdict:` recovered through the session-artifact rule above. Completion-guard failure with no edits, rejected/missing `structured_output`, failed `treePath`, and sibling process failure all take this route. Handle a recoverable `BLOCKED` or `NEEDS_CONTEXT` through its status matrix even when that unaccepted task has no patch. Route a task with no recoverable status, or an accepted task with a missing/empty patch, to [When a Subagent Fails](#when-a-subagent-fails) with the visible diagnostic; never invent a status or review an unchanged tree. Retain exit-0 SR verdicts obtained in a materialized tree; dispatch only accepted patches without a verdict. Successful siblings are never re-run. |
268
284
  | Completed chain with `NEEDS_REWORK` or `OUT_OF_SCOPE_CHANGES` | Repair only those tasks using the spec-gap loop below. Preserve passing sibling patches/verdicts. |
269
- | Older-runtime fallback | Parse the plain fan-out statuses, then use the same snapshot-backed SR and fix loop below. |
270
285
 
271
286
  Parse each `DONE`/`BLOCKED`/etc. (see [Implementer Status](#implementer-status)) **first**. Then **dispatch a `spec-reviewer` per accepted patch** (`DONE`, or a `DONE_WITH_CONCERNS` you proceeded with) still missing a verdict in one parallel fan-out - `context: "fresh"`, each task's `cwd` = its [Spec-review snapshot](#spec-review-snapshots), **no `worktree` flag** (read-only) - each passed its full task text, the returned **patch diff**, the absolute spec path, and the task's `**Spec:**` anchors, plus its `**Tests:**` block and `- Test:` paths as contract. SR reads the anchored ranges itself (never inline excerpts; authority hierarchy in `./spec-reviewer-prompt.md`; anchor-less tasks are task-text-only). Review starts from the diff (its hunks carry `file:line`) and reads each touched file in full; test execution is never the reviewer's job (step 5 runs the wave's `SCOPED_TEST_COMMANDS`). Inline verdicts are fine at normal wave sizes; large waves use `output:` + `outputMode: "file-only"`; read the full report file itself.
272
287
 
@@ -274,7 +289,7 @@ Parse each `DONE`/`BLOCKED`/etc. (see [Implementer Status](#implementer-status))
274
289
 
275
290
  ## Spec-review snapshots
276
291
 
277
- Materialize each accepted patch for every pre-integration review not run by the chain: accepted siblings after errors/stops, replacement patches on re-review, and older-runtime fallback. Keep the implementation worktree unchanged; pi-cohort removes its worker checkouts before returning patches.
292
+ Materialize each accepted patch for every pre-integration review not run by the chain: accepted siblings after errors/stops, replacement patches on re-review. Keep the implementation worktree unchanged; pi-cohort removes its worker checkouts before returning patches.
278
293
 
279
294
  Substitute shell-quoted literals for the implementation worktree, the recorded `WAVE_BASE_SHA`, and the absolute patch path. Run this block once per patch:
280
295
 
@@ -314,67 +329,7 @@ Record its review tree per [Fix delta](#fix-delta) before every parent-dispatche
314
329
  2. **Whole-diff code review.** Only after passing full verification, dispatch one foreground whole-diff `code-reviewer` per `/skill:requesting-code-review` against that committed HEAD, with `SCOPED_TEST_COMMANDS: none`; the reviewer does not repeat the full suite. Act on the verdict per `/skill:requesting-code-review` Fix rounds; carry the final `SHIP` report's Minor finding lines verbatim into the closure block's `whole-diff minors:` section (`verification-before-completion/reference/conformance-check.md` "Closure / conformance"), or `whole-diff minors: none`. Before dispatching a review repair, reopen (`in_progress`) every existing plan-task index whose `Files:` ownership includes its touched files; leave unowned cross-cutting repair work in the review report. Mark each reopened index `complete` only once the repair is re-verified and the re-review accepts it — this is the same completion point step 1's reopened indices wait for, not an extra gate, and the gate order stays full verification -> whole-diff CR -> conformance. Any repair invalidates prior full verification, so rerun the full set successfully before the next gate.
315
330
  3. **Close the loop — conformance check.** The review in step 2 is plan-vs-code (single-step); it inherits any requirement the plan already dropped.
316
331
 
317
- **Happy-path run - first action of this step, only when the plan header carries a `**Happy path:**` line or the diff selects a row.** The overrides file's `## Happy path` table (schema in the README overrides contract) names path-prefixed rows; the plan header's line is the plan-time default.
318
-
319
- 1. Re-derive the row from `git -C "<worktree>" diff --name-only <base>..HEAD` (`<base>` = the branch point): two or more non-`cross-cutting` rows, or a path inside the `cross-cutting` row's own `Paths` and inside no other row's -> `cross-cutting`, taking precedence (no `cross-cutting` row -> no run and no outcome line); else paths inside exactly one non-`cross-cutting` row's `Paths` -> that row; none -> no run and no outcome line. Run the diff-derived row; when it differs from the header label, record `row: <diff-derived> (header: <label>)` in `summary.txt`.
320
- 2. Substitute shell-quoted literal values for every placeholder in this one bash block: the absolute worktree path, command verbatim, first command token after leading `NAME=value` assignments, duration (default `10m`), diff-derived row, and optional header label (use the row label when absent). Derive the token from the declared command without evaluating it or parsing general shell grammar. Run the entire block in one tool call; do not carry shell variables between calls. Read its printed summary path and outcome for subsequent tools.
321
-
322
- <!-- happy-path-shell -->
323
- ```bash
324
- HP_WORKTREE={{HP_WORKTREE}}
325
- HP_CMD={{HP_COMMAND}}
326
- HP_TOKEN={{HP_TOKEN}}
327
- HP_DURATION={{HP_DURATION}}
328
- HP_ROW={{HP_ROW}}
329
- HP_HEADER={{HP_HEADER}}
330
- HP_DIR=$(mktemp -d) || exit 1
331
- HEAD=$(git -C "$HP_WORKTREE" rev-parse HEAD) || exit 1
332
- HP_LABEL=$HP_ROW
333
- if [[ "$HP_HEADER" != "$HP_ROW" ]]; then HP_LABEL="$HP_ROW (header: $HP_HEADER)"; fi
334
- if ! TO=$(command -v timeout || command -v gtimeout); then
335
- OUTCOME='happy-path: not run - no timeout binary'
336
- elif [[ -z "$HP_TOKEN" || -z "${HP_CMD//[[:space:]]/}" ]] || ! (cd "$HP_WORKTREE" && command -v "$HP_TOKEN" >/dev/null); then
337
- OUTCOME='happy-path: not run - command not found'
338
- else
339
- BEFORE=$(git -C "$HP_WORKTREE" status --porcelain --untracked-files=all) || exit 1
340
- if (cd "$HP_WORKTREE" && "$TO" -k 30s "$HP_DURATION" bash -c "$HP_CMD") >"$HP_DIR/transcript.log" 2>&1; then
341
- EXIT=0
342
- else
343
- EXIT=$?
344
- fi
345
- AFTER=$(git -C "$HP_WORKTREE" status --porcelain --untracked-files=all) || exit 1
346
- if [[ "$BEFORE" != "$AFTER" ]]; then
347
- OUTCOME="happy-path: failed - dirtied worktree: ${AFTER//$'\n'/; }"
348
- elif [[ "$EXIT" == 0 ]]; then
349
- OUTCOME='happy-path: passed'
350
- elif [[ "$EXIT" == 75 ]]; then
351
- OUTCOME="happy-path: not run - environment unavailable: $(tail -n 1 "$HP_DIR/transcript.log")"
352
- elif [[ "$EXIT" == 124 || "$EXIT" == 137 ]]; then
353
- OUTCOME="happy-path: failed - timed out after $HP_DURATION"
354
- elif [[ "$EXIT" == 126 ]]; then
355
- OUTCOME='happy-path: not run - not executable'
356
- else
357
- OUTCOME="happy-path: failed (exit $EXIT)"
358
- fi
359
- fi
360
- { printf '%s\nhead: %s\nrow: %s\n' "$OUTCOME" "$HEAD" "$HP_LABEL"; if [[ -f "$HP_DIR/transcript.log" ]]; then printf '\n'; tail -n 200 "$HP_DIR/transcript.log"; fi; } >"$HP_DIR/summary.txt" || exit 1
361
- printf 'summary: %s\noutcome: %s\n' "$HP_DIR/summary.txt" "$OUTCOME"
362
- ```
363
-
364
- 3. If the block exits non-zero or its printed summary is missing/unreadable, stop verification and report the shell error; never dispatch conformance with the selected run omitted. Distinguish this runner failure from a command's `failed`/`not run` outcome recorded in a readable summary. Treat any status difference (tracked or untracked residue) as failed regardless of exit code. Never stage or commit the listed paths as deliverables; remove untracked residue and restore tracked residue (`git -C "<worktree>" checkout -- <paths>`) explicitly before the conformance dispatch, so the tree is clean when the audit-time input rule runs.
365
-
366
- | Condition | Outcome line |
367
- |---|---|
368
- | worktree differs after run | `happy-path: failed - dirtied worktree: <paths>` |
369
- | exit 0, worktree clean | `happy-path: passed` |
370
- | exit 75 | `happy-path: not run - environment unavailable: <last line of transcript.log>` |
371
- | exit 124, or 137 after the `-k` kill | `happy-path: failed - timed out after <duration>` |
372
- | exit 126 | `happy-path: not run - not executable` |
373
- | pre-check failed | `happy-path: not run - <reason>` |
374
- | any other non-zero | `happy-path: failed (exit <n>)` |
375
- | no header line and no diff-derived row | no run, no outcome line |
376
-
377
- A timeout is `failed`, not `not run`: a consumer that never receives its message hangs, and the reviewer must see it; `not run` is reserved for a command that never executed. `timeout -k 30s` sends `TERM` then `KILL`; a script that does not trap `TERM` leaves its stack up, and the next run's exit 75 surfaces that. The full `transcript.log` stays in `$HP_DIR` for the human; the reviewer receives `summary.txt` only (outcome, `head:`, `row:`, 200-line tail). A `failed` or `not run` outcome never stops the flow and never becomes a repair item at this step - it is evidence for the audit; `$HP_DIR` and the outcome carry into the fix loop per `conformance-check.md`. Never split the shell block across calls.
332
+ **Happy-path run:** When the plan header carries a `**Happy path:**` line or the diff selects a row, `read` `reference/happy-path-run.md` at its absolute path beside this skill and follow its instructions. On an unreadable reference, stop with a blocking error; never reconstruct the runner.
378
333
 
379
334
  Before marking verify complete, dispatch a fresh-context **`conformance-reviewer`** — its **own** dispatch, never fused into the step-2 review — to confront the deliverable (code **and** docs) against the *origin* — the spec **and** the original prompt — per `verification-before-completion/reference/conformance-check.md`. Pass the spec path, the verbatim original prompt, the full diff, and - when a run happened - `Happy path: <abs path to $HP_DIR/summary.txt> (<outcome>)` (`<outcome>` = the outcome line without its `happy-path: ` prefix). Follow that reference for the partition rule, concern decomposition, and fix-loop mechanics; do not reimplement them here. The fix loop reuses durable `Gn` gap indices as defined in conformance-check.md; it never calls `phase_tracker`. Call `phase_tracker({ action: "complete", phase: "verify" })` only when the reference says the handoff is durably complete: either a current `CONFORMS` result, or a current `## Closure / conformance` inventory whose carried-open concerns all come from valid deferred gaps, including `recommended: fix` gaps carried open because a declared precondition made the fix loop unavailable (`maxFixRounds: 0`, or no eligible named-branch worktree). A started positive-cap fix loop that blocks, fails, or exhausts its rounds with an open `fix` gap is escalation, not completion; on escalation, do not complete verify, stop and report.
380
335
  4. Summarize what was implemented (tasks completed, files changed, test counts, code-review verdict). Emit the `## Closure / conformance` block exactly as defined in `verification-before-completion/reference/conformance-check.md`: it must open with the sentinel (`status: CONFORMS (0 open)` or `status: GAPS (N open)`, then `audited-base: <full HEAD SHA>`, then - exactly when a happy-path run happened - `happy-path: <value of the reviewer's Happy path: line from the final audit, the text after Happy path: >`), then carry the exact durable concern schema by reference with no renamed or reformatted fields. `finishing-a-development-branch` Step 3.5 consumes that block verbatim.
@@ -409,6 +364,6 @@ Record its review tree per [Fix delta](#fix-delta) before every parent-dispatche
409
364
 
410
365
  ## Project overrides
411
366
 
412
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
367
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
413
368
 
414
369
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -14,114 +14,26 @@ Dispatch a subagent with this prompt:
14
14
 
15
15
  ## Context
16
16
 
17
- [Scene-setting: where this fits, dependencies, architectural context]
18
-
19
- ## Before You Begin
20
-
21
- If you have questions about:
22
- - The requirements or acceptance criteria
23
- - The approach or implementation strategy
24
- - Dependencies or assumptions
25
- - Anything unclear in the task description
26
-
27
- **Ask them now.** Raise any concerns before starting work.
28
-
29
- ## Your Job
30
-
31
- Once you're clear on requirements:
32
- 1. Implement exactly what the task specifies
33
- 2. Write tests (following TDD — failing test first for production code)
34
- 3. Verify with the commands under SCOPED_TEST_COMMANDS (if `none`, state that)
35
- 4. Commit your work
36
- 5. Self-review (see below)
37
- 6. Report back
17
+ [Scene-setting: where this fits, dependencies, architectural context, task-specific clarifications]
38
18
 
39
19
  Work from: [directory]
40
20
 
41
21
  SCOPED_TEST_COMMANDS: [only the task's Tests: command bullets, backticks stripped, verbatim; exclude via:, baseline:, and none: metadata | none]
42
22
 
43
- Run ONLY these commands for verification. Never run a repo-wide suite,
44
- linter, or type-checker. If the value is `none`, run nothing and say so
45
- in your report.
46
-
47
23
  TEST_CONTRACT: [the task's **Tests:** block verbatim (commands, via:, baseline: bullets verbatim, none:) and its Files: Create:/Test: paths]
48
24
 
49
25
  Tests call the via: seam directly - not a wrapper, not the internals behind it.
50
26
  Create every Create: path at exactly that path.
51
27
 
52
- **While you work:** If you encounter something unexpected or unclear, **ask questions**.
53
- It's always OK to pause and clarify. Don't guess or make assumptions.
54
-
55
- ## Code Organization
56
-
57
- You reason best about code you can hold in context at once, and your edits are more
58
- reliable when files are focused. Keep this in mind:
59
- - Follow the file structure defined in the plan.
60
- - Each file should have one clear responsibility with a well-defined interface.
61
- - If a file you're creating is growing beyond the plan's intent, stop and report it
62
- as DONE_WITH_CONCERNS — don't split files on your own without plan guidance.
63
- - If an existing file you're modifying is already large or tangled, work carefully
64
- and note it as a concern in your report.
65
- - In existing codebases, follow established patterns. Improve code you're touching
66
- the way a good developer would, but don't restructure things outside your task.
67
-
68
- ## When You're in Over Your Head
69
-
70
- It is always OK to stop and say "this is too hard for me." Bad work is worse than
71
- no work. You will not be penalized for escalating.
72
-
73
- **STOP and escalate when:**
74
- - The task requires architectural decisions with multiple valid approaches.
75
- - You need to understand code beyond what was provided and can't find clarity.
76
- - You feel uncertain about whether your approach is correct.
77
- - The task involves restructuring existing code in ways the plan didn't anticipate.
78
- - You've been reading file after file trying to understand the system without progress.
79
-
80
- **How to escalate:** Report back with status `BLOCKED` or `NEEDS_CONTEXT`. Describe
81
- specifically what you're stuck on, what you've tried, and what kind of help you need.
82
- The orchestrator can provide more context, re-dispatch with a more capable model,
83
- or break the task into smaller pieces.
84
-
85
- ## Before Reporting Back: Self-Review
86
-
87
- Review your work with fresh eyes. Ask yourself:
88
-
89
- **Completeness:**
90
- - Did I fully implement everything in the spec?
91
- - Did I miss any requirements?
92
- - Are there edge cases I didn't handle?
93
-
94
- **Quality:**
95
- - Is this my best work?
96
- - Are names clear and accurate (match what things do, not how they work)?
97
- - Is the code clean and maintainable?
98
-
99
- **Discipline:**
100
- - Did I avoid overbuilding (YAGNI)?
101
- - Did I only build what was requested?
102
- - Did I follow existing patterns in the codebase?
103
-
104
- **Testing:**
105
- - Do tests actually verify behavior (not just mock behavior)?
106
- - Did I follow TDD (step 2)?
107
- - Does each added test earn its run - extends an existing test where one covers the behavior, minimal synthetic input, shared expensive setup, right tier?
108
-
109
- If you find issues during self-review, fix them now before reporting.
110
-
111
- ## Report Format
28
+ Report test-contract evidence: one line per SCOPED_TEST_COMMANDS command - `met` (exit 0; quote the last output line) or `unmet <reason>`;
29
+ one line per via: - `met <test file:line calling it>` or `unmet <reason>`; `none` when the block is `none:`.
30
+ Any `unmet` -> `DONE_WITH_CONCERNS`.
112
31
 
113
- When done, report:
114
- - **Status:** `DONE` | `DONE_WITH_CONCERNS` | `BLOCKED` | `NEEDS_CONTEXT`
115
- - What you implemented (or what you attempted, if blocked)
116
- - What you tested and test results
117
- - Test contract: one line per SCOPED_TEST_COMMANDS command - `met` (exit 0; quote the last output line) or `unmet <reason>`;
118
- one line per via: - `met <test file:line calling it>` or `unmet <reason>`; `none` when the block is `none:`.
119
- Any `unmet` -> `DONE_WITH_CONCERNS`.
120
- - Files changed
121
- - Self-review findings (if any)
122
- - Any issues or concerns
32
+ **Status:** DONE | DONE_WITH_CONCERNS | BLOCKED | NEEDS_CONTEXT
33
+ DONE: Implemented and scoped tests pass.
34
+ DONE_WITH_CONCERNS: Implemented, with a deviation, risk, or unmet test contract.
35
+ BLOCKED: Cannot complete the task.
36
+ NEEDS_CONTEXT: Need information not provided.
123
37
 
124
- Use `DONE_WITH_CONCERNS` if you completed the work but have doubts about correctness, or when you kept a test heavy or rebuilt its setup on purpose (a declined test-economy default) - name it under issues or concerns with the reason.
125
- Use `BLOCKED` if you cannot complete the task. Use `NEEDS_CONTEXT` if you need
126
- information that wasn't provided. Never silently produce work you're unsure about.
38
+ Conduct (TDD scenarios, test economy, scope discipline, escalation, report shape) is your persona; this prompt carries only the task and its test scope.
127
39
  ```
@@ -0,0 +1,63 @@
1
+ # Happy-path run
2
+
3
+ **Happy-path run - first action of this step, only when the plan header carries a `**Happy path:**` line or the diff selects a row.** The overrides file's `## Happy path` table (schema in the README overrides contract) names path-prefixed rows; the plan header's line is the plan-time default.
4
+
5
+ 1. Re-derive the row from `git -C "<worktree>" diff --name-only <base>..HEAD` (`<base>` = the branch point): two or more non-`cross-cutting` rows, or a path inside the `cross-cutting` row's own `Paths` and inside no other row's -> `cross-cutting`, taking precedence (no `cross-cutting` row -> no run and no outcome line); else paths inside exactly one non-`cross-cutting` row's `Paths` -> that row; none -> no run and no outcome line. Run the diff-derived row; when it differs from the header label, record `row: <diff-derived> (header: <label>)` in `summary.txt`.
6
+ 2. Substitute shell-quoted literal values for every placeholder in this one bash block: the absolute worktree path, command verbatim, first command token after leading `NAME=value` assignments, duration (default `10m`), diff-derived row, and optional header label (use the row label when absent). Derive the token from the declared command without evaluating it or parsing general shell grammar. Run the entire block in one tool call; do not carry shell variables between calls. Read its printed summary path and outcome for subsequent tools.
7
+
8
+ <!-- happy-path-shell -->
9
+ ```bash
10
+ HP_WORKTREE={{HP_WORKTREE}}
11
+ HP_CMD={{HP_COMMAND}}
12
+ HP_TOKEN={{HP_TOKEN}}
13
+ HP_DURATION={{HP_DURATION}}
14
+ HP_ROW={{HP_ROW}}
15
+ HP_HEADER={{HP_HEADER}}
16
+ HP_DIR=$(mktemp -d) || exit 1
17
+ HEAD=$(git -C "$HP_WORKTREE" rev-parse HEAD) || exit 1
18
+ HP_LABEL=$HP_ROW
19
+ if [[ "$HP_HEADER" != "$HP_ROW" ]]; then HP_LABEL="$HP_ROW (header: $HP_HEADER)"; fi
20
+ if ! TO=$(command -v timeout || command -v gtimeout); then
21
+ OUTCOME='happy-path: not run - no timeout binary'
22
+ elif [[ -z "$HP_TOKEN" || -z "${HP_CMD//[[:space:]]/}" ]] || ! (cd "$HP_WORKTREE" && command -v "$HP_TOKEN" >/dev/null); then
23
+ OUTCOME='happy-path: not run - command not found'
24
+ else
25
+ BEFORE=$(git -C "$HP_WORKTREE" status --porcelain --untracked-files=all) || exit 1
26
+ if (cd "$HP_WORKTREE" && "$TO" -k 30s "$HP_DURATION" bash -c "$HP_CMD") >"$HP_DIR/transcript.log" 2>&1; then
27
+ EXIT=0
28
+ else
29
+ EXIT=$?
30
+ fi
31
+ AFTER=$(git -C "$HP_WORKTREE" status --porcelain --untracked-files=all) || exit 1
32
+ if [[ "$BEFORE" != "$AFTER" ]]; then
33
+ OUTCOME="happy-path: failed - dirtied worktree: ${AFTER//$'\n'/; }"
34
+ elif [[ "$EXIT" == 0 ]]; then
35
+ OUTCOME='happy-path: passed'
36
+ elif [[ "$EXIT" == 75 ]]; then
37
+ OUTCOME="happy-path: not run - environment unavailable: $(tail -n 1 "$HP_DIR/transcript.log")"
38
+ elif [[ "$EXIT" == 124 || "$EXIT" == 137 ]]; then
39
+ OUTCOME="happy-path: failed - timed out after $HP_DURATION"
40
+ elif [[ "$EXIT" == 126 ]]; then
41
+ OUTCOME='happy-path: not run - not executable'
42
+ else
43
+ OUTCOME="happy-path: failed (exit $EXIT)"
44
+ fi
45
+ fi
46
+ { printf '%s\nhead: %s\nrow: %s\n' "$OUTCOME" "$HEAD" "$HP_LABEL"; if [[ -f "$HP_DIR/transcript.log" ]]; then printf '\n'; tail -n 200 "$HP_DIR/transcript.log"; fi; } >"$HP_DIR/summary.txt" || exit 1
47
+ printf 'summary: %s\noutcome: %s\n' "$HP_DIR/summary.txt" "$OUTCOME"
48
+ ```
49
+
50
+ 3. If the block exits non-zero or its printed summary is missing/unreadable, stop verification and report the shell error; never dispatch conformance with the selected run omitted. Distinguish this runner failure from a command's `failed`/`not run` outcome recorded in a readable summary. Treat any status difference (tracked or untracked residue) as failed regardless of exit code. Never stage or commit the listed paths as deliverables; remove untracked residue and restore tracked residue (`git -C "<worktree>" checkout -- <paths>`) explicitly before the conformance dispatch, so the tree is clean when the audit-time input rule runs.
51
+
52
+ | Condition | Outcome line |
53
+ |---|---|
54
+ | worktree differs after run | `happy-path: failed - dirtied worktree: <paths>` |
55
+ | exit 0, worktree clean | `happy-path: passed` |
56
+ | exit 75 | `happy-path: not run - environment unavailable: <last line of transcript.log>` |
57
+ | exit 124, or 137 after the `-k` kill | `happy-path: failed - timed out after <duration>` |
58
+ | exit 126 | `happy-path: not run - not executable` |
59
+ | pre-check failed | `happy-path: not run - <reason>` |
60
+ | any other non-zero | `happy-path: failed (exit <n>)` |
61
+ | no header line and no diff-derived row | no run, no outcome line |
62
+
63
+ A timeout is `failed`, not `not run`: a consumer that never receives its message hangs, and the reviewer must see it; `not run` is reserved for a command that never executed. `timeout -k 30s` sends `TERM` then `KILL`; a script that does not trap `TERM` leaves its stack up, and the next run's exit 75 surfaces that. The full `transcript.log` stays in `$HP_DIR` for the human; the reviewer receives `summary.txt` only (outcome, `head:`, `row:`, 200-line tail). A `failed` or `not run` outcome never stops the flow and never becomes a repair item at this step - it is evidence for the audit; `$HP_DIR` and the outcome carry into the fix loop per `conformance-check.md`. Never split the shell block across calls.
@@ -236,6 +236,6 @@ phase_tracker({ action: "complete", phase: "implement" })
236
236
 
237
237
  ## Project overrides
238
238
 
239
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
239
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
240
240
 
241
241
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -227,6 +227,6 @@ Re-run tests after rebasing.
227
227
 
228
228
  ## Project overrides
229
229
 
230
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
230
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
231
231
 
232
232
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -168,6 +168,6 @@ phase_tracker({ action: "complete", phase: "verify" })
168
168
 
169
169
  ## Project overrides
170
170
 
171
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
171
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
172
172
 
173
173
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.
@@ -342,6 +342,6 @@ Auto-invoke `/skill:subagent-driven-development` in this session. Do not wait fo
342
342
 
343
343
  ## Project overrides
344
344
 
345
- If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
345
+ If a gauntlet overrides file exists - checked in order: `.pi/gauntlet-overrides.md`, `<repo root>/gauntlet-overrides.md`, `<repo root>/doc/gauntlet-overrides.md`; first found wins - read it once per session - a skill that already has the file's content in context from an earlier skill's read skips the read; a restored session has nothing in context and reads it. Read and apply `## conventions` whenever present, without a relevance judgment. Give this skill's named section precedence over conflicting `## conventions` rules. Use other relevant sections - by name match, by topic (routing, verification, worktrees, etc.), or by workflow convention - to override or extend the instructions above. Project-local `AGENTS.md` is already in context — check it for project-specific routing tables, service paths, and verification commands.
346
346
 
347
347
  The recognized headings, their readers, and the rules an override cannot change are listed in the [configuration front door](../../README.md#project-specific-overrides); an override extends or replaces the step it names and never lifts this skill's HARD CONSTRAINT or MUST text.