@gobing-ai/spur 0.4.0 → 0.4.2

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 (172) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.global.yaml +4 -2
  3. package/config/decisions/gates.yaml +36 -0
  4. package/config/decisions/history-anatomy.yaml +35 -0
  5. package/config/decisions/idea-pipeline.yaml +38 -0
  6. package/config/plugin-scripts.json +15 -0
  7. package/config/rules/docs/sourced-api-claims.yaml +60 -0
  8. package/config/rules/recommended-pre-check.yaml +8 -3
  9. package/config/rules/structure/scratch-evidence-pointer.yaml +35 -0
  10. package/config/script-placement-baseline.json +2 -2
  11. package/config/templates/AGENTS.md +1 -1
  12. package/config/workflows/feature-lifecycle.yaml +9 -2
  13. package/config/workflows/history-anatomy.yaml +22 -0
  14. package/config/workflows/idea-pipeline.yaml +75 -0
  15. package/config/workflows/task-pipeline.yaml +216 -57
  16. package/config/workflows/wrapup-pipeline.yaml +107 -14
  17. package/package.json +10 -10
  18. package/plugins/sp/README.md +12 -3
  19. package/plugins/sp/agents/super-planner.md +16 -6
  20. package/plugins/sp/agents/super-reviewer.md +14 -0
  21. package/plugins/sp/bunfig.toml +8 -0
  22. package/plugins/sp/commands/dev-brainstorm.md +29 -16
  23. package/plugins/sp/commands/dev-find-way.md +80 -0
  24. package/plugins/sp/commands/dev-idea.md +6 -0
  25. package/plugins/sp/commands/dev-plan.md +6 -0
  26. package/plugins/sp/commands/dev-review-session.md +4 -1
  27. package/plugins/sp/commands/dev-run.md +12 -2
  28. package/plugins/sp/commands/dev-runall.md +32 -15
  29. package/plugins/sp/hooks/context-owner.ts +56 -0
  30. package/plugins/sp/hooks/context-post-tool.ts +23 -0
  31. package/plugins/sp/hooks/context-session-start.ts +49 -27
  32. package/plugins/sp/hooks/context-session-stop.ts +131 -30
  33. package/plugins/sp/hooks/pi/guard-extension.ts +21 -8
  34. package/plugins/sp/lib/idea-handoff.generated.mjs +43 -5
  35. package/plugins/sp/lib/inline-run-app.ts +28 -0
  36. package/plugins/sp/lib/inline-run.generated.d.mts +5 -0
  37. package/plugins/sp/lib/inline-run.generated.mjs +351 -46
  38. package/plugins/sp/lib/plan-projection.generated.d.mts +47 -0
  39. package/plugins/sp/lib/plan-projection.generated.mjs +368 -0
  40. package/plugins/sp/lib/quality-gate.generated.d.mts +35 -1
  41. package/plugins/sp/lib/quality-gate.generated.mjs +30296 -71
  42. package/plugins/sp/lib/residual-scan.generated.d.mts +19 -0
  43. package/plugins/sp/lib/residual-scan.generated.mjs +66 -0
  44. package/plugins/sp/lib/run-summary-core.ts +561 -0
  45. package/plugins/sp/lib/transcript.ts +150 -7
  46. package/plugins/sp/plugin.json +1 -1
  47. package/plugins/sp/references/roles.md +1 -1
  48. package/plugins/sp/scripts/batch-plan.mjs +488 -0
  49. package/plugins/sp/scripts/batch-plan.ts +145 -0
  50. package/plugins/sp/scripts/batch-preflight.mjs +51 -3
  51. package/plugins/sp/scripts/batch-preflight.ts +72 -1
  52. package/plugins/sp/scripts/commit-guard.mjs +216 -0
  53. package/plugins/sp/scripts/commit-guard.ts +249 -0
  54. package/plugins/sp/scripts/inline-run-dispatch.mjs +130 -0
  55. package/plugins/sp/scripts/inline-run-dispatch.ts +135 -0
  56. package/plugins/sp/scripts/inline-run-setup.mjs +562 -80
  57. package/plugins/sp/scripts/inline-run-setup.ts +52 -78
  58. package/plugins/sp/scripts/persist-out-check.mjs +90 -41
  59. package/plugins/sp/scripts/persist-out-check.ts +112 -57
  60. package/plugins/sp/scripts/pr-reviewing.mjs +19 -5
  61. package/plugins/sp/scripts/pr-reviewing.ts +34 -9
  62. package/plugins/sp/scripts/quality-gate.mjs +30213 -61
  63. package/plugins/sp/scripts/quality-gate.ts +21 -5
  64. package/plugins/sp/scripts/residual-scan.mjs +86 -31
  65. package/plugins/sp/scripts/residual-scan.ts +28 -30
  66. package/plugins/sp/scripts/run-summary.mjs +432 -14
  67. package/plugins/sp/scripts/run-summary.ts +41 -177
  68. package/plugins/sp/scripts/session-timeline.mjs +109 -11
  69. package/plugins/sp/scripts/session-timeline.ts +57 -19
  70. package/plugins/sp/scripts/task-diffstat.mjs +32 -29
  71. package/plugins/sp/scripts/task-diffstat.ts +34 -34
  72. package/plugins/sp/scripts/wrapup-steps.mjs +150 -2
  73. package/plugins/sp/scripts/wrapup-steps.ts +203 -1
  74. package/plugins/sp/skills/brainstorm/SKILL.md +9 -47
  75. package/plugins/sp/skills/branch-workflow/SKILL.md +1 -0
  76. package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +1 -0
  77. package/plugins/sp/skills/code-implementation/SKILL.md +48 -1
  78. package/plugins/sp/skills/code-verification/SKILL.md +3 -4
  79. package/plugins/sp/skills/code-verification/references/secu-review.md +3 -0
  80. package/plugins/sp/skills/code-verification/references/verdict-schema.md +68 -0
  81. package/plugins/sp/skills/fleet-join/SKILL.md +1 -1
  82. package/plugins/sp/skills/indexed-context/SKILL.md +14 -7
  83. package/plugins/sp/skills/parallel-execution/SKILL.md +2 -2
  84. package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
  85. package/plugins/sp/skills/parallel-execution/references/fan-out-patterns.md +2 -2
  86. package/plugins/sp/skills/pr-reviewing/SKILL.md +7 -3
  87. package/plugins/sp/skills/session-review/SKILL.md +40 -7
  88. package/plugins/sp/skills/source-driven-development/SKILL.md +5 -0
  89. package/plugins/sp/skills/spec-decomposition/references/decomposition.md +5 -3
  90. package/plugins/sp/skills/spur-cli/SKILL.md +5 -2
  91. package/plugins/sp/skills/spur-cli/references/agent.md +20 -15
  92. package/plugins/sp/skills/spur-cli/references/decision.md +16 -8
  93. package/plugins/sp/skills/spur-cli/references/message.md +7 -7
  94. package/plugins/sp/skills/spur-cli/references/projects.md +7 -5
  95. package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +19 -3
  96. package/plugins/sp/skills/spur-cli/references/tasks.md +10 -7
  97. package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +7 -0
  98. package/plugins/sp/skills/spur-cli/references/workflows.md +7 -2
  99. package/plugins/sp/skills/spur-composer/SKILL.md +1 -1
  100. package/plugins/sp/skills/spur-dev/SKILL.md +20 -14
  101. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +33 -3
  102. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +49 -14
  103. package/plugins/sp/skills/spur-dev/references/dev-operations.md +37 -17
  104. package/plugins/sp/skills/spur-dev/references/execution-batch-continuation.md +68 -0
  105. package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +199 -0
  106. package/plugins/sp/skills/spur-dev/references/execution-batch.md +156 -1024
  107. package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +133 -0
  108. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +6 -0
  109. package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +471 -0
  110. package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +379 -0
  111. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +44 -12
  112. package/plugins/sp/skills/spur-dev/references/glossary.md +2 -2
  113. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +340 -165
  114. package/plugins/sp/skills/spur-dev/references/structured-trace-emission.md +178 -0
  115. package/plugins/sp/skills/wayfinder/SKILL.md +10 -14
  116. package/schemas/state-machine-workflow.schema.json +23 -0
  117. package/spur.js +42402 -26889
  118. package/web/_astro/{BoardApp.VeoxxLBy.js → BoardApp.B3GQZvj8.js} +1 -1
  119. package/web/_astro/BoardApp.BT7L2kSb.js +324 -0
  120. package/web/_astro/TaskDetail.Cxov1_N_.js +1 -0
  121. package/web/_astro/{arc.f4e0OYLg.js → arc.vaT7tPOB.js} +1 -1
  122. package/web/_astro/{architectureDiagram-3BPJPVTR.SSIvxi-Z.js → architectureDiagram-3BPJPVTR.DRMmTjkN.js} +1 -1
  123. package/web/_astro/{blockDiagram-GPEHLZMM.DSXIHOFf.js → blockDiagram-GPEHLZMM.cla0LO_q.js} +1 -1
  124. package/web/_astro/{c4Diagram-AAUBKEIU.DG9Ubu85.js → c4Diagram-AAUBKEIU.D4YAIBKn.js} +1 -1
  125. package/web/_astro/channel.D4nG9YLf.js +1 -0
  126. package/web/_astro/{chunk-2J33WTMH.C7QU88Qh.js → chunk-2J33WTMH.BrSJbMRZ.js} +1 -1
  127. package/web/_astro/{chunk-4BX2VUAB.26Z94xBj.js → chunk-4BX2VUAB.CuLMgKF5.js} +1 -1
  128. package/web/_astro/{chunk-55IACEB6.DYRiBkqw.js → chunk-55IACEB6.zkvgu54F.js} +1 -1
  129. package/web/_astro/{chunk-727SXJPM.D5Vfv5pe.js → chunk-727SXJPM.DxWkACh8.js} +1 -1
  130. package/web/_astro/{chunk-AQP2D5EJ.DXHV47bN.js → chunk-AQP2D5EJ.42XrmIlH.js} +1 -1
  131. package/web/_astro/{chunk-FMBD7UC4.D1suAfOs.js → chunk-FMBD7UC4.Bao2wMK9.js} +1 -1
  132. package/web/_astro/{chunk-ND2GUHAM.D6BmdHEY.js → chunk-ND2GUHAM.BhydojD1.js} +1 -1
  133. package/web/_astro/{chunk-QZHKN3VN.rnPU-Ak-.js → chunk-QZHKN3VN.CmZ82g-H.js} +1 -1
  134. package/web/_astro/{classDiagram-4FO5ZUOK.CvEfXIo1.js → classDiagram-4FO5ZUOK.Blr83Gt_.js} +1 -1
  135. package/web/_astro/{classDiagram-v2-Q7XG4LA2.CvEfXIo1.js → classDiagram-v2-Q7XG4LA2.Blr83Gt_.js} +1 -1
  136. package/web/_astro/{cose-bilkent-S5V4N54A.DkMisLSm.js → cose-bilkent-S5V4N54A.qmfv0SPn.js} +1 -1
  137. package/web/_astro/{cynefin-OW5HDTMX.C77Q-pF6.js → cynefin-OW5HDTMX.BtELhXPR.js} +1 -1
  138. package/web/_astro/{dagre-BM42HDAG.YaV8ce27.js → dagre-BM42HDAG.AWmaAvXo.js} +1 -1
  139. package/web/_astro/{diagram-2AECGRRQ.CUyGEKge.js → diagram-2AECGRRQ.DdH34KDi.js} +1 -1
  140. package/web/_astro/{diagram-5GNKFQAL.CRgd8dgj.js → diagram-5GNKFQAL.BmNPix1k.js} +1 -1
  141. package/web/_astro/{diagram-KO2AKTUF.Bmzys9hq.js → diagram-KO2AKTUF.BNQd_Ppo.js} +1 -1
  142. package/web/_astro/{diagram-LMA3HP47.BvmJY4Lw.js → diagram-LMA3HP47.BAPgDi0e.js} +1 -1
  143. package/web/_astro/{diagram-OG6HWLK6.0hEhD30d.js → diagram-OG6HWLK6.DZ4zyLdC.js} +1 -1
  144. package/web/_astro/{erDiagram-TEJ5UH35.Bjt8lrnm.js → erDiagram-TEJ5UH35.Q1TySMmw.js} +1 -1
  145. package/web/_astro/{flowDiagram-I6XJVG4X.CJZTjRDV.js → flowDiagram-I6XJVG4X.BXhFBicG.js} +1 -1
  146. package/web/_astro/{ganttDiagram-6RSMTGT7._VqoVafc.js → ganttDiagram-6RSMTGT7.vHSgcuo2.js} +1 -1
  147. package/web/_astro/{gitGraphDiagram-PVQCEYII.CEDb7tVo.js → gitGraphDiagram-PVQCEYII.Bi1f73C7.js} +1 -1
  148. package/web/_astro/index.BhSwN8yY.css +1 -0
  149. package/web/_astro/{infoDiagram-5YYISTIA.CgwifPpK.js → infoDiagram-5YYISTIA.DPvXZEWm.js} +1 -1
  150. package/web/_astro/{ishikawaDiagram-YF4QCWOH.B99wx2J1.js → ishikawaDiagram-YF4QCWOH.Cz829fsV.js} +1 -1
  151. package/web/_astro/{journeyDiagram-JHISSGLW.2hRwJbEo.js → journeyDiagram-JHISSGLW.enRnB9Me.js} +1 -1
  152. package/web/_astro/{kanban-definition-UN3LZRKU.BahJkKNC.js → kanban-definition-UN3LZRKU.DnTNk6d2.js} +1 -1
  153. package/web/_astro/{linear.DguUUe6V.js → linear.BzGnBwNL.js} +1 -1
  154. package/web/_astro/{mermaid.core.CvgfmqVr.js → mermaid.core.CSbTpIVz.js} +4 -4
  155. package/web/_astro/{mindmap-definition-RKZ34NQL.B3qEA3x9.js → mindmap-definition-RKZ34NQL.DGJDy8zT.js} +1 -1
  156. package/web/_astro/{pieDiagram-4H26LBE5.FlWA-_ru.js → pieDiagram-4H26LBE5.HSPdi5_8.js} +1 -1
  157. package/web/_astro/{quadrantDiagram-W4KKPZXB.9bVn35X7.js → quadrantDiagram-W4KKPZXB.6Gv8mz2Y.js} +1 -1
  158. package/web/_astro/{requirementDiagram-4Y6WPE33.ChykIhct.js → requirementDiagram-4Y6WPE33.CnBCtFwa.js} +1 -1
  159. package/web/_astro/{sankeyDiagram-5OEKKPKP.Z2Y3hkYb.js → sankeyDiagram-5OEKKPKP.5M8VWAu8.js} +1 -1
  160. package/web/_astro/{sequenceDiagram-3UESZ5HK.J7JsHWDt.js → sequenceDiagram-3UESZ5HK.DN41XN-U.js} +1 -1
  161. package/web/_astro/{stateDiagram-AJRCARHV.DAPbiCSS.js → stateDiagram-AJRCARHV.ErOO3W8j.js} +1 -1
  162. package/web/_astro/{stateDiagram-v2-BHNVJYJU.D2jvSi0q.js → stateDiagram-v2-BHNVJYJU.B_ZHICM-.js} +1 -1
  163. package/web/_astro/{timeline-definition-PNZ67QCA.psW2ci29.js → timeline-definition-PNZ67QCA.CWdosr07.js} +1 -1
  164. package/web/_astro/{vennDiagram-CIIHVFJN.DlILYVmg.js → vennDiagram-CIIHVFJN.BHzYjNV5.js} +1 -1
  165. package/web/_astro/{wardleyDiagram-YWT4CUSO.xNWwLJnn.js → wardleyDiagram-YWT4CUSO.h8x4IwPX.js} +1 -1
  166. package/web/_astro/{xychartDiagram-2RQKCTM6.EU_BuH7V.js → xychartDiagram-2RQKCTM6.RTapW2X8.js} +1 -1
  167. package/web/index.html +2 -2
  168. package/plugins/sp/commands/dev-parallel.md +0 -31
  169. package/web/_astro/BoardApp.Bzr4OXrW.js +0 -324
  170. package/web/_astro/TaskDetail.LAyR_Pvn.js +0 -1
  171. package/web/_astro/channel.CUFdtWhm.js +0 -1
  172. package/web/_astro/index.Dg_3bOaJ.css +0 -1
