@gobing-ai/spur 0.3.95 → 0.3.97

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.
Files changed (165) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/plugin-scripts.json +0 -54
  3. package/config/rules/boundary/sp-script-placement.yaml +19 -0
  4. package/config/rules/strict/runtime-boundaries.yaml +6 -0
  5. package/config/rules/structure/test-location.yaml +2 -0
  6. package/config/rules/typescript/no-syscall-emulation-in-boundary-mock.yaml +1 -1
  7. package/config/rules/typescript/output-boundaries.yaml +15 -2
  8. package/config/script-placement-baseline.json +51 -0
  9. package/config/templates/AGENTS.md +3 -3
  10. package/config/workflows/feature-verification.yaml +1 -1
  11. package/config/workflows/history-anatomy.yaml +23 -11
  12. package/config/workflows/idea-pipeline.yaml +80 -85
  13. package/config/workflows/pr-review.yaml +18 -9
  14. package/config/workflows/task-pipeline.yaml +42 -95
  15. package/config/workflows/wrapup-pipeline.yaml +91 -38
  16. package/package.json +2 -2
  17. package/plugins/sp/README.md +14 -10
  18. package/plugins/sp/agents/super-reviewer.md +43 -18
  19. package/plugins/sp/commands/dev-fixgha.md +83 -0
  20. package/plugins/sp/commands/dev-gitmsg.md +8 -6
  21. package/plugins/sp/commands/dev-gtd.md +2 -2
  22. package/plugins/sp/commands/dev-idea.md +22 -12
  23. package/plugins/sp/commands/dev-job-dump.md +29 -0
  24. package/plugins/sp/commands/dev-job-resume.md +29 -0
  25. package/plugins/sp/commands/dev-plan.md +8 -9
  26. package/plugins/sp/commands/dev-review.md +22 -13
  27. package/plugins/sp/commands/dev-verifyall.md +1 -1
  28. package/plugins/sp/commands/spur-init.md +2 -2
  29. package/plugins/sp/lib/history-anatomy.generated.d.mts +112 -0
  30. package/plugins/sp/lib/history-anatomy.generated.mjs +686 -0
  31. package/plugins/sp/lib/idea-handoff.generated.mjs +5 -4
  32. package/plugins/sp/lib/inline-run.generated.d.mts +11 -0
  33. package/plugins/sp/lib/inline-run.generated.mjs +39 -13
  34. package/plugins/sp/lib/quality-gate.generated.d.mts +104 -0
  35. package/plugins/sp/lib/quality-gate.generated.mjs +445 -0
  36. package/plugins/sp/lib/residual-scan.generated.d.mts +63 -0
  37. package/plugins/sp/lib/residual-scan.generated.mjs +226 -0
  38. package/plugins/sp/lib/spur-bin.ts +36 -0
  39. package/plugins/sp/lib/step-profile.generated.d.mts +71 -0
  40. package/plugins/sp/lib/step-profile.generated.mjs +174 -0
  41. package/plugins/sp/plugin.json +1 -1
  42. package/plugins/sp/references/roles.md +3 -3
  43. package/plugins/sp/scripts/feature-verification-steps.mjs +14 -1
  44. package/plugins/sp/scripts/feature-verification-steps.ts +14 -1
  45. package/plugins/sp/scripts/history-anatomy-cache.mjs +20 -19
  46. package/plugins/sp/scripts/history-anatomy-cache.ts +23 -928
  47. package/plugins/sp/scripts/inline-run-setup.mjs +85 -320
  48. package/plugins/sp/scripts/inline-run-setup.ts +104 -667
  49. package/plugins/sp/scripts/quality-gate.mjs +46 -24
  50. package/plugins/sp/scripts/quality-gate.ts +13 -659
  51. package/plugins/sp/scripts/residual-scan.mjs +179 -174
  52. package/plugins/sp/scripts/residual-scan.ts +125 -517
  53. package/plugins/sp/scripts/script-root.mjs +5 -1
  54. package/plugins/sp/scripts/script-root.ts +5 -1
  55. package/plugins/sp/scripts/workflow-step-profile.mjs +25 -17
  56. package/plugins/sp/scripts/workflow-step-profile.ts +21 -315
  57. package/plugins/sp/scripts/wrapup-drift-probe.mjs +8 -2
  58. package/plugins/sp/scripts/wrapup-drift-probe.ts +3 -2
  59. package/plugins/sp/scripts/wrapup-steps.mjs +72 -33
  60. package/plugins/sp/scripts/wrapup-steps.ts +128 -37
  61. package/plugins/sp/skills/code-improvement/SKILL.md +5 -4
  62. package/plugins/sp/skills/code-verification/SKILL.md +34 -9
  63. package/plugins/sp/skills/code-verification/references/verdict-schema.md +3 -3
  64. package/plugins/sp/skills/functional-review/SKILL.md +7 -4
  65. package/plugins/sp/skills/functional-review/references/verdict-schema.md +1 -1
  66. package/plugins/sp/skills/history-anatomy/references/modes.md +2 -1
  67. package/plugins/sp/skills/next-feature/references/handoff-routing.md +1 -1
  68. package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
  69. package/plugins/sp/skills/source-driven-development/SKILL.md +11 -0
  70. package/plugins/sp/skills/spur-cli/SKILL.md +3 -3
  71. package/plugins/sp/skills/spur-cli/references/agent.md +10 -10
  72. package/plugins/sp/skills/spur-cli/references/features.md +17 -6
  73. package/plugins/sp/skills/spur-cli/references/init.md +17 -16
  74. package/plugins/sp/skills/spur-cli/references/self.md +3 -2
  75. package/plugins/sp/skills/spur-cli/references/serve.md +10 -10
  76. package/plugins/sp/skills/spur-cli/references/tasks/section-editing.md +9 -5
  77. package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +21 -6
  78. package/plugins/sp/skills/spur-cli/references/tasks.md +14 -8
  79. package/plugins/sp/skills/spur-cli/references/workflows.md +17 -14
  80. package/plugins/sp/skills/spur-dev/SKILL.md +2 -0
  81. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +4 -3
  82. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +14 -10
  83. package/plugins/sp/skills/spur-dev/references/decision-brief.md +1 -1
  84. package/plugins/sp/skills/spur-dev/references/dev-operations.md +165 -75
  85. package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +7 -5
  86. package/plugins/sp/skills/spur-dev/references/execution-batch.md +84 -39
  87. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +8 -12
  88. package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +3 -3
  89. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +40 -21
  90. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +19 -19
  91. package/plugins/sp/skills/spur-dev/references/idea-evaluation.md +4 -3
  92. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +72 -15
  93. package/plugins/sp/skills/spur-doctor/SKILL.md +1 -1
  94. package/plugins/sp/skills/sys-architecture/SKILL.md +3 -2
  95. package/spur.js +4461 -2085
  96. package/web/_astro/{BoardApp.Cpxntzad.js → BoardApp.Bmv5WkJ9.js} +1 -1
  97. package/web/_astro/BoardApp.vveLOdDq.js +322 -0
  98. package/web/_astro/{TaskDetail.C5bW4WGV.js → TaskDetail.IKc3uDYV.js} +1 -1
  99. package/web/_astro/{arc.CyjRvNMY.js → arc.C63Ufg35.js} +1 -1
  100. package/web/_astro/{architectureDiagram-3BPJPVTR.B4lWRzJA.js → architectureDiagram-3BPJPVTR.CP8Hyldk.js} +1 -1
  101. package/web/_astro/{blockDiagram-GPEHLZMM.Be38USQ2.js → blockDiagram-GPEHLZMM.Bo_48MRA.js} +1 -1
  102. package/web/_astro/{c4Diagram-AAUBKEIU.DT9Fj5Qx.js → c4Diagram-AAUBKEIU.Ch61sw-O.js} +1 -1
  103. package/web/_astro/channel.BKCmJpWM.js +1 -0
  104. package/web/_astro/{chunk-2J33WTMH.SeSBWLg5.js → chunk-2J33WTMH.CHpzS7xf.js} +1 -1
  105. package/web/_astro/{chunk-4BX2VUAB.DoO4VE14.js → chunk-4BX2VUAB.DzMNNWIw.js} +1 -1
  106. package/web/_astro/{chunk-55IACEB6.DrmTFA53.js → chunk-55IACEB6.BqPrDw_Q.js} +1 -1
  107. package/web/_astro/{chunk-727SXJPM.Bi-TUb_V.js → chunk-727SXJPM.ZzBHhNw-.js} +1 -1
  108. package/web/_astro/{chunk-AQP2D5EJ.B-xp8Uhi.js → chunk-AQP2D5EJ.1_O_LLkx.js} +1 -1
  109. package/web/_astro/{chunk-FMBD7UC4.DGWrDnUU.js → chunk-FMBD7UC4.GS4UHg7_.js} +1 -1
  110. package/web/_astro/{chunk-ND2GUHAM._BagvPDy.js → chunk-ND2GUHAM.BnqotN4g.js} +1 -1
  111. package/web/_astro/{chunk-QZHKN3VN.VOboYWQ0.js → chunk-QZHKN3VN.Ghuh8zoJ.js} +1 -1
  112. package/web/_astro/{classDiagram-4FO5ZUOK.D_apfHS7.js → classDiagram-4FO5ZUOK.BW9vC3zg.js} +1 -1
  113. package/web/_astro/{classDiagram-v2-Q7XG4LA2.D_apfHS7.js → classDiagram-v2-Q7XG4LA2.BW9vC3zg.js} +1 -1
  114. package/web/_astro/{cose-bilkent-S5V4N54A.DNLU_L-x.js → cose-bilkent-S5V4N54A.D6jNC0ti.js} +1 -1
  115. package/web/_astro/{cynefin-OW5HDTMX.D8borhV-.js → cynefin-OW5HDTMX.BOGoCs4L.js} +1 -1
  116. package/web/_astro/{dagre-BM42HDAG.Uc0lvjcV.js → dagre-BM42HDAG.8iU5VcWi.js} +1 -1
  117. package/web/_astro/{diagram-2AECGRRQ.DDIxtDBo.js → diagram-2AECGRRQ.CVt88HwH.js} +1 -1
  118. package/web/_astro/{diagram-5GNKFQAL.DVoDnD3H.js → diagram-5GNKFQAL.C9HxUUMl.js} +1 -1
  119. package/web/_astro/{diagram-KO2AKTUF.CRubTJ-0.js → diagram-KO2AKTUF.4ywkQN3t.js} +1 -1
  120. package/web/_astro/{diagram-LMA3HP47.m9SeYcXQ.js → diagram-LMA3HP47.C48A6gpz.js} +1 -1
  121. package/web/_astro/{diagram-OG6HWLK6.C6s2ZjV5.js → diagram-OG6HWLK6.DxFieQW4.js} +1 -1
  122. package/web/_astro/{erDiagram-TEJ5UH35.nSzr5KTj.js → erDiagram-TEJ5UH35.CtjtQqYs.js} +1 -1
  123. package/web/_astro/{flowDiagram-I6XJVG4X.DrZcys16.js → flowDiagram-I6XJVG4X.C5zAiahU.js} +1 -1
  124. package/web/_astro/{ganttDiagram-6RSMTGT7.Do4M1b-K.js → ganttDiagram-6RSMTGT7.D_L6zsny.js} +1 -1
  125. package/web/_astro/{gitGraphDiagram-PVQCEYII.BWc9oJ4l.js → gitGraphDiagram-PVQCEYII.Ignnrk3V.js} +1 -1
  126. package/web/_astro/index.CbNz17Sx.css +1 -0
  127. package/web/_astro/{infoDiagram-5YYISTIA.BIdOctFk.js → infoDiagram-5YYISTIA.DLv8-P5u.js} +1 -1
  128. package/web/_astro/{ishikawaDiagram-YF4QCWOH.CV5SuG2t.js → ishikawaDiagram-YF4QCWOH.p0OTpwFO.js} +1 -1
  129. package/web/_astro/{journeyDiagram-JHISSGLW.CxE-rEJ-.js → journeyDiagram-JHISSGLW.CIaBt-DD.js} +1 -1
  130. package/web/_astro/{kanban-definition-UN3LZRKU.BPRdKWs_.js → kanban-definition-UN3LZRKU.DGySIntq.js} +1 -1
  131. package/web/_astro/{linear.zRsuuDTE.js → linear.BATV4RXu.js} +1 -1
  132. package/web/_astro/{mermaid.core.jAJTcMKc.js → mermaid.core.DzkwM3VX.js} +4 -4
  133. package/web/_astro/{mindmap-definition-RKZ34NQL.BffJxfCr.js → mindmap-definition-RKZ34NQL.3piBRRzA.js} +1 -1
  134. package/web/_astro/{pieDiagram-4H26LBE5.CacwWaE3.js → pieDiagram-4H26LBE5.DUNueLub.js} +1 -1
  135. package/web/_astro/{quadrantDiagram-W4KKPZXB.hXELD06-.js → quadrantDiagram-W4KKPZXB.9bihVbrt.js} +1 -1
  136. package/web/_astro/{requirementDiagram-4Y6WPE33.DdEbPcqT.js → requirementDiagram-4Y6WPE33.CkjsC-YT.js} +1 -1
  137. package/web/_astro/{sankeyDiagram-5OEKKPKP.DgaDocKv.js → sankeyDiagram-5OEKKPKP.Dbq4vaoQ.js} +1 -1
  138. package/web/_astro/{sequenceDiagram-3UESZ5HK.B0KScnAu.js → sequenceDiagram-3UESZ5HK.BivrH99P.js} +1 -1
  139. package/web/_astro/{stateDiagram-AJRCARHV.CV9M_WNc.js → stateDiagram-AJRCARHV.CqLQ1Vzz.js} +1 -1
  140. package/web/_astro/{stateDiagram-v2-BHNVJYJU.BOAo74Et.js → stateDiagram-v2-BHNVJYJU.DvvoLD3b.js} +1 -1
  141. package/web/_astro/{timeline-definition-PNZ67QCA.CqqepUMe.js → timeline-definition-PNZ67QCA.B-KR78gv.js} +1 -1
  142. package/web/_astro/{vennDiagram-CIIHVFJN.DDqe4dOG.js → vennDiagram-CIIHVFJN.Ck0Eieb5.js} +1 -1
  143. package/web/_astro/{wardleyDiagram-YWT4CUSO.B3R9OPdO.js → wardleyDiagram-YWT4CUSO.CRfdd_do.js} +1 -1
  144. package/web/_astro/{xychartDiagram-2RQKCTM6.B3SvgXpQ.js → xychartDiagram-2RQKCTM6.Ck_Jxk9C.js} +1 -1
  145. package/web/index.html +2 -2
  146. package/plugins/sp/lib/artifact-digest.generated.d.mts +0 -7
  147. package/plugins/sp/lib/artifact-digest.generated.mjs +0 -48
  148. package/plugins/sp/scripts/feature-sync-bounded.mjs +0 -301
  149. package/plugins/sp/scripts/feature-sync-bounded.ts +0 -481
  150. package/plugins/sp/scripts/idea-coverage-check.ts +0 -168
  151. package/plugins/sp/scripts/inline-pipeline-parity-check.ts +0 -298
  152. package/plugins/sp/scripts/record-feature-sync.mjs +0 -63
  153. package/plugins/sp/scripts/record-feature-sync.ts +0 -84
  154. package/plugins/sp/scripts/script-contract-check.ts +0 -506
  155. package/plugins/sp/scripts/stage-registry-adapter.ts +0 -1533
  156. package/plugins/sp/scripts/surface-drift-inventory.ts +0 -989
  157. package/plugins/sp/scripts/task-evidence-precheck.ts +0 -189
  158. package/plugins/sp/scripts/task-size-precheck.ts +0 -212
  159. package/plugins/sp/scripts/transition-shim-check.ts +0 -238
  160. package/plugins/sp/scripts/validate-commands.ts +0 -689
  161. package/plugins/sp/scripts/validate-flag-contracts.ts +0 -890
  162. package/plugins/sp/scripts/verify-answer-lint.ts +0 -549
  163. package/web/_astro/BoardApp.BxJuwD7I.js +0 -191
  164. package/web/_astro/channel.CI6N_tCg.js +0 -1
  165. package/web/_astro/index.CENnIEqT.css +0 -1
