@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/tasks/section-matrix.yaml +7 -2
- package/config/workflows/task-lifecycle.yaml +7 -6
- package/package.json +1 -1
- package/plugins/sp/agents/super-planner.md +3 -2
- package/plugins/sp/agents/super-reviewer.md +5 -0
- package/plugins/sp/commands/dev-review.md +1 -1
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/scripts/pr-reviewing.ts +22 -4
- package/plugins/sp/scripts/stage-registry-adapter.ts +40 -25
- package/plugins/sp/skills/code-improvement/SKILL.md +5 -3
- package/plugins/sp/skills/code-verification/SKILL.md +28 -31
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +47 -0
- package/plugins/sp/skills/functional-review/SKILL.md +16 -15
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +13 -14
- package/plugins/sp/skills/spur-cli/references/tasks/l3-guard-cheatsheet.md +7 -3
- package/plugins/sp/skills/spur-cli/references/tasks/section-editing.md +22 -13
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +22 -11
- package/plugins/sp/skills/spur-cli/references/tasks.md +16 -10
- package/plugins/sp/skills/spur-dev/SKILL.md +10 -5
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +5 -5
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +11 -4
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +5 -3
- package/plugins/sp/skills/spur-dev/references/section-batching.md +29 -13
- package/spur.js +331 -221
|
@@ -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
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
|
51
|
-
`Testing` (per-requirement table) and `Review` (P1–P4 findings table)
|
|
52
|
-
|
|
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
|
-
|
|
59
|
-
`update --section
|
|
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 (
|
|
72
|
-
| `Testing` | testing phase (
|
|
73
|
-
| `Review` | review phase (
|
|
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
|
|
39
|
-
|
|
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` →
|
|
54
|
-
`testing→done` → `spur task check <wbs> --
|
|
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`
|
|
131
|
-
|
|
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
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
- **`--
|
|
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
|
|
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
|
|
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
|
|
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`
|
|
174
|
-
|
|
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`
|
|
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 --
|
|
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
|
-
- **`--
|
|
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. **
|
|
160
|
-
|
|
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) —
|
|
193
|
-
|
|
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`).
|
|
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
|
|
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 (`--
|
|
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 `--
|
|
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,
|
|
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 —
|
|
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
|
|
167
|
-
the task's `## Testing`
|
|
168
|
-
|
|
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`
|
|
97
|
-
|
|
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
|
|
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-
|
|
3
|
-
description:
|
|
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
|
-
#
|
|
10
|
+
# Evidence-section writer protocol
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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.
|