@gobing-ai/spur 0.4.1 → 0.4.3

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 (159) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.global.yaml +4 -2
  3. package/config/decisions/maker-liveness.yaml +39 -0
  4. package/config/plugin-scripts.json +0 -4
  5. package/config/rules/README.md +1 -0
  6. package/config/rules/docs/sourced-api-claims.yaml +56 -12
  7. package/config/rules/strict/runtime-boundaries.yaml +7 -0
  8. package/config/script-placement-baseline.json +1 -19
  9. package/config/templates/AGENTS.md +1 -1
  10. package/config/workflows/feature-lifecycle.yaml +46 -1
  11. package/config/workflows/feature-verification.yaml +11 -0
  12. package/config/workflows/wrapup-pipeline.yaml +1 -1
  13. package/package.json +10 -10
  14. package/plugins/sp/README.md +23 -18
  15. package/plugins/sp/agents/super-planner.md +5 -6
  16. package/plugins/sp/agents/super-reviewer.md +43 -0
  17. package/plugins/sp/bunfig.toml +8 -5
  18. package/plugins/sp/commands/dev-review-session.md +2 -1
  19. package/plugins/sp/commands/dev-runall.md +18 -9
  20. package/plugins/sp/hooks/careful-guard.ts +1 -1
  21. package/plugins/sp/hooks/context-post-tool.ts +7 -404
  22. package/plugins/sp/hooks/context-session-start.ts +6 -192
  23. package/plugins/sp/hooks/context-session-stop.ts +6 -91
  24. package/plugins/sp/hooks/pi/guard-extension.ts +26 -12
  25. package/plugins/sp/hooks/task-write-guard.ts +1 -1
  26. package/plugins/sp/{hooks → lib}/agent-hint.ts +1 -1
  27. package/plugins/sp/lib/context-owner.ts +56 -0
  28. package/plugins/sp/lib/context-post-tool.ts +432 -0
  29. package/plugins/sp/lib/context-session-start.ts +214 -0
  30. package/plugins/sp/lib/context-session-stop.ts +196 -0
  31. package/plugins/sp/lib/dogfood-pipeline.ts +265 -0
  32. package/plugins/sp/lib/dogfood-report.ts +278 -0
  33. package/plugins/sp/lib/idea-handoff.generated.mjs +6 -4
  34. package/plugins/sp/lib/inline-run-app.ts +40 -0
  35. package/plugins/sp/lib/inline-run.generated.d.mts +3 -3
  36. package/plugins/sp/lib/inline-run.generated.mjs +1361 -87
  37. package/plugins/sp/lib/plan-projection.generated.d.mts +169 -0
  38. package/plugins/sp/lib/plan-projection.generated.mjs +704 -1
  39. package/plugins/sp/lib/quality-gate.generated.d.mts +0 -12
  40. package/plugins/sp/lib/quality-gate.generated.mjs +62 -231
  41. package/plugins/sp/lib/residual-scan.generated.d.mts +7 -1
  42. package/plugins/sp/lib/residual-scan.generated.mjs +71 -6
  43. package/plugins/sp/lib/run-summary-core.ts +34 -370
  44. package/plugins/sp/lib/transcript.ts +37 -200
  45. package/plugins/sp/plugin.json +1 -1
  46. package/plugins/sp/references/roles.md +1 -1
  47. package/plugins/sp/scripts/batch-plan.mjs +740 -1
  48. package/plugins/sp/scripts/batch-plan.ts +48 -3
  49. package/plugins/sp/scripts/batch-preflight.mjs +23 -1
  50. package/plugins/sp/scripts/batch-preflight.ts +35 -295
  51. package/plugins/sp/scripts/daily-summary/daily-summary.mjs +108 -87
  52. package/plugins/sp/scripts/daily-summary/daily-summary.ts +111 -104
  53. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.mjs +2 -1
  54. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts +7 -265
  55. package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +3 -0
  56. package/plugins/sp/scripts/dogfood-testing/validate-report.ts +6 -272
  57. package/plugins/sp/scripts/feature-verification-steps.mjs +7 -123
  58. package/plugins/sp/scripts/feature-verification-steps.ts +29 -181
  59. package/plugins/sp/scripts/inline-run-dispatch.mjs +27 -26
  60. package/plugins/sp/scripts/inline-run-dispatch.ts +1 -21
  61. package/plugins/sp/scripts/inline-run-setup.mjs +158 -120
  62. package/plugins/sp/scripts/inline-run-setup.ts +1 -21
  63. package/plugins/sp/scripts/pr-reviewing.mjs +19 -5
  64. package/plugins/sp/scripts/pr-reviewing.ts +34 -9
  65. package/plugins/sp/scripts/quality-gate.mjs +38 -208
  66. package/plugins/sp/scripts/residual-scan.mjs +73 -6
  67. package/plugins/sp/scripts/residual-scan.ts +8 -5
  68. package/plugins/sp/scripts/run-summary.mjs +160 -95
  69. package/plugins/sp/scripts/run-summary.ts +7 -5
  70. package/plugins/sp/scripts/session-timeline.mjs +57 -29
  71. package/plugins/sp/scripts/session-timeline.ts +4 -18
  72. package/plugins/sp/scripts/task-diffstat.mjs +43 -30
  73. package/plugins/sp/scripts/task-diffstat.ts +40 -71
  74. package/plugins/sp/skills/code-implementation/SKILL.md +7 -1
  75. package/plugins/sp/skills/code-verification/references/secu-review.md +2 -1
  76. package/plugins/sp/skills/code-verification/references/verdict-schema.md +4 -0
  77. package/plugins/sp/skills/dogfood-testing/SKILL.md +2 -2
  78. package/plugins/sp/skills/indexed-context/SKILL.md +14 -7
  79. package/plugins/sp/skills/next-feature/SKILL.md +1 -1
  80. package/plugins/sp/skills/parallel-execution/SKILL.md +2 -2
  81. package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +2 -2
  82. package/plugins/sp/skills/parallel-execution/references/fan-out-patterns.md +2 -2
  83. package/plugins/sp/skills/pr-reviewing/SKILL.md +7 -3
  84. package/plugins/sp/skills/session-review/SKILL.md +5 -3
  85. package/plugins/sp/skills/source-driven-development/SKILL.md +7 -4
  86. package/plugins/sp/skills/spur-cli/references/builder.md +3 -2
  87. package/plugins/sp/skills/spur-cli/references/decision.md +40 -8
  88. package/plugins/sp/skills/spur-cli/references/features.md +46 -5
  89. package/plugins/sp/skills/spur-cli/references/projects.md +7 -5
  90. package/plugins/sp/skills/spur-dev/SKILL.md +2 -0
  91. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +27 -0
  92. package/plugins/sp/skills/spur-dev/references/dev-operations.md +2 -3
  93. package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +6 -1
  94. package/plugins/sp/skills/spur-dev/references/execution-batch.md +56 -7
  95. package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +4 -1
  96. package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +22 -0
  97. package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +14 -0
  98. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +13 -11
  99. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +37 -25
  100. package/spur.js +89792 -76992
  101. package/web/_astro/{BoardApp.D66k_s_T.js → BoardApp.5IIl2O-z.js} +1 -1
  102. package/web/_astro/BoardApp.Drnx-KeM.js +324 -0
  103. package/web/_astro/TaskDetail.Ci4LNn9S.js +1 -0
  104. package/web/_astro/{arc._BUadrdH.js → arc.j2EVkYVd.js} +1 -1
  105. package/web/_astro/{architectureDiagram-3BPJPVTR.Dh7xS1Pp.js → architectureDiagram-3BPJPVTR.DZWSFqEG.js} +1 -1
  106. package/web/_astro/{blockDiagram-GPEHLZMM.DFDVpfXm.js → blockDiagram-GPEHLZMM.DE6GpXCN.js} +1 -1
  107. package/web/_astro/{c4Diagram-AAUBKEIU.V7_3_glh.js → c4Diagram-AAUBKEIU.DoVR1G6B.js} +1 -1
  108. package/web/_astro/channel.DmdDxGsq.js +1 -0
  109. package/web/_astro/{chunk-2J33WTMH.De1yx7Jz.js → chunk-2J33WTMH.Do6-Gbyf.js} +1 -1
  110. package/web/_astro/{chunk-4BX2VUAB.BDhHFuxx.js → chunk-4BX2VUAB.BYV1HGHx.js} +1 -1
  111. package/web/_astro/{chunk-55IACEB6.DDLkWnmC.js → chunk-55IACEB6.CvI1zkrc.js} +1 -1
  112. package/web/_astro/{chunk-727SXJPM.CwfiLnA7.js → chunk-727SXJPM.DNGSCRlX.js} +1 -1
  113. package/web/_astro/{chunk-AQP2D5EJ.CtGDmUnM.js → chunk-AQP2D5EJ.DXhhgT5z.js} +1 -1
  114. package/web/_astro/{chunk-FMBD7UC4.BOLjpw73.js → chunk-FMBD7UC4.dzkRKP2u.js} +1 -1
  115. package/web/_astro/{chunk-ND2GUHAM.BDhQls6O.js → chunk-ND2GUHAM.DujGLeEf.js} +1 -1
  116. package/web/_astro/{chunk-QZHKN3VN.76qBynDF.js → chunk-QZHKN3VN.BWtIT3ZU.js} +1 -1
  117. package/web/_astro/{classDiagram-4FO5ZUOK.N0mpPHT0.js → classDiagram-4FO5ZUOK.DyApg0Nn.js} +1 -1
  118. package/web/_astro/{classDiagram-v2-Q7XG4LA2.N0mpPHT0.js → classDiagram-v2-Q7XG4LA2.DyApg0Nn.js} +1 -1
  119. package/web/_astro/{cose-bilkent-S5V4N54A.CKknFfjB.js → cose-bilkent-S5V4N54A.DJQB-u_l.js} +1 -1
  120. package/web/_astro/{cynefin-OW5HDTMX.Cw3ZWBAh.js → cynefin-OW5HDTMX.bi3D_siV.js} +1 -1
  121. package/web/_astro/{dagre-BM42HDAG.D3yIKCRD.js → dagre-BM42HDAG.C-f7TrRg.js} +1 -1
  122. package/web/_astro/{diagram-2AECGRRQ.D51dO83Z.js → diagram-2AECGRRQ.DrPfjHQB.js} +1 -1
  123. package/web/_astro/{diagram-5GNKFQAL.Bb-FViDj.js → diagram-5GNKFQAL.C9S4WUHO.js} +1 -1
  124. package/web/_astro/{diagram-KO2AKTUF.D3mN8S6x.js → diagram-KO2AKTUF.Dzzye8QH.js} +1 -1
  125. package/web/_astro/{diagram-LMA3HP47.dMMyPcbJ.js → diagram-LMA3HP47.DX-LRiof.js} +1 -1
  126. package/web/_astro/{diagram-OG6HWLK6.AzbvzY4C.js → diagram-OG6HWLK6.Z-kAKwIz.js} +1 -1
  127. package/web/_astro/{erDiagram-TEJ5UH35.BR5I4OZb.js → erDiagram-TEJ5UH35.D6dyClSv.js} +1 -1
  128. package/web/_astro/{flowDiagram-I6XJVG4X.DFqvhGkn.js → flowDiagram-I6XJVG4X.Cx3q2cxD.js} +1 -1
  129. package/web/_astro/{ganttDiagram-6RSMTGT7.ByJbhH6J.js → ganttDiagram-6RSMTGT7.DU3gH6CT.js} +1 -1
  130. package/web/_astro/{gitGraphDiagram-PVQCEYII.CInHjQR3.js → gitGraphDiagram-PVQCEYII.ISmCnJ87.js} +1 -1
  131. package/web/_astro/index.Do2lLdgo.css +1 -0
  132. package/web/_astro/{infoDiagram-5YYISTIA.Cm0dGVjJ.js → infoDiagram-5YYISTIA.DR6_iNOK.js} +1 -1
  133. package/web/_astro/{ishikawaDiagram-YF4QCWOH.C3nOP6Sj.js → ishikawaDiagram-YF4QCWOH.D7wY-ZGA.js} +1 -1
  134. package/web/_astro/{journeyDiagram-JHISSGLW.4IvLa2MW.js → journeyDiagram-JHISSGLW.DkP9-WK8.js} +1 -1
  135. package/web/_astro/{kanban-definition-UN3LZRKU.DS87Cl-k.js → kanban-definition-UN3LZRKU.wtgY98M2.js} +1 -1
  136. package/web/_astro/{linear.MzmRrNER.js → linear.CI6djNi7.js} +1 -1
  137. package/web/_astro/{mermaid.core.fK-WNswS.js → mermaid.core.CuQPxS8b.js} +4 -4
  138. package/web/_astro/{mindmap-definition-RKZ34NQL.BqipOHhY.js → mindmap-definition-RKZ34NQL.5HNIEG7R.js} +1 -1
  139. package/web/_astro/{pieDiagram-4H26LBE5.0nBiPqFG.js → pieDiagram-4H26LBE5.CchhDFjE.js} +1 -1
  140. package/web/_astro/{quadrantDiagram-W4KKPZXB.Szj7Zpx5.js → quadrantDiagram-W4KKPZXB.PYXXJPSJ.js} +1 -1
  141. package/web/_astro/{requirementDiagram-4Y6WPE33.D4UR6TWo.js → requirementDiagram-4Y6WPE33.cUQuNAKU.js} +1 -1
  142. package/web/_astro/{sankeyDiagram-5OEKKPKP.DAE7BdOs.js → sankeyDiagram-5OEKKPKP.BO7MnRIA.js} +1 -1
  143. package/web/_astro/{sequenceDiagram-3UESZ5HK.BP9ZVq25.js → sequenceDiagram-3UESZ5HK.D9bElyD6.js} +1 -1
  144. package/web/_astro/{stateDiagram-AJRCARHV.BQW7mIxk.js → stateDiagram-AJRCARHV.DhGdRz7I.js} +1 -1
  145. package/web/_astro/{stateDiagram-v2-BHNVJYJU.PbK4nDih.js → stateDiagram-v2-BHNVJYJU.5GvLeAoL.js} +1 -1
  146. package/web/_astro/{timeline-definition-PNZ67QCA.Ci_GvUpo.js → timeline-definition-PNZ67QCA.LtAT9haM.js} +1 -1
  147. package/web/_astro/{vennDiagram-CIIHVFJN.DNw1Y5qx.js → vennDiagram-CIIHVFJN.DRth1yLA.js} +1 -1
  148. package/web/_astro/{wardleyDiagram-YWT4CUSO.CwlkaaNe.js → wardleyDiagram-YWT4CUSO.h9MlZfcr.js} +1 -1
  149. package/web/_astro/{xychartDiagram-2RQKCTM6.MI6ZuiH_.js → xychartDiagram-2RQKCTM6.DHqy9DYA.js} +1 -1
  150. package/web/index.html +2 -2
  151. package/config/proportional-route-table.ts +0 -155
  152. package/plugins/sp/commands/dev-parallel.md +0 -37
  153. package/plugins/sp/scripts/daily-summary/logger.ts +0 -28
  154. package/web/_astro/BoardApp.D6sjAJr_.js +0 -324
  155. package/web/_astro/TaskDetail.BynLnMNc.js +0 -1
  156. package/web/_astro/channel.DZVfto-r.js +0 -1
  157. package/web/_astro/index.COh_kBxN.css +0 -1
  158. /package/plugins/sp/{hooks → lib}/destructive-policy.ts +0 -0
  159. /package/plugins/sp/{hooks → lib}/task-file-policy.ts +0 -0
