@gobing-ai/spur 0.3.99 → 0.4.1
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 +17 -0
- package/config/decisions/gates.yaml +36 -0
- package/config/decisions/history-anatomy.yaml +35 -0
- package/config/decisions/idea-pipeline.yaml +38 -0
- package/config/decisions/task-pipeline.yaml +55 -0
- package/config/plugin-scripts.json +25 -0
- package/config/rules/boundary/sp-runtime-path.yaml +2 -0
- package/config/rules/docs/sourced-api-claims.yaml +60 -0
- package/config/rules/quality/coverage-gate.yaml +5 -3
- package/config/rules/recommended-pre-check.yaml +8 -3
- package/config/rules/strict/runtime-boundaries.yaml +11 -0
- package/config/rules/structure/protected-files.yaml +3 -0
- package/config/rules/structure/scratch-evidence-pointer.yaml +35 -0
- package/config/script-placement-baseline.json +2 -2
- package/config/workflows/feature-lifecycle.yaml +9 -2
- package/config/workflows/history-anatomy.yaml +22 -0
- package/config/workflows/idea-pipeline.yaml +75 -0
- package/config/workflows/task-pipeline.yaml +368 -49
- package/config/workflows/wrapup-pipeline.yaml +106 -13
- package/package.json +9 -9
- package/plugins/sp/README.md +25 -2
- package/plugins/sp/agents/super-planner.md +11 -0
- package/plugins/sp/agents/super-reviewer.md +39 -11
- package/plugins/sp/bunfig.toml +8 -0
- package/plugins/sp/commands/dev-brainstorm.md +29 -16
- package/plugins/sp/commands/dev-changelog.md +5 -4
- package/plugins/sp/commands/dev-find-way.md +80 -0
- package/plugins/sp/commands/dev-idea.md +6 -0
- package/plugins/sp/commands/dev-parallel.md +8 -2
- package/plugins/sp/commands/dev-plan.md +6 -0
- package/plugins/sp/commands/dev-review-session.md +14 -7
- package/plugins/sp/commands/dev-run.md +17 -4
- package/plugins/sp/commands/dev-runall.md +21 -10
- package/plugins/sp/hooks/agent-lifecycle.ts +155 -0
- package/plugins/sp/hooks/context-session-start.ts +1 -1
- package/plugins/sp/hooks/fleet-guest-stop.ts +180 -0
- package/plugins/sp/hooks/hooks.json +45 -1
- package/plugins/sp/hooks/pi/guard-extension.ts +21 -0
- package/plugins/sp/lib/history-anatomy.generated.mjs +5 -0
- package/plugins/sp/lib/idea-handoff.generated.mjs +72 -11
- package/plugins/sp/lib/inline-run-app.ts +28 -0
- package/plugins/sp/lib/inline-run.generated.d.mts +6 -0
- package/plugins/sp/lib/inline-run.generated.mjs +364 -46
- package/plugins/sp/lib/plan-projection.generated.d.mts +28 -0
- package/plugins/sp/lib/plan-projection.generated.mjs +255 -0
- package/plugins/sp/lib/quality-gate.generated.d.mts +47 -1
- package/plugins/sp/lib/quality-gate.generated.mjs +30489 -82
- package/plugins/sp/lib/residual-scan.generated.d.mts +19 -0
- package/plugins/sp/lib/residual-scan.generated.mjs +66 -0
- package/plugins/sp/lib/run-summary-core.ts +561 -0
- package/plugins/sp/lib/transcript.ts +275 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/roles.md +1 -1
- package/plugins/sp/scripts/batch-plan.mjs +335 -0
- package/plugins/sp/scripts/batch-plan.ts +100 -0
- package/plugins/sp/scripts/batch-preflight.mjs +51 -3
- package/plugins/sp/scripts/batch-preflight.ts +72 -1
- package/plugins/sp/scripts/commit-guard.mjs +216 -0
- package/plugins/sp/scripts/commit-guard.ts +249 -0
- package/plugins/sp/scripts/history-anatomy-cache.mjs +5 -0
- package/plugins/sp/scripts/inline-run-dispatch.mjs +130 -0
- package/plugins/sp/scripts/inline-run-dispatch.ts +135 -0
- package/plugins/sp/scripts/inline-run-setup.mjs +563 -91
- package/plugins/sp/scripts/inline-run-setup.ts +65 -97
- package/plugins/sp/scripts/persist-out-check.mjs +90 -41
- package/plugins/sp/scripts/persist-out-check.ts +112 -57
- package/plugins/sp/scripts/quality-gate.mjs +30407 -73
- package/plugins/sp/scripts/quality-gate.ts +21 -5
- package/plugins/sp/scripts/residual-scan.mjs +88 -38
- package/plugins/sp/scripts/residual-scan.ts +35 -38
- package/plugins/sp/scripts/run-summary.mjs +693 -0
- package/plugins/sp/scripts/run-summary.ts +105 -0
- package/plugins/sp/scripts/session-timeline.mjs +331 -0
- package/plugins/sp/scripts/session-timeline.ts +204 -0
- package/plugins/sp/scripts/wrapup-steps.mjs +150 -2
- package/plugins/sp/scripts/wrapup-steps.ts +203 -1
- package/plugins/sp/skills/brainstorm/SKILL.md +9 -47
- package/plugins/sp/skills/branch-workflow/SKILL.md +1 -0
- package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +1 -0
- package/plugins/sp/skills/code-implementation/SKILL.md +48 -1
- package/plugins/sp/skills/code-verification/SKILL.md +8 -4
- package/plugins/sp/skills/code-verification/references/secu-review.md +3 -0
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +68 -0
- package/plugins/sp/skills/fleet-join/SKILL.md +63 -0
- package/plugins/sp/skills/session-review/SKILL.md +77 -24
- package/plugins/sp/skills/source-driven-development/SKILL.md +5 -0
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +5 -3
- package/plugins/sp/skills/spur-cli/SKILL.md +6 -2
- package/plugins/sp/skills/spur-cli/references/agent.md +124 -17
- package/plugins/sp/skills/spur-cli/references/decision.md +98 -0
- package/plugins/sp/skills/spur-cli/references/message.md +7 -7
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +41 -3
- package/plugins/sp/skills/spur-cli/references/tasks.md +10 -7
- package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +7 -0
- package/plugins/sp/skills/spur-cli/references/workflows.md +7 -2
- package/plugins/sp/skills/spur-composer/SKILL.md +28 -2
- package/plugins/sp/skills/spur-dev/SKILL.md +18 -14
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +6 -3
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +49 -14
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +51 -18
- package/plugins/sp/skills/spur-dev/references/execution-batch-continuation.md +68 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +194 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +113 -963
- package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +130 -0
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +20 -0
- package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +471 -0
- package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +379 -0
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +51 -9
- package/plugins/sp/skills/spur-dev/references/glossary.md +2 -2
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +361 -156
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +6 -0
- package/plugins/sp/skills/spur-dev/references/structured-trace-emission.md +178 -0
- package/plugins/sp/skills/wayfinder/SKILL.md +10 -14
- package/schemas/decision-catalog.schema.json +226 -0
- package/schemas/spur-config.schema.json +25 -0
- package/schemas/state-machine-workflow.schema.json +23 -0
- package/spur.js +28165 -19051
- package/web/_astro/{BoardApp.i4eh_fHA.js → BoardApp.D66k_s_T.js} +1 -1
- package/web/_astro/BoardApp.D6sjAJr_.js +324 -0
- package/web/_astro/{TaskDetail.C5Cu8LdB.js → TaskDetail.BynLnMNc.js} +1 -1
- package/web/_astro/{arc.Bu5XpBEz.js → arc._BUadrdH.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.9vHQTvhF.js → architectureDiagram-3BPJPVTR.Dh7xS1Pp.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.Cn2Xl7D6.js → blockDiagram-GPEHLZMM.DFDVpfXm.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.7o0P_QDo.js → c4Diagram-AAUBKEIU.V7_3_glh.js} +1 -1
- package/web/_astro/channel.DZVfto-r.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.C3zZFsNt.js → chunk-2J33WTMH.De1yx7Jz.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.CNy_M7fO.js → chunk-4BX2VUAB.BDhHFuxx.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.2TiPnLBL.js → chunk-55IACEB6.DDLkWnmC.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.5CGSyKAp.js → chunk-727SXJPM.CwfiLnA7.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.w-ZIgfsK.js → chunk-AQP2D5EJ.CtGDmUnM.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.BkcEyhKa.js → chunk-FMBD7UC4.BOLjpw73.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.mxKKbBG4.js → chunk-ND2GUHAM.BDhQls6O.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.cyA0z9aT.js → chunk-QZHKN3VN.76qBynDF.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.CqtUzwhX.js → classDiagram-4FO5ZUOK.N0mpPHT0.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.CqtUzwhX.js → classDiagram-v2-Q7XG4LA2.N0mpPHT0.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.BExPTopI.js → cose-bilkent-S5V4N54A.CKknFfjB.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.Bq2i10Cn.js → cynefin-OW5HDTMX.Cw3ZWBAh.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.By_HsOuv.js → dagre-BM42HDAG.D3yIKCRD.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.BtU0b7hz.js → diagram-2AECGRRQ.D51dO83Z.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.D00ztMdT.js → diagram-5GNKFQAL.Bb-FViDj.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.DMVJWaUN.js → diagram-KO2AKTUF.D3mN8S6x.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.Cxqrjg5-.js → diagram-LMA3HP47.dMMyPcbJ.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.2lz_1B5h.js → diagram-OG6HWLK6.AzbvzY4C.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.BVQEuJ3T.js → erDiagram-TEJ5UH35.BR5I4OZb.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.Qlyo90ky.js → flowDiagram-I6XJVG4X.DFqvhGkn.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.DRwb8HHZ.js → ganttDiagram-6RSMTGT7.ByJbhH6J.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.YfoPthfS.js → gitGraphDiagram-PVQCEYII.CInHjQR3.js} +1 -1
- package/web/_astro/index.COh_kBxN.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.DvFREck1.js → infoDiagram-5YYISTIA.Cm0dGVjJ.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.BzCj9Q0-.js → ishikawaDiagram-YF4QCWOH.C3nOP6Sj.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.BDMT_AFb.js → journeyDiagram-JHISSGLW.4IvLa2MW.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.D6Fh3gj9.js → kanban-definition-UN3LZRKU.DS87Cl-k.js} +1 -1
- package/web/_astro/{linear.Dxw00fGQ.js → linear.MzmRrNER.js} +1 -1
- package/web/_astro/{mermaid.core.CsoxUWa0.js → mermaid.core.fK-WNswS.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.CN8oeHLu.js → mindmap-definition-RKZ34NQL.BqipOHhY.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.C7ADqQ_7.js → pieDiagram-4H26LBE5.0nBiPqFG.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.Cw9lKyHP.js → quadrantDiagram-W4KKPZXB.Szj7Zpx5.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.B1ni-z4q.js → requirementDiagram-4Y6WPE33.D4UR6TWo.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.BhexdjVr.js → sankeyDiagram-5OEKKPKP.DAE7BdOs.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.C3Rm7dpQ.js → sequenceDiagram-3UESZ5HK.BP9ZVq25.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.CkuMt27u.js → stateDiagram-AJRCARHV.BQW7mIxk.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.Dc_aazUA.js → stateDiagram-v2-BHNVJYJU.PbK4nDih.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.ja7sUFhH.js → timeline-definition-PNZ67QCA.Ci_GvUpo.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.BxIshX_K.js → vennDiagram-CIIHVFJN.DNw1Y5qx.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.DfHlC0sh.js → wardleyDiagram-YWT4CUSO.CwlkaaNe.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.DSnhHwCh.js → xychartDiagram-2RQKCTM6.MI6ZuiH_.js} +1 -1
- package/web/board-runtime.json +1 -1
- package/web/index.html +2 -2
- package/web/_astro/BoardApp.BVp-LYi6.js +0 -322
- package/web/_astro/channel.6IFIKBhu.js +0 -1
- package/web/_astro/index.CbNz17Sx.css +0 -1
|
@@ -23,6 +23,18 @@
|
|
|
23
23
|
# -> done
|
|
24
24
|
# doc-sync routes a contract violation to `repair` (cheap, no
|
|
25
25
|
# re-dispatch — ADR-118 pilot) and an executor failure to `failed`;
|
|
26
|
+
# 1147 adds two deterministic post-doc-sync checks that fail the step
|
|
27
|
+
# BEFORE the tripwire backstop and name doc-sync. Those edges are
|
|
28
|
+
# declared before the contract-violation edge, so a doc-sync that both
|
|
29
|
+
# misses its learnings post-condition and trips a deterministic check
|
|
30
|
+
# fails the step instead of taking repair. The checks are: the write-scope check
|
|
31
|
+
# (the entry snapshot diffed against the working listing; allowed paths
|
|
32
|
+
# are docs/** minus docs/tasks*/docs/features* plus the declared learnings
|
|
33
|
+
# capture — a violation writes scope-violation: <paths> and is reported,
|
|
34
|
+
# never auto-reverted) and the supersession-pin re-run
|
|
35
|
+
# (repo-wide-tests/adr-supersession.test.ts), so a resurrected delinked
|
|
36
|
+
# index row is attributable to doc-sync; doc-tripwire stays the full
|
|
37
|
+
# backstop and is never weakened;
|
|
26
38
|
# learnings-validate (0986) rejects a nonempty narration-only capture to
|
|
27
39
|
# the same `repair` edge with a distinct invalid-learnings-shape status —
|
|
28
40
|
# expectFile proves existence, never shape — while empty/missing captures
|
|
@@ -86,7 +98,7 @@
|
|
|
86
98
|
"$schema": "@gobing-ai/spur/schemas/state-machine-workflow.schema.json"
|
|
87
99
|
kind: state-machine
|
|
88
100
|
name: wrapup-pipeline
|
|
89
|
-
version: "
|
|
101
|
+
version: "9"
|
|
90
102
|
description: "Post-execution wrap-up: doc-sync (doc drift + learning capture), metrics, feature-transition, branch-cleanup"
|
|
91
103
|
iterationBound: 10
|
|
92
104
|
initialState: start
|
|
@@ -232,8 +244,26 @@ states:
|
|
|
232
244
|
(a clean exit that missed its declared answerFile/expectFile post-condition)
|
|
233
245
|
routes to the cheap `repair` edge instead of a full re-dispatch (ADR-118
|
|
234
246
|
pilot, 0871) — `onError: continue` lets the transition guards read the
|
|
235
|
-
agent's result instead of halting the run.
|
|
247
|
+
agent's result instead of halting the run. 1147 R1/R2 wrap it with a
|
|
248
|
+
deterministic write-scope guard (entry snapshot before the query, diff after
|
|
249
|
+
it; a violation writes scope-violation: <paths> and routes to `failed`, the
|
|
250
|
+
edits are reported and never auto-reverted) and a supersession-pin re-run, so
|
|
251
|
+
an out-of-scope or delinked-row write is attributed here instead of surfacing
|
|
252
|
+
late at doc-tripwire.
|
|
236
253
|
onEnter:
|
|
254
|
+
# (1147 R1) entry snapshot: the working listing is recorded BEFORE the model
|
|
255
|
+
# query so the post-doc-sync check can attribute only this step's writes. Never
|
|
256
|
+
# aborts; a git failure or a missing script leaves the snapshot absent and the
|
|
257
|
+
# check fails closed rather than guessing.
|
|
258
|
+
- kind: shell
|
|
259
|
+
options:
|
|
260
|
+
command: >-
|
|
261
|
+
mkdir -p .spur/run &&
|
|
262
|
+
eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/wrapup-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/wrapup-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; if [ -f "$S" ]; then
|
|
263
|
+
"$RUNNER" "$S" doc-sync-snapshot;
|
|
264
|
+
else
|
|
265
|
+
echo "wrapup-steps failed closed — script not found — run 'superskill install sp --marketplace gobing-ai/spur'" >&2;
|
|
266
|
+
fi
|
|
237
267
|
# (warn) free-form prompt: no /sp:doc-evolve command surface yet (ADR-043
|
|
238
268
|
# residual, 0607 R2 one-query merge); capture is bounded by expectFile.
|
|
239
269
|
- kind: agent.run
|
|
@@ -243,7 +273,10 @@ states:
|
|
|
243
273
|
input: >-
|
|
244
274
|
First run Skill(skill="sp:doc-evolve", args="wrapup") to repair drift in
|
|
245
275
|
docs/00_ADR.md, docs/03_ARCHITECTURE.md, docs/04_DESIGN.md, docs/design/* per constitution edit
|
|
246
|
-
rules; do not write task/feature corpus.
|
|
276
|
+
rules; do not write task/feature corpus. Write ONLY inside docs/ (never docs/tasks* or
|
|
277
|
+
docs/features*) — any other changed path fails the wrap step with a scope violation. A row
|
|
278
|
+
absent from docs/04_DESIGN.md for a superseded satellite is intentional: do NOT re-add it.
|
|
279
|
+
The batch task list is the normalized, validated
|
|
247
280
|
capture at .spur/run/${vars.__runId}-wrapup-tasks.json — read it for the WBS ids; never
|
|
248
281
|
re-parse raw input. THEN extract working learnings from those tasks —
|
|
249
282
|
conventions, errors fixed, patterns, gotchas, grouped by date and task WBS — as raw markdown
|
|
@@ -255,6 +288,34 @@ states:
|
|
|
255
288
|
answerFile: .spur/run/${vars.__runId}-wrapup-learnings.md
|
|
256
289
|
expectFile: .spur/run/${vars.__runId}-wrapup-learnings.md
|
|
257
290
|
timeoutMs: ${vars.stepTimeoutMs}
|
|
291
|
+
# (1147 R1) post-doc-sync write-scope guard: the script diffs the working listing
|
|
292
|
+
# against the entry snapshot and writes PASS or `scope-violation: <paths>` — the
|
|
293
|
+
# action always exits 0 so status truth lives in the file (0783 R4) and the
|
|
294
|
+
# declared guard routes. Violating edits are reported, never reverted.
|
|
295
|
+
- kind: shell
|
|
296
|
+
options:
|
|
297
|
+
command: >-
|
|
298
|
+
mkdir -p .spur/run &&
|
|
299
|
+
eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/wrapup-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/wrapup-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; if [ -f "$S" ]; then
|
|
300
|
+
"$RUNNER" "$S" doc-sync-scope;
|
|
301
|
+
else
|
|
302
|
+
echo "wrapup-steps failed closed — script not found — run 'superskill install sp --marketplace gobing-ai/spur'" >&2;
|
|
303
|
+
printf 'scope-violation: wrapup-steps script not found\n' > ".spur/run/$__runId-wrapup-doc-sync-scope.status";
|
|
304
|
+
fi
|
|
305
|
+
# (1147 R2) supersession pins re-run: a doc-sync that resurrects a deliberately
|
|
306
|
+
# delinked index row (`repo-wide-tests/adr-supersession.test.ts`, g2) fails HERE,
|
|
307
|
+
# named with the pin, instead of being attributed to the later doc-tripwire
|
|
308
|
+
# backstop. Skips in a project without the pin; always exits 0 (0783 R4).
|
|
309
|
+
- kind: shell
|
|
310
|
+
options:
|
|
311
|
+
command: >-
|
|
312
|
+
mkdir -p .spur/run &&
|
|
313
|
+
eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/wrapup-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/wrapup-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; if [ -f "$S" ]; then
|
|
314
|
+
"$RUNNER" "$S" doc-supersession;
|
|
315
|
+
else
|
|
316
|
+
echo "wrapup-steps failed closed — script not found — run 'superskill install sp --marketplace gobing-ai/spur'" >&2;
|
|
317
|
+
printf 'supersession-pin-failed: wrapup-steps script not found\n' > ".spur/run/$__runId-wrapup-doc-supersession.status";
|
|
318
|
+
fi
|
|
258
319
|
|
|
259
320
|
- id: learnings-validate
|
|
260
321
|
description: >
|
|
@@ -463,7 +524,8 @@ states:
|
|
|
463
524
|
description: >
|
|
464
525
|
Terminal — wrap-up failed (0770): invalid wrap input, an unresolved or
|
|
465
526
|
non-completed task, a failed metrics capture, a failed required sync, a
|
|
466
|
-
failed repo-wide tripwire (1037),
|
|
527
|
+
failed repo-wide tripwire (1037), a failed feature gate, or one of the
|
|
528
|
+
deterministic post-doc-sync checks (1147: write scope, supersession pins).
|
|
467
529
|
Already-written artifacts (learnings, metrics rows, route reason) are
|
|
468
530
|
preserved; nothing is rolled back.
|
|
469
531
|
|
|
@@ -521,17 +583,47 @@ transitions:
|
|
|
521
583
|
guard:
|
|
522
584
|
kind: always
|
|
523
585
|
|
|
524
|
-
# ── doc-sync: contract
|
|
525
|
-
# Declaration order matters
|
|
526
|
-
#
|
|
527
|
-
#
|
|
528
|
-
#
|
|
586
|
+
# ── doc-sync: deterministic checks, then contract repair (ADR-118; 1147 R1/R2) ──
|
|
587
|
+
# Declaration order matters. The engine takes the first passing guard. The two
|
|
588
|
+
# deterministic post-doc-sync checks (write scope, supersession pins) are tried
|
|
589
|
+
# first, so a doc-sync that both misses its learnings post-condition and writes
|
|
590
|
+
# out of scope (or resurrects a delinked row) fails the step. A violation they
|
|
591
|
+
# recorded can never be absorbed by repair or by the success edge. Contract
|
|
592
|
+
# violation is next (repair only when neither deterministic check fired), then
|
|
593
|
+
# success (action-ok), then the executor-failure defense (always). A failed
|
|
594
|
+
# agent.run reaches these guards because doc-sync's agent.run declares onError: continue.
|
|
595
|
+
- from: doc-sync
|
|
596
|
+
to: failed
|
|
597
|
+
terminalReason: failed-check
|
|
598
|
+
description: >
|
|
599
|
+
Write-scope violation (1147 R1): the post-doc-sync check found a changed path
|
|
600
|
+
outside docs/** minus the task/feature corpus (and the declared learnings
|
|
601
|
+
capture) — the status file names the paths and the failing step is doc-sync
|
|
602
|
+
itself. The edits are reported, never auto-reverted; already-written artifacts
|
|
603
|
+
stay on disk. Declared before contract-violation so a compound miss fails here.
|
|
604
|
+
guard:
|
|
605
|
+
kind: shell
|
|
606
|
+
options:
|
|
607
|
+
command: 'grep -q "^scope-violation:" .spur/run/$__runId-wrapup-doc-sync-scope.status 2>/dev/null'
|
|
608
|
+
- from: doc-sync
|
|
609
|
+
to: failed
|
|
610
|
+
terminalReason: failed-check
|
|
611
|
+
description: >
|
|
612
|
+
Supersession drift (1147 R2): the post-doc-sync re-run of
|
|
613
|
+
repo-wide-tests/adr-supersession.test.ts failed — doc-sync re-added a
|
|
614
|
+
deliberately delinked index row. Attributed here (named with the pin) rather
|
|
615
|
+
than at the later doc-tripwire backstop, which stays unchanged. Declared
|
|
616
|
+
before contract-violation so a compound miss fails here.
|
|
617
|
+
guard:
|
|
618
|
+
kind: shell
|
|
619
|
+
options:
|
|
620
|
+
command: 'grep -q "^supersession-pin-failed:" .spur/run/$__runId-wrapup-doc-supersession.status 2>/dev/null'
|
|
529
621
|
- from: doc-sync
|
|
530
622
|
to: repair
|
|
531
623
|
description: >
|
|
532
624
|
Contract violation (ADR-118): the agent exited 0 but missed its declared
|
|
533
|
-
post-condition. Route to the cheap
|
|
534
|
-
full agent.run on this attempt.
|
|
625
|
+
post-condition, and neither deterministic check fired. Route to the cheap
|
|
626
|
+
repair edge — never re-dispatch the full agent.run on this attempt.
|
|
535
627
|
trigger: contract-violation
|
|
536
628
|
guard:
|
|
537
629
|
kind: contract-violation
|
|
@@ -545,8 +637,9 @@ transitions:
|
|
|
545
637
|
terminalReason: failed-check
|
|
546
638
|
description: >
|
|
547
639
|
Executor failure (non-zero exit, signal, or dispatch error) — keep the
|
|
548
|
-
existing fail semantics
|
|
549
|
-
|
|
640
|
+
existing fail semantics. A scope or supersession violation is declared
|
|
641
|
+
earlier and fails the step; a contract violation never falls through here
|
|
642
|
+
because its edge is declared before this defense.
|
|
550
643
|
trigger: executor-failure
|
|
551
644
|
guard:
|
|
552
645
|
kind: always
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobing-ai/spur",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
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.21",
|
|
61
|
+
"@gobing-ai/ts-ai-runner": "^0.5.21",
|
|
62
|
+
"@gobing-ai/ts-dual-workflow-engine": "^0.5.21",
|
|
63
|
+
"@gobing-ai/ts-infra": "^0.5.21",
|
|
64
|
+
"@gobing-ai/ts-llm-jsonl-importer": "^0.5.21",
|
|
65
|
+
"@gobing-ai/ts-rule-engine": "^0.5.21",
|
|
66
|
+
"@gobing-ai/ts-runtime": "^0.5.21",
|
|
67
|
+
"@gobing-ai/ts-utils": "^0.5.21",
|
|
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
|
@@ -98,6 +98,7 @@ list this README is checked against.
|
|
|
98
98
|
| `dev-idea` | Turn a vague idea into a feature with AC and a decomposed task batch — discovery, idea-eval, feature-create, AC, feature-check, system-design, decompose, batch-create, handoff |
|
|
99
99
|
| `dev-plan` | Plan a feature from a written description — intake → feature create → AC generation → feature check gate → decomposition → batch-create |
|
|
100
100
|
| `dev-brainstorm` | Interactive solution design — heuristic discovery interview followed by structured ideation with trade-offs and confidence scoring |
|
|
101
|
+
| `dev-find-way` | Wayfinder — chart a multi-session investigation map, or resolve one map ticket; always in an isolated git worktree + branch (`--worktree`, `--wrap`) |
|
|
101
102
|
| `dev-refine` | Refine task requirements via structured Q&A — clarify scope, elicit missing details, tighten acceptance criteria; `--depth ready` audits and corrects existing claims, freezes the spec, promotes to todo |
|
|
102
103
|
|
|
103
104
|
#### Lifecycle — execution
|
|
@@ -273,6 +274,7 @@ plugins/sp/
|
|
|
273
274
|
├── commands/ # Slash-command wrappers — the SSOT (hand-editable thin wrappers; see Commands below)
|
|
274
275
|
├── agents/ # 4 specialist subagents (expert-spur, super-coder, super-planner, super-reviewer)
|
|
275
276
|
├── hooks/ # hooks.json + task-write-guard.{ts,test.ts} + context-{session-start,post-tool,session-stop}.ts
|
|
277
|
+
│ # + agent-lifecycle.{ts,test.ts} + fleet-guest-stop.{ts,test.ts} (fleet member/guest hooks)
|
|
276
278
|
│ # + careful-guard.{ts,test.ts} + context-hooks.test.ts + token-estimate.test.ts
|
|
277
279
|
│ # + shared policy modules: agent-hint.ts, destructive-policy.{ts,test.ts}, task-file-policy.{ts,test.ts}
|
|
278
280
|
│ # + pi/guard-extension.{ts,test.ts} (plugin.json `extensions.pi` entry point)
|
|
@@ -342,6 +344,7 @@ surface or run one workflow. All skills target the same five core platforms: `cl
|
|
|
342
344
|
| `reverse-engineering` | 1.1 | Codebase analysis / HLD generation / audit — depth-driven reverse engineering with orthogonal mode, focus, and format controls; backs `/sp:dev-reverse` |
|
|
343
345
|
| `issue-finding` | 2.0 | Session-log forensics — multi-source discovery, bottleneck ranking, optional topic focus, CLI-gated fix task generation; **legacy path** — superseded by `history-anatomy` for indexed reporting; backs no current command; directly invocable as sp:issue-finding |
|
|
344
346
|
| `conflict-finding` | 1.0 | Authority-aware semantic audit — four-pillar (source/task/feature/authority) conflict discovery, claim-specific authority resolution, reproducible evidence, confirmed owner-routed remediation; backs `/sp:dev-find-conflict` |
|
|
347
|
+
| `fleet-join` | 1.0 | Guest fleet occupancy — join as a live guest occupant, loop `spur agent wait --inbox` to pull work, reply through `spur message reply`, then leave; G73 (task 1081) |
|
|
345
348
|
| `next-feature` | 1.0 | Prompt-first feature frontier prioritizer — sync-first precondition, B3 actionability gate (cited, never restated), tiered rubric over measured signals, D1–D4 defect proposals conforming to the restructure map schema; backs `/sp:dev-find-next` |
|
|
346
349
|
| `pr-reviewing` | 1.0 | GitHub Codex PR review — PR prepare/reuse, `@codex review` request with per-HEAD dedupe, bounded polling, findings normalization, validated fix + re-review; spine SSOT `pr-review.yaml` + `scripts/pr-reviewing.ts`; backs `/sp:dev-pr-review` |
|
|
347
350
|
| `indexed-context` | 1.0 | Cross-agent project context — anatomy/learnings/pitfalls/buglog/memory in `.spur/context/`; hook-tracked token-ledger; graceful degradation on agents without hooks |
|
|
@@ -391,7 +394,7 @@ index above lists the live inventory, organized by the surface they wrap:
|
|
|
391
394
|
|
|
392
395
|
| Prefix | Count | Delegates to | Purpose |
|
|
393
396
|
| ------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
|
|
394
|
-
| `dev-*` |
|
|
397
|
+
| `dev-*` | 38 | `sp:spur-dev`, `sp:spur-cli`, `sp:next-router`, `sp:next-feature`, `sp:brainstorm`, `sp:wayfinder`, `sp:sys-architecture`, `sp:code-implementation`, `sp:code-testing`, `sp:code-verification`, `sp:functional-review`, `sp:code-improvement`, `sp:code-simplification`, `sp:sys-debugging`, `sp:dogfood-testing`, `sp:parallel-execution`, `sp:history-anatomy`, `sp:session-review`, `sp:conflict-finding`, `sp:reverse-engineering`, `sp:pr-reviewing`, inline | The dev-workflow surface — planning, execution, batch, wrap-up, review/verify, hygiene |
|
|
395
398
|
| `rule-*` | 3 | `sp:spur-cli` | The rule surface — `rule-add`, `rule-refine`, `rule-scan` |
|
|
396
399
|
| `workflow-*` | 2 | `sp:spur-cli` | The workflow surface — `workflow-add`, `workflow-refine` |
|
|
397
400
|
| `spur-init` | 1 | `sp:doc-evolve` | Project bootstrap (`spur init`) with doc-evolve integration |
|
|
@@ -406,6 +409,15 @@ hand-editable source for the operator command surface. Per-platform adapters are
|
|
|
406
409
|
output** owned by `superskill` (`superskill install sp`) and never committed here. Plugin `sp` ships
|
|
407
410
|
no per-platform artifacts — only the platform-independent thin wrappers.
|
|
408
411
|
|
|
412
|
+
**Install-time `lib/` ownership (1120).** Staging and refreshing the plugin's sibling
|
|
413
|
+
`lib/inline-run.generated.mjs` app bundle into the shared scripts root is `superskill`'s install
|
|
414
|
+
contract (superskill commit `b42961b`, first release after 0.3.35): spur ships the bundle, superskill
|
|
415
|
+
places it. The inline scripts carry a skew guard for the window where the installed bundle is older
|
|
416
|
+
than its scripts (e.g. superskill ≤ 0.3.35): they fail with a named version-skew error — bundle
|
|
417
|
+
path, missing exports, and both remedies — instead of an `is not a function` TypeError. Until a
|
|
418
|
+
superskill release containing `b42961b` is installed and `sp` reinstalled, pass
|
|
419
|
+
`--spur-bin <spur checkout>/apps/cli/src/index.ts`.
|
|
420
|
+
|
|
409
421
|
**Thin-wrapper contract** is enforced by `scripts/commands/validate-commands.ts`:
|
|
410
422
|
|
|
411
423
|
```bash
|
|
@@ -473,13 +485,16 @@ the agent provides an isolated context window.
|
|
|
473
485
|
#### 4. Hooks (`hooks/`)
|
|
474
486
|
|
|
475
487
|
Event-driven enforcement that runs automatically without user invocation. `hooks.json` registers
|
|
476
|
-
|
|
488
|
+
six handlers across seven events:
|
|
477
489
|
|
|
478
490
|
| Event | Matcher | Handler | Timeout |
|
|
479
491
|
| -------------- | ------------------------------------- | ---------------------------------------------- | ------- |
|
|
480
492
|
| `PreToolUse` | `Write\|Edit` | `superskill hook run sp task-write-guard` | 10s |
|
|
481
493
|
| `PostToolUse` | `Bash\|Grep\|Glob\|Read\|Write\|Edit` | `superskill hook run sp context-post-tool` | 10s |
|
|
482
494
|
| `SessionStart` | — | `superskill hook run sp context-session-start` | 15s |
|
|
495
|
+
| `SessionStart`, `UserPromptSubmit`, `Stop` | — | `superskill hook run sp agent-lifecycle` | 5s |
|
|
496
|
+
| `Notification` | `permission_prompt` | `superskill hook run sp agent-lifecycle` | 5s |
|
|
497
|
+
| `Stop` | — | `superskill hook run sp fleet-guest-stop` | 10s |
|
|
483
498
|
| `SessionEnd` | — | `superskill hook run sp context-session-stop` | 15s |
|
|
484
499
|
|
|
485
500
|
**Write guard.** The `PreToolUse` hook fires on every `Write`/`Edit` tool call and checks whether
|
|
@@ -493,6 +508,11 @@ estimates the token cost of each matched tool call and appends it to `.spur/cont
|
|
|
493
508
|
(with redaction of sensitive argument fields), `context-session-start` seeds the indexed-context
|
|
494
509
|
hint on first launch, and `context-session-stop` closes out the session record.
|
|
495
510
|
|
|
511
|
+
**Fleet hooks (1080/1081).** `agent-lifecycle` reports member state in the background via
|
|
512
|
+
`spur agent report --state working|idle|blocked` (a permission prompt is `blocked`) — only when
|
|
513
|
+
`SPUR_SPEC_ID` is set, so outside a fleet it makes no call. `fleet-guest-stop` delivers pending
|
|
514
|
+
inbox work to a session joined as a fleet guest at turn end; any other session passes through.
|
|
515
|
+
|
|
496
516
|
**Available but unwired:** `careful-guard.ts` ships in `hooks/` (with tests) as an opt-in
|
|
497
517
|
`PreToolUse` guard that asks before destructive shell commands (`rm -rf`, `DROP TABLE`,
|
|
498
518
|
`git push --force`, …) — it is **not** registered in `hooks.json`. Fail-open by contract; escape
|
|
@@ -511,6 +531,7 @@ hold `SKILL.md` and prompt-side companions only.
|
|
|
511
531
|
| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
512
532
|
| `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. |
|
|
513
533
|
| `hooks/context-*.ts` | Runtime for the three registered context hooks (session-start, post-tool, session-stop) — token-cost estimation + ledger append for `sp:indexed-context` |
|
|
534
|
+
| `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 |
|
|
514
535
|
| `hooks/careful-guard.ts` | Opt-in destructive-command guard (unwired — see Hooks above) |
|
|
515
536
|
| `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 |
|
|
516
537
|
| `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 |
|
|
@@ -518,6 +539,8 @@ hold `SKILL.md` and prompt-side companions only.
|
|
|
518
539
|
| `scripts/dogfood-testing/validate-report.ts` | Pure `validateReport(md)` — footer-mandatory + 7-check finalize-or-abort contract with stable error codes |
|
|
519
540
|
| `scripts/daily-summary/{daily-summary,logger}.ts` | ccusage + git-history orchestration helpers for `sp:daily-summary` |
|
|
520
541
|
| `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
|
+
| `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
|
+
| `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 |
|
|
521
544
|
| `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 |
|
|
522
545
|
| `*.test.ts` | Unit suites — in `hooks/` for guards, in `tests/<skill>/` per ADR-031 pairing |
|
|
523
546
|
|
|
@@ -285,6 +285,17 @@ With `--json`, emit the same shape as a JSON object for machine consumption.
|
|
|
285
285
|
`spur workflow continue --answer-text` and the run resumes implement with the Q/A transcript
|
|
286
286
|
(bounded by `maxEscalations`). See [execution-batch.md Step 3](../skills/spur-dev/references/execution-batch.md#step-3--the-driver-loop-r3-r4).
|
|
287
287
|
|
|
288
|
+
## Parent-host ownership of the visible plan (1105 R4)
|
|
289
|
+
|
|
290
|
+
The parent host owns the visible plan: apply the § 2.7 Visible batch plan updates in the parent
|
|
291
|
+
session's native todo list (`execution-batch.md` § 2.7; the frozen status mapping lives in
|
|
292
|
+
[inline-pipeline-driver.md](../skills/spur-dev/references/inline-pipeline-driver.md) § Host todo
|
|
293
|
+
update styles). Subagents own code and evidence — subagents never render the visible list and todo
|
|
294
|
+
tools are not available to them; at each **stage boundary** (implement, test, review, verify) a
|
|
295
|
+
subagent returns `{wbs, state, outcome}` (+ optional `next`), and the parent marks the matching rows
|
|
296
|
+
with the reported outcome. Keep letters/digits from the projection identical across both layers so
|
|
297
|
+
row identity stays stable.
|
|
298
|
+
|
|
288
299
|
## Platform Notes
|
|
289
300
|
|
|
290
301
|
- **Claude Code:** native - `Bash` runs `spur` CLI for deterministic verbs; `Skill()` is available
|
|
@@ -123,6 +123,12 @@ HITL gate unless `--auto` was passed.
|
|
|
123
123
|
- [ ] Dispatch each requested dimension to its owning skill — do not inline the review logic.
|
|
124
124
|
- [ ] Merge findings into a single ranked report, emitting native priority cells
|
|
125
125
|
(`P1 (blocker)` > `P2 (major)` > `P3 (minor)` > `P4 (advisory)` — see Output Format).
|
|
126
|
+
- [ ] Sweep a finding's **class** in the same round. When a defect is one instance of a repeated
|
|
127
|
+
pattern (the same rule misapplied on two surfaces, a signature stale in both a generator and
|
|
128
|
+
its output), grep for the siblings and report every instance now. A half-found class costs a
|
|
129
|
+
full gate + review cycle when the next round finds the other half — H1 batch 2026-10-08:
|
|
130
|
+
review round 1 of task 1129 named one runbook's fingerprint/commit mismatch, round 2 found
|
|
131
|
+
the same mismatch on the sibling runbook.
|
|
126
132
|
- [ ] With a WBS target (standalone or pipeline), write the merged report to that task's
|
|
127
133
|
`## Review` section via `spur task update <wbs> --section Review --from-file` — per task
|
|
128
134
|
under a task set, then the combined summary table; with a path target, emit as advisory
|
|
@@ -165,6 +171,24 @@ fails it. One explicit mapping, no transcription step anywhere downstream:
|
|
|
165
171
|
Severity words stay visible in the same cell — the mapping adds the machine-readable label, it does
|
|
166
172
|
not replace the semantics.
|
|
167
173
|
|
|
174
|
+
**Disposition column (1089, E71).** The findings table carries a `Disposition` cell. It is not
|
|
175
|
+
cosmetic: the record stage's residual sweep reads these rows (`parseReviewFindings` in
|
|
176
|
+
`packages/app/src/services/residual-scan.ts`), and a `P1`–`P3` row with no disposition classifies as
|
|
177
|
+
**blocking**, which downgrades a PASS verdict to PARTIAL and closes the `done` gate. A finding you
|
|
178
|
+
resolved inside the same task therefore says so in that cell — `RESOLVED`/`FIXED`/`DONE` (optionally
|
|
179
|
+
with the commit) drops the row from the sweep; `DEFER(<reason>)` reclassifies a P3 as deferrable
|
|
180
|
+
(never P1/P2). Prose such as "Closed." inside the *Finding* cell does not count — the sweep reads
|
|
181
|
+
the cell, not the sentence. `OPEN` states "still live", and `ACCEPTED` marks a non-blocking P4
|
|
182
|
+
observation you are deliberately not acting on; both behave as an ordinary open row.
|
|
183
|
+
|
|
184
|
+
**Pipeline cost of an open finding (1122).** The review PASS edges run this same classification
|
|
185
|
+
before verify (`residual-scan review-gate`): a PASS whose table still carries an open P1-P3 row
|
|
186
|
+
routes into `review-fail-triage` → the bounded repair hop instead of verify. Open P1-P3 findings
|
|
187
|
+
block `done`; fixing one invalidates the certified digest and re-runs quality → review → verify on
|
|
188
|
+
a fresh digest. Only P4 rows and `DEFER`-ed P3 rows are wrap residuals — disposition the finding in
|
|
189
|
+
its cell now, while you hold the context, instead of leaving the cost to be rediscovered after a
|
|
190
|
+
full cycle.
|
|
191
|
+
|
|
168
192
|
**Section-relative headings.** In WBS mode (standalone or pipeline) the report body is written
|
|
169
193
|
*into* the task's `### Review` section, so every heading inside it MUST be `####` or deeper. A
|
|
170
194
|
`##`/`###` heading in the body becomes a new top-level task section and corrupts the document. With
|
|
@@ -173,19 +197,17 @@ shallower.
|
|
|
173
197
|
|
|
174
198
|
```markdown
|
|
175
199
|
#### Review Report — <wbs|path>
|
|
176
|
-
|
|
177
200
|
**Scope:** <wbs diff | path glob>
|
|
178
201
|
**Dimensions:** functional, security, efficiency, correctness, usability, architecture
|
|
179
202
|
**Verdict:** PASS | PARTIAL | FAIL
|
|
180
|
-
|
|
181
203
|
##### Findings (ranked)
|
|
182
204
|
|
|
183
|
-
| # | Priority | Dimension | Finding | Location |
|
|
184
|
-
|
|
185
|
-
| 1 | P1 (blocker) | security | SQL injection in query builder | `src/api/users.ts:42` |
|
|
186
|
-
| 2 | P2 (major) | architecture | Shallow pass-through UserService | `src/services/users.ts:15` |
|
|
187
|
-
| 3 | P3 (minor) | correctness | Missing error branch in createUser | `src/api/users.ts:48` |
|
|
188
|
-
| 4 | P4 (advisory) | usability | `createUser` error text omits the field name | `src/api/users.ts:51` |
|
|
205
|
+
| # | Priority | Dimension | Finding | Location | Disposition |
|
|
206
|
+
|---|----------|-----------|---------|----------|-------------|
|
|
207
|
+
| 1 | P1 (blocker) | security | SQL injection in query builder | `src/api/users.ts:42` | OPEN |
|
|
208
|
+
| 2 | P2 (major) | architecture | Shallow pass-through UserService | `src/services/users.ts:15` | OPEN |
|
|
209
|
+
| 3 | P3 (minor) | correctness | Missing error branch in createUser | `src/api/users.ts:48` | RESOLVED (fixed in <sha>) |
|
|
210
|
+
| 4 | P4 (advisory) | usability | `createUser` error text omits the field name | `src/api/users.ts:51` | ACCEPTED |
|
|
189
211
|
|
|
190
212
|
##### Functional Traceability
|
|
191
213
|
|
|
@@ -197,14 +219,20 @@ shallower.
|
|
|
197
219
|
**Next:** <one-line action>
|
|
198
220
|
```
|
|
199
221
|
|
|
222
|
+
The **Verdict line is machine-read** by the task pipeline (session finding after 1088): `review →
|
|
223
|
+
verify|approve` requires a line matching `Verdict: PASS` (plain or bold), and ANYTHING ELSE —
|
|
224
|
+
FAIL, PARTIAL, a missing line, a line split across two lines — routes the run into
|
|
225
|
+
`review-fail-triage` and its bounded repair hop. Keep it on one line, in that shape, in every
|
|
226
|
+
review answer; never restate it as prose only.
|
|
227
|
+
|
|
200
228
|
**No findings.** Never invent a defect to populate the table. Emit one substantive `P4 (advisory)`
|
|
201
229
|
row that states what was reviewed and what was found — placeholder cells (empty, `—`, `n/a`) are
|
|
202
230
|
rejected by the checker, and so they should be:
|
|
203
231
|
|
|
204
232
|
```markdown
|
|
205
|
-
| # | Priority | Dimension | Finding | Location |
|
|
206
|
-
|
|
207
|
-
| 1 | P4 (advisory) | — | No P1–P3 findings: 6 changed files reviewed across all six dimensions; R1–R3 traceable to tests | `packages/app/src/workflow/proof-input-fingerprint.ts:102-160` |
|
|
233
|
+
| # | Priority | Dimension | Finding | Location | Disposition |
|
|
234
|
+
|---|----------|-----------|---------|----------|-------------|
|
|
235
|
+
| 1 | P4 (advisory) | — | No P1–P3 findings: 6 changed files reviewed across all six dimensions; R1–R3 traceable to tests | `packages/app/src/workflow/proof-input-fingerprint.ts:102-160` | ACCEPTED |
|
|
208
236
|
```
|
|
209
237
|
|
|
210
238
|
## Out of scope
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Workspace-local test config (task 1127 R8/AC7, mirroring apps/cli's 0699 R3 precedent): without
|
|
2
|
+
# it, `cd plugins/sp && bun test` — the run AGENTS.md prescribes — skipped the root preload and
|
|
3
|
+
# resolved the operator's real ~/.config/spur/run/full-gate.lock. These suites then waited silently
|
|
4
|
+
# behind any live host-wide gate holder (their holder line is swallowed by `silenceStdout`), which
|
|
5
|
+
# is the dispatch-budget burn this task exists to remove. Coverage stays gated by the root bunfig
|
|
6
|
+
# (bun run test).
|
|
7
|
+
[test]
|
|
8
|
+
preload = ["../../tests/setup.ts"]
|
|
@@ -1,41 +1,54 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Interactive solution design — heuristic discovery interview followed by structured ideation with trade-offs and confidence scoring
|
|
3
3
|
role: planner
|
|
4
|
-
argument-hint: "<topic> [--depth <basic|detailed|comprehensive>] [--options <n>] [--agent <inline|auto|name>] [--skip-discovery] [--
|
|
4
|
+
argument-hint: "<topic> [--depth <basic|detailed|comprehensive>] [--options <n>] [--agent <inline|auto|name>] [--skip-discovery] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]"
|
|
5
5
|
allowed-tools: ["Bash", "Read", "Skill", "AskUserQuestion"]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Dev Brainstorm
|
|
9
9
|
|
|
10
|
-
Wraps the **sp:brainstorm**
|
|
10
|
+
Wraps the **sp:brainstorm** skill.
|
|
11
11
|
|
|
12
12
|
## Argument Flags
|
|
13
13
|
|
|
14
14
|
| Flag | Description | Default |
|
|
15
15
|
| --- | --- | --- |
|
|
16
16
|
| `<topic>` | Topic or problem statement to explore. | required |
|
|
17
|
-
| `--depth` `<basic\|detailed\|comprehensive>` |
|
|
18
|
-
| `--options` `<n>` | Number of solution
|
|
17
|
+
| `--depth` `<basic\|detailed\|comprehensive>` | How deep the discovery interview walks the decision tree. | detailed |
|
|
18
|
+
| `--options` `<n>` | Number of solution approaches to generate. | 3 |
|
|
19
19
|
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing ideation. | omit |
|
|
20
20
|
| `--skip-discovery` | Skip the discovery interview; ideate immediately. | off |
|
|
21
|
-
| `--
|
|
22
|
-
| `--
|
|
23
|
-
| `--
|
|
24
|
-
| `--next` | Hand off to the next-router on success. | off |
|
|
21
|
+
| `--task` `[<feature-id>]` | Artifact exit: create one `todo` task from the chosen approach, optionally under `<feature-id>`. | omitted |
|
|
22
|
+
| `--feature` `[<parent-id>]` | Artifact exit: create a validated feature (Goal/Scope/BDD AC) from the chosen approach, optionally under `<parent-id>`. | omitted |
|
|
23
|
+
| `--next` | With `--feature` only: on a clean `feature check`, chain into `/sp:dev-plan --feature <ID>`. | off |
|
|
25
24
|
|
|
26
25
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
27
26
|
|
|
28
27
|
## Usage
|
|
29
28
|
|
|
30
|
-
|
|
29
|
+
```
|
|
30
|
+
/sp:dev-brainstorm "<topic>" [--depth <basic|detailed|comprehensive>] [--options <n>] [--agent <inline|auto|name>] [--skip-discovery] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Two phases:
|
|
34
|
+
|
|
35
|
+
1. **Discovery** — a grilling interview, one question at a time, each with a recommended answer;
|
|
36
|
+
the codebase is explored before the operator is asked. Produces a resolved decision tree.
|
|
37
|
+
`--skip-discovery` replaces it with the skill's lightweight clarification step.
|
|
38
|
+
2. **Ideation** — `--options` approaches, each with trade-offs, implementation notes, confidence
|
|
39
|
+
and the decisions it depends on; one is marked recommended.
|
|
40
|
+
|
|
41
|
+
Without an exit flag the brainstorm output is the result. `--task` and `--feature` are mutually
|
|
42
|
+
exclusive (passing both is an error); the operator confirms the chosen approach before either
|
|
43
|
+
writes to the corpus. `--next` is ignored without `--feature`.
|
|
44
|
+
|
|
45
|
+
If discovery shows the destination itself is too foggy to spec in one session, stop and recommend
|
|
46
|
+
`/sp:dev-find-way "<topic>"` with the resolved decision tree as its starting notes. Never chart a
|
|
47
|
+
multi-session map from this command.
|
|
31
48
|
|
|
32
49
|
## Implementation
|
|
33
50
|
|
|
34
51
|
- Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
`--next`: chain-to-completion with
|
|
39
|
-
propagation. Only meaningful with `--feature` (the front-half artifact exit): on a clean
|
|
40
|
-
`feature check`, chain into `/sp:dev-plan --feature <ID>` so the planning half runs end-to-end.
|
|
41
|
-
Ignored without `--feature` (there is no task in a lifecycle to advance). **was: `--next` declared but never defined.**
|
|
52
|
+
- Discovery protocol: [grilling-interview.md](../skills/brainstorm/references/grilling-interview.md).
|
|
53
|
+
- Ideation: `Skill(skill="sp:brainstorm", args="dev-brainstorm --context <decision-tree> --options <n>")`
|
|
54
|
+
- Artifact exits and `--next`: [dev-operations.md § 12. brainstorm](../skills/spur-dev/references/dev-operations.md#12-brainstorm).
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Generate changelog from git commits
|
|
3
3
|
role: scribe
|
|
4
|
-
argument-hint: "[--since <tag|commit>] [--until <tag|commit>] [--version <version>]"
|
|
5
|
-
allowed-tools: ["Bash", "Read"]
|
|
4
|
+
argument-hint: "[<file>] [--since <tag|commit>] [--until <tag|commit>] [--version <version>]"
|
|
5
|
+
allowed-tools: ["Bash", "Read", "Edit"]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Dev Changelog
|
|
@@ -13,6 +13,7 @@ Implements an inline procedure — see [dev-operations.md](../skills/spur-dev/re
|
|
|
13
13
|
|
|
14
14
|
| Flag | Description | Default |
|
|
15
15
|
| --- | --- | --- |
|
|
16
|
+
| `<file>` | Optional positional target (e.g. `CHANGELOG.md`); the new section is inserted above its newest release. | stdout |
|
|
16
17
|
| `--since` `<tag\|commit>` | Start of the commit range. | latest tag |
|
|
17
18
|
| `--until` `<tag\|commit>` | End of the commit range. | HEAD |
|
|
18
19
|
| `--version` `<version>` | Override the detected release version. | detected |
|
|
@@ -21,9 +22,9 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
21
22
|
|
|
22
23
|
## Usage
|
|
23
24
|
|
|
24
|
-
/sp:dev-changelog [--since <tag|commit>] [--until <tag|commit>] [--version <version>]
|
|
25
|
+
/sp:dev-changelog [<file>] [--since <tag|commit>] [--until <tag|commit>] [--version <version>]
|
|
25
26
|
|
|
26
27
|
## Implementation
|
|
27
28
|
|
|
28
|
-
Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#8-changelog) (changelog).
|
|
29
|
+
Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#8-changelog) (changelog). This is a docs-only generator: run no quality gates (lint, tests, `spur-check`, rules, citation checks).
|
|
29
30
|
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Wayfinder — chart a multi-session investigation map for a foggy destination, or resolve one map ticket, always inside an isolated git worktree + branch
|
|
3
|
+
role: planner
|
|
4
|
+
argument-hint: "<idea> | <feature-id> [<wbs>] [--agent <inline|auto|name>] [--auto] [--worktree [<name>]] [--wrap]"
|
|
5
|
+
allowed-tools: ["Bash", "Read", "Write", "Edit", "Skill", "AskUserQuestion"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Dev Find Way
|
|
9
|
+
|
|
10
|
+
Wraps the **sp:wayfinder** skill.
|
|
11
|
+
|
|
12
|
+
## Argument Flags
|
|
13
|
+
|
|
14
|
+
| Flag | Description | Default |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| `<idea>` | Loose idea whose destination is too foggy to spec in one session. Enters **chart** mode. | required (one of `<idea>` / `<feature-id>`) |
|
|
17
|
+
| `<feature-id>` | Existing wayfinder map (feature tagged `wayfinder-map`). Enters **work** mode. | required (one of `<idea>` / `<feature-id>`) |
|
|
18
|
+
| `<wbs>` | Work mode only: the ticket to resolve. Omit to take the first unclaimed frontier ticket. | first frontier ticket |
|
|
19
|
+
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing charting/resolution. | omit |
|
|
20
|
+
| `--auto` | Skip objective HITL confirmations. Never skips the map's open-question decisions. | off |
|
|
21
|
+
| `--worktree` `[<name>]` | Isolation mode. Bare (or omitted) creates a fresh worktree + branch; `--worktree <name>` adopts an existing worktree by name/path/branch. FF-merge on success, retain on failure. There is no in-place mode. | create |
|
|
22
|
+
| `--wrap` | Work mode only: after the ticket reaches `done`, run `/sp:dev-wrap <wbs>` inside the worktree before the merge. | off |
|
|
23
|
+
|
|
24
|
+
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
25
|
+
|
|
26
|
+
## Usage
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
/sp:dev-find-way "<idea>" [--agent <inline|auto|name>] [--auto] [--worktree [<name>]]
|
|
30
|
+
/sp:dev-find-way <feature-id> [<wbs>] [--agent <inline|auto|name>] [--auto] [--worktree [<name>]] [--wrap]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
A first argument that resolves as a feature id (`spur feature show <id> --json`) is work mode;
|
|
34
|
+
anything else is a chart-mode idea. Chart mode charts the map and stops; work mode resolves
|
|
35
|
+
**exactly one** ticket (one ticket per session).
|
|
36
|
+
|
|
37
|
+
**Always a worktree + branch.** Every invocation runs in an isolated git worktree on its own branch —
|
|
38
|
+
never in the invoking tree, and never as a branch switch (`git checkout -b`) in the invoking tree.
|
|
39
|
+
A branch-only session mutates the operator's checkout under every other agent sharing it, and its
|
|
40
|
+
`wayfind/*` branches pile up on the main tree. Omitting `--worktree` behaves exactly like bare
|
|
41
|
+
`--worktree`.
|
|
42
|
+
|
|
43
|
+
**Lifecycle.** `execution-batch.md` § Worktree isolation applied to a run of one (WT-1…WT-5):
|
|
44
|
+
|
|
45
|
+
- WT-1 dirty-tree precheck on the invoking tree (abort on dirty — name the files).
|
|
46
|
+
- WT-2 create (sibling dir, `bun install --frozen-lockfile --ignore-scripts`) or adopt by name.
|
|
47
|
+
- WT-3 marker in the invoking tree's `.spur/run/`: `command` = `dev-find-way`, `selector` =
|
|
48
|
+
`chart:<destination-slug>` or `<feature-id>:<wbs>`.
|
|
49
|
+
- Derived branch: `sp/wayfind-<destination-slug>-<short-id>` (chart) or
|
|
50
|
+
`sp/wayfind-<wbs>-<short-id>` (work).
|
|
51
|
+
- WT-3b commit the session's corpus writes on the branch, then WT-4 FF-merge onto the base ref
|
|
52
|
+
(create mode removes the tree and deletes the branch; reuse mode retains both).
|
|
53
|
+
- WT-5 retain intact on any failure, HITL pause, unresolved open question that ends the session,
|
|
54
|
+
or non-FF base — report path, branch and the resume command (`--worktree <name>`).
|
|
55
|
+
|
|
56
|
+
Success is: **chart** — map feature created, tagged `wayfinder-map`, `spur feature check <id>`
|
|
57
|
+
clean, child tickets wired; **work** — the ticket reached `done`, its line is in
|
|
58
|
+
**## Decisions so far**, and graduated fog became tickets.
|
|
59
|
+
|
|
60
|
+
**Ticket selection across parallel sessions (work mode).** Corpus writes — including the `wip`
|
|
61
|
+
claim — land in the worktree copy until the merge, so a claim is invisible to sibling worktrees.
|
|
62
|
+
Before choosing a frontier ticket, read every `.spur/run/worktree-*.json` marker in the invoking
|
|
63
|
+
tree with `command: dev-find-way` and `status: active`/`retained`, and exclude their `<wbs>`. A named
|
|
64
|
+
`<wbs>` held by such a marker aborts before any tree is created; resume it with
|
|
65
|
+
`--worktree <name>` instead.
|
|
66
|
+
|
|
67
|
+
**`--wrap`.** Runs after the ticket reaches `done` and before WT-3b, so the wrap's writes merge with
|
|
68
|
+
the resolution. `--agent` is preserved into the `/sp:dev-wrap <wbs>` handoff when supplied. In chart
|
|
69
|
+
mode nothing is resolved: `--wrap` is skipped with the reason `wrap skipped: chart mode resolves no
|
|
70
|
+
ticket`.
|
|
71
|
+
|
|
72
|
+
**Corpus visibility.** Until the FF-merge, the map and ticket writes exist only in the worktree; the
|
|
73
|
+
invoking tree shows the pre-session state. Expected, not a bug.
|
|
74
|
+
|
|
75
|
+
## Implementation
|
|
76
|
+
|
|
77
|
+
- Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
78
|
+
- Worktree lifecycle: [execution-batch.md § Worktree isolation](../skills/spur-dev/references/execution-batch.md#worktree-isolation---worktree-name) — every host call pins the execution tree per its per-call tree-pin rule.
|
|
79
|
+
- Inside the worktree: `Skill(skill="sp:wayfinder", args="$ARGUMENTS")` — the skill owns charting, ticket resolution, fog graduation and the one-ticket-per-session rule.
|
|
80
|
+
- `--wrap` (work mode): `/sp:dev-wrap <wbs> [--agent <value>]` inside the worktree before WT-3b.
|