@gobing-ai/spur 0.4.2 → 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/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/workflows/feature-lifecycle.yaml +46 -1
- package/config/workflows/feature-verification.yaml +11 -0
- package/package.json +9 -9
- package/plugins/sp/README.md +22 -16
- package/plugins/sp/agents/super-reviewer.md +43 -0
- package/plugins/sp/bunfig.toml +8 -5
- package/plugins/sp/hooks/careful-guard.ts +1 -1
- package/plugins/sp/hooks/context-post-tool.ts +7 -427
- package/plugins/sp/hooks/context-session-start.ts +5 -213
- package/plugins/sp/hooks/context-session-stop.ts +5 -191
- package/plugins/sp/hooks/pi/guard-extension.ts +6 -5
- 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-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 +3 -3
- 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 +1347 -90
- package/plugins/sp/lib/plan-projection.generated.d.mts +150 -0
- package/plugins/sp/lib/plan-projection.generated.mjs +591 -1
- package/plugins/sp/lib/quality-gate.generated.mjs +38 -25
- 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 -228
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/scripts/batch-plan.mjs +586 -0
- 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 +149 -122
- package/plugins/sp/scripts/inline-run-setup.ts +1 -21
- package/plugins/sp/scripts/quality-gate.mjs +14 -2
- 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 +151 -97
- package/plugins/sp/scripts/run-summary.ts +7 -5
- package/plugins/sp/scripts/session-timeline.mjs +46 -19
- package/plugins/sp/scripts/task-diffstat.mjs +11 -1
- package/plugins/sp/scripts/task-diffstat.ts +8 -39
- 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/next-feature/SKILL.md +1 -1
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
- 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 +32 -7
- package/plugins/sp/skills/spur-cli/references/features.md +46 -5
- package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +1 -1
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +13 -3
- 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/inline-pipeline-driver.md +29 -12
- package/spur.js +80681 -79296
- package/web/_astro/{BoardApp.B3GQZvj8.js → BoardApp.5IIl2O-z.js} +1 -1
- package/web/_astro/{BoardApp.BT7L2kSb.js → BoardApp.Drnx-KeM.js} +150 -150
- package/web/_astro/{TaskDetail.Cxov1_N_.js → TaskDetail.Ci4LNn9S.js} +1 -1
- package/web/_astro/{arc.vaT7tPOB.js → arc.j2EVkYVd.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.DRMmTjkN.js → architectureDiagram-3BPJPVTR.DZWSFqEG.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.cla0LO_q.js → blockDiagram-GPEHLZMM.DE6GpXCN.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.D4YAIBKn.js → c4Diagram-AAUBKEIU.DoVR1G6B.js} +1 -1
- package/web/_astro/channel.DmdDxGsq.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.BrSJbMRZ.js → chunk-2J33WTMH.Do6-Gbyf.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.CuLMgKF5.js → chunk-4BX2VUAB.BYV1HGHx.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.zkvgu54F.js → chunk-55IACEB6.CvI1zkrc.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.DxWkACh8.js → chunk-727SXJPM.DNGSCRlX.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.42XrmIlH.js → chunk-AQP2D5EJ.DXhhgT5z.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.Bao2wMK9.js → chunk-FMBD7UC4.dzkRKP2u.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.BhydojD1.js → chunk-ND2GUHAM.DujGLeEf.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.CmZ82g-H.js → chunk-QZHKN3VN.BWtIT3ZU.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.Blr83Gt_.js → classDiagram-4FO5ZUOK.DyApg0Nn.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.Blr83Gt_.js → classDiagram-v2-Q7XG4LA2.DyApg0Nn.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.qmfv0SPn.js → cose-bilkent-S5V4N54A.DJQB-u_l.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.BtELhXPR.js → cynefin-OW5HDTMX.bi3D_siV.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.AWmaAvXo.js → dagre-BM42HDAG.C-f7TrRg.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.DdH34KDi.js → diagram-2AECGRRQ.DrPfjHQB.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.BmNPix1k.js → diagram-5GNKFQAL.C9S4WUHO.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.BNQd_Ppo.js → diagram-KO2AKTUF.Dzzye8QH.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.BAPgDi0e.js → diagram-LMA3HP47.DX-LRiof.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.DZ4zyLdC.js → diagram-OG6HWLK6.Z-kAKwIz.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.Q1TySMmw.js → erDiagram-TEJ5UH35.D6dyClSv.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.BXhFBicG.js → flowDiagram-I6XJVG4X.Cx3q2cxD.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.vHSgcuo2.js → ganttDiagram-6RSMTGT7.DU3gH6CT.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.Bi1f73C7.js → gitGraphDiagram-PVQCEYII.ISmCnJ87.js} +1 -1
- package/web/_astro/index.Do2lLdgo.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.DPvXZEWm.js → infoDiagram-5YYISTIA.DR6_iNOK.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.Cz829fsV.js → ishikawaDiagram-YF4QCWOH.D7wY-ZGA.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.enRnB9Me.js → journeyDiagram-JHISSGLW.DkP9-WK8.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.DnTNk6d2.js → kanban-definition-UN3LZRKU.wtgY98M2.js} +1 -1
- package/web/_astro/{linear.BzGnBwNL.js → linear.CI6djNi7.js} +1 -1
- package/web/_astro/{mermaid.core.CSbTpIVz.js → mermaid.core.CuQPxS8b.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.DGJDy8zT.js → mindmap-definition-RKZ34NQL.5HNIEG7R.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.HSPdi5_8.js → pieDiagram-4H26LBE5.CchhDFjE.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.6Gv8mz2Y.js → quadrantDiagram-W4KKPZXB.PYXXJPSJ.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.CnBCtFwa.js → requirementDiagram-4Y6WPE33.cUQuNAKU.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.5M8VWAu8.js → sankeyDiagram-5OEKKPKP.BO7MnRIA.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.DN41XN-U.js → sequenceDiagram-3UESZ5HK.D9bElyD6.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.ErOO3W8j.js → stateDiagram-AJRCARHV.DhGdRz7I.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.B_ZHICM-.js → stateDiagram-v2-BHNVJYJU.5GvLeAoL.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.CWdosr07.js → timeline-definition-PNZ67QCA.LtAT9haM.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.BHzYjNV5.js → vennDiagram-CIIHVFJN.DRth1yLA.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.h8x4IwPX.js → wardleyDiagram-YWT4CUSO.h9MlZfcr.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.RTapW2X8.js → xychartDiagram-2RQKCTM6.DHqy9DYA.js} +1 -1
- package/web/index.html +2 -2
- package/config/proportional-route-table.ts +0 -155
- package/plugins/sp/scripts/daily-summary/logger.ts +0 -28
- package/web/_astro/channel.D4nG9YLf.js +0 -1
- package/web/_astro/index.BhSwN8yY.css +0 -1
- /package/plugins/sp/{hooks → lib}/context-owner.ts +0 -0
- /package/plugins/sp/{hooks → lib}/destructive-policy.ts +0 -0
- /package/plugins/sp/{hooks → lib}/task-file-policy.ts +0 -0
|
@@ -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"],
|
|
@@ -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,
|
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",
|
|
@@ -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
|
@@ -272,15 +272,18 @@ plugins/sp/
|
|
|
272
272
|
│ └── wayfinder/ # Multi-session investigation maps (SKILL.md only)
|
|
273
273
|
├── commands/ # Slash-command wrappers — the SSOT (hand-editable thin wrappers; see Commands below)
|
|
274
274
|
├── agents/ # 4 specialist subagents (expert-spur, super-coder, super-planner, super-reviewer)
|
|
275
|
-
├── hooks/ # hooks.json +
|
|
276
|
-
│ # +
|
|
277
|
-
│ # +
|
|
278
|
-
│ #
|
|
279
|
-
|
|
275
|
+
├── hooks/ # hooks.json + one thin entry per registered identity
|
|
276
|
+
│ # + task-write-guard.ts (compat shim) + careful-guard.ts (opt-in, unwired)
|
|
277
|
+
│ # + pi/guard-extension.ts (plugin.json `extensions.pi` entry point)
|
|
278
|
+
│ # entries delegate to lib cores (task 1174); hook suites live in tests/hooks/
|
|
279
|
+
├── lib/ # Handwritten plugin cores — context-{post-tool,session-start,session-stop}.ts,
|
|
280
|
+
│ # agent-hint.ts, context-owner.ts, destructive-policy.ts, task-file-policy.ts,
|
|
281
|
+
│ # env.ts, plus generated *.generated.mjs|.d.mts bundles over packages/app
|
|
280
282
|
├── scripts/ # Executable helpers, split from prompts (ADR-031) — batch-preflight.ts + scripts/<skill>/
|
|
281
|
-
│ # (daily-summary:
|
|
282
|
-
├── tests/ # Plugin tests — skill-structure.test.ts +
|
|
283
|
-
|
|
283
|
+
│ # (daily-summary: daily-summary.ts; dogfood-testing: {detect-pipeline-driving, validate-report}.ts)
|
|
284
|
+
├── tests/ # Plugin tests — skill-structure.test.ts + hooks/ (guard, context, Pi suites)
|
|
285
|
+
│ # + evals/ (behavioral eval corpus + judge; see tests/evals/README.md,
|
|
286
|
+
│ # runner at scripts/commands/skill-eval.ts) + per-skill suites
|
|
284
287
|
├── plugin.json # Marketplace entry
|
|
285
288
|
└── README.md # This file
|
|
286
289
|
```
|
|
@@ -512,8 +515,9 @@ hint on first launch, and `context-session-stop` closes out the session record.
|
|
|
512
515
|
`SPUR_SPEC_ID` is set, so outside a fleet it makes no call. `fleet-guest-stop` delivers pending
|
|
513
516
|
inbox work to a session joined as a fleet guest at turn end; any other session passes through.
|
|
514
517
|
|
|
515
|
-
**Available but unwired:** `careful-guard.ts` ships in `hooks/` (
|
|
516
|
-
`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`,
|
|
517
521
|
`git push --force`, …) — it is **not** registered in `hooks.json`. Fail-open by contract; escape
|
|
518
522
|
hatch `SPUR_CAREFUL=off`.
|
|
519
523
|
|
|
@@ -529,19 +533,21 @@ hold `SKILL.md` and prompt-side companions only.
|
|
|
529
533
|
| Script | Role |
|
|
530
534
|
| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
531
535
|
| `hooks/task-write-guard.ts` | Compatibility shim for older installs that still execute the script path directly. Forwards stdin to the stable PATH command `superskill hook run sp task-write-guard`, mirrors parseable PreToolUse decisions, and fails open if the runtime is unavailable. Performs no source-tree CLI lookup. |
|
|
532
|
-
| `hooks/context-*.ts` |
|
|
536
|
+
| `hooks/context-*.ts` | argv/stdin entries for the three registered context hooks; the capture, ledger and session logic is the `lib/context-*.ts` core (task 1174) |
|
|
533
537
|
| `hooks/{agent-lifecycle,fleet-guest-stop}.ts` | Fleet hooks (1080/1081): member lifecycle reports via `spur agent report`; turn-end inbox delivery to joined guests |
|
|
534
|
-
| `hooks/careful-guard.ts` | Opt-in destructive-command guard (unwired — see Hooks above)
|
|
538
|
+
| `hooks/careful-guard.ts` | Opt-in destructive-command guard (unwired — see Hooks above); policy is `lib/destructive-policy.ts` |
|
|
539
|
+
| `lib/context-{post-tool,session-start,session-stop}.ts` | Redaction-capped ledger append, session open/ownership and owner-gated teardown for `sp:indexed-context` |
|
|
540
|
+
| `lib/{agent-hint,context-owner,destructive-policy,task-file-policy}.ts` | Shared hook cores — agent/model hint resolution, host-native session owner derivation, destructive-command classification, task-file matching |
|
|
535
541
|
| `scripts/batch-preflight.ts` | Pure TABLE A STOP evaluation for `super-planner` — skip doomed pipeline launches without spawning a Skill subprocess; recovery hints map stuck statuses to a single `/sp:dev-*` hop |
|
|
536
542
|
| `scripts/workflow-step-profile.ts` | Thin glue over the generated lib bundle (`lib/step-profile.generated.mjs` from `packages/app/src/workflow/step-profile.ts`) — read-only step profile from `spur workflow trace`: per node and action-kind durations, idle gaps, session mode and `cacheHit` coverage, plus the ADR-115 cache-window flags `sp:spur-doctor` turns into workflow-optimization proposals |
|
|
537
|
-
| `scripts/dogfood-testing/detect-pipeline-driving.ts` |
|
|
538
|
-
| `scripts/dogfood-testing/validate-report.ts` |
|
|
539
|
-
| `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 |
|
|
540
546
|
| `scripts/task-diffstat.ts` | 0943 triage-lane diffstat producer — numstat + untracked scan vs the run base; writes `<wbs>-diffstat.json` with the sensitive-path flag; fails safe (sensitive) |
|
|
541
547
|
| `scripts/run-summary.ts` | Measured execution summary `/sp:dev-run` / `/sp:dev-runall` print by default (`--no-summary` skips) — windows the host transcript by `spur workflow progress` attempt timestamps; per stage/run time, wait, tool calls, total / non-cached tokens; `n/a` for subprocess windows |
|
|
542
548
|
| `scripts/session-timeline.ts` | Measured Time/Wait/Token evidence for `sp:session-review` — reads the active Claude Code transcript read-only, one segment per operator prompt, usage deduplicated by message id, tokens split total / non-cached; `{available:false}` exit 0 when no transcript |
|
|
543
549
|
| `scripts/commands/validate-flag-contracts.ts` | Mechanical consistency gate — compares flag claims across command files, flag-glossary, cross-cutting, dev-operations, and ADR; reports disagreements |
|
|
544
|
-
| `*.test.ts` | Unit suites —
|
|
550
|
+
| `*.test.ts` | Unit suites — `tests/hooks/` for the hook entries and their lib cores, `tests/<skill>/` per ADR-031 pairing |
|
|
545
551
|
|
|
546
552
|
**Design principle:** Scripts are **deterministic enforcement**. Unlike skills (which are advisory
|
|
547
553
|
knowledge consumed by the LLM), scripts run as code and make binary allow/deny decisions. They are
|
|
@@ -200,6 +200,7 @@ shallower.
|
|
|
200
200
|
**Scope:** <wbs diff | path glob>
|
|
201
201
|
**Dimensions:** functional, security, efficiency, correctness, usability, architecture
|
|
202
202
|
**Verdict:** PASS | PARTIAL | FAIL
|
|
203
|
+
**Confidence:** HIGH | MEDIUM | LOW
|
|
203
204
|
##### Findings (ranked)
|
|
204
205
|
|
|
205
206
|
| # | Priority | Dimension | Finding | Location | Disposition |
|
|
@@ -225,6 +226,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"]
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
* adapter. This file owns the Claude Code payload/decision shape only.
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
+
import { classifyCommand } from '../lib/destructive-policy';
|
|
25
26
|
import { getEnvVar } from '../lib/env';
|
|
26
|
-
import { classifyCommand } from './destructive-policy';
|
|
27
27
|
|
|
28
28
|
interface ToolPayload {
|
|
29
29
|
tool_name?: string;
|