@@ -7,7 +7,7 @@
7
7
  "plugins": [
8
8
  {
9
9
  "name": "sp",
10
- "version": "0.4.1",
10
+ "version": "0.4.3",
11
11
  "source": "./plugins/sp"
12
12
  }
13
13
  ]
@@ -157,8 +157,10 @@ workflows:
157
157
  # project-relative); the first layer wins per file basename (ADR-113 style).
158
158
  # `maker` selects the default DecisionMaker for every decision point, and
159
159
  # `makers` overrides it per decision id. Built-in makers: typesafe, fm-local,
160
- # laya-local (laya-local needs Apple Silicon). An unregistered name is a config
161
- # error, never a silent fallback. Inspect the effective choice with
160
+ # laya-local (laya-local needs Apple Silicon) and clef (hosted Cloudflare
161
+ # Workers AI, registered only when CLOUDFLARE_ACCOUNT_ID and
162
+ # CLOUDFLARE_AUTH_TOKEN are both set). An unregistered name is a config error,
163
+ # never a silent fallback. Inspect the effective choice with
162
164
  # `spur decision status`. `init` never overwrites this file — until you add the
163
165
  # keys, the shipped catalog's maker applies (see `status`).
164
166
  decisions:
@@ -0,0 +1,39 @@
1
+ $schema: "@gobing-ai/spur/schemas/decision-catalog.schema.json"
2
+ # Liveness probe catalog (feature P11, docs/design/decision-observability-and-adoption.md §3.4).
3
+ #
4
+ # `maker-liveness` is served by exactly one caller: `spur decision status --probe`,
5
+ # which asks it once per distinct registered effective maker to prove the maker
6
+ # answers *now* rather than inferring health from configuration. No workflow may
7
+ # reference this id — a decision whose answer classifies nothing real has no place
8
+ # in a run, and `spur decision status --reliability` would otherwise count probe
9
+ # runs as adoption evidence.
10
+ #
11
+ # The probe writes no `decision_logs` row and emits no `decision.*` event, so these
12
+ # runs never enter the recorded evidence the same report displays next to them.
13
+ #
14
+ # Resolution: this file ships in the shared layer (the installed package's
15
+ # config/decisions/). A project can override it per basename through
16
+ # .spur/decisions/ or decisions.paths (first layer wins, ADR-113 style). Replacing it
17
+ # with a catalog that omits the id makes `--probe` fail loudly before any maker call.
18
+ version: 1
19
+
20
+ defaults:
21
+ # Deliberately not the 0.7 upstream / 0.8 catalog floor. minConfidence gates
22
+ # whether an *answer* is accepted; the probe asks whether the *maker* answered.
23
+ # Under a 0.8 floor a live maker reporting 0.6 would fall back and the probe would
24
+ # report "not working" for a backend that is working. A maker that never answered
25
+ # (no-backend, timeout, error) falls back regardless of this value.
26
+ minConfidence: 0
27
+
28
+ decisions:
29
+ maker-liveness:
30
+ type: choice
31
+ # Rendered as the question when the caller passes no `instructions`: the probe
32
+ # always does pass one, so this description is the fallback wording, not the
33
+ # probe prompt.
34
+ description: >
35
+ Liveness probe. Answer `ok` if this maker can serve a decision right now.
36
+ criteria:
37
+ ok: The maker answered the question it was asked.
38
+ unclear: The maker could not answer.
39
+ fallback: unclear
@@ -22,10 +22,6 @@
22
22
  "contract": "standard",