@@ -23,12 +23,12 @@ that before using `run` for fan-out dispatch.
23
23
  | ---- | ------- | --------- |
24
24
  | `run <prompt>` | Execute a prompt or slash command via a coding agent | `--agent <name>` `--spec <id>` `--model <name>` `--mode <mode>` `--continue` `--cwd <path>` `--drain` `--json` |
25
25
  | `wait [<specId>]` | Identity-pinned wait for an occupant run to reach a lifecycle state (G4 wave 2; `--role` selector per 0685) | `--role <name>` `--run <runId>` `--until <state>...` `--timeout <ms>` `--json` |
26
- | `list` | List detected coding agents, or agent specs with `--specs` (live run status + member session merged from `spur serve`) | `--specs` `--server <url>` `--json` |
27
- | `status` | Agent specs with live process status and member session (requires `spur serve`) | `--server <url>` `--json` |
26
+ | `list` | List detected coding agents, or agent specs with `--specs` (live run status + member session merged from `spur self serve`) | `--specs` `--server <url>` `--json` |
27
+ | `status` | Agent specs with live process status and member session (requires `spur self serve`) | `--server <url>` `--json` |
28
28
  | `doctor [agent]` | Check agent readiness | `--json` `--probe-health` `--force-refresh` |
29
29
  | `usage` | Run-once provider usage capture (codexbar) → quota-owned availability refresh; scheduled externally | `--dry-run` `--source <name>` `--json` |
