pi-gauntlet 7.20.1 → 7.22.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 +18 -0
- package/README.md +3 -3
- package/agents/code-reviewer.md +0 -2
- package/agents/plan-writer.md +7 -6
- package/extensions/lib/plan-check.test.ts +114 -18
- package/extensions/lib/plan-check.ts +113 -35
- package/extensions/phase-tracker.test.ts +35 -1
- package/package.json +1 -1
- package/skills/brainstorming/SKILL.md +5 -3
- package/skills/brainstorming/gatherer.md +8 -1
- package/skills/brainstorming/reference/amendment-surface.md +1 -1
- package/skills/dispatching-parallel-agents/SKILL.md +8 -2
- package/skills/gauntlet-resume/reference/brief-contract.md +22 -2
- package/skills/requesting-code-review/SKILL.md +5 -6
- package/skills/subagent-driven-development/SKILL.md +49 -51
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +5 -5
- package/skills/subagent-driven-development/implementer-prompt.md +2 -2
- package/skills/subagent-driven-development/stop-note.md +9 -4
- package/skills/verification-before-completion/reference/conformance-check.md +2 -2
- package/skills/writing-plans/SKILL.md +39 -21
- package/skills/writing-plans/reference/plan-contract.md +11 -5
|
@@ -124,9 +124,9 @@ carried gap's `recommended`. Re-run steps 1-2 above over the **full current
|
|
|
124
124
|
open-gap set** each time the reviewer returns a report — never reuse a stale
|
|
125
125
|
partition from an earlier round.
|
|
126
126
|
|
|
127
|
-
### Fix loop
|
|
127
|
+
### Fix loop - SDD wave-loop mirror, per round
|
|
128
128
|
|
|
129
|
-
Mirrors `subagent-driven-development`
|
|
129
|
+
Mirrors `subagent-driven-development`'s wave loop and reuses its
|
|
130
130
|
`plan_tracker` progress surface. Runs entirely inside the gate — it invokes
|
|
131
131
|
**no** phase-transition `phase_tracker` calls (`start`/`complete`/`skip`/`reset`
|
|
132
132
|
- `phase_tracker({ phase: "implement" })` errors while verify is `in_progress`;
|
|
@@ -72,10 +72,16 @@ The main loop never writes the plan. One fresh `plan-writer` child does the reco
|
|
|
72
72
|
5. `plan_check({ planPath: "<abs plan path>" })` in the parent. This is the stamping call; run it whichever line the child replied with.
|
|
73
73
|
6. Branch on the pair (child reply, parent check):
|
|
74
74
|
- `PLAN WRITTEN` + `PASS` -> step 7.
|
|
75
|
-
- `OPEN QUESTIONS` + any result ->
|
|
75
|
+
- `OPEN QUESTIONS` + any result -> read the section; absent or exactly `- none` takes the `PLAN WRITTEN` branch. For substantive rows, use the table below. On a pause retain phase `plan` as `in_progress` and its substep; no stamp or `plan_tracker` init.
|
|
76
|
+
|
|
77
|
+
| Row form | Parent handling |
|
|
78
|
+
|---|---|
|
|
79
|
+
| `- Task N: ... fails on <sha>` | Name task, original command, SHA, exit and summary. Present three options, one per line: `fix-first` - run `/skill:shape-ticket` for the base failure (its own gate applies), then report the plan paused and end the turn; `narrow` - the human supplies filter or path text; `amend` - use brainstorming's `reference/amendment-surface.md` section 5. Follow with `Recommendation: <option> - <reason>`, then wait. After fix-first lands, bring the advanced base into the worktree through `/skill:using-git-worktrees`' existing advanced-base procedure (rebase, or merge for a shared branch), re-dispatch per step 3 with `Findings: rerun baseline`, then step 5; after a session break use `/skill:gauntlet-resume`'s baseline continuation. For narrow, re-dispatch with a Findings row `Task N Tests: narrow to `<text>``; for amend, use section 5. Both run Baseline's rerun rule before step 5. |
|
|
80
|
+
| `- Baseline: worktree dirty`, `- Baseline: in-flight source edits`, `dirtied tracked source`, `moved HEAD` | Restore-and-rerun, not the menu: name paths and cause. Clear the parent's own wave/amendment source work through its own commit step; list doc-only work under `In-flight:` before re-dispatch. Take every other path, including every test-dirtied path, to the human to commit, discard, or move; never clean automatically. Once restored, re-dispatch per step 3 with `Findings: rerun baseline`, then step 5. Bullet `artifacts:` need no action. |
|
|
81
|
+
| Other substantive rows (contract questions) | Present the rows, wait for answers, re-dispatch per step 3 with the answers as the `Findings:` block, then step 5. |
|
|
76
82
|
- `PLAN WRITTEN` + `FAIL` -> re-dispatch per step 3 with the verbatim `FAIL (...)` output as the `Findings:` block, then step 5. Once per verbatim FAIL output: the same FAIL a second time goes to the user as an open question (the FAIL lines, verbatim), as an exhausted finding does.
|
|
77
|
-
- No child reply (the step 3 entry branch on a restored plan) -> read the result as if the reply were `OPEN QUESTIONS` when the plan carries
|
|
78
|
-
7. Clear the substep (`phase_tracker({ action: "substep", phase: "plan", substep: null })`). Read the plan once, then `## Execution Handoff` as written below: `phase_tracker({ action: "complete", phase: "plan" })`, `plan_tracker({ action: "init", ... })` from the `W<k>: <title>` list,
|
|
83
|
+
- No child reply (the step 3 entry branch on a restored plan) -> read the result as if the reply were `OPEN QUESTIONS` when the plan carries substantive Open Questions rows, else `PLAN WRITTEN` (section absent or exactly `- none`), and take that reply's branch above; a `FAIL` re-dispatch overwrites the restored plan with a repaired one.
|
|
84
|
+
7. Clear the substep (`phase_tracker({ action: "substep", phase: "plan", substep: null })`). Read the plan once, then `## Execution Handoff` as written below: `phase_tracker({ action: "complete", phase: "plan" })`, `plan_tracker({ action: "init", ... })` from the `W<k>: <title>` list, `/skill:subagent-driven-development`.
|
|
79
85
|
|
|
80
86
|
The parent holds no run id and never calls `resume` or `status`; every dispatch here is `async: false`. Re-entering this section without a restored plan overwrites whatever the plan path holds - a committed prior plan (recoverable from git history) or an uncommitted one (destroyed); re-planning is a deliberate overwrite. An amendment of the approved spec after the plan exists re-enters at step 3 with an `Amend:` block (brainstorming's `reference/amendment-surface.md` section 5 owns that call).
|
|
81
87
|
|
|
@@ -108,35 +114,31 @@ If you can't list the files, the spec isn't ready: amend or redraw per brainstor
|
|
|
108
114
|
|
|
109
115
|
## Wave Grouping
|
|
110
116
|
|
|
111
|
-
Group tasks into **waves** so the executor can parallelize independent work (see `subagent-driven-development`
|
|
117
|
+
Group tasks into **waves** so the executor can parallelize independent work (see `subagent-driven-development` wave loop). A wave is a maximal set of tasks that (a) have no ordering dependency on each other, (b) own **pairwise-disjoint files**, and (c) contend on **no shared mutable runtime resource** (same DB/schema, port, fixture file, external service, shared temp path).
|
|
112
118
|
|
|
113
|
-
- Group independent tasks into the same wave by default.
|
|
114
|
-
-
|
|
119
|
+
- Group independent tasks into the same wave by default.
|
|
120
|
+
- Group a pure dependency chain into one task per wave.
|
|
115
121
|
- Each wave after the first states its dependency on prior waves.
|
|
116
122
|
|
|
117
123
|
**File-ownership contract.** See [reference/plan-contract.md § Files](reference/plan-contract.md).
|
|
118
124
|
|
|
119
125
|
**Test contract.** Every task that creates or modifies code declares a `Test:` path and an executable `**Tests:**` command anchored to it (grammar: [reference/plan-contract.md § Tests](reference/plan-contract.md)); `- none: <category>` only when no tests apply. Anchoring is presence, not coverage. When the anchored spec names the thing under test, the task carries `- via:` naming it; a fixture path the spec names goes under `Create:`. Prefer the existing test file for the behavior as `Test:`; a new test file is declared as both `Create:` and `Test:`.
|
|
120
126
|
|
|
121
|
-
**Runtime-resource disjointness.** File-disjoint is necessary but not sufficient: two tasks with disjoint files that both mutate the same DB, bind the same port, or share a fixture are **not** parallel-safe and must land in different waves.
|
|
127
|
+
**Runtime-resource disjointness.** File-disjoint is necessary but not sufficient: two tasks with disjoint files that both mutate the same DB, bind the same port, or share a fixture are **not** parallel-safe and must land in different waves. Use this grouping as the parallel-safety guarantee for every multi-task wave. No new mandatory per-task syntax; when a shared runtime resource is the reason two file-disjoint tasks sit in different waves, record it in an inline note on the later wave.
|
|
122
128
|
|
|
123
129
|
**Doc tasks.** Doc updates are real plan tasks, not an afterthought. Task-local docs (a doc that only describes the file(s) a task already touches) ride with that task. Cross-cutting or index docs (README, `AGENTS.md`, topic guides, taxonomy indexes) sequence into a dedicated trailing doc-only wave — last wave by convention, file-disjoint from every code task so the pairwise-disjoint wave contract holds.
|
|
124
130
|
|
|
125
|
-
**Doc-wave collision rule.** Amend-over-create (see `brainstorming/reference/documentation-impact.md`) concentrates edits into hub docs like README and `AGENTS.md`.
|
|
131
|
+
**Doc-wave collision rule.** Amend-over-create (see `brainstorming/reference/documentation-impact.md`) concentrates edits into hub docs like README and `AGENTS.md`. Run a multi-task doc wave's tasks concurrently with pairwise-disjoint files; merge doc tasks that land on the *same* file into one task rather than splitting. A single-task trailing doc wave is the expected shape, not a smell.
|
|
126
132
|
|
|
127
133
|
```markdown
|
|
128
134
|
## Wave 1 — Foundations
|
|
129
135
|
|
|
130
|
-
Parallel-safe: Tasks 1–3 own disjoint files (see each task's Files block).
|
|
131
|
-
|
|
132
136
|
### Task 1: ...
|
|
133
137
|
### Task 2: ...
|
|
134
138
|
### Task 3: ...
|
|
135
139
|
|
|
136
140
|
## Wave 2 — Wire-up
|
|
137
141
|
|
|
138
|
-
Solo: Task 4 depends on Wave 1 Task 1's API (named-blocker justification).
|
|
139
|
-
|
|
140
142
|
Depends on Wave 1: Task 4 consumes the API introduced by Task 1.
|
|
141
143
|
|
|
142
144
|
### Task 4: ...
|
|
@@ -196,6 +198,7 @@ Each task uses `- [ ]` checkbox steps so execution tools (and humans) can track
|
|
|
196
198
|
|
|
197
199
|
**Tests:**
|
|
198
200
|
- `uv run pytest tests/exact/path/to/test.py`
|
|
201
|
+
- baseline: abc1234 pass
|
|
199
202
|
- via: `function()`
|
|
200
203
|
|
|
201
204
|
- [ ] **Step 1: Write the failing test**
|
|
@@ -240,7 +243,7 @@ Each task uses `- [ ]` checkbox steps so execution tools (and humans) can track
|
|
|
240
243
|
|
|
241
244
|
Every code task carries this step (red -> green -> fmt/lint -> commit). Doc-only tasks omit it unless the project formats Markdown.
|
|
242
245
|
|
|
243
|
-
|
|
246
|
+
Use bare `git` in task commit steps: the orchestrator commits each wave after code review accepts; a task's own commit step runs inside its nested worktree and is captured as its patch.
|
|
244
247
|
|
|
245
248
|
**Anchor rules.** See [reference/plan-contract.md § Spec anchors](reference/plan-contract.md). A task with no anchorable requirement omits the `**Spec:**` line and carries a mechanical-task row in `## Spec coverage` — silence is never valid.
|
|
246
249
|
|
|
@@ -270,14 +273,34 @@ If a decision is genuinely open, put it in an explicit **Open Questions** sectio
|
|
|
270
273
|
|
|
271
274
|
## Self-Review (Before Handoff)
|
|
272
275
|
|
|
273
|
-
The plan-writer runs
|
|
276
|
+
The plan-writer runs Baseline, the deterministic checker, then the judgment checks before replying.
|
|
277
|
+
|
|
278
|
+
- **Baseline.** Execute the numbered procedure below for task `Tests:` commands only; leave header `**Verification:**` to verify. Never author baseline evidence without execution.
|
|
279
|
+
1. Read provenance: `BASE=$(git -C "<abs worktree path>" rev-parse --short HEAD)` and `git -C "<abs worktree path>" status --porcelain --untracked-files=all`. Match every `XY <path>` entry (including `??`) against the worktree-relative plan and spec paths, plus only the parent-supplied `In-flight:` paths on an `Amend:` re-dispatch; never infer that set. Also allow untracked paths already recorded in existing baseline bullets' ` - artifacts:` suffixes in the plan at the plan path, excluding every plan `Create:` or `Test:` path. Keep those suffixes on retained bullets. Any other entry blocks all commands: collect `- Baseline: worktree dirty on <BASE>: <paths>`. Allowed in-flight paths outside the spec and plan directories are source edits: collect `- Baseline: in-flight source edits on <BASE>: <paths>` and run nothing. Allow doc-only workflow edits. For plain jj (no `.git`, VCS kind `jj`), use `BASE=$(jj -R "<abs worktree path>" log -r @- --no-graph -T 'commit_id.short()')` and `jj -R "<abs worktree path>" diff --summary`; classify one-letter status and relative paths identically (`A` includes new files). Never revert or clean anything.
|
|
280
|
+
2. On Findings/Amend, retain a bullet only for unchanged command text on the same base; rerun commands with missing/invalid bullets, changed text, or different recorded SHA. `Findings: rerun baseline` reruns all commands. Never rewrite recorded SHAs without execution. For each command, split on the contract's separators (`&&`, `||`, `;`, `|`) and classify anchor tokens (a `Test:` path alone or with `::`/`#`/`:` filters) and selectors independently:
|
|
281
|
+
|
|
282
|
+
| Command anchors/selectors | Baseline action |
|
|
283
|
+
|---|---|
|
|
284
|
+
| Every anchor in every segment is a `Create:` path of some task | Append `- baseline: <BASE> skipped - <path>[, <path>] created by this task`, one path per created anchor. Only all-created anchors skip. |
|
|
285
|
+
| No segment has a created anchor or introduced selector | Run `(cd "<abs worktree path>" && <command>)` unchanged. |
|
|
286
|
+
| Mixed anchors or introduced selectors | Derive per segment: drop each created-anchor token; strip an introduced attached filter to its path; drop an introduced flag selector and its value. Drop a segment with no existing `Test:` anchor of this task. Join surviving segments with their original separators. Keep at least one segment, each anchored to an existing `Test:` path of this task and no `Create:` path; otherwise skip only for all-created anchors as above. Run the derived base command. |
|
|
274
287
|
|
|
275
|
-
|
|
288
|
+
An introduced selector is an attached filter or flag/value pair (`-k <expr>`, `-t <name>`, `-e <name>`, `-n <name>`, `--grep <name>`, `--test-name-pattern <name>`) whose filter/name appears verbatim in a test name the task's steps say they add. Keep selectors the steps do not name and run unchanged. Pass requires exit 0 and a runner summary reporting at least one test executed. Append `- baseline: <BASE> pass` for unchanged runs or `- baseline: <BASE> pass via `<base command>`` for derived runs. Treat non-zero exits, host allowlist/runtime errors, and exit-0 summaries with zero tests as failures; collect task, original command, exit code, summary and last 20 output lines, plus the derived command when used. Record a zero-test result as `exit <n>, no tests ran`, never a harmless skip. `- none:` tasks get no baseline.
|
|
289
|
+
3. After each run reread status and BASE with step 1's commands. New tracked status outside the allowed set, a new `??` (jj `A`) at any plan `Create:` or `Test:` path, or moved BASE contaminates the run: collect the task, original command and `dirtied tracked source: <paths>` or `HEAD moved to <sha>`; stop further runs and record every unrun command. Any other new untracked entry is a disposable generated artifact: keep the result and append ` - artifacts: <path>[, <path>]` to its `pass` or `pass via` bullet. For each rerun (changed command text, missing/invalid bullet, different base, or `Findings: rerun baseline`), carry its recorded artifact paths still present as untracked onto the replacement bullet's ` - artifacts:` suffix, merged with new untracked entries from that run and excluding every plan `Create:` or `Test:` path. Record artifacts, never delete them. Do not give a contaminated command a passing bullet.
|
|
290
|
+
4. Regenerate every baseline-form Open Questions row from this pass's collection; resolved rows disappear and `blocked:` lines are recomputed. Preserve unresolved contract rows until Findings answers them. Put `## Open Questions` at the top when any rows remain; omit it otherwise. Use these exact forms:
|
|
291
|
+
|
|
292
|
+
- Failure: `- Task N: `<command>` fails on <BASE> (exit <n>): <one-line result summary>`, quoting the original Tests command. Indent a `ran: `<base command>`` continuation for a derived run, then a fenced block containing the last 20 output lines (or all output when shorter).
|
|
293
|
+
- Contamination: `- Task N: `<command>` dirtied tracked source on <BASE>: <paths>` or `- Task N: `<command>` moved HEAD to <sha>`.
|
|
294
|
+
- Global: `- Baseline: worktree dirty on <BASE>: <paths>` or `- Baseline: in-flight source edits on <BASE>: <paths>`.
|
|
295
|
+
- Under each contamination/global row indent `blocked: Task M `<command>`` for every command it blocked. Keep failure output verbatim, including `TODO` or `etc.` inside valid continuation fences; only those evidence fences are exempt from placeholder scanning.
|
|
296
|
+
|
|
297
|
+
With substantive rows remaining reply `OPEN QUESTIONS <abs plan path>` immediately; do not spend repair rounds on them.
|
|
298
|
+
- **Deterministic checker.** Run `plan_check({ planPath: "<abs plan path>" })` on the saved plan. Repair every `baseline-line` finding (missing, malformed, misplaced, invalid skipped/pass via or differing SHAs) and substantive baseline `open-questions` finding only through Baseline, never by authoring `pass`/`skipped` evidence or deleting/rewording a row. Normalize `## Open Questions malformed` into `- ` rows without changing substantive text. Fix every other finding yourself and rerun. With substantive rows remaining, reply `OPEN QUESTIONS <abs plan path>` without a passing check. Apply the 3-round budget only to ordinary findings: convert a finding surviving 3 rounds to an Open Questions row and stop. A child pass validates; the parent's call writes the execution stamp. Omit an empty questions section and reply `PLAN WRITTEN <abs plan path>` after all checks pass. Findings are defined in [reference/plan-contract.md](reference/plan-contract.md).
|
|
299
|
+
- **Contract decisions.** For every task crossing a boundary the spec leaves unsettled (a host-forwarded value, a caller's error type), derive the decision from code, the harness contract, or a sibling task. State `Decision: <what> - <caller/contract/sibling task cited>` in the task text. Ask only when the spec is silent or wrong and no source settles it; put that unresolved contract in Open Questions. Add no per-task `Decisions:` field.
|
|
276
300
|
- **Code-vs-anchor sanity.** For each task-owned requirement row, re-read the anchored spec lines and confirm the owner tasks' bodies do what they say - mechanism present, not just the quoted literal. For each `Verification` row, confirm the header command exercises the anchored requirement. Fix the task, don't annotate.
|
|
277
301
|
- **Type / API consistency.** Function signatures and field names that appear in multiple tasks must match exactly. The plan is its own contract — internal contradictions surface as bugs during execution.
|
|
278
302
|
- **Test contract.** Every code task's `Tests:` commands are anchored to its `Test:` path(s); `none:` only where no tests apply; a spec-named seam appears as `via:`, a spec-named fixture path as `Create:`. Prefer the existing test file for the behavior as `Test:`; a new test file is declared as both `Create:` and `Test:`.
|
|
279
303
|
- **Runtime-resource disjointness.** For every multi-task wave, confirm no two tasks contend on a shared mutable runtime resource (DB/schema, port, fixture, external service, shared temp path) — `Files:` overlap is checked mechanically, resource contention is not. Contention = mis-grouped wave; split or re-order before handoff.
|
|
280
|
-
- **Solo-reason validity.** Every single-task wave's `Solo:` line (presence is checked mechanically) must name its specific blocker — the blocking task/wave, the contended resource, or `lone remaining task`. Category-only justifications are under-justified; merge or justify before handoff.
|
|
281
304
|
- **Waiver authorization.** `waived: <reason>` is only for requirements the spec marks out of scope **and** that exclude work from the change. A requirement whose text carries an inline code span (`` `literal` ``) names concrete behaviour and is never waivable - it maps to a task or `Verification`. A waiver on an in-scope normative requirement is a Self-Review failure — there is no human plan-review gate to catch it downstream.
|
|
282
305
|
- **Verification-ownership authorization.** `Verification` on a requirement no header command exercises is a Self-Review failure.
|
|
283
306
|
- **Documentation-impact mapping.** Each Documentation impact entry maps to a plan task (or explicit "none").
|
|
@@ -304,11 +327,6 @@ phase_tracker({ action: "complete", phase: "plan" })
|
|
|
304
327
|
plan_tracker({ action: "init", tasks: ["W1: <title>", "W1: <title>", "W2: <title>"] })
|
|
305
328
|
```
|
|
306
329
|
|
|
307
|
-
Then auto-select the execution mode and proceed — no pause, no picker. The mode is a pure function of the plan's wave structure:
|
|
308
|
-
|
|
309
|
-
- **If any wave contains ≥2 tasks → Parallel-Wave Mode.** The strengthened Wave Grouping contract (files + runtime-resource disjoint) guarantees every multi-task wave is parallel-safe.
|
|
310
|
-
- **Otherwise (pure dependency chain, one task per wave) → Sequential Mode.**
|
|
311
|
-
|
|
312
330
|
Auto-invoke `/skill:subagent-driven-development` in this session. Do not wait for confirmation — the spec gate already happened, and the plan is a mechanical derivative. The only pauses from here are in-flight STOPs (`BLOCKED` / `NEEDS_CONTEXT`) and the end gate, both owned by the executor.
|
|
313
331
|
|
|
314
332
|
## Red Flags — STOP
|
|
@@ -20,18 +20,24 @@ A wave is a maximal set of tasks that have no ordering dependency on each other,
|
|
|
20
20
|
|
|
21
21
|
## Tests (`tests-block`)
|
|
22
22
|
|
|
23
|
-
Every `### Task N` carries a `**Tests:**` block: the bare line `**Tests:**` directly after the last `Files:` entry (blank lines allowed).
|
|
23
|
+
Every `### Task N` carries a `**Tests:**` block: the bare line `**Tests:**` directly after the last `Files:` entry (blank lines allowed). Use command groups or the no-tests form:
|
|
24
24
|
|
|
25
|
-
- `- ` + backtick + command + backtick - one scoped test command; `- via: <entry point>`
|
|
25
|
+
- `- ` + backtick + command + backtick - one scoped test command; directly after it exactly one `- baseline:` bullet, then zero or more `- via: <entry point>` bullets naming the seam tests call (function, route, CLI, module).
|
|
26
26
|
- `- none: <category>` - the task runs no tests; `<category>` is free text derived from the project (docs, config, fixtures, generated assets, ...); exactly one, and no `- Test:` path in `Files:`
|
|
27
27
|
|
|
28
28
|
Absence is never valid. A `- [ ]` step or any non-bullet line ends the block. `via:` and `none:` are unchecked beyond form.
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
Baseline forms (`baseline-line`): `- baseline: <sha> pass`, `- baseline: <sha> pass via `<base command>`` (both allow ` - artifacts: <path>[, <path>]`), or `- baseline: <sha> skipped - <path>[, <path>] created by this task`. Use 7-40 lowercase hex characters for `<sha>`; every baseline SHA in the plan must match. Never put a baseline under `none:`. `skipped` is valid only when every command anchor is a listed `Create:` path and every listed path is one of those anchors. Every segment of a `pass via` base command must anchor an existing `Test:` path of the task and no `Create:` path. Obtain evidence through writing-plans Self-Review Baseline, never by editing evidence to satisfy a finding.
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Commands are written repo-relative and run in the worktree via `(cd "<abs worktree path>" && <command>)` - the checker never runs them; Baseline and the executor do. Each command is split into segments on `&&`, `||`, `;`, `|`; every segment must contain, as a whitespace-delimited token, a `Test:` path of the same task (the path alone, or followed by `::`, `#`, or `:` and a filter). A `Test:` value containing `*`, `?`, `[` or ending in `/` never anchors; any other argument token with those shapes is a broadening selector and fails. `cd `, `sh -c`, `bash -c`, `eval `, `$(` are unsupported. Each `Test:` path must exist or be a `Create:` path of some task. A segment equal to a header `**Verification:**` or `**Happy path:**` segment is a full-suite command and fails. Runners with no file-addressable form are out of scope (`go test ./pkg -run X`, `mvn -Dtest=`).
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
## Open Questions (`open-questions`)
|
|
35
|
+
|
|
36
|
+
Bound the section from `## Open Questions` to the next `## ` heading or EOF. Use `- ` rows with indented continuations (`ran:`, `blocked:`, fenced output). The empty sentinel is exactly one line `- none`; an absent section also passes. Every substantive row produces one finding quoting its first line. Prose and tables are malformed: normalize them to rows without changing substantive content.
|
|
37
|
+
|
|
38
|
+
Baseline failure: `- Task N: `<command>` fails on <sha> (exit <n>): <summary>`. Derived runs add an indented `ran: `<base command>``; fence the last 20 output lines below it. Contamination: `- Task N: `<command>` dirtied tracked source on <sha>: <paths>` or `- Task N: `<command>` moved HEAD to <sha>`. Global rows: `- Baseline: worktree dirty on <sha>: <paths>` and `- Baseline: in-flight source edits on <sha>: <paths>`. Add indented `blocked: Task M `<command>`` continuations for every command each contamination/global row blocked. Baseline regenerates these rows; contract rows remain until answered.
|
|
39
|
+
|
|
40
|
+
Only fenced output continuing a well-formed row is exempt from `placeholder-scan` (verbatim tails can contain `TODO` or `etc.`). Row first lines, `ran:`/`blocked:` and authored task prose remain scanned.
|
|
35
41
|
|
|
36
42
|
## Header-only entrypoint (`header-entrypoint`)
|
|
37
43
|
|