@gobing-ai/spur 0.3.51 → 0.3.52

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.
@@ -12,10 +12,12 @@ Task bodies are edited section-by-section through `spur task update --section <n
12
12
  replaced wholesale from the file you point at. There is no inline-body flag — always stage the new
13
13
  body in a file first.
14
14
 
15
- For **pipeline output** (`Testing` / `Review` / safety-net `Solution`), prefer `spur task record`
16
- over hand-assembling files it renders the matrix-compliant tables from a verify verdict for you.
17
- Use the manual recipe below for `Plan`, `Acceptance Criteria`, hand-authored `Solution`, and any
18
- narrative section.
15
+ For **pipeline output**, section authorship is one-writer-per-section (F92 0593 R1):
16
+ `Testing` comes from `spur task record` (deterministic, from a verify verdict artifact — the
17
+ matrix-compliant tables are rendered for you); `Review` is authored by the review coordinator
18
+ (`/sp:dev-review`), with `record` backfilling it only when bare; `Solution` is authored by the
19
+ implement step (record safety-nets a bare `Solution` from the diff). Use the manual recipe below
20
+ for `Plan`, `Acceptance Criteria`, hand-authored `Solution`, and any narrative section.
19
21
 
20
22
  ## The recipe
21
23
 
@@ -47,16 +49,19 @@ exactly: `Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `
47
49
 
48
50
  ## `record` vs. hand-editing
49
51
 
50
- `spur task record 0040 --transition testing` reads `.spur/run/0040-verdict.json` and writes both
51
- `Testing` (per-requirement table) and `Review` (P1–P4 findings table) in the matrix-required shape,
52
- optionally backfilling a bare `Solution` from `git diff -U0`. It never transitions to `done`.
52
+ `spur task record 0040 --transition testing` reads `.spur/run/0040-verdict.json`, writes
53
+ `Testing` (per-requirement table), and backfills `Review` (P1–P4 findings table) **only when the
54
+ section is bare** a standalone compatibility fallback, never an overwrite of the review
55
+ coordinator's authored Review — optionally backfilling a bare `Solution` from `git diff -U0`. It
56
+ never transitions to `done`.
53
57
 
54
- - **Use `record`** when a verify step produced a verdict artifact — it is the pipeline's record step.
58
+ - **Use `record`** when a verify step produced a verdict artifact — it is the pipeline's record step
59
+ and the deterministic `Testing` writer.
55
60
  - **Use `update --section`** when you are authoring a section by hand (planning, design, narrative
56
61
  solution) or amending one `record` already wrote.
57
62
 
58
- The two are interchangeable on the same section: `record` writes `Review`, a later
59
- `update --section Review` overwrites it. Both go through the same file-wins atomic write.
63
+ `record` writes `Testing` unconditionally and `Review` only when bare; a later
64
+ `update --section` overwrites either (file-wins). Both go through the same file-wins atomic write.
60
65
 
61
66
  ## Which section, when
62
67
 
@@ -68,9 +73,13 @@ LLM's job (orchestrated by `sp:spur-dev`); this skill only owns the *mechanism*:
68
73
  | `Background` | at create (derived from feature `Goal` if `--feature`) | why this task exists |
69
74
  | `Acceptance Criteria` | planning (present at `todo` for spec'd tasks) | the scenarios this task satisfies (matched to feature AC by title) |
70
75
  | `Plan` | before `wip` | the step list |
71
- | `Solution` | during impl (first appears at `wip`) | the approach actually taken; L3 `file:line` rule fires once it has real content |
72
- | `Testing` | testing phase (via `record`) | what was verified and how — gated at `wip→testing` by `check` |
73
- | `Review` | review phase (via `record`) | SECU findings + verdict — gated at `testing→done` by `check --strict-core` |
76
+ | `Solution` | during impl (implement step) | the approach actually taken; L3 `file:line` rule fires once it has real content |
77
+ | `Testing` | testing phase (`record` — deterministic writer) | what was verified and how — gated at `wip→testing` by `check` |
78
+ | `Review` | review phase (`/sp:dev-review` coordinator) | merged SECU findings + verdict — gated at `testing→done` by `check --strict-core` |
79
+
80
+ Section presence per status is a **runtime contract**, not a table: query
81
+ `spur task sections <wbs> list --json` (permitted present sections) and `spur task check <wbs> --json`
82
+ (required sections at the current status) before writing.
74
83
 
75
84
  A spec'd task (`--feature` link or batch item with `background`/`requirements`) is created at `todo`
76
85
  with Acceptance Criteria + Plan scaffolding present; a bare capture is created at `backlog` with
@@ -35,8 +35,9 @@ and its scaffold body. **Default:** `feature-impl` when `--feature` is given, el
35
35
  unknown variant is exit `2`.
36
36
 
37
37
  **Creation status** follows the matrix: a spec'd task (a `--feature` link, or a batch item with
38
- `background`/`requirements`) is created at **`todo`** ("ready to execute"); a bare capture is created
39
- at **`backlog`** ("still preparing"). `Solution` first appears at `wip`.
38
+ `background`/`requirements`) is created at **`todo`**; a bare capture is created at
39
+ **`backlog`** ("still preparing"). Which sections a status carries is a runtime contract — query
40
+ `spur task sections <wbs> list --json` or `spur task check <wbs> --json`; do not restate the matrix.
40
41
 
41
42
  ## `show <wbs>` / `list`
42
43
 
@@ -50,8 +51,10 @@ Multi-mode. Status and `--section` are **mutually exclusive**; `--feature`/`--pr
50
51
  frontmatter scalar.