30
- | `start <spec-id>` | Start a supervised agent process (requires `spur serve`) | `--server <url>` `--json` |
31
- | `stop <spec-id>` | Stop a supervised agent process (requires `spur serve`) | `--server <url>` `--json` |
30
+ | `start <spec-id>` | Start a supervised agent process (requires `spur self serve`) | `--server <url>` `--json` |
31
+ | `stop <spec-id>` | Stop a supervised agent process (requires `spur self serve`) | `--server <url>` `--json` |
32
32
 
33
33
  `list`, `status`, `doctor`, `run`, `wait`, `start`, and `stop` accept `--json` plus `--json-envelope`. The hidden
34
34
  `loop` is a supervisor-internal process surface. **Exit codes:** `0` success, `1` failure, and `2`
@@ -85,7 +85,7 @@ justify it - but ensure the run executes in a context that can write the target
85
85
 
86
86
  ## `loop` - supervisor-internal self-draining wrapper (hidden)
87
87
 
88
- `spur agent loop --spec <id> [--poll <ms>]` is spawned by the `spur serve` supervisor for each
88
+ `spur agent loop --spec <id> [--poll <ms>]` is spawned by the `spur self serve` supervisor for each
89
89
  materialized agent spec; it is hidden from `--help` and not an operator verb (use `spur agent start`).
90
90
  It waits for a wake on the `system_events` ledger — a human request (`message.sent`), a strategy
91
91
  change (`strategy.changed`), a capacity change (`fleet.capacity.changed`), or a completion receipt
@@ -145,7 +145,7 @@ lists agent specs (`.spur/agents/*.yaml`) **with live run status merged from the
145
145
  supervisor**: each row carries a trailing status column
146
146
  (`running` / `stopped` / `errored` / `unknown`), `pid=<n>` where a process exists, and the member
147
147
  session (0897): the session mode plus a shortened resume id (`resume id=3f9c2a1d`), or `-` when the
148
- member has no recorded session. When `spur serve` is unreachable, the listing falls back to all
148
+ member has no recorded session. When `spur self serve` is unreachable, the listing falls back to all
149
149
  `stopped` with a stderr warning. `--server <url>`
150
150
  (default `http://localhost:3000/api`) targets the supervisor API.
151
151
 
@@ -200,9 +200,9 @@ spur agent start worker-1
200
200
  spur agent start worker-1 --json
201
201
  ```
202
202
 
203
- Posts to the `spur serve` supervisor API
203
+ Posts to the `spur self serve` supervisor API
204
204
  (`POST /api/agents/:id/start`) and prints `started <id> (pid=<n>, status=<s>)`. Requires a
205
- reachable `spur serve`; `--server <url>` (default `http://localhost:3000/api`) targets it. Exit `1`
205
+ reachable `spur self serve`; `--server <url>` (default `http://localhost:3000/api`) targets it. Exit `1`
206
206
  when the server is unreachable or the start fails.
207
207
 
208
208
  ## `stop` - stop a supervised process
@@ -250,7 +250,7 @@ unconfirmed or failed. For `skipped`/`pending` the printed target is intent only
250
250
  0 * * * * /opt/homebrew/bin/spur agent usage >> /tmp/spur-agent-usage.log 2>&1
251
251
  ```
252
252
 
253
- `spur serve` never invokes the producer (asserted by a test, design R4).
253
+ `spur self serve` never invokes the producer (asserted by a test, design R4).
254
254
 
255
255
  ### Flags
256
256
 
@@ -285,7 +285,7 @@ one never re-sends settled work; only never-started deliveries release and redel
285
285
  - **Not the dispatch decision.** *When* to use `spur agent run` vs a native subagent is the
286
286
  **[dispatch-surface rule](../../parallel-execution/references/dispatch-surface.md)**, not this
287
287
  reference. This reference documents the verbs; that rule decides which surface carries a dispatch.
288
- - **Not the fleet orchestrator.** The `spur serve` supervisor drives the lifecycle: `spur agent
288
+ - **Not the fleet orchestrator.** The `spur self serve` supervisor drives the lifecycle: `spur agent
289
289
  start` / `stop` manage supervised processes and `agent list --specs` reports live state.
290
290
 
291
291
  ## See also
@@ -181,11 +181,16 @@ planning reference, then apply accepted deterministic changes through `spur feat
181
181
  ## The gate — `check --json`
182
182
 
183
183
  ```bash
184
- spur feature check H2 --json # one feature
185
- spur feature check --json # whole tree
186
- spur feature check --strict --json # warnings → failures
184
+ spur feature check H2 --json # one feature
185
+ spur feature check --json # whole tree
186
+ spur feature check --strict --json # warnings → failures
187
+ spur feature check H2 --inventory <eval-report.md> # also cross-check AC ↔ requirement inventory
187
188
  ```
188
189
 
190
+ With `--inventory <report>`, the `inventory-coverage` finding (1004 R1, unsuppressible error layer)
191
+ fails the check when a `## Requirement inventory` item has no covering scenario (`# covers: I<n>`)
192
+ and is not `[deferred: ...]`; a missing/empty inventory section is itself an error.
193
+
189
194
  The 4-layer validator (frontmatter, AC syntax, children-limit/structure, L4 traceability) emits its
190
195
  verdict and findings as a JSON **array**, one entry per feature (`jq '.[0].pass'`, `.[0].findings[].code`),
191
196
  like `spur task check --json`. Gherkin AC must keep its `Feature:` line (`L3.ac-bdd-error`) and
@@ -207,15 +212,21 @@ see the proposed status hop.
207
212
  spur feature sync H2 --json # one feature
208
213
  spur feature sync H2 --dry-run --json # propose only, no write
209
214
  spur feature sync --all --json # every feature with linked tasks
210
- spur feature sync H2 --force # apply a reopen proposal without confirmation
215
+ spur feature sync H2 --force # re-derive live: bypass replay + apply a reopen without confirmation
211
216
  spur feature sync H2 --folder docs/custom-tasks --json # non-default tasks folder
