@gobing-ai/spur 0.3.95 → 0.3.97
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/plugin-scripts.json +0 -54
- package/config/rules/boundary/sp-script-placement.yaml +19 -0
- package/config/rules/strict/runtime-boundaries.yaml +6 -0
- package/config/rules/structure/test-location.yaml +2 -0
- package/config/rules/typescript/no-syscall-emulation-in-boundary-mock.yaml +1 -1
- package/config/rules/typescript/output-boundaries.yaml +15 -2
- package/config/script-placement-baseline.json +51 -0
- package/config/templates/AGENTS.md +3 -3
- package/config/workflows/feature-verification.yaml +1 -1
- package/config/workflows/history-anatomy.yaml +23 -11
- package/config/workflows/idea-pipeline.yaml +80 -85
- package/config/workflows/pr-review.yaml +18 -9
- package/config/workflows/task-pipeline.yaml +42 -95
- package/config/workflows/wrapup-pipeline.yaml +91 -38
- package/package.json +2 -2
- package/plugins/sp/README.md +14 -10
- package/plugins/sp/agents/super-reviewer.md +43 -18
- package/plugins/sp/commands/dev-fixgha.md +83 -0
- package/plugins/sp/commands/dev-gitmsg.md +8 -6
- package/plugins/sp/commands/dev-gtd.md +2 -2
- package/plugins/sp/commands/dev-idea.md +22 -12
- package/plugins/sp/commands/dev-job-dump.md +29 -0
- package/plugins/sp/commands/dev-job-resume.md +29 -0
- package/plugins/sp/commands/dev-plan.md +8 -9
- package/plugins/sp/commands/dev-review.md +22 -13
- package/plugins/sp/commands/dev-verifyall.md +1 -1
- package/plugins/sp/commands/spur-init.md +2 -2
- package/plugins/sp/lib/history-anatomy.generated.d.mts +112 -0
- package/plugins/sp/lib/history-anatomy.generated.mjs +686 -0
- package/plugins/sp/lib/idea-handoff.generated.mjs +5 -4
- package/plugins/sp/lib/inline-run.generated.d.mts +11 -0
- package/plugins/sp/lib/inline-run.generated.mjs +39 -13
- package/plugins/sp/lib/quality-gate.generated.d.mts +104 -0
- package/plugins/sp/lib/quality-gate.generated.mjs +445 -0
- package/plugins/sp/lib/residual-scan.generated.d.mts +63 -0
- package/plugins/sp/lib/residual-scan.generated.mjs +226 -0
- package/plugins/sp/lib/spur-bin.ts +36 -0
- package/plugins/sp/lib/step-profile.generated.d.mts +71 -0
- package/plugins/sp/lib/step-profile.generated.mjs +174 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/roles.md +3 -3
- package/plugins/sp/scripts/feature-verification-steps.mjs +14 -1
- package/plugins/sp/scripts/feature-verification-steps.ts +14 -1
- package/plugins/sp/scripts/history-anatomy-cache.mjs +20 -19
- package/plugins/sp/scripts/history-anatomy-cache.ts +23 -928
- package/plugins/sp/scripts/inline-run-setup.mjs +85 -320
- package/plugins/sp/scripts/inline-run-setup.ts +104 -667
- package/plugins/sp/scripts/quality-gate.mjs +46 -24
- package/plugins/sp/scripts/quality-gate.ts +13 -659
- package/plugins/sp/scripts/residual-scan.mjs +179 -174
- package/plugins/sp/scripts/residual-scan.ts +125 -517
- package/plugins/sp/scripts/script-root.mjs +5 -1
- package/plugins/sp/scripts/script-root.ts +5 -1
- package/plugins/sp/scripts/workflow-step-profile.mjs +25 -17
- package/plugins/sp/scripts/workflow-step-profile.ts +21 -315
- package/plugins/sp/scripts/wrapup-drift-probe.mjs +8 -2
- package/plugins/sp/scripts/wrapup-drift-probe.ts +3 -2
- package/plugins/sp/scripts/wrapup-steps.mjs +72 -33
- package/plugins/sp/scripts/wrapup-steps.ts +128 -37
- package/plugins/sp/skills/code-improvement/SKILL.md +5 -4
- package/plugins/sp/skills/code-verification/SKILL.md +34 -9
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +3 -3
- package/plugins/sp/skills/functional-review/SKILL.md +7 -4
- package/plugins/sp/skills/functional-review/references/verdict-schema.md +1 -1
- package/plugins/sp/skills/history-anatomy/references/modes.md +2 -1
- package/plugins/sp/skills/next-feature/references/handoff-routing.md +1 -1
- package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
- package/plugins/sp/skills/source-driven-development/SKILL.md +11 -0
- package/plugins/sp/skills/spur-cli/SKILL.md +3 -3
- package/plugins/sp/skills/spur-cli/references/agent.md +10 -10
- package/plugins/sp/skills/spur-cli/references/features.md +17 -6
- package/plugins/sp/skills/spur-cli/references/init.md +17 -16
- package/plugins/sp/skills/spur-cli/references/self.md +3 -2
- package/plugins/sp/skills/spur-cli/references/serve.md +10 -10
- package/plugins/sp/skills/spur-cli/references/tasks/section-editing.md +9 -5
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +21 -6
- package/plugins/sp/skills/spur-cli/references/tasks.md +14 -8
- package/plugins/sp/skills/spur-cli/references/workflows.md +17 -14
- package/plugins/sp/skills/spur-dev/SKILL.md +2 -0
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +4 -3
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +14 -10
- package/plugins/sp/skills/spur-dev/references/decision-brief.md +1 -1
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +165 -75
- package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +7 -5
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +84 -39
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +8 -12
- package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +3 -3
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +40 -21
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +19 -19
- package/plugins/sp/skills/spur-dev/references/idea-evaluation.md +4 -3
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +72 -15
- package/plugins/sp/skills/spur-doctor/SKILL.md +1 -1
- package/plugins/sp/skills/sys-architecture/SKILL.md +3 -2
- package/spur.js +4461 -2085
- package/web/_astro/{BoardApp.Cpxntzad.js → BoardApp.Bmv5WkJ9.js} +1 -1
- package/web/_astro/BoardApp.vveLOdDq.js +322 -0
- package/web/_astro/{TaskDetail.C5bW4WGV.js → TaskDetail.IKc3uDYV.js} +1 -1
- package/web/_astro/{arc.CyjRvNMY.js → arc.C63Ufg35.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.B4lWRzJA.js → architectureDiagram-3BPJPVTR.CP8Hyldk.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.Be38USQ2.js → blockDiagram-GPEHLZMM.Bo_48MRA.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.DT9Fj5Qx.js → c4Diagram-AAUBKEIU.Ch61sw-O.js} +1 -1
- package/web/_astro/channel.BKCmJpWM.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.SeSBWLg5.js → chunk-2J33WTMH.CHpzS7xf.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.DoO4VE14.js → chunk-4BX2VUAB.DzMNNWIw.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.DrmTFA53.js → chunk-55IACEB6.BqPrDw_Q.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.Bi-TUb_V.js → chunk-727SXJPM.ZzBHhNw-.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.B-xp8Uhi.js → chunk-AQP2D5EJ.1_O_LLkx.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.DGWrDnUU.js → chunk-FMBD7UC4.GS4UHg7_.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM._BagvPDy.js → chunk-ND2GUHAM.BnqotN4g.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.VOboYWQ0.js → chunk-QZHKN3VN.Ghuh8zoJ.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.D_apfHS7.js → classDiagram-4FO5ZUOK.BW9vC3zg.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.D_apfHS7.js → classDiagram-v2-Q7XG4LA2.BW9vC3zg.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.DNLU_L-x.js → cose-bilkent-S5V4N54A.D6jNC0ti.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.D8borhV-.js → cynefin-OW5HDTMX.BOGoCs4L.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.Uc0lvjcV.js → dagre-BM42HDAG.8iU5VcWi.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.DDIxtDBo.js → diagram-2AECGRRQ.CVt88HwH.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.DVoDnD3H.js → diagram-5GNKFQAL.C9HxUUMl.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.CRubTJ-0.js → diagram-KO2AKTUF.4ywkQN3t.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.m9SeYcXQ.js → diagram-LMA3HP47.C48A6gpz.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.C6s2ZjV5.js → diagram-OG6HWLK6.DxFieQW4.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.nSzr5KTj.js → erDiagram-TEJ5UH35.CtjtQqYs.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.DrZcys16.js → flowDiagram-I6XJVG4X.C5zAiahU.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.Do4M1b-K.js → ganttDiagram-6RSMTGT7.D_L6zsny.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.BWc9oJ4l.js → gitGraphDiagram-PVQCEYII.Ignnrk3V.js} +1 -1
- package/web/_astro/index.CbNz17Sx.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.BIdOctFk.js → infoDiagram-5YYISTIA.DLv8-P5u.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.CV5SuG2t.js → ishikawaDiagram-YF4QCWOH.p0OTpwFO.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.CxE-rEJ-.js → journeyDiagram-JHISSGLW.CIaBt-DD.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.BPRdKWs_.js → kanban-definition-UN3LZRKU.DGySIntq.js} +1 -1
- package/web/_astro/{linear.zRsuuDTE.js → linear.BATV4RXu.js} +1 -1
- package/web/_astro/{mermaid.core.jAJTcMKc.js → mermaid.core.DzkwM3VX.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.BffJxfCr.js → mindmap-definition-RKZ34NQL.3piBRRzA.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.CacwWaE3.js → pieDiagram-4H26LBE5.DUNueLub.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.hXELD06-.js → quadrantDiagram-W4KKPZXB.9bihVbrt.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.DdEbPcqT.js → requirementDiagram-4Y6WPE33.CkjsC-YT.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.DgaDocKv.js → sankeyDiagram-5OEKKPKP.Dbq4vaoQ.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.B0KScnAu.js → sequenceDiagram-3UESZ5HK.BivrH99P.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.CV9M_WNc.js → stateDiagram-AJRCARHV.CqLQ1Vzz.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.BOAo74Et.js → stateDiagram-v2-BHNVJYJU.DvvoLD3b.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.CqqepUMe.js → timeline-definition-PNZ67QCA.B-KR78gv.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.DDqe4dOG.js → vennDiagram-CIIHVFJN.Ck0Eieb5.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.B3R9OPdO.js → wardleyDiagram-YWT4CUSO.CRfdd_do.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.B3SvgXpQ.js → xychartDiagram-2RQKCTM6.Ck_Jxk9C.js} +1 -1
- package/web/index.html +2 -2
- package/plugins/sp/lib/artifact-digest.generated.d.mts +0 -7
- package/plugins/sp/lib/artifact-digest.generated.mjs +0 -48
- package/plugins/sp/scripts/feature-sync-bounded.mjs +0 -301
- package/plugins/sp/scripts/feature-sync-bounded.ts +0 -481
- package/plugins/sp/scripts/idea-coverage-check.ts +0 -168
- package/plugins/sp/scripts/inline-pipeline-parity-check.ts +0 -298
- package/plugins/sp/scripts/record-feature-sync.mjs +0 -63
- package/plugins/sp/scripts/record-feature-sync.ts +0 -84
- package/plugins/sp/scripts/script-contract-check.ts +0 -506
- package/plugins/sp/scripts/stage-registry-adapter.ts +0 -1533
- package/plugins/sp/scripts/surface-drift-inventory.ts +0 -989
- package/plugins/sp/scripts/task-evidence-precheck.ts +0 -189
- package/plugins/sp/scripts/task-size-precheck.ts +0 -212
- package/plugins/sp/scripts/transition-shim-check.ts +0 -238
- package/plugins/sp/scripts/validate-commands.ts +0 -689
- package/plugins/sp/scripts/validate-flag-contracts.ts +0 -890
- package/plugins/sp/scripts/verify-answer-lint.ts +0 -549
- package/web/_astro/BoardApp.BxJuwD7I.js +0 -191
- package/web/_astro/channel.CI6N_tCg.js +0 -1
- package/web/_astro/index.CENnIEqT.css +0 -1
|
@@ -64,6 +64,10 @@ function normalizeArgs(raw: Args): Args {
|
|
|
64
64
|
|
|
65
65
|
- If `--feature FOO` is present and `--tasks` is absent, treat the effective selector as `feature:FOO`.
|
|
66
66
|
- If both are present, `--tasks` wins (with a one-line note in the batch report).
|
|
67
|
+
- **Per-command admission filters (I33 1023).** Step 1 is the shared baseline; commands may layer
|
|
68
|
+
stricter grammar on top — e.g. `/sp:dev-review` rejects `ready`/status pseudo-lists and the mixed
|
|
69
|
+
`--tasks` + `--feature` combination (exit 2), and accepts multi-id `--feature <id>,<id>` as
|
|
70
|
+
caller-level sugar expanded by the command layer before the resolver.
|
|
67
71
|
|
|
68
72
|
**Feature-derived strict preflight (R2, task 0510).** After normalization, if the **effective
|
|
69
73
|
selector** is `feature:<id>` (whether via `--tasks feature:<id>` or the `--feature <id>` sugar),
|
|
@@ -291,8 +295,8 @@ Each pipeline run ends in one of two terminal states:
|
|
|
291
295
|
`.spur/run/<wbs>-verify-answer.txt` AC table is exactly four columns:
|
|
292
296
|
`| AC | Status | Evidence Type | Evidence |`. The evidence-type token
|
|
293
297
|
(`test`, `command`, `static-ref`, `manual-review`, `llm-judge`, `n/a`, or a `+`
|
|
294
|
-
compound) is isolated in cell 3. A token merged into the evidence cell fails
|
|
295
|
-
`
|
|
298
|
+
compound) is isolated in cell 3. A token merged into the evidence cell fails the
|
|
299
|
+
`spur task verdict` answer lint.
|
|
296
300
|
|
|
297
301
|
**Driver acceptance (0930 R3).** The trace row and `.spur/run/<wbs>-verdict.json` are accepted as
|
|
298
302
|
terminal evidence only if BOTH hold:
|
|
@@ -328,40 +332,35 @@ node "$(superskill script path sp batch-preflight.mjs)" --wbs <wbs> --status <st
|
|
|
328
332
|
Helper: `recoveryHint(status, wbs)` in `plugins/sp/scripts/batch-preflight.ts`. Tables remain SSOT
|
|
329
333
|
in next-router; this only maps status → primary TABLE A hop for recovery.
|
|
330
334
|
|
|
331
|
-
### 3.3c
|
|
335
|
+
### 3.3c Feature-sync retry suppression (task 0411; 1004 R3 moved it into the sync service)
|
|
332
336
|
|
|
333
337
|
During a batch, the per-task `record` step and the wrap-up `feature-transition` step each invoke
|
|
334
338
|
feature status sync. When a feature is L4-gate-blocked (e.g. not all linked tasks are `done`), the
|
|
335
339
|
identical blocked proposal repeats on every call with no intervening input change — in the H9
|
|
336
|
-
dogfood, 4 redundant sync calls produced the same blocked result. The
|
|
337
|
-
|
|
340
|
+
dogfood, 4 redundant sync calls produced the same blocked result. The service fixes this, not the
|
|
341
|
+
engine.
|
|
338
342
|
|
|
339
343
|
Both `task-pipeline.yaml` (`record` step) and `wrapup-pipeline.yaml` (`feature-transition` step)
|
|
340
|
-
invoke
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
`applied: true` while still gate-blocked), then `applied`, then `no-op`.
|
|
352
|
-
3. On a **blocked** result, persists `.spur/run/feature-sync-blocked-<id>.json` and, on the next
|
|
353
|
-
call with an **identical fingerprint**, suppresses the redundant sync and replays the prior
|
|
354
|
-
blocked result.
|
|
355
|
-
4. On **applied** or **no-op** results, passes through unchanged (no suppression).
|
|
356
|
-
5. When the fingerprint **changes** (a task completed, a verdict file updated), suppression is
|
|
344
|
+
invoke `spur feature sync <feature-id> --json` directly — retry suppression lives inside the
|
|
345
|
+
`FeatureService.syncFeature` implementation:
|
|
346
|
+
|
|
347
|
+
1. On a **blocked** result (`gateBlocked` checked first — a partial hop can have `applied: true`
|
|
348
|
+
while still gate-blocked — then an unapplied from≠to deferral), the service persists
|
|
349
|
+
`.spur/run/feature-sync-blocked-<id>.json` keyed by an input fingerprint (feature file content
|
|
350
|
+
hash, linked task statuses, verdict artifact mtimes).
|
|
351
|
+
2. On the next call with an **identical fingerprint**, the service suppresses the redundant sync
|
|
352
|
+
and replays the prior blocked result (`suppressed: true`) without re-deriving hops.
|
|
353
|
+
3. On **applied** or **no-op** results, the state file is cleared (no suppression).
|
|
354
|
+
4. When the fingerprint **changes** (a task completed, a verdict file updated), suppression is
|
|
357
355
|
invalidated and a fresh sync runs.
|
|
356
|
+
5. `--force` (and an explicit confirm re-attempt) bypass the replay and re-derive live; dry-run
|
|
357
|
+
never reads or writes the state.
|
|
358
358
|
|
|
359
|
-
**Batch driver contract:** the orchestrator does **nothing extra** — the
|
|
360
|
-
pipeline's `record` step and the wrap-up's `feature-transition` step. The driver still
|
|
361
|
-
`task-pipeline.yaml` verbatim (R4.1). Suppression is transparent: the
|
|
362
|
-
`FeatureSyncResult` JSON shape
|
|
363
|
-
The only observable difference is fewer redundant `feature sync`
|
|
364
|
-
`feature-sync-bounded:` annotation on stderr when a duplicate is suppressed.
|
|
359
|
+
**Batch driver contract:** the orchestrator does **nothing extra** — the suppression lives inside
|
|
360
|
+
the pipeline's `record` step and the wrap-up's `feature-transition` step. The driver still
|
|
361
|
+
launches `task-pipeline.yaml` verbatim (R4.1). Suppression is transparent: the sync emits the same
|
|
362
|
+
`FeatureSyncResult` JSON shape (`suppressed: true` added on replay), so downstream report logic is
|
|
363
|
+
unchanged. The only observable difference is fewer redundant `feature sync` derivations.
|
|
365
364
|
|
|
366
365
|
### 3.4 Metadata-only host controller (R5, task 0510)
|
|
367
366
|
|
|
@@ -491,12 +490,12 @@ disk-full, missing directory) routes to **WT-5** — the worktree and branch are
|
|
|
491
490
|
batch can never destroy its own evidence. Reuse mode retains its operator-owned tree but still
|
|
492
491
|
persists the Step 5 report under the invoking tree; the reused tree's `.spur/run/` remains the live
|
|
493
492
|
copy while that tree lives on. The per-run provenance — the worktree DB's run/action rows and the
|
|
494
|
-
`.spur/
|
|
493
|
+
`.spur/memory/runs/<runId>.md` + `.state.json` records — is persisted mechanically by WT-4a's
|
|
495
494
|
`inline-run-setup.ts --persist-out --from <worktree> [--task-file <merged-task>]...` call,
|
|
496
495
|
not by hand.
|
|
497
496
|
|
|
498
497
|
**Stage records are worktree-local too (0948 R9, E7 Finding 5; persisted by 0975 R1).** Each task's
|
|
499
|
-
own per-stage run record (`.spur/
|
|
498
|
+
own per-stage run record (`.spur/memory/runs/<runId>.md` + `.state.json`) and the worktree DB's run rows are
|
|
500
499
|
written inside the worktree and **are removed with it** in create mode — the E7 batch lost exactly
|
|
501
500
|
this evidence. Copying them out is no longer a manual audit-time duty: WT-4a (create-mode block
|
|
502
501
|
below) runs `inline-run-setup.ts --persist-out --from "$WT_PATH"` **before** WT-4b holder cleanup,
|
|
@@ -513,11 +512,26 @@ obligation; neither do root-qualified paths (`knowledge-kit/.spur/run/…`, `/ab
|
|
|
513
512
|
which cite another project's evidence — cite foreign run artifacts that way, never bare. A citation missing in BOTH trees, a divergent cited file (never overwritten — reconcile
|
|
514
513
|
by hand), an unreadable task file, or more than 64 distinct cited files fails the pass → WT-5.
|
|
515
514
|
|
|
515
|
+
**Durable planes ride it too (E71).** Persist-out copies canonical task verdicts, feature run/latest receipts, nested run artifacts and owned sessions before teardown. Artifact and task-run-link rows are exported with run rows, and stored path references are redirected to the invoking tree. Conflicting or unreadable retained evidence refuses teardown.
|
|
516
|
+
|
|
517
|
+
**Owned evidence rides it too (1012).** With at least one `--task-file`, persist-out also treats as
|
|
518
|
+
copy obligations the worktree's `.spur/run/` direct children named `<wbs>-…` (the WBS is each
|
|
519
|
+
forwarded task file's leading four digits before `_`) or `<runId>-…` (every run row in the worktree
|
|
520
|
+
DB, whichever task it ran) — `<wbs>-verdict.json`, check receipts, route reasons — whether or not
|
|
521
|
+
the task file cites them. They join the cited set: same copy / byte-identical no-op /
|
|
522
|
+
divergent-refuse handling. The 64-file cap bounds citations alone; owned names are bounded per
|
|
523
|
+
owner (each `<wbs>-` / `<runId>-` prefix gets its own 64-file budget, task 1034), so the bound
|
|
524
|
+
scales with the batch and one runaway owner refuses by name before any write. `<runId>.md` /
|
|
525
|
+
`<runId>.state.json` stay with the record copy (a conflict is reported and the delegate refuses teardown). Files
|
|
526
|
+
matching neither a citation nor an ownership prefix are left behind. An absent worktree `.spur/run/`
|
|
527
|
+
means nothing is owned; any other listing failure (not a directory, permission denied) fails the
|
|
528
|
+
pass before the invoking tree is written → WT-5. Without `--task-file` nothing is enumerated.
|
|
529
|
+
|
|
516
530
|
The shapes are pinned (task 0975 R1; `record-missing` and citation behavior per 0984): idempotent on re-persist;
|
|
517
531
|
success exits 0 printing
|
|
518
532
|
`{"ok":true,"persisted":<n>,"skipped":[{"id":<run-id>,"reason":"id-exists"|"external-key-conflict"|"record-conflict:<file>"|"record-missing:<file>"|"cited-directory:<name>"|"cited-symlink:<name>"|"cited-non-file:<name>"}]}`
|
|
519
|
-
— an `
|
|
520
|
-
`record-conflict:<file>`
|
|
533
|
+
— an `external-key-conflict` skip leaves the target run unchanged; an `id-exists` replay repairs missing owned artifacts and task links without duplicating them. A
|
|
534
|
+
`record-conflict:<file>` never overwrites a divergent invoking-tree record and causes the delegate to exit 1, retaining the worktree. A
|
|
521
535
|
`record-missing:<file>` skip is a known `task-lifecycle`/`feature-lifecycle` row with no record file
|
|
522
536
|
at all (its inserted DB row still counts in `persisted` — 0984 R5). Any failure
|
|
523
537
|
exits 1 printing `{"ok":false,"error":<message>}` (a worktree DB run id that is not a single safe
|
|
@@ -544,6 +558,15 @@ The wrap receives only what it would accept:
|
|
|
544
558
|
3. When the done subset is **empty**, skip the wrap entirely with the reason (e.g. `batch wrap
|
|
545
559
|
skipped: no done tasks`) instead of invoking wrapup-pipeline on an empty set.
|
|
546
560
|
|
|
561
|
+
**Repo-wide tripwire (1037).** After the doc-sync exits converge, the pipeline's `doc-tripwire` hop
|
|
562
|
+
runs the TRUSTED CONFIG ONLY `docTripwireCmd` over the still-uncommitted wrap diff before
|
|
563
|
+
metrics-record. The default probes `package.json` for a `test-repo-wide` script and runs
|
|
564
|
+
`bun run test-repo-wide` only when it is declared (a no-op in other projects), so the batch driver
|
|
565
|
+
passes no extra vars. Batch callers override it like any wrap var (`docTripwireCmd` in `--vars`);
|
|
566
|
+
an empty string disables the check while still recording PASS. A FAIL routes the wrap to `failed`
|
|
567
|
+
with already-written learnings/docs preserved — fix the flagged working-diff violation and re-run
|
|
568
|
+
the wrap.
|
|
569
|
+
|
|
547
570
|
Filtering lives here, in the batch driver — no change to wrapup-pipeline.yaml or wrapup-steps.ts;
|
|
548
571
|
the wrap's refusal of non-done tasks remains the hard invariant.
|
|
549
572
|
|
|
@@ -582,11 +605,14 @@ non-PASS verify verdict, or a HITL pause that ends the run take the WT-5 retenti
|
|
|
582
605
|
full pipeline is eligible — `--worktree --mode implement` is rejected (WT-7), because that mode is
|
|
583
606
|
the pipeline's implement stage and already runs in the driver's tree.
|
|
584
607
|
|
|
585
|
-
**Review triage `dev-review` (run of one).** `/sp:dev-review <
|
|
608
|
+
**Review triage `dev-review` (run of one).** `/sp:dev-review [--tasks <selector> | --feature <id>[,<id>] | --scope <path>[,<path>]] --triage --worktree [<name>]`
|
|
586
609
|
runs this lifecycle around one review-plus-triage pass: WT-1…WT-6 apply unchanged, the marker's
|
|
587
|
-
`command` is `dev-review` and its `selector`
|
|
588
|
-
|
|
589
|
-
|
|
610
|
+
`command` is `dev-review` and its `selector` records the full normalized target list, and the slug
|
|
611
|
+
is `sp/review-<first>-and-<N>-<short-id>` for a multi-target run (N = target count) or
|
|
612
|
+
`sp/review-<slug>-<short-id>` for a single target (the WBS or the path's basename). It skips
|
|
613
|
+
`quickReadiness` (there is no task set; admission is "every target resolves" — each WBS/path must
|
|
614
|
+
resolve before the tree is cut). Under `--triage` the findings are bucketed across all targets once
|
|
615
|
+
(identical `file:line` findings deduped). WT-4 success reads as "every direct fix passed its check and the
|
|
590
616
|
project gate is green"; anything else takes WT-5. Contract: [dev-operations.md § 2. review](dev-operations.md#2-review).
|
|
591
617
|
|
|
592
618
|
One flag, two modes (see the glossary entry for the ownership rule). Bare `--worktree` is **create
|
|
@@ -843,7 +869,7 @@ git merge --ff-only "$BRANCH" # FF-only: never rebase, merge-commit, or
|
|
|
843
869
|
# Any persistence failure routes to WT-5 — the worktree and branch are retained.
|
|
844
870
|
WT_PATH="$(cd "../<worktree-dir>" && pwd)" # hoisted: needed by WT-4a AND WT-4b below
|
|
845
871
|
# WT-4a provenance persist-out (task 0975 R1): copy the worktree DB's run rows plus
|
|
846
|
-
# the .spur/
|
|
872
|
+
# the .spur/memory/runs/<runId>.md + .state.json records into THIS tree. Run from the main
|
|
847
873
|
# tree (cwd = the invoking tree). --task-file (0984 R2) forwards each merged task
|
|
848
874
|
# file (post-merge path) so the cited .spur/run/<file> evidence is copied/verified
|
|
849
875
|
# too. Resolve the merged path(s) BEFORE this block — an empty value exits 2:
|
|
@@ -979,6 +1005,25 @@ Resume, merge, or discard:
|
|
|
979
1005
|
discard: git worktree remove <worktree-path> && git branch -D <branch> && spur projects remove <worktree-path>
|
|
980
1006
|
```
|
|
981
1007
|
|
|
1008
|
+
When the halt cause is `non-FF base ref`, the report replaces the one-line `merge:` hint with this
|
|
1009
|
+
ordered divergence recipe, run by the operator — the driver never merges, rebases, or resolves
|
|
1010
|
+
conflicts itself. Other halt causes (task failure, HITL pause) keep the hint as printed:
|
|
1011
|
+
|
|
1012
|
+
```
|
|
1013
|
+
# 1. integrate as a merge commit — never a rebase; task evidence cites the branch's commit SHAs
|
|
1014
|
+
git checkout <base-ref> && git merge --no-ff --no-commit <branch>
|
|
1015
|
+
# 2. resolve source conflicts by hand; generated files are then regenerated with the project's
|
|
1016
|
+
# generator, never hand-merged
|
|
1017
|
+
# (this repo: bun run build:plugin-lib && bun run --filter @gobing-ai/spur build:bundle)
|
|
1018
|
+
# 3. stage every resolved path and regenerated bundle (git add …) — an unmerged or
|
|
1019
|
+
# unstaged path makes step 5 abort
|
|
1020
|
+
# 4. run qualityGateCmd once, after ALL conflicts are resolved
|
|
1021
|
+
# 5. commit the merge with the prepared message file
|
|
1022
|
+
git commit -F <message-file>
|
|
1023
|
+
# 6. persist evidence out (WT-4a), then WT-4b/4c cleanup, and set the marker to merged
|
|
1024
|
+
inline-run-setup --persist-out --from <worktree> --task-file …
|
|
1025
|
+
```
|
|
1026
|
+
|
|
982
1027
|
The report reuses the [`--next` chain contract](flag-glossary.md#--next-chain-contract) halt-report
|
|
983
1028
|
shape (halt cause + where + why), not new vocabulary. Retention is the right default: these batches
|
|
984
1029
|
are long and already resumable via `--continue`; auto-deleting is data loss, auto-merging is a
|
|
@@ -1156,11 +1201,11 @@ per-task with `/sp:dev-run <wbs> --worktree <branch>`.
|
|
|
1156
1201
|
### Generated regions — defer the sync, regenerate once (R5)
|
|
1157
1202
|
|
|
1158
1203
|
The only per-task writer of feature files is the `record` step's post-record feature sync
|
|
1159
|
-
(`task-pipeline.yaml
|
|
1204
|
+
(`task-pipeline.yaml`). Parallel launches set
|
|
1160
1205
|
the pipeline var `deferFeatureSync: "true"` (default `"false"`): the record step appends
|
|
1161
1206
|
`feature sync deferred to batch integration` to the task report and skips the sync, so task
|
|
1162
1207
|
branches never touch feature files or `docs/features/INDEX.md`. After the last integration, on the
|
|
1163
|
-
base ref, the orchestrator runs
|
|
1208
|
+
base ref, the orchestrator runs `spur feature sync <f> --json` (service-level suppression) plus `spur feature refresh --feature <f>`
|
|
1164
1209
|
once per touched feature and commits the result as one `chore(corpus)` commit. Sequential and
|
|
1165
1210
|
inline runs keep the default `"false"` and are unchanged. Any rebase conflict — on a generated
|
|
1166
1211
|
path or any other — is an R4 `integration-conflict`; there is no path-based exception.
|
|
@@ -47,7 +47,7 @@ one thing and yields, so the **pipeline (not the agent) owns the loop**.
|
|
|
47
47
|
| ------- | ----------- | ------------ |
|
|
48
48
|
| `implement` | `/sp:dev-run --mode implement <wbs>` — write the code that satisfies the task; author `## Solution`. | [dev-operations.md §4 run](dev-operations.md) → `sp:code-implementation` |
|
|
49
49
|
| `test` → (`test-fix` ↔ `test-recheck`) → `review` \| `failed` | **Project quality gate** (not `/sp:dev-unit`). Soft shell probe of `${vars.qualityGateCmd}` (default `bun run spur-check`) — green path pays **one** full gate run. On FAIL: bounded `/sp:dev-fixall` loop (`qualityGateMaxFixAttempts`, default 2) with soft recheck; exhausted attempts route to pipeline `failed`. `/sp:dev-unit` remains **coverage gap-fill** (router C3/C5 / standalone). | [dev-operations.md §10 fixall](dev-operations.md); unit op still §1 |
|
|
50
|
-
| `review` | `/sp:dev-review <wbs>` — SECUA-framework review of the diff. | [dev-operations.md §2 review](dev-operations.md) |
|
|
50
|
+
| `review` | `/sp:dev-review --tasks <wbs>` — SECUA-framework review of the diff. | [dev-operations.md §2 review](dev-operations.md) |
|
|
51
51
|
| `verify` | `sp:code-verification` — requirements traceability + verdict. | [dev-operations.md §3 verify](dev-operations.md) |
|
|
52
52
|
|
|
53
53
|
Interactive omit/`inline` executes these model stages through the
|
|
@@ -96,10 +96,7 @@ cache-conservation discipline (`plugins/sp/skills/dogfood-testing/references/mon
|
|
|
96
96
|
|
|
97
97
|
## Step 2: Pipeline run
|
|
98
98
|
|
|
99
|
-
> **Pre-launch size-gate pre-check (R1 / 0478).** Before launching `spur workflow run task-pipeline.yaml`,
|
|
100
|
-
>
|
|
101
|
-
> - Without `--auto`: warn the operator before calling `spur workflow run` and prompt for confirmation or a plan-item override via `--vars '{"maxImplementPlanItems":"<count>"}'`.
|
|
102
|
-
> - With `--auto`: automatically append `"maxImplementPlanItems": "<count>"` to `--vars` and log a single-line notice (e.g. `Notice: task <wbs> has N plan items (>8 default cap); injecting maxImplementPlanItems override`).
|
|
99
|
+
> **Pre-launch size-gate pre-check (R1 / 0478; task 1002).** Before launching `spur workflow run task-pipeline.yaml`, run `spur task check <wbs> --precheck --json` — the same command the pipeline's precheck guard runs. It fails with a `precheck-size` finding above 10 requirements or 16 Plan items. The limits are fixed (no `--vars` override): on a failure, split the task instead of launching.
|
|
103
100
|
|
|
104
101
|
**`--worktree [<name>]` wraps Step 2, on either surface.** When `/sp:dev-run --mode full` carries
|
|
105
102
|
[`--worktree`](flag-glossary.md#flag-worktree), create or adopt the worktree *before* launching the
|
|
@@ -138,7 +135,7 @@ spur workflow trace "$RUN" --follow --output # streams the run; --output shows
|
|
|
138
135
|
burned ~110 min in 47 sleeps and 55 trace polls waiting on one run; ADR-047 mandates pipe-free
|
|
139
136
|
observation). `--follow` is a blocking human-streaming mode (no `--json`); run it in the session
|
|
140
137
|
background and let its exit report the terminal verdict. Use `spur workflow trace "$RUN" --follow
|
|
141
|
-
--output` to stream the non-interactive agent output to `.spur/
|
|
138
|
+
--output` to stream the non-interactive agent output to `.spur/memory/runs/<runId>.md` as it lands.
|
|
142
139
|
|
|
143
140
|
Synchronous invocation (`--json` without `--async`) is acceptable **only** for short pipelines
|
|
144
141
|
(< 2 min, e.g. precheck-only or a dry-run). Do not use it for the full task pipeline.
|
|
@@ -305,9 +302,9 @@ rather than raise again without sign-off").
|
|
|
305
302
|
**2. Timed-out implement — resume from the partial tree, don't restart.** A timeout kills the
|
|
306
303
|
implement `agent.run` (exit 3), the pipeline routes to `failed`, and the task stays `todo` with
|
|
307
304
|
the partial work still in the working tree. The failure output names the partial-work artifact
|
|
308
|
-
(`.spur/
|
|
305
|
+
(`.spur/memory/runs/<runId>/artifacts/<runId>-implement-partial.md`) and this runbook. Recovery:
|
|
309
306
|
|
|
310
|
-
1. **Recognise.** `.spur/
|
|
307
|
+
1. **Recognise.** `.spur/memory/runs/<runId>/artifacts/<runId>-implement-partial.md` exists, the run reported `exited
|
|
311
308
|
with code 3`, the task is at `todo`. The artifact's `git diff --stat` section is the partial
|
|
312
309
|
work inventory.
|
|
313
310
|
2. **Establish green from the partial files.** `bun run format` then `bun run lint` + `bun
|
|
@@ -336,10 +333,9 @@ task.** A `cheap`/`standard`-tier model handed a task that big does not fail fas
|
|
|
336
333
|
entire `implementTimeoutMs` and exits 3 with a partial tree (run `ca130182` — 7 reqs / 9 plan
|
|
337
334
|
items / 12+ files → 30 minutes, 6 of 12 files, no tests, no docs, no `## Solution`).
|
|
338
335
|
|
|
339
|
-
The precheck size gate is count-only: it
|
|
340
|
-
never consults the executor's capability tier.
|
|
341
|
-
|
|
342
|
-
make a flash model able to finish one.
|
|
336
|
+
The precheck size gate (`spur task check <wbs> --precheck`) is count-only: it fails above 10
|
|
337
|
+
requirements or 16 Plan items and never consults the executor's capability tier. The limits are
|
|
338
|
+
fixed — clear a failure by splitting the task.
|
|
343
339
|
|
|
344
340
|
The empty-implement guard (`requireDiff` on the task-pipeline `implement` step, R3) fails the
|
|
345
341
|
run fast when an implement exits 0 with zero non-corpus changes — a no-op never drifts into
|
|
@@ -11,13 +11,13 @@ see_also:
|
|
|
11
11
|
**Scope:** opt-in, strictness-triggered — never gate-time, never automatic.
|
|
12
12
|
|
|
13
13
|
This helper resolves a deferred `feature_id` edge when the operator explicitly invokes or intends
|
|
14
|
-
`--strict` rigor, or asks to "link this task to a feature." It is **NOT** part of the `--
|
|
14
|
+
`--strict` rigor, or asks to "link this task to a feature." It is **NOT** part of the `--as done`
|
|
15
15
|
done-gate, NOT in any `--next` chain, and NOT triggered automatically. Invoking it is always an
|
|
16
16
|
explicit operator choice.
|
|
17
17
|
|
|
18
18
|
**Design boundaries (enforced):**
|
|
19
19
|
|
|
20
|
-
- `feature_id: null` is a valid, supported state under the default done-gate (`--
|
|
20
|
+
- `feature_id: null` is a valid, supported state under the default done-gate (`--as done`). Deferral is legitimate.
|
|
21
21
|
- This helper fires only when the operator opts in — it does NOT change the L4 warning severity.
|
|
22
22
|
- It NEVER creates a new feature without operator confirmation.
|
|
23
23
|
- It ALWAYS prefers matching an **existing** feature before proposing creation.
|
|
@@ -30,7 +30,7 @@ explicit operator choice.
|
|
|
30
30
|
- A deliberate traceability audit: `spur task check --strict` across the corpus reveals N orphan tasks.
|
|
31
31
|
|
|
32
32
|
**Do NOT invoke from:**
|
|
33
|
-
- The `--
|
|
33
|
+
- The `--as done` done-gate (it must stay feature_id-agnostic)
|
|
34
34
|
- Any `--next` chain or automated pipeline step
|
|
35
35
|
- Any context where the operator has not explicitly requested strict rigor or linking
|
|
36
36
|
|
|
@@ -35,6 +35,15 @@ where the command already has at least one HITL gate. The rule forces a declarat
|
|
|
35
35
|
capability exists — a command that would benefit from `--json` but produces only prose is recorded
|
|
36
36
|
as a follow-up, not quietly left inconsistent.
|
|
37
37
|
|
|
38
|
+
### `--file <path>` — specify the operation's input or output file
|
|
39
|
+
|
|
40
|
+
**Anchor:** `#flag-file`.
|
|
41
|
+
|
|
42
|
+
Resolve relative paths against the invocation directory before switching to an execution
|
|
43
|
+
repository/worktree; preserve quoted paths with spaces. The command defines format and direction:
|
|
44
|
+
job-dump writes/refreshes Markdown, job-resume reads Markdown, and feature-change reads its mapping
|
|
45
|
+
file. Required for job-dump and job-resume; neither has a default path.
|
|
46
|
+
|
|
38
47
|
### `--agent <inline|auto|name>` — name who does the model-bearing work
|
|
39
48
|
|
|
40
49
|
**Anchor:** `#flag-agent`.
|
|
@@ -43,7 +52,7 @@ as a follow-up, not quietly left inconsistent.
|
|
|
43
52
|
`implementAgent` override, objective triggers, and surface-derivation logic — lives in
|
|
44
53
|
[cross-cutting.md](cross-cutting.md#inline-default-execution-surface).
|
|
45
54
|
The value table below is the C3a cross-file parity surface (kept in lockstep with the SSOT by
|
|
46
|
-
`validate-flag-contracts.ts`), not an independent restatement.
|
|
55
|
+
`scripts/commands/validate-flag-contracts.ts`), not an independent restatement.
|
|
47
56
|
|
|
48
57
|
| Value | Who does the work | Derived surface |
|
|
49
58
|
| ------------------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
|
|
@@ -126,6 +135,10 @@ Skip objective HITL confirmations inside this command (feature-check, batch-crea
|
|
|
126
135
|
gate). Taste gates and irreversible HITL gates (e.g. `--merge`) still pause even under `--auto`.
|
|
127
136
|
Only declared where the command already has at least one HITL gate the flag can skip.
|
|
128
137
|
|
|
138
|
+
**Planning exception** (`dev-idea`, `dev-plan`): `--auto` also accepts the recommendation at the
|
|
139
|
+
taste gates (idea-eval, design-approval) — every gate there is reversible corpus writes. A gate
|
|
140
|
+
without an actionable recommendation (missing eval recommendation, FAIL design check) still pauses.
|
|
141
|
+
|
|
129
142
|
### `--keep-going` — batch failure policy: skip dependents, continue independents
|
|
130
143
|
|
|
131
144
|
**Anchor:** `#flag-keep-going`.
|
|
@@ -177,7 +190,8 @@ forced. Never bypasses lifecycle status transitions or irreversible HITL gates.
|
|
|
177
190
|
|
|
178
191
|
Scope the operation to all tasks under a feature id (`^[A-Z][1-9]*$`). On feature-advancing
|
|
179
192
|
commands (`dev-wrapall`) it also advances the feature through legal lifecycle edges with guards
|
|
180
|
-
honored.
|
|
193
|
+
honored. On `dev-review` it takes a comma list (`--feature <id>[,<id>]`) — sugar for the union of
|
|
194
|
+
the `feature:<id>` sets, resolved once and frozen.
|
|
181
195
|
|
|
182
196
|
### `--check <cmd>` — validation command for iterate-and-check loops
|
|
183
197
|
|
|
@@ -190,11 +204,13 @@ establishes a baseline with it before the first change and re-runs it after each
|
|
|
190
204
|
|
|
191
205
|
**Anchor:** `#flag-focus`.
|
|
192
206
|
|
|
193
|
-
Constrain the operation to a named subset of dimensions — review dimensions on `dev-review
|
|
194
|
-
|
|
195
|
-
|
|
207
|
+
Constrain the operation to a named subset of dimensions — review dimensions on `dev-review`
|
|
208
|
+
(vocabulary SSOT: [code-verification/SKILL.md](../../code-verification/SKILL.md) review mode —
|
|
209
|
+
`dev-verify`/`dev-verifyall` keep their SECUA-only lens set), a refactor lens set on
|
|
210
|
+
`dev-refactor` (`api|architect|tests|ui|auto`), a refine focus mode on
|
|
196
211
|
`dev-refine`/`dev-refineall` (`all|requirements|background|constraints|acceptance|quick` —
|
|
197
|
-
[dev-operations.md](dev-operations.md) § refine), or a reconstruction lens on `dev-reverse
|
|
212
|
+
[dev-operations.md](dev-operations.md) § refine), or a reconstruction lens on `dev-reverse`
|
|
213
|
+
(`all|stack|dependencies|data|flows|api|security|quality|performance`).
|
|
198
214
|
Narrowing reduces token cost; omitting runs
|
|
199
215
|
all dimensions.
|
|
200
216
|
|
|
@@ -203,7 +219,9 @@ all dimensions.
|
|
|
203
219
|
**Anchor:** `#flag-scope`.
|
|
204
220
|
|
|
205
221
|
Limit the operation to a file or directory path (`dev-arch`, `dev-debug`, `dev-fixall`,
|
|
206
|
-
`dev-gitmsg`, `dev-gtd`, `dev-refactor`, `dev-simplify`) to bound the working set.
|
|
222
|
+
`dev-gitmsg`, `dev-gtd`, `dev-refactor`, `dev-review`, `dev-simplify`) to bound the working set.
|
|
223
|
+
On `dev-review` it takes a comma list of paths — normalized, nested and duplicate paths merged,
|
|
224
|
+
one advisory sub-review per surviving path.
|
|
207
225
|
|
|
208
226
|
### `--all` — widen the operation to everything in its domain
|
|
209
227
|
|
|
@@ -226,11 +244,13 @@ is the contract; divergence between `--dry-run` and the real run is a bug.
|
|
|
226
244
|
|
|
227
245
|
**Anchor:** `#flag-tasks`.
|
|
228
246
|
|
|
229
|
-
Batch operation
|
|
230
|
-
list, status pseudo-list (`todo`, `wip`), `feature:<id>`, or `ready` —
|
|
231
|
-
batch runs over.
|
|
232
|
-
|
|
233
|
-
|
|
247
|
+
Batch operation (`dev-parallel`, `dev-refineall`, `dev-review`, `dev-runall`, `dev-verifyall`). An
|
|
248
|
+
explicit selector — WBS list, status pseudo-list (`todo`, `wip`), `feature:<id>`, or `ready` —
|
|
249
|
+
resolving to the set the batch runs over. On `dev-review` the selector is restricted to the
|
|
250
|
+
review-safe forms: comma WBS list and `feature:<id>` — status pseudo-lists and `ready` are
|
|
251
|
+
rejected (they select work to do, not work to review). Required on `dev-parallel`, `dev-runall`,
|
|
252
|
+
and `dev-verifyall`, where `--feature` is an optional restrictor. On `dev-refineall` it is instead
|
|
253
|
+
one of a required pair — supply exactly one of `--feature` or `--tasks`.
|
|
234
254
|
|
|
235
255
|
### `--mode <kind>` — select an execution mode
|
|
236
256
|
|
|
@@ -352,11 +372,18 @@ pauses, even under `--auto`.
|
|
|
352
372
|
|
|
353
373
|
**Anchor:** `#flag-max-retry`.
|
|
354
374
|
|
|
355
|
-
Bound the retry loop on fix-family commands (`dev-dogfood`, `dev-fixall`, `dev-gtd`). After `n` consecutive
|
|
375
|
+
Bound the retry loop on fix-family commands (`dev-dogfood`, `dev-fixall`, `dev-fixgha`, `dev-gtd`). After `n` consecutive
|
|
356
376
|
failed fix attempts, stop and ask the operator rather than looping indefinitely. On `dev-dogfood`
|
|
357
377
|
the default is `2` (fix mode) and `--max-retry 0` selects observe-only — matching the backing
|
|
358
378
|
`sp:dogfood-testing` skill; the command table and the skill must not drift on this default.
|
|
359
379
|
|
|
380
|
+
### `--no-push` — commit locally, stop before push
|
|
381
|
+
|
|
382
|
+
**Anchor:** `#flag-no-push`.
|
|
383
|
+
|
|
384
|
+
Commit the fixes locally but do not `git push` or run the post-push `gh` verification
|
|
385
|
+
(`dev-fixgha`, `dev-gtd`). The report lists the unpushed commits.
|
|
386
|
+
|
|
360
387
|
### `--full` — rewrite a `--next` run as full pipeline
|
|
361
388
|
|
|
362
389
|
**Anchor:** `#flag-full`.
|
|
@@ -421,14 +448,6 @@ remainder through `spur task` — never fix straight from the raw findings list.
|
|
|
421
448
|
features ([dev-operations.md § 2. review](dev-operations.md#2-review)); `dev-review-session` keeps
|
|
422
449
|
the stricter direct-fix bar (pure docs / one-to-two-line fixes).
|
|
423
450
|
|
|
424
|
-
### `--approve-taste` — pre-clear all taste gates this run
|
|
425
|
-
|
|
426
|
-
**Anchor:** `#flag-approve-taste`.
|
|
427
|
-
|
|
428
|
-
Planning commands (`dev-idea`, `dev-plan`): with `--auto`, skip all remaining taste pauses this
|
|
429
|
-
run (idea-eval + design-approval). Sets `idea_approved=true` and `design_approved=true`. One CLI
|
|
430
|
-
flag sets both.
|
|
431
|
-
|
|
432
451
|
### `--worktree [<name>]` — run the batch in an isolated git worktree (create or reuse)
|
|
433
452
|
|
|
434
453
|
**Anchor:** `#flag-worktree`.
|
|
@@ -72,16 +72,15 @@ Entered before `task-pipeline.yaml` `precheck` state runs `spur task check <wbs>
|
|
|
72
72
|
- [ ] The `## Plan` section is an ordered checklist (not prose).
|
|
73
73
|
- [ ] The `## Design` section, if present, does not contradict the parent feature's design.
|
|
74
74
|
- [ ] No `TODO`, `TBD`, or `???` placeholders in Requirements, AC, Design, or Plan.
|
|
75
|
-
- [ ] The evidence-channel precheck (0726 R2
|
|
76
|
-
|
|
77
|
-
content for an exact `evidence-channel: history_tool_call.args_raw[pi]`
|
|
75
|
+
- [ ] The evidence-channel precheck (0726 R2, folded into the pipeline guard by 1002) is
|
|
76
|
+
enforced by `spur task check <wbs> --precheck` — the guard command itself. It parses the
|
|
77
|
+
task content for an exact `evidence-channel: history_tool_call.args_raw[pi]`
|
|
78
78
|
declaration and, when present, counts live pi rows with `args_raw` on
|
|
79
|
-
`.spur/spur.db` via
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
implementation begins.
|
|
79
|
+
`.spur/spur.db` via the domain read (fail-closed: unknown declarations, a missing
|
|
80
|
+
database/table, and a zero count error). Tasks without a declaration pass without
|
|
81
|
+
opening the database; size limits (10 R-items / 16 plan items) are checked in the
|
|
82
|
+
same call. Tasks declaring a live-data evidence channel must import real history
|
|
83
|
+
(safe importer, non-dry-run) before implementation begins.
|
|
85
84
|
|
|
86
85
|
## review gate
|
|
87
86
|
|
|
@@ -102,12 +101,13 @@ Entered before `task-pipeline.yaml` `review` state dispatches `sp:code-verificat
|
|
|
102
101
|
Entered before `task-pipeline.yaml` `verify` state produces a task verdict.
|
|
103
102
|
|
|
104
103
|
- [ ] The verify answer file (`.spur/run/<wbs>-verify-answer.txt`) is lint-clean before
|
|
105
|
-
verdict derivation: `
|
|
106
|
-
rejects missing/duplicate/unknown R IDs, AC identities that are not an
|
|
107
|
-
checklist label or linked-feature scenario title, invalid status/evidence-type
|
|
108
|
-
values, and empty evidence on any row. A lint failure fails the
|
|
109
|
-
|
|
110
|
-
-
|
|
104
|
+
verdict derivation: `spur task verdict <wbs> --from-answer …` (0726 R3) lints the
|
|
105
|
+
file first and rejects missing/duplicate/unknown R IDs, AC identities that are not an
|
|
106
|
+
exact task checklist label or linked-feature scenario title, invalid status/evidence-type
|
|
107
|
+
values, and empty evidence on any row. A lint failure fails the verdict step
|
|
108
|
+
(fail-closed) before verdict derivation; an unresolvable task file fails open so
|
|
109
|
+
pre-lint historical runs (8001–8005) stay reproducible.
|
|
110
|
+
- [ ] `spur task check <wbs> --as done --json` returns PASS.
|
|
111
111
|
- [ ] Every AC scenario has a corresponding verify command that exited 0.
|
|
112
112
|
- [ ] The `## Solution` section is filled (not the placeholder comment).
|
|
113
113
|
- [ ] The `## Testing` evidence (commands run + outcomes) is present in the verdict artifact —
|
|
@@ -143,19 +143,19 @@ bounded retry does not.
|
|
|
143
143
|
### The three `testing → done` gate layers
|
|
144
144
|
|
|
145
145
|
The CLI verdict-artifact check runs first. The lifecycle adapter then checks provenance, Review L3,
|
|
146
|
-
and finally the workflow's
|
|
147
|
-
|
|
146
|
+
and finally the workflow's `task check --as done` shell guard. The table groups the two complementary
|
|
147
|
+
done-row/verdict checks as one defense-in-depth layer even though they bracket the adapter checks.
|
|
148
148
|
The first denial wins; each denial names its own remediation. In verify-0293, the artifact check
|
|
149
149
|
passed, so provenance denied first and Review L3 denied on the retry.
|
|
150
150
|
|
|
151
151
|
| # | Gate layer | Triggers denial when | Remediation |
|
|
152
152
|
|---|------------|----------------------|-------------|
|
|
153
|
-
| 1 | **
|
|
153
|
+
| 1 | **Done-row check + verdict artifact** (`spur task check <wbs> --as done` + `done-transition-guard.ts`) | The done-row check fails, or `.spur/run/<wbs>-verdict.json` is **missing** or has a non-PASS aggregate. **Missing artifact is a deny** (not a silent allow — closes the 0349 "done without verdict" class). The aggregate is recomputed from requirement/AC rows; the harsher of stored and computed wins. | Re-run `/sp:dev-verify <wbs>` until PASS (writes the artifact), or explicitly override with `spur task update <wbs> done --force-done --reason "<why>"`. Docs-only procedures meet the same layer: read-only measured verification
|
|
154
154
|
(answer file + `spur task verdict`) writes the standard `.spur/run/<wbs>-verdict.json` artifact
|
|
155
155
|
under proof-input digest bracketing; missing or non-PASS evidence is a refusal, never a synthetic
|
|
156
156
|
PASS stub. |
|
|
157
157
|
| 2 | **Provenance guard** (`lifecycle-adapter.ts`) | No pipeline-kind run link exists for `<wbs>`. | Run `/sp:dev-run <wbs>` through the full pipeline, use `/sp:dev-run <wbs> --mode implement --auto --next` for the explicit step chain, or record the audited bypass with `--provenance-bypass` on `spur task update`. |
|
|
158
|
-
| 3 | **Review L3** (`task-check.ts`) | `### Review` is empty, placeholder-only, or lacks a populated P1–P4 findings table. | Run `/sp:dev-review <wbs>`; verify cannot write Review because of the Step 10 prohibition above. |
|
|
158
|
+
| 3 | **Review L3** (`task-check.ts`) | `### Review` is empty, placeholder-only, or lacks a populated P1–P4 findings table. | Run `/sp:dev-review --tasks <wbs>`; verify cannot write Review because of the Step 10 prohibition above. |
|
|
159
159
|
|
|
160
160
|
When the verdict is **PARTIAL/FAIL**, or any gate layer fails: stop as review-pending — surface
|
|
161
161
|
the verdict (or the gate's blocking finding), leave the task at its current status, do NOT
|
|
@@ -33,7 +33,7 @@ before any processing); the `## Requirement inventory` items trace back to it.
|
|
|
33
33
|
<one-paragraph refined statement of what the idea actually requires — the "real requirement" after discovery sharpens the vague input>
|
|
34
34
|
|
|
35
35
|
## Requirement inventory
|
|
36
|
-
<mandatory — the coverage gate (
|
|
36
|
+
<mandatory — the coverage gate (`feature check --inventory`) parses this section, so keep the exact `- I<n> — ` item form>
|
|
37
37
|
- I1 — <requirement stated as an ask, quoting or paraphrasing the source line from the run's idea-input artifact> (source: "<quoted fragment from the operator's idea>")
|
|
38
38
|
- I2 — <next requirement>
|
|
39
39
|
- I<n> — <optional: a requirement explicitly out of scope> [deferred: <reason>]
|
|
@@ -68,6 +68,7 @@ Score guide:
|
|
|
68
68
|
|
|
69
69
|
## Recommendation
|
|
70
70
|
<proceed | reshape | drop> — <one-line rationale linking scores, premises, and pros/cons>
|
|
71
|
+
<!-- the first line under this heading MUST start with exactly one of proceed / reshape / drop — `--auto` routes on it -->
|
|
71
72
|
|
|
72
73
|
Stakes: <plain-English cost of proceeding vs not; reversibility; blast radius>
|
|
73
74
|
|
|
@@ -83,8 +84,8 @@ Stakes: <plain-English cost of proceeding vs not; reversibility; blast radius>
|
|
|
83
84
|
|------|--------|
|
|
84
85
|
| Filled instance path | `.spur/run/idea-eval-report.md` |
|
|
85
86
|
| Template home | this file |
|
|
86
|
-
| Requirement inventory | mandatory `## Requirement inventory` section (0887 R3); consumed by `
|
|
87
|
+
| Requirement inventory | mandatory `## Requirement inventory` section (0887 R3); consumed by the `feature check --inventory` coverage gate (R4) |
|
|
87
88
|
| HITL state | `idea-eval` in `idea-pipeline.yaml` |
|
|
88
89
|
| Approve | continue → `feature-create` |
|
|
89
90
|
| Reject / cancel | → `cancelled` (no feature) |
|
|
90
|
-
| `--auto` |
|
|
91
|
+
| `--auto` (`idea_approved=true`) | `proceed`/`reshape` → `feature-create`; `drop` → `cancelled`; missing/unparseable recommendation → pauses |
|