23
23
  "twin": "daily-summary/daily-summary.mjs"
24
24
  },
25
- {
26
- "rel": "daily-summary/logger.ts",
27
- "contract": "repo-only"
28
- },
29
25
  {
30
26
  "rel": "dogfood-testing/detect-pipeline-driving.ts",
31
27
  "contract": "standard",
@@ -17,6 +17,7 @@ install or to ts-libs.
17
17
  | `surface` | `surface/` | CLI surface consistency (registerXxxCommand wiring, --json serialization) |
18
18
  | `migration` | `migration/` | Transitional helpers for the regex → `rg` evaluator move (`rg-dialect`) |
19
19
  | `ui` | `ui/` | Web UI seam boundaries (import seam, daisyUI class leak) |
20
+ | `docs` | `docs/` | Sourced API/library claims in markdown — citation anchor + HIGH/MEDIUM/LOW level. Advisory (`info`), and deliberately **not** in a preset: see the file header for its calibration audit and the one-line promotion step. |
20
21
 
21
22
  ## Presets
22
23
 
@@ -9,22 +9,43 @@ $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
9
9
  # gate runs --fail-on warning, so this rule surfaces findings for review without
10
10
  # reddening gates — changed-file enforcement happens in SECUA review).
11
11
  #
12
+ # Calibration audit (2026-10-12, `spur rule run --file … --json`, unsuppressed):
13
+ # the category was pulled from `recommended-pre-check` on 2026-10-08 for "finding
14
+ # noise" — 593 findings. The audit split them 580 `cited-version-strings` /
15
+ # 13 `cited-api-claims`, and 579 of the 580 were false positives on two shapes
16
+ # that are not external claims at all: a document's own version
17
+ # (`docs/00_ADR.md:5` → `version: 1.69.0`), a section number in a heading
18
+ # (`docs/04_DESIGN.md:116` → `### 1.0.1 Shared option registry`) and a
19
+ # `§`-numbered cross-reference (`docs/00_ADR.md:1118` → `§1.2.1`). All three are
20
+ # excluded by the pattern below — the first two on the line's shape, the third on
21
+ # the token itself. The remaining source was a stale exclude list that stopped at
22
+ # `docs/tasks4/` while the active corpus folder is `docs/tasks5/`, which alone
23
+ # produced 226 findings; it is now one `docs/tasks*/**` glob. 593 → 330 after those
24
+ # two fixes, then 277 once the `§` shape was excluded too — the residual are
25
+ # version-pinned package claims that genuinely lack a same-line anchor, and they
26
+ # stay visible rather than suppressed.
27
+ #
12
28
  # The semantic contract — every external API/library claim carries a source
13
29
  # citation (URL or path:line) AND a confidence level (HIGH/MEDIUM/LOW) — is
14
30
  # owned by the sp-source-driven-development skill and verified in SECUA review
15
- # (code-verification secu-review checklist). Generic "supports/requires" prose
16
- # is deliberately out of scope here: in this corpus it is structural writing,
17
- # not external API assertion, and would drown the signal.
31
+ # (code-verification secu-review checklist). These rules are its deterministic
32
+ # backstop: the two `cited-*` rules cover the citation half, and
33
+ # `cited-api-claims-confidence` covers the level half. All are severity `info`,
34
+ # and the category is deliberately NOT in `recommended-pre-check` — it surfaces
35
+ # findings for review without reddening gates. To promote it to a gate, add
36
+ # `- docs` to that preset's `extends` once the residual list is triaged.
18
37
  include:
19
38
  - "docs/**/*.md"
20
39
  - "plugins/sp/skills/**/references/**/*.md"
21
40
  exclude:
22
41
  # Legacy task archives are historical records — retro-citing ~900 closed
23
- # lines is make-work; the tripwire targets active authoring surfaces.
24
- - "docs/tasks/"
25
- - "docs/tasks2/"
26
- - "docs/tasks3/"
27
- - "docs/tasks4/"
42
+ # lines is make-work; the tripwire targets active authoring surfaces. One glob
43
+ # rather than the literal tasks/…tasks4/ list that let the active folder through.
44
+ # The trailing `/**` is load-bearing: `docs/tasks*/` ends as a pattern segment
45
+ # tested against `x.md`, so the anchored matcher binds nothing and the fragment
46
+ # fallback strips the `*` down to `docs/tasks/` — which is why that form
47
+ # silently excluded nothing (measured 2026-10-12).
48
+ - "docs/tasks*/**"
28
49
  - "drizzle/**"
29
50
  - "**/node_modules/**"
30
51
  rules:
@@ -41,10 +62,15 @@ rules:
41
62
  config:
42
63
  mode: forbid
43
64
  # Fire when the line has NO citation anchor (no URL, no path:line) AND
44
- # contains a semver-ish token. Lookarounds exclude IPs (127.0.0.1) and
45
- # longer dotted numerics; fenced-code lines are out of regex reach —
46
- # that residual noise is why this is warning, not error.
47
- pattern: "^(?!.*(?:https?://|(?:[\\w.-]+/)+[\\w.-]+:\\d+)).*(?<![\\d.])\\d+\\.\\d+\\.\\d+(?!\\.\\d)"
65
+ # contains a semver-ish token. Lookarounds exclude IPs (127.0.0.1),
66
+ # longer dotted numerics, a heading's section number (`### 1.0.1 Title`),
67
+ # a document-version metadata line (`version: 1.69.0`) and a `§`-numbered
68
+ # section reference (`§7.3.1`) — none of which is an external claim;
69
+ # fenced-code lines are out of regex reach — that residual noise is why
70
+ # this is info, not warning. The `§` guard sits on the token itself, not on
71
+ # the line, so a line carrying both a section reference and a real version
72
+ # still fires on the version.
73
+ pattern: "^(?!.*(?:https?://|(?:[\\w.-]+/)+[\\w.-]+:\\d+))(?!\\s*#{1,6}\\s+\\d+\\.\\d+\\.\\d+)(?!\\s*[\\w-]+:\\s*\\d+\\.\\d+\\.\\d+\\s*$).*(?<![\\d.§])\\d+\\.\\d+\\.\\d+(?!\\.\\d)"
48
74
  - id: cited-api-claims
49
75
  description: >
50
76
  A markdown line making a time- or version-anchored external API claim
@@ -58,3 +84,21 @@ rules:
58
84
  config:
59
85
  mode: forbid
60
86
  pattern: "^(?!.*(?:https?://|(?:[\\w.-]+/)+[\\w.-]+:\\d+)).*\\b(?:deprecated (?:since|in|as of)|introduced in|added in|available since|stable since)\\b"
87
+ - id: cited-api-claims-confidence
88
+ description: >
89
+ A markdown line making a time- or version-anchored external API claim
90
+ ("deprecated since 1.2", "introduced in v3", "available since 0.9") must
91
+ also state its confidence level — HIGH, MEDIUM or LOW — so a reader can
92
+ tell a checked fact from model memory; contract in
93
+ sp-source-driven-development. Pairs with `cited-api-claims`, which covers
94
+ the citation half: a line missing both halves reports once per rule,
95
+ deliberately, because each missing half is its own defect.
96
+ severity: info
97
+ evaluator:
98
+ type: regex
99
+ config:
100
+ mode: forbid
101
+ # Fires on a claim line carrying no uppercase level token. The verbs match
102
+ # `cited-api-claims` exactly, so the two rules never disagree about which
103
+ # lines are claims.
104
+ pattern: "^(?!.*\\b(?:HIGH|MEDIUM|LOW)\\b).*\\b(?:deprecated (?:since|in|as of)|introduced in|added in|available since|stable since)\\b"
@@ -38,6 +38,12 @@ rules:
38
38
 
39
39
  # Low-level system primitives:
40
40
  - "packages/app/src/services/quality-gate.ts" # gate runs `sh -c` with stdout+stderr merged onto ONE fd; ProcessExecutor captures streams separately and cannot reproduce the stream-order contract (task 1006 R1; mirrors the history-anatomy bundling exemptions)
41
+ # The feature-verification pass runs one long command with stdout+stderr merged onto the
42
+ # run's single log fd and a 4 h ceiling (the frozen contract from task 0915: `safe argv
43
+ # spawn, timeout and status handling`). ProcessExecutor captures the two streams separately
44
+ # and exposes no timeout, so it cannot reproduce either half (task 1176 R2; same class as
45
+ # the quality-gate exemption above).
46
+ - "packages/app/src/workflow/feature-verification-run.ts"
41
47
 
42
48
  - id: no-direct-fs-io
43
49
  description: "Prefer ts-runtime's FileSystem seam for fs IO."
@@ -74,6 +80,7 @@ rules:
74
80
  - "apps/cli/src/commands/workflow.ts" # FD byte-window tail of the mid-run run log for `workflow trace --follow` streaming (task 0428 / feature D2); readSync at offset over the observability sink's FDs
75
81
  - "apps/web/src/modules/discover.ts" # Vite/Astro module scanner fallback under bun test
76
82
  - "packages/app/src/services/quality-gate.ts" # gate artifacts (log/findings/receipt) written directly; merged-fd gate log and fsync-free atomic writes must stay byte-stable; bundled standalone for the bare-node plugin twin (task 1006 R1; mirrors history-anatomy.ts)
83
+ - "packages/app/src/workflow/feature-verification-run.ts" # the pass opens the run's single merged log fd (`openSync(path,'a')`) and mkdirs the run dir beside the receipt writer, exactly as the plugin entry did before the move; the fd cannot be expressed through the FileSystem seam (task 1176 R2; same class as the quality-gate exemption above)
77
84
  - "packages/app/src/services/run-storage.ts" # durable-evidence migration core (task 1025 R4): atomic tmp+rename byte copies with digest reread and atomic manifest publish must stay byte-stable (mirrors agent-usage-producer.ts / project-registry.ts exemptions)
78
85
 
79
86
  # Electron Node adapters cannot load Bun runtime implementations; keep the
@@ -16,32 +16,14 @@
16
16
  "reason": "Keep (budget exemption; reviewed W4) (plan \u00a72)",
17
17
  "exempt": true
18
18
  },