212
217
  ```
213
218
 
214
219
  - **`[id]`** syncs one feature; **`--all`** syncs every feature with linked tasks. One of the two is
215
220
  required - exit `2` if neither is given.
216
221
  - **`--dry-run`** reports proposed transitions without applying. **`--force`** applies a *reopen*
217
- proposal (status moving backward) without interactive confirmation.
218
- - **`--json`** single-feature emits `{ proposal, applied, appliedHops[] }`; `--all` emits
222
+ proposal (status moving backward) without interactive confirmation **and** bypasses blocked-sync
223
+ replay (below).
224
+ - **Blocked-sync suppression (1004 R3):** a BLOCKED outcome is persisted at
225
+ `.spur/run/feature-sync-blocked-<id>.json` with an input fingerprint (feature content, linked
226
+ task statuses, verdict mtimes); an identical next call replays the prior result
227
+ (`suppressed: true`) instead of re-deriving. A changed input, `--force`, or a non-blocked
228
+ outcome re-derives/clears. Dry-run never reads or writes the state.
229
+ - **`--json`** single-feature emits `{ proposal, applied, appliedHops[], suppressed? }`; `--all` emits
219
230
  `{ totalFeatures, evaluated, updatedCount, results[] }` where each result is the single-feature
220
231
  shape. `proposal` is
221
232
  `{ featureId, from, to, reason, requiresConfirm?, gateBlocked?, gateFindings?, hops? }`.
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: init
3
- description: "spur-cli noun reference for `spur init` and `spur status`: CLI verbs (init scaffold with --name/--force/--minimal, status with --json) plus post-scaffold init validation for /sp:spur-init - Phase 1.5 functional-validation probes and Phase 1.6 rule-glob adaptation."
3
+ description: "spur-cli noun reference for `spur self init` and `spur self status`: CLI verbs (init scaffold with --name/--force/--minimal, status with --json) plus post-scaffold init validation for /sp:spur-init - Phase 1.5 functional-validation probes and Phase 1.6 rule-glob adaptation."
4
4
  see_also:
5
5
  - spur-cli
6
6
  ---
7
7
 
8
- # spur init / spur status - CLI verbs and post-scaffold validation
8
+ # spur self init / spur self status - CLI verbs and post-scaffold validation
9
9
 
10
10
  ## CLI verbs
11
11
 
@@ -14,14 +14,14 @@ see_also:
14
14
  | `init` | Scaffold a new Spur project in the current directory | `--name <name>` `--force` `--minimal` `--json` |
15
15
  | `status [path]` | Show project and git status for a Spur project | `--json` |
16
16
 
17
- ### `spur init` - scaffold a Spur project
17
+ ### `spur self init` - scaffold a Spur project
18
18
 
19
19
  ```bash
20
- spur init # interactive: prompt for project name
21
- spur init --name my-project # non-interactive
22
- spur init --name my-project --force # overwrite existing .spur/ files
23
- spur init --minimal # skip optional scaffolding (rules, workflows)
24
- spur init --json # machine-readable
20
+ spur self init # interactive: prompt for project name
21
+ spur self init --name my-project # non-interactive
22
+ spur self init --name my-project --force # overwrite existing .spur/ files
23
+ spur self init --minimal # skip optional scaffolding (rules, workflows)
24
+ spur self init --json # machine-readable
25
25
  ```
26
26
 
27
27
  Materializes the `.spur/` directory tree with config, docs, rules, and workflow templates. The
@@ -34,14 +34,15 @@ post-scaffold validation probes (Phase 1.5 / 1.6, below) run immediately after t
34
34
  | `--name <name>` | Project name (skips interactive prompt). |
35
35
  | `--force` | Overwrite existing `.spur/` files. Without it, existing files are preserved. |
36
36
  | `--minimal` | Skip optional scaffolding (rules presets, workflow templates). Core config + docs only. |
37
+ | `--adopt-global-config` | Also rewrite `~/.config/spur/config.yaml` from the shipped global default (backed up first). Opt-in only. |
37
38
  | `--json` | Output machine-readable JSON instead of interactive summary. |
38
39
 
39
- ### `spur status [path]` - project and git status
40
+ ### `spur self status [path]` - project and git status
40
41
 
41
42
  ```bash
42
- spur status # current directory
43
- spur status /path/to/project # specific project
44
- spur status --json # machine-readable
43
+ spur self status # current directory
44
+ spur self status /path/to/project # specific project
45
+ spur self status --json # machine-readable
45
46
  ```
46
47
 
47
48
  Reports the project's Spur configuration state (init status, feature/task counts, rule preset
@@ -50,11 +51,11 @@ directory.
50
51
 
51
52
  ## Post-scaffold validation
52
53
 
53
- Two probes sit between the deterministic scaffold (`spur init`) and the non-deterministic doc
54
+ Two probes sit between the deterministic scaffold (`spur self init`) and the non-deterministic doc
54
55
  customization: Phase 1.5 (functional validation) confirms the fresh tree is immediately functional;
55
56
  Phase 1.6 (rule glob adaptation) rewrites layout-dependent rule globs so `recommended-pre-check`
56
57
  runs clean on this project's layout. The executing agent owns content *adaptation* only — `spur
57
- init` owns *file materialization* (`04_DESIGN.md` §1.1 "Init ownership contract").
58
+ self init` owns *file materialization* (`04_DESIGN.md` §1.1 "Init ownership contract").
58
59
 
59
60
  ### Phase 1.5 — Functional validation probe
60
61
 
@@ -62,8 +63,8 @@ Before any customization, confirm the fresh scaffold is immediately functional.
62
63
  fails, STOP and report the gap rather than papering over it with customization:
63
64
 
64
65
  ```
65
- spur status
66
- spur task create "__probe__" --template standard # confirms task template + matrix resolve
66
+ spur self status
67
+ spur task create "__probe__" --template standard --skip-ready # no model dispatch; confirms task template + matrix resolve
67
68
  spur workflow validate task-pipeline.yaml
68
69
  ```
69
70
 
@@ -17,7 +17,7 @@ top-level forms are omitted from `spur --help`, leaving `self` as the visible su
17
17
 
18
18
  | Verb | Purpose | Key flags |
19
19
  | ---- | ------- | --------- |
20
- | `init` | Scaffold a new Spur project in the current directory | `--name <name>` `--force` `--minimal` `--json` |
20
+ | `init` | Scaffold a new Spur project in the current directory | `--name <name>` `--force` `--minimal` `--adopt-global-config` `--json` |
21
21
  | `maintain` | Run database maintenance: PRAGMA optimize, WAL truncation, optional VACUUM | `--vacuum` `--json` |
22
22
  | `migrate` | Apply CLI-owned schema migrations | `--json` |
23
23
  | `serve` | Start the Spur web server (local fallback) | `--port <n>` `--host <addr>` `--no-open` `--cwd <path>` `--json` |
@@ -40,7 +40,8 @@ spur self init --json # machine-readable
40
40
 
41
41
  Materializes the `.spur/` directory tree with config, docs, rules, and workflow templates. Flags:
42
42
  `--name <name>` (default: current directory name), `--force` (recreate existing files), `--minimal`
43
- (skip optional scaffolding), `--json` (machine-readable output). Post-scaffold validation probes
43
+ (skip optional scaffolding), `--adopt-global-config` (also rewrite `~/.config/spur/config.yaml` from
44
+ the shipped global default, backed up first), `--json` (machine-readable output). Post-scaffold validation probes
44
45
  (Phase 1.5 / 1.6) run immediately after this verb completes — see **[init.md](init.md)** for the
45
46
  probe protocol and rule-glob adaptation procedure.
46
47
 
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: spur-cli-serve
3
- description: "spur-cli noun reference: operate `spur serve` as the local web-server fallback - start the Hono/Cloudflare-Worker server that backs the web Task Kanban and the supervisor API. Single verb, five flags."
3
+ description: "spur-cli noun reference: operate `spur self serve` as the local web-server fallback - start the Hono/Cloudflare-Worker server that backs the web Task Kanban and the supervisor API. Single verb, five flags."
4
4
  see_also:
5
5
  - spur-cli
6
6
  ---
7
7
 
