@gobing-ai/spur 0.4.2 → 0.4.4

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 (168) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/decisions/maker-liveness.yaml +39 -0
  3. package/config/plugin-scripts.json +0 -4
  4. package/config/rules/README.md +1 -0
  5. package/config/rules/docs/sourced-api-claims.yaml +56 -12
  6. package/config/rules/docs/verdict-confidence.yaml +68 -0
  7. package/config/rules/quality/coverage-gate.yaml +13 -0
  8. package/config/rules/recommended-pre-check.yaml +6 -2
  9. package/config/rules/strict/runtime-boundaries.yaml +10 -0
  10. package/config/rules/surface/check-cli-surface.yaml +1 -3
  11. package/config/script-placement-baseline.json +1 -19
  12. package/config/templates/AGENTS.md +7 -0
  13. package/config/workflows/feature-lifecycle.yaml +46 -1
  14. package/config/workflows/feature-verification.yaml +20 -1
  15. package/config/workflows/task-lifecycle.yaml +50 -0
  16. package/config/workflows/task-pipeline.yaml +15 -9
  17. package/package.json +10 -10
  18. package/plugins/sp/README.md +22 -16
  19. package/plugins/sp/agents/super-reviewer.md +46 -0
  20. package/plugins/sp/bunfig.toml +8 -5
  21. package/plugins/sp/commands/dev-changelog.md +1 -1
  22. package/plugins/sp/commands/dev-gitmsg.md +6 -2
  23. package/plugins/sp/commands/dev-handover.md +1 -0
  24. package/plugins/sp/commands/dev-job-dump.md +2 -1
  25. package/plugins/sp/commands/dev-refine.md +14 -2
  26. package/plugins/sp/commands/dev-refineall.md +7 -1
  27. package/plugins/sp/commands/dev-review.md +1 -0
  28. package/plugins/sp/hooks/careful-guard.ts +1 -1
  29. package/plugins/sp/hooks/context-post-tool.ts +7 -427
  30. package/plugins/sp/hooks/context-session-start.ts +5 -213
  31. package/plugins/sp/hooks/context-session-stop.ts +5 -191
  32. package/plugins/sp/hooks/pi/guard-extension.ts +6 -5
  33. package/plugins/sp/hooks/task-write-guard.ts +1 -1
  34. package/plugins/sp/{hooks → lib}/agent-hint.ts +1 -1
  35. package/plugins/sp/lib/context-post-tool.ts +432 -0
  36. package/plugins/sp/lib/context-session-start.ts +214 -0
  37. package/plugins/sp/lib/context-session-stop.ts +196 -0
  38. package/plugins/sp/lib/dogfood-pipeline.ts +265 -0
  39. package/plugins/sp/lib/dogfood-report.ts +278 -0
  40. package/plugins/sp/lib/history-anatomy.generated.mjs +18 -18
  41. package/plugins/sp/lib/idea-handoff.generated.mjs +91 -91
  42. package/plugins/sp/lib/inline-run-app.ts +40 -0
  43. package/plugins/sp/lib/inline-run.generated.d.mts +3 -3
  44. package/plugins/sp/lib/inline-run.generated.mjs +1425 -212
  45. package/plugins/sp/lib/plan-projection.generated.d.mts +150 -0
  46. package/plugins/sp/lib/plan-projection.generated.mjs +623 -9
  47. package/plugins/sp/lib/quality-gate.generated.d.mts +1 -0
  48. package/plugins/sp/lib/quality-gate.generated.mjs +13809 -13969
  49. package/plugins/sp/lib/residual-scan.generated.d.mts +20 -1
  50. package/plugins/sp/lib/residual-scan.generated.mjs +120 -25
  51. package/plugins/sp/lib/run-summary-core.ts +34 -370
  52. package/plugins/sp/lib/step-profile.generated.mjs +8 -8
  53. package/plugins/sp/lib/transcript.ts +37 -228
  54. package/plugins/sp/plugin.json +1 -1
  55. package/plugins/sp/scripts/batch-plan.mjs +619 -11
  56. package/plugins/sp/scripts/batch-preflight.mjs +57 -13
  57. package/plugins/sp/scripts/batch-preflight.ts +35 -295
  58. package/plugins/sp/scripts/commit-guard.mjs +6 -6
  59. package/plugins/sp/scripts/daily-summary/daily-summary.mjs +127 -108
  60. package/plugins/sp/scripts/daily-summary/daily-summary.ts +111 -104
  61. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.mjs +13 -12
  62. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts +7 -265
  63. package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +7 -4
  64. package/plugins/sp/scripts/dogfood-testing/validate-report.ts +6 -272
  65. package/plugins/sp/scripts/feature-verification-steps.mjs +20 -125
  66. package/plugins/sp/scripts/feature-verification-steps.ts +57 -181
  67. package/plugins/sp/scripts/history-anatomy-cache.mjs +19 -19
  68. package/plugins/sp/scripts/idea-handoff.mjs +2 -2
  69. package/plugins/sp/scripts/inline-run-dispatch.mjs +25 -24
  70. package/plugins/sp/scripts/inline-run-dispatch.ts +1 -21
  71. package/plugins/sp/scripts/inline-run-setup.mjs +164 -137
  72. package/plugins/sp/scripts/inline-run-setup.ts +1 -21
  73. package/plugins/sp/scripts/persist-out-check.mjs +5 -5
  74. package/plugins/sp/scripts/pr-reviewing.mjs +13 -13
  75. package/plugins/sp/scripts/quality-gate.mjs +13730 -13887
  76. package/plugins/sp/scripts/residual-scan.mjs +129 -31
  77. package/plugins/sp/scripts/residual-scan.ts +16 -13
  78. package/plugins/sp/scripts/run-summary.mjs +166 -112
  79. package/plugins/sp/scripts/run-summary.ts +7 -5
  80. package/plugins/sp/scripts/script-root.mjs +6 -6
  81. package/plugins/sp/scripts/session-timeline.mjs +62 -35
  82. package/plugins/sp/scripts/task-diffstat.mjs +19 -9
  83. package/plugins/sp/scripts/task-diffstat.ts +8 -39
  84. package/plugins/sp/scripts/workflow-step-profile.mjs +12 -12
  85. package/plugins/sp/scripts/wrapup-drift-probe.mjs +9 -9
  86. package/plugins/sp/scripts/wrapup-steps.mjs +25 -25
  87. package/plugins/sp/skills/code-implementation/SKILL.md +7 -1
  88. package/plugins/sp/skills/code-verification/references/secu-review.md +2 -1
  89. package/plugins/sp/skills/code-verification/references/verdict-schema.md +4 -0
  90. package/plugins/sp/skills/dogfood-testing/SKILL.md +2 -2
  91. package/plugins/sp/skills/next-feature/SKILL.md +1 -1
  92. package/plugins/sp/skills/next-router/SKILL.md +3 -1
  93. package/plugins/sp/skills/next-router/references/routing-table.md +9 -3
  94. package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
  95. package/plugins/sp/skills/source-driven-development/SKILL.md +7 -4
  96. package/plugins/sp/skills/spur-cli/references/builder.md +3 -2
  97. package/plugins/sp/skills/spur-cli/references/decision.md +32 -7
  98. package/plugins/sp/skills/spur-cli/references/features.md +46 -5
  99. package/plugins/sp/skills/spur-cli/references/tasks.md +24 -4
  100. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +8 -1
  101. package/plugins/sp/skills/spur-dev/references/dev-operations.md +37 -11
  102. package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +1 -1
  103. package/plugins/sp/skills/spur-dev/references/execution-batch.md +19 -6
  104. package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +22 -0
  105. package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +14 -0
  106. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +4 -2
  107. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +49 -12
  108. package/schemas/section-matrix.schema.json +3 -2
  109. package/spur.js +66591 -73262
  110. package/web/_astro/{BoardApp.B3GQZvj8.js → BoardApp.Niubpe6z.js} +1 -1
  111. package/web/_astro/{BoardApp.BT7L2kSb.js → BoardApp.hF0RAIrg.js} +150 -150
  112. package/web/_astro/TaskDetail.DJpapt38.js +1 -0
  113. package/web/_astro/{arc.vaT7tPOB.js → arc.BgKcK0i8.js} +1 -1
  114. package/web/_astro/{architectureDiagram-3BPJPVTR.DRMmTjkN.js → architectureDiagram-3BPJPVTR.ChP-Ig0V.js} +1 -1
  115. package/web/_astro/{blockDiagram-GPEHLZMM.cla0LO_q.js → blockDiagram-GPEHLZMM.BVaCBoeN.js} +1 -1
  116. package/web/_astro/{c4Diagram-AAUBKEIU.D4YAIBKn.js → c4Diagram-AAUBKEIU.CHSDpEO5.js} +1 -1
  117. package/web/_astro/channel.DkpvN2tD.js +1 -0
  118. package/web/_astro/{chunk-2J33WTMH.BrSJbMRZ.js → chunk-2J33WTMH.MYRcYVRa.js} +1 -1
  119. package/web/_astro/{chunk-4BX2VUAB.CuLMgKF5.js → chunk-4BX2VUAB.S5j22Zqa.js} +1 -1
  120. package/web/_astro/{chunk-55IACEB6.zkvgu54F.js → chunk-55IACEB6.gciRPvmZ.js} +1 -1
  121. package/web/_astro/{chunk-727SXJPM.DxWkACh8.js → chunk-727SXJPM.CdqrSQkX.js} +1 -1
  122. package/web/_astro/{chunk-AQP2D5EJ.42XrmIlH.js → chunk-AQP2D5EJ.CyokdHT3.js} +1 -1
  123. package/web/_astro/{chunk-FMBD7UC4.Bao2wMK9.js → chunk-FMBD7UC4.Bg9KJhjW.js} +1 -1
  124. package/web/_astro/{chunk-ND2GUHAM.BhydojD1.js → chunk-ND2GUHAM.1gxxI-vD.js} +1 -1
  125. package/web/_astro/{chunk-QZHKN3VN.CmZ82g-H.js → chunk-QZHKN3VN.DDEYtCKU.js} +1 -1
  126. package/web/_astro/{classDiagram-4FO5ZUOK.Blr83Gt_.js → classDiagram-4FO5ZUOK.Ch3zi37T.js} +1 -1
  127. package/web/_astro/{classDiagram-v2-Q7XG4LA2.Blr83Gt_.js → classDiagram-v2-Q7XG4LA2.Ch3zi37T.js} +1 -1
  128. package/web/_astro/{cose-bilkent-S5V4N54A.qmfv0SPn.js → cose-bilkent-S5V4N54A.D2q5AINI.js} +1 -1
  129. package/web/_astro/{cynefin-OW5HDTMX.BtELhXPR.js → cynefin-OW5HDTMX.BA9kC2YT.js} +1 -1
  130. package/web/_astro/{dagre-BM42HDAG.AWmaAvXo.js → dagre-BM42HDAG.CHO08nRp.js} +1 -1
  131. package/web/_astro/{diagram-2AECGRRQ.DdH34KDi.js → diagram-2AECGRRQ.BfFQt0LW.js} +1 -1
  132. package/web/_astro/{diagram-5GNKFQAL.BmNPix1k.js → diagram-5GNKFQAL.CHMwMTe4.js} +1 -1
  133. package/web/_astro/{diagram-KO2AKTUF.BNQd_Ppo.js → diagram-KO2AKTUF.BJ-7gK-w.js} +1 -1
  134. package/web/_astro/{diagram-LMA3HP47.BAPgDi0e.js → diagram-LMA3HP47.C5xqcc0t.js} +1 -1
  135. package/web/_astro/{diagram-OG6HWLK6.DZ4zyLdC.js → diagram-OG6HWLK6.C2pQjfrC.js} +1 -1
  136. package/web/_astro/{erDiagram-TEJ5UH35.Q1TySMmw.js → erDiagram-TEJ5UH35._FoNyxgC.js} +1 -1
  137. package/web/_astro/{flowDiagram-I6XJVG4X.BXhFBicG.js → flowDiagram-I6XJVG4X.B_ENkT2I.js} +1 -1
  138. package/web/_astro/{ganttDiagram-6RSMTGT7.vHSgcuo2.js → ganttDiagram-6RSMTGT7.B3q8h77C.js} +1 -1
  139. package/web/_astro/{gitGraphDiagram-PVQCEYII.Bi1f73C7.js → gitGraphDiagram-PVQCEYII.QWZFDboZ.js} +1 -1
  140. package/web/_astro/index.BFyW13JJ.css +1 -0
  141. package/web/_astro/{infoDiagram-5YYISTIA.DPvXZEWm.js → infoDiagram-5YYISTIA.Cs6eEc92.js} +1 -1
  142. package/web/_astro/{ishikawaDiagram-YF4QCWOH.Cz829fsV.js → ishikawaDiagram-YF4QCWOH.BU9DJMHA.js} +1 -1
  143. package/web/_astro/{journeyDiagram-JHISSGLW.enRnB9Me.js → journeyDiagram-JHISSGLW.D35k6Jpe.js} +1 -1
  144. package/web/_astro/{kanban-definition-UN3LZRKU.DnTNk6d2.js → kanban-definition-UN3LZRKU.DBqcAT4m.js} +1 -1
  145. package/web/_astro/{linear.BzGnBwNL.js → linear.D-LSNK8W.js} +1 -1
  146. package/web/_astro/{mermaid.core.CSbTpIVz.js → mermaid.core.CSruWVOa.js} +4 -4
  147. package/web/_astro/{mindmap-definition-RKZ34NQL.DGJDy8zT.js → mindmap-definition-RKZ34NQL.BiFaUsfj.js} +1 -1
  148. package/web/_astro/{pieDiagram-4H26LBE5.HSPdi5_8.js → pieDiagram-4H26LBE5.D1KTKqb9.js} +1 -1
  149. package/web/_astro/{quadrantDiagram-W4KKPZXB.6Gv8mz2Y.js → quadrantDiagram-W4KKPZXB.DBHflsMG.js} +1 -1
  150. package/web/_astro/{requirementDiagram-4Y6WPE33.CnBCtFwa.js → requirementDiagram-4Y6WPE33.hwX9CNdk.js} +1 -1
  151. package/web/_astro/{sankeyDiagram-5OEKKPKP.5M8VWAu8.js → sankeyDiagram-5OEKKPKP.DkI8mJiE.js} +1 -1
  152. package/web/_astro/{sequenceDiagram-3UESZ5HK.DN41XN-U.js → sequenceDiagram-3UESZ5HK.DMz7jBDx.js} +1 -1
  153. package/web/_astro/{stateDiagram-AJRCARHV.ErOO3W8j.js → stateDiagram-AJRCARHV.B6Ef2xJ1.js} +1 -1
  154. package/web/_astro/{stateDiagram-v2-BHNVJYJU.B_ZHICM-.js → stateDiagram-v2-BHNVJYJU.CgoaufB9.js} +1 -1
  155. package/web/_astro/{timeline-definition-PNZ67QCA.CWdosr07.js → timeline-definition-PNZ67QCA.B3c8h1t-.js} +1 -1
  156. package/web/_astro/{vennDiagram-CIIHVFJN.BHzYjNV5.js → vennDiagram-CIIHVFJN.BdHPAxAb.js} +1 -1
  157. package/web/_astro/{wardleyDiagram-YWT4CUSO.h8x4IwPX.js → wardleyDiagram-YWT4CUSO.BrJXPPAj.js} +1 -1
  158. package/web/_astro/{xychartDiagram-2RQKCTM6.RTapW2X8.js → xychartDiagram-2RQKCTM6.CMH5yFsV.js} +1 -1
  159. package/web/index.html +2 -2
  160. package/web/spur_logo.svg +1 -1
  161. package/config/proportional-route-table.ts +0 -155
  162. package/plugins/sp/scripts/daily-summary/logger.ts +0 -28
  163. package/web/_astro/TaskDetail.Cxov1_N_.js +0 -1
  164. package/web/_astro/channel.D4nG9YLf.js +0 -1
  165. package/web/_astro/index.BhSwN8yY.css +0 -1
  166. /package/plugins/sp/{hooks → lib}/context-owner.ts +0 -0
  167. /package/plugins/sp/{hooks → lib}/destructive-policy.ts +0 -0
  168. /package/plugins/sp/{hooks → lib}/task-file-policy.ts +0 -0
