@gobing-ai/spur 0.3.91 → 0.3.92

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 (120) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/pipeline-budgets.json +2 -2
  3. package/config/plugin-scripts.json +17 -1
  4. package/config/workflows/feature-lifecycle.yaml +14 -5
  5. package/config/workflows/feature-verification.yaml +35 -27
  6. package/config/workflows/history-anatomy.yaml +14 -25
  7. package/config/workflows/idea-pipeline.yaml +9 -5
  8. package/config/workflows/task-pipeline.yaml +185 -4
  9. package/config/workflows/wrapup-pipeline.yaml +47 -5
  10. package/package.json +9 -9
  11. package/plugins/sp/agents/super-planner.md +14 -5
  12. package/plugins/sp/commands/dev-dogfood.md +4 -4
  13. package/plugins/sp/commands/dev-fixall.md +8 -5
  14. package/plugins/sp/commands/dev-run.md +6 -0
  15. package/plugins/sp/commands/dev-runall.md +12 -6
  16. package/plugins/sp/commands/dev-verify.md +9 -0
  17. package/plugins/sp/commands/dev-verifyall.md +5 -0
  18. package/plugins/sp/lib/idea-handoff.generated.mjs +301 -300
  19. package/plugins/sp/lib/inline-run.generated.d.mts +17 -0
  20. package/plugins/sp/lib/inline-run.generated.mjs +1460 -0
  21. package/plugins/sp/plugin.json +1 -1
  22. package/plugins/sp/references/environment-lens.md +1 -1
  23. package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +136 -0
  24. package/plugins/sp/scripts/dogfood-testing/validate-report.ts +196 -2
  25. package/plugins/sp/scripts/feature-verification-steps.mjs +174 -0
  26. package/plugins/sp/scripts/feature-verification-steps.ts +275 -0
  27. package/plugins/sp/scripts/history-anatomy-cache.mjs +104 -4
  28. package/plugins/sp/scripts/history-anatomy-cache.ts +137 -13
  29. package/plugins/sp/scripts/inline-pipeline-parity-check.ts +1 -0
  30. package/plugins/sp/scripts/inline-run-setup.mjs +349 -0
  31. package/plugins/sp/scripts/inline-run-setup.ts +192 -75
  32. package/plugins/sp/scripts/record-feature-sync.mjs +63 -0
  33. package/plugins/sp/scripts/record-feature-sync.ts +84 -0
  34. package/plugins/sp/scripts/residual-scan.mjs +476 -0
  35. package/plugins/sp/scripts/residual-scan.ts +614 -0
  36. package/plugins/sp/scripts/task-evidence-precheck.ts +8 -3
  37. package/plugins/sp/scripts/task-size-precheck.ts +8 -3
  38. package/plugins/sp/skills/branch-workflow/SKILL.md +1 -0
  39. package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +2 -0
  40. package/plugins/sp/skills/code-implementation/SKILL.md +17 -0
  41. package/plugins/sp/skills/code-verification/SKILL.md +21 -0
  42. package/plugins/sp/skills/code-verification/references/verdict-schema.md +1 -0
  43. package/plugins/sp/skills/dogfood-testing/SKILL.md +5 -3
  44. package/plugins/sp/skills/dogfood-testing/references/monitor-ledger.md +63 -26
  45. package/plugins/sp/skills/dogfood-testing/references/report-template.md +33 -10
  46. package/plugins/sp/skills/history-anatomy/references/modes.md +5 -3
  47. package/plugins/sp/skills/next-feature/references/ranking-rubric.md +1 -1
  48. package/plugins/sp/skills/next-router/references/routing-table.md +7 -0
  49. package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
  50. package/plugins/sp/skills/session-review/SKILL.md +12 -2
  51. package/plugins/sp/skills/spur-cli/references/features.md +1 -1
  52. package/plugins/sp/skills/spur-cli/references/projects.md +3 -1
  53. package/plugins/sp/skills/spur-cli/references/workflows.md +39 -19
  54. package/plugins/sp/skills/spur-dev/SKILL.md +11 -4
  55. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +4 -1
  56. package/plugins/sp/skills/spur-dev/references/dev-operations.md +2 -2
  57. package/plugins/sp/skills/spur-dev/references/execution-batch.md +285 -57
  58. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
  59. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +19 -4
  60. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +43 -16
  61. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +5 -0
  62. package/spur.js +21827 -19615
  63. package/web/_astro/BoardApp.CerSBgis.js +192 -0
  64. package/web/_astro/BoardApp.eoTz0pZs.js +1 -0
  65. package/web/_astro/{TaskDetail.CXGltuT_.js → TaskDetail.DCqiC-OZ.js} +1 -1
  66. package/web/_astro/arc.CPwg6Rw0.js +1 -0
  67. package/web/_astro/{architectureDiagram-3BPJPVTR.DJ8DHkWE.js → architectureDiagram-3BPJPVTR.DM_vp_hO.js} +1 -1
  68. package/web/_astro/{blockDiagram-GPEHLZMM.D8DHK3Jl.js → blockDiagram-GPEHLZMM.DXVIiv0p.js} +1 -1
  69. package/web/_astro/{c4Diagram-AAUBKEIU.BugQbX9u.js → c4Diagram-AAUBKEIU.BbF_zCxW.js} +1 -1
  70. package/web/_astro/channel.MYZLKNwy.js +1 -0
  71. package/web/_astro/{chunk-2J33WTMH.Mv26KlVn.js → chunk-2J33WTMH.CAgQHpPC.js} +1 -1
  72. package/web/_astro/{chunk-4BX2VUAB.CD51JoT_.js → chunk-4BX2VUAB.BN-5tpw4.js} +1 -1
  73. package/web/_astro/{chunk-55IACEB6.D_PFaIEe.js → chunk-55IACEB6.CnPkEEr0.js} +1 -1
  74. package/web/_astro/{chunk-727SXJPM.DemMW1ao.js → chunk-727SXJPM.BQzQeMVm.js} +4 -4
  75. package/web/_astro/{chunk-AQP2D5EJ.Iu2V5-ex.js → chunk-AQP2D5EJ.B6xNyDnL.js} +1 -1
  76. package/web/_astro/{chunk-FMBD7UC4.MsNgSP-E.js → chunk-FMBD7UC4.C7f9Ih78.js} +1 -1
  77. package/web/_astro/{chunk-ND2GUHAM.DfbRaAlm.js → chunk-ND2GUHAM.CNV1dFXT.js} +1 -1
  78. package/web/_astro/{chunk-QZHKN3VN.BbJAQ4h-.js → chunk-QZHKN3VN.Cudn2TkJ.js} +1 -1
  79. package/web/_astro/{classDiagram-4FO5ZUOK.CPurtiC2.js → classDiagram-4FO5ZUOK.D1NwP50q.js} +1 -1
  80. package/web/_astro/{classDiagram-v2-Q7XG4LA2.CPurtiC2.js → classDiagram-v2-Q7XG4LA2.D1NwP50q.js} +1 -1
  81. package/web/_astro/{cose-bilkent-S5V4N54A.CKKdx1bM.js → cose-bilkent-S5V4N54A.B1wSL-Xb.js} +1 -1
  82. package/web/_astro/{cynefin-OW5HDTMX.CoKMTg-R.js → cynefin-OW5HDTMX.BmK52w8G.js} +1 -1
  83. package/web/_astro/{dagre-BM42HDAG.D4h4_k56.js → dagre-BM42HDAG.Bfy5CTDT.js} +2 -2
  84. package/web/_astro/diagram-2AECGRRQ.DhNnvUvX.js +43 -0
  85. package/web/_astro/diagram-5GNKFQAL.lTX5KwnS.js +10 -0
  86. package/web/_astro/{diagram-KO2AKTUF.BFoCkiCr.js → diagram-KO2AKTUF.CW_vMJ4z.js} +3 -3
  87. package/web/_astro/{diagram-LMA3HP47.exHn9OVx.js → diagram-LMA3HP47.B_8ZGF67.js} +1 -1
  88. package/web/_astro/{diagram-OG6HWLK6.CeqO34nN.js → diagram-OG6HWLK6.BppnHsdS.js} +1 -1
  89. package/web/_astro/{erDiagram-TEJ5UH35.D_v7HqxR.js → erDiagram-TEJ5UH35.BEuHXcjJ.js} +5 -5
  90. package/web/_astro/{flowDiagram-I6XJVG4X.EUmrpbwh.js → flowDiagram-I6XJVG4X.CH-UlnGr.js} +4 -4
  91. package/web/_astro/{ganttDiagram-6RSMTGT7.BOCF5lII.js → ganttDiagram-6RSMTGT7.BO81S85v.js} +1 -1
  92. package/web/_astro/{gitGraphDiagram-PVQCEYII.Di7otYZD.js → gitGraphDiagram-PVQCEYII.XnPxPPZN.js} +1 -1
  93. package/web/_astro/index.Hjbr15fG.css +1 -0
  94. package/web/_astro/{infoDiagram-5YYISTIA.TcBkCAJk.js → infoDiagram-5YYISTIA.JyjYRu_T.js} +1 -1
  95. package/web/_astro/{ishikawaDiagram-YF4QCWOH.D-2y4M0c.js → ishikawaDiagram-YF4QCWOH.BBRBF-Fo.js} +5 -5
  96. package/web/_astro/{journeyDiagram-JHISSGLW.DPbJI_n2.js → journeyDiagram-JHISSGLW.C_iymSyp.js} +1 -1
  97. package/web/_astro/{kanban-definition-UN3LZRKU.EFxhQ9Fj.js → kanban-definition-UN3LZRKU.DdfW-Oqt.js} +7 -7
  98. package/web/_astro/{linear.DSAsQLzs.js → linear.C2_IkbZT.js} +1 -1
  99. package/web/_astro/mermaid.core.GAOYeSR0.js +303 -0
  100. package/web/_astro/{mindmap-definition-RKZ34NQL.CJY1N_7V.js → mindmap-definition-RKZ34NQL.DAZIxQSK.js} +2 -2
  101. package/web/_astro/{pieDiagram-4H26LBE5.567ZNoL2.js → pieDiagram-4H26LBE5.CN8sIhKM.js} +3 -3
  102. package/web/_astro/{quadrantDiagram-W4KKPZXB.mqfz9-MY.js → quadrantDiagram-W4KKPZXB.3dGcX5GP.js} +1 -1
  103. package/web/_astro/{requirementDiagram-4Y6WPE33.Bv1Gv9In.js → requirementDiagram-4Y6WPE33.BV2y4dd6.js} +3 -3
  104. package/web/_astro/{sankeyDiagram-5OEKKPKP.B6Gs4X4r.js → sankeyDiagram-5OEKKPKP.Cqo15Tvo.js} +4 -4
  105. package/web/_astro/{sequenceDiagram-3UESZ5HK.BhYj4v-m.js → sequenceDiagram-3UESZ5HK.CROCPMJB.js} +1 -1
  106. package/web/_astro/{stateDiagram-AJRCARHV.BPbBnkpw.js → stateDiagram-AJRCARHV.RfXZrkFE.js} +1 -1
  107. package/web/_astro/{stateDiagram-v2-BHNVJYJU.C4squMNK.js → stateDiagram-v2-BHNVJYJU.CPXmbBs9.js} +1 -1
  108. package/web/_astro/{timeline-definition-PNZ67QCA.C_SwIHgl.js → timeline-definition-PNZ67QCA.DdgKTiO8.js} +3 -3
  109. package/web/_astro/{vennDiagram-CIIHVFJN.Bz4NZGpQ.js → vennDiagram-CIIHVFJN.CPNVSHF1.js} +5 -5
  110. package/web/_astro/{wardleyDiagram-YWT4CUSO.CozMVZ3i.js → wardleyDiagram-YWT4CUSO.CQhA0Jyr.js} +3 -3
  111. package/web/_astro/{xychartDiagram-2RQKCTM6.BwMGBwjB.js → xychartDiagram-2RQKCTM6.n61BWyy4.js} +1 -1
  112. package/web/index.html +2 -2
  113. package/web/_astro/BoardApp.BEDWpzsr.js +0 -188
  114. package/web/_astro/BoardApp.DQG2xfEz.js +0 -1
  115. package/web/_astro/arc.C0rrflm_.js +0 -1
  116. package/web/_astro/channel.SRrg1P-w.js +0 -1
  117. package/web/_astro/diagram-2AECGRRQ.DJ0h9zgw.js +0 -43
  118. package/web/_astro/diagram-5GNKFQAL.DvPk1jYd.js +0 -10
  119. package/web/_astro/index.Bx6GY4RH.css +0 -1
  120. package/web/_astro/mermaid.core.kAZjgJHG.js +0 -301