8
- # spur serve - local web server
8
+ # spur self serve - local web server
9
9
 
10
- `spur serve` starts the **Spur web server** - a local Hono / Cloudflare-Worker server that serves
10
+ `spur self serve` starts the **Spur web server** - a local Hono / Cloudflare-Worker server that serves
11
11
  the web Task Kanban and exposes the supervisor API (`/api/processes/*` + `/api/agents/*`). It is the local fallback
12
12
  when no remote server is configured.
13
13
 
@@ -22,10 +22,10 @@ when no remote server is configured.
22
22
  ## `serve` - start the web server
23
23
 
24
24
  ```bash
25
- spur serve # default: localhost:3000, opens browser
26
- spur serve --port 8080 --host 0.0.0.0
27
- spur serve --no-open # skip browser
28
- spur serve --json # dry probe: print { port, url, pid, running } and exit
25
+ spur self serve # default: localhost:3000, opens browser
26
+ spur self serve --port 8080 --host 0.0.0.0
27
+ spur self serve --no-open # skip browser
28
+ spur self serve --json # dry probe: print { port, url, pid, running } and exit
29
29
  ```
30
30
 
31
31
  Starts the server with the Hono app backed by the local SQLite database. The web Task Kanban and
@@ -46,14 +46,14 @@ the supervisor API become available at `http://<host>:<port>`.
46
46
 
47
47
  ## What this skill is NOT
48
48
 
49
- - **Not the agent supervisor.** `spur serve` hosts the supervisor API; `spur agent start` / `stop` /
49
+ - **Not the agent supervisor.** `spur self serve` hosts the supervisor API; `spur agent start` / `stop` /
50
50
  `agent list --specs` are the verbs that drive and inspect it (0848). See
51
51
  **[agent.md](agent.md)**.
52
52
  - **Not a production server.** This is the local fallback. Production deployment uses the Cloudflare
53
- Worker build (`apps/server/`), not `spur serve`.
53
+ Worker build (`apps/server/`), not `spur self serve`.
54
54
 
55
55
  ## See also
56
56
 
57
- - **`spur agent` (see [agent.md](agent.md))** - `start`/`stop`/`list --specs` require `spur serve`
57
+ - **`spur agent` (see [agent.md](agent.md))** - `start`/`stop`/`list --specs` require `spur self serve`
58
58
  for the supervisor API.
59
59
  - **`sp:spur-cli`** SKILL.md - the facade that routes to this reference.
@@ -58,16 +58,20 @@ exactly: `Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `
58
58
  `spur task record 0040 --transition testing` reads `.spur/run/0040-verdict.json`, writes
59
59
  `Testing` (per-requirement table), and backfills `Review` (P1–P4 findings table) **only when the
60
60
  section is bare** — a standalone compatibility fallback, never an overwrite of the review
61
- coordinator's authored Review — optionally backfilling a bare `Solution` from `git diff -U0`. It
62
- never transitions to `done`.
61
+ coordinator's authored Review — optionally backfilling a bare `Solution` from `git diff -U0`.
62
+ Record can also refresh its own earlier Review backfill. The `--transition testing` example stops
63
+ at testing; `--transition done` with a PASS verdict walks the forward lifecycle edges through their
64
+ guards and creates the required pipeline run-link immediately before the done hop.
63
65
 
64
66
  - **Use `record`** when a verify step produced a verdict artifact — it is the pipeline's record step
65
67
  and the deterministic `Testing` writer.
66
68
  - **Use `update --section`** when you are authoring a section by hand (planning, design, narrative
67
69
  solution) or amending one `record` already wrote.
68
70
 
69
- `record` writes `Testing` unconditionally and `Review` only when bare; a later
70
- `update --section` overwrites either (file-wins). Both go through the same file-wins atomic write.
71
+ `record` re-reads the verdict on each invocation. PASS/PARTIAL/FAIL artifacts refresh Testing;
72
+ UNKNOWN preserves authored Testing and writes a stub only when Testing is bare. Review remains
73
+ fallback-only: bare content or record's own earlier backfill can be replaced, authored Review cannot.
74
+ A later `update --section` overwrites either section (file-wins). Both use the same atomic write.
71
75
 
72
76
  ## Which section, when
73
77
 
@@ -81,7 +85,7 @@ LLM's job (orchestrated by `sp:spur-dev`); this skill only owns the *mechanism*:
81
85
  | `Plan` | before `wip` | the step list |
82
86
  | `Solution` | during impl (implement step) | the approach actually taken; L3 `file:line` rule fires once it has real content |
83
87
  | `Testing` | testing phase (`record` — deterministic writer) | what was verified and how — gated at `wip→testing` by `check` |
84
- | `Review` | review phase (`/sp:dev-review` coordinator) | merged SECU findings + verdict — gated at `testing→done` by `check --strict-core` |
88
+ | `Review` | review phase (`/sp:dev-review` coordinator) | merged SECU findings + verdict — gated at `testing→done` by `check --as done` |
85
89
 
86
90
  Section presence per status is a **runtime contract**, not a table: query
87
91
  `spur task sections <wbs> list --json` (permitted present sections) and `spur task check <wbs> --json`
@@ -24,8 +24,16 @@ blocking retry).
24
24
  | `--feature <id>` | Records `feature_id` in frontmatter; derives `Background` from the feature's `Goal` (L4 edge). |
25
25
  | `--parent <wbs>` | Groups under a parent WBS for sub-task decomposition. |
26
26
  | `--template <variant>` | Selects the section-matrix variant for the new file. |
27
+ | `--skip-ready` | Keep the capture as-is: no ready preparation, no model dispatch. |
28
+ | `--agent <selector>` | Agent used for ready preparation (default: the configured agent). Exit `2` when combined with `--skip-ready`. |
27
29
  | `--folder <path>` | Target a non-default tasks folder. |
28
- | `--json` | Emit `{ ref: { id, filePath } }`. |
30
+ | `--json` | Emit `{ ref: { id, filePath }, wbs, filePath, readiness: { status, depth } }`. |
31
+
32
+ **Ready by default (ADR-109):** after the capture is saved, `create` prepares the same WBS in place —
33
+ model refine → deterministic post-check (`task check --as todo`) → promotion to `todo`.
34
+ `readiness.status` is `ready`, `skipped` (`--skip-ready`), or `failed`. A failed preparation exits `1`
35
+ with error code `preparation-failed` (`failedStage`, `recoveryCommand`, `findings`); the task file and
36
+ its WBS are kept. `batch-create` takes the same two flags.
29
37
 
30
38
  (See also the full verb map in [tasks.md](../tasks.md).)
31
39
 
@@ -67,6 +75,10 @@ frontmatter scalar.
67
75
  wholesale. No inline-body flag. Section names: `Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `Plan`, `Solution`, `Testing`, `Review`, `References`, `History`, `Notes`.
68
76
  - **Frontmatter** (`--feature <id>`, `--priority <p>`): sets the scalar frontmatter field on an
69
77
  existing task — the only post-create path, allow-listed to `feature_id` / `parent_wbs` / `priority`.
78
+ - **Estimate** (`--estimate-hours <n>`): sets the `estimate_hours` frontmatter field (positive number) —
79
+ the decomposition size estimate the inline pipeline driver reads.
80
+ - **`--provenance-bypass`** (pair with `--force-done` and `--reason`): records an audited
81
+ provenance-bypass link when no pipeline run exists. Replaces the `SPUR_PROVENANCE_OVERRIDE` env var.
70
82
  - **AC controls** (`--ac-altitude <graduating|task-local>`, `--ac-numbering task-local`) — independent
71
83
  of each other (task 0818 R5). `--ac-altitude task-local` skips the **DD-09 feature-AC subset** rule
72
84
  because the task's scenarios are intentionally not the feature's ship criteria; `--ac-numbering
@@ -339,8 +351,11 @@ column to distinguish AC rows from requirement rows:
339
351
  `AC-<i>` (which credits the scenario) and the task checkbox id `AC<i>` (which the box flip needs).
340
352
  Key the row **`AC<n> — <scenario title>`**, omitting the scenario's own `R<n>` label — then one row