@@ -272,15 +272,18 @@ plugins/sp/
272
272
  │ └── wayfinder/ # Multi-session investigation maps (SKILL.md only)
273
273
  ├── commands/ # Slash-command wrappers — the SSOT (hand-editable thin wrappers; see Commands below)
274
274
  ├── agents/ # 4 specialist subagents (expert-spur, super-coder, super-planner, super-reviewer)
275
- ├── hooks/ # hooks.json + task-write-guard.{ts,test.ts} + context-{session-start,post-tool,session-stop}.ts
276
- │ # + agent-lifecycle.{ts,test.ts} + fleet-guest-stop.{ts,test.ts} (fleet member/guest hooks)
277
- │ # + careful-guard.{ts,test.ts} + context-hooks.test.ts + token-estimate.test.ts
278
- │ # + shared policy modules: agent-hint.ts, destructive-policy.{ts,test.ts}, task-file-policy.{ts,test.ts}
279
- │ # + pi/guard-extension.{ts,test.ts} (plugin.json `extensions.pi` entry point)
275
+ ├── hooks/ # hooks.json + one thin entry per registered identity
276
+ │ # + task-write-guard.ts (compat shim) + careful-guard.ts (opt-in, unwired)
277
+ │ # + pi/guard-extension.ts (plugin.json `extensions.pi` entry point)
278
+ │ # entries delegate to lib cores (task 1174); hook suites live in tests/hooks/
279
+ ├── lib/ # Handwritten plugin cores — context-{post-tool,session-start,session-stop}.ts,
280
+ │ # agent-hint.ts, context-owner.ts, destructive-policy.ts, task-file-policy.ts,
281
+ │ # env.ts, plus generated *.generated.mjs|.d.mts bundles over packages/app
280
282
  ├── scripts/ # Executable helpers, split from prompts (ADR-031) — batch-preflight.ts + scripts/<skill>/