@@ -26,7 +26,6 @@ metadata:
26
26
  see_also:
27
27
  - sp:source-driven-development
28
28
  - sp:spur-cli
29
- - sp:wayfinder
30
29
  ---
31
30
 
32
31
  # sp:brainstorm — Structured Ideation Workflow
@@ -35,7 +34,6 @@ Generate solution options with trade-offs, recommendations, and confidence scori
35
34
 
36
35
  **Key distinction:**
37
36
  - **`sp:brainstorm`** = Ideation: generate approaches with trade-offs
38
- - **`sp:wayfinder`** = Wayfinding: chart a multi-session map when the destination itself is foggy
39
37
  - **research** = verify and synthesize information (delegate inline by default — see [inline-default contract](../spur-dev/references/cross-cutting.md#inline-default-execution-surface))
40
38
  - **`sp:spur-dev`** = Task creation: structured task breakdown (planning half)
41
39
  - **`sp:source-driven-development`** = Verification: source-first claim validation
@@ -65,14 +63,13 @@ Activate sp:brainstorm when:
65
63
  | "research approaches" | User wants evidence-backed options |
66
64
  | "what are my options?" | User wants multiple solutions |
67
65
  | "how should I approach X?" | User wants recommendation with reasoning |
68
- | "wayfind" / "chart a course" | User needs a multi-session investigation map — escalate to `sp:wayfinder` (Phase 2) |
69
66
 
70
67
  **NOT for:**
71
68
  - Pure research (delegate to research skills inline by default; escalate via `spur agent run` only on a subprocess trigger)
72
69
  - Task creation without ideation (use `sp:spur-dev` instead)
73
70
  - Fact-checking or verification only (use `sp:source-driven-development` instead)
74
71
  - Task file operations (use `sp:spur-cli` instead)
75
- - Multi-session investigation when the destination itself is foggy (use `sp:wayfinder` instead)
72
+ - Multi-session investigation when the destination itself is foggy (recommend `/sp:dev-find-way`; see [Scope Check](#scope-check-end-of-phase-1))
76
73
 
77
74
  ## Core Principles
78
75
 
@@ -317,51 +314,16 @@ non-deterministic intent into a reliable sequence, not bare forwarders (ADR-016)
317
314
 
318
315
  ---
319
316
 
320
- ## Wayfinding Escalation (Phase 2)
317
+ ## Scope Check (end of Phase 1)
321
318
 
322
- When the discovery interview (Phase 1 of `/sp:dev-brainstorm`) surfaces that **the destination itself is foggy** — the spec can't be written in one session because too many decisions are unresolved — brainstorm escalates to `sp:wayfinder` instead of proceeding to ideation.
319
+ Before ideation, ask: **"Can this be spec'd in one session, or is the destination itself still foggy?"**
323
320
 
324
- ### Scope Check
325
-
326
- At the end of Phase 1, before ideation begins, run this scope check:
327
-
328
- > **"Can this be spec'd in one session, or is the destination itself still foggy?"**
329
-
330
- **Signals that wayfinding is needed:**
331
- - The topic touches ≥3 subsystems or unknown boundaries
332
- - Key decisions depend on research not yet done
333
- - The operator can describe the goal but not the shape of the solution
334
- - Multiple "it depends" answers in the discovery interview
335
- - The operator uses fog language: "I'm not sure yet", "we need to explore", "it depends on what we find"
336
-
337
- **Signals that standard ideation suffices:**
338
- - The destination is clear; only the approach is in question
339
- - All key decisions can be made from existing knowledge
340
- - The operator can enumerate the constraints and trade-offs
341
-
342
- ### Escalation Path
343
-
344
- When the scope check indicates a foggy destination, offer the escalation:
345
-
346
- > *"This is a multi-session investigation. Want me to chart a wayfinder map so we can work through it one decision at a time?"*
347
-
348
- The operator **confirms** before wayfinding begins — never silently escalate. A 30-minute quick-answer need might touch a big domain without requiring a multi-session map.
349
-
350
- On confirmation, delegate to `sp:wayfinder` for the "Chart the map" mode. The resolved decision tree from Phase 1 seeds the map's **## Notes** and initial **## Not yet specified** sections.
351
-
352
- ### `--wayfind` Flag
353
-
354
- When `/sp:dev-brainstorm` is invoked with `--wayfind`, the scope check is **skipped** — the operator has pre-approved the escalation. After the discovery interview, proceed directly to `sp:wayfinder` charting without the confirmation prompt.
355
-
356
- Use `--wayfind` when:
357
- - The operator already knows this is a multi-session investigation
358
- - A previous session recommended wayfinding
359
- - The topic is explicitly exploratory ("explore the solution space for X")
360
-
361
- ### Integration with the Design Approval Gate
362
-
363
- A wayfinding escalation **replaces** the standard ideation output. The map feature (with its destination, notes, fog, and child tickets) is the artifact. The `needs_design` signal is not emitted — wayfinding defers design until the route to the destination is clear. When the last ticket resolves, the final session hands off to standard `sp:brainstorm` → `sp:spec-decomposition` with a now-clear destination.
321
+ Fog signals: the topic touches ≥3 subsystems or unknown boundaries; key decisions depend on research
322
+ not yet done; the operator can name the goal but not the solution's shape; repeated "it depends"
323
+ answers. When they dominate, **stop** — do not ideate toward a destination that isn't there. Report
324
+ the resolved decision tree and recommend `/sp:dev-find-way "<topic>"`, which owns multi-session
325
+ investigation maps. Brainstorm never charts a map itself.
364
326
 
365
327
  ---
366
328
 
367
- **Remember:** Ideation ≠ Research. Generate approaches with trade-offs. Delegate verification to `sp:source-driven-development`. Delegate synthesis/research inline (escalate to `spur agent run` only on a subprocess trigger). Delegate task creation to `sp:spur-dev`. When the destination itself is foggy, escalate to `sp:wayfinder` — never force a spec that isn't ready.
329
+ **Remember:** Ideation ≠ Research. Generate approaches with trade-offs. Delegate verification to `sp:source-driven-development`. Delegate synthesis/research inline (escalate to `spur agent run` only on a subprocess trigger). Delegate task creation to `sp:spur-dev`. When the destination itself is foggy, stop and recommend `/sp:dev-find-way` — never force a spec that isn't ready.
@@ -40,6 +40,7 @@ A git worktree gives you an isolated working directory for a branch without stas
40
40
  ```bash
41
41
  git worktree add ../<project>-<branch> <branch>
42
42
  cd ../<project>-<branch>
43
+ spur projects add . 2>/dev/null || true # Register in projects.json for the Board project switcher
43
44
  ```
44
45
 
45
46
  **When to use worktrees:**
@@ -28,6 +28,7 @@ A git worktree gives you an isolated working directory linked to the same reposi
28
28
  ```bash
29
29
  git worktree add ../project-hotfix hotfix/critical-fix
30
30
  cd ../project-hotfix && bun install --frozen-lockfile
31
+ spur projects add . 2>/dev/null || true # list it in the Board project switcher
31
32
  ```
32
33
 
33
34
  The worktree directory is created alongside the main project. Name it `<project>-<branch>` for clarity.
@@ -104,6 +104,13 @@ only burns wall clock and context budget.
104
104
 
105
105
  - **Run only targeted probes** to validate your changes: `bun test <file>`,
106
106
  `bun test <file> --test-name-pattern "<test>"`, or `bunx tsc --noEmit` on a single package.
107
+ - **Run Spur through this tree's own entry point, never a bare `spur` (task 1110 R2).** Use the
108
+ invocation the pipeline supplies (`${vars.spurBin}`, e.g. `bun apps/cli/src/index.ts`) from the
109
+ execution tree — a bare `spur` on `PATH` resolves to the published bundle in `~/.bun/bin` or
110
+ `~/node_modules`, so a guard, a `task check` or a `task record` silently runs a different build
111
+ against a different tree. Same rule for the working directory: each shell call starts fresh, so
112
+ re-select the execution tree inside the call (`cd -- "$TREE"` plus the identity check) instead of
113
+ relying on a `cd` a previous call left behind.
107
114
  - **NEVER run** `bun run test`, `bun run spur-check`, `bun run check`, or any other full-suite /
108
115
  project-gate command from inside implement. These belong to the pipeline's `test` hop.
109
116
  - **Full-suite budget: at most 2 per task** (task 0436 R2) — counted across the whole task run
@@ -117,7 +124,35 @@ only burns wall clock and context budget.
117
124
  - If a targeted probe reveals a failure you cannot fix within implement scope, note it in
118
125
  `## Solution` and let the `test` hop's fixall handle it — do not pre-empt the gate.
119
126
 
120
- ## Changed-path targeted checks (dependency-aware verification, task 0510 R3)
127
+ ### Public-surface probe (task 1135 R1/R6/R8)
128
+
129
+ Narrow unit tests prove the seam you refactored, not the surface a user calls. Before this stage
130
+ reports done it runs **one end-to-end probe per new or changed public surface** — a CLI verb/flag,
131
+ an HTTP route, or a plugin script entry:
132
+
133
+ - against a **throwaway project root** (a temp dir), never the repo corpus or the execution tree's
134
+ tracked files;
135
+ - bounded: 120 s per invocation, output capped at 8 KiB, no network beyond the CLI under test;
136
+ - recorded as acceptance evidence: the **exact command** and its **observed output**;
137
+ - a failing probe is evidence, never a reason to mutate the corpus.
138
+
139
+ A service-layer test suite does **not** satisfy this. The gap it closes is measured: 19 service tests
140
+ green while `task create --feature <verifying>` failed end-to-end (task 1135 Background). If the stage
141
+ changed no public surface, report the single line
142
+ `probe: not-applicable (no public surface changed)` instead.
143
+
144
+ **Changed-path static self-check (R8)** — over the changed paths only, before reporting done:
145
+
146
+ - `spur rule run` with the configured pre-check preset (catches a direct `process.env` read, the
147
+ `env-var-hygiene` rule, and its siblings);
148
+ - `bun run script-contract-check` when a plugin script was touched (a stale generated `.mjs` twin);
149
+ - the paired-script parity test when `package.json` changed (a half-updated `spur-check` /
150
+ `spur-check-new` chain).
151
+
152
+ The single full project check stays the pipeline `test` hop's job (see the section above); these are
153
+ changed-path checks, not that gate.
154
+
155
+ ## Changed-path targeted checks (dependency-aware verification, task 0510 R3 / task 1142 R3)
121
156
 
122
157
  "Run the narrow test first" needs a second half: *which* narrow tests, when a change to a shared
123
158
  surface can break a downstream consumer. The matrix below is dependency-aware — domain → app →
@@ -126,6 +161,12 @@ implement. **It augments narrow behavior tests; it never authorizes `bun run spu
126
161
  `bun run test`, or another full project check inside implement** — the pipeline's `test` hop owns
127
162
  that single full gate.
128
163
 
164
+ **Worker iteration check order (task 1142 R3):**
165
+ 1. The **changed-path matrix** below (narrow behavior tests + affected consumers);
166
+ 2. the resolved `quality-gate` script in `light` mode (source-repo probe, else the installed twin) (biome on changed files, per-workspace typecheck, rule presets `rules:pre`/`rules:post`, related tests).
167
+
168
+ Neither step takes the host-wide full-gate lock. The full gate is named only for the pipeline's `test` and `test-recheck` hops.
169
+
129
170
  | Changed surface | Required targeted tests | Required typechecks |
130
171
  | --- | --- | --- |
131
172
  | `packages/domain/src/**` public type/query | affected domain test; affected app service test; affected CLI command test | `@gobing-ai/spur-domain`, `@gobing-ai/spur-app`, `@gobing-ai/spur` |
@@ -143,6 +184,12 @@ that single full gate.
143
184
  creep into every plugin edit.
144
185
  - Run the applicable rows, then stop: the single full project check belongs to the pipeline's
145
186
  `test` hop (`task-pipeline.yaml` `${vars.qualityGateCmd}`).
187
+ - **Mirrored surfaces: an edit lands on all of them.** When the change is one instance of a repeated
188
+ pattern — the same wiring rule on two runbooks, a signature in both a generator and its generated
189
+ `.d.mts`, a command chain in both `spur-check` and `spur-check-new` — grep for the siblings and
190
+ update each in this pass. Two H1-batch cycles (2026-10-08) were spent re-finding exactly this:
191
+ task 1129 fixed the guard wiring on one runbook and left its sibling, and task 1127 changed
192
+ `spur-check` while `spur-check-new`'s chain-parity assertion still expected the old chain.
146
193
 
147
194
  ## Behavior
148
195
 
@@ -165,7 +165,7 @@ classifies it as external and never raises `L4.stale-line-anchor` for it (R1). D
165
165
  that lives in this repo — in-repo evidence MUST use the repo-relative backtick form
166
166
  `` `path:line` `` / `` `path:start-end` ``, and citing it in the external form still reports (R2).
167
167
 
168
- **Concrete anchors (0804 R9):** cite existing `file:line`s, never globs — `references/verdict-schema.md`.
168
+ **Concrete anchors (0804 R9):** existing `file:line`s only, never globs, always repo-root-relative — a basename is `L4.anchor-unresolved` at the `--as done` gate (`references/verdict-schema.md`).
169
169
 
170
170
  ### Step 5 — Acceptance Criteria guard
171
171
 
@@ -362,9 +362,8 @@ Confidence: HIGH
362
362
  The per-requirement traceability table MUST use `| Req | Status | Evidence |` (exactly this header, no `R#`/`R`/`Requirement` variant — `Status` in column 2 — and no extra columns between Req and Status). The Acceptance Criteria table MUST use `| AC | Status | Evidence Type | Evidence |`.
363
363
  The answer MUST carry exactly one `Confidence: HIGH|MEDIUM|LOW` line (task 1068): the verifier's stated confidence in the verdict — HIGH = fresh executable evidence + re-read anchors this run; MEDIUM = partial reliance on prior evidence, external/delegated outcomes, or an unstable tree; LOW = key evidence not re-executed. A missing or out-of-vocabulary line fails lint (`confidence-missing` / `confidence-value`) and blocks derivation; the value lands in the verdict artifact's `confidence` field and the recorded `## Testing` section.
364
364
  The answer MUST cite a source for external API/library claims in Requirement/AC evidence cells: a cell asserting a scoped-package (`@scope/name`), `node_modules/`, semver-version (`x.y.z`), or backticked function-call (`` `name(args)` ``) claim is rejected with `evidence-citation` unless the SAME cell carries a citation — a repo `path:line(-end)` (backticked or bare), the external named-origin form (@origin `path` line N), or a URL. Cross-cell references ("receipt above") do not count; marker-free receipts ("bun test 398 pass / 0 fail") need no citation.
365
- **MUST NOT:** place a `Severity` column between `Req` and `Status` in the authoring contract.
366
- The parser is tolerant of these variants (defense-in-depth), but the authoring contract is
367
- canonical.
365
+ **MUST NOT:** place a `Severity` column between `Req` and `Status`. The parser tolerates variants
366
+ as defense-in-depth; this contract is canonical.
368
367
 
369
368
  Under the pipeline, the verifier owns the answer file `.spur/run/<wbs>-verify-answer.txt` (0726
370
369
  R3): `Verdict: PARTIAL` first, append one row at a time, replace the verdict line only when all
@@ -90,6 +90,9 @@ Before declaring a task `done`, run this lightweight checklist. It catches the m
90
90
  - [ ] No `console.log` / `console.error` in production code (use the project logger).
91
91
  - [ ] No `--no-verify`, `--force`, or new suppression comments added to bypass gates.
92
92
  - [ ] Solution section contains `file:line` citations for every changed file.
93
+ - [ ] API/library claims in changed docs carry a source citation (URL or `path:line`) and an honest
94
+ confidence level (HIGH/MEDIUM/LOW) per source-driven-development; the deterministic advisory backstop is
95
+ the `cited-version-strings` / `cited-api-claims` rules (`.spur/rules/docs/sourced-api-claims.yaml`).
93
96
  - [ ] Review section has P1–P4 findings table (even if all rows are empty — the table itself proves review happened).
94
97
 
95
98
  This checklist runs as part of the verify step when the task reaches `testing` status. It does not replace the formal gates — it augments them with between-pipeline hygiene checks.
@@ -35,9 +35,43 @@ interface VerifyVerdict {
35
35
  status: 'pass' | 'fail' | 'warn';
36
36
  evidence: string;
37
37
  }>;
38
+ /** Verifier confidence (task 1068 R3). REQUIRED for PASS — the done gate denies
39
+ * a confidence-less PASS. Accepted case-insensitively, normalized to uppercase. */
40
+ confidence?: 'HIGH' | 'MEDIUM' | 'LOW';
38
41
  }
39
42
  ```
40
43
 
44
+ ## Confidence level (task 1068 R3)
45
+
46
+ A PASS verdict must state the verifier's confidence: `"confidence": "HIGH" | "MEDIUM" | "LOW"`.
47
+ The value is case-insensitive on read (normalized to uppercase), but a present value outside the
48
+ enum invalidates the artifact, and a PASS with the field absent is denied at the `* → done`
49
+ transition with a remediation naming the field (`--force-done` remains the documented escape).
50
+ The verify answer's `Confidence:` lint rule (producer side) already guarantees the field for
51
+ pipeline-produced artifacts; this closes the hand-authored / pre-1068 artifact hole.
52
+
53
+ ### Coherence: the level must be earned (task 1133)
54
+
55
+ Presence and vocabulary are not enough — the level has to match the rows in the same answer, so the
56
+ lint rejects a level that contradicts its own evidence. Two rejection classes, both addressed to the
57
+ `Confidence:` line and both capped by the shared `ANSWER_LINT_MAX_FINDINGS` budget:
58
+
59
+ - `confidence-unwarranted` — `HIGH` while any requirement row normalizes to `PARTIAL`/`UNMET`, any
60
+ acceptance-criteria row does not normalize to `MET`, or any `MET` row's evidence is hedged.
61
+ A `HIGH` claim says the evidence needs no re-check; a non-MET or hedged row says the opposite.
62
+ - `confidence-understated` — `LOW` while at least one requirement row exists and every requirement
63
+ and acceptance-criteria row normalizes to `MET`. The evidence already did the work, so `LOW`
64
+ misreports the state as unproven.
65
+
66
+ `MEDIUM` carries no coherence rule in either direction: it is the level a verifier uses for a caveat
67
+ with no row to point at, and closing it would force either an overclaimed `HIGH` or an unusable
68
+ `LOW`. The level is normalized to uppercase before the decision, so `high` is judged as `HIGH`.
69
+
70
+ Set the level from the rows, not the mood: all rows `MET` with fresh evidence is `HIGH`; a
71
+ `PARTIAL`/`UNMET` row or a hedge means `MEDIUM`, not `HIGH`. An unwarranted level does not merely
72
+ warn — the lint rejects the answer and no verdict artifact is written, so the level is worth
73
+ choosing deliberately before the verdict line is finalized.
74
+
41
75
  ## Compatibility alias: `scenario` row key
42
76
 
43
77
  Task 0410 hardened the verdict reader. Producers SHOULD use the canonical `id` field for every
@@ -138,6 +172,23 @@ the run actually verified. Since 0804 R9 the checker ignores complete parsed cit
138
172
  scanning for subjects, so a citation's filename (including snake_case paths) can never become a
139
173
  false subject — a real absent symbol, nonexistent file, or invalid range still reports.
140
174
 
175
+ ## Basename-only anchors are unresolved anchors (task 1110 R1)
176
+
177
+ `spur task verdict --from-answer` accepts the citation *shape*, but the `--as done` gate resolves
178
+ every Testing/Solution anchor against the repo root. A basename citation — `decision-events.ts:83`,
179
+ `task.test.ts:42` — reports `L4.anchor-unresolved` at **error** and blocks
180
+ `spur task update <wbs> done`, because the gate cannot tell which file the row meant. Write the
181
+ repo-root-relative form from the first pass:
182
+
183
+ - Right: `packages/app/src/decision/decision-events.ts:83`, `apps/cli/tests/commands/task.test.ts:42`
184
+ - Wrong: `decision-events.ts:83`, `../services/foo.ts:12`, `@gobing-ai/ts-x/src/persistence.ts:108`
185
+ (a scoped package is never repo-relative — use the external named-origin form below)
186
+
187
+ The pipeline's implement stage also runs a scoped `spur task migrate-anchors --wbs <wbs>` pass
188
+ before the proof capture (task 1109), but it qualifies **unique** basenames only: an ambiguous
189
+ basename (two tracked files share it) is reported and left untouched, and line drift and
190
+ `L4.anchor-subject-mismatch` are never repaired by that pass — those remain the author's rows.
191
+
141
192
  ## Source citations for external claims (task 1070)
142
193
 
143
194
  A Requirement/AC evidence cell that asserts an external API/library claim must carry a verifiable
@@ -152,6 +203,23 @@ citation in the SAME cell, or lint rejects the row with `evidence-citation` (blo
152
203
  satisfy it. Marker-free receipts (test counts, reviewed-log notes) need no citation. The check is
153
204
  presence-only — which citation proves which claim is not deterministically decidable.
154
205
 
206
+ ## Hedged evidence is rejected on MET rows
207
+
208
+ A MET row asserts the requirement is satisfied; evidence that hedges ("the guard likely prevents
209
+ the leak") contradicts the assertion the row is making. The lint rejects such rows with
210
+ `evidence-hedged`, naming the detected phrase, with two remedies: state the deterministic fact
211
+ with a concrete anchor, or downgrade the row to PARTIAL (which is what suspected-but-unproven
212
+ behavior actually is).
213
+
214
+ - Detected phrases (closed set, word-anchored, case-insensitive): `likely`, `unlikely`,
215
+ `probably`, `presumably`, `apparently`, `seems/seeming/seemingly to`, `appears to`. Modal verbs
216
+ (`might`/`may`/`could`/`should`) are deliberately out of set — they are constant in remediation
217
+ prose and would drown the signal.
218
+ - Only MET rows are scanned. Hedging a gap in an UNMET row ("the stale path likely still loads
219
+ the old bundle") is honest reporting and stays clean.
220
+ - Citation spans are stripped before scanning, so a filename or test name containing a hedge
221
+ word (`likely-match.test.ts`) cannot fire.
222
+
155
223
  ## Checks evidence
156
224
 
157
225
  Wave C verification can emit the following additive `checks[]` rows:
@@ -11,7 +11,7 @@ description: >-
11
11
  A guest is a session that **pulls** work: it is neither supervised nor restarted, it is addressed
12
12
  by concrete id only, and it never receives a stage (`requiresCapabilities` stages can never route
13
13
  to it — a guest carries no attestation). Joining registers an occupant row plus a heartbeat lease;
14
- leaving (or an expired lease) releases it and returns any claimed messages to `pending`.
14
+ leaving (or an expired lease) releases it and returns any claimed messages to `queued`.
15
15
 
16
16
  ## Join
17
17
 
@@ -144,14 +144,21 @@ an explicit allowlist entry.
144
144
  env dumps. Token estimates for Bash/Grep/Glob use response size **after a 4 KiB cap** and secret
145
145
  scrub; omit `tokens` when unknown (never `0`).
146
146
 
147
+ **Session lifecycle:** `.spur/context/.session.json` is a private pointer to the in-flight session.
148
+ It records the creating host's owner identity (`{host, sessionId}` — Claude's hook `session_id`, Pi's
149
+ session-manager id) and only that owner's `SessionEnd` / `session_shutdown` may write the rollup and
150
+ remove the pointer. A nested run reuses the parent's ledger for tool recording but cannot finalize
151
+ or delete it; an ownerless (legacy) pointer is never finalized and expires under the existing
152
+ idle-start window instead.
153
+
147
154
  ```jsonl
148
- {"ts":"2026-07-09T14:23:01Z","session":"session-2026-07-09-1423","type":"session_start"}
149
- {"ts":"2026-07-09T14:23:15Z","session":"session-2026-07-09-1423","type":"read","file":"src/dao.ts","tokens":648}
150
- {"ts":"2026-07-09T14:24:00Z","session":"session-2026-07-09-1423","type":"write","file":"src/dao.ts","tokens":222,"action":"edit"}
151
- {"ts":"2026-07-12T15:00:00Z","session":"session-2026-07-12-1500","type":"bash","summary":"ls -la","tokens":12}
152
- {"ts":"2026-07-12T15:00:01Z","session":"session-2026-07-12-1500","type":"grep","summary":"/TODO/ src"}
153
- {"ts":"2026-07-12T15:00:02Z","session":"session-2026-07-12-1500","type":"glob","summary":"**/*.test.ts"}
154
- {"ts":"2026-07-09T14:30:00Z","session":"session-2026-07-09-1423","type":"session_end","totals":{"reads":5,"writes":19,"tokens":2783}}
155
+ {"ts":"2026-07-09T14:23:01Z","session":"session-2026-07-09-142318-a1b2c3d4","type":"session_start"}
156
+ {"ts":"2026-07-09T14:23:15Z","session":"session-2026-07-09-142318-a1b2c3d4","type":"read","file":"src/dao.ts","tokens":648}
157
+ {"ts":"2026-07-09T14:24:00Z","session":"session-2026-07-09-142318-a1b2c3d4","type":"write","file":"src/dao.ts","tokens":222,"action":"edit"}
158
+ {"ts":"2026-07-12T15:00:00Z","session":"session-2026-07-12-150007-e5f6a7b8","type":"bash","summary":"ls -la","tokens":12}
159
+ {"ts":"2026-07-12T15:00:01Z","session":"session-2026-07-12-150007-e5f6a7b8","type":"grep","summary":"/TODO/ src"}
160
+ {"ts":"2026-07-12T15:00:02Z","session":"session-2026-07-12-150007-e5f6a7b8","type":"glob","summary":"**/*.test.ts"}
161
+ {"ts":"2026-07-09T14:30:00Z","session":"session-2026-07-09-142318-a1b2c3d4","type":"session_end","totals":{"reads":5,"writes":19,"tokens":2783}}
155
162
  ```
156
163
 
157
164
  **Never edit `token-ledger.jsonl` by hand.** It feeds the Board **Observability → Tool Using** tab.
@@ -104,7 +104,7 @@ was meant to avoid. Let the reviewer reach its own conclusion.
104
104
 
105
105
  - **`sp:spur-dev`** owns task selection and lifecycle. When a batch contains independent tasks, the spine consults this skill for the fan-out pattern.
106
106
  - **`sp:super-planner`** is the orchestrator that executes the fan-out. Its parallel mode (documented in its agent definition) applies the patterns from this skill.
107
- - **`/sp:dev-parallel`** is the thin slash-command entry point that delegates to this skill.
107
+ - **`/sp:dev-runall --mode parallel|auto`** is the task-batch entry point; its `batch-plan.mjs order` schedule applies this skill's dependency and file-overlap rows deterministically.
108
108
 
109
109
  ## When to use
110
110
 
@@ -135,7 +135,7 @@ Do **not** use this skill for:
135
135
 
136
136
  - **`sp:spur-dev`** — the orchestration spine that consults this skill for fan-out decisions.
137
137
  - **`sp:super-planner`** — the batch orchestrator that executes fan-out patterns.
138
- - **`/sp:dev-parallel`** — the slash command entry point for parallel execution.
138
+ - **`/sp:dev-runall --mode parallel|auto`** — the slash command entry point for parallel task batches.
139
139
 
140
140
  ## Platform Notes
141
141
 
@@ -70,7 +70,7 @@ own axis.
70
70
  Surface choice and model choice stay separate axes, but the invocation surface is where the
71
71
  cheap-model hint is applied. On hosts whose native subagent invocation accepts a per-call model
72
72
  override (Claude Code: the Agent tool's `model` parameter), dispatch read-only fan-out workers —
73
- `dev-parallel --mode investigation` and competency-lens review's read-only lenses — with the host's
73
+ N-way investigation and competency-lens review's read-only lenses — with the host's
74
74
  cheapest capable model. The rule is owned by
75
75
  [fan-out-patterns.md § Cheap-model hint for read-only fan-out](fan-out-patterns.md#cheap-model-hint-for-read-only-fan-out)
76
76
  and carries two prohibitions and one exemption: invocation-side only, **never** a subagent
@@ -134,13 +134,13 @@ blocker** — never a permission-probing subsystem:
134
134
  [Keep a durable progress ledger](../SKILL.md#keep-a-durable-progress-ledger)).
135
135
 
136
136
  Read-only investigation fan-out avoids the write-permission class by construction:
137
- `dev-parallel --mode investigation` and competency-lens review's read-only lenses dispatch
137
+ N-way investigation and competency-lens review's read-only lenses dispatch
138
138
  **read-only worker shapes** — search/read tools only, with no write surface declared.
139
139
 
140
140
  ## Cheap-model hint for read-only fan-out
141
141
 
142
142
  On hosts whose native subagent invocation accepts a per-call model override (Claude Code: the Agent
143
- tool's `model` parameter), dispatch read-only fan-out workers — `dev-parallel --mode investigation`
143
+ tool's `model` parameter), dispatch read-only fan-out workers — N-way investigation
144
144
  and competency-lens review's read-only lenses — with the host's cheapest capable model. The rule is
145
145
  invocation-side, with two prohibitions and one exemption:
146
146
 
@@ -112,9 +112,13 @@ unrelated uncommitted changes make safe editing or committing ambiguous.
112
112
  **Current-HEAD invariant.** Treat the PR's pushed `headRefOid` as the review identity. After every
113
113
  preflight, push, commit, and request, record the returned HEAD and require `wait`, `collect`, and
114
114
  the report to match that exact HEAD. A result for an older commit is stale; a result absent for the
115
- current HEAD is pending, not clean. Reject uncorrelated issue/conversation comments rather than
116
- using them to manufacture a current-HEAD result. In `fix` mode, discard the old result after the
117
- fix commit and judge only the forced re-review for the new pushed HEAD.
115
+ current HEAD is pending, not clean. `wait` re-asserts this at two points, not one: at the start of
116
+ every poll, and again immediately before it emits FOUND/CLEAN/TIMEOUT — a head that moved while the
117
+ review was being fetched, or between polls, fails the wait (exit 2) instead of accepting an old-head
118
+ result. The pinned identity is the PR number AND the expected head, so a different PR appearing on
119
+ the branch is also a failure, never a silent retarget. Reject uncorrelated issue/conversation
120
+ comments rather than using them to manufacture a current-HEAD result. In `fix` mode, discard the old
121
+ result after the fix commit and judge only the forced re-review for the new pushed HEAD.
118
122
 
119
123
  **Reviewer authority.** Codex is an independent reviewer, not an authority. For every finding that
120
124
  may lead to a code change: inspect the referenced code, verify reachability and intended behavior,
@@ -2,7 +2,7 @@
2
2
  name: session-review
3
3
  description: "Review the active coding-agent session: separate resolved from open issues with evidence, propose bounded improvements. With --fix auto (alias --triage), apply pure-doc / 1–2-line fixes inline and file the rest as tasks; with --fix all, fix every actionable finding inline and file none. Triggers: review this session, wrap-up, triage findings."
4
4
  license: Apache-2.0
5
- version: 1.2.0
5
+ version: 1.3.0
6
6
  metadata:
7
7
  author: spur
8
8
  platforms: "claude-code,codex,openclaw,opencode,antigravity,pi"
@@ -24,7 +24,9 @@ compact, evidence-backed report of outcomes, resolved issues, remaining risks, a
24
24
 
25
25
  Use this skill immediately after focused operations when the operator asks what happened, what was
26
26
  resolved, or how the session could improve. Use imported-history analysis for ended sessions,
27
- cross-agent windows, recurrence, trends, or quantitative performance forensics.
27
+ cross-agent windows, recurrence, trends, or quantitative performance forensics: on pi, run
28
+ `spur history analyze --source pi --session <file-stem>` where `<file-stem>` is the transcript
29
+ basename without `.jsonl` (e.g. `2026-10-07T22-44-33-625Z_01a1188a-…`), not the bare uuid.
28
30
 
29
31
  ## Arguments
30
32
 
@@ -92,7 +94,18 @@ issues with its evidence. Notes stay report-only.
92
94
  operator prompt, read-only from the host transcript. Run it once without `--group` to list the
93
95
  segments, then map them to stages (`"1-3,4,5-6"`). It splits each segment into `work` and
94
96
  operator `wait` (idle before the next prompt plus AskUserQuestion answer time) and counts tokens
95
- once per message id.
97
+ once per message id. On pi the transcript is `$PI_SESSION_FILE` (pass it as `--transcript` when
98
+ the run reports no host session id). **A measurement that returns `segments: []` with zero totals
99
+ while the session had operator prompts is an unreadable or stale adapter, not an empty session:**
100
+ compare the installed copy against this tree's `plugins/sp/scripts/session-timeline.mjs` and
101
+ refresh it with `superskill install sp` before reporting numbers; report `n/a` until then.
102
+ The transcript resolves from `--transcript`, else `CLAUDE_CODE_SESSION_ID`, else `PI_SESSION_FILE`
103
+ (the pi host sets it and no Claude session id); with none of them the measurement reports
104
+ `available:false` with a reason and the table renders `n/a` instead of guessing. A pi
105
+ `<skill name="…">` wrapper row is the OPERATOR'S own `/skill` invocation, not an injected body:
106
+ it opens a segment rendered `/<name> <args>` (or `/<name>` when no arguments follow the closing
107
+ tag), and the wrapper body never appears in the prompt excerpt. Only the operator's prompts
108
+ segment the session.
96
109
  2. **Inventory outcomes.** List requested outcomes and classify each as completed, partial, blocked,
97
110
  or not attempted. Collapse repeated attempts into one outcome.
98
111
  3. **Classify issues.** For every material issue, distinguish resolved, open, or attempted. Record
@@ -140,10 +153,30 @@ step 4 excludes. Use `n/a` for any value not supported by the measurement.
140
153
  | --- | --- | --- | --- | --- |
141
154
 
142
155
  Evidence names the tool result, verification command, or concrete repository state visible in the
143
- session. Do not list ordinary implementation steps as issues. **Confidence** is `HIGH`, `MEDIUM`, or
144
- `LOW` for that row's claim, with its grounds in the cell (a level without grounds is not
145
- verification); any API/library statement in a row cites the installed source as `path:line` or a URL,
146
- and a claim the session could not ground is written `LOW` with the missing evidence named.
156
+ session. Do not list ordinary implementation steps as issues.
157
+
158
+ **Confidence** is `HIGH`, `MEDIUM`, or `LOW` for that row's claim. The level is **derived from the
159
+ check that produced the claim, never assessed from how the row reads**, and the cell carries that
160
+ verifier (e.g. `HIGH — gate exit 0, /tmp/g0.log re-run this session`). Add the row's **falsifier**
161
+ when the level is not `HIGH`: what would have made it fail, or what moves it up. The same ladder
162
+ grades this report's Open-issues table.
163
+
164
+ | Level | Verifies when | Not this |
165
+ | --- | --- | --- |
166
+ | `HIGH` | An executed check in this session produced the result and its raw output is reachable (command + exit code, test counts, query row, gate log). Re-runnable now. | The code or change "looks correct"; a claim asserted only in prose. |
167
+ | `MEDIUM` | The claim is inferred from observed facts, rests on prior-session or delegated evidence, or names state that moved after the check (stale by construction). Name which of the three. | Presenting an inference as an observation. |
168
+ | `LOW` | No executable check was run. Name the missing evidence **and** the command that would ground it. | Dropping the row instead of marking it. |
169
+
170
+ Two guards against level inflation:
171
+
172
+ - Evidence that cannot be re-run, or that is only the agent's own summary, **caps the row at
173
+ `MEDIUM`** — a re-run is what promotes it.
174
+ - An all-`HIGH` multi-finding review is a signal the ladder was not applied, not a clean session.
175
+ Where every row genuinely is `HIGH`, the cells show distinct check results rather than repeated
176
+ phrasing.
177
+
178
+ Any API/library statement in a row cites the installed source as `path:line` or a URL, and a claim
179
+ the session could not ground is written `LOW` with the missing evidence named.
147
180
 
148
181
  ### Open issues and risks
149
182
 
@@ -101,6 +101,11 @@ line: `Verification: HIGH|MEDIUM|LOW — <first failing check and deviation, or
101
101
  - **Honest confidence** — the stated HIGH/MEDIUM/LOW matches the evidence: HIGH requires a check against the pinned source this session; MEDIUM/LOW items are labeled, and LOW is never presented as fact.
102
102
  - **HIGH** — all three checks pass. **MEDIUM** — coverage intact but some citations are off-version (latest docs for a pinned dependency) or secondary-source only. **LOW** — an API/library claim lacks any citation, or a LOW-confidence claim was asserted as fact.
103
103
 
104
+ Deterministic backstop: the `cited-version-strings` / `cited-api-claims` rules
105
+ (`.spur/rules/docs/sourced-api-claims.yaml`, run in `recommended-pre-check`) flag markdown lines that
106
+ assert version strings or time-anchored API claims with no citation anchor on the same line. They
107
+ are an info-severity advisory backstop for this contract (they do not gate; the checks above and the SECUA checklist are the enforcement points).
108
+
104
109
  ## Common Rationalizations
105
110
 
106
111
  | Rationalization | Reality |
@@ -562,9 +562,11 @@ schema before emitting.
562
562
 
563
563
  **Pass the deterministic task check.** Each `acceptance_criteria` bullet must be an exact feature
564
564
  scenario title (L4.uncovered-task-scenario); add task-local checks as prose after the bullets, not
565
- as extra bullets. No section body may use `HITL`, `approval`/`approved`, `merged`/`merge event`,
566
- `content-gate`, `GATED`, or `capstone` as standalone words (L4.gate-language) — say "operator
567
- answer" / "accepted" instead, and keep enum values out of that list too.
565
+ as extra bullets. No section body may use `HITL`, `merge event`, `content-gate`, `GATED`, or
566
+ `capstone` as standalone words (L4.gate-language); ambiguous words (`approval`, `approved`,
567
+ `merged`) warn only with a gating cue (`until`, `after`, `once`, `before`, `pending`, `blocked`,
568
+ `wait for`, `requires`) in the same sentence, so plain composition prose stays silent — say
569
+ "operator answer" / "accepted" instead, and keep enum values out of that list too.
568
570
 
569
571
  **The order sidecar.** Also emit the private task-order sidecar at
570
572
  `.spur/run/<runId>-idea-task-order.json`: a JSON array (one entry per batch item) of
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: spur-cli
3
- description: "Reference and operate the complete `spur` CLI surface: task, feature, rule, workflow, builder, agent, message, self, history, and projects. Use for verb or flag lookup, machine-readable output and exit contracts, or CLI-gated corpus writes. Triggers: \"spur task\", \"spur history\", \"spur projects\", \"create a task\", \"task check\", and any Spur CLI convention. Not for planning or execution lifecycle orchestration (`sp:spur-dev`)."
3
+ description: "Reference and operate the complete `spur` CLI surface: task, feature, rule, workflow, builder, agent, message, decision, self, history, and projects. Use for verb or flag lookup, machine-readable output and exit contracts, or CLI-gated corpus writes. Triggers: \"spur task\", \"spur history\", \"spur projects\", \"spur decision\", \"spur agent join\", \"create a task\", \"task check\", and any Spur CLI convention. Not for planning or execution lifecycle orchestration (`sp:spur-dev`)."
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: spur
@@ -17,6 +17,7 @@ metadata:
17
17
  - builder
18
18
  - agent
19
19
  - message
20
+ - decision
20
21
  - self
21
22
  - history
22
23
  - projects
@@ -44,7 +45,7 @@ Pick the noun, read its reference. Each Tier A and Tier B reference owns that no
44
45
  | **Tier A** | **rule** | Constraint quality gate: run presets, author rules, fine-tune, validate rule files/presets, extend engine | [references/rules.md](references/rules.md) |
45
46
  | **Tier A** | **workflow** | Dual-mode workflow runtime: author state-machine / transition-flow workflows, validate, run, read traces | [references/workflows.md](references/workflows.md) |
46
47
  | **Tier A** | **builder** | Release plumbing: bump a package (or the `workspace:`-pinned set) with `bump-ver`, delete release tags with `drop-tags`, commit + tag + optional push | [references/builder.md](references/builder.md) |
47
- | **Tier B** | **agent** | Coding-agent execution surface: run prompts via detected/named agents, list agent specs, start/stop supervised processes, readiness check | [references/agent.md](references/agent.md) |
48
+ | **Tier B** | **agent** | Coding-agent execution surface: run prompts via detected/named agents, list agent specs (incl. `agent.fleet` members), start/stop supervised processes, fleet `report`/`join`/`leave`/`wait`/`trace`, readiness check | [references/agent.md](references/agent.md) |
48
49
  | **Tier B** | **message** | Durable inter-agent messaging: send, inbox, reply, watch | [references/message.md](references/message.md) |
49
50
  | **Tier B** | **self** | Self-management verbs: scaffold (`init`), database maintenance (`maintain`), schema migrations (`migrate`), local web server (`serve`), status overview (`status`); `self init` runs post-scaffold validation probes & layout classification | [references/self.md](references/self.md) |
50
51
  | **Tier B** | **history** | Import agent histories, aggregate forensic artifacts, render reports, and run the checkpoint-resumed daily pipeline | [references/history.md](references/history.md) |
@@ -142,6 +143,8 @@ and spreading it; full contract in `docs/04_DESIGN.md` §1.0.1.
142
143
  [dispatch-surface rule](../parallel-execution/references/dispatch-surface.md).
143
144
  - **[references/message.md](references/message.md)** - durable inter-agent messaging (`send`,
144
145
  `inbox`, `reply`, `watch`).
146
+ - **[references/decision.md](references/decision.md)** - decision catalog (`list`, `show`, `run`,
147
+ `status`); offline by default via the built-in `typesafe` maker.
145
148
  - **[references/self.md](references/self.md)** - `spur self init|maintain|migrate|serve|status` CLI verbs
146
149
  (the five legacy top-level nouns remain hidden aliases). `self init` runs post-scaffold init
147
150
  validation (Phase 1.5/1.6 probes).