341
353
  does both: `normalizeTitle` strips the `AC<n>` prefix so the row still matches the scenario title,
342
- and `prefixId` normalizes `AC<n>` so the box flips. A bare `AC<n>` credits no scenario; a bare
343
- `AC-<i>` flips no box; a title carrying the scenario's `R<n>` label matches neither.
354
+ and `prefixId` normalizes `AC<n>` so the box flips. A bare `AC-<i>` also does both: `record`
355
+ resolves it through the feature's scenario order to the AC line aliasing scenario *i*
356
+ (`AC<k> — [R<n> — ]<scenario title>`) and flips that box — never the same-numbered `AC<i>`; with no
357
+ aliasing line it flips nothing. A bare `AC<n>` credits no scenario; a title carrying the scenario's
358
+ `R<n>` label matches neither.
344
359
 
345
360
  **Evidence rule (behavior-bearing AC):** an AC row with `status: MET` on a behavior-bearing id
346
361
  (no `[advisory]`/`[non-core]`/`[non-behavior]`/`[docs-only]` marker) MUST carry `test` or
@@ -410,9 +425,9 @@ unallocated.
410
425
  ## Command surface (quick)
411
426
 
412
427
  ```
413
- spur task create <title> [--feature <id>] [--parent <wbs>] [--template <v>] [--dedupe-within <seconds>] [--allow-duplicate-name] [--folder] [--json]
428
+ spur task create <title> [--feature <id>] [--parent <wbs>] [--template <v>] [--dedupe-within <seconds>] [--allow-duplicate-name] [--skip-ready | --agent <selector>] [--folder] [--json]
414
429
  spur task show <wbs> [--folder] [--json]
415
- spur task update <wbs> [status] [--section <n> --from-file <p>] [--feature <id>] [--priority <p>] [--no-lifecycle] [--folder] [--json]
430
+ spur task update <wbs> [status] [--section <n> --from-file <p>] [--feature <id>] [--priority <p>] [--ac-numbering task-local] [--ac-altitude <a>] [--estimate-hours <n>] [--assignee <spec-id>] [--no-lifecycle] [--force-done --reason <text> [--provenance-bypass] [--verdict-dir <path>]] [--folder] [--json]
416
431
  spur task deps <wbs> <set|add|remove|clear> [values...] [--folder] [--json]
417
432
  spur task sections <wbs> <init|add|list> [name] [--folder] [--json]
418
433
  spur task list [--status <s>] [--phase <p>] [--parent <wbs>] [--feature <id>] [--folder] [--json]
@@ -420,7 +435,7 @@ spur task refresh [--folder] [--json]
420
435
  spur task migrate [--dry-run] [--folder] [--json]
421
436
  spur task migrate-anchors [--dry-run] [--json]
422
437
  spur task refresh-roster <wbs> [--folder] [--json]
423
- spur task batch-create --file <path> [--folder] [--json]
438
+ spur task batch-create --file <path> [--skip-ready | --agent <selector>] [--folder] [--json]
424
439
  spur task record <wbs> [--verdict-file <p>] [--solution-from-diff] [--transition <s>] [--folder] [--json]
425
440
  spur task verdict <wbs> [--from-answer <p>] [--folder] [--json]
426
441
  spur task verifyall-aggregate [--from-file <path>] [--json]
@@ -38,9 +38,9 @@ re-reading or re-tokenizing the task.
38
38
 
39
39
  | Verb | Purpose | Key flags |
40
40
  | ---- | ------- | --------- |
41
- | `create <title>` | Allocate a new task (race-safe WBS) | `--feature <id>` `--parent <wbs>` `--template <variant>` `--dedupe-within <s>` `--allow-duplicate-name` `--folder` `--json` |
41
+ | `create <title>` | Allocate a new task (race-safe WBS) | `--feature <id>` `--parent <wbs>` `--template <variant>` `--dedupe-within <s>` `--allow-duplicate-name` `--skip-ready` `--agent <selector>` `--folder` `--json` |
42
42
  | `show <wbs>` | Print one task's frontmatter + body | `--folder` `--json` |
43
- | `update <wbs> [status]` | Lifecycle transition, section replace, **or** frontmatter set | `--section <name> --from-file <path>` `--assignee <spec-id>` (exclusive with `--section`) `--feature <id>` `--priority <p>` `--no-lifecycle` `--force-done` `--reason <text>` `--verdict-dir <path>` `--folder` `--json` |
43
+ | `update <wbs> [status]` | Lifecycle transition, section replace, **or** frontmatter set | `--section <name> --from-file <path>` `--assignee <spec-id>` (exclusive with `--section`) `--feature <id>` `--priority <p>` `--ac-numbering task-local` `--ac-altitude <a>` `--estimate-hours <n>` `--no-lifecycle` `--force-done` `--reason <text>` `--provenance-bypass` `--verdict-dir <path>` `--folder` `--json` |
44
44
  | `deps <wbs> <op> [values...]` | Mutate `dependencies[]` frontmatter array (ops: `set`, `add`, `remove`, `clear`) | `--folder` `--json` |
45
45
  | `sections <wbs> <op> [name]` | Initialize, add, or list canonical task sections (ops: `init`, `add`, `list`) | `--folder` `--json` |
46
46
  | `list` | List tasks, filtered | `--status <s>` `--phase <p>` `--parent <wbs>` `--feature <id>` `--folder` `--json` |
@@ -48,10 +48,10 @@ re-reading or re-tokenizing the task.
48
48
  | `migrate` | One-time A17 corpus normalization pass | `--dry-run` `--folder` `--json` |
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
- | `batch-create` | Create many tasks from a validated JSON array | `--file <path>` `--folder` `--json` |
51
+ | `batch-create` | Create many tasks from a validated JSON array | `--file <path>` `--skip-ready` `--agent <selector>` `--folder` `--json` |
52
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; `--fix` repairs structure; `--corpus` is the explicit unsuppressed audit | `--strict` `--as <status>` `--strict-core` `--fix` `--folder` `--corpus` `--since <ref>` `--json` |
54
+ | `check [wbs]` | Four-layer validation; `--fix` repairs structure; `--corpus` is the explicit unsuppressed audit; `--precheck` adds the pipeline precheck gate (size + evidence channel, WBS required) | `--strict` `--as <status>` `--strict-core` `--precheck` `--fix` `--folder` `--corpus` `--since <ref>` `--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` |
@@ -73,6 +73,11 @@ spur task create "Add email validation" --feature H2 --parent 0040
73
73
  - **`--template <variant>`** selects the section-matrix variant that shapes the new file's sections:
74
74
  `standard·feature-impl·issue·review·meta·brainstorm`. The default is **`feature-impl` when
75
75
  `--feature` is given, else `standard`**. An unknown variant is exit `2`.
76
+ - **Ready by default (ADR-109):** `create` and `batch-create` dispatch a model to prepare the new task
77
+ to ready (refine → `task check --as todo` post-check → promotion to `todo`). Pass **`--skip-ready`**
78
+ for a plain capture with no model dispatch; **`--agent <selector>`** picks the preparing agent.
79
+ `--json` carries `readiness: { status: ready|skipped|failed, depth }`; a failed preparation exits `1`
80
+ (`preparation-failed`) and keeps the task.
76
81
 
77
82
  The same `--template` axis drives both *which sections the new file carries* (per the
78
83
  Section-Status-Matrix) and *its creation status*: a spec'd task (a `--feature` link, or a batch item
@@ -271,7 +276,7 @@ spur task check --json # whole corpus
271
276
  spur task check 0040 --json # one task
272
277
  spur task check --strict --json # elevate ALL warnings to failures
273
278
  spur task check 0040 --as done # evaluate as the done row (lifecycle target, F92 R2)
274
- spur task check 0040 --strict-core # temporary compatibility alias
279
+ spur task check 0040 --strict-core # compatibility alias; not the done gate (use --as done)
275
280
  ```
276
281
 
277
282
  **Folder resolution (task 0522):** a WBS-targeted check (`<wbs>` present, no `--folder`) resolves