281
- │ # (daily-summary: {daily-summary, logger}.ts; dogfood-testing: {detect-pipeline-driving, validate-report}.ts)
282
- ├── tests/ # Plugin tests — skill-structure.test.ts + batch-preflight.test.ts + per-skill suites (command-contract moved to scripts/commands/)
283
- ├── evals/ # Skill behavioral eval harness (scenarios + judge + run-eval runner)
283
+ │ # (daily-summary: daily-summary.ts; dogfood-testing: {detect-pipeline-driving, validate-report}.ts)
284
+ ├── tests/ # Plugin tests — skill-structure.test.ts + hooks/ (guard, context, Pi suites)
285
+ │ # + evals/ (behavioral eval corpus + judge; see tests/evals/README.md,
286
+ │ # runner at scripts/commands/skill-eval.ts) + per-skill suites
284
287
  ├── plugin.json # Marketplace entry
285
288
  └── README.md # This file
286
289
  ```
@@ -512,8 +515,9 @@ hint on first launch, and `context-session-stop` closes out the session record.
512
515
  `SPUR_SPEC_ID` is set, so outside a fleet it makes no call. `fleet-guest-stop` delivers pending
513
516
  inbox work to a session joined as a fleet guest at turn end; any other session passes through.
514
517
 
515
- **Available but unwired:** `careful-guard.ts` ships in `hooks/` (with tests) as an opt-in
516
- `PreToolUse` guard that asks before destructive shell commands (`rm -rf`, `DROP TABLE`,
518
+ **Available but unwired:** `careful-guard.ts` ships in `hooks/` (its suite is
519
+ `tests/hooks/careful-guard.test.ts`) as an opt-in `PreToolUse` guard that asks before destructive
520
+ shell commands (`rm -rf`, `DROP TABLE`,
517
521
  `git push --force`, …) — it is **not** registered in `hooks.json`. Fail-open by contract; escape
518
522
  hatch `SPUR_CAREFUL=off`.
519
523
 
@@ -529,19 +533,21 @@ hold `SKILL.md` and prompt-side companions only.
529
533
  | Script | Role |
530
534
  | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
531
535
  | `hooks/task-write-guard.ts` | Compatibility shim for older installs that still execute the script path directly. Forwards stdin to the stable PATH command `superskill hook run sp task-write-guard`, mirrors parseable PreToolUse decisions, and fails open if the runtime is unavailable. Performs no source-tree CLI lookup. |
532
- | `hooks/context-*.ts` | Runtime for the three registered context hooks (session-start, post-tool, session-stop) — token-cost estimation + ledger append for `sp:indexed-context` |
536
+ | `hooks/context-*.ts` | argv/stdin entries for the three registered context hooks; the capture, ledger and session logic is the `lib/context-*.ts` core (task 1174) |
533
537
  | `hooks/{agent-lifecycle,fleet-guest-stop}.ts` | Fleet hooks (1080/1081): member lifecycle reports via `spur agent report`; turn-end inbox delivery to joined guests |
534
- | `hooks/careful-guard.ts` | Opt-in destructive-command guard (unwired — see Hooks above) |
538
+ | `hooks/careful-guard.ts` | Opt-in destructive-command guard (unwired — see Hooks above); policy is `lib/destructive-policy.ts` |
539
+ | `lib/context-{post-tool,session-start,session-stop}.ts` | Redaction-capped ledger append, session open/ownership and owner-gated teardown for `sp:indexed-context` |
540
+ | `lib/{agent-hint,context-owner,destructive-policy,task-file-policy}.ts` | Shared hook cores — agent/model hint resolution, host-native session owner derivation, destructive-command classification, task-file matching |
535
541
  | `scripts/batch-preflight.ts` | Pure TABLE A STOP evaluation for `super-planner` — skip doomed pipeline launches without spawning a Skill subprocess; recovery hints map stuck statuses to a single `/sp:dev-*` hop |
536
542
  | `scripts/workflow-step-profile.ts` | Thin glue over the generated lib bundle (`lib/step-profile.generated.mjs` from `packages/app/src/workflow/step-profile.ts`) — read-only step profile from `spur workflow trace`: per node and action-kind durations, idle gaps, session mode and `cacheHit` coverage, plus the ADR-115 cache-window flags `sp:spur-doctor` turns into workflow-optimization proposals |
537
- | `scripts/dogfood-testing/detect-pipeline-driving.ts` | Word-boundary detector for pipeline-driving testees (leading-space invariant) |
538
- | `scripts/dogfood-testing/validate-report.ts` | Pure `validateReport(md)` — footer-mandatory + 7-check finalize-or-abort contract with stable error codes |
539
- | `scripts/daily-summary/{daily-summary,logger}.ts` | ccusage + git-history orchestration helpers for `sp:daily-summary` |
543
+ | `scripts/dogfood-testing/detect-pipeline-driving.ts` | Live Phase 1.0 CLI gate over `lib/dogfood-pipeline.ts` — word-boundary detector for pipeline-driving testees (leading-space invariant) |
544
+ | `scripts/dogfood-testing/validate-report.ts` | CLI entry over `lib/dogfood-report.ts` — pure `validateReport(md)`, footer-mandatory + 7-check finalize-or-abort contract with stable error codes |
545
+ | `scripts/daily-summary/daily-summary.ts` | ccusage + git-history orchestration helpers for `sp:daily-summary`, with its own console toggle |
540
546
  | `scripts/task-diffstat.ts` | 0943 triage-lane diffstat producer — numstat + untracked scan vs the run base; writes `<wbs>-diffstat.json` with the sensitive-path flag; fails safe (sensitive) |
541
547
  | `scripts/run-summary.ts` | Measured execution summary `/sp:dev-run` / `/sp:dev-runall` print by default (`--no-summary` skips) — windows the host transcript by `spur workflow progress` attempt timestamps; per stage/run time, wait, tool calls, total / non-cached tokens; `n/a` for subprocess windows |
542
548
  | `scripts/session-timeline.ts` | Measured Time/Wait/Token evidence for `sp:session-review` — reads the active Claude Code transcript read-only, one segment per operator prompt, usage deduplicated by message id, tokens split total / non-cached; `{available:false}` exit 0 when no transcript |
543
549
  | `scripts/commands/validate-flag-contracts.ts` | Mechanical consistency gate — compares flag claims across command files, flag-glossary, cross-cutting, dev-operations, and ADR; reports disagreements |
544
- | `*.test.ts` | Unit suites — in `hooks/` for guards, in `tests/<skill>/` per ADR-031 pairing |
550
+ | `*.test.ts` | Unit suites — `tests/hooks/` for the hook entries and their lib cores, `tests/<skill>/` per ADR-031 pairing |
545
551
 
546
552
  **Design principle:** Scripts are **deterministic enforcement**. Unlike skills (which are advisory
547
553
  knowledge consumed by the LLM), scripts run as code and make binary allow/deny decisions. They are
@@ -200,6 +200,7 @@ shallower.
200
200
  **Scope:** <wbs diff | path glob>
201
201
  **Dimensions:** functional, security, efficiency, correctness, usability, architecture
202
202
  **Verdict:** PASS | PARTIAL | FAIL
203
+ **Confidence:** HIGH | MEDIUM | LOW
203
204
  ##### Findings (ranked)
204
205
 
205
206
  | # | Priority | Dimension | Finding | Location | Disposition |
@@ -225,6 +226,51 @@ FAIL, PARTIAL, a missing line, a line split across two lines — routes the run
225
226
  `review-fail-triage` and its bounded repair hop. Keep it on one line, in that shape, in every
226
227
  review answer; never restate it as prose only.
227
228
 
229
+ **The Confidence line is machine-read too (one confidence contract, 2026-10-12).** Every review
230
+ report carries exactly one `Confidence: HIGH | MEDIUM | LOW` line, stated at the level the review can
231
+ actually defend — the same enum and the same earning rule the verify answer uses
232
+ ([verdict-schema.md](../skills/code-verification/references/verdict-schema.md) § Confidence level):
233
+
234
+ - `HIGH` — every requirement row is `MET`, every finding carries a disposition, and the report cites
235
+ its evidence. `HIGH` says the evidence needs no re-check.
236
+ - `MEDIUM` — the verdict holds but evidence gaps remain; name them.
237
+ - `LOW` — the verdict rests on unverified assumptions that could plausibly flip it; name them.
238
+
239
+ A missing line, a level outside the enum, or a `HIGH` the rows do not earn turns an otherwise usable
240
+ PASS into a refused one: consumer repositories gate the review answer artifact and every level it
241
+ claims, exactly as they gate the verify answer. This is a contract change — review answers written
242
+ before it were never asked for a level, so pre-adoption artifacts read as debt, not defects.
243
+
244
+ **Machine-checked at the gate.** The pipeline's own review PASS edges enforce the line before verify:
245
+ `residual-scan review-gate` reads the recorded `### Review` body, and a missing, duplicated or
246
+ out-of-enum level becomes a **blocking** `review-contract` item — `review → verify` stops and the run
247
+ enters `review-fail-triage` with the bounded repair hop, exactly as an open P1–P3 row does. The gate
248
+ checks the recorded section's presence and vocabulary; the same scanner grades the answer passed
249
+ by both PASS edges and refuses a `LOW` (or ungraded) PASS unless the operator sets
250
+ `ackLowConfidence` exactly to `true` (task 1204 — the same policy the verify
251
+ chain enforces), so whether a level is *earned* stays a judgement call (see the earning rule above):
252
+ the report must still argue it.
253
+
254
+ **Source citations for external claims (one claim contract, 2026-10-12).** A Finding cell or a
255
+ Functional Traceability `Evidence` cell that asserts an external API/library claim carries a
256
+ verifiable citation in the SAME cell — a repo `path:line(-end)`, the external named-origin form
257
+ (@origin `path` line N, line number outside the backticks), or an http(s) URL. It is the verify
258
+ answer's rule verbatim, owned by
259
+ [verdict-schema.md](../skills/code-verification/references/verdict-schema.md) § Source citations
260
+ for external claims — claim markers and accepted forms are defined once there and are not restated
261
+ here. The findings table's `Location` column does not stand in for it: `Location` anchors the
262
+ finding's subject, not the claim's source. Cell-free receipts (test counts, reviewed-log notes)
263
+ assert no external claim and need no citation. An uncited external claim is an assumption, so it
264
+ caps the level the report can defend (above).
265
+
266
+ **Machine-checked at the gate (findings table).** `residual-scan review-gate` applies the same two
267
+ predicates to every finding row: a Finding cell carrying one of the verify lint's claim markers with
268
+ no citation form becomes a **blocking** `review-contract` item, so `review → verify` stops and the
269
+ run enters `review-fail-triage`. The `Location` column is deliberately not consulted as a citation —
270
+ that is the rule stated above, and a gate that accepted it would pass every row that has an anchor.
271
+ Functional Traceability `Evidence` cells stay reviewer-enforced (SECUA review): they are free prose
272
+ in a table the gate does not parse.
273
+
228
274
  **No findings.** Never invent a defect to populate the table. Emit one substantive `P4 (advisory)`