51
52
 
52
53
  - **Status** (positional): legal transition over `backlog → todo → wip → testing → blocked → done →
53
- cancelled`. Two transitions run a `check` guard (§7.5): `wip→testing` → `spur task check <wbs>`;
54
- `testing→done` → `spur task check <wbs> --strict-core`. A failing gate blocks the transition.
54
+ cancelled`. Two transitions run a target-aware `check` guard (§7.5): `wip→testing` →
55
+ `spur task check <wbs> --as testing`; `testing→done` → `spur task check <wbs> --as done`
56
+ (F92 R3 — each evaluates the transition target, so `testing→done` checks the `done` row).
57
+ A failing gate blocks the transition.
55
58
  - **`--no-lifecycle`**: suppress lifecycle workflow *run record* creation (use inside pipeline runs
56
59
  to avoid orphaned nested lifecycle runs). **It is not a guard bypass** — the `wip→testing` and
57
60
  `testing→done` `check` gates above still run; the CLI evaluates them inline when the FSM guard
@@ -127,8 +130,9 @@ in `sp:spur-dev`.
127
130
 
128
131
  ## `record <wbs>`
129
132
 
130
- Write `Testing` + `Review` from a verify verdict, with optional `Solution` backfill and a lifecycle
131
- transition. Collapses the pipeline's record step to one call.
133
+ Write `Testing` from a verify verdict artifact the **deterministic Testing writer** (F92 0593 R1) —
134
+ with a **bare-only `Review` backfill** (never overwrites authored Review), optional `Solution`
135
+ backfill, and a lifecycle transition. Collapses the pipeline's record step to one call.
132
136
 
133
137
  | Flag | Effect |
134
138
  | ---- | ------ |
@@ -149,9 +153,11 @@ transition. Collapses the pipeline's record step to one call.
149
153
 
150
154
  - `verdict`: `PASS` | `PARTIAL` | `FAIL` | `UNKNOWN`. A missing/malformed/empty file degrades to
151
155
  `UNKNOWN` (empty arrays) — `record` never throws.
152
- - `requirements[]` → the `Testing` per-requirement table. `checks[]` → the `Review` P1–P4 findings
153
- table. With no requirements/checks, each renders exactly one "none recorded" row (a clean verify is
154
- a valid outcome; the matrix requires a table, not an empty section).
156
+ - `requirements[]` → the `Testing` per-requirement table (deterministic transcript).
157
+ - `checks[]` the P1–P4 findings table used for the **bare-only `Review` backfill** the done-gate's
158
+ `## Review` L3 layer is satisfied by the `review` coordinator's authored table; `record` writes the
159
+ fallback shape only when the section is bare. With no requirements/checks, each renders exactly one
160
+ "none recorded" row (a clean verify is a valid outcome; the matrix requires a table, not an empty section).
155
161
  - `--solution-from-diff` parses `+++ b/<path>` + `@@ +new @@` hunk headers into sorted, unique
156
162
  `` `file:line` `` rows; falls back to `--name-only` at `:1` when there are no hunk lines.
157
163
 
@@ -162,7 +168,12 @@ traceability. Bare = whole corpus; with a WBS = one task. The matrix is loaded f
162
168
  `.spur/tasks/section-matrix.yaml`.
163
169
 
164
170
  - **`--strict`** elevates *all* warnings to failures.
165
- - **`--strict-core`** is the `testing→done` gate variant: fails only on **hard-core errors**
171
+ - **`--as <status>`** evaluates the task as if it were already in `<status>` (F92 R2 the lifecycle
172
+ guards pass the transition target). Validated against canonical task statuses; mutually exclusive
173
+ with `--corpus`. Omitted `--as` uses current-status diagnostics.
174
+ - **`--strict-core`** is a **temporary compatibility alias** (F92 R2), retained so installed
175
+ plugins/workflows that call it keep working; target-state selection (`--as`) supplies the real
176
+ done semantics. Fails only on **hard-core errors** —
166
177
  Solution `file:line`, Review P1–P4, and `gate:true` required-section misses — *without* the blanket
167
178
  warning elevation.
168
179
 
@@ -354,7 +365,7 @@ spur task refresh-roster <wbs> [--folder] [--json]
354
365
  spur task batch-create --file <path> [--folder] [--json]