@@ -291,9 +296,10 @@ The two flags are distinct gate profiles:
291
296
  - **`--strict`** elevates *all* warnings to failures (the strictest reading).
292
297
  - **`--as <status>`** evaluates the task as if it were already in `<status>` (F92 R2); the lifecycle
293
298
  guards pass the transition target. Validated against canonical task statuses; excluded with `--corpus`.
294
- - **`--strict-core`** is a **temporary compatibility alias** (F92 R2). Fails only on hard-core errors — Solution `file:line`, Review P1–P4, and
295
- `gate:true` required-section misses — *without* the blanket elevation. This is the variant wired
296
- as the `testing→done` lifecycle guard.
299
+ - **`--strict-core`** is a **compatibility alias** (F92 R2) kept so installed plugins/workflows that
300
+ call it keep working. It runs the default severity computation against the task's *current* status
301
+ and is no longer meaningful on its own. The lifecycle guards are `--as testing` (`wip→testing`) and
302
+ `--as done` (`testing→done`); use `--as <status>` for gate checks.
297
303
 
298
304
  See [tasks/verbs.md](tasks/verbs.md) for the JSON shape per finding.
299
305
 
@@ -204,7 +204,7 @@ spur workflow run ./workflows/approval.yaml --silent # errors only
204
204
  spur workflow run ./workflows/approval.yaml --verbose # transitions + correlation diagnostics
205
205
  spur workflow run ./workflows/approval.yaml --detail minimal # tersest human output
206
206
  spur workflow run ./workflows/approval.yaml --trace-file # persist redacted JSONL trace
207
- spur workflow run ./workflows/approval.yaml --no-log # opt out of the run record .spur/run/<RUNID>.md + .state.json
207
+ spur workflow run ./workflows/approval.yaml --no-log # opt out of the run record .spur/memory/runs/<RUNID>.md + .state.json
208
208
  spur workflow run ./workflows/approval.yaml --steer # interactive steering on stdin
209
209
  ```
210
210
 
@@ -214,7 +214,7 @@ spur workflow run ./workflows/approval.yaml --steer # interactive
214
214
  per-step headers), `full` (transitions + correlation). `--verbose` is shorthand for `--detail full`.
215
215
  - **`--trace-file`** appends a redacted, schema-versioned JSONL trace under `.spur/workflow/`
216
216
  for post-run analysis - independent of human/JSON output.
217
- - **`--no-log`** opts out of writing the two-file run record (`.spur/run/<RUNID>.md` + `.state.json`).
217
+ - **`--no-log`** opts out of writing the two-file run record (`.spur/memory/runs/<RUNID>.md` + `.state.json`).
218
218
  By default the record is written **and retained** after the run ends; this flag skips it entirely
219
219
  (propagates to the `--async` detached worker). No `--keep-log` / delete-by-default exists.
220
220
  - **`--steer`** is synchronous and in-process: it cannot combine with `--json` or `--async` (exit `2`).
@@ -285,7 +285,7 @@ not advertise `--json-envelope` because its JSON projection is a kept-raw docume
285
285
  | `--verbose` | Include transitions and correlation diagnostics in human progress (implies `--detail full`). |
286
286
  | `--detail <level>` | Human detail level: `minimal`, `invocation` (default), or `full`. |
287
287
  | `--trace-file` | Append a redacted schema-versioned JSONL trace under `.spur/workflow/`. |
288
- | `--no-log` | Opt out of writing the two-file run record `.spur/run/<RUNID>.md` + `.state.json` (retained by default; propagates to `--async` workers). |
288
+ | `--no-log` | Opt out of writing the two-file run record `.spur/memory/runs/<RUNID>.md` + `.state.json` (retained by default; propagates to `--async` workers). |
289
289
  | `--steer` | Accept in-process steering commands on stdin at declared action boundaries (sync only; incompatible with `--json`/`--async`). |
290
290
 
291
291
  `validate` and `run` exit non-zero on failure (`run` exits non-zero when the final status is not
@@ -302,7 +302,7 @@ Follow a live run to terminal (human streaming mode):
302
302
  ```bash
303
303
  spur workflow trace <run-id> --follow # stream until terminal (default 1000ms poll)
304
304
  spur workflow trace <run-id> --follow --poll 500 # poll every 500ms
305
- spur workflow trace <run-id> --follow --output # stream .spur/run/<RUNID>.md instead of the DB timeline
305
+ spur workflow trace <run-id> --follow --output # stream .spur/memory/runs/<RUNID>.md instead of the DB timeline
306
306
  spur workflow trace <run-id> --follow --timeout 600000 # bound the watch; timeout → one checkpoint, run continues, exit 1