19
- "plugins/sp/scripts/feature-verification-steps.ts": {
20
- "kinds": ["budget"],
21
- "reason": "Keep (ADR-119 receipt writer; budget exemption) (plan \u00a72)",
22
- "exempt": true
23
- },
24
19
  "plugins/sp/scripts/wrapup-drift-probe.ts": {
25
20
  "kinds": ["budget", "corpus-parse"],
26
21
  "reason": "Keep (glue over capture file; budget exemption) (plan \u00a72)",
27
22
  "exempt": true
28
23
  },
29
24
  "plugins/sp/scripts/daily-summary/daily-summary.ts": {
30
- "kinds": ["budget", "db-import"],
31
- "reason": "Keep (daily-summary/, plan \u00a72); read-only history-health query via dynamic bun:sqlite import (task 1018)"
32
- },
33
- "plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts": {
34
25
  "kinds": ["budget"],
35
- "reason": "Keep (dogfood-testing/, plan \u00a72)"
36
- },
37
- "plugins/sp/scripts/dogfood-testing/validate-report.ts": {
38
- "kinds": ["budget"],
39
- "reason": "Keep (dogfood-testing/, plan \u00a72)"
40
- },
41
- "plugins/sp/hooks/context-post-tool.ts": {
42
- "kinds": ["budget"],
43
- "reason": "Keep: ADR-129 core (budget exemption) (plan \u00a72)",
44
- "exempt": true
26
+ "reason": "Keep (daily-summary/, plan \u00a72); read-only history-health reads via the app service (task 1178)"
45
27
  },