@@ -23,7 +23,7 @@ the resolved actions and guards of every `.spur/workflows/*.yaml`; any element p
23
23
  in one and absent in the other fails the check. Add a new kind here when the driver
24
24
  implements it; remove the entry when the corresponding kind is dropped from the YAML.
25
25
 
26
- **Actions:** `shell` · `note` · `doctor.probe` · `file.read.into-var` · `hitl.confirm` · `hitl.select` · `agent.run` · `proof.fingerprint` · `run.artifact` · `command.gate`
26
+ **Actions:** `shell` · `note` · `doctor.probe` · `file.read.into-var` · `hitl.confirm` · `hitl.input` · `hitl.select` · `agent.run` · `proof.fingerprint` · `run.artifact` · `command.gate`
27
27
 
28
28
  **Guards (transitions):** `always` · `shell` · `action-ok` · `contract-violation`
29
29
 
@@ -39,8 +39,8 @@ interactive `/sp:dev-run --mode full`, sequential `/sp:dev-runall`, `/sp:dev-ide
39
39
  `--agent auto`, parallel batch mode, `spur workflow run`, and `spur agent run` keep the existing
40
40
  subprocess path.
41
41
 
42
- The selected project runtime definition — `task-pipeline.yaml` or `idea-pipeline.yaml`, resolved through the two-tier
43
- project→bundled model (task 0648/0650, never an unbundled runtime path) — remains the sole
42
+ The selected project runtime definition — `task-pipeline.yaml` or `idea-pipeline.yaml`, resolved through the
43
+ project→registered→shared model (ADR-113) — remains the sole
44
44
  FSM definition. The driver MUST read that file
45
45
  at invocation time. It must not copy the state list, actions, guards, or transition order into a
46
46
  command, skill, script, or second workflow.
@@ -69,23 +69,31 @@ the human/native presentation layer — labels are display addresses only, never
69
69
  1. Resolve the command inputs, `--auto`, and any explicit `--vars` — **without reading the selected
70
70
  YAML yet**. An explicit non-inline executor selection chooses the subprocess workflow path.
71
71
  2. Allocate a collision-resistant inline run id (`uuidgen`, with a timestamp/pid fallback), create
72
- `.spur/run/`, and use `.spur/run/<run-id>.log` as the run log.
72
+ `.spur/run/`, and use the two-file run record (task 0927) — append lines to
73
+ `.spur/run/<run-id>.md` and read machine state from `.spur/run/<run-id>.state.json`.
73
74
  3. **Authoritative run identity (task 0804 R1, fail-closed).** Persist the run row through the
74
75
  internal delegate before any stage executes — this is what makes bound `run.artifact` record
75
76
  accept the inline run (0785 R3):
76
77
 
77
78
  ```bash