229
275
  row that states what was reviewed and what was found — placeholder cells (empty, `—`, `n/a`) are
230
276
  rejected by the checker, and so they should be:
@@ -1,8 +1,11 @@
1
1
  # Workspace-local test config (task 1127 R8/AC7, mirroring apps/cli's 0699 R3 precedent): without
2
- # it, `cd plugins/sp && bun test` — the run AGENTS.md prescribes — skipped the root preload and
3
- # resolved the operator's real ~/.config/spur/run/full-gate.lock. These suites then waited silently
4
- # behind any live host-wide gate holder (their holder line is swallowed by `silenceStdout`), which
5
- # is the dispatch-budget burn this task exists to remove. Coverage stays gated by the root bunfig
6
- # (bun run test).
2
+ # it, `cd plugins/sp && bun test` — the run AGENTS.md prescribes — skipped the root preload, so these
3
+ # suites lost the shared test setup (logger muting, the util shims, and the hermeticity env that keeps
4
+ # tests off the operator's real ~/.config/spur/ config, projects registry and slash-command catalog).
5
+ # Coverage stays gated by the root bunfig (bun run test).
6
+ #
7
+ # Historical: this comment once justified the preload by a host-wide `full-gate.lock` wait. That lock
8
+ # was deleted in `refactor(gate): remove gate-lock mechanism and simplify quality-gate`; the preload
9
+ # is still required, for the reasons above (task 1173 R5).
7
10
  [test]