307
307
  ```
308
308
 
@@ -316,7 +316,7 @@ spur workflow trace <run-id> --follow --timeout 600000 # bound the watch; timeou
316
316
  status and exits `1`. A watch timeout never cancels or relaunches the run; resume by re-running the same
317
317
  follow command.
318
318
  - **`--output`** swaps the follow source from the structured DB timeline to the human run record
319
- (`.spur/run/<RUNID>.md`, tail -f equivalent), streaming new lines as they land and exiting at
319
+ (`.spur/memory/runs/<RUNID>.md`, tail -f equivalent), streaming new lines as they land and exiting at
320
320
  terminal status. A pre-0925 run with only a legacy `<RUNID>.log` is followed in place (read-only
321
321
  fallback). It requires `--follow` and a `run-id`, is a human stream (rejects `--json`), and is
322
322
  a **distinct source** — it never interleaves with the DB timeline. If no record file appears (e.g. the
@@ -360,15 +360,18 @@ redirecting `agent.run` stages (ADR-047).
360
360
 
361
361
  - **Stale-run finalization** (existing): bulk-finalizes orphaned `running`/`pending` runs as `failed`.
362
362
  `--older-than <minutes>` (default 30) and `--force` (all non-terminal regardless of age) apply here only.
363
- - **Run-log reclamation** (0429): removes retained `.spur/run/<RUNID>.log` files whose mtime is older
364
- than `workflow.logRetentionDays` in `.spur/config.yaml` (default 30 days; integer days, not minutes).
365
- Age is the only gate; best-effort deletes never abort the rest. Never touches
366
- `.spur/workflow/<RUNID>.jsonl` or `*-partial.md`. Scope stays legacy `.log` names only (0925 R4):
367
- the two-file record (`.md` + `.state.json`) is not reclaimed until a pair retention policy exists.
368
- - **`--logs`** scopes to log reclamation only (skips stale-run finalization). `--dry-run` applies to
369
- both scopes (lists what would be removed, writes nothing). `--json` returns
370
- `{ olderThanMinutes, dryRun, cleaned, logs: { retentionDays, dryRun, reclaimed, failures } }` (with
371
- `--logs`, the reclamation object alone).
363
+ - **Run-log reclamation** (0429): removes expired `.log` files from `.spur/memory/runs/`
364
+ and legacy `.spur/run/`, using `workflow.logRetentionDays` (default 30 days). Non-terminal
365
+ runs, including paused/interrupted runs, are protected; ownership lookup failures preserve logs.
366
+ The two-file record (`.md` + `.state.json`) and partial handoffs are retained.
367
+ - **Checkpoint reclamation**: removes expired terminal checkpoints only when confinement,
368
+ metadata and run-ownership guards pass. Recoverable runs remain protected.
369
+ - **Migration** (E71): verified lasting scratch data is preserved and references redirected before
370
+ reclamation. Unsettled imports, live dependencies, malformed files and conflicts retain their sources.
371
+ - **`--logs`** scopes to log reclamation and its migration (skips stale-run finalization and
372
+ checkpoint reclamation). `--dry-run` reports without copying or deleting. `--json` returns
373
+ `{ olderThanMinutes, dryRun, cleaned, logs, checkpoints, migration }`; with `--logs`, it returns
374
+ `{ retentionDays, dryRun, reclaimed, failures, migration }`.
372
375
 
373
376
  ## Behavior
374
377
 
@@ -206,6 +206,8 @@ section adds what that table has no room for: per-file content summaries and ite
206
206
  step (glossary, config companions).** Read Step routing to find "which file for step X"; read below
207
207
  for "what's actually in file Y" or for resources that sit outside the step sequence.
208
208
 
209
+ - Job transfer: [dump/resume](references/dev-operations.md#11a-job-dump).
210
+
209
211
  - [references/glossary.md](references/glossary.md) — sp's own vocabulary: spine, competency, facade,
210
212
  corpus, gate, verdict, noun/verb, half, HITL, WBS, section-write contract — canonical term +
211
213
  Avoid list. Owns term definitions only; `cross-cutting.md` owns the process rules that use them.
@@ -125,7 +125,7 @@ Any of the four may additionally carry a **bracket tag** in any position — `[d
125
125
  `Scenario: [advisory] Foo`. Tags are stripped before matching (0398 R7), so tagging never breaks
126
126
  the linkage.
127
127
 
128
- Task-side, `verify-answer-lint` additionally accepts a fifth declared id source — a **bold-trajectory
128
+ Task-side, the `spur task verdict` answer lint additionally accepts a fifth declared id source — a **bold-trajectory
129
129
  paragraph**: a whole-line `**AC id…**` paragraph inside the task's `### Acceptance Criteria`
130
130
  block (task 0817 R3). The id up to its first `:` and the paragraph's full spelling are both
131
131
  declared; two bold spans on one line are not a declaration (an interpolated bold id stays
@@ -141,7 +141,7 @@ unmatchable):
141
141
 
142
142
  ### A bullet's bold head is its id
143
143
 
144
- `verify-answer-lint` declares the bold span of a single-line criterion bullet
144
+ The `spur task verdict` answer lint declares the bold span of a single-line criterion bullet
145
145
  (`- **AC2 — The roster runtime is gone (R3).** Given …, when …, then …`) and its head before the
146
146
  first ` — ` or `:` — so answer rows may key `AC2` or `AC2 — The roster runtime is gone (R3).`. Keep
147
147
  at least one answer row keyed to the verbatim feature scenario title the task graduates, and keep
@@ -222,7 +222,8 @@ Use the canonical BDD template at `templates/bdd/gherkin.md`. Key rules:
222
222
  ```
223
223
 
224
224
  Every inventory item without a `[deferred: ...]` marker must be covered by at least one
225
- scenario — `idea-coverage-check` measures this at the idea-pipeline's ac-generate boundary.
225
+ scenario — the `feature check --inventory` gate (inventory-coverage finding) measures this at
226
+ the idea-pipeline's ac-generate boundary.
226
227
 
227
228
  Avoid:
228
229
 
@@ -22,7 +22,7 @@ not redefine it.
22
22
  > precedence chain, and the `implementAgent` override.** Every other reference (flag-glossary,
23
23
  > execution-workflow, execution-batch, dev-operations, cmd_agent, cmd_workflow) links here and
24
24
  > does not restate the contract. The value table below is authoritative; parity with it is
25
- > enforced by `validate-flag-contracts.ts` (C3a/C3b).
25
+ > enforced by `scripts/commands/validate-flag-contracts.ts` (C3a/C3b).
26
26
 
27
27
  ### The one rule
28
28
 
@@ -135,7 +135,9 @@ workflow run` and never redirect silently to `agent.default`. Interactive **omit
135
135
  **host-controlled and non-subprocess**, but no longer guarantees host-context execution for every
136
136
  model stage (task 0508): an eligible `agent.run` stage — pure-slash input, non-interactive state,
137
137
  native subagent with shared-worktree read/write/shell capability, and a task above the
138
- `estimate_hours` dispatch floor (2026-09-15 subagent-dispatch evaluation; the floor and the
138
+ `estimate_hours` dispatch floor — a small, non-sensitive triage diffstat
139
+ (`.spur/run/<wbs>-diffstat.json`, verify only) keeps that stage host-inline (2026-09-15
140
+ subagent-dispatch evaluation; the floor and the
139
141
  resume-over-re-dispatch rule for worker-role continuation stages are owned by
140
142
  [inline-pipeline-driver.md](inline-pipeline-driver.md)) — dispatches **once** to that
141
143
  native subagent and joins before the driver continues; any pre-dispatch eligibility failure falls
@@ -289,8 +291,8 @@ Never edit a task or feature file directly. Every mutation goes through:
289
291
 
290
292
  The interactive `--next` step-chain (`dev-refine → dev-run → dev-verify → done`) moves a task's
291
293
  status with `spur task update <wbs> <status>` **without `--no-lifecycle`**, so the lifecycle guards
292
- run: `wip → testing` invokes `spur task check`, `testing → done` invokes
293
- `spur task check --strict-core`. A guard failure **stops the chain as review-pending** — leave the
294
+ run: `wip → testing` invokes `spur task check --as testing`, `testing → done` invokes
295
+ `spur task check --as done`. A guard failure **stops the chain as review-pending** — leave the
294
296
  task at its current status, surface the blocking finding, do not advance. This is the gate that
295
297
  keeps a malformed task out of `testing`/`done`.
296
298
 
@@ -455,7 +457,7 @@ Seven non-negotiable invariants for the spur-dev lifecycle. These are laws, not
455
457
  violation is a defect in the run, not a style choice. Every competency skill and the spine consume
456
458
  them; they live here because they cross every phase boundary.
457
459
 
458
- 1. **NEVER skip the verification gate.** A task is not done until `spur task check <wbs> --strict-core`
460
+ 1. **NEVER skip the verification gate.** A task is not done until `spur task check <wbs> --as done`
459
461
  returns PASS and every AC scenario has a corresponding verify command that exited 0. "I tested it
460
462
  manually" is not verification evidence.
461
463
  2. **NEVER write to task/feature corpus outside the `spur` CLI.** Direct file edits to
@@ -463,7 +465,7 @@ them; they live here because they cross every phase boundary.
463
465
  under `.spur/memory/`. Every other mutation goes through `spur task` / `spur feature` so the
464
466
  schema, matrix, and traceability guards run.
465
467
  3. **NEVER mark a task done without a PASS verdict.** `testing → done` requires
466
- `spur task check --strict-core` PASS and a recorded verdict. PARTIAL or FAIL verdicts leave the
468
+ `spur task check --as done` PASS and a recorded verdict. PARTIAL or FAIL verdicts leave the
467
469
  task at `testing` and surface to the operator.
468
470
  4. **NEVER proceed past a failed gate without explicit operator approval.** A failed
469
471
  `feature-check`, `batch-create`, `precheck`, `review`, or `verify` stops the run. The operator
@@ -783,10 +785,12 @@ The Design Approval Gate is the taste gate between system design and decompositi
783
785
  **Auto-mode behavior:**
784
786
 
785
787
  - `--auto` routes around taste HITL states BEFORE entry only when the matching pre-clear vars are
786
- true. CLI **`--approve-taste`** (idea + plan) sets `design_approved=true` and, on the idea path,
787
- also `idea_approved=true`. Aliases: `--design-approved` / `--idea-approved` set one var each.
788
- - Without explicit prior approval, `--auto` still pauses at idea-eval and design-approval — taste
789
- gates are not auto-clicked (Auto-Decision Principle #5).
788
+ true. On the planning commands (`dev-idea`, `dev-plan`) CLI **`--auto`** sets `profile=auto`,
789
+ `design_approved=true`, and `idea_approved=true` — the planning exception to Auto-Decision
790
+ Principle #5 (reversible corpus writes; see flag-glossary `--auto`).
791
+ - The bypass still follows the evidence: idea-eval continues only on a `proceed`/`reshape`
792
+ recommendation (`drop` cancels, missing pauses) and design-approval only on a PASS design check.
793
+ Direct `spur workflow run` callers that leave the pre-clear vars `false` keep both taste pauses.
790
794
  - The brainstorm design summary is ALWAYS recorded, regardless of `--auto` — `--auto` does not
791
795
  bypass the "nothing is too simple" pattern.
792
796