@gobing-ai/spur 0.4.3 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/rules/docs/verdict-confidence.yaml +68 -0
- package/config/rules/quality/coverage-gate.yaml +13 -0
- package/config/rules/recommended-pre-check.yaml +6 -2
- package/config/rules/strict/runtime-boundaries.yaml +3 -0
- package/config/rules/surface/check-cli-surface.yaml +1 -3
- package/config/templates/AGENTS.md +7 -0
- package/config/workflows/feature-verification.yaml +9 -1
- package/config/workflows/task-lifecycle.yaml +50 -0
- package/config/workflows/task-pipeline.yaml +15 -9
- package/package.json +10 -10
- package/plugins/sp/agents/super-reviewer.md +5 -2
- package/plugins/sp/commands/dev-changelog.md +1 -1
- package/plugins/sp/commands/dev-gitmsg.md +6 -2
- package/plugins/sp/commands/dev-handover.md +1 -0
- package/plugins/sp/commands/dev-job-dump.md +2 -1
- package/plugins/sp/commands/dev-refine.md +14 -2
- package/plugins/sp/commands/dev-refineall.md +7 -1
- package/plugins/sp/commands/dev-review.md +1 -0
- package/plugins/sp/lib/history-anatomy.generated.mjs +18 -18
- package/plugins/sp/lib/idea-handoff.generated.mjs +91 -91
- package/plugins/sp/lib/inline-run.generated.mjs +233 -277
- package/plugins/sp/lib/plan-projection.generated.mjs +62 -38
- package/plugins/sp/lib/quality-gate.generated.d.mts +1 -0
- package/plugins/sp/lib/quality-gate.generated.mjs +13793 -13966
- package/plugins/sp/lib/residual-scan.generated.d.mts +13 -0
- package/plugins/sp/lib/residual-scan.generated.mjs +51 -21
- package/plugins/sp/lib/step-profile.generated.mjs +8 -8
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/scripts/batch-plan.mjs +62 -40
- package/plugins/sp/scripts/batch-preflight.mjs +34 -12
- package/plugins/sp/scripts/commit-guard.mjs +6 -6
- package/plugins/sp/scripts/daily-summary/daily-summary.mjs +26 -28
- package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.mjs +11 -11
- package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +4 -4
- package/plugins/sp/scripts/feature-verification-steps.mjs +15 -4
- package/plugins/sp/scripts/feature-verification-steps.ts +29 -1
- package/plugins/sp/scripts/history-anatomy-cache.mjs +19 -19
- package/plugins/sp/scripts/idea-handoff.mjs +2 -2
- package/plugins/sp/scripts/inline-run-dispatch.mjs +2 -2
- package/plugins/sp/scripts/inline-run-setup.mjs +20 -20
- package/plugins/sp/scripts/persist-out-check.mjs +5 -5
- package/plugins/sp/scripts/pr-reviewing.mjs +13 -13
- package/plugins/sp/scripts/quality-gate.mjs +13715 -13884
- package/plugins/sp/scripts/residual-scan.mjs +58 -27
- package/plugins/sp/scripts/residual-scan.ts +8 -8
- package/plugins/sp/scripts/run-summary.mjs +15 -15
- package/plugins/sp/scripts/script-root.mjs +6 -6
- package/plugins/sp/scripts/session-timeline.mjs +16 -16
- package/plugins/sp/scripts/task-diffstat.mjs +8 -8
- package/plugins/sp/scripts/workflow-step-profile.mjs +12 -12
- package/plugins/sp/scripts/wrapup-drift-probe.mjs +9 -9
- package/plugins/sp/scripts/wrapup-steps.mjs +25 -25
- package/plugins/sp/skills/next-router/SKILL.md +3 -1
- package/plugins/sp/skills/next-router/references/routing-table.md +9 -3
- package/plugins/sp/skills/spur-cli/references/tasks.md +24 -4
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +8 -1
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +37 -11
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +6 -3
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +4 -2
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +22 -2
- package/schemas/section-matrix.schema.json +3 -2
- package/spur.js +24403 -32459
- package/web/_astro/{BoardApp.5IIl2O-z.js → BoardApp.Niubpe6z.js} +1 -1
- package/web/_astro/{BoardApp.Drnx-KeM.js → BoardApp.hF0RAIrg.js} +112 -112
- package/web/_astro/TaskDetail.DJpapt38.js +1 -0
- package/web/_astro/{arc.j2EVkYVd.js → arc.BgKcK0i8.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.DZWSFqEG.js → architectureDiagram-3BPJPVTR.ChP-Ig0V.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.DE6GpXCN.js → blockDiagram-GPEHLZMM.BVaCBoeN.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.DoVR1G6B.js → c4Diagram-AAUBKEIU.CHSDpEO5.js} +1 -1
- package/web/_astro/channel.DkpvN2tD.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.Do6-Gbyf.js → chunk-2J33WTMH.MYRcYVRa.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.BYV1HGHx.js → chunk-4BX2VUAB.S5j22Zqa.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.CvI1zkrc.js → chunk-55IACEB6.gciRPvmZ.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.DNGSCRlX.js → chunk-727SXJPM.CdqrSQkX.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.DXhhgT5z.js → chunk-AQP2D5EJ.CyokdHT3.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.dzkRKP2u.js → chunk-FMBD7UC4.Bg9KJhjW.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.DujGLeEf.js → chunk-ND2GUHAM.1gxxI-vD.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.BWtIT3ZU.js → chunk-QZHKN3VN.DDEYtCKU.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.DyApg0Nn.js → classDiagram-4FO5ZUOK.Ch3zi37T.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.DyApg0Nn.js → classDiagram-v2-Q7XG4LA2.Ch3zi37T.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.DJQB-u_l.js → cose-bilkent-S5V4N54A.D2q5AINI.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.bi3D_siV.js → cynefin-OW5HDTMX.BA9kC2YT.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.C-f7TrRg.js → dagre-BM42HDAG.CHO08nRp.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.DrPfjHQB.js → diagram-2AECGRRQ.BfFQt0LW.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.C9S4WUHO.js → diagram-5GNKFQAL.CHMwMTe4.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.Dzzye8QH.js → diagram-KO2AKTUF.BJ-7gK-w.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.DX-LRiof.js → diagram-LMA3HP47.C5xqcc0t.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.Z-kAKwIz.js → diagram-OG6HWLK6.C2pQjfrC.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.D6dyClSv.js → erDiagram-TEJ5UH35._FoNyxgC.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.Cx3q2cxD.js → flowDiagram-I6XJVG4X.B_ENkT2I.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.DU3gH6CT.js → ganttDiagram-6RSMTGT7.B3q8h77C.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.ISmCnJ87.js → gitGraphDiagram-PVQCEYII.QWZFDboZ.js} +1 -1
- package/web/_astro/index.BFyW13JJ.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.DR6_iNOK.js → infoDiagram-5YYISTIA.Cs6eEc92.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.D7wY-ZGA.js → ishikawaDiagram-YF4QCWOH.BU9DJMHA.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.DkP9-WK8.js → journeyDiagram-JHISSGLW.D35k6Jpe.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.wtgY98M2.js → kanban-definition-UN3LZRKU.DBqcAT4m.js} +1 -1
- package/web/_astro/{linear.CI6djNi7.js → linear.D-LSNK8W.js} +1 -1
- package/web/_astro/{mermaid.core.CuQPxS8b.js → mermaid.core.CSruWVOa.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.5HNIEG7R.js → mindmap-definition-RKZ34NQL.BiFaUsfj.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.CchhDFjE.js → pieDiagram-4H26LBE5.D1KTKqb9.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.PYXXJPSJ.js → quadrantDiagram-W4KKPZXB.DBHflsMG.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.cUQuNAKU.js → requirementDiagram-4Y6WPE33.hwX9CNdk.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.BO7MnRIA.js → sankeyDiagram-5OEKKPKP.DkI8mJiE.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.D9bElyD6.js → sequenceDiagram-3UESZ5HK.DMz7jBDx.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.DhGdRz7I.js → stateDiagram-AJRCARHV.B6Ef2xJ1.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.5GvLeAoL.js → stateDiagram-v2-BHNVJYJU.CgoaufB9.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.LtAT9haM.js → timeline-definition-PNZ67QCA.B3c8h1t-.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.DRth1yLA.js → vennDiagram-CIIHVFJN.BdHPAxAb.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.h9MlZfcr.js → wardleyDiagram-YWT4CUSO.BrJXPPAj.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.DHqy9DYA.js → xychartDiagram-2RQKCTM6.CMH5yFsV.js} +1 -1
- package/web/index.html +2 -2
- package/web/spur_logo.svg +1 -1
- package/web/_astro/TaskDetail.Ci4LNn9S.js +0 -1
- package/web/_astro/channel.DmdDxGsq.js +0 -1
- package/web/_astro/index.Do2lLdgo.css +0 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
$schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
|
|
2
|
+
# Verdict-confidence rules (report corpus) — a committed verification record that states
|
|
3
|
+
# a machine `Verdict:` line must also state the verifier's confidence, so a reader can
|
|
4
|
+
# tell a PASS the verifier stands behind from one it would not.
|
|
5
|
+
#
|
|
6
|
+
# Contract owners: `Confidence: HIGH|MEDIUM|LOW` is specified for verify answers by
|
|
7
|
+
# plugins/sp/skills/code-verification/SKILL.md (one `Verdict: PASS|PARTIAL|FAIL` line, one
|
|
8
|
+
# `Confidence:` line, then the traceability tables) and for review reports by
|
|
9
|
+
# plugins/sp/agents/super-reviewer.md. Both are already enforced for pipeline answers —
|
|
10
|
+
# packages/app/src/services/verify-answer-lint.ts (`confidence-missing`,
|
|
11
|
+
# `confidence-value`, and the coherence pair `confidence-unwarranted` /
|
|
12
|
+
# `confidence-understated`) plus the verify stamp in config/workflows/task-pipeline.yaml —
|
|
13
|
+
# but no rule read the standalone report documents agents commit under `docs/`. This file
|
|
14
|
+
# is that backstop: the same three-level vocabulary, checked at the document level.
|
|
15
|
+
#
|
|
16
|
+
# Shape: one file-spanning forbidden match (`multiline: true` hands the evaluator the whole
|
|
17
|
+
# document and the negative lookahead spans the newline) instead of line counting. The
|
|
18
|
+
# lookahead demands a valid level, so a hedge (`Confidence: mostly`) reads as missing too.
|
|
19
|
+
# The verdict prefix requires the closed `PASS|PARTIAL|FAIL` value on its own line, which is
|
|
20
|
+
# what separates a record from prose: docs/reports/i31/0912-workflow-baseline.md:84 and
|
|
21
|
+
# i31/1107-runall-p1-pilot.md:9 both open a bolded *conclusion* sentence
|
|
22
|
+
# ("**Verdict: `partial — INSUFFICIENT_EVIDENCE retained`.**") and are not this contract.
|
|
23
|
+
#
|
|
24
|
+
# Severity `info`, and deliberately not in a preset — the same calibration choice the `docs`
|
|
25
|
+
# category makes for sourced claims: findings surface for review without reddening gates
|
|
26
|
+
# (`recommended-pre-check` runs `--fail-on warning`). To promote it, add `- docs` to that
|
|
27
|
+
# preset's `extends` once the residual is triaged.
|
|
28
|
+
#
|
|
29
|
+
# Calibration (2026-10-13, `spur rule run --file config/rules/docs/verdict-confidence.yaml
|
|
30
|
+
# --json`, unsuppressed): 3 findings over the 91 documents the include globs matched at that
|
|
31
|
+
# timestamp (29 under docs/reports/, 62 under docs/plans/), all three the hole this closes —
|
|
32
|
+
# docs/reports/2026-09-12-i21-verifyall.md:3,
|
|
33
|
+
# docs/reports/2026-10-01-E71-force-verification.md:3 and
|
|
34
|
+
# docs/reports/g61-verifyall-2026-09-12.md:3 each open `Verdict: PASS` and state no
|
|
35
|
+
# confidence level anywhere in the document. They stay visible rather than suppressed:
|
|
36
|
+
# retro-fitting a level into a historical record would invent the verifier's own claim.
|
|
37
|
+
# Both directions were controlled in the same run: a scratch report holding
|
|
38
|
+
# `Verdict: PASS` + `Confidence: HIGH` is not flagged, and the same file with
|
|
39
|
+
# `Confidence: mostly` is.
|
|
40
|
+
#
|
|
41
|
+
# Include is deliberately the report corpus. `docs/plans/*brainstorm*.md` states confidence
|
|
42
|
+
# as prose with its rationale (`**Confidence: HIGH.** All primitives … are verified present`,
|
|
43
|
+
# 61 such lines across 18 plans) — a different, human-facing contract that a
|
|
44
|
+
# level-only vocabulary check would drown in false positives, and those plans carry no
|
|
45
|
+
# machine verdict line to anchor on.
|
|
46
|
+
include:
|
|
47
|
+
- "docs/reports/**/*.md"
|
|
48
|
+
- "docs/plans/**/*.md"
|
|
49
|
+
exclude:
|
|
50
|
+
- "docs/tasks*/**"
|
|
51
|
+
rules:
|
|
52
|
+
- id: verdict-line-confidence-missing
|
|
53
|
+
description: >
|
|
54
|
+
A committed verification record that asserts a machine verdict line
|
|
55
|
+
(`Verdict: PASS|PARTIAL|FAIL`) must follow it with the verifier's confidence level —
|
|
56
|
+
`Confidence: HIGH|MEDIUM|LOW` — so a reader can tell a verdict the verifier stands
|
|
57
|
+
behind from one it would not. Contract in sp-code-verification (verify answers) and
|
|
58
|
+
sp-super-reviewer (review reports); a missing level is a lint failure for pipeline
|
|
59
|
+
answers (`confidence-missing`), and this rule is the backstop for the reports those
|
|
60
|
+
surfaces do not read.
|
|
61
|
+
severity: info
|
|
62
|
+
evaluator:
|
|
63
|
+
type: regex
|
|
64
|
+
config:
|
|
65
|
+
mode: forbid
|
|
66
|
+
multiline: true
|
|
67
|
+
flags: "i"
|
|
68
|
+
pattern: "^[ \\t]*\\**Verdict\\**:\\**[ \\t]*(?:PASS|PARTIAL|FAIL)\\**[ \\t]*\\n(?:[ \\t]*\\n)*(?![ \\t]*\\**Confidence\\**:\\**[ \\t]*\\**(?:HIGH|MEDIUM|LOW)\\**[ \\t]*\\.?[ \\t]*$)"
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
$schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
|
|
2
2
|
# Coverage gate — per-file line coverage meets threshold from Bun's lcov output.
|
|
3
|
+
#
|
|
4
|
+
# PROVENANCE (task 1203): since task 1203 the repository post-check scripts
|
|
5
|
+
# (`test-post-check`, `test-post-check:full`) validate canonical coverage
|
|
6
|
+
# certification BEFORE this rule evaluates: only a completed successful canonical
|
|
7
|
+
# full-suite run (`bun run test`, `test:coverage`, `test:full`) certifies
|
|
8
|
+
# .coverage/lcov.info (marker: .coverage/coverage-certification.json, written by
|
|
9
|
+
# scripts/commands/run-tests.ts --publish-coverage). Missing/pending/superseded/
|
|
10
|
+
# stale-tree/byte-mismatched artifacts fail the post-check with a
|
|
11
|
+
# `coverage-artifact:` diagnostic before per-file findings; recovery is rerunning
|
|
12
|
+
# `bun run test:full`. Running this rule directly via `spur rule run` outside the
|
|
13
|
+
# repository wrapper bypasses that certification wrapper and is outside this
|
|
14
|
+
# repository's certification contract. This rule and its evaluator are unchanged.
|
|
15
|
+
#
|
|
3
16
|
# Absorbed from ts-libs/.spur/rules/quality/coverage-gate.yaml, re-scoped to
|
|
4
17
|
# Spur's monorepo layout:
|
|
5
18
|
# - lcovPath kept at .coverage/lcov.info (Spur's `bun run test:coverage`
|
|
@@ -8,8 +8,12 @@ $schema: "@gobing-ai/spur/schemas/preset.schema.json"
|
|
|
8
8
|
# post-check alongside coverage-gate.
|
|
9
9
|
#
|
|
10
10
|
# TEMPORARY (2026-10-08): `docs` removed from extends to unblock the gate —
|
|
11
|
-
# restore it (add `- docs` back) once
|
|
12
|
-
#
|
|
11
|
+
# restore it (add `- docs` back) once sourcing-claim finding noise is triaged.
|
|
12
|
+
# The category now holds two files and both residuals must be triaged first:
|
|
13
|
+
# `docs/sourced-api-claims.yaml` (advisory citation/level checks on claim lines) and
|
|
14
|
+
# `docs/verdict-confidence.yaml` (a machine `Verdict:` report must state its
|
|
15
|
+
# HIGH/MEDIUM/LOW level; 3 historical reports under docs/reports/ predate the
|
|
16
|
+
# contract). Recapture the raw-json-baseline fixtures in the same change.
|
|
13
17
|
name: recommended-pre-check
|
|
14
18
|
extends:
|
|
15
19
|
- typescript
|
|
@@ -70,6 +70,7 @@ rules:
|
|
|
70
70
|
- "packages/app/src/services/token-ledger-service.ts" # FD byte-window log tailing
|
|
71
71
|
- "packages/app/src/services/token-ledger-watcher.ts" # node:fs watch() live watcher
|
|
72
72
|
- "packages/app/src/services/project-registry.ts" # atomic projects.json persistence
|
|
73
|
+
- "packages/app/src/services/project-process.ts" # port/pid probes moved verbatim out of project-registry.ts to break the registry↔stop import cycle (same exemption)
|
|
73
74
|
- "packages/app/src/services/project-server-owner.ts" # atomic mkdir lifetime claim + unique-marker stale recovery; FileSystem has no exclusive mkdir primitive (1082)
|
|
74
75
|
- "packages/app/src/services/slash-commands-service.ts" # synchronous ~/.config/spur/slash_commands.json persistence (mirrors project-registry.ts)
|
|
75
76
|
- "packages/app/src/services/agent-usage-producer.ts" # atomic agent-usage snapshot write (tmp + rename, mirrors project-registry.ts; task 0892 R1)
|
|
@@ -82,6 +83,7 @@ rules:
|
|
|
82
83
|
- "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
84
|
- "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)
|
|
84
85
|
- "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)
|
|
86
|
+
- "packages/app/src/services/durable-plane-ignore.ts" # .git/info/exclude append moved verbatim out of run-storage.ts to break an import cycle (same exemption)
|
|
85
87
|
|
|
86
88
|
# Electron Node adapters cannot load Bun runtime implementations; keep the
|
|
87
89
|
# synchronous existence/directory probes injected for unit testing (desktop contract).
|
|
@@ -91,6 +93,7 @@ rules:
|
|
|
91
93
|
# Synchronous bootstrap & path resolution:
|
|
92
94
|
- "packages/config/src/bundled-config.ts" # sync bundledConfigRoot() directory walk
|
|
93
95
|
- "packages/config/src/loader.ts" # sync resolveConfigFile() / schema specifier lookup
|
|
96
|
+
- "packages/config/src/config-layers.ts" # sync resolveConfigLayers() existence probes moved verbatim out of loader.ts to break the loader↔executor-update cycle (same exemption)
|
|
94
97
|
- "packages/config/src/executor-update.ts" # atomic single-entry config update (task 0797): O_EXCL lock, fsync'd tmp+rename commit, lstat symlink refusal, mode preservation — ts-runtime FileSystem seam has no lstat/fsync/chmod/O_EXCL
|
|
95
98
|
- "packages/app/src/services/project-start.ts" # sync CLI binary path checks before daemon spawn
|
|
96
99
|
- "apps/cli/src/commands/serve.ts" # sync resolveServeCwd() directory validation before server startup (task 0805 R2); mirrors task.ts sync-template exemption
|
|
@@ -10,9 +10,7 @@ include:
|
|
|
10
10
|
- "apps/cli/src/commands/*.ts"
|
|
11
11
|
|
|
12
12
|
exclude:
|
|
13
|
-
# Not command
|
|
14
|
-
# excludes it too); shared-options.ts is the option registry.
|
|
15
|
-
- "apps/cli/src/commands/stubs.ts"
|
|
13
|
+
# Not a command file: shared-options.ts is the option registry.
|
|
16
14
|
- "apps/cli/src/commands/shared-options.ts"
|
|
17
15
|
|
|
18
16
|
rules:
|
|
@@ -147,6 +147,13 @@ _(Fill from package manifests / README — or during `sp:doc-evolve` customize.)
|
|
|
147
147
|
**Done gate (minimum):** lint + tests clean; only intentional `git status` changes; no
|
|
148
148
|
`--no-verify` / silent suppressions. Harness task done ⇒ real verify **PASS** when the pipeline ran.
|
|
149
149
|
|
|
150
|
+
**Gate scope:** the gate verifies code changes. Scribe commands — `/sp:dev-gitmsg`,
|
|
151
|
+
`/sp:dev-changelog`, `/sp:dev-handover`, `/sp:dev-job-dump` — produce text or a commit and run no
|
|
152
|
+
gate (lint, typecheck, tests) unless asked: `gitmsg --check <cmd>`, or `/sp:dev-gtd --no-push` for
|
|
153
|
+
gate → fix → commit. Commands that own a gate (`dev-run`, `dev-runall`, `dev-fixall`, `dev-gtd`,
|
|
154
|
+
`dev-fixgha`, `dev-unit`, `--check` loops) run exactly what their contract names — no extra
|
|
155
|
+
completion-gate pass on top.
|
|
156
|
+
|
|
150
157
|
---
|
|
151
158
|
|
|
152
159
|
## Spur CLI surface
|
|
@@ -51,6 +51,14 @@ vars:
|
|
|
51
51
|
featureId: "X"
|
|
52
52
|
spurBin: "spur"
|
|
53
53
|
verificationCmd: "bun run spur-check-feature"
|
|
54
|
+
# Operator-declared confidence level; empty derives it from the pass (HIGH when the selected
|
|
55
|
+
# definition's own command exited 0 with an unchanged proof-input digest, MEDIUM under a caller
|
|
56
|
+
# `--cmd` override, LOW otherwise). The completion boundary refuses a PASS carrying no level or
|
|
57
|
+
# LOW unless the receipt records the acknowledgement below.
|
|
58
|
+
confidence: ""
|
|
59
|
+
# Operator acknowledgement of a LOW level. It rides the receipt, so the transition reads it from
|
|
60
|
+
# the evidence rather than from whatever flags a later command happens to pass.
|
|
61
|
+
ackLowConfidence: "false"
|
|
54
62
|
__runId: ""
|
|
55
63
|
|
|
56
64
|
states:
|
|
@@ -70,7 +78,7 @@ states:
|
|
|
70
78
|
- kind: shell
|
|
71
79
|
options:
|
|
72
80
|
command: >-
|
|
73
|
-
mkdir -p .spur/run; eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/feature-verification-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/feature-verification-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; [ -f "$S" ] && "$RUNNER" "$S" verify --feature-id "$featureId" --run-id "$__runId" --spur-bin "$spurBin" || printf 'FAIL feature-verification failed closed — script not found — run superskill install sp --marketplace gobing-ai/spur\n' > ".spur/run/$__runId-feature-verification.status"; exit 0
|
|
81
|
+
mkdir -p .spur/run; eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/feature-verification-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/feature-verification-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; ACK=""; [ "$ackLowConfidence" = "true" ] && ACK="--ack-low-confidence"; [ -f "$S" ] && "$RUNNER" "$S" verify --feature-id "$featureId" --run-id "$__runId" --spur-bin "$spurBin" --confidence "$confidence" $ACK || printf 'FAIL feature-verification failed closed — script not found — run superskill install sp --marketplace gobing-ai/spur\n' > ".spur/run/$__runId-feature-verification.status"; exit 0
|
|
74
82
|
|
|
75
83
|
- id: done
|
|
76
84
|
description: Terminal — repo-wide checks passed and the receipt is bound.
|
|
@@ -64,6 +64,11 @@ states:
|
|
|
64
64
|
Completed. Re-enterable (reopen with warning + mandatory History entry).
|
|
65
65
|
- id: cancelled
|
|
66
66
|
description: Terminal — abandoned.
|
|
67
|
+
- id: deprecated
|
|
68
|
+
description: >
|
|
69
|
+
Retained and frozen (ADR-137). Non-terminal: the record stays readable and
|
|
70
|
+
countable, nothing new may attach to it, and leaving it is explicit —
|
|
71
|
+
un-deprecate to todo, or cancelled once the task is removed.
|
|
67
72
|
|
|
68
73
|
transitions:
|
|
69
74
|
# Forward path: backlog → todo → wip → testing → done
|
|
@@ -157,3 +162,48 @@ transitions:
|
|
|
157
162
|
description: Cancel task
|
|
158
163
|
guard:
|
|
159
164
|
kind: always
|
|
165
|
+
|
|
166
|
+
# Deprecate: any non-terminal-or-done state → deprecated (frozen, retained — ADR-137)
|
|
167
|
+
- from: backlog
|
|
168
|
+
to: deprecated
|
|
169
|
+
description: Deprecate task (frozen, retained)
|
|
170
|
+
guard:
|
|
171
|
+
kind: always
|
|
172
|
+
- from: todo
|
|
173
|
+
to: deprecated
|
|
174
|
+
description: Deprecate task (frozen, retained)
|
|
175
|
+
guard:
|
|
176
|
+
kind: always
|
|
177
|
+
- from: wip
|
|
178
|
+
to: deprecated
|
|
179
|
+
description: Deprecate task (frozen, retained)
|
|
180
|
+
guard:
|
|
181
|
+
kind: always
|
|
182
|
+
- from: testing
|
|
183
|
+
to: deprecated
|
|
184
|
+
description: Deprecate task (frozen, retained)
|
|
185
|
+
guard:
|
|
186
|
+
kind: always
|
|
187
|
+
- from: blocked
|
|
188
|
+
to: deprecated
|
|
189
|
+
description: Deprecate task (frozen, retained)
|
|
190
|
+
guard:
|
|
191
|
+
kind: always
|
|
192
|
+
- from: done
|
|
193
|
+
to: deprecated
|
|
194
|
+
description: Deprecate task (frozen, retained)
|
|
195
|
+
guard:
|
|
196
|
+
kind: always
|
|
197
|
+
|
|
198
|
+
# Exits out of deprecated: un-deprecate or remove only. Any other edge is
|
|
199
|
+
# undeclared and refused by the graph (ADR-135).
|
|
200
|
+
- from: deprecated
|
|
201
|
+
to: todo
|
|
202
|
+
description: Un-deprecate (mandatory History entry)
|
|
203
|
+
guard:
|
|
204
|
+
kind: always
|
|
205
|
+
- from: deprecated
|
|
206
|
+
to: cancelled
|
|
207
|
+
description: Remove deprecated task
|
|
208
|
+
guard:
|
|
209
|
+
kind: always
|
|
@@ -1312,11 +1312,16 @@ transitions:
|
|
|
1312
1312
|
# re-enters quality → review → verify on a fresh digest. Before 1088 a FAIL review had no
|
|
1313
1313
|
# outgoing edge at all; before 1122 a PASS-with-findings cost a full re-certification cycle per
|
|
1314
1314
|
# attempt (knowledge-kit 0210/0213). The reviewer writes `Verdict: PASS|FAIL` in its answer;
|
|
1315
|
-
# both plain and bold forms are accepted.
|
|
1316
|
-
#
|
|
1315
|
+
# both plain and bold forms are accepted. Since 1204 a PASS must also be GRADED: the reviewer
|
|
1316
|
+
# states `Confidence: HIGH|MEDIUM|LOW` (verify-chain semantics, 1068), HIGH/MEDIUM cross the
|
|
1317
|
+
# PASS edges unadorned, and LOW or an absent line needs the operator's `ackLowConfidence` —
|
|
1318
|
+
# otherwise the PASS falls to the catch-all like any other verdict the reviewer would not stand
|
|
1319
|
+
# behind (same policy as the verify confidence gate). Review stays advisory: verify certifies.
|
|
1320
|
+
# Under `profile=auto` the approve gate is skipped, so the PASS+auto edge is tried first and the
|
|
1321
|
+
# interactive PASS edge second.
|
|
1317
1322
|
- from: review
|
|
1318
1323
|
to: verify
|
|
1319
|
-
description: profile=auto, the review certified PASS
|
|
1324
|
+
description: profile=auto, the review certified a HIGH/MEDIUM-confidence PASS (LOW/absent needs ackLowConfidence) with no open P1-P3 finding — skip the human approval gate.
|
|
1320
1325
|
guard:
|
|
1321
1326
|
kind: shell
|
|
1322
1327
|
options:
|
|
@@ -1324,23 +1329,24 @@ transitions:
|
|
|
1324
1329
|
test "$profile" = auto &&
|
|
1325
1330
|
grep -qiE '^[[:space:]]*\**Verdict:\** *PASS' ".spur/run/$__runId-review-answer.txt" &&
|
|
1326
1331
|
eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/residual-scan.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/residual-scan.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)" &&
|
|
1327
|
-
[ -f "$S" ] && "$RUNNER" "$S" review-gate "$wbs" --spur-bin "$spurBin" >&2
|
|
1332
|
+
[ -f "$S" ] && "$RUNNER" "$S" review-gate "$wbs" --spur-bin "$spurBin" --review-answer ".spur/run/$__runId-review-answer.txt" >&2
|
|
1328
1333
|
- from: review
|
|
1329
1334
|
to: approve
|
|
1330
|
-
description: Review certified PASS with no open P1-P3
|
|
1335
|
+
description: Review certified a HIGH/MEDIUM-confidence PASS (LOW/absent needs ackLowConfidence) with no open P1-P3 finding — gate on human approval before verification.
|
|
1331
1336
|
guard:
|
|
1332
1337
|
kind: shell
|
|
1333
1338
|
options:
|
|
1334
1339
|
command: >-
|
|
1335
1340
|
grep -qiE '^[[:space:]]*\**Verdict:\** *PASS' ".spur/run/$__runId-review-answer.txt" &&
|
|
1336
1341
|
eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/residual-scan.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/residual-scan.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)" &&
|
|
1337
|
-
[ -f "$S" ] && "$RUNNER" "$S" review-gate "$wbs" --spur-bin "$spurBin" >&2
|
|
1342
|
+
[ -f "$S" ] && "$RUNNER" "$S" review-gate "$wbs" --spur-bin "$spurBin" --review-answer ".spur/run/$__runId-review-answer.txt" >&2
|
|
1338
1343
|
- from: review
|
|
1339
1344
|
to: review-fail-triage
|
|
1340
1345
|
description: >-
|
|
1341
|
-
No certified PASS without an open P1-P3 finding (FAIL, PARTIAL, missing, unparseable,
|
|
1342
|
-
|
|
1343
|
-
|
|
1346
|
+
No certified PASS without an open P1-P3 finding (FAIL, PARTIAL, missing, unparseable, a
|
|
1347
|
+
PASS whose review-gate check found an open P1-P3 row, or a PASS the reviewer graded below
|
|
1348
|
+
HIGH/MEDIUM — or left ungraded — without the operator's ackLowConfidence; fail closed) —
|
|
1349
|
+
classify the failure and route it into the bounded repair hop instead of dead-ending the run.
|
|
1344
1350
|
guard:
|
|
1345
1351
|
kind: always
|
|
1346
1352
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobing-ai/spur",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.4",
|
|
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,15 +57,15 @@
|
|
|
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.
|
|
68
|
-
"@types/bun": "1.3
|
|
60
|
+
"@gobing-ai/ts-db": "^0.5.28",
|
|
61
|
+
"@gobing-ai/ts-ai-runner": "^0.5.28",
|
|
62
|
+
"@gobing-ai/ts-dual-workflow-engine": "^0.5.28",
|
|
63
|
+
"@gobing-ai/ts-infra": "^0.5.28",
|
|
64
|
+
"@gobing-ai/ts-llm-jsonl-importer": "^0.5.28",
|
|
65
|
+
"@gobing-ai/ts-rule-engine": "^0.5.28",
|
|
66
|
+
"@gobing-ai/ts-runtime": "^0.5.28",
|
|
67
|
+
"@gobing-ai/ts-utils": "^0.5.28",
|
|
68
|
+
"@types/bun": "1.4.3",
|
|
69
69
|
"@types/figlet": "^1.7.0",
|
|
70
70
|
"@types/node-notifier": "8.0.5",
|
|
71
71
|
"commander": "^14.0.3",
|
|
@@ -245,8 +245,11 @@ before it were never asked for a level, so pre-adoption artifacts read as debt,
|
|
|
245
245
|
`residual-scan review-gate` reads the recorded `### Review` body, and a missing, duplicated or
|
|
246
246
|
out-of-enum level becomes a **blocking** `review-contract` item — `review → verify` stops and the run
|
|
247
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
|
|
249
|
-
|
|
248
|
+
checks the recorded section's presence and vocabulary; the same scanner grades the answer passed
|
|
249
|
+
by both PASS edges and refuses a `LOW` (or ungraded) PASS unless the operator sets
|
|
250
|
+
`ackLowConfidence` exactly to `true` (task 1204 — the same policy the verify
|
|
251
|
+
chain enforces), so whether a level is *earned* stays a judgement call (see the earning rule above):
|
|
252
|
+
the report must still argue it.
|
|
250
253
|
|
|
251
254
|
**Source citations for external claims (one claim contract, 2026-10-12).** A Finding cell or a
|
|
252
255
|
Functional Traceability `Evidence` cell that asserts an external API/library claim carries a
|
|
@@ -26,5 +26,5 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
26
26
|
|
|
27
27
|
## Implementation
|
|
28
28
|
|
|
29
|
-
Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#8-changelog) (changelog). This is a docs-only generator: run no quality gates (lint, tests, `spur-check`, rules, citation checks).
|
|
29
|
+
Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#8-changelog) (changelog). This is a docs-only generator: run no quality gates (`bun run gate`, lint, typecheck, tests, `spur-check`, rules, citation checks) — a generic "verify before finishing" rule does not apply here.
|
|
30
30
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Generate conventional commit message(s) from the current change set via one bounded gather call, optionally commit
|
|
3
3
|
role: scribe
|
|
4
|
-
argument-hint: "[--commit] [--squash] [--all] [--scope <path>]"
|
|
4
|
+
argument-hint: "[--commit] [--squash] [--all] [--scope <path>] [--check <cmd>]"
|
|
5
5
|
allowed-tools: ["Bash", "Read"]
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -17,12 +17,13 @@ Implements an inline procedure — see [dev-operations.md](../skills/spur-dev/re
|
|
|
17
17
|
| `--squash` | Collapse every concern into one message and one commit; implies `--commit`. | off |
|
|
18
18
|
| `--all` | Widen the change set past the index to every change in the tree — unstaged **and untracked**. | off |
|
|
19
19
|
| `--scope` `<path>` | Path filter on the change set; always wins over change-set auto-discovery. | the whole change set |
|
|
20
|
+
| `--check` `<cmd>` | Run `<cmd>` (e.g. `"bun run gate"`) once before committing; non-zero → commit nothing. | off |
|
|
20
21
|
|
|
21
22
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
22
23
|
|
|
23
24
|
## Usage
|
|
24
25
|
|
|
25
|
-
/sp:dev-gitmsg [--commit] [--squash] [--all] [--scope <path>]
|
|
26
|
+
/sp:dev-gitmsg [--commit] [--squash] [--all] [--scope <path>] [--check <cmd>]
|
|
26
27
|
|
|
27
28
|
## Implementation
|
|
28
29
|
|
|
@@ -35,3 +36,6 @@ commit per concern, split automatically, so the operator is never asked to re-st
|
|
|
35
36
|
`--squash` → one commit for everything. An empty index widens to the whole tree only on a
|
|
36
37
|
message-only run, and says so; a committing run stops there and prints the exact `--all` re-run line
|
|
37
38
|
instead of guessing.
|
|
39
|
+
No quality gate (`bun run gate`, lint, typecheck, tests, `spur-check`) runs unless `--check <cmd>`
|
|
40
|
+
names one — then it runs once, before any commit, and a failure commits nothing. Gate → auto-fix →
|
|
41
|
+
commit is `/sp:dev-gtd --no-push`.
|
|
@@ -24,4 +24,5 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
24
24
|
## Implementation
|
|
25
25
|
|
|
26
26
|
Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#11-handover) (handover).
|
|
27
|
+
Run no quality gate (`bun run gate`, lint, typecheck, tests, `spur-check`); cite results already on record.
|
|
27
28
|
|
|
@@ -24,6 +24,7 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
24
24
|
## Implementation
|
|
25
25
|
|
|
26
26
|
Follow [job-dump](../skills/spur-dev/references/dev-operations.md#11a-job-dump), using the shared
|
|
27
|
-
handoff template to capture the current job and its remaining work.
|
|
27
|
+
handoff template to capture the current job and its remaining work. Run no quality gate
|
|
28
|
+
(`bun run gate`, lint, typecheck, tests, `spur-check`); copy existing gate results or write `not run`.
|
|
28
29
|
|
|
29
30
|
Skill(skill="sp:spur-dev", args="job-dump $ARGUMENTS")
|
|
@@ -18,6 +18,14 @@ Wraps the **sp:spur-dev** skill. Three jobs:
|
|
|
18
18
|
`standard` checks only that target sections are structurally complete. It never re-checks what
|
|
19
19
|
they say. Use `ready` whenever the existing content itself is in doubt.
|
|
20
20
|
|
|
21
|
+
**Refine never writes `feature_id`.** It may *report* an orphan task in its result, but linking a
|
|
22
|
+
task to a feature is an operator decision with a lifecycle blast radius: `spur task update <wbs>
|
|
23
|
+
--feature <id>` reopens a `verifying` parent unless `--no-reopen` is passed. Route linking through
|
|
24
|
+
the opt-in [feature-link helper](../skills/spur-dev/references/feature-link-helper.md) (never
|
|
25
|
+
gate-time, never automatic, always confirmed) — observed 2026-10-13: the ready-preparation refine
|
|
26
|
+
that `spur task create` dispatches by default linked a fresh task to `P1` on its own and demoted
|
|
27
|
+
that feature `verifying → active`.
|
|
28
|
+
|
|
21
29
|
## Argument Flags
|
|
22
30
|
|
|
23
31
|
| Flag | Description | Default |
|
|
@@ -47,9 +55,13 @@ implement without inventing design:
|
|
|
47
55
|
1. Audit every existing claim against the current tree: facts, cited sources, fix soundness across
|
|
48
56
|
all callers, test observability, environment, concurrent work, and scope.
|
|
49
57
|
2. Correct what is wrong and record each change in a dated `**Refine corrections (<date>)**` block
|
|
50
|
-
in Background.
|
|
58
|
+
in Background. When the task bundles several issues, triage each one. An issue that is invalid,
|
|
59
|
+
already fixed or owned elsewhere is removed together with its R-items, Design/Solution notes,
|
|
60
|
+
Plan steps and ACs. If no issue stays valid, cancel the task (`spur task update <wbs> cancelled`)
|
|
61
|
+
and report `cancelled` instead of promoting it.
|
|
51
62
|
3. Run `spur task check <wbs> --as todo --json`, fill unset priority/estimate, and promote
|
|
52
|
-
`backlog → todo`.
|
|
63
|
+
`backlog → todo`. If triage dropped issues, re-estimate and record old → new. Also record a
|
|
64
|
+
title that still names dropped scope; the CLI cannot rename a task.
|
|
53
65
|
4. Report checklist rows `{id, pass, evidence}`.
|
|
54
66
|
|
|
55
67
|
Refine targets `backlog`/`todo` tasks; a `wip`-or-later task needs explicit operator consent and is
|
|
@@ -54,7 +54,13 @@ not a bug.
|
|
|
54
54
|
**Depth:** default `standard` keeps the cheap L3 SKIP gate under `--auto`. Use
|
|
55
55
|
`--depth ready` when handing a feature to another implementer (frozen Design/Requirements/Plan),
|
|
56
56
|
or when the tasks' existing content is in doubt; thread `--depth` into each per-task refine. Ready
|
|
57
|
-
report rows add corrections count, status before → after, and failed checklist ids.
|
|
57
|
+
report rows add corrections count, dropped issues, status before → after, and failed checklist ids.
|
|
58
|
+
Each task's issues are triaged one by one: invalid ones are dropped with their fixes, and a task
|
|
59
|
+
with no valid issue left is `cancelled`. The ready report also proposes merges between overlapping
|
|
60
|
+
tasks, ordering or a shared step for complementary ones, and owning features for tasks without a
|
|
61
|
+
`feature_id`. It executes neither unless
|
|
62
|
+
`--description` names the task and action, for example
|
|
63
|
+
`--description "cancel 0273 and merge its issues into 0269; link 0260 and 0274 to G11"`.
|
|
58
64
|
|
|
59
65
|
> **`--next` dropped** (feature H8, 2026-07-31). Batch-level chaining was a token bomb — each refine
|
|
60
66
|
> hop is an LLM call, and a large feature means N refine chains fanned out at once. For batch
|
|
@@ -43,6 +43,7 @@ Put the target first: a bare token after `--worktree` is read as the worktree na
|
|
|
43
43
|
- **WBS mode (per task target):** `Skill(skill="sp:functional-review", args="<wbs> $FLAGS")` + `Skill(skill="sp:code-verification", args="review <wbs> $FLAGS")` + `Skill(skill="sp:code-improvement", args="<wbs> $FLAGS")` (functional traceability + SECUA framework + architectural depth — each skill receives its one resolved WBS exactly once plus `$FLAGS` = `$ARGUMENTS` minus the selector (`--tasks`/`--feature`/`--scope` or positional) and its value, never the raw selector, and returns a review fragment only — F92 0593 R1)
|
|
44
44
|
- **Task fan-out (`--tasks` / `--feature`).** One WBS-mode review per task in the frozen set. Tasks in `backlog`/`todo`/`blocked` are reported NOT-STARTED and skipped (§ 3a outcome vocabulary); a per-task failure does not stop the remaining tasks. Each implemented task gets its own merged `## Review`; the run ends with a combined summary table (WBS, verdict, P1/P2 counts).
|
|
45
45
|
- Coordinator = this session. No `sp:super-reviewer` subagent is dispatched: act as the review coordinator defined in [agents/super-reviewer.md](../agents/super-reviewer.md) — merge the fragments per its Output Format (native `P1`–`P4` priority cells, section-relative headings) and, for every task target (standalone or pipeline), write that task's combined `## Review` via `spur task update <wbs> --section Review --from-file`. Path mode emits advisory output only.
|
|
46
|
+
- **Answer contract (pipeline dispatches).** The captured review answer (`.spur/run/<runId>-review-answer.txt`) must carry exactly one `Verdict: PASS|FAIL` line and exactly one `Confidence: HIGH|MEDIUM|LOW` line stating how strongly the review stands behind its verdict — HIGH = the reviewer re-executed the checks behind the verdict, MEDIUM = partial reliance on prior/external evidence, LOW = key evidence not re-executed. The pipeline's PASS edges admit HIGH/MEDIUM unadorned; LOW or an absent line crosses only with the operator's `ackLowConfidence` (same policy as the verify confidence gate, task 1068).
|
|
46
47
|
- **Path mode (per path target):** `Skill(skill="sp:code-verification", args="review <path> $FLAGS")` + `Skill(skill="sp:code-improvement", args="<path> $FLAGS")` (advisory SECUA quality + architectural depth — one normalized path forwarded once plus `$FLAGS`; performs no task mutation). Under `--scope <path>[,<path>]`: paths must exist (exit 2 otherwise), are normalized, duplicates dropped and nested paths collapse to the ancestor (`--scope apps,apps/cli` → `apps`); each surviving path gets a sub-review (Step 3p path scope), eligible for native-subagent dispatch per [dispatch-surface.md](../skills/parallel-execution/references/dispatch-surface.md); the coordinator merges the sub-reviews, runs **one** cross-path architecture pass (`sp:code-improvement` over the inter-path imports), and emits **one** advisory report. No task mutation.
|
|
47
48
|
- **Positional alias (deprecated).** A positional `<wbs|path>` is accepted for one release: a `^\d{4}$` token with a resolvable task behaves as `--tasks <wbs>`; an existing path as `--scope <path>`; otherwise exit 2. Print a deprecation warning naming the replacement selector; removal is a follow-up.
|
|
48
49
|
- `--triage`: after the review returns, run the triage protocol in [dev-operations.md § 2. review](../skills/spur-dev/references/dev-operations.md#2-review) **inline in this session** — the review skills and `sp:super-reviewer` stay report-only. With multiple targets, bucket the findings across all targets once (identical `file:line` findings deduped before bucketing). `Edit`/`Write` in `allowed-tools` exist only for these direct fixes.
|
|
@@ -669,23 +669,23 @@ function diffPorcelain(before, now, expects) {
|
|
|
669
669
|
return [...porcelainPaths(now)].filter((p) => !beforePaths.has(p) && !expects.has(p)).sort();
|
|
670
670
|
}
|
|
671
671
|
export {
|
|
672
|
-
|
|
673
|
-
stampReport,
|
|
674
|
-
semanticArtifactDigest,
|
|
675
|
-
resolvePaths,
|
|
676
|
-
renderProvenanceFrontmatter,
|
|
677
|
-
refreshReport,
|
|
678
|
-
publishAtomically,
|
|
679
|
-
probe,
|
|
680
|
-
porcelainPaths,
|
|
681
|
-
parseProvenance,
|
|
682
|
-
logicDigest,
|
|
683
|
-
importedSnapshotAsOf,
|
|
684
|
-
diffPorcelain,
|
|
685
|
-
decideCache,
|
|
686
|
-
checkReportStructure,
|
|
687
|
-
buildProvenance,
|
|
688
|
-
bannerLine,
|
|
672
|
+
FINDING_FIELDS,
|
|
689
673
|
REPORT_SECTIONS,
|
|
690
|
-
|
|
674
|
+
bannerLine,
|
|
675
|
+
buildProvenance,
|
|
676
|
+
checkReportStructure,
|
|
677
|
+
decideCache,
|
|
678
|
+
diffPorcelain,
|
|
679
|
+
importedSnapshotAsOf,
|
|
680
|
+
logicDigest,
|
|
681
|
+
parseProvenance,
|
|
682
|
+
porcelainPaths,
|
|
683
|
+
probe,
|
|
684
|
+
publishAtomically,
|
|
685
|
+
refreshReport,
|
|
686
|
+
renderProvenanceFrontmatter,
|
|
687
|
+
resolvePaths,
|
|
688
|
+
semanticArtifactDigest,
|
|
689
|
+
stampReport,
|
|
690
|
+
validateSelector
|
|
691
691
|
};
|