78
79
  SETUP_SCRIPT="plugins/sp/scripts/inline-run-setup.ts";
79
- [ -f "$SETUP_SCRIPT" ] || SETUP_SCRIPT="$(superskill script path sp inline-run-setup.ts 2>/dev/null)";
80
+ [ -f "$SETUP_SCRIPT" ] || SETUP_SCRIPT="$(superskill script path sp inline-run-setup.mjs 2>/dev/null)";
80
81
  [ -n "$SETUP_SCRIPT" ] && [ -f "$SETUP_SCRIPT" ] && \
81
82
  bun "$SETUP_SCRIPT" --run-id "$RUN_ID" --file <selected-pipeline-yaml> \
82
83
  || { echo "inline run setup failed closed — checker not found; run 'superskill install sp'" >&2; exit 1; }
83
84
  ```
84
85
 
85
- The delegate resolves the app service from the SPUR_BIN chain, creates-or-attaches the row,
86
- and writes `.spur/run/<run-id>-inline-setup.json`. Seed `__runId` and `__definitionDigest`
87
- from that file so proof capture and bound registration verify against the persisted identity.
88
- A non-zero exit (missing row identity, changed definition, bundle-only install) stops the run —
86
+ The delegate uses the source app service when the SPUR_BIN chain identifies a checkout;
87
+ otherwise it loads the generated application bundle shipped with the plugin. Both setup paths
88
+ obtains the selected definition from the existing CLI `workflow show --format todo --json`
89
+ projection and revalidates its schema/name/digest before preserving its source layer.
90
+ Both paths create-or-attach the row,
91
+ and writes the run-record state `.spur/run/<run-id>.state.json` plus the `.md` run-start
92
+ header (task 0927; a legacy pre-0927 run keeps its `<run-id>-inline-setup.json` sidecar).
93
+ Seed `__runId` and `__definitionDigest`
94
+ from that state so proof capture and bound registration verify against the persisted identity.
95
+ Bun remains required for SQLite; the Node-runnable installed twin re-enters Bun on PATH.
96
+ A non-zero exit (missing runtime/bundle, invalid projection, missing row identity, changed definition) stops the run —
89
97
  never continue unbound and never fabricate a PASS. (The delegate persists the authoritative
90
98
  RUN row only — the 0808 inline record is the registration-equivalent convention below, not a
91
99
  setup-time artifact-ledger insert.)
@@ -236,10 +244,19 @@ Action semantics come from the YAML and the workflow action contract:
236
244
  actions/guards.
237
245
  - `hitl.confirm` — under `profile=auto`, follow the YAML's auto-skip transition. Otherwise pause,
238
246
  surface the prompt, and resume from the same state with the operator's answer.
247
+ - `hitl.input` — pause, surface the declared prompt (the agent's operator question, 0933), and
248
+ resume from the same state with the operator's answer written into the declared var (default
249
+ `__hitlInput`); the subsequent guards route on answer presence exactly as the engine does.
250
+ **Host-session exception (0933 R5):** because a host session can talk to the operator
251
+ directly, do NOT pause the run at `hitl.input` — ask the question in the session, write the
252
+ answer into the declared var, and continue. The same 2-escalation bound applies: after the
253
+ bound the ask routes to `failed` like the engine does.
239
254
  - `agent.run` — execute the action's input in the host session. Task execution may use the native
240
255
  subagent eligibility below; idea/plan never dispatch a native subagent unless the operator
241
256
  explicitly requested delegation. Do not call `spur agent run` or re-enter a full pipeline. Preserve the YAML options: capture
242
- `answerFile`; assert `expectFile`; enforce `requireDiff` against a pre-action git snapshot,
257
+ `answerFile`; assert `expectFile`; honor `escalationFile` (a non-empty file after exit 0 means
258
+ the agent paused on an operator question — treat the attempt as succeeded-with-escalation and
259
+ skip `requireDiff` for that attempt only); enforce `requireDiff` against a pre-action git snapshot,
243
260
  including the task-scope guard; honor declared error policy. `timeoutMs` is recorded as not
244
261
  applicable because the host session has no independent kill boundary.
245
262
  - `run.artifact` — the engine's ledger registration has **no inline execution surface** (0808 R4).
@@ -253,13 +270,14 @@ Action semantics come from the YAML and the workflow action contract:
253
270
  and pass the same `--feature-file` the run folded in — omitting it, or running from elsewhere,
254
271
  yields a different digest and the mismatch surfaces later as a refused `run.artifact`
255
272
  registration — and the run-scoped review-completion marker exists — then appends one provenance
256
- line to `.spur/run/<run-id>.log` naming the equivalence (artifact kind, path, verdict, digest) and
273
+ line to `.spur/run/<run-id>.md` naming the equivalence (artifact kind, path, verdict, digest) and
257
274
  proceeds to `spur task record`. A failed validation stops at the state and follows the failure
258
275
  contract; the step is never silently skipped. Artifact-provenance consumers read that run-log
259
276
  line on the inline path — there is no ledger row. The validation also includes **run/definition
260
277
  identity agreement from authoritative evidence** (task 0809 R4): the verdict's `proof.runId` and
261
- `proof.definitionDigest` must agree with the setup artifact `.spur/run/<run-id>-inline-setup.json`
262
- and the persisted run row; if that identity is absent or conflicts, STOP — recreating a row is
278
+ `proof.definitionDigest` must agree with the run-record state `.spur/run/<run-id>.state.json`
279
+ (legacy pre-0927 runs: `<run-id>-inline-setup.json`) and the persisted run row; if that identity
280
+ is absent or conflicts, STOP — recreating a row is
263
281
  not a diagnostic operation. The app-service bound-artifact fixture (which writes a real engine
264
282
  ledger row) is service-level test evidence for this identity mechanics, not evidence that the
265
283
  inline host writes a ledger.
@@ -369,6 +387,14 @@ A behavioral AC marked MET requires executable evidence (test | command);
369
387
  static-ref or llm-judge alone cannot carry it.
370
388
  ```