46
28
  "plugins/sp/hooks/pi/guard-extension.ts": {
47
29
  "kinds": ["budget"],
@@ -36,7 +36,7 @@ All product development work goes through the harness by default.
36
36
  | ------ | ---------- | -------- |
37
37
  | Plan a feature (intake → AC → tasks) | `/sp:dev-plan`, `/sp:dev-idea` | Freeform feature files without gates |
38
38
  | Drive one task end-to-end | `/sp:dev-run <wbs>` or **`sp:super-planner`** | Implement with no task / no pipeline |
39
- | Batch or parallel task runs | `/sp:dev-runall` (host sequential; **`sp:super-planner`** explicit/parallel), `/sp:dev-parallel` | Unordered multi-task thrash |
39
+ | Batch or parallel task runs | `/sp:dev-runall` (host sequential; `--mode parallel\|auto` → **`sp:super-planner`**) | Unordered multi-task thrash |
40
40
  | Batch-refine tasks under a feature | `/sp:dev-refineall --feature <id> --auto` | Hand-looping `/sp:dev-refine` per WBS |
41
41
  | Multi-step corpus CLI (tasks/features/rules/workflows) | **`sp:expert-spur`** | Raw Write/Edit on corpus files |
42
42
  | Look up `spur` verbs / flags / `--json` | Skill **`sp:spur-cli`** | Inventing flags from memory |
@@ -9,7 +9,7 @@
9
9
  "$schema": "@gobing-ai/spur/schemas/state-machine-workflow.schema.json"
10
10
  kind: state-machine
11
11
  name: feature-lifecycle
12
- version: "2"
12
+ version: "3"
13
13
  description: >
14
14
  Feature lifecycle FSM (design §2.3, §5.1, DD-13). States are the canonical
15
15
  FeatureStatus vocabulary; transitions encode the §2.3 graph including the
@@ -64,6 +64,11 @@ states:
64
64
  description: Completed and verified.
65
65
  - id: cancelled
66
66
  description: Terminal — abandoned.
67
+ - id: deprecated
68
+ description: >
69
+ Retained and frozen (ADR-136). Non-terminal: the record stays readable and
70
+ countable, nothing may attach new work to it, and leaving it is explicit —
71
+ un-deprecate to active, or cancelled once the feature is removed.
67
72
 
68
73
  transitions:
69
74
  # Forward path: backlog → active → verifying → done
@@ -142,3 +147,43 @@ transitions:
142
147
  description: Cancel feature
143
148
  guard:
144
149
  kind: always
150
+
151
+ # Deprecate: any non-terminal-or-done state → deprecated (frozen, retained — ADR-136)
152
+ - from: backlog
153
+ to: deprecated
154
+ description: Deprecate feature (frozen, retained)
155
+ guard:
156
+ kind: always
157
+ - from: active
158
+ to: deprecated
159
+ description: Deprecate feature (frozen, retained)
160
+ guard:
161
+ kind: always
162
+ - from: verifying
163
+ to: deprecated
164
+ description: Deprecate feature (frozen, retained)
165
+ guard:
166
+ kind: always
167
+ - from: blocked
168
+ to: deprecated
169
+ description: Deprecate feature (frozen, retained)
170
+ guard:
171
+ kind: always
172
+ - from: done
173
+ to: deprecated
174
+ description: Deprecate feature (frozen, retained)
175
+ guard:
176
+ kind: always
177
+
178
+ # Exits out of deprecated: un-deprecate or remove only. Any other edge is
179
+ # undeclared and refused by the graph (ADR-135).
180
+ - from: deprecated
181
+ to: active
182
+ description: Un-deprecate (mandatory History entry)
183
+ guard:
184
+ kind: always
185
+ - from: deprecated
186
+ to: cancelled
187
+ description: Remove deprecated feature
188
+ guard:
189
+ kind: always
@@ -10,6 +10,17 @@
10
10
  #
11
11
  # Run: spur workflow run feature-verification.yaml --vars '{"featureId":"D63"}'
12
12
  #
13
+ # No project-side override is required (task 1185, A33). Since the pass moved into the
14
+ # application (1176 / efd78f058) the bundled definition owns it end to end, so a
15
+ # project-layer copy of this file (plus a rooted port under `.spur/scripts/`) is a
16
+ # leftover — the port was written against an entry export contract that has since
17
+ # changed. Remove the override so this definition applies, or migrate the port to the
18
+ # current app-owned operation `runFeatureVerification` (the generated inline bundle's
19
+ # export). If a stale consumer is still reached, feature-lifecycle's `verifying` entry
20
+ # names it: the override path, the consumer script, the export it requires that the
21
+ # shipped entry no longer provides, and the entry path. Reinstalling or upgrading the
22
+ # plugin cannot supply a retired export — only the two remedies above can.
23
+ #
13
24
  # Shape: verify -> done | failed. The onEnter step runs the standard script
14
25
  # `feature-verification-steps.ts` (no public CLI verb, D63 task 0915): it
15
26
  # resolves this very definition for the verifier identity (name, source path,
@@ -382,7 +382,7 @@ states:
382
382
  command: >-
383
383
  mkdir -p .spur/run &&
384
384
  R=".spur/run/$__runId-wrapup-repair.status" &&
385
- V="$(cat .spur/run/$__runId-wrapup-learnings.status 2>/dev/null)" &&
385
+ V="$(cat .spur/run/$__runId-wrapup-learnings.status 2>/dev/null || true)" &&
386
386
  if [ "$V" = invalid-learnings-shape ]; then printf 'invalid-learnings-shape: narration-only learnings capture — append skipped, repair recorded (0986)\n' > "$R";
387
387
  else printf 'contract-violation: doc-sync learnings capture missed its declared contract — repair skipped re-dispatch (ADR-118 pilot)\n' > "$R";
388
388
  fi &&
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "description": "Spur CLI — local-first harness for mainstream coding agents: constraint checking, workflow orchestration, agent health, and history analytics. Bun-native; exposes the `spur` command.",
5
5
  "keywords": [
6
6
  "spur",
@@ -49,7 +49,7 @@
49
49
  "dev": "bun run src/index.ts",
50
50
  "build": "bun run ../../scripts/spur-dev.ts build-cli",
51
51
  "build:binaries": "bun run ../../scripts/spur-dev.ts build-binaries",
52
- "build:bundle": "bun run ../../scripts/commands/bundle-plugin-lib.ts && bun run ../../scripts/spur-dev.ts bundle-web && bun run ../../scripts/spur-dev.ts emit-board-types && bun build src/index.ts --target=bun --outfile spur.js && bun run ../../scripts/spur-dev.ts bundle-config config && bun run ../../scripts/spur-dev.ts bundle-plugins",
52
+ "build:bundle": "bun run ../../scripts/commands/bundle-plugin-lib.ts && bun run ../../scripts/spur-dev.ts bundle-web && bun run ../../scripts/spur-dev.ts emit-board-types && bun build src/index.ts --target=bun --outfile spur.js --external @johnhenry/backend-webgpu && bun run ../../scripts/spur-dev.ts bundle-config config && bun run ../../scripts/spur-dev.ts bundle-plugins",
53
53
  "test": "bun test tests --coverage --coverage-dir=../../.coverage --pass-with-no-tests",
54
54
  "typecheck": "tsc --noEmit",
55
55
  "prepack": "bun run build:bundle",
@@ -57,14 +57,14 @@
57
57
  },
58
58
  "devDependencies": {
59
59
  "@commander-js/extra-typings": "^14.0.0",
60
- "@gobing-ai/ts-db": "^0.5.21",
61
- "@gobing-ai/ts-ai-runner": "^0.5.21",
62
- "@gobing-ai/ts-dual-workflow-engine": "^0.5.21",
63
- "@gobing-ai/ts-infra": "^0.5.21",
64
- "@gobing-ai/ts-llm-jsonl-importer": "^0.5.21",
65
- "@gobing-ai/ts-rule-engine": "^0.5.21",
66
- "@gobing-ai/ts-runtime": "^0.5.21",
67
- "@gobing-ai/ts-utils": "^0.5.21",
60
+ "@gobing-ai/ts-db": "^0.5.24",
61
+ "@gobing-ai/ts-ai-runner": "^0.5.24",
62
+ "@gobing-ai/ts-dual-workflow-engine": "^0.5.24",
63
+ "@gobing-ai/ts-infra": "^0.5.24",
64
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.5.24",
65
+ "@gobing-ai/ts-rule-engine": "^0.5.24",
66
+ "@gobing-ai/ts-runtime": "^0.5.24",
67
+ "@gobing-ai/ts-utils": "^0.5.24",
68
68
  "@types/bun": "1.3.14",
69
69
  "@types/figlet": "^1.7.0",
70
70
  "@types/node-notifier": "8.0.5",
@@ -120,7 +120,6 @@ list this README is checked against.
120
120
  | Command | What it does |
121
121
  | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
122
122
  | `dev-runall` | Run a batch of tasks through their pipelines in dependency-correct order — resolve a set, topo-sort, run each via task-pipeline.yaml, emit a batch report |
123
- | `dev-parallel` | Fan out independent tasks or investigations in parallel via subagents — choose the right pattern and synthesize results |
124
123
  | `dev-refineall` | Batch-refine tasks (feature or selector) — planning-half bulk fill of Background/Requirements/AC/Design/Plan before runall; `--depth ready` audits, corrects, freezes and promotes each task |
125
124
  | `dev-verifyall` | Batch-verify tasks against requirements and AC — resolves a set, runs per-task verification, produces consolidated PASS/PARTIAL/FAIL summary report |
126
125
  | `dev-wrapall` | Wrap up a batch of completed tasks — learnings, metrics, doc-sync, feature transition, optional branch cleanup |
@@ -273,15 +272,18 @@ plugins/sp/
273
272
  │ └── wayfinder/ # Multi-session investigation maps (SKILL.md only)
274
273
  ├── commands/ # Slash-command wrappers — the SSOT (hand-editable thin wrappers; see Commands below)
275
274
  ├── agents/ # 4 specialist subagents (expert-spur, super-coder, super-planner, super-reviewer)
276
- ├── hooks/ # hooks.json + task-write-guard.{ts,test.ts} + context-{session-start,post-tool,session-stop}.ts
277
- │ # + agent-lifecycle.{ts,test.ts} + fleet-guest-stop.{ts,test.ts} (fleet member/guest hooks)
278
- │ # + careful-guard.{ts,test.ts} + context-hooks.test.ts + token-estimate.test.ts
279
- │ # + shared policy modules: agent-hint.ts, destructive-policy.{ts,test.ts}, task-file-policy.{ts,test.ts}
280
- │ # + 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
281
282
  ├── scripts/ # Executable helpers, split from prompts (ADR-031) — batch-preflight.ts + scripts/<skill>/
282
- │ # (daily-summary: {daily-summary, logger}.ts; dogfood-testing: {detect-pipeline-driving, validate-report}.ts)
283
- ├── tests/ # Plugin tests — skill-structure.test.ts + batch-preflight.test.ts + per-skill suites (command-contract moved to scripts/commands/)
284
- ├── 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
285
287
  ├── plugin.json # Marketplace entry
286
288
  └── README.md # This file
287
289
  ```
@@ -333,7 +335,7 @@ surface or run one workflow. All skills target the same five core platforms: `cl
333
335
  | `source-driven-development` | 1.0 | Source-first verification — verify framework/API/library facts against primary sources before generating code; separates "the API exists" from "used correctly under its contract" |
334
336
  | `dogfood-testing` | 1.2 | Dogfood backbone — drives a testee end-to-end with bounded auto-fix, a live monitor ledger, and a structured report; @1.2 adds footer-mandatory reports, 7-check finalize-or-abort, and the `validate-report` CLI; backs `/sp:dev-dogfood` |
335
337
  | `next-router` | 1.0 | Status→command router — resolve a task WBS or feature frontier, TABLE A/B/C lookup with light-gate short-circuit, single dispatch or HITL stop; backs `/sp:dev-next` |
336
- | `parallel-execution` | 1.0 | Fan-out decision framework — when to parallelize, four proven fan-out patterns, and result synthesis; backs `/sp:dev-parallel` |
338
+ | `parallel-execution` | 1.0 | Fan-out decision framework — when to parallelize, four proven fan-out patterns, and result synthesis; backs `/sp:dev-runall --mode parallel\|auto` |
337
339
  | `sys-debugging` | 1.0 | Structured debugging protocol — reproduce→isolate→root cause→fix→regression test; "ask the debugger before the LLM" principle |
338
340
  | `branch-workflow` | 1.0 | Branch-lifecycle discipline — create→worktree→commit→self-review→merge→cleanup; git worktree patterns for parallel branches |
339
341
  | `test-driven-development` | 1.0.0 | TDD workflow companion — red-green-refactor cycle, behavior-first test design, AAA structure, data builders, mock-at-boundary anti-patterns |
@@ -513,8 +515,9 @@ hint on first launch, and `context-session-stop` closes out the session record.
513
515
  `SPUR_SPEC_ID` is set, so outside a fleet it makes no call. `fleet-guest-stop` delivers pending
514
516
  inbox work to a session joined as a fleet guest at turn end; any other session passes through.
515
517
 
516
- **Available but unwired:** `careful-guard.ts` ships in `hooks/` (with tests) as an opt-in
517
- `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`,
518
521
  `git push --force`, …) — it is **not** registered in `hooks.json`. Fail-open by contract; escape
519
522
  hatch `SPUR_CAREFUL=off`.
520
523
 
@@ -530,19 +533,21 @@ hold `SKILL.md` and prompt-side companions only.
530
533
  | Script | Role |
531
534
  | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
532
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. |
533
- | `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) |
534
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 |
535
- | `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 |
536
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 |
537
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 |
538
- | `scripts/dogfood-testing/detect-pipeline-driving.ts` | Word-boundary detector for pipeline-driving testees (leading-space invariant) |
539
- | `scripts/dogfood-testing/validate-report.ts` | Pure `validateReport(md)` — footer-mandatory + 7-check finalize-or-abort contract with stable error codes |
540
- | `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 |
541
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) |
542
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 |
543
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 |
544
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 |
545
- | `*.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 |
546
551
 
547
552
  **Design principle:** Scripts are **deterministic enforcement**. Unlike skills (which are advisory
548
553
  knowledge consumed by the LLM), scripts run as code and make binary allow/deny decisions. They are
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: super-planner
3
3
  description: |
4
- Use PROACTIVELY for "run this task end to end", "drive the batch", "execute the todo set", "/sp:dev-runall", or "/sp:dev-parallel". Planning and execution orchestration: owns the product/project management framing (intake, scope, sequencing) and drives the batch driver loop in sp:spur-dev/references/execution-batch.md — resolve+freeze -> topo-sort -> per-task run -> verdict inspect -> continue/halt -> batch report, with optional parallel fan-out. For a one-off verb, /sp:dev-run <wbs> is lighter; for "what single step next?", prefer /sp:dev-next — NOT this agent's job.
4
+ Use PROACTIVELY for "run this task end to end", "drive the batch", "execute the todo set", "/sp:dev-runall", or "fan out these tasks". Planning and execution orchestration: owns the product/project management framing (intake, scope, sequencing) and drives the batch driver loop in sp:spur-dev/references/execution-batch.md — resolve+freeze -> topo-sort -> per-task run -> verdict inspect -> continue/halt -> batch report, with optional parallel fan-out. For a one-off verb, /sp:dev-run <wbs> is lighter; for "what single step next?", prefer /sp:dev-next — NOT this agent's job.
5
5
 
6
6
  <example>
7
7
  Context: Batch execution of a feature's tasks
@@ -72,7 +72,6 @@ You own the spaces **between** task runs:
72
72
  - **Resolve + freeze** the task set:
73
73
  - from `--tasks <selector>`, or
74
74
  - from the convenience `--feature <id>` (normalized by the command layer / resolver to `feature:<id>` per execution-batch.md Step 1).
75
- (See also dev-runall and dev-parallel which now both accept `--feature`.)
76
75
  - **Topologically order** the frozen set by `dependencies[]` (Step 2). Abort on cycle; pre-block
77
76
  unmet out-of-set deps.
78
77
  - **Preflight (Step 2.5 / 3.0)** - before each pipeline launch, evaluate TABLE A STOP rows
@@ -110,7 +109,7 @@ You explicitly do **NOT** own step-level execution:
110
109
 
111
110
  ## When to use
112
111
 
113
- - `/sp:dev-runall --feature <id>` (or `--tasks feature:<id>`), `/sp:dev-parallel --feature <id>`, or equivalent is invoked.
112
+ - `/sp:dev-runall --feature <id>` (or `--tasks feature:<id>`, with any `--mode`), or equivalent is invoked.
114
113
  - The operator asks to "run all tasks", "run the batch", "execute the todo set", "runall ready", or "fan out tasks for feature X".
115
114
  - A feature's task batch is decomposed and ready for end-to-end (sequential or parallel) execution.
116
115
 
@@ -121,7 +120,7 @@ routes to you. On other platforms, invoke this agent directly when the batch dri
121
120
 
122
121
  | Platform | Invocation |
123
122
  | ---------- | ----------- |
124
- | Claude Code | Spawned by `/sp:dev-runall --feature <id>` (or `--tasks ...`) -> `Skill(skill="sp:spur-dev", args="runall $ARGUMENTS")` -> this agent (also handles parallel via dev-parallel) |
123
+ | Claude Code | Spawned by `/sp:dev-runall --feature <id>` (or `--tasks ...`) -> `Skill(skill="sp:spur-dev", args="runall $ARGUMENTS")` -> this agent (also handles `--mode parallel` and parallel `--mode auto` resolutions) |
125
124
  | Other platforms | Spawn this agent directly; read execution-batch.md and drive the loop |
126
125
 
127
126
  ## Decision autonomy
@@ -173,8 +172,8 @@ When you fan out or dispatch a subagent, apply the four disciplines the SSOT
173
172
  cardinality is 1. Never loop recovery until done.
174
173
  - [ ] Emit the batch report at completion (clean / halted / aborted), including preflight skips.
175
174
  - [ ] Default to sequential execution. Enter parallel mode only when explicitly requested
176
- (`--mode parallel` or `/sp:dev-parallel`) and the `sp:parallel-execution` decision framework
177
- clears dependency, file-overlap, and token-budget checks.
175
+ (`--mode parallel`, or `--mode auto` resolved to parallel by the § 2.4a schedule) and the
176
+ `sp:parallel-execution` decision framework clears dependency, file-overlap, and token-budget checks.
178
177
  - [ ] To resolve a deferred `feature_id` under operator-chosen strict rigor, use the sp:spur-dev
179
178
  feature-link helper (single-task or sweep) - never invoke it automatically from within a
180
179
  batch run; surface it only when the operator explicitly requests strict traceability.
@@ -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,48 @@ 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 presence and vocabulary only: whether a level is *earned* stays a judgement call (see the
249
+ earning rule above), so the report must still argue it.
250
+
251
+ **Source citations for external claims (one claim contract, 2026-10-12).** A Finding cell or a
252
+ Functional Traceability `Evidence` cell that asserts an external API/library claim carries a
253
+ verifiable citation in the SAME cell — a repo `path:line(-end)`, the external named-origin form
254
+ (@origin `path` line N, line number outside the backticks), or an http(s) URL. It is the verify
255
+ answer's rule verbatim, owned by
256
+ [verdict-schema.md](../skills/code-verification/references/verdict-schema.md) § Source citations
257
+ for external claims — claim markers and accepted forms are defined once there and are not restated
258
+ here. The findings table's `Location` column does not stand in for it: `Location` anchors the
259
+ finding's subject, not the claim's source. Cell-free receipts (test counts, reviewed-log notes)
260
+ assert no external claim and need no citation. An uncited external claim is an assumption, so it
261
+ caps the level the report can defend (above).
262
+
263
+ **Machine-checked at the gate (findings table).** `residual-scan review-gate` applies the same two
264
+ predicates to every finding row: a Finding cell carrying one of the verify lint's claim markers with
265
+ no citation form becomes a **blocking** `review-contract` item, so `review → verify` stops and the
266
+ run enters `review-fail-triage`. The `Location` column is deliberately not consulted as a citation —
267
+ that is the rule stated above, and a gate that accepted it would pass every row that has an anchor.
268
+ Functional Traceability `Evidence` cells stay reviewer-enforced (SECUA review): they are free prose
269
+ in a table the gate does not parse.
270
+
228
271
  **No findings.** Never invent a defect to populate the table. Emit one substantive `P4 (advisory)`
229
272
  row that states what was reviewed and what was found — placeholder cells (empty, `—`, `n/a`) are
230
273
  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"]