@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/config.global.yaml +4 -2
- package/config/decisions/maker-liveness.yaml +39 -0
- package/config/plugin-scripts.json +0 -4
- package/config/rules/README.md +1 -0
- package/config/rules/docs/sourced-api-claims.yaml +56 -12
- package/config/rules/strict/runtime-boundaries.yaml +7 -0
- package/config/script-placement-baseline.json +1 -19
- package/config/templates/AGENTS.md +1 -1
- package/config/workflows/feature-lifecycle.yaml +46 -1
- package/config/workflows/feature-verification.yaml +11 -0
- package/config/workflows/wrapup-pipeline.yaml +1 -1
- package/package.json +10 -10
- package/plugins/sp/README.md +23 -18
- package/plugins/sp/agents/super-planner.md +5 -6
- package/plugins/sp/agents/super-reviewer.md +43 -0
- package/plugins/sp/bunfig.toml +8 -5
- package/plugins/sp/commands/dev-review-session.md +2 -1
- package/plugins/sp/commands/dev-runall.md +18 -9
- package/plugins/sp/hooks/careful-guard.ts +1 -1
- package/plugins/sp/hooks/context-post-tool.ts +7 -404
- package/plugins/sp/hooks/context-session-start.ts +6 -192
- package/plugins/sp/hooks/context-session-stop.ts +6 -91
- package/plugins/sp/hooks/pi/guard-extension.ts +26 -12
- package/plugins/sp/hooks/task-write-guard.ts +1 -1
- package/plugins/sp/{hooks → lib}/agent-hint.ts +1 -1
- package/plugins/sp/lib/context-owner.ts +56 -0
- package/plugins/sp/lib/context-post-tool.ts +432 -0
- package/plugins/sp/lib/context-session-start.ts +214 -0
- package/plugins/sp/lib/context-session-stop.ts +196 -0
- package/plugins/sp/lib/dogfood-pipeline.ts +265 -0
- package/plugins/sp/lib/dogfood-report.ts +278 -0
- package/plugins/sp/lib/idea-handoff.generated.mjs +6 -4
- package/plugins/sp/lib/inline-run-app.ts +40 -0
- package/plugins/sp/lib/inline-run.generated.d.mts +3 -3
- package/plugins/sp/lib/inline-run.generated.mjs +1361 -87
- package/plugins/sp/lib/plan-projection.generated.d.mts +169 -0
- package/plugins/sp/lib/plan-projection.generated.mjs +704 -1
- package/plugins/sp/lib/quality-gate.generated.d.mts +0 -12
- package/plugins/sp/lib/quality-gate.generated.mjs +62 -231
- package/plugins/sp/lib/residual-scan.generated.d.mts +7 -1
- package/plugins/sp/lib/residual-scan.generated.mjs +71 -6
- package/plugins/sp/lib/run-summary-core.ts +34 -370
- package/plugins/sp/lib/transcript.ts +37 -200
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/roles.md +1 -1
- package/plugins/sp/scripts/batch-plan.mjs +740 -1
- package/plugins/sp/scripts/batch-plan.ts +48 -3
- package/plugins/sp/scripts/batch-preflight.mjs +23 -1
- package/plugins/sp/scripts/batch-preflight.ts +35 -295
- package/plugins/sp/scripts/daily-summary/daily-summary.mjs +108 -87
- package/plugins/sp/scripts/daily-summary/daily-summary.ts +111 -104
- package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.mjs +2 -1
- package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts +7 -265
- package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +3 -0
- package/plugins/sp/scripts/dogfood-testing/validate-report.ts +6 -272
- package/plugins/sp/scripts/feature-verification-steps.mjs +7 -123
- package/plugins/sp/scripts/feature-verification-steps.ts +29 -181
- package/plugins/sp/scripts/inline-run-dispatch.mjs +27 -26
- package/plugins/sp/scripts/inline-run-dispatch.ts +1 -21
- package/plugins/sp/scripts/inline-run-setup.mjs +158 -120
- package/plugins/sp/scripts/inline-run-setup.ts +1 -21
- package/plugins/sp/scripts/pr-reviewing.mjs +19 -5
- package/plugins/sp/scripts/pr-reviewing.ts +34 -9
- package/plugins/sp/scripts/quality-gate.mjs +38 -208
- package/plugins/sp/scripts/residual-scan.mjs +73 -6
- package/plugins/sp/scripts/residual-scan.ts +8 -5
- package/plugins/sp/scripts/run-summary.mjs +160 -95
- package/plugins/sp/scripts/run-summary.ts +7 -5
- package/plugins/sp/scripts/session-timeline.mjs +57 -29
- package/plugins/sp/scripts/session-timeline.ts +4 -18
- package/plugins/sp/scripts/task-diffstat.mjs +43 -30
- package/plugins/sp/scripts/task-diffstat.ts +40 -71
- package/plugins/sp/skills/code-implementation/SKILL.md +7 -1
- package/plugins/sp/skills/code-verification/references/secu-review.md +2 -1
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +4 -0
- package/plugins/sp/skills/dogfood-testing/SKILL.md +2 -2
- package/plugins/sp/skills/indexed-context/SKILL.md +14 -7
- package/plugins/sp/skills/next-feature/SKILL.md +1 -1
- package/plugins/sp/skills/parallel-execution/SKILL.md +2 -2
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +2 -2
- package/plugins/sp/skills/parallel-execution/references/fan-out-patterns.md +2 -2
- package/plugins/sp/skills/pr-reviewing/SKILL.md +7 -3
- package/plugins/sp/skills/session-review/SKILL.md +5 -3
- package/plugins/sp/skills/source-driven-development/SKILL.md +7 -4
- package/plugins/sp/skills/spur-cli/references/builder.md +3 -2
- package/plugins/sp/skills/spur-cli/references/decision.md +40 -8
- package/plugins/sp/skills/spur-cli/references/features.md +46 -5
- package/plugins/sp/skills/spur-cli/references/projects.md +7 -5
- package/plugins/sp/skills/spur-dev/SKILL.md +2 -0
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +27 -0
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +2 -3
- package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +6 -1
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +56 -7
- package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +4 -1
- package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +22 -0
- package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +14 -0
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +13 -11
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +37 -25
- package/spur.js +89792 -76992
- package/web/_astro/{BoardApp.D66k_s_T.js → BoardApp.5IIl2O-z.js} +1 -1
- package/web/_astro/BoardApp.Drnx-KeM.js +324 -0
- package/web/_astro/TaskDetail.Ci4LNn9S.js +1 -0
- package/web/_astro/{arc._BUadrdH.js → arc.j2EVkYVd.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.Dh7xS1Pp.js → architectureDiagram-3BPJPVTR.DZWSFqEG.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.DFDVpfXm.js → blockDiagram-GPEHLZMM.DE6GpXCN.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.V7_3_glh.js → c4Diagram-AAUBKEIU.DoVR1G6B.js} +1 -1
- package/web/_astro/channel.DmdDxGsq.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.De1yx7Jz.js → chunk-2J33WTMH.Do6-Gbyf.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.BDhHFuxx.js → chunk-4BX2VUAB.BYV1HGHx.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.DDLkWnmC.js → chunk-55IACEB6.CvI1zkrc.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.CwfiLnA7.js → chunk-727SXJPM.DNGSCRlX.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.CtGDmUnM.js → chunk-AQP2D5EJ.DXhhgT5z.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.BOLjpw73.js → chunk-FMBD7UC4.dzkRKP2u.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.BDhQls6O.js → chunk-ND2GUHAM.DujGLeEf.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.76qBynDF.js → chunk-QZHKN3VN.BWtIT3ZU.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.N0mpPHT0.js → classDiagram-4FO5ZUOK.DyApg0Nn.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.N0mpPHT0.js → classDiagram-v2-Q7XG4LA2.DyApg0Nn.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.CKknFfjB.js → cose-bilkent-S5V4N54A.DJQB-u_l.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.Cw3ZWBAh.js → cynefin-OW5HDTMX.bi3D_siV.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.D3yIKCRD.js → dagre-BM42HDAG.C-f7TrRg.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.D51dO83Z.js → diagram-2AECGRRQ.DrPfjHQB.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.Bb-FViDj.js → diagram-5GNKFQAL.C9S4WUHO.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.D3mN8S6x.js → diagram-KO2AKTUF.Dzzye8QH.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.dMMyPcbJ.js → diagram-LMA3HP47.DX-LRiof.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.AzbvzY4C.js → diagram-OG6HWLK6.Z-kAKwIz.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.BR5I4OZb.js → erDiagram-TEJ5UH35.D6dyClSv.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.DFqvhGkn.js → flowDiagram-I6XJVG4X.Cx3q2cxD.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.ByJbhH6J.js → ganttDiagram-6RSMTGT7.DU3gH6CT.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.CInHjQR3.js → gitGraphDiagram-PVQCEYII.ISmCnJ87.js} +1 -1
- package/web/_astro/index.Do2lLdgo.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.Cm0dGVjJ.js → infoDiagram-5YYISTIA.DR6_iNOK.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.C3nOP6Sj.js → ishikawaDiagram-YF4QCWOH.D7wY-ZGA.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.4IvLa2MW.js → journeyDiagram-JHISSGLW.DkP9-WK8.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.DS87Cl-k.js → kanban-definition-UN3LZRKU.wtgY98M2.js} +1 -1
- package/web/_astro/{linear.MzmRrNER.js → linear.CI6djNi7.js} +1 -1
- package/web/_astro/{mermaid.core.fK-WNswS.js → mermaid.core.CuQPxS8b.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.BqipOHhY.js → mindmap-definition-RKZ34NQL.5HNIEG7R.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.0nBiPqFG.js → pieDiagram-4H26LBE5.CchhDFjE.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.Szj7Zpx5.js → quadrantDiagram-W4KKPZXB.PYXXJPSJ.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.D4UR6TWo.js → requirementDiagram-4Y6WPE33.cUQuNAKU.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.DAE7BdOs.js → sankeyDiagram-5OEKKPKP.BO7MnRIA.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.BP9ZVq25.js → sequenceDiagram-3UESZ5HK.D9bElyD6.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.BQW7mIxk.js → stateDiagram-AJRCARHV.DhGdRz7I.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.PbK4nDih.js → stateDiagram-v2-BHNVJYJU.5GvLeAoL.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.Ci_GvUpo.js → timeline-definition-PNZ67QCA.LtAT9haM.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.DNw1Y5qx.js → vennDiagram-CIIHVFJN.DRth1yLA.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.CwlkaaNe.js → wardleyDiagram-YWT4CUSO.h9MlZfcr.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.MI6ZuiH_.js → xychartDiagram-2RQKCTM6.DHqy9DYA.js} +1 -1
- package/web/index.html +2 -2
- package/config/proportional-route-table.ts +0 -155
- package/plugins/sp/commands/dev-parallel.md +0 -37
- package/plugins/sp/scripts/daily-summary/logger.ts +0 -28
- package/web/_astro/BoardApp.D6sjAJr_.js +0 -324
- package/web/_astro/TaskDetail.BynLnMNc.js +0 -1
- package/web/_astro/channel.DZVfto-r.js +0 -1
- package/web/_astro/index.COh_kBxN.css +0 -1
- /package/plugins/sp/{hooks → lib}/destructive-policy.ts +0 -0
- /package/plugins/sp/{hooks → lib}/task-file-policy.ts +0 -0
|
@@ -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)
|
|
161
|
-
#
|
|
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
|
package/config/rules/README.md
CHANGED
|
@@ -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).
|
|
16
|
-
#
|
|
17
|
-
#
|
|
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
|
-
|
|
25
|
-
-
|
|
26
|
-
|
|
27
|
-
|
|
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)
|
|
45
|
-
# longer dotted numerics
|
|
46
|
-
#
|
|
47
|
-
|
|
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 (
|
|
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`**
|
|
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: "
|
|
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.
|
|
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.
|
|
61
|
-
"@gobing-ai/ts-ai-runner": "^0.5.
|
|
62
|
-
"@gobing-ai/ts-dual-workflow-engine": "^0.5.
|
|
63
|
-
"@gobing-ai/ts-infra": "^0.5.
|
|
64
|
-
"@gobing-ai/ts-llm-jsonl-importer": "^0.5.
|
|
65
|
-
"@gobing-ai/ts-rule-engine": "^0.5.
|
|
66
|
-
"@gobing-ai/ts-runtime": "^0.5.
|
|
67
|
-
"@gobing-ai/ts-utils": "^0.5.
|
|
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",
|
package/plugins/sp/README.md
CHANGED
|
@@ -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 +
|
|
277
|
-
│ # +
|
|
278
|
-
│ # +
|
|
279
|
-
│ #
|
|
280
|
-
|
|
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:
|
|
283
|
-
├── tests/ # Plugin tests — skill-structure.test.ts +
|
|
284
|
-
|
|
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/` (
|
|
517
|
-
`PreToolUse` guard that asks before destructive
|
|
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` |
|
|
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` |
|
|
539
|
-
| `scripts/dogfood-testing/validate-report.ts` |
|
|
540
|
-
| `scripts/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 —
|
|
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 "
|
|
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
|
|
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
|
|
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
|
|
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:
|
package/plugins/sp/bunfig.toml
CHANGED
|
@@ -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
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
#
|
|
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"]
|