@gobing-ai/spur 0.3.86 → 0.3.88
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/config.example.yaml +9 -0
- package/config/plugin-scripts.json +4 -0
- package/config/rules/strict/runtime-boundaries.yaml +1 -0
- package/config/templates/feature/default.md +2 -0
- package/config/templates/task/brainstorm.md +2 -2
- package/config/templates/task/feature-impl.md +2 -2
- package/config/templates/task/issue.md +2 -2
- package/config/templates/task/meta.md +2 -2
- package/config/templates/task/review.md +2 -2
- package/config/templates/task/standard.md +2 -2
- package/config/workflow-candidates.json +13 -35
- package/config/workflows/feature-lifecycle.yaml +6 -0
- package/config/workflows/feature-verification.yaml +6 -5
- package/config/workflows/idea-pipeline.yaml +89 -36
- package/config/workflows/task-pipeline.yaml +25 -0
- package/package.json +9 -9
- package/plugins/sp/README.md +9 -6
- package/plugins/sp/commands/dev-idea.md +9 -2
- package/plugins/sp/commands/dev-refactor.md +33 -0
- package/plugins/sp/commands/dev-refine.md +25 -7
- package/plugins/sp/commands/dev-refineall.md +9 -6
- package/plugins/sp/lib/idea-handoff.generated.mjs +160 -152
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/roles.md +1 -1
- package/plugins/sp/scripts/idea-coverage-check.ts +168 -0
- package/plugins/sp/scripts/inline-pipeline-parity-check.ts +114 -3
- package/plugins/sp/scripts/inline-run-setup.ts +28 -18
- package/plugins/sp/skills/brainstorm/SKILL.md +4 -0
- package/plugins/sp/skills/code-refactoring/SKILL.md +155 -0
- package/plugins/sp/skills/code-refactoring/references/finding-schema.md +74 -0
- package/plugins/sp/skills/code-refactoring/references/fix-ladder.md +52 -0
- package/plugins/sp/skills/code-refactoring/references/focus-detection.md +44 -0
- package/plugins/sp/skills/code-refactoring/references/refactor-finding.schema.json +95 -0
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +23 -16
- package/plugins/sp/skills/spur-cli/references/agent.md +92 -9
- package/plugins/sp/skills/spur-cli/references/features/acceptance-criteria.md +4 -2
- package/plugins/sp/skills/spur-cli/references/features.md +6 -1
- package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +2 -2
- package/plugins/sp/skills/spur-cli/references/workflows/operations.md +3 -3
- package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +1 -1
- package/plugins/sp/skills/spur-dev/SKILL.md +33 -33
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +24 -0
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +99 -26
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +27 -5
- package/plugins/sp/skills/spur-dev/references/idea-evaluation.md +11 -1
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +33 -1
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +10 -6
- package/plugins/sp/skills/taste-refactoring-api/SKILL.md +44 -1
- package/plugins/sp/skills/taste-refactoring-api/references/protocol-modes.md +31 -0
- package/plugins/sp/skills/taste-refactoring-architect/SKILL.md +43 -0
- package/plugins/sp/skills/taste-refactoring-tests/SKILL.md +42 -0
- package/plugins/sp/skills/taste-refactoring-ui/SKILL.md +43 -0
- package/schemas/spur-config.schema.json +14 -2
- package/schemas/task-batch.schema.json +2 -2
- package/spur.js +2012 -487
- package/web/_astro/{BoardApp.yBBcFXWP.js → BoardApp.CDUcHlTJ.js} +67 -67
- package/web/_astro/BoardApp.CaCGU_uX.js +1 -0
- package/web/_astro/{TaskDetail.DqFJbRFc.js → TaskDetail.DwTmbQp5.js} +1 -1
- package/web/_astro/{arc.DL-BpHoi.js → arc.BzF71EFI.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.9IdQYyDq.js → architectureDiagram-3BPJPVTR.jvdDahWM.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.BKsFCqTl.js → blockDiagram-GPEHLZMM.zSg4AmFD.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.DhwI0dh1.js → c4Diagram-AAUBKEIU.BkUIUQWH.js} +1 -1
- package/web/_astro/channel.SSVY0JPQ.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.B3QVmQ9S.js → chunk-2J33WTMH.DvfQ_f50.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.DBSuqs9F.js → chunk-4BX2VUAB.DuI4gQqX.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.BSYTWAYD.js → chunk-55IACEB6.D3BWBOpF.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.cWVuxXfS.js → chunk-727SXJPM.3QSi0a9M.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.DpU_Ob3d.js → chunk-AQP2D5EJ.xazCQrAF.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.BykFkyji.js → chunk-FMBD7UC4.B2g6u4rA.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.DwgHlMdY.js → chunk-ND2GUHAM.wWwWs99t.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.CusXUGWM.js → chunk-QZHKN3VN.BD5g3qa9.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.fx0ObzkN.js → classDiagram-4FO5ZUOK.C7CzCdsX.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.fx0ObzkN.js → classDiagram-v2-Q7XG4LA2.C7CzCdsX.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.Z4HgOlsd.js → cose-bilkent-S5V4N54A.Xyiau0gw.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.B5dIZHJu.js → cynefin-OW5HDTMX.BeC5MWas.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.DT70Q_Yw.js → dagre-BM42HDAG.yZbMN9vc.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.DqHA3XBF.js → diagram-2AECGRRQ.Cmo2zQM-.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.BmCem957.js → diagram-5GNKFQAL.D033eSVi.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.sn0-hrE0.js → diagram-KO2AKTUF.CR6k3Y3G.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.BSHe9tVc.js → diagram-LMA3HP47.x7mwu8jz.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.DHIc-86k.js → diagram-OG6HWLK6.D8aTTvUr.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.Bxayrs7v.js → erDiagram-TEJ5UH35.BoBqcKXQ.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.BkzoE_5I.js → flowDiagram-I6XJVG4X.D3mTQdrU.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.okT6CvTo.js → ganttDiagram-6RSMTGT7.H-cqgIh-.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.CJuYbhC7.js → gitGraphDiagram-PVQCEYII.B6s9zbfC.js} +1 -1
- package/web/_astro/{infoDiagram-5YYISTIA.RqLy7nBo.js → infoDiagram-5YYISTIA.BzgCoV6P.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.BwIcoagw.js → ishikawaDiagram-YF4QCWOH.BZzVhy1-.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.UB1VbWtH.js → journeyDiagram-JHISSGLW.BV3195Py.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.AaxMKpTk.js → kanban-definition-UN3LZRKU.BjRd2DWz.js} +1 -1
- package/web/_astro/{linear.Nv_xOUjP.js → linear.BILTgS5N.js} +1 -1
- package/web/_astro/{mermaid.core.Bc4LqQgX.js → mermaid.core.DBy_WKeW.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.oKUvU_qi.js → mindmap-definition-RKZ34NQL.BiEjaI4-.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.DQk0oo03.js → pieDiagram-4H26LBE5.i_8V5pIn.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.BdDjESDa.js → quadrantDiagram-W4KKPZXB.BWaW3MHn.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.C2u9hUeH.js → requirementDiagram-4Y6WPE33.CzddBbtg.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.CDEoiJST.js → sankeyDiagram-5OEKKPKP.X2ww0e-D.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.D_hT_GAT.js → sequenceDiagram-3UESZ5HK.DSA4kTcc.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.DI8RYG0b.js → stateDiagram-AJRCARHV.D0DtFSpR.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.Bkxz4DnP.js → stateDiagram-v2-BHNVJYJU.BfQq0zQv.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.DSY-kH3-.js → timeline-definition-PNZ67QCA.Dmlrgi1m.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.CpaDtuGr.js → vennDiagram-CIIHVFJN.D5mpl00Z.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.DujQWvo8.js → wardleyDiagram-YWT4CUSO.Df4BdzO4.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.DcM5Y4b9.js → xychartDiagram-2RQKCTM6.DiTRreKN.js} +1 -1
- package/web/index.html +1 -1
- package/web/_astro/BoardApp.CJiqp5pS.js +0 -1
- package/web/_astro/channel.CX5453qQ.js +0 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Fix ladder and eligibility
|
|
2
|
+
|
|
3
|
+
Authority: `docs/design/dev-refactor-command.md` §6. The ladder ranks what may be applied
|
|
4
|
+
mechanically versus what needs an operator answer. It reuses the repository severity meaning
|
|
5
|
+
(P1 blocker / P2 major — see [finding-schema.md](./finding-schema.md)) so `--fix blockers-first`
|
|
6
|
+
keeps the glossary sense.
|
|
7
|
+
|
|
8
|
+
## Rungs
|
|
9
|
+
|
|
10
|
+
| Rung | Example | `preservation` | `fix_eligibility` |
|
|
11
|
+
| --- | --- | --- | --- |
|
|
12
|
+
| Rename / move / dedupe / inline with identical behavior | A3 consolidate, T3 fixture cleanup, ui token normalization | preserving | `auto` |
|
|
13
|
+
| Add missing test, contract field, a11y attribute | T4, api additive, ui P3 | preserving | `auto` |
|
|
14
|
+
| Remove dead code with zero references | A1 direct removal proven dead | preserving | `auto` only when a reference search finds no caller; else `confirm` |
|
|
15
|
+
| Remove a test, endpoint, control, or code path with callers | T1, A1/A2 live, api removal, ui control removal | cutting | `confirm` |
|
|
16
|
+
| Change a contract or observable behavior | api breaking, A5–A7 seam moves | breaking | `confirm` (or `suggest` when multi-task) |
|
|
17
|
+
| Architectural migration plan | A6–A7, ADR candidates | — | `suggest` |
|
|
18
|
+
|
|
19
|
+
Hard rules:
|
|
20
|
+
|
|
21
|
+
- An `auto` fix **never deletes or weakens a test** (no skipped assertions, no loosened
|
|
22
|
+
expectations, no deleted cases).
|
|
23
|
+
- `cutting` and `breaking` findings are **never `auto`** and **never below P2**.
|
|
24
|
+
|
|
25
|
+
## Apply policies (`--fix`)
|
|
26
|
+
|
|
27
|
+
| Policy | Meaning |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| `none` (default) | Write both artifacts, perform no edit. |
|
|
30
|
+
| `blockers-first` | Apply P1/P2 findings with `fix_eligibility: auto`. |
|
|
31
|
+
| `all` | Apply every `auto` finding, then queue every `confirm` finding for the taste gate. |
|
|
32
|
+
|
|
33
|
+
## Apply loop (mirrors `sp:code-simplification` / `dev-simplify`: test-after-each, revert on regression)
|
|
34
|
+
|
|
35
|
+
1. **Green baseline first.** Run the `--check` command before any edit. A red baseline is a hard
|
|
36
|
+
stop: write the report, apply nothing.
|
|
37
|
+
2. **One finding at a time.** Apply a single finding (highest severity first: P1 → P4), limited to
|
|
38
|
+
the finding's evidence files.
|
|
39
|
+
3. **Re-run `--check`.**
|
|
40
|
+
- Passes → mark the finding `status: applied`, continue with the next.
|
|
41
|
+
- Fails → revert **only that finding's own edits**: reverse-apply the exact hunks the finding
|
|
42
|
+
introduced (keep the finding's diff; `git apply -R`, or re-edit the specific lines). Never
|
|
43
|
+
`git checkout -- <file>` a whole evidence file — a later finding may share that file with an
|
|
44
|
+
earlier **applied** finding, and a file-level checkout would revert that applied work too.
|
|
45
|
+
Mark the finding `status: reverted`, continue with the next. Never revert another finding's
|
|
46
|
+
work.
|
|
47
|
+
4. After the last finding: re-run the structural check on the findings artifact, then write the
|
|
48
|
+
report (see `SKILL.md` phase 5).
|
|
49
|
+
|
|
50
|
+
`confirm` findings in the `all` policy follow the taste gate: applied only after an explicit
|
|
51
|
+
operator `yes` (see the gate matrix in `SKILL.md`). A declined finding is marked `status: rejected`
|
|
52
|
+
or `status: deferred` (headless) per the operator answer — never silently dropped.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Focus auto-detection
|
|
2
|
+
|
|
3
|
+
Authority: `docs/design/dev-refactor-command.md` §8. Lens selection is **deterministic globs, not
|
|
4
|
+
model judgment**, so a misroute is auditable: re-running detection on the same tree yields the same
|
|
5
|
+
set.
|
|
6
|
+
|
|
7
|
+
## Classification
|
|
8
|
+
|
|
9
|
+
First matching table row per file; the lens set is the **union** across all files in `--scope`.
|
|
10
|
+
|
|
11
|
+
| Order | Glob | Lens |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| 1 | `**/tests/**`, `**/*.test.*`, `**/*.spec.*`, `**/__tests__/**` | tests |
|
|
14
|
+
| 2 | `apps/web/**`, `**/*.astro`, `**/*.tsx`, `**/*.jsx`, `**/*.css`, `**/*.vue` | ui |
|
|
15
|
+
| 3 | `packages/contracts/**`, `**/routes/**`, `**/openapi*`, `**/*.proto`, `**/*.graphql`, `apps/cli/src/commands/**`, `apps/server/src/**` | api |
|
|
16
|
+
| 4 | anything else (fallback) | architect |
|
|
17
|
+
|
|
18
|
+
Rules:
|
|
19
|
+
|
|
20
|
+
- Evaluate rows in order; a file matching an earlier row is never classified by a later one
|
|
21
|
+
(a `*.test.tsx` file is a **tests** file, not ui).
|
|
22
|
+
- Every file in scope resolves to exactly one lens; the scope set is the union of resolved lenses.
|
|
23
|
+
- An empty scope set (no files matched anything) collapses to the `architect` fallback for the
|
|
24
|
+
whole scope only when scope itself is non-empty; an empty scope is a resolve-phase error.
|
|
25
|
+
|
|
26
|
+
## `--focus` flag
|
|
27
|
+
|
|
28
|
+
| Value | Behavior |
|
|
29
|
+
| --- | --- |
|
|
30
|
+
| `auto` (default) | Run detection above and use its lens set. |
|
|
31
|
+
| single lens (`api` \| `architect` \| `tests` \| `ui`) | Run only that lens. |
|
|
32
|
+
| comma list (`api,tests`) | Run exactly the listed lenses, in the operator's order. |
|
|
33
|
+
|
|
34
|
+
## Report before run
|
|
35
|
+
|
|
36
|
+
The resolved lens set **must be reported before any lens runs** — one line naming the chosen
|
|
37
|
+
lenses and, for `auto`, the per-file counts that selected them, e.g.:
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
focus=auto → lenses: tests (14 files), api (3 files)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Under `--auto` this line is still written (to the report and the session output); what `--auto`
|
|
44
|
+
skips is only the *interactive* confirmation of scope and lens set, never the report.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://spur.gobing.ai/schemas/refactor-finding.schema.json",
|
|
4
|
+
"title": "Refactor findings artifact (bare array of findings, design H13 §4)",
|
|
5
|
+
"description": "One JSON object per refactoring finding; the artifact written to .spur/run/<run-id>-refactor-findings.json is a bare array of these objects.",
|
|
6
|
+
"type": "array",
|
|
7
|
+
"items": {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"additionalProperties": false,
|
|
10
|
+
"required": [
|
|
11
|
+
"id",
|
|
12
|
+
"focus",
|
|
13
|
+
"severity",
|
|
14
|
+
"rung",
|
|
15
|
+
"title",
|
|
16
|
+
"evidence",
|
|
17
|
+
"preservation",
|
|
18
|
+
"fix_eligibility",
|
|
19
|
+
"proposal",
|
|
20
|
+
"verify",
|
|
21
|
+
"status"
|
|
22
|
+
],
|
|
23
|
+
"properties": {
|
|
24
|
+
"id": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"pattern": "^RF-(api|architect|tests|ui)-[0-9]{3}$",
|
|
27
|
+
"description": "RF-<focus>-<nnn>, e.g. RF-api-001."
|
|
28
|
+
},
|
|
29
|
+
"focus": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"enum": ["api", "architect", "tests", "ui"],
|
|
32
|
+
"description": "The lens that produced the finding."
|
|
33
|
+
},
|
|
34
|
+
"severity": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"enum": ["P1", "P2", "P3", "P4"],
|
|
37
|
+
"description": "Repository-authority severity after the lens-native → P1–P4 map (finding-schema.md §5). P0 is outside the map."
|
|
38
|
+
},
|
|
39
|
+
"rung": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "Lens-native rung kept verbatim: architect A0–A7, tests T0–T7, api compatibility class, ui pass name."
|
|
42
|
+
},
|
|
43
|
+
"title": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"minLength": 1,
|
|
46
|
+
"description": "One line."
|
|
47
|
+
},
|
|
48
|
+
"evidence": {
|
|
49
|
+
"type": "array",
|
|
50
|
+
"minItems": 1,
|
|
51
|
+
"items": {
|
|
52
|
+
"type": "object",
|
|
53
|
+
"additionalProperties": false,
|
|
54
|
+
"required": ["file", "line"],
|
|
55
|
+
"properties": {
|
|
56
|
+
"file": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"minLength": 1
|
|
59
|
+
},
|
|
60
|
+
"line": {
|
|
61
|
+
"type": "integer",
|
|
62
|
+
"minimum": 1
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"description": "At least one file:line inside --scope."
|
|
67
|
+
},
|
|
68
|
+
"preservation": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"enum": ["preserving", "cutting", "breaking"],
|
|
71
|
+
"description": "preserving: behavior identical; cutting: a user-visible feature/test/endpoint/control is removed; breaking: contract or behavior changes for a consumer."
|
|
72
|
+
},
|
|
73
|
+
"fix_eligibility": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"enum": ["auto", "confirm", "suggest"],
|
|
76
|
+
"description": "auto: mechanical, behavior-preserving, checkable; confirm: needs an operator answer; suggest: report only."
|
|
77
|
+
},
|
|
78
|
+
"proposal": {
|
|
79
|
+
"type": "string",
|
|
80
|
+
"minLength": 1,
|
|
81
|
+
"description": "What to change, imperative."
|
|
82
|
+
},
|
|
83
|
+
"verify": {
|
|
84
|
+
"type": "string",
|
|
85
|
+
"minLength": 1,
|
|
86
|
+
"description": "Command or check that proves the fix; defaults to the --check command."
|
|
87
|
+
},
|
|
88
|
+
"status": {
|
|
89
|
+
"type": "string",
|
|
90
|
+
"enum": ["open", "applied", "reverted", "deferred", "rejected"],
|
|
91
|
+
"description": "Lifecycle of the finding through the gate/apply loop."
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -134,14 +134,13 @@ single run-on paragraph on render, even though they look like separate items in
|
|
|
134
134
|
"requirements": "- [ ] R1. <text>\n- [ ] R2. <text>\n- [ ] R3. <text>"
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
`R1. <text>\nR2. <text>`
|
|
138
|
-
|
|
139
|
-
as an unreadable paragraph in Board preview. Do not rely on `check` to catch this. Keep the `Rn.`
|
|
137
|
+
`R1. <text>\nR2. <text>` and `- R1 — <text>` are the traps: `spur task check` reports
|
|
138
|
+
`L3.requirements-checkbox` and a bare run renders as one paragraph in Board preview. Keep the `Rn.`
|
|
140
139
|
(period) token inside the marker so R-numbering still resolves; see the canonical rule in
|
|
141
140
|
`sp:spur-dev` → `references/planning-workflow.md`.
|
|
142
141
|
|
|
143
142
|
Applies to the other body fields too: `plan` as an ordered list (`1. …\n2. …`), `acceptance_criteria`
|
|
144
|
-
as
|
|
143
|
+
as `- [ ] AC1 — <feature scenario title without its R-number>` bullets (see § Idea-pipeline emission), and any enumeration inside `background` or `design` as a
|
|
145
144
|
`- ` list.
|
|
146
145
|
|
|
147
146
|
### Design at create (default) vs `--skip-design`
|
|
@@ -207,20 +206,22 @@ scenarios are numbered in the **feature's** namespace. Both appear in a task's
|
|
|
207
206
|
|
|
208
207
|
The rule:
|
|
209
208
|
|
|
210
|
-
- **
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
209
|
+
- **Task AC items are numbered `AC1, AC2, …` (task-local), never `R<n>`** — `R<n>` is the
|
|
210
|
+
Requirements namespace, and two R-numberings in one file is how they get confused.
|
|
211
|
+
- **Bind a scenario to the task requirement it covers with `(req: R<n>)`** —
|
|
212
|
+
`Scenario: AC1 — <observable outcome> (req: R3)` (semicolons for several: `R1; R2`). Tasks
|
|
213
|
+
declaring `ac_numbering: task-local` get these cross-checked by `spur task check`
|
|
214
|
+
(`L3.ac-requirement-coverage`): a requirement with no scenario, or a scenario citing a requirement
|
|
215
|
+
that does not exist, is reported.
|
|
216
|
+
- **Scenarios carried from the feature (for DD-09 traceability) copy the title text after the
|
|
217
|
+
feature's `R<n> —`** — `- [ ] AC2 — <title>`. `normalizeTitle`
|
|
218
|
+
(`packages/domain/src/bdd/coverage.ts`) strips both `AC\d+` and `R\d+` before matching, so the
|
|
219
|
+
prefix is invisible to feature coverage; the feature's number is never read as a task id.
|
|
219
220
|
|
|
220
221
|
**Legacy tasks are exempt.** Most existing tasks predate this and copied feature AC wholesale,
|
|
221
222
|
carrying the feature's numbers. The coverage check is opt-in precisely so they emit nothing —
|
|
222
|
-
absent `ac_numbering`, only DD-09 applies.
|
|
223
|
-
break traceability. New tasks get `ac_numbering: task-local` from the templates automatically;
|
|
223
|
+
absent `ac_numbering`, only DD-09 applies. Legacy `Scenario: R<n> —` titles still bind by prefix, so
|
|
224
|
+
opting an old task in cannot break traceability. New tasks get `ac_numbering: task-local` from the templates automatically;
|
|
224
225
|
`spur task update <wbs> --ac-numbering task-local` opts in an existing one.
|
|
225
226
|
|
|
226
227
|
Edge-case scenarios may map to tasks, merge into a sibling, or be deferred. Record deferrals
|
|
@@ -523,7 +524,7 @@ The payload is a top-level JSON **array** (no `tasks` wrapper):
|
|
|
523
524
|
"requirements": "- [ ] R1. Accept a title and an optional description on POST /tasks.\n- [ ] R2. Reject an empty title with a 400 and a reason.\n- [ ] R3. Allocate the task file through the CLI-gated write path.",
|
|
524
525
|
"design": "Approach: POST /tasks via existing TaskService.create.\nRejected: ad-hoc SQL in handler.\nInvariants: CLI-gated corpus writes only.",
|
|
525
526
|
"plan": "1. Contract\n2. Handler\n3. Tests",
|
|
526
|
-
"acceptance_criteria": "
|
|
527
|
+
"acceptance_criteria": "- [ ] AC1 — User can create a task with required fields"
|
|
527
528
|
},
|
|
528
529
|
{
|
|
529
530
|
"name": "Implement task listing endpoint",
|
|
@@ -559,6 +560,12 @@ fields and normal default planning fills them from your analysis; the per-task r
|
|
|
559
560
|
batch-create still deepens them when a task needs more detail. Validate locally against the
|
|
560
561
|
schema before emitting.
|
|
561
562
|
|
|
563
|
+
**Pass the deterministic task check.** Each `acceptance_criteria` bullet must be an exact feature
|
|
564
|
+
scenario title (L4.uncovered-task-scenario); add task-local checks as prose after the bullets, not
|
|
565
|
+
as extra bullets. No section body may use `HITL`, `approval`/`approved`, `merged`/`merge event`,
|
|
566
|
+
`content-gate`, `GATED`, or `capstone` as standalone words (L4.gate-language) — say "operator
|
|
567
|
+
answer" / "accepted" instead, and keep enum values out of that list too.
|
|
568
|
+
|
|
562
569
|
**The order sidecar.** Also emit the private task-order sidecar at
|
|
563
570
|
`.spur/run/<runId>-idea-task-order.json`: a JSON array (one entry per batch item) of
|
|
564
571
|
`{ name: <exact batch item name>, depends_on_names: [<batch item names>] }` declaring
|
|
@@ -23,12 +23,14 @@ that before using `run` for fan-out dispatch.
|
|
|
23
23
|
| ---- | ------- | --------- |
|
|
24
24
|
| `run <prompt>` | Execute a prompt or slash command via a coding agent | `--agent <name>` `--spec <id>` `--model <name>` `--mode <mode>` `--continue` `--cwd <path>` `--drain` `--json` |
|
|
25
25
|
| `wait [<specId>]` | Identity-pinned wait for an occupant run to reach a lifecycle state (G4 wave 2; `--role` selector per 0685) | `--role <name>` `--run <runId>` `--until <state>...` `--timeout <ms>` `--json` |
|
|
26
|
-
| `list` | List detected coding agents, or agent specs with `--specs` (live run status merged from `spur serve`) | `--specs` `--server <url>` `--json` |
|
|
26
|
+
| `list` | List detected coding agents, or agent specs with `--specs` (live run status + member session merged from `spur serve`) | `--specs` `--server <url>` `--json` |
|
|
27
|
+
| `status` | Agent specs with live process status and member session (requires `spur serve`) | `--server <url>` `--json` |
|
|
27
28
|
| `doctor [agent]` | Check agent readiness | `--json` `--probe-health` `--force-refresh` |
|
|
29
|
+
| `usage` | Run-once provider usage capture (codexbar) → quota-owned availability refresh; scheduled externally | `--dry-run` `--source <name>` `--json` |
|
|
28
30
|
| `start <spec-id>` | Start a supervised agent process (requires `spur serve`) | `--server <url>` `--json` |
|
|
29
31
|
| `stop <spec-id>` | Stop a supervised agent process (requires `spur serve`) | `--server <url>` `--json` |
|
|
30
32
|
|
|
31
|
-
`list`, `doctor`, `run`, `wait`, `start`, and `stop` accept `--json` plus `--json-envelope`. The hidden
|
|
33
|
+
`list`, `status`, `doctor`, `run`, `wait`, `start`, and `stop` accept `--json` plus `--json-envelope`. The hidden
|
|
32
34
|
`loop` is a supervisor-internal process surface. **Exit codes:** `0` success, `1` failure, and `2`
|
|
33
35
|
invalid usage; `run` can also propagate the invoked agent's non-zero result.
|
|
34
36
|
|
|
@@ -141,16 +143,30 @@ spur agent list --json # machine-readable
|
|
|
141
143
|
Without `--specs`, lists coding agents detected on the host (by binary on `PATH`). With `--specs`,
|
|
142
144
|
lists agent specs (`.spur/agents/*.yaml`) **with live run status merged from the server's
|
|
143
145
|
supervisor**: each row carries a trailing status column
|
|
144
|
-
(`running` / `stopped` / `errored` / `unknown`)
|
|
145
|
-
|
|
146
|
+
(`running` / `stopped` / `errored` / `unknown`), `pid=<n>` where a process exists, and the member
|
|
147
|
+
session (0897): the session mode plus a shortened resume id (`resume id=3f9c2a1d`), or `-` when the
|
|
148
|
+
member has no recorded session. When `spur serve` is unreachable, the listing falls back to all
|
|
149
|
+
`stopped` with a stderr warning. `--server <url>`
|
|
146
150
|
(default `http://localhost:3000/api`) targets the supervisor API.
|
|
147
151
|
|
|
148
152
|
```bash
|
|
149
153
|
spur agent list --specs
|
|
150
|
-
# planner claude reviewer claude plans the work running pid=4132
|
|
151
|
-
# worker-1 pi worker pi implements stopped
|
|
154
|
+
# planner claude reviewer claude plans the work running pid=4132 resume id=3f9c2a1d
|
|
155
|
+
# worker-1 pi worker pi implements stopped one-shot
|
|
152
156
|
```
|
|
153
157
|
|
|
158
|
+
## `status` - live status + member session per spec
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
spur agent status # id, type, status, pid, session — one row per spec
|
|
162
|
+
spur agent status --json # full objects, session carried whole ({ mode, id })
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Reads the same supervisor feed as `list --specs` (liveness **and** session come from
|
|
166
|
+
`GET /api/processes`; the served project's ledger is the source of the session state). An
|
|
167
|
+
unreachable server reports every spec `stopped` with no session. See
|
|
168
|
+
[Member sessions](#member-sessions-g66) for what the modes mean.
|
|
169
|
+
|
|
154
170
|
## `doctor` - readiness check
|
|
155
171
|
|
|
156
172
|
```bash
|
|
@@ -161,9 +177,21 @@ spur agent doctor --json # machine-readable (role selector: elected-first or
|
|
|
161
177
|
```
|
|
162
178
|
|
|
163
179
|
Checks whether each agent is installed and ready to run. Text mode renders a capability table —
|
|
164
|
-
`STATUS EXECUTOR AGENT MODEL TIER VERSION ROLES` where TIER is the executor's *capability* tier
|
|
165
|
-
(`cheap|standard|capable-*`), MODEL the pinned config model (`—` when undeclared),
|
|
166
|
-
candidate pipeline roles with `*` on the elected one
|
|
180
|
+
`STATUS EXECUTOR AGENT MODEL TIER VERSION CAPS ROLES OWNER SINCE REASON` where TIER is the executor's *capability* tier
|
|
181
|
+
(`cheap|standard|capable-*`), MODEL the pinned config model (`—` when undeclared), ROLES lists
|
|
182
|
+
candidate pipeline roles with `*` on the elected one, CAPS is the runner-declared session
|
|
183
|
+
capability for the underlying agent binary (`r`esume/`d`ir/`s`tdin/`o`utput as ✓/✗; `—` when the
|
|
184
|
+
binary is unknown to the runner; a trailing `⚠` when the detected version core differs from the
|
|
185
|
+
record's `verifiedAgainst` core — branding decorations are not drift, and a record/detection with
|
|
186
|
+
no version core (e.g. `unverified (CLI not installed)`) is unverifiable and never warns; a stale
|
|
187
|
+
executor also emits a `capability-declaration-stale` warning
|
|
188
|
+
on stderr in text mode), and OWNER/SINCE/REASON (0893) show availability provenance on `disabled`
|
|
189
|
+
rows — bare `disabled: true` renders owner `operator` with `—` since/reason; object-form disables
|
|
190
|
+
render their recorded values. A `usage:` footer reports the `agent usage` snapshot (`capturedAt
|
|
191
|
+
(age)`, `(stale)` past 6 h, or `usage: none` when the producer has never run). `--json` stays
|
|
192
|
+
stderr-clean and carries `capabilities`, `capabilityStale: {verifiedAgainst, detected}`, the
|
|
193
|
+
normalized `availability` object, and a top-level `usage` per agent row instead. Exit `1` if any
|
|
194
|
+
checked agent is not ready.
|
|
167
195
|
|
|
168
196
|
## `start` - start a supervised process
|
|
169
197
|
|
|
@@ -188,6 +216,61 @@ Posts to the supervisor API
|
|
|
188
216
|
(`POST /api/agents/:id/stop`) and prints `stopped <id>`. Same server requirement and flags as
|
|
189
217
|
`start`.
|
|
190
218
|
|
|
219
|
+
## `usage` - run-once provider usage capture (quota-owned availability refresh)
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
spur agent usage # capture, record quota observations, drain them
|
|
223
|
+
spur agent usage --dry-run # print would-be changes; write nothing
|
|
224
|
+
spur agent usage --json
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Runs `codexbar usage --format json --provider all` once, writes the snapshot to
|
|
228
|
+
`~/.config/spur/agent-usage.json` (`captured_at`, `source`, `providers[]`, `raw`), maps providers
|
|
229
|
+
to executors via `agent.executors[].agent` (or the model's `<provider>/` prefix), and records
|
|
230
|
+
`owner: quota` availability observations that the standard drain applies — the single availability
|
|
231
|
+
write path. A provider is exhausted when any `primary|secondary|tertiary` window reports
|
|
232
|
+
`usedPercent >= 100`; the window name and `resetsAt` go into the observation reason. Per-provider
|
|
233
|
+
`{ "error": … }` entries are skipped (listed, never treated as recovery); healthy entries still
|
|
234
|
+
apply. A missing codexbar binary or an unparsable payload exits `1` and changes nothing.
|
|
235
|
+
Unmapped providers are listed and never guessed.
|
|
236
|
+
|
|
237
|
+
**Scheduling is external** (cron/launchd, same pattern as `spur history daily`):
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
# launchd/cron example — hourly
|
|
241
|
+
0 * * * * /opt/homebrew/bin/spur agent usage >> /tmp/spur-agent-usage.log 2>&1
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
`spur serve` never invokes the producer (asserted by a test, design R4).
|
|
245
|
+
|
|
246
|
+
### Flags
|
|
247
|
+
|
|
248
|
+
| Flag | Purpose |
|
|
249
|
+
| ---- | ------- |
|
|
250
|
+
| `--dry-run` | Print would-be changes (executor, from → to, owner, reason); write neither the snapshot nor any config |
|
|
251
|
+
| `--source <name>` | Usage source implementation; only `codexbar` exists (default) |
|
|
252
|
+
| `--json` | Machine-readable result payload |
|
|
253
|
+
|
|
254
|
+
## Member sessions (G66)
|
|
255
|
+
|
|
256
|
+
Every fleet member loop keeps ONE coding-agent session for its lifetime, in the warmest mode the
|
|
257
|
+
agent supports (`docs/design/session-pinned-dispatch.md` §6):
|
|
258
|
+
|
|
259
|
+
| Mode | Mechanism | `id` |
|
|
260
|
+
| ---- | --------- | ---- |
|
|
261
|
+
| `persistent` | One long-lived stdin process; each drained prompt is injected through `send()` | none — the live process IS the session |
|
|
262
|
+
| `resume` | Each drain re-opens the previous drain's session id | the resume id (rendered shortened) |
|
|
263
|
+
| `one-shot` | A fresh session per drain (one lifetime warning per member) | none |
|
|
264
|
+
|
|
265
|
+
A session **resets** (the ledger records a reason-named `fleet.member-session-reset` row) on:
|
|
266
|
+
`restart` — the persistent process exited and the supervisor's restart policy respawns it;
|
|
267
|
+
`operator` — `spur agent stop` / serve shutdown ended the loop; `failed-drains` — 3 consecutive
|
|
268
|
+
failed drains marked the session poisoned. The next drain opens a fresh session.
|
|
269
|
+
|
|
270
|
+
**No-redelivery invariant:** delivery state lives in the DB, session continuity is agent memory
|
|
271
|
+
only. A settled (delivered) inbox message is never redelivered — resuming a session or resetting
|
|
272
|
+
one never re-sends settled work; only never-started deliveries release and redeliver (0831/0834).
|
|
273
|
+
|
|
191
274
|
## What this skill is NOT
|
|
192
275
|
|
|
193
276
|
- **Not the dispatch decision.** *When* to use `spur agent run` vs a native subagent is the
|
|
@@ -47,8 +47,10 @@ Every scenario/item carries an `R1, R2, …` prefix:
|
|
|
47
47
|
|
|
48
48
|
- **Sequential within a feature**, starting at R1.
|
|
49
49
|
- **Stable forever.** Never renumber once tasks exist — tasks match AC by **normalized scenario
|
|
50
|
-
title** (the `R<n> —` prefix is stripped on comparison
|
|
51
|
-
but *rewording* a title breaks the coverage edge.
|
|
50
|
+
title** (the `R<n> —` prefix is stripped on comparison, as is the task side's `AC<n> —`), so
|
|
51
|
+
renumbering around a title is safe but *rewording* a title breaks the coverage edge.
|
|
52
|
+
- **`R<n>` is the feature's namespace.** Task AC items are numbered `AC<n>` (task-local) and copy
|
|
53
|
+
the feature title after their own prefix; task Requirements own `R<n>.` inside the task.
|
|
52
54
|
- **One R-number = one scenario.** Don't split one requirement across scenarios under a single
|
|
53
55
|
R-number; don't merge two requirements into one scenario.
|
|
54
56
|
|
|
@@ -58,6 +58,9 @@ spur feature create "Planning layer" --parent H # → H<n>
|
|
|
58
58
|
spur feature create "Task CLI" --parent H1 # → H1<n>
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
+
`create --json` returns `{ ref: { kind, id, filePath, folder }, content }` — read the id from
|
|
62
|
+
`.ref.id`, not a top-level `.id`.
|
|
63
|
+
|
|
61
64
|
To restructure, use `move` — never hand-edit an ID. `move <id> --parent <new>` re-parents the
|
|
62
65
|
subtree and **cascade-renames** every descendant; omit `--parent` to lift it to a top-level group.
|
|
63
66
|
|
|
@@ -184,7 +187,9 @@ spur feature check --strict --json # warnings → failures
|
|
|
184
187
|
```
|
|
185
188
|
|
|
186
189
|
The 4-layer validator (frontmatter, AC syntax, children-limit/structure, L4 traceability) emits its
|
|
187
|
-
verdict and findings as JSON
|
|
190
|
+
verdict and findings as a JSON **array**, one entry per feature (`jq '.[0].pass'`, `.[0].findings[].code`),
|
|
191
|
+
like `spur task check --json`. Gherkin AC must keep its `Feature:` line (`L3.ac-bdd-error`) and
|
|
192
|
+
every `Scenario:` title is the identity key tasks reference verbatim. **Query this, don't re-derive it** — the rules live in the CLI, never
|
|
188
193
|
restated as prose here. This is what `sp:spur-dev`'s feature-check gate loop runs.
|
|
189
194
|
|
|
190
195
|
## Status sync - `sync`
|
|
@@ -137,8 +137,8 @@ runner (see [validation-and-extension.md](validation-and-extension.md)).
|
|
|
137
137
|
Order matters for both guards and conditions: **the first that passes wins.** Put the discriminating
|
|
138
138
|
guard before the unconditional fallback (`always` / no-guard edge). For multi-condition gates (doctor
|
|
139
139
|
+ task check, quality gate + attempt cap), prefer a **soft probe** shell that writes PASS|FAIL and
|
|
140
|
-
always exits 0, then branch with ordered status-file guards — see shipped
|
|
141
|
-
`task-pipeline.yaml` (more reliable than `action-ok` alone when more than one condition decides the edge).
|
|
140
|
+
always exits 0, then branch with ordered status-file guards — see shipped
|
|
141
|
+
`task-pipeline.yaml` / `wrapup-pipeline.yaml` (more reliable than `action-ok` alone when more than one condition decides the edge).
|
|
142
142
|
|
|
143
143
|
## Template variables
|
|
144
144
|
|
|
@@ -28,9 +28,9 @@ Authored workflows default to a project-local directory, grouped by purpose:
|
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
A `--file <path>` argument overrides the default. Keep one workflow per file, named for what it does
|
|
31
|
-
(`approval.yaml`, `import-file.yaml`), not for its mode.
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
(`approval.yaml`, `import-file.yaml`), not for its mode. Copy real schema shapes from a
|
|
32
|
+
retained definition such as `task-pipeline.yaml` rather than from a half-remembered
|
|
33
|
+
snippet.
|
|
34
34
|
|
|
35
35
|
## Sub-procedure: mode-selection gate
|
|
36
36
|
|
|
@@ -95,7 +95,7 @@ and orders capabilities, it does not contain them** (ADR-069).
|
|
|
95
95
|
between them are one judgment step.
|
|
96
96
|
- [ ] **Soft status-file probe over repeated probing.** Run the expensive check once in an action
|
|
97
97
|
that always exits 0 and writes its verdict to a run-scoped file; branch with ordered cheap
|
|
98
|
-
guards that read that file. One subprocess instead of one per branch — the
|
|
98
|
+
guards that read that file. One subprocess instead of one per branch — the
|
|
99
99
|
`task-pipeline.yaml` quality-gate idiom.
|
|
100
100
|
- [ ] **Order guards cheapest-discriminating-first.** The first passing guard wins, so a `test -f`
|
|
101
101
|
ahead of a `spur … --json` parse skips the expensive call on the common path.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spur-dev
|
|
3
|
-
description:
|
|
3
|
+
description: 'The thin orchestration spine for the planning→execution lifecycle: intake, feature-check/batch-create gates, the execution pipeline (precheck→implement→test→review→verify→record→done), HITL gating. Dispatches competency skills; never inlines them. Triggers: "run the pipeline", "drive this task", "plan a feature end to end", "continue the pipeline run", or operating the full lifecycle.'
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: spur
|
|
@@ -36,11 +36,11 @@ metadata:
|
|
|
36
36
|
# Spur Dev — The Orchestration Spine
|
|
37
37
|
|
|
38
38
|
`sp:spur-dev` is the **thin orchestration spine** that drives the full planning→execution lifecycle.
|
|
39
|
-
It converts vague intent into shipped work by
|
|
39
|
+
It converts vague intent into shipped work by _orchestrating_, not by doing the work itself: it runs
|
|
40
40
|
the gates (feature-check, batch-create) and the execution pipeline with human-in-the-loop control,
|
|
41
41
|
and **dispatches deep competency skills** for each unit of work — it never inlines them. Every write
|
|
42
|
-
to the corpus goes through a CLI verb that validates before writing — the spine knows
|
|
43
|
-
the
|
|
42
|
+
to the corpus goes through a CLI verb that validates before writing — the spine knows _how to drive
|
|
43
|
+
the lifecycle_; the competency skills know _how to do each job_; the CLI knows _what is valid_.
|
|
44
44
|
|
|
45
45
|
The skill was decomposed **by function** (ADR-028): design, decomposition, implementation, testing,
|
|
46
46
|
and verification each became a standalone competency skill, leaving this spine to orchestrate them.
|
|
@@ -51,14 +51,14 @@ status-transition verbs, are the facade's (`sp:spur-cli`), never this skill's.
|
|
|
51
51
|
|
|
52
52
|
**The competencies the spine dispatches:**
|
|
53
53
|
|
|
54
|
-
| Unit of work
|
|
55
|
-
|
|
|
56
|
-
| Design / ADR judgment (shape a task) | `sp:sys-architecture`
|
|
57
|
-
| Feature/spec → task batch
|
|
58
|
-
| Implement to spec
|
|
59
|
-
| Coverage / test extension
|
|
60
|
-
| Review (multi-dimensional)
|
|
61
|
-
| Test-first discipline (composed in)
|
|
54
|
+
| Unit of work | Competency skill |
|
|
55
|
+
| ------------------------------------ | ----------------------------------------------------------------------- |
|
|
56
|
+
| Design / ADR judgment (shape a task) | `sp:sys-architecture` |
|
|
57
|
+
| Feature/spec → task batch | `sp:spec-decomposition` |
|
|
58
|
+
| Implement to spec | `sp:code-implementation` |
|
|
59
|
+
| Coverage / test extension | `sp:code-testing` |
|
|
60
|
+
| Review (multi-dimensional) | `sp:code-verification` + `sp:functional-review` + `sp:code-improvement` |
|
|
61
|
+
| Test-first discipline (composed in) | `sp:test-driven-development` |
|
|
62
62
|
|
|
63
63
|
CLI verb usage for any `spur` noun lives in the `sp:spur-cli` facade. This spine owns only the
|
|
64
64
|
lifecycle, the gates, and the section-write contract (`cross-cutting.md`).
|
|
@@ -103,26 +103,26 @@ Host-session procedure: **[references/inline-pipeline-driver.md](references/inli
|
|
|
103
103
|
Each step delegates to a CLI verb and is documented in exactly one reference file. Read the
|
|
104
104
|
reference for the half you're operating; do not duplicate its content here.
|
|
105
105
|
|
|
106
|
-
| Step
|
|
107
|
-
|
|
|
108
|
-
| Intake
|
|
109
|
-
| Feature create + AC
|
|
110
|
-
| Feature check gate
|
|
111
|
-
| Decomposition (dispatch)
|
|
112
|
-
| Batch-create gate
|
|
113
|
-
| Design doc
|
|
114
|
-
| Refine
|
|
115
|
-
| Batch refine
|
|
116
|
-
| Task selection
|
|
117
|
-
| Pipeline run
|
|
118
|
-
| Implement (dispatch)
|
|
119
|
-
| Test (dispatch)
|
|
120
|
-
| Review / verify (dispatch) | execution | `sp:dev-review` → `sp:code-verification` + `sp:functional-review` + `sp:code-improvement` | competency skills — the spine dispatches, does not inline
|
|
121
|
-
| Operation catalog
|
|
122
|
-
| Continue
|
|
123
|
-
| Batch run
|
|
124
|
-
| Parallel fan-out
|
|
125
|
-
| All writes (both halves)
|
|
106
|
+
| Step | Half | CLI gate | Reference |
|
|
107
|
+
| -------------------------- | --------- | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
108
|
+
| Intake | planning | — (prompt work) | [planning-workflow.md](references/planning-workflow.md) · [product-planning.md](references/product-planning.md) |
|
|
109
|
+
| Feature create + AC | planning | `spur feature create` | [planning-workflow.md](references/planning-workflow.md) · [ac-style-guide.md](references/ac-style-guide.md) |
|
|
110
|
+
| Feature check gate | planning | `spur feature check` | [planning-workflow.md](references/planning-workflow.md) |
|
|
111
|
+
| Decomposition (dispatch) | planning | `task-batch.schema.json` | `sp:spec-decomposition` competency — the spine dispatches, does not inline |
|
|
112
|
+
| Batch-create gate | planning | `spur task batch-create` | [planning-workflow.md](references/planning-workflow.md) |
|
|
113
|
+
| Design doc | planning | — (prompt work; §4.5/T9) | [planning-workflow.md](references/planning-workflow.md) |
|
|
114
|
+
| Refine | planning | `spur task update --section` | [planning-workflow.md](references/planning-workflow.md) |
|
|
115
|
+
| Batch refine | planning | `sp:dev-refineall` → per-task `refine` | [dev-operations.md](references/dev-operations.md) § refineall · [planning-workflow.md](references/planning-workflow.md) |
|
|
116
|
+
| Task selection | execution | `spur task list` | [execution-workflow.md](references/execution-workflow.md) |
|
|
117
|
+
| Pipeline run | execution | inline YAML driver or `spur workflow run` | [execution-workflow.md](references/execution-workflow.md) · [inline-pipeline-driver.md](references/inline-pipeline-driver.md) |
|
|
118
|
+
| Implement (dispatch) | execution | `sp:code-implementation` | competency skill — the spine dispatches, does not inline |
|
|
119
|
+
| Test (dispatch) | execution | `sp:code-testing` | competency skill — the spine dispatches, does not inline |
|
|
120
|
+
| Review / verify (dispatch) | execution | `sp:dev-review` → `sp:code-verification` + `sp:functional-review` + `sp:code-improvement` | competency skills — the spine dispatches, does not inline |
|
|
121
|
+
| Operation catalog | execution | `sp:dev-*` operations | [dev-operations.md](references/dev-operations.md) (spine dispatch table) |
|
|
122
|
+
| Continue | execution | `spur feature update` / `refresh` | [execution-workflow.md](references/execution-workflow.md) |
|
|
123
|
+
| Batch run | execution | `sp:super-planner` + `spur workflow run` | [execution-batch.md](references/execution-batch.md) |
|
|
124
|
+
| Parallel fan-out | execution | `sp:parallel-execution` decision framework | [execution-batch.md](references/execution-batch.md) |
|
|
125
|
+
| All writes (both halves) | — | CLI-gated section editing | [cross-cutting.md](references/cross-cutting.md) · [section-batching.md](references/section-batching.md) (one-writer protocol, F92 0593) |
|
|
126
126
|
|
|
127
127
|
## When to use
|
|
128
128
|
|
|
@@ -180,7 +180,7 @@ CLI does.
|
|
|
180
180
|
section.
|
|
181
181
|
3. **Resolve task IDs through the CLI.** Read a known WBS with `spur task show <wbs> --json`; it
|
|
182
182
|
returns metadata, full content, and `filePath` across configured task folders. Use `spur task
|
|
183
|
-
|
|
183
|
+
path <wbs> --json` only when another tool needs the absolute path. Never search `docs/tasks*` or
|
|
184
184
|
guess `--folder`; reuse the first `show` response throughout the run.
|
|
185
185
|
4. **Check before every write.** Run `spur task check <wbs> --json` to know what sections
|
|
186
186
|
the task needs at its current status. Guessing produces matrix violations.
|