8
11
  preload = ["../../tests/setup.ts"]
@@ -26,5 +26,5 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
26
26
 
27
27
  ## Implementation
28
28
 
29
- Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#8-changelog) (changelog). This is a docs-only generator: run no quality gates (lint, tests, `spur-check`, rules, citation checks).
29
+ Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#8-changelog) (changelog). This is a docs-only generator: run no quality gates (`bun run gate`, lint, typecheck, tests, `spur-check`, rules, citation checks) — a generic "verify before finishing" rule does not apply here.
30
30
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Generate conventional commit message(s) from the current change set via one bounded gather call, optionally commit
3
3
  role: scribe
4
- argument-hint: "[--commit] [--squash] [--all] [--scope <path>]"
4
+ argument-hint: "[--commit] [--squash] [--all] [--scope <path>] [--check <cmd>]"
5
5
  allowed-tools: ["Bash", "Read"]
6
6
  ---
7
7
 
@@ -17,12 +17,13 @@ Implements an inline procedure — see [dev-operations.md](../skills/spur-dev/re
17
17
  | `--squash` | Collapse every concern into one message and one commit; implies `--commit`. | off |
18
18
  | `--all` | Widen the change set past the index to every change in the tree — unstaged **and untracked**. | off |
19
19
  | `--scope` `<path>` | Path filter on the change set; always wins over change-set auto-discovery. | the whole change set |
20
+ | `--check` `<cmd>` | Run `<cmd>` (e.g. `"bun run gate"`) once before committing; non-zero → commit nothing. | off |
20
21
 
21
22
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
22
23
 
23
24
  ## Usage
24
25
 
25
- /sp:dev-gitmsg [--commit] [--squash] [--all] [--scope <path>]
26
+ /sp:dev-gitmsg [--commit] [--squash] [--all] [--scope <path>] [--check <cmd>]
26
27
 
27
28
  ## Implementation
28
29
 
@@ -35,3 +36,6 @@ commit per concern, split automatically, so the operator is never asked to re-st
35
36
  `--squash` → one commit for everything. An empty index widens to the whole tree only on a
36
37
  message-only run, and says so; a committing run stops there and prints the exact `--all` re-run line
37
38
  instead of guessing.
39
+ No quality gate (`bun run gate`, lint, typecheck, tests, `spur-check`) runs unless `--check <cmd>`
40
+ names one — then it runs once, before any commit, and a failure commits nothing. Gate → auto-fix →
41
+ commit is `/sp:dev-gtd --no-push`.
@@ -24,4 +24,5 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
24
24
  ## Implementation
25
25
 
26
26
  Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#11-handover) (handover).
27
+ Run no quality gate (`bun run gate`, lint, typecheck, tests, `spur-check`); cite results already on record.
27
28
 
@@ -24,6 +24,7 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
24
24
  ## Implementation
25
25
 
26
26
  Follow [job-dump](../skills/spur-dev/references/dev-operations.md#11a-job-dump), using the shared
27
- handoff template to capture the current job and its remaining work.
27
+ handoff template to capture the current job and its remaining work. Run no quality gate
28
+ (`bun run gate`, lint, typecheck, tests, `spur-check`); copy existing gate results or write `not run`.
28
29
 
29
30
  Skill(skill="sp:spur-dev", args="job-dump $ARGUMENTS")
@@ -18,6 +18,14 @@ Wraps the **sp:spur-dev** skill. Three jobs:
18
18
  `standard` checks only that target sections are structurally complete. It never re-checks what
19
19
  they say. Use `ready` whenever the existing content itself is in doubt.
20
20
 
21
+ **Refine never writes `feature_id`.** It may *report* an orphan task in its result, but linking a
22
+ task to a feature is an operator decision with a lifecycle blast radius: `spur task update <wbs>
23
+ --feature <id>` reopens a `verifying` parent unless `--no-reopen` is passed. Route linking through
24
+ the opt-in [feature-link helper](../skills/spur-dev/references/feature-link-helper.md) (never
25
+ gate-time, never automatic, always confirmed) — observed 2026-10-13: the ready-preparation refine
26
+ that `spur task create` dispatches by default linked a fresh task to `P1` on its own and demoted
27
+ that feature `verifying → active`.
28
+
21
29
  ## Argument Flags
22
30
 
23
31
  | Flag | Description | Default |
@@ -47,9 +55,13 @@ implement without inventing design:
47
55
  1. Audit every existing claim against the current tree: facts, cited sources, fix soundness across
48
56
  all callers, test observability, environment, concurrent work, and scope.
49
57
  2. Correct what is wrong and record each change in a dated `**Refine corrections (<date>)**` block
50
- in Background.
58
+ in Background. When the task bundles several issues, triage each one. An issue that is invalid,
59
+ already fixed or owned elsewhere is removed together with its R-items, Design/Solution notes,
60
+ Plan steps and ACs. If no issue stays valid, cancel the task (`spur task update <wbs> cancelled`)
61
+ and report `cancelled` instead of promoting it.
51
62
  3. Run `spur task check <wbs> --as todo --json`, fill unset priority/estimate, and promote
52
- `backlog → todo`.
63
+ `backlog → todo`. If triage dropped issues, re-estimate and record old → new. Also record a
64
+ title that still names dropped scope; the CLI cannot rename a task.
53
65
  4. Report checklist rows `{id, pass, evidence}`.
54
66
 
55
67
  Refine targets `backlog`/`todo` tasks; a `wip`-or-later task needs explicit operator consent and is
@@ -54,7 +54,13 @@ not a bug.
54
54
  **Depth:** default `standard` keeps the cheap L3 SKIP gate under `--auto`. Use
55
55
  `--depth ready` when handing a feature to another implementer (frozen Design/Requirements/Plan),
56
56
  or when the tasks' existing content is in doubt; thread `--depth` into each per-task refine. Ready
57
- report rows add corrections count, status before → after, and failed checklist ids.
57
+ report rows add corrections count, dropped issues, status before → after, and failed checklist ids.
58
+ Each task's issues are triaged one by one: invalid ones are dropped with their fixes, and a task
59
+ with no valid issue left is `cancelled`. The ready report also proposes merges between overlapping
60
+ tasks, ordering or a shared step for complementary ones, and owning features for tasks without a
61
+ `feature_id`. It executes neither unless
62
+ `--description` names the task and action, for example
63
+ `--description "cancel 0273 and merge its issues into 0269; link 0260 and 0274 to G11"`.
58
64
 
59
65
  > **`--next` dropped** (feature H8, 2026-07-31). Batch-level chaining was a token bomb — each refine
60
66
  > hop is an LLM call, and a large feature means N refine chains fanned out at once. For batch
@@ -43,6 +43,7 @@ Put the target first: a bare token after `--worktree` is read as the worktree na
43
43
  - **WBS mode (per task target):** `Skill(skill="sp:functional-review", args="<wbs> $FLAGS")` + `Skill(skill="sp:code-verification", args="review <wbs> $FLAGS")` + `Skill(skill="sp:code-improvement", args="<wbs> $FLAGS")` (functional traceability + SECUA framework + architectural depth — each skill receives its one resolved WBS exactly once plus `$FLAGS` = `$ARGUMENTS` minus the selector (`--tasks`/`--feature`/`--scope` or positional) and its value, never the raw selector, and returns a review fragment only — F92 0593 R1)
44
44
  - **Task fan-out (`--tasks` / `--feature`).** One WBS-mode review per task in the frozen set. Tasks in `backlog`/`todo`/`blocked` are reported NOT-STARTED and skipped (§ 3a outcome vocabulary); a per-task failure does not stop the remaining tasks. Each implemented task gets its own merged `## Review`; the run ends with a combined summary table (WBS, verdict, P1/P2 counts).
45
45
  - Coordinator = this session. No `sp:super-reviewer` subagent is dispatched: act as the review coordinator defined in [agents/super-reviewer.md](../agents/super-reviewer.md) — merge the fragments per its Output Format (native `P1`–`P4` priority cells, section-relative headings) and, for every task target (standalone or pipeline), write that task's combined `## Review` via `spur task update <wbs> --section Review --from-file`. Path mode emits advisory output only.
46
+ - **Answer contract (pipeline dispatches).** The captured review answer (`.spur/run/<runId>-review-answer.txt`) must carry exactly one `Verdict: PASS|FAIL` line and exactly one `Confidence: HIGH|MEDIUM|LOW` line stating how strongly the review stands behind its verdict — HIGH = the reviewer re-executed the checks behind the verdict, MEDIUM = partial reliance on prior/external evidence, LOW = key evidence not re-executed. The pipeline's PASS edges admit HIGH/MEDIUM unadorned; LOW or an absent line crosses only with the operator's `ackLowConfidence` (same policy as the verify confidence gate, task 1068).
46
47
  - **Path mode (per path target):** `Skill(skill="sp:code-verification", args="review <path> $FLAGS")` + `Skill(skill="sp:code-improvement", args="<path> $FLAGS")` (advisory SECUA quality + architectural depth — one normalized path forwarded once plus `$FLAGS`; performs no task mutation). Under `--scope <path>[,<path>]`: paths must exist (exit 2 otherwise), are normalized, duplicates dropped and nested paths collapse to the ancestor (`--scope apps,apps/cli` → `apps`); each surviving path gets a sub-review (Step 3p path scope), eligible for native-subagent dispatch per [dispatch-surface.md](../skills/parallel-execution/references/dispatch-surface.md); the coordinator merges the sub-reviews, runs **one** cross-path architecture pass (`sp:code-improvement` over the inter-path imports), and emits **one** advisory report. No task mutation.
47
48
  - **Positional alias (deprecated).** A positional `<wbs|path>` is accepted for one release: a `^\d{4}$` token with a resolvable task behaves as `--tasks <wbs>`; an existing path as `--scope <path>`; otherwise exit 2. Print a deprecation warning naming the replacement selector; removal is a follow-up.
48
49
  - `--triage`: after the review returns, run the triage protocol in [dev-operations.md § 2. review](../skills/spur-dev/references/dev-operations.md#2-review) **inline in this session** — the review skills and `sp:super-reviewer` stay report-only. With multiple targets, bucket the findings across all targets once (identical `file:line` findings deduped before bucketing). `Edit`/`Write` in `allowed-tools` exist only for these direct fixes.
@@ -22,8 +22,8 @@
22
22
  * adapter. This file owns the Claude Code payload/decision shape only.
23
23
  */
24
24
 
25
+ import { classifyCommand } from '../lib/destructive-policy';
25
26
  import { getEnvVar } from '../lib/env';
26
- import { classifyCommand } from './destructive-policy';
27
27
 
28
28
  interface ToolPayload {
29
29
  tool_name?: string;