355
366
  spur task record <wbs> [--verdict-file <p>] [--solution-from-diff] [--transition <s>] [--folder] [--json]
356
367
  spur task verdict <wbs> [--from-answer <p>] [--folder] [--json]
357
- spur task check [wbs] [--strict] [--strict-core] [--folder] [--json]
368
+ spur task check [wbs] [--strict] [--as <status>] [--strict-core] [--folder] [--json]
358
369
  spur task resolve <file-path> [--strict] [--folder] [--json]
359
370
  spur task path <wbs> [--folder] [--json]
360
371
  spur task run-link <wbs> [--source <src>] [--run-id <id>] [--json]
@@ -49,9 +49,9 @@ re-reading or re-tokenizing the task.
49
49
  | `migrate-anchors` | Qualify in-repo evidence anchors to repo-relative paths (0583 R1–R3) | `--dry-run` `--json` |
50
50
  | `refresh-roster <wbs>` | Regenerate a parent task's sub-task roster block in `## Plan` | `--folder` `--json` |
51
51
  | `batch-create` | Create many tasks from a validated JSON array | `--file <path>` `--folder` `--json` |
52
- | `record <wbs>` | Write Testing/Review from a verify verdict; optional Solution + transition | `--verdict-file <path>` `--solution-from-diff` `--transition <status>` `--folder` `--json` |
52
+ | `record <wbs>` | Write `Testing` from a verify verdict (deterministic); bare-`## Review` fallback only; optional Solution + transition | `--verdict-file <path>` `--solution-from-diff` `--transition <status>` `--folder` `--json` |
53
53
  | `verdict <wbs>` | Derive PASS/PARTIAL/FAIL/UNKNOWN from verify answer text → verdict JSON; see [answer-file shape](tasks/verbs.md#answer-file-shape-what---from-answer-parses) | `--from-answer <path>` `--folder` `--json` |
54
- | `check [wbs]` | Four-layer validation; the readiness matrix | `--strict` `--strict-core` `--folder` `--json` |
54
+ | `check [wbs]` | Four-layer validation; the readiness matrix | `--strict` `--as <status>` `--strict-core` `--folder` `--json` |
55
55
  | `resolve <file-path>` | Map a file path to its owning task WBS | `--strict` `--folder` `--json` |
56
56
  | `path <wbs>` | Map a WBS to its absolute task file path (inverse of `resolve`) | `--folder` `--json` |
57
57
  | `run-link <wbs>` | Record pipeline run provenance link for task | `--source <src>` `--run-id <id>` `--json` |
@@ -120,7 +120,8 @@ spur task update 0040 wip
120
120
 
121
121
  Valid statuses: `backlog · todo · wip · testing · blocked · done · cancelled` (the lifecycle engine
122
122
  enforces legal transitions). Two transitions are **guarded by `check`**: `wip→testing` runs
123
- `spur task check <wbs>`, and `testing→done` runs `spur task check <wbs> --strict-core` — a failing
123
+ `spur task check <wbs> --as testing`, and `testing→done` runs `spur task check <wbs> --as done`
124
+ (F92 R3 — target-aware guards) — a failing
124
125
  gate blocks the transition (§7.5).
125
126
 
126
127
  **`--no-lifecycle`** suppresses lifecycle workflow *run record* creation (use during pipeline-driven
@@ -166,12 +167,14 @@ spur task update 0040 --priority P1
166
167
  The section-write-then-replace pattern is the workflow agents use to fill in `Plan` / `Solution` /
167
168
  `Testing` / `Review` during a run. See
168
169
  [tasks/section-editing.md](tasks/section-editing.md) for the full recipe. For pipeline
169
- output specifically, prefer **`record`** (below) over hand-assembling Testing/Review files.
170
+ output specifically, prefer **`record`** for `Testing` (below) over hand-assembling section files; `Review` is authored by the review coordinator (`/sp:dev-review`), not hand-filled.
170
171
 
171
172
  ## Recording pipeline results — `record`
172
173
 
173
- `spur task record <wbs>` writes the `Testing` and `Review` sections **from a verify verdict**, so the
174
- pipeline's record step is one CLI call instead of awk/sed/jq plumbing:
174
+ `spur task record <wbs>` writes the `Testing` section **from a verify verdict artifact** (the
175
+ deterministic Testing writer F92 0593 R1) and backfills `Review` **only when the section is
176
+ bare** (standalone compatibility fallback; never overwrites authored Review), so the pipeline's
177
+ record step is one CLI call instead of awk/sed/jq plumbing:
175
178
 
176
179
  ```bash
177
180
  spur task record 0040 --transition testing
@@ -179,8 +182,8 @@ spur task record 0040 --verdict-file .spur/run/0040-verdict.json --solution-from
179
182
  ```
180
183
 
181
184
  - Reads the verdict JSON (default `.spur/run/<wbs>-verdict.json`); renders `Testing` as a
182
- per-requirement table and `Review` as a P1–P4 findings table. A missing/malformed verdict degrades
183
- to an `UNKNOWN` verdict — it never throws.
185
+ per-requirement table and, when the `Review` section is bare, backfills a P1–P4 findings table.
186
+ A missing/malformed verdict degrades to an `UNKNOWN` verdict — it never throws.
184
187
  - **`--solution-from-diff`** backfills `Solution` from `git diff -U0` hunk headers **only when the
185
188
  Solution section is still bare** — a safety net, not an overwrite.
186
189
  - **`--transition <status>`** optionally advances the lifecycle after writing (e.g. `testing`).
@@ -235,7 +238,8 @@ corpus, or with a WBS for one task:
235
238
  spur task check --json # whole corpus
236
239
  spur task check 0040 --json # one task
237
240
  spur task check --strict --json # elevate ALL warnings to failures
238
- spur task check 0040 --strict-core # the testing→done gate variant
241
+ spur task check 0040 --as done # evaluate as the done row (lifecycle target, F92 R2)
242
+ spur task check 0040 --strict-core # temporary compatibility alias
239
243
  ```
240
244
 
241
245
  **Folder resolution (task 0522):** a WBS-targeted check (`<wbs>` present, no `--folder`) resolves
@@ -253,7 +257,9 @@ or "are there orphaned scenarios?" rather than reading task files and re-impleme
253
257
  The two flags are distinct gate profiles:
254
258
 
255
259
  - **`--strict`** elevates *all* warnings to failures (the strictest reading).
256
- - **`--strict-core`** fails only on hard-core errors Solution `file:line`, Review P1–P4, and
260
+ - **`--as <status>`** evaluates the task as if it were already in `<status>` (F92 R2); the lifecycle
261
+ guards pass the transition target. Validated against canonical task statuses; excluded with `--corpus`.
262
+ - **`--strict-core`** is a **temporary compatibility alias** (F92 R2). Fails only on hard-core errors — Solution `file:line`, Review P1–P4, and
257
263
  `gate:true` required-section misses — *without* the blanket elevation. This is the variant wired
258
264
  as the `testing→done` lifecycle guard.
259
265
 
@@ -122,7 +122,7 @@ reference for the half you're operating; do not duplicate its content here.
122
122
  | Continue | execution | `spur feature update` / `refresh` | [execution-workflow.md](references/execution-workflow.md) |
123
123
  | Batch run | execution | `sp:super-planner` + `spur workflow run` | [execution-batch.md](references/execution-batch.md) |
124
124
  | Parallel fan-out | execution | `sp:parallel-execution` decision framework | [execution-batch.md](references/execution-batch.md) |
125
- | All writes (both halves) | — | CLI-gated section editing | [cross-cutting.md](references/cross-cutting.md) · [section-batching.md](references/section-batching.md) |
125
+ | All writes (both halves) | — | CLI-gated section editing | [cross-cutting.md](references/cross-cutting.md) · [section-batching.md](references/section-batching.md) (one-writer protocol, F92 0593) |
126
126
 
127
127
  ## When to use
128
128
 
@@ -156,8 +156,11 @@ CLI does.
156
156
  1. **Never skip a gate.** A clean `feature check` is the only proof the AC is valid; a
157
157
  passing `batch-create` is the only proof the decomposition is well-formed. Skip either and
158
158
  you ship corrupted corpus.
159
- 2. **The pipeline, not you, writes results.** `## Testing` and `## Review` sections are
160
- filled by the pipeline's `record` step. Do not edit them directly during execution.
159
+ 2. **One writer per evidence section (F92 0593 R1).** `## Solution` is authored by the
160
+ implement step; `## Review` by the review coordinator (`/sp:dev-review`); `## Testing` by the
161
+ deterministic `record` step from the verdict artifact (`record` backfills `## Review` only when
162
+ bare — fallback-only, never an overwrite). During execution, do not hand-edit another stage's
163
+ section.
161
164
  3. **Resolve task IDs through the CLI.** Read a known WBS with `spur task show <wbs> --json`; it
162
165
  returns metadata, full content, and `filePath` across configured task folders. Use `spur task
163
166
  path <wbs> --json` only when another tool needs the absolute path. Never search `docs/tasks*` or
@@ -189,8 +192,10 @@ for "what's actually in file Y" or for resources that sit outside the step seque
189
192
  - [references/gate-checklists.md](references/gate-checklists.md) — checkbox checklists for the
190
193
  five gates (feature-check, batch-create, precheck, review, verify). Each checklist is a
191
194
  `- [ ]` list of prerequisites an agent verifies before entering the gate.
192
- - [references/section-batching.md](references/section-batching.md) — first-write protocol for
193
- staging Solution, Testing, and Review together before one task check.
195
+ - [references/section-batching.md](references/section-batching.md) — the evidence-section
196
+ **one-writer protocol** (F92 0593 R1/R2): implement owns `Solution`, the review coordinator owns
197
+ `Review`, deterministic `record` owns `Testing`; skills query `spur task sections` /
198
+ `spur task check` instead of static section tables.
194
199
  - [references/ac-style-guide.md](references/ac-style-guide.md) — BDD scenario authoring:
195
200
  R-numbering, the two AC tiers, scenario-title stability, Gherkin template usage.
196
201
  - [references/feature-link-helper.md](references/feature-link-helper.md) — opt-in,
@@ -110,17 +110,17 @@ must not be changed without updating the backing skill.
110
110
 
111
111
  - **Purpose:** Multi-dimensional code review of a task or path — (1) functional requirements traceability (WBS mode only), (2) SECUA framework (Security, Efficiency, Correctness, Usability, Architecture), (3) architecture depth.
112
112
  - **Modes:**
113
- - **WBS mode (`<wbs>`)**: Runs functional requirements traceability (`sp:functional-review`), SECUA framework (`sp:code-verification`), and architectural depth (`sp:code-improvement`). May write findings to the task's `## Review` section.
113
+ - **WBS mode (`<wbs>`)**: Runs functional requirements traceability (`sp:functional-review`), SECUA framework (`sp:code-verification`), and architectural depth (`sp:code-improvement`). The three skills return review fragments; the coordinator writes the combined `## Review` (F92 0593 R1).
114
114
  - **Path mode (`<path>`)**: Runs advisory SECUA framework (`sp:code-verification`) and architectural depth (`sp:code-improvement`). Performs no task mutation.
115
115
  - **Inputs:** `<wbs|path>` (required). Review executes inline (in-session) by default. `--agent <inline|auto|name>` selector accepted (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--focus <lens>` narrows to one SECUA dimension. Note: `--fix` and `--next` are **deprecated** (no-op with warning; route remediation to `/sp:dev-verify --fix` and progression to `/sp:dev-next`).
116
116
  - **Backing:** `sp:functional-review`, `sp:code-verification` (review mode), `sp:code-improvement`.
117
- - **Behavior:** WBS mode runs functional traceability + SECUA + architecture depth, ranking findings P1–P4 and writing findings to the task's `## Review` section. Path mode runs advisory SECUA + architecture depth with no task mutation.
117
+ - **Behavior:** WBS mode runs functional traceability + SECUA + architecture depth, ranking findings P1–P4, and hands the merged report to the review coordinator, which writes `## Review`. Component skills never write `## Review` in coordinated mode. Path mode runs advisory SECUA + architecture depth with no task mutation.
118
118
  - **Delegation:** WBS mode: `sp:functional-review` + `sp:code-verification` (review) + `sp:code-improvement`; Path mode: `sp:code-verification` (review) + `sp:code-improvement`.
119
119
 
120
120
  ### 3. verify
121
121
 
122
122
  - **Purpose:** Requirements traceability — verify a task's implementation against its acceptance criteria, producing a PASS/PARTIAL/FAIL verdict with per-requirement evidence. Optionally (with `--fix all`) evaluate **feature shippable readiness**.
123
- - **Inputs:** `<wbs>` (required). Verify executes inline (in-session) by default. `--agent <inline|auto|name>` selector accepted (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--fix`, `--focus`, `--bdd`, `--auto`, `--force` modulate the verify pass. `--next` (terminal chain link): on the **post-`--fix`** PASS verdict, transition `testing → done` through the FSM (`--strict-core` guard honored). On PARTIAL/FAIL or guard failure, stop as review-pending. **`--skip-shippable`** (alias `--skip-shipable`): disable the shippable gate that otherwise runs under `--fix all` when the task has a `feature_id`.
123
+ - **Inputs:** `<wbs>` (required). Verify executes inline (in-session) by default. `--agent <inline|auto|name>` selector accepted (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--fix`, `--focus`, `--bdd`, `--auto`, `--force` modulate the verify pass. `--next` (terminal chain link): on the **post-`--fix`** PASS verdict, transition `testing → done` through the FSM (target-aware `--as done` guard honored). On PARTIAL/FAIL or guard failure, stop as review-pending. **`--skip-shippable`** (alias `--skip-shipable`): disable the shippable gate that otherwise runs under `--fix all` when the task has a `feature_id`.
124
124
  - **Backing:** `sp:code-verification` skill, `verify` mode.
125
125
  - **Behavior:** Status guard → change-scope detection → requirements traceability → SECUA review → verdict aggregation → findings write-back → verdict-artifact emission → optional `--fix` pass → **shippable readiness** (when active). The per-task verdict gates the pipeline's `done` transition. With `--next`: the (post-`--fix`) PASS verdict → transition to `done` (FSM guard honored); PARTIAL/FAIL → stop and surface verdict. Shippable FAIL does not rewrite the task verdict line but must be printed; feature is not “ready.”
126
126
  - **Shippable readiness (default on with `--fix all`):** After the task verdict, if `--fix all` and the task has `feature_id` and not `--skip-shippable`, run `spur feature check <id> --json` + linked-task completeness. Emit `Shippable: PASS|FAIL|N/A`. FAIL when feature AC scenarios are orphaned/unverified or any linked task is not `done`/`cancelled`. SSOT procedure: `sp:code-verification` Step 13.
@@ -129,9 +129,9 @@ must not be changed without updating the backing skill.
129
129
  ### 3a. verifyall
130
130
 
131
131
  - **Purpose:** Batch verification of a set of tasks (or all tasks under a feature) against their requirements and AC. Produces per-task verdicts + a summary report with aggregate statistics (counts, table, overall batch verdict). With `--fix all`, also evaluates **feature shippable readiness** once for the set.
132
- - **Inputs:** `--tasks <selector>` (required unless `--feature`). `--feature <id>` (convenience for `--tasks feature:<id>`). Shared verify flags from `dev-verify` (`--agent <inline|auto|name>`, `--fix`, `--focus`, `--bdd`, `--auto`, `--force`, **`--skip-shippable`**). `--next` (per-task lifecycle chaining: on a PASS verdict transition `testing → done` through the FSM with `--strict-core` honored; PARTIAL/FAIL does not transition; transitions run **before** the shippable gate so `spur feature check` sees final statuses). `--json` for machine-readable summary report.
132
+ - **Inputs:** `--tasks <selector>` (required unless `--feature`). `--feature <id>` (convenience for `--tasks feature:<id>`). Shared verify flags from `dev-verify` (`--agent <inline|auto|name>`, `--fix`, `--focus`, `--bdd`, `--auto`, `--force`, **`--skip-shippable`**). `--next` (per-task lifecycle chaining: on a PASS verdict transition `testing → done` through the FSM with the target-aware `--as done` guard honored; PARTIAL/FAIL does not transition; transitions run **before** the shippable gate so `spur feature check` sees final statuses). `--json` for machine-readable summary report.
133
133
  - **Backing:** `sp:spur-dev` skill, `verifyall` operation (resolves the set using the shared selector grammar, dispatches per-task verify via `sp:code-verification` verify mode, writes per-task artifacts, aggregates and emits the batch summary report, then optional shippable gate).
134
- - **Behavior:** Resolve + freeze the set (supports `--feature` sugar). For each task: apply status guard, requirements traceability + AC + SECUA review, write `## Testing` + verdict.json (per-task fix pass under `--fix`). After the batch: **shippable gate once** when active (see below). Emit a structured summary report (markdown or `--json`). Per-task behavior matches single `dev-verify` (except shippable is batch-once). **Batch verdict rollup is deterministic** — computed by `spur task verifyall-aggregate --from-file <batch-input.json> --json` (a tested service module, not agent discretion). **Per-task outcome grammar:** `PASS` / `PARTIAL` / `FAIL` for implemented tasks; `NOT-STARTED` for tasks that have not entered implementation (status `backlog`/`todo`/`blocked` — reachable only via `--force`). **Rollup rule:** all-NOT-STARTED → `UNKNOWN`; any `FAIL` → `FAIL`; any `PARTIAL` or `UNKNOWN` → `PARTIAL`; all `PASS` → `PASS`. NOT-STARTED rows are _excluded_ from the FAIL/PARTIAL rollup (they cannot manufacture a batch failure) but are _reported explicitly_ in the summary ("N NOT-STARTED, excluded from rollup"). This closes the 0341 dogfood gap where a healthy feature with 5 PASS + 2 unstarted tasks read as FAIL. **Shippable FAIL:** treat the batch as not clean — force rollup to at least **PARTIAL** and set `"shippable": false` under `--json` even if every task outcome is PASS.
134
+ - **Behavior:** Resolve + freeze the set (supports `--feature` sugar). For each task: apply status guard, requirements traceability + AC + SECUA review, emit the verdict artifact (per-task fix pass under `--fix`). `## Testing` is written by the deterministic `record` step from the artifact (F92 0593 R1). After the batch: **shippable gate once** when active (see below). Emit a structured summary report (markdown or `--json`). Per-task behavior matches single `dev-verify` (except shippable is batch-once). **Batch verdict rollup is deterministic** — computed by `spur task verifyall-aggregate --from-file <batch-input.json> --json` (a tested service module, not agent discretion). **Per-task outcome grammar:** `PASS` / `PARTIAL` / `FAIL` for implemented tasks; `NOT-STARTED` for tasks that have not entered implementation (status `backlog`/`todo`/`blocked` — reachable only via `--force`). **Rollup rule:** all-NOT-STARTED → `UNKNOWN`; any `FAIL` → `FAIL`; any `PARTIAL` or `UNKNOWN` → `PARTIAL`; all `PASS` → `PASS`. NOT-STARTED rows are _excluded_ from the FAIL/PARTIAL rollup (they cannot manufacture a batch failure) but are _reported explicitly_ in the summary ("N NOT-STARTED, excluded from rollup"). This closes the 0341 dogfood gap where a healthy feature with 5 PASS + 2 unstarted tasks read as FAIL. **Shippable FAIL:** treat the batch as not clean — force rollup to at least **PARTIAL** and set `"shippable": false` under `--json` even if every task outcome is PASS.
135
135
  - **Shippable readiness (default on with `--fix all`):** Active when `--fix all` and feature context exists (`--feature` or unique shared `feature_id`) and not `--skip-shippable`. Procedure: `sp:code-verification` Step 13 once after all per-task legs. Without `--fix all`, do not run the hard gate (optional note: use `--fix all` for ship evaluation).
136
136
  - **Cache discipline (batch):** freeze the `spur task list --feature <id> --json` (or selector) capture once at resolve; reuse that snapshot for every per-task verify leg. Do not re-list the set mid-batch. Re-read a task body only when that task's sections changed (e.g. after a `--fix` write). Prefer re-reading only cited `file:line` anchors over re-tokenizing full Solution sections when prior Testing is already present.
137
137
  - **Dogfood / mutation composition:** prefer step-split when dogfooding verifyall with `--fix all` and/or `--next` — first observe-only verifyall, then a separate fix pass, then `--next` only if status transitions are still needed. See `sp:dogfood-testing` §step-splitting.
@@ -60,7 +60,13 @@ default. See the [inline-default execution-surface contract](cross-cutting.md#in
60
60
 
61
61
  > **Single-run & parse discipline (suite run cost control).** Run full quality/test suites (`bun run check` / `spur-check`) at most ONCE per task iteration (task 0436 R2). Parse failure details from the single retained command output rather than re-running full suites repeatedly to inspect errors. Re-run targeted/narrow test files (e.g. `bun test <file> --test-name-pattern <pattern>`) while iterating on fixes, and re-run the full suite only when all targeted fixes pass.
62
62
 
63
- ## Section ownership — `## Solution`
63
+ ## Section ownership — one writer per evidence section (F92 0593 R1)
64
+
65
+ | Section | Writer |
66
+ | --- | --- |
67
+ | `## Solution` | **implement** step (`sp:code-implementation`) |
68
+ | `## Review` | **review coordinator** (`/sp:dev-review` → `sp:super-reviewer`, merged fragments) |
69
+ | `## Testing` | **`spur task record`** (deterministic, from the verdict artifact) |
64
70
 
65
71
  The implement step **owns** `## Solution` (the change-map). After writing code, before
66
72
  yielding, the implement agent authors the `## Solution` section — a markdown table listing
@@ -163,9 +169,10 @@ The `test` hop is primarily
163
169
  resume the host driver with the operator's answer.
164
170
  - **On guard failure** (`precheck`): the task's check findings block progress — fix the
165
171
  task first.
166
- - **On completion** (`done`): the pipeline's `record` step has already written results into
167
- the task's `## Testing` and `## Review` sections via `spur task record <wbs>` (verdict
168
- matrix-compliant tables; never transitions to `done` the gate stays in the workflow).
172
+ - **On completion** (`done`): the pipeline's `record` step has already written the verdict
173
+ transcript into the task's `## Testing` via `spur task record <wbs>` (matrix-compliant tables;
174
+ `## Review` was authored by the review step and is only backfilled bare, never overwritten —
175
+ F92 0593 R1; never transitions to `done` — the gate stays in the workflow).
169
176
 
170
177
  ## `--next` chain — advance to the next step
171
178
 
@@ -93,8 +93,10 @@ Entered before `task-pipeline.yaml` `verify` state produces a task verdict.
93
93
  - [ ] `spur task check <wbs> --strict-core --json` returns PASS.
94
94
  - [ ] Every AC scenario has a corresponding verify command that exited 0.
95
95
  - [ ] The `## Solution` section is filled (not the placeholder comment).
96
- - [ ] The `## Testing` section records the commands run and their outcomes.
97
- - [ ] The `## Review` section records findings (or explicitly states "no findings").
96
+ - [ ] The `## Testing` evidence (commands run + outcomes) is present in the verdict artifact —
97
+ `spur task record` transcribes it deterministically (F92 0593 R1).
98
+ - [ ] The `## Review` section carries the review coordinator's findings table (or is bare for the
99
+ record fallback) — verify never writes `## Review`.
98
100
  - [ ] No gate was bypassed with `--no-verify`, `--force`, or a suppression comment.
99
101
  - [ ] If `--auto` is set: the verdict is `PASS` (not `PARTIAL` or `FAIL`) — `--auto` does not auto-advance a failed verify.
100
102
  - [ ] The task is ready for `spur task record <wbs>` and legal transition to `done`.
@@ -154,7 +156,7 @@ transition to `done`.
154
156
 
155
157
  > **Corpus baseline discipline (`corpus-check`).** `corpus-check` sweeps every task/feature and fails on any structural finding outside `config/corpus-baseline.json`. The baseline is two-sided: an unlisted finding fails, **and** a listed entry that no longer reproduces fails. When introducing or tightening finding rules, reconcile the fallout in the same commit (constitution **T10**).
156
158
  >
157
- > **Transition-shim discipline (`transition-shim-check`, task 0541 / ADR-058).** Wired as the last step of `spur-check` / `spur-check-new`. Two-sided against `config/transition-shims.json`: an `@transition-shim(<id>)` marker with no manifest entry fails as a **new unregistered shim**, **and** a listed entry whose marker is gone from source fails as a **stale entry**. Emptying the manifest is the definition of the agent-role transition being complete. A removal condition must be objectively checkable against the repository. Shapes: `docs/04_DESIGN.md` §2.5.
159
+ > **Transition-shim discipline (`transition-shim-check`, task 0541 / ADR-058).** Wired as an early step of `spur-check` / `spur-check-new` (second, after `link-check` and before `lint`) so a shim violation fails in ~0.3 s rather than after the test run. Two-sided against `config/transition-shims.json`: an `@transition-shim(<id>)` marker with no manifest entry fails as a **new unregistered shim**, **and** a listed entry whose marker is gone from source fails as a **stale entry**. Emptying the manifest is the definition of the agent-role transition being complete. A removal condition must be objectively checkable against the repository. Shapes: `docs/04_DESIGN.md` §2.5.
158
160
 
159
161
  > **Sandbox test baseline (`bun run test` / `spur-check`).** In the restricted Bash sandbox
160
162
  > `bun run spur-check` exits **1 regardless of code health**: ~24 tests bind real ports and the
@@ -1,24 +1,40 @@
1
1
  ---
2
- name: section-batching
3
- description: Stage pipeline task sections together, apply them through Spur, and validate once per coherent batch.
2
+ name: section-ownership
3
+ description: One writer per evidence section which stage authors Solution, Testing, and Review, and how a session sequences section writes against the runtime contract.
4
4
  see_also:
5
5
  - spur-dev
6
6
  - spur-cli
7
+ - super-reviewer
7
8
  ---
8
9
 
9
- # Section batching protocol
10
+ # Evidence-section writer protocol
10
11
 
11
- Use this protocol when an in-session operation must author multiple pipeline sections. A workflow
12
- `record` step should still prefer `spur task record` for verdict-derived `Testing` and `Review`.
12
+ There is exactly **one writer per evidence section** (feature F92, task 0593 R1). The section
13
+ matrix is the runtime authority for *which sections are permitted at a status*; this protocol is
14
+ the *who writes* map. The canonical stage registry projects the exact artifact identities
15
+ (`packages/domain/src/stage-registry/schema.ts` → `RECORDED` stage `identity` fields); skills never
16
+ restate that ownership as competing policy.
13
17
 
14
- 1. Read `spur-cli/references/tasks/l3-guard-cheatsheet.md`.
15
- 2. Run `spur task sections <wbs> list --json` to learn which sections the current matrix permits.
16
- 3. Stage complete, body-only `Solution`, `Testing`, and `Review` files before the first task check.
17
- 4. Run `spur task check <wbs> --json` once, then apply every permitted staged section with
18
- `spur task update <wbs> --section <name> --from-file <path>`.
19
- 5. Run `spur task check <wbs> --json` once after the coherent write batch.
20
- 6. If the post-write check fails, group all findings by section, repair all affected staged bodies, re-apply them, and
21
- check once more.
18
+ | Section | Writer | When |
19
+ | --- | --- | --- |
20
+ | `## Solution` | **implement** (`sp:code-implementation`) | during the implement step; bare-only safety-net backfill by `record` from `git diff` |
21
+ | `## Review` | **review coordinator** (`sp:super-reviewer` under `/sp:dev-review`) | during the review step, after merging component fragments |
22
+ | `## Testing` | **`spur task record`** (deterministic, from the verdict artifact) | during the record step; never authored by hand |
23
+
24
+ Component review skills (`sp:functional-review`, `sp:code-verification` review mode,
25
+ `sp:code-improvement`) **return review fragments only** in coordinated mode — they do not write
26
+ `## Review`. Verification emits the canonical verdict artifact; it does not write sections.
27
+ `record`'s bare-`## Review` backfill is a **standalone compatibility fallback only** — it fires
28
+ when the section is bare (absent/placeholder) and never overwrites authored Review.
29
+
30
+ ## Sequencing a write
31
+
32
+ 1. Query the runtime contract before writing — never a static table:
33
+ `spur task sections <wbs> list --json` (permitted sections at the current status) and
34
+ `spur task check <wbs> --json` (what the gate requires at the current status).
35
+ 2. Write only your stage's section, via
36
+ `spur task update <wbs> --section <name> --from-file <tmp>` (CLI-gated, body-only).
37
+ 3. Re-check once after the write batch: `spur task check <wbs> --json`.
22
38
 
23
39
  Budget: no more than two section writes per section and two task checks per task unless a new
24
40
  external failure changes the evidence. Do not use a write→check loop for each section.