@gobing-ai/spur 0.3.91 → 0.3.93
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/pipeline-budgets.json +2 -9
- package/config/plugin-scripts.json +27 -1
- package/config/templates/AGENTS.md +4 -0
- package/config/templates/docs/02_ROADMAP.md +2 -0
- package/config/templates/docs/03_ARCHITECTURE.md +3 -1
- package/config/templates/docs/04_DESIGN.md +2 -0
- package/config/templates/docs/99_PROJECT_CONSTITUTION.md +10 -2
- package/config/workflow-candidates.json +72 -1
- package/config/workflows/feature-lifecycle.yaml +14 -5
- package/config/workflows/feature-verification.yaml +36 -27
- package/config/workflows/history-anatomy.yaml +16 -25
- package/config/workflows/idea-pipeline.yaml +76 -23
- package/config/workflows/pr-review.yaml +8 -0
- package/config/workflows/task-pipeline.yaml +362 -40
- package/config/workflows/wayfinder-resolution.yaml +5 -0
- package/config/workflows/wrapup-pipeline.yaml +102 -19
- package/package.json +9 -9
- package/plugins/sp/README.md +7 -2
- package/plugins/sp/agents/super-planner.md +14 -5
- package/plugins/sp/commands/dev-dogfood.md +4 -4
- package/plugins/sp/commands/dev-fixall.md +8 -5
- package/plugins/sp/commands/dev-run.md +8 -2
- package/plugins/sp/commands/dev-runall.md +14 -8
- package/plugins/sp/commands/dev-verify.md +9 -0
- package/plugins/sp/commands/dev-verifyall.md +5 -0
- package/plugins/sp/lib/idea-handoff.generated.mjs +306 -301
- package/plugins/sp/lib/inline-run.generated.d.mts +18 -0
- package/plugins/sp/lib/inline-run.generated.mjs +1468 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/environment-lens.md +1 -1
- package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +136 -0
- package/plugins/sp/scripts/dogfood-testing/validate-report.ts +196 -2
- package/plugins/sp/scripts/feature-verification-steps.mjs +174 -0
- package/plugins/sp/scripts/feature-verification-steps.ts +275 -0
- package/plugins/sp/scripts/history-anatomy-cache.mjs +104 -4
- package/plugins/sp/scripts/history-anatomy-cache.ts +137 -13
- package/plugins/sp/scripts/inline-pipeline-parity-check.ts +2 -1
- package/plugins/sp/scripts/inline-run-setup.mjs +421 -0
- package/plugins/sp/scripts/inline-run-setup.ts +325 -78
- package/plugins/sp/scripts/quality-gate.mjs +248 -6
- package/plugins/sp/scripts/quality-gate.ts +410 -9
- package/plugins/sp/scripts/record-feature-sync.mjs +63 -0
- package/plugins/sp/scripts/record-feature-sync.ts +84 -0
- package/plugins/sp/scripts/residual-scan.mjs +484 -0
- package/plugins/sp/scripts/residual-scan.ts +640 -0
- package/plugins/sp/scripts/task-diffstat.mjs +156 -0
- package/plugins/sp/scripts/task-diffstat.ts +229 -0
- package/plugins/sp/scripts/task-evidence-precheck.ts +8 -3
- package/plugins/sp/scripts/task-size-precheck.ts +8 -3
- package/plugins/sp/scripts/wrapup-drift-probe.mjs +181 -0
- package/plugins/sp/scripts/wrapup-drift-probe.ts +258 -0
- package/plugins/sp/scripts/wrapup-steps.mjs +60 -1
- package/plugins/sp/scripts/wrapup-steps.ts +89 -4
- package/plugins/sp/skills/brainstorm/SKILL.md +2 -0
- package/plugins/sp/skills/brainstorm/references/workflows.md +17 -2
- package/plugins/sp/skills/branch-workflow/SKILL.md +1 -0
- package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +2 -0
- package/plugins/sp/skills/code-implementation/SKILL.md +17 -0
- package/plugins/sp/skills/code-verification/SKILL.md +21 -0
- package/plugins/sp/skills/code-verification/references/secu-review.md +3 -2
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +1 -0
- package/plugins/sp/skills/dogfood-testing/SKILL.md +5 -3
- package/plugins/sp/skills/dogfood-testing/references/monitor-ledger.md +63 -26
- package/plugins/sp/skills/dogfood-testing/references/report-template.md +33 -10
- package/plugins/sp/skills/history-anatomy/references/modes.md +5 -3
- package/plugins/sp/skills/next-feature/references/ranking-rubric.md +1 -1
- package/plugins/sp/skills/next-router/references/routing-table.md +7 -0
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
- package/plugins/sp/skills/session-review/SKILL.md +12 -2
- package/plugins/sp/skills/spur-check/SKILL.md +112 -0
- package/plugins/sp/skills/spur-cli/references/features.md +1 -1
- package/plugins/sp/skills/spur-cli/references/projects.md +3 -1
- package/plugins/sp/skills/spur-cli/references/workflows.md +39 -19
- package/plugins/sp/skills/spur-dev/SKILL.md +13 -5
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +18 -3
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +2 -2
- package/plugins/sp/skills/spur-dev/references/document-authoring.md +85 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +286 -58
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +27 -4
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +3 -2
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +61 -16
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +10 -5
- package/plugins/sp/skills/spur-dev/templates/design.md +31 -0
- package/plugins/sp/skills/spur-dev/templates/plan.md +32 -0
- package/plugins/sp/skills/spur-doctor/SKILL.md +60 -14
- package/schemas/state-machine-workflow.schema.json +4 -0
- package/spur.js +22501 -19644
- package/web/_astro/BoardApp.CerSBgis.js +192 -0
- package/web/_astro/BoardApp.eoTz0pZs.js +1 -0
- package/web/_astro/{TaskDetail.CXGltuT_.js → TaskDetail.DCqiC-OZ.js} +1 -1
- package/web/_astro/arc.CPwg6Rw0.js +1 -0
- package/web/_astro/{architectureDiagram-3BPJPVTR.DJ8DHkWE.js → architectureDiagram-3BPJPVTR.DM_vp_hO.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.D8DHK3Jl.js → blockDiagram-GPEHLZMM.DXVIiv0p.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.BugQbX9u.js → c4Diagram-AAUBKEIU.BbF_zCxW.js} +1 -1
- package/web/_astro/channel.MYZLKNwy.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.Mv26KlVn.js → chunk-2J33WTMH.CAgQHpPC.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.CD51JoT_.js → chunk-4BX2VUAB.BN-5tpw4.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.D_PFaIEe.js → chunk-55IACEB6.CnPkEEr0.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.DemMW1ao.js → chunk-727SXJPM.BQzQeMVm.js} +4 -4
- package/web/_astro/{chunk-AQP2D5EJ.Iu2V5-ex.js → chunk-AQP2D5EJ.B6xNyDnL.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.MsNgSP-E.js → chunk-FMBD7UC4.C7f9Ih78.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.DfbRaAlm.js → chunk-ND2GUHAM.CNV1dFXT.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.BbJAQ4h-.js → chunk-QZHKN3VN.Cudn2TkJ.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.CPurtiC2.js → classDiagram-4FO5ZUOK.D1NwP50q.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.CPurtiC2.js → classDiagram-v2-Q7XG4LA2.D1NwP50q.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.CKKdx1bM.js → cose-bilkent-S5V4N54A.B1wSL-Xb.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.CoKMTg-R.js → cynefin-OW5HDTMX.BmK52w8G.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.D4h4_k56.js → dagre-BM42HDAG.Bfy5CTDT.js} +2 -2
- package/web/_astro/diagram-2AECGRRQ.DhNnvUvX.js +43 -0
- package/web/_astro/diagram-5GNKFQAL.lTX5KwnS.js +10 -0
- package/web/_astro/{diagram-KO2AKTUF.BFoCkiCr.js → diagram-KO2AKTUF.CW_vMJ4z.js} +3 -3
- package/web/_astro/{diagram-LMA3HP47.exHn9OVx.js → diagram-LMA3HP47.B_8ZGF67.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.CeqO34nN.js → diagram-OG6HWLK6.BppnHsdS.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.D_v7HqxR.js → erDiagram-TEJ5UH35.BEuHXcjJ.js} +5 -5
- package/web/_astro/{flowDiagram-I6XJVG4X.EUmrpbwh.js → flowDiagram-I6XJVG4X.CH-UlnGr.js} +4 -4
- package/web/_astro/{ganttDiagram-6RSMTGT7.BOCF5lII.js → ganttDiagram-6RSMTGT7.BO81S85v.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.Di7otYZD.js → gitGraphDiagram-PVQCEYII.XnPxPPZN.js} +1 -1
- package/web/_astro/index.Hjbr15fG.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.TcBkCAJk.js → infoDiagram-5YYISTIA.JyjYRu_T.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.D-2y4M0c.js → ishikawaDiagram-YF4QCWOH.BBRBF-Fo.js} +5 -5
- package/web/_astro/{journeyDiagram-JHISSGLW.DPbJI_n2.js → journeyDiagram-JHISSGLW.C_iymSyp.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.EFxhQ9Fj.js → kanban-definition-UN3LZRKU.DdfW-Oqt.js} +7 -7
- package/web/_astro/{linear.DSAsQLzs.js → linear.C2_IkbZT.js} +1 -1
- package/web/_astro/mermaid.core.GAOYeSR0.js +303 -0
- package/web/_astro/{mindmap-definition-RKZ34NQL.CJY1N_7V.js → mindmap-definition-RKZ34NQL.DAZIxQSK.js} +2 -2
- package/web/_astro/{pieDiagram-4H26LBE5.567ZNoL2.js → pieDiagram-4H26LBE5.CN8sIhKM.js} +3 -3
- package/web/_astro/{quadrantDiagram-W4KKPZXB.mqfz9-MY.js → quadrantDiagram-W4KKPZXB.3dGcX5GP.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.Bv1Gv9In.js → requirementDiagram-4Y6WPE33.BV2y4dd6.js} +3 -3
- package/web/_astro/{sankeyDiagram-5OEKKPKP.B6Gs4X4r.js → sankeyDiagram-5OEKKPKP.Cqo15Tvo.js} +4 -4
- package/web/_astro/{sequenceDiagram-3UESZ5HK.BhYj4v-m.js → sequenceDiagram-3UESZ5HK.CROCPMJB.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.BPbBnkpw.js → stateDiagram-AJRCARHV.RfXZrkFE.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.C4squMNK.js → stateDiagram-v2-BHNVJYJU.CPXmbBs9.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.C_SwIHgl.js → timeline-definition-PNZ67QCA.DdgKTiO8.js} +3 -3
- package/web/_astro/{vennDiagram-CIIHVFJN.Bz4NZGpQ.js → vennDiagram-CIIHVFJN.CPNVSHF1.js} +5 -5
- package/web/_astro/{wardleyDiagram-YWT4CUSO.CozMVZ3i.js → wardleyDiagram-YWT4CUSO.CQhA0Jyr.js} +3 -3
- package/web/_astro/{xychartDiagram-2RQKCTM6.BwMGBwjB.js → xychartDiagram-2RQKCTM6.n61BWyy4.js} +1 -1
- package/web/index.html +2 -2
- package/config/workflows/decision-routing-example.yaml +0 -134
- package/web/_astro/BoardApp.BEDWpzsr.js +0 -188
- package/web/_astro/BoardApp.DQG2xfEz.js +0 -1
- package/web/_astro/arc.C0rrflm_.js +0 -1
- package/web/_astro/channel.SRrg1P-w.js +0 -1
- package/web/_astro/diagram-2AECGRRQ.DJ0h9zgw.js +0 -43
- package/web/_astro/diagram-5GNKFQAL.DvPk1jYd.js +0 -10
- package/web/_astro/index.Bx6GY4RH.css +0 -1
- package/web/_astro/mermaid.core.kAZjgJHG.js +0 -301
|
@@ -23,7 +23,7 @@ the resolved actions and guards of every `.spur/workflows/*.yaml`; any element p
|
|
|
23
23
|
in one and absent in the other fails the check. Add a new kind here when the driver
|
|
24
24
|
implements it; remove the entry when the corresponding kind is dropped from the YAML.
|
|
25
25
|
|
|
26
|
-
**Actions:** `shell` · `note` · `doctor.probe` · `file.read.into-var` · `hitl.confirm` · `hitl.
|
|
26
|
+
**Actions:** `shell` · `note` · `doctor.probe` · `file.read.into-var` · `hitl.confirm` · `hitl.input` · `agent.run` · `proof.fingerprint` · `run.artifact` · `command.gate` · `decide`
|
|
27
27
|
|
|
28
28
|
**Guards (transitions):** `always` · `shell` · `action-ok` · `contract-violation`
|
|
29
29
|
|
|
@@ -39,8 +39,8 @@ interactive `/sp:dev-run --mode full`, sequential `/sp:dev-runall`, `/sp:dev-ide
|
|
|
39
39
|
`--agent auto`, parallel batch mode, `spur workflow run`, and `spur agent run` keep the existing
|
|
40
40
|
subprocess path.
|
|
41
41
|
|
|
42
|
-
The selected project runtime definition — `task-pipeline.yaml` or `idea-pipeline.yaml`, resolved through the
|
|
43
|
-
project→
|
|
42
|
+
The selected project runtime definition — `task-pipeline.yaml` or `idea-pipeline.yaml`, resolved through the
|
|
43
|
+
project→registered→shared model (ADR-113) — remains the sole
|
|
44
44
|
FSM definition. The driver MUST read that file
|
|
45
45
|
at invocation time. It must not copy the state list, actions, guards, or transition order into a
|
|
46
46
|
command, skill, script, or second workflow.
|
|
@@ -69,23 +69,31 @@ the human/native presentation layer — labels are display addresses only, never
|
|
|
69
69
|
1. Resolve the command inputs, `--auto`, and any explicit `--vars` — **without reading the selected
|
|
70
70
|
YAML yet**. An explicit non-inline executor selection chooses the subprocess workflow path.
|
|
71
71
|
2. Allocate a collision-resistant inline run id (`uuidgen`, with a timestamp/pid fallback), create
|
|
72
|
-
`.spur/run/`, and use
|
|
72
|
+
`.spur/run/`, and use the two-file run record (task 0927) — append lines to
|
|
73
|
+
`.spur/run/<run-id>.md` and read machine state from `.spur/run/<run-id>.state.json`.
|
|
73
74
|
3. **Authoritative run identity (task 0804 R1, fail-closed).** Persist the run row through the
|
|
74
75
|
internal delegate before any stage executes — this is what makes bound `run.artifact` record
|
|
75
76
|
accept the inline run (0785 R3):
|
|
76
77
|
|
|
77
78
|
```bash
|
|
78
79
|
SETUP_SCRIPT="plugins/sp/scripts/inline-run-setup.ts";
|
|
79
|
-
[ -f "$SETUP_SCRIPT" ] || SETUP_SCRIPT="$(superskill script path sp inline-run-setup.
|
|
80
|
+
[ -f "$SETUP_SCRIPT" ] || SETUP_SCRIPT="$(superskill script path sp inline-run-setup.mjs 2>/dev/null)";
|
|
80
81
|
[ -n "$SETUP_SCRIPT" ] && [ -f "$SETUP_SCRIPT" ] && \
|
|
81
82
|
bun "$SETUP_SCRIPT" --run-id "$RUN_ID" --file <selected-pipeline-yaml> \
|
|
82
83
|
|| { echo "inline run setup failed closed — checker not found; run 'superskill install sp'" >&2; exit 1; }
|
|
83
84
|
```
|
|
84
85
|
|
|
85
|
-
The delegate
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
The delegate uses the source app service when the SPUR_BIN chain identifies a checkout;
|
|
87
|
+
otherwise it loads the generated application bundle shipped with the plugin. Both setup paths
|
|
88
|
+
obtains the selected definition from the existing CLI `workflow show --format todo --json`
|
|
89
|
+
projection and revalidates its schema/name/digest before preserving its source layer.
|
|
90
|
+
Both paths create-or-attach the row,
|
|
91
|
+
and writes the run-record state `.spur/run/<run-id>.state.json` plus the `.md` run-start
|
|
92
|
+
header (task 0927; a legacy pre-0927 run keeps its `<run-id>-inline-setup.json` sidecar).
|
|
93
|
+
Seed `__runId` and `__definitionDigest`
|
|
94
|
+
from that state so proof capture and bound registration verify against the persisted identity.
|
|
95
|
+
Bun remains required for SQLite; the Node-runnable installed twin re-enters Bun on PATH.
|
|
96
|
+
A non-zero exit (missing runtime/bundle, invalid projection, missing row identity, changed definition) stops the run —
|
|
89
97
|
never continue unbound and never fabricate a PASS. (The delegate persists the authoritative
|
|
90
98
|
RUN row only — the 0808 inline record is the registration-equivalent convention below, not a
|
|
91
99
|
setup-time artifact-ledger insert.)
|
|
@@ -236,10 +244,19 @@ Action semantics come from the YAML and the workflow action contract:
|
|
|
236
244
|
actions/guards.
|
|
237
245
|
- `hitl.confirm` — under `profile=auto`, follow the YAML's auto-skip transition. Otherwise pause,
|
|
238
246
|
surface the prompt, and resume from the same state with the operator's answer.
|
|
247
|
+
- `hitl.input` — pause, surface the declared prompt (the agent's operator question, 0933), and
|
|
248
|
+
resume from the same state with the operator's answer written into the declared var (default
|
|
249
|
+
`__hitlInput`); the subsequent guards route on answer presence exactly as the engine does.
|
|
250
|
+
**Host-session exception (0933 R5):** because a host session can talk to the operator
|
|
251
|
+
directly, do NOT pause the run at `hitl.input` — ask the question in the session, write the
|
|
252
|
+
answer into the declared var, and continue. The same 2-escalation bound applies: after the
|
|
253
|
+
bound the ask routes to `failed` like the engine does.
|
|
239
254
|
- `agent.run` — execute the action's input in the host session. Task execution may use the native
|
|
240
255
|
subagent eligibility below; idea/plan never dispatch a native subagent unless the operator
|
|
241
256
|
explicitly requested delegation. Do not call `spur agent run` or re-enter a full pipeline. Preserve the YAML options: capture
|
|
242
|
-
`answerFile`; assert `expectFile`;
|
|
257
|
+
`answerFile`; assert `expectFile`; honor `escalationFile` (a non-empty file after exit 0 means
|
|
258
|
+
the agent paused on an operator question — treat the attempt as succeeded-with-escalation and
|
|
259
|
+
skip `requireDiff` for that attempt only); enforce `requireDiff` against a pre-action git snapshot,
|
|
243
260
|
including the task-scope guard; honor declared error policy. `timeoutMs` is recorded as not
|
|
244
261
|
applicable because the host session has no independent kill boundary.
|
|
245
262
|
- `run.artifact` — the engine's ledger registration has **no inline execution surface** (0808 R4).
|
|
@@ -253,13 +270,14 @@ Action semantics come from the YAML and the workflow action contract:
|
|
|
253
270
|
and pass the same `--feature-file` the run folded in — omitting it, or running from elsewhere,
|
|
254
271
|
yields a different digest and the mismatch surfaces later as a refused `run.artifact`
|
|
255
272
|
registration — and the run-scoped review-completion marker exists — then appends one provenance
|
|
256
|
-
line to `.spur/run/<run-id>.
|
|
273
|
+
line to `.spur/run/<run-id>.md` naming the equivalence (artifact kind, path, verdict, digest) and
|
|
257
274
|
proceeds to `spur task record`. A failed validation stops at the state and follows the failure
|
|
258
275
|
contract; the step is never silently skipped. Artifact-provenance consumers read that run-log
|
|
259
276
|
line on the inline path — there is no ledger row. The validation also includes **run/definition
|
|
260
277
|
identity agreement from authoritative evidence** (task 0809 R4): the verdict's `proof.runId` and
|
|
261
|
-
`proof.definitionDigest` must agree with the
|
|
262
|
-
and the persisted run row; if that identity
|
|
278
|
+
`proof.definitionDigest` must agree with the run-record state `.spur/run/<run-id>.state.json`
|
|
279
|
+
(legacy pre-0927 runs: `<run-id>-inline-setup.json`) and the persisted run row; if that identity
|
|
280
|
+
is absent or conflicts, STOP — recreating a row is
|
|
263
281
|
not a diagnostic operation. The app-service bound-artifact fixture (which writes a real engine
|
|
264
282
|
ledger row) is service-level test evidence for this identity mechanics, not evidence that the
|
|
265
283
|
inline host writes a ledger.
|
|
@@ -369,6 +387,14 @@ A behavioral AC marked MET requires executable evidence (test | command);
|
|
|
369
387
|
static-ref or llm-judge alone cannot carry it.
|
|
370
388
|
```
|
|
371
389
|
|
|
390
|
+
**AC table shape (0948 R9).** The AC table must be exactly **4 columns** and **cell 3 must hold a
|
|
391
|
+
single evidence-type token** from the allowlist above. The token is *isolated* — never merged or
|
|
392
|
+
concatenated with another token or with prose (`static-reftest` is a lint failure, not a shorthand
|
|
393
|
+
for "static-ref + test"). Evidence detail belongs in cell 4. The verify-answer linter rejects a
|
|
394
|
+
merged token, and `spur task verdict` then derives the wrong artifact — this exact shape failed the
|
|
395
|
+
0926 verify lint once before it was canonicalized, so it is stated here rather than left implicit in
|
|
396
|
+
the header row.
|
|
397
|
+
|
|
372
398
|
**Review-stage artifact contract.** A review handoff carries the Review output contract owned by
|
|
373
399
|
`plugins/sp/agents/super-reviewer.md` — native `P1 (blocker)` / `P2 (major)` / `P3 (minor)` /
|
|
374
400
|
`P4 (advisory)` priority cells and section-relative headings — **not** the verify answer schema.
|
|
@@ -429,7 +455,7 @@ or an operator decision returns a blocker; the host pauses at the current state
|
|
|
429
455
|
subagent cannot approve, infer consent, or recursively invoke the full pipeline.
|
|
430
456
|
|
|
431
457
|
After every successful inline `agent.run` action append exactly one provenance line (inline or
|
|
432
|
-
subagent form above) to `.spur/run/<run-id>.
|
|
458
|
+
subagent form above) to `.spur/run/<run-id>.md`, where `<id>` is the current YAML state id. Also
|
|
433
459
|
log start/failure and the ignored timeout value so an inline run remains auditable without
|
|
434
460
|
fabricating an `AgentRunTracedResult`.
|
|
435
461
|
|
|
@@ -441,7 +467,8 @@ in one file and makes the run unauditable (task 0726 mixed both forms).
|
|
|
441
467
|
|
|
442
468
|
## Structured trace emission (ADR-117, task 0868)
|
|
443
469
|
|
|
444
|
-
`.spur/run/<run-id>.
|
|
470
|
+
`.spur/run/<run-id>.md` is the human half of the two-file run record — evidence, **not the record
|
|
471
|
+
of truth**. A run's
|
|
445
472
|
observability is a property of the run, so the inline driver owes the same structured trace the
|
|
446
473
|
engine subprocess writes — and it owes it through the **same writer**, never a parallel
|
|
447
474
|
implementation. The shared writer is `WorkflowActionTraceWriter`
|
|
@@ -470,6 +497,24 @@ The driver reaches it through the existing run delegate (`$SETUP_SCRIPT`,
|
|
|
470
497
|
(0887 R8), so `completed_at − started_at == duration_ms` exactly; a back-date failure is
|
|
471
498
|
recorded (`action.backdate`) and never affects the run.
|
|
472
499
|
|
|
500
|
+
- **A `decide` action (0941)** — the driver never executes the DecisionMaker itself; it delegates
|
|
501
|
+
to the same app runner the engine registers, which writes the resultFile row (schemaVersion 1)
|
|
502
|
+
and returns the decision, then the delegate records the `action_runs` row (`kind=decide`)
|
|
503
|
+
through the same writer as every other action:
|
|
504
|
+
|
|
505
|
+
```bash
|
|
506
|
+
bun "$SETUP_SCRIPT" --decide --run-id "$RUN_ID" --node <state-id> --options-json <options-file>
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
The options JSON mirrors the YAML `decide` options (`id`, `method: choice|noul`, `question`,
|
|
510
|
+
`choices`/`default`, optional `evidence`, optional `minConfidence`, `resultFile`); paths resolve
|
|
511
|
+
against the project workdir. The decision never pauses and never fails the run for model
|
|
512
|
+
problems: a degraded outcome (feature switch off, no backend, error, timeout, low confidence)
|
|
513
|
+
prints `ok:true` with `degraded:true`, the declared `reason`, and `value = default`, and exits
|
|
514
|
+
`0` — route on the resultFile's `.value` with the declared file guards. Only an invalid options
|
|
515
|
+
schema exits `1` (fail closed), and usage errors exit `2`. The `action_runs` trace row is
|
|
516
|
+
best-effort exactly like `--action`.
|
|
517
|
+
|
|
473
518
|
- **At the run's declared terminal state** — before the driver reports the run complete, close the
|
|
474
519
|
row so a successful inline run is never left non-terminal for `spur workflow clean` to reap as
|
|
475
520
|
stale:
|
|
@@ -482,7 +527,7 @@ The driver reaches it through the existing run delegate (`$SETUP_SCRIPT`,
|
|
|
482
527
|
state is `done`; a run halted by a failing action under its error policy is `failed`.
|
|
483
528
|
|
|
484
529
|
**Best-effort at the action boundary only (ADR-117).** An `--action` persistence failure is
|
|
485
|
-
recorded — the delegate appends a `trace-emission-failed` line to `.spur/run/<run-id>.
|
|
530
|
+
recorded — the delegate appends a `trace-emission-failed` line to `.spur/run/<run-id>.md` and
|
|
486
531
|
prints `{"ok":false}` on stdout — and the run continues to its declared terminal state; the
|
|
487
532
|
delegate exits `0` for that outcome and the driver must never treat an emission failure as a run
|
|
488
533
|
failure, retry it in a loop, or substitute a hand-written row. The run-row closure (`--close`) is
|
|
@@ -198,11 +198,11 @@ task Design.
|
|
|
198
198
|
order (§4.5 rule 5 / sync trigger **T9**):
|
|
199
199
|
|
|
200
200
|
1. **Satellite first.** Write/update `docs/design/<slug>.md`. `<slug>` is the stable grep anchor —
|
|
201
|
-
derive it from the feature name (kebab-case), and **reuse the existing slug** on re-runs.
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
201
|
+
derive it from the feature name (kebab-case), and **reuse the existing slug** on re-runs. For a
|
|
202
|
+
new file use [document-authoring.md](document-authoring.md) and its design template; for an
|
|
203
|
+
existing file preserve its headings and anchors. Capture the chosen approach + one-line reason,
|
|
204
|
+
rejected alternatives, key interface/type **signatures** (not bodies), invariants, and the
|
|
205
|
+
surface it touches.
|
|
206
206
|
2. **Index second.** Add or update the satellite's row in `docs/04_DESIGN.md §0` (the `| Satellite |
|
|
207
207
|
Area | Status |` table) — pointer + one-line area + status only, never a restatement of the body.
|
|
208
208
|
|
|
@@ -277,6 +277,11 @@ design, plan, acceptance criteria, decisions, dependencies and premises present
|
|
|
277
277
|
non-placeholder so `spur task check <wbs> --json` exits 0. Write planning sections only, through
|
|
278
278
|
`spur task update <wbs> --section <Name> --from-file <file>` — never Solution, Testing, Review
|
|
279
279
|
or History. Record one checklist row per id, with concrete evidence of how you verified it.
|
|
280
|
+
The `premises` row passes only when each material premise was read against the current tree:
|
|
281
|
+
identify each material premise in the task Background, open the cited file at the cited line and
|
|
282
|
+
confirm the claim, then record the evidence as verified `path:line` citations — handoff-finalize
|
|
283
|
+
lints the row and degrades the task to ready refine when the evidence carries no citation or
|
|
284
|
+
cites a missing file or an out-of-range line.
|
|
280
285
|
Compute the planning digest with the project's own implementation when this is a monorepo
|
|
281
286
|
checkout — resolve the file with `spur task path <wbs> --json`, then run:
|
|
282
287
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
kind: design
|
|
3
|
+
title: <specific non-UI contract or system design>
|
|
4
|
+
status: proposed
|
|
5
|
+
created_at: YYYY-MM-DD
|
|
6
|
+
updated_at: YYYY-MM-DD
|
|
7
|
+
related: []
|
|
8
|
+
tags: []
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# <Specific non-UI contract or system design>
|
|
12
|
+
|
|
13
|
+
## 1. Issue and scope
|
|
14
|
+
|
|
15
|
+
<Specific issue or tasks this design addresses, observed impact, boundaries, and whether the solution is proposed or current. Link the owning records.>
|
|
16
|
+
|
|
17
|
+
## 2. Context and constraints
|
|
18
|
+
|
|
19
|
+
<Relevant current behavior, evidence for the issue, and constraints the solution must respect. Link to 03 for wider architecture.>
|
|
20
|
+
|
|
21
|
+
## 3. Solution
|
|
22
|
+
|
|
23
|
+
<Chosen approach and how it resolves the issue. Show ownership, boundaries, and flow; distinguish proposed behavior from implemented behavior.>
|
|
24
|
+
|
|
25
|
+
## 4. Contract and compatibility
|
|
26
|
+
|
|
27
|
+
<Observable inputs, outputs, defaults, errors, invariants, edge cases, and migration behavior needed to implement or use the solution. Omit inapplicable parts.>
|
|
28
|
+
|
|
29
|
+
## 5. Tradeoffs and open questions
|
|
30
|
+
|
|
31
|
+
<Why this solution was chosen, material costs or alternatives, and unresolved questions or follow-up. Link ADR decisions instead of restating them.>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
kind: plan
|
|
3
|
+
title: <specific title>
|
|
4
|
+
status: draft
|
|
5
|
+
created_at: YYYY-MM-DD
|
|
6
|
+
updated_at: YYYY-MM-DD
|
|
7
|
+
related: []
|
|
8
|
+
tags: []
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# <Specific title>
|
|
12
|
+
|
|
13
|
+
## 1. Objective and outcome
|
|
14
|
+
|
|
15
|
+
<Issue or tasks this plan addresses, intended result, scope, and how completion will be recognized. Link the owning feature or tasks.>
|
|
16
|
+
|
|
17
|
+
## 2. Premises and dependencies
|
|
18
|
+
|
|
19
|
+
<Facts, assumptions, prerequisites, decisions, and blockers that affect the sequence. Link evidence; mark unverified premises.>
|
|
20
|
+
|
|
21
|
+
## 3. Execution sequence
|
|
22
|
+
|
|
23
|
+
1. <Action, prerequisite, and tangible output or checkpoint. Name an owner when coordination matters.>
|
|
24
|
+
2. <Next action. Show dependencies and safe parallel work explicitly.>
|
|
25
|
+
|
|
26
|
+
## 4. Risks and verification
|
|
27
|
+
|
|
28
|
+
<What could change the sequence, the fallback or decision point, and how the intended result will be verified.>
|
|
29
|
+
|
|
30
|
+
## 5. Follow-up
|
|
31
|
+
|
|
32
|
+
<Handoff, remaining actions, and deferred work with owners or links when known. Omit if none.>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spur-doctor
|
|
3
|
-
description: "Evaluate spur artifacts from read-only
|
|
3
|
+
description: "Evaluate spur artifacts and plan/design Markdown from read-only evidence, reflect over sp:history-anatomy findings, and return a proposal table. Diagnoses artifacts, not runtime environments (that is spur agent doctor). Triggers: check artifact health, propose evolution, review legacy documents."
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
version: 1.0.0
|
|
6
6
|
metadata:
|
|
@@ -26,16 +26,19 @@ see_also:
|
|
|
26
26
|
# sp:spur-doctor — evaluate spur artifacts and propose changes
|
|
27
27
|
|
|
28
28
|
One cross-noun method (ADR-114, [spur artifact evolution](../../../../docs/design/spur-artifact-evolution.md)
|
|
29
|
-
§2): gather **read-only
|
|
30
|
-
**reflect** over `sp:history-anatomy` findings
|
|
31
|
-
**artifacts
|
|
29
|
+
§2): gather **read-only evidence** about tasks, features, rules, workflows, agent specs, and
|
|
30
|
+
plan/design Markdown; **reflect** over `sp:history-anatomy` findings; and return a
|
|
31
|
+
**proposal table**. It diagnoses spur artifacts — definitions, rules, corpus records and documents —
|
|
32
|
+
not runtime environments: whether an agent
|
|
32
33
|
binary, host session or tool install is healthy is `spur agent doctor`'s job, not this skill's.
|
|
33
34
|
|
|
34
35
|
## Read-only invariant
|
|
35
36
|
|
|
36
|
-
The doctor **writes nothing and names no mutating verb**. It performs no task, feature, rule
|
|
37
|
-
workflow write
|
|
38
|
-
([../spur-composer/SKILL.md](../spur-composer/SKILL.md)) applies
|
|
37
|
+
The doctor **writes nothing and names no mutating verb**. It performs no task, feature, rule,
|
|
38
|
+
workflow or document write. The operator accepts rows; `sp:spur-composer`
|
|
39
|
+
([../spur-composer/SKILL.md](../spur-composer/SKILL.md)) applies corpus rows, while a document
|
|
40
|
+
author applies plan/design rows using the
|
|
41
|
+
[spur-dev authoring guide](../spur-dev/references/document-authoring.md). A caller that wants a
|
|
39
42
|
record saves the returned table under `docs/reports/`; the doctor creates no artifact store.
|
|
40
43
|
|
|
41
44
|
- **History enters only through `sp:history-anatomy` findings.** Raw history records stay out
|
|
@@ -55,9 +58,51 @@ record saves the returned table under `docs/reports/`; the doctor creates no art
|
|
|
55
58
|
| workflow | `spur workflow validate --json` (findings by `level`), `node "$(superskill script path sp workflow-step-profile.mjs)" <workflow> --json` |
|
|
56
59
|
| agent spec | `spur agent list --specs --json` |
|
|
57
60
|
| history | A `sp:history-anatomy` report ([../history-anatomy/SKILL.md](../history-anatomy/SKILL.md)), never raw history records |
|
|
61
|
+
| plan/design Markdown | The file itself, the project constitution, the relevant spur-dev template, and inbound index/links; no new CLI needed |
|
|
58
62
|
|
|
59
63
|
Every row of a proposal cites the evidence it rests on. No anchor, no proposal.
|
|
60
64
|
|
|
65
|
+
## Legacy plan and design review
|
|
66
|
+
|
|
67
|
+
Enumerate `docs/plans/*.md` and `docs/design/*.md` with `rg --files` and sort the paths. Include
|
|
68
|
+
every Markdown path in the review; JSON and other files are outside this contract. For a large set,
|
|
69
|
+
freeze the list and split it into named path groups by record type (for example
|
|
70
|
+
`docs/plans/*-brainstorm.md`, other plans, designs), at most ~40 files each, and combine their
|
|
71
|
+
coverage lists. Read each file and the project constitution before judging it. Report scanned paths
|
|
72
|
+
and counts of proposals and no-ops, so an omitted file is visible.
|
|
73
|
+
|
|
74
|
+
Compare each plan with the [plan template](../spur-dev/templates/plan.md) and each design with the
|
|
75
|
+
[design template](../spur-dev/templates/design.md), using the
|
|
76
|
+
[authoring guide](../spur-dev/references/document-authoring.md) for meaning. Look for missing or
|
|
77
|
+
unsupported `kind`, title, status, dates, material related links or useful tags; unclear objective,
|
|
78
|
+
premises, execution sequence or follow-up in a plan; unclear issue, context, solution, contract or
|
|
79
|
+
compatibility in a design; and a missing `04_DESIGN.md` pointer for a design satellite.
|
|
80
|
+
These are **review prompts**, not format errors. Keep specialized sections required by a producing workflow.
|
|
81
|
+
|
|
82
|
+
Judge metadata against the authoring guide's **frontmatter vocabulary** and **legacy metadata
|
|
83
|
+
upgrade** rules, so every row in a batch makes the same choice: the same key mapping, `title` from
|
|
84
|
+
the H1, `related` from owner keys or linking feature/task records, `created_at` source order
|
|
85
|
+
(legacy `date`, filename prefix, first commit, else flag), status mapping only when unambiguous,
|
|
86
|
+
and tags in record-type → feature → area order from the shared list. A row whose status or tag needs
|
|
87
|
+
judgment says so in `change` instead of picking a value. Never propose renumbering or renaming a
|
|
88
|
+
legacy heading.
|
|
89
|
+
|
|
90
|
+
Propose only evidence-backed, useful edits. A proposal names the exact file and heading or
|
|
91
|
+
frontmatter field, cites a line and the governing rule, and says what can be inferred and what
|
|
92
|
+
needs an operator answer. Preserve filenames, anchors, original dates, decisions and historical
|
|
93
|
+
status. Do not silently promote a proposal to current behavior, invent metadata, or rewrite a
|
|
94
|
+
whole file to fit a template. A conforming or intentionally specialized file is a no-op.
|
|
95
|
+
|
|
96
|
+
The `apply` cell for a document row points to the spur-dev authoring guide; the author edits an
|
|
97
|
+
accepted row in place, then runs `sp:doc-evolve` sync-check for affected key documents and verifies
|
|
98
|
+
links, headings, frontmatter and the `04` index when applicable. No bulk conversion or strict
|
|
99
|
+
validator is required for old files.
|
|
100
|
+
|
|
101
|
+
For a batch, the caller saves each group's table as
|
|
102
|
+
`docs/reports/YYYY-MM-DD-<group>-doc-upgrade-review.md`. After the operator accepts rows, the author
|
|
103
|
+
applies one group's metadata-only rows together and commits them as one change; body restructuring
|
|
104
|
+
rows stay per file. Flagged rows wait for the operator's answer.
|
|
105
|
+
|
|
61
106
|
## Workflow step profile and cache-window flags
|
|
62
107
|
|
|
63
108
|
The step profile (`plugins/sp/scripts/workflow-step-profile`, ADR-065 plugin entrypoint) reads
|
|
@@ -114,25 +159,26 @@ Return one row per actionable finding, with exactly these columns:
|
|
|
114
159
|
| Column | Content |
|
|
115
160
|
| --- | --- |
|
|
116
161
|
| `key` | The finding key, or `<noun>:<id>:<check>` for an artifact finding |
|
|
117
|
-
| `evidence` |
|
|
162
|
+
| `evidence` | CLI output, report section, or document path and line the row rests on |
|
|
118
163
|
| `action` | One action class from the reflection map (or the per-noun evaluation) |
|
|
119
164
|
| `change` | The proposed change, in one line |
|
|
120
|
-
| `apply` | The `spur
|
|
165
|
+
| `apply` | The `spur`/composer route for corpus rows or the spur-dev authoring guide for document rows |
|
|
121
166
|
| `verify` | The evidence to re-run after applying |
|
|
122
167
|
|
|
123
168
|
Rules:
|
|
124
169
|
|
|
125
|
-
-
|
|
126
|
-
|
|
170
|
+
- Corpus `apply` routes use a `spur` verb or gated composer step; document rows use the spur-dev
|
|
171
|
+
authoring guide. The doctor itself never edits either surface. Shared-workflow rows route
|
|
172
|
+
through the composition ladder's shared step.
|
|
127
173
|
- A `task` row carries the finding `key` in the task body (the history-anatomy handoff route).
|
|
128
174
|
- Rows are proposals only. No applied change, diff, or command output claimed as run.
|
|
129
175
|
|
|
130
176
|
## What this skill is not
|
|
131
177
|
|
|
132
|
-
- **Not the applier.** `sp:spur-composer` applies accepted rows
|
|
133
|
-
|
|
178
|
+
- **Not the applier.** `sp:spur-composer` applies accepted corpus rows and document authors apply
|
|
179
|
+
accepted document rows; this skill performs no write.
|
|
134
180
|
- **Not a runtime doctor.** Environment, binary and session readiness belong to
|
|
135
|
-
`spur agent doctor`; this skill diagnoses
|
|
181
|
+
`spur agent doctor`; this skill diagnoses artifacts from read-only evidence.
|
|
136
182
|
- **Not a history interpreter.** Findings come from `sp:history-anatomy` reports, never from raw
|
|
137
183
|
history records.
|
|
138
184
|
- **Not a loop.** Recurring evolution passes belong to `sp:super-planner` or a workflow.
|
|
@@ -135,6 +135,10 @@
|
|
|
135
135
|
"type": "string",
|
|
136
136
|
"minLength": 1
|
|
137
137
|
},
|
|
138
|
+
"terminalReason": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"description": "Closed terminal-reason enum declared when this edge finalizes the run (0937 R3; required for edges into failureStates)."
|
|
141
|
+
},
|
|
138
142
|
"description": {
|
|
139
143
|
"type": "string"
|
|
140
144
|
},
|