371
389
 
390
+ **AC table shape (0948 R9).** The AC table must be exactly **4 columns** and **cell 3 must hold a
391
+ single evidence-type token** from the allowlist above. The token is *isolated* — never merged or
392
+ concatenated with another token or with prose (`static-reftest` is a lint failure, not a shorthand
393
+ for "static-ref + test"). Evidence detail belongs in cell 4. The verify-answer linter rejects a
394
+ merged token, and `spur task verdict` then derives the wrong artifact — this exact shape failed the
395
+ 0926 verify lint once before it was canonicalized, so it is stated here rather than left implicit in
396
+ the header row.
397
+
372
398
  **Review-stage artifact contract.** A review handoff carries the Review output contract owned by
373
399
  `plugins/sp/agents/super-reviewer.md` — native `P1 (blocker)` / `P2 (major)` / `P3 (minor)` /
374
400
  `P4 (advisory)` priority cells and section-relative headings — **not** the verify answer schema.
@@ -429,7 +455,7 @@ or an operator decision returns a blocker; the host pauses at the current state
429
455
  subagent cannot approve, infer consent, or recursively invoke the full pipeline.
430
456
 
431
457
  After every successful inline `agent.run` action append exactly one provenance line (inline or
432
- subagent form above) to `.spur/run/<run-id>.log`, where `<id>` is the current YAML state id. Also
458
+ subagent form above) to `.spur/run/<run-id>.md`, where `<id>` is the current YAML state id. Also
433
459
  log start/failure and the ignored timeout value so an inline run remains auditable without
434
460
  fabricating an `AgentRunTracedResult`.
435
461
 
@@ -441,7 +467,8 @@ in one file and makes the run unauditable (task 0726 mixed both forms).
441
467
 
442
468
  ## Structured trace emission (ADR-117, task 0868)
443
469
 
444
- `.spur/run/<run-id>.log` is a human convenience, **not the record of truth**. A run's
470
+ `.spur/run/<run-id>.md` is the human half of the two-file run record — evidence, **not the record
471
+ of truth**. A run's
445
472
  observability is a property of the run, so the inline driver owes the same structured trace the
446
473
  engine subprocess writes — and it owes it through the **same writer**, never a parallel
447
474
  implementation. The shared writer is `WorkflowActionTraceWriter`
@@ -482,7 +509,7 @@ The driver reaches it through the existing run delegate (`$SETUP_SCRIPT`,
482
509
  state is `done`; a run halted by a failing action under its error policy is `failed`.
483
510
 
484
511
  **Best-effort at the action boundary only (ADR-117).** An `--action` persistence failure is
485
- recorded — the delegate appends a `trace-emission-failed` line to `.spur/run/<run-id>.log` and
512
+ recorded — the delegate appends a `trace-emission-failed` line to `.spur/run/<run-id>.md` and
486
513
  prints `{"ok":false}` on stdout — and the run continues to its declared terminal state; the
487
514
  delegate exits `0` for that outcome and the driver must never treat an emission failure as a run
488
515
  failure, retry it in a loop, or substitute a hand-written row. The run-row closure (`--close`) is
@@ -277,6 +277,11 @@ design, plan, acceptance criteria, decisions, dependencies and premises present
277
277
  non-placeholder so `spur task check <wbs> --json` exits 0. Write planning sections only, through
278
278
  `spur task update <wbs> --section <Name> --from-file <file>` — never Solution, Testing, Review
279
279
  or History. Record one checklist row per id, with concrete evidence of how you verified it.
280
+ The `premises` row passes only when each material premise was read against the current tree:
281
+ identify each material premise in the task Background, open the cited file at the cited line and
282
+ confirm the claim, then record the evidence as verified `path:line` citations — handoff-finalize
283
+ lints the row and degrades the task to ready refine when the evidence carries no citation or
284
+ cites a missing file or an out-of-range line.
280
285
  Compute the planning digest with the project's own implementation when this is a monorepo
281
286
  checkout — resolve the file with `spur task path <wbs> --json`, then run:
282
287