@gobing-ai/spur 0.3.41 → 0.3.43
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 +15 -0
- package/README.md +15 -1
- package/config/templates/AGENTS.md +5 -3
- package/config/workflows/task-pipeline.yaml +113 -12
- package/package.json +15 -12
- package/plugins/README.md +655 -0
- package/plugins/sp/README.md +621 -0
- package/plugins/sp/agents/expert-spur.md +109 -0
- package/plugins/sp/agents/super-coder.md +126 -0
- package/plugins/sp/agents/super-planner.md +283 -0
- package/plugins/sp/agents/super-reviewer.md +154 -0
- package/plugins/sp/commands/dev-arch.md +30 -0
- package/plugins/sp/commands/dev-brainstorm.md +40 -0
- package/plugins/sp/commands/dev-changelog.md +28 -0
- package/plugins/sp/commands/dev-daily.md +29 -0
- package/plugins/sp/commands/dev-debug.md +29 -0
- package/plugins/sp/commands/dev-dogfood.md +33 -0
- package/plugins/sp/commands/dev-featurechange.md +130 -0
- package/plugins/sp/commands/dev-find-conflict.md +51 -0
- package/plugins/sp/commands/dev-find-issue.md +76 -0
- package/plugins/sp/commands/dev-find-next.md +60 -0
- package/plugins/sp/commands/dev-fixall.md +33 -0
- package/plugins/sp/commands/dev-gitmsg.md +28 -0
- package/plugins/sp/commands/dev-gtd.md +97 -0
- package/plugins/sp/commands/dev-handover.md +26 -0
- package/plugins/sp/commands/dev-idea.md +50 -0
- package/plugins/sp/commands/dev-next.md +31 -0
- package/plugins/sp/commands/dev-parallel.md +30 -0
- package/plugins/sp/commands/dev-plan.md +46 -0
- package/plugins/sp/commands/dev-refine.md +48 -0
- package/plugins/sp/commands/dev-refineall.md +65 -0
- package/plugins/sp/commands/dev-refresh.md +32 -0
- package/plugins/sp/commands/dev-reverse.md +32 -0
- package/plugins/sp/commands/dev-review.md +31 -0
- package/plugins/sp/commands/dev-run.md +63 -0
- package/plugins/sp/commands/dev-runall.md +83 -0
- package/plugins/sp/commands/dev-simplify.md +39 -0
- package/plugins/sp/commands/dev-unit.md +29 -0
- package/plugins/sp/commands/dev-verify.md +48 -0
- package/plugins/sp/commands/dev-verifyall.md +72 -0
- package/plugins/sp/commands/dev-wrap.md +48 -0
- package/plugins/sp/commands/dev-wrapall.md +51 -0
- package/plugins/sp/commands/rule-add.md +18 -0
- package/plugins/sp/commands/rule-refine.md +18 -0
- package/plugins/sp/commands/rule-scan.md +18 -0
- package/plugins/sp/commands/spur-init.md +22 -0
- package/plugins/sp/commands/workflow-add.md +18 -0
- package/plugins/sp/commands/workflow-refine.md +18 -0
- package/plugins/sp/hooks/agent-hint.ts +60 -0
- package/plugins/sp/hooks/careful-guard.ts +147 -0
- package/plugins/sp/hooks/context-post-tool.ts +325 -0
- package/plugins/sp/hooks/context-session-start.ts +182 -0
- package/plugins/sp/hooks/context-session-stop.ts +95 -0
- package/plugins/sp/hooks/hooks.json +51 -0
- package/plugins/sp/hooks/pi/guard-extension.ts +341 -0
- package/plugins/sp/hooks/task-write-guard.ts +84 -0
- package/plugins/sp/plugin.json +8 -0
- package/plugins/sp/scripts/batch-preflight.ts +204 -0
- package/plugins/sp/scripts/daily-summary/daily-summary.ts +606 -0
- package/plugins/sp/scripts/daily-summary/logger.ts +28 -0
- package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts +363 -0
- package/plugins/sp/scripts/dogfood-testing/validate-report.ts +168 -0
- package/plugins/sp/scripts/feature-sync-bounded.ts +451 -0
- package/plugins/sp/scripts/stage-registry-adapter.ts +1341 -0
- package/plugins/sp/scripts/task-size-precheck.ts +202 -0
- package/plugins/sp/scripts/validate-commands.ts +651 -0
- package/plugins/sp/scripts/validate-flag-contracts.ts +875 -0
- package/plugins/sp/skills/brainstorm/SKILL.md +361 -0
- package/plugins/sp/skills/brainstorm/agents/openai.yaml +14 -0
- package/plugins/sp/skills/brainstorm/examples/ideation-example.md +209 -0
- package/plugins/sp/skills/brainstorm/metadata.openclaw +7 -0
- package/plugins/sp/skills/brainstorm/references/grilling-interview.md +68 -0
- package/plugins/sp/skills/brainstorm/references/workflows.md +255 -0
- package/plugins/sp/skills/branch-workflow/SKILL.md +109 -0
- package/plugins/sp/skills/branch-workflow/references/branch-lifecycle.md +69 -0
- package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +100 -0
- package/plugins/sp/skills/code-implementation/SKILL.md +203 -0
- package/plugins/sp/skills/code-implementation/references/debugging.md +64 -0
- package/plugins/sp/skills/code-implementation/references/implementation-patterns.md +113 -0
- package/plugins/sp/skills/code-improvement/SKILL.md +231 -0
- package/plugins/sp/skills/code-improvement/references/deepening-signals.md +205 -0
- package/plugins/sp/skills/code-review/SKILL.md +112 -0
- package/plugins/sp/skills/code-review/references/receiving-code-review.md +70 -0
- package/plugins/sp/skills/code-review/references/review-lenses.md +117 -0
- package/plugins/sp/skills/code-review/references/self-review-checklist.md +53 -0
- package/plugins/sp/skills/code-review/references/verification-before-completion.md +68 -0
- package/plugins/sp/skills/code-simplification/SKILL.md +225 -0
- package/plugins/sp/skills/code-testing/SKILL.md +108 -0
- package/plugins/sp/skills/code-testing/references/stacks/bun-ts.md +165 -0
- package/plugins/sp/skills/code-testing/references/stacks/go.md +88 -0
- package/plugins/sp/skills/code-testing/references/stacks/python.md +117 -0
- package/plugins/sp/skills/code-testing/references/test-loop-breaker.md +37 -0
- package/plugins/sp/skills/code-testing/references/test-output-discipline.md +52 -0
- package/plugins/sp/skills/code-testing/references/unit-testing.md +212 -0
- package/plugins/sp/skills/code-verification/SKILL.md +535 -0
- package/plugins/sp/skills/code-verification/references/code-improvement.md +39 -0
- package/plugins/sp/skills/code-verification/references/secu-review.md +94 -0
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +141 -0
- package/plugins/sp/skills/conflict-finding/SKILL.md +254 -0
- package/plugins/sp/skills/conflict-finding/references/authority-resolution.md +258 -0
- package/plugins/sp/skills/conflict-finding/references/comparison-protocol.md +277 -0
- package/plugins/sp/skills/conflict-finding/references/finding-contract.md +346 -0
- package/plugins/sp/skills/conflict-finding/references/remediation-routing.md +276 -0
- package/plugins/sp/skills/daily-summary/SKILL.md +171 -0
- package/plugins/sp/skills/daily-summary/agents/openai.yaml +13 -0
- package/plugins/sp/skills/doc-evolve/SKILL.md +175 -0
- package/plugins/sp/skills/doc-evolve/references/operations.md +93 -0
- package/plugins/sp/skills/dogfood-testing/SKILL.md +608 -0
- package/plugins/sp/skills/dogfood-testing/references/monitor-ledger.md +211 -0
- package/plugins/sp/skills/dogfood-testing/references/report-template.md +351 -0
- package/plugins/sp/skills/doubt-driven-development/SKILL.md +136 -0
- package/plugins/sp/skills/functional-review/SKILL.md +364 -0
- package/plugins/sp/skills/functional-review/references/verdict-schema.md +133 -0
- package/plugins/sp/skills/indexed-context/SKILL.md +164 -0
- package/plugins/sp/skills/issue-finding/SKILL.md +442 -0
- package/plugins/sp/skills/issue-finding/agents/openai.yaml +15 -0
- package/plugins/sp/skills/issue-finding/examples/expected-findings.json +27 -0
- package/plugins/sp/skills/issue-finding/examples/session-test-loop.jsonl +23 -0
- package/plugins/sp/skills/issue-finding/references/session-formats.md +151 -0
- package/plugins/sp/skills/next-feature/SKILL.md +125 -0
- package/plugins/sp/skills/next-feature/references/handoff-routing.md +92 -0
- package/plugins/sp/skills/next-feature/references/proposal-contract.md +49 -0
- package/plugins/sp/skills/next-feature/references/ranking-rubric.md +52 -0
- package/plugins/sp/skills/next-feature/references/signal-derivation.md +67 -0
- package/plugins/sp/skills/next-router/SKILL.md +181 -0
- package/plugins/sp/skills/next-router/references/messages.md +90 -0
- package/plugins/sp/skills/next-router/references/routing-table.md +216 -0
- package/plugins/sp/skills/parallel-execution/SKILL.md +148 -0
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +109 -0
- package/plugins/sp/skills/parallel-execution/references/fan-out-patterns.md +101 -0
- package/plugins/sp/skills/parallel-execution/references/result-synthesis.md +94 -0
- package/plugins/sp/skills/reverse-engineering/SKILL.md +375 -0
- package/plugins/sp/skills/reverse-engineering/agents/openai.yaml +18 -0
- package/plugins/sp/skills/source-driven-development/SKILL.md +124 -0
- package/plugins/sp/skills/spec-decomposition/SKILL.md +117 -0
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +539 -0
- package/plugins/sp/skills/spur-cli/SKILL.md +133 -0
- package/plugins/sp/skills/spur-cli/references/agent.md +179 -0
- package/plugins/sp/skills/spur-cli/references/features/acceptance-criteria.md +82 -0
- package/plugins/sp/skills/spur-cli/references/features/hierarchy-mece.md +177 -0
- package/plugins/sp/skills/spur-cli/references/features/roadmap-priority.md +84 -0
- package/plugins/sp/skills/spur-cli/references/features/verbs.md +122 -0
- package/plugins/sp/skills/spur-cli/references/features.md +234 -0
- package/plugins/sp/skills/spur-cli/references/init.md +119 -0
- package/plugins/sp/skills/spur-cli/references/message.md +98 -0
- package/plugins/sp/skills/spur-cli/references/rules/authoring-rules.md +212 -0
- package/plugins/sp/skills/spur-cli/references/rules/fine-tuning.md +148 -0
- package/plugins/sp/skills/spur-cli/references/rules/operations.md +228 -0
- package/plugins/sp/skills/spur-cli/references/rules/validation-and-extension.md +129 -0
- package/plugins/sp/skills/spur-cli/references/rules.md +209 -0
- package/plugins/sp/skills/spur-cli/references/serve.md +58 -0
- package/plugins/sp/skills/spur-cli/references/tasks/l3-guard-cheatsheet.md +98 -0
- package/plugins/sp/skills/spur-cli/references/tasks/section-editing.md +95 -0
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +361 -0
- package/plugins/sp/skills/spur-cli/references/tasks.md +280 -0
- package/plugins/sp/skills/spur-cli/references/team.md +133 -0
- package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +226 -0
- package/plugins/sp/skills/spur-cli/references/workflows/operations.md +211 -0
- package/plugins/sp/skills/spur-cli/references/workflows/validation-and-extension.md +129 -0
- package/plugins/sp/skills/spur-cli/references/workflows.md +355 -0
- package/plugins/sp/skills/spur-dev/SKILL.md +224 -0
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +196 -0
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +680 -0
- package/plugins/sp/skills/spur-dev/references/decision-brief.md +80 -0
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +546 -0
- package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +164 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +790 -0
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +352 -0
- package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +191 -0
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +417 -0
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +171 -0
- package/plugins/sp/skills/spur-dev/references/glossary.md +95 -0
- package/plugins/sp/skills/spur-dev/references/idea-evaluation.md +80 -0
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +120 -0
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +302 -0
- package/plugins/sp/skills/spur-dev/references/product-planning.md +206 -0
- package/plugins/sp/skills/spur-dev/references/section-batching.md +24 -0
- package/plugins/sp/skills/sys-architecture/SKILL.md +155 -0
- package/plugins/sp/skills/sys-architecture/references/decision-method.md +137 -0
- package/plugins/sp/skills/sys-architecture/references/upkeep-survey.md +75 -0
- package/plugins/sp/skills/sys-debugging/SKILL.md +228 -0
- package/plugins/sp/skills/sys-debugging/references/debugging-protocol.md +62 -0
- package/plugins/sp/skills/test-driven-development/SKILL.md +248 -0
- package/plugins/sp/skills/wayfinder/SKILL.md +292 -0
- package/spur.js +6035 -4963
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: glossary
|
|
3
|
+
description: "Extracted section: sp's own vocabulary — canonical terms with Avoid lists. Owns TERM DEFINITIONS only; process rules stay in cross-cutting.md (see the split note below)."
|
|
4
|
+
see_also:
|
|
5
|
+
- spur-dev
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sp Glossary
|
|
9
|
+
|
|
10
|
+
This is the single physical copy of sp's plugin-internal vocabulary — one canonical term per
|
|
11
|
+
concept, each with an **Avoid:** list of near-synonyms that must not be used interchangeably.
|
|
12
|
+
Every other skill body collapses its own re-explanation of these terms to the bare word and
|
|
13
|
+
links here instead of repeating the definition.
|
|
14
|
+
|
|
15
|
+
**Split from `cross-cutting.md`:** this file owns **term definitions** (what a word means).
|
|
16
|
+
`cross-cutting.md` owns **process rules** (how writes happen, what the Iron Laws are, what
|
|
17
|
+
`--auto` does). A term used inside a process rule is defined here once; the rule itself stays
|
|
18
|
+
in `cross-cutting.md`. Neither file restates the other's content.
|
|
19
|
+
|
|
20
|
+
## Terms
|
|
21
|
+
|
|
22
|
+
**spine** — the thin orchestration skill (`sp:spur-dev`) that drives the planning→execution
|
|
23
|
+
lifecycle by running gates and dispatching competency skills; it contains no domain logic of
|
|
24
|
+
its own.
|
|
25
|
+
Avoid: *orchestrator* (ambiguous with `sp:super-planner`, the batch orchestrator agent),
|
|
26
|
+
*controller*, *coordinator*.
|
|
27
|
+
|
|
28
|
+
**competency** — a deep, functionally-scoped skill (`sp:sys-architecture`,
|
|
29
|
+
`sp:spec-decomposition`, `sp:code-implementation`, `sp:code-testing`, `sp:code-verification`)
|
|
30
|
+
that owns one unit of work end-to-end. The spine dispatches to a competency; a competency never
|
|
31
|
+
dispatches back to the spine.
|
|
32
|
+
Avoid: *module* (reserved for the deep-module design vocabulary, see `sys-architecture`),
|
|
33
|
+
*plugin*, *sub-skill*.
|
|
34
|
+
|
|
35
|
+
**facade** — a skill that exposes CLI-verb usage for a `spur` noun (`sp:spur-cli`) without
|
|
36
|
+
owning any lifecycle logic. One reference file per noun; the facade is a lookup surface, not a
|
|
37
|
+
workflow driver.
|
|
38
|
+
Avoid: *wrapper* (reserved for thin command docs — see **command wrapper** below), *adapter*
|
|
39
|
+
(reserved for the deep-module design vocabulary).
|
|
40
|
+
|
|
41
|
+
**corpus** — the validated set of task and feature files under `docs/tasks2/` and
|
|
42
|
+
`docs/features/`, mutated only through `spur task` / `spur feature` CLI verbs.
|
|
43
|
+
Avoid: *database*, *store*, *repo` (ambiguous with the git repository).
|
|
44
|
+
|
|
45
|
+
**gate** — a deterministic CLI check that must exit clean before a lifecycle transition
|
|
46
|
+
proceeds (`spur feature check`, `task-batch.schema.json` validation, `spur task check`,
|
|
47
|
+
`spur rule run`). A gate either passes or blocks; there is no partial pass.
|
|
48
|
+
Avoid: *checkpoint* (reserved for the Session Checkpoint Convention — a resumability artifact,
|
|
49
|
+
not a pass/fail gate), *validation* (the generic verb; *gate* is the noun for the specific
|
|
50
|
+
enforcement point), *step* (a gate is a property of a step, not a step itself).
|
|
51
|
+
|
|
52
|
+
**verdict** — the structured PASS/PARTIAL/FAIL outcome of a verify step, recorded as an
|
|
53
|
+
artifact (`.spur/run/<wbs>-verdict.json`) and consumed by `spur task record`.
|
|
54
|
+
Avoid: *result* (too generic — a verdict has a fixed three-value contract), *report` (reserved
|
|
55
|
+
for narrative output like the dogfood report or batch report).
|
|
56
|
+
|
|
57
|
+
**noun/verb** — the two-part CLI grammar: a noun names the domain object (`task`, `feature`,
|
|
58
|
+
`rule`, `workflow`, `agent`, `message`, `team`), a verb names the operation on it (`create`,
|
|
59
|
+
`update`, `check`, `run`, `list`). The `sp:spur-cli` facade organizes its references one file
|
|
60
|
+
per noun.
|
|
61
|
+
Avoid: *command* alone (ambiguous with a `/sp:dev-*` slash command, which is a different
|
|
62
|
+
grammar layer).
|
|
63
|
+
|
|
64
|
+
**half** (planning / execution) — the two lifecycle phases `sp:spur-dev` drives: **planning**
|
|
65
|
+
(vague description → validated, decomposed feature) and **execution** (one task → done through
|
|
66
|
+
the pipeline). The two halves share this skill today but are designed to split cleanly; new
|
|
67
|
+
logic belongs in exactly one half.
|
|
68
|
+
Avoid: *phase* alone (the pipeline-phase table in `cross-cutting.md` uses *phase* for a
|
|
69
|
+
different, finer-grained partition — ideation/design/execution/wrap-up — so *half* stays
|
|
70
|
+
reserved for this specific planning/execution split).
|
|
71
|
+
|
|
72
|
+
**HITL** (human-in-the-loop) — a workflow state that pauses for explicit operator approval
|
|
73
|
+
before continuing (`hitl.confirm`). A HITL gate is never auto-dismissed by the engine; `--auto`
|
|
74
|
+
can only route *around* one whose objective precondition is already met (see the `--auto`
|
|
75
|
+
routing contract in `cross-cutting.md`).
|
|
76
|
+
Avoid: *prompt* (reserved for LLM input text), *interrupt* (implies an exception, not a planned
|
|
77
|
+
pause point).
|
|
78
|
+
|
|
79
|
+
**WBS** (work-breakdown-structure ID) — the four-digit task identifier (e.g. `0187`) that
|
|
80
|
+
names a task file and its position in the corpus. WBS IDs are assigned once and never reused.
|
|
81
|
+
Avoid: *task ID* alone (acceptable in prose, but *WBS* is the canonical term when precision
|
|
82
|
+
matters — e.g. distinguishing a task WBS from a feature ID).
|
|
83
|
+
|
|
84
|
+
**section-write contract** — the rule that every corpus write goes through
|
|
85
|
+
`spur task update <wbs> --section <name> --from-file <path>` with body-only content (no
|
|
86
|
+
duplicate heading, no same-level sub-headings), gated by the section-status matrix for the
|
|
87
|
+
task's current status. Fully specified in `cross-cutting.md`; this glossary only names the term.
|
|
88
|
+
Avoid: *section edit* alone (too generic — *contract* signals the CLI-gated, matrix-checked
|
|
89
|
+
nature of the write).
|
|
90
|
+
|
|
91
|
+
## See also
|
|
92
|
+
|
|
93
|
+
- [cross-cutting.md](cross-cutting.md) — the process rules that use these terms (Iron Laws,
|
|
94
|
+
Auto-Decision Principles, the section-editing workflow, pipeline phase table).
|
|
95
|
+
- [spur-dev/SKILL.md](../SKILL.md) — the spine that dispatches by these terms.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: idea-evaluation
|
|
3
|
+
description: >-
|
|
4
|
+
Template SSOT for the post-discovery idea-evaluation report used by idea-pipeline's
|
|
5
|
+
idea-eval taste gate. Brainstorm fills an instance at .spur/run/idea-eval-report.md.
|
|
6
|
+
see_also:
|
|
7
|
+
- spur-dev
|
|
8
|
+
- brainstorm
|
|
9
|
+
- decision-brief
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Idea Evaluation Report Template
|
|
13
|
+
|
|
14
|
+
The idea-evaluation report is the operator-facing artifact between **discovery** and
|
|
15
|
+
**feature-create** on `/sp:dev-idea`. It follows [decision-brief](decision-brief.md) norms:
|
|
16
|
+
recommendation is mandatory, stakes in plain English, and approve/reject is the terminal choice.
|
|
17
|
+
|
|
18
|
+
**Authorship:** `sp:brainstorm` (discovery) fills a concrete instance to
|
|
19
|
+
`.spur/run/idea-eval-report.md`. The pipeline `idea-eval` state is HITL-only — it does not
|
|
20
|
+
re-author the report.
|
|
21
|
+
|
|
22
|
+
**Sidecar rule:** The enhanced idea does **not** overwrite `vars.idea`. Feature-create reads both
|
|
23
|
+
the original idea and this report.
|
|
24
|
+
|
|
25
|
+
## Template
|
|
26
|
+
|
|
27
|
+
```markdown
|
|
28
|
+
# Idea Evaluation Report
|
|
29
|
+
|
|
30
|
+
## Enhanced Idea
|
|
31
|
+
<one-paragraph refined statement of what the idea actually requires — the "real requirement" after discovery sharpens the vague input>
|
|
32
|
+
|
|
33
|
+
## Scores
|
|
34
|
+
|
|
35
|
+
| Dimension | Score (0–5) | Rationale |
|
|
36
|
+
|-----------|-------------|-----------|
|
|
37
|
+
| **Urgency** — how soon must this ship? | <0–5> | <one sentence: what breaks or degrades without it; 0 = no time pressure, 5 = blocking users/pipeline now> |
|
|
38
|
+
| **Necessity** — does the product need this at all? | <0–5> | <one sentence: what gap this fills vs workaround quality; 0 = nice-to-have with easy workaround, 5 = core functionality missing> |
|
|
39
|
+
|
|
40
|
+
Score guide:
|
|
41
|
+
- 0 = no signal / not applicable
|
|
42
|
+
- 1 = minimal — workaround is fine for the foreseeable future
|
|
43
|
+
- 2 = low — improves quality of life, not blocking
|
|
44
|
+
- 3 = moderate — noticeable gap; workaround exists but costs effort
|
|
45
|
+
- 4 = high — significant pain point; workaround is fragile or expensive
|
|
46
|
+
- 5 = critical — blocking users, pipeline, or a committed deliverable
|
|
47
|
+
|
|
48
|
+
## Premises
|
|
49
|
+
<bulleted list of assumptions the idea rests on — things that must be true for the idea to deliver value; if any premise is false, the idea collapses or must be reshaped>
|
|
50
|
+
|
|
51
|
+
## Pros
|
|
52
|
+
<bulleted list of concrete benefits — what ships, what improves, what risk is reduced>
|
|
53
|
+
|
|
54
|
+
## Cons
|
|
55
|
+
<bulleted list of costs — complexity added, maintenance burden, scope risk, opportunity cost>
|
|
56
|
+
|
|
57
|
+
## Better Alternatives
|
|
58
|
+
<bulleted list of alternative approaches (if any) that could achieve a similar outcome with lower cost or risk; "None identified" if the idea is the best known approach>
|
|
59
|
+
|
|
60
|
+
## Recommendation
|
|
61
|
+
<proceed | reshape | drop> — <one-line rationale linking scores, premises, and pros/cons>
|
|
62
|
+
|
|
63
|
+
Stakes: <plain-English cost of proceeding vs not; reversibility; blast radius>
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
**Approve** this evaluation to continue to feature-create.
|
|
68
|
+
**Reject** to cancel the run (no feature created).
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Pipeline contract
|
|
72
|
+
|
|
73
|
+
| Item | Value |
|
|
74
|
+
|------|--------|
|
|
75
|
+
| Filled instance path | `.spur/run/idea-eval-report.md` |
|
|
76
|
+
| Template home | this file |
|
|
77
|
+
| HITL state | `idea-eval` in `idea-pipeline.yaml` |
|
|
78
|
+
| Approve | continue → `feature-create` |
|
|
79
|
+
| Reject / cancel | → `cancelled` (no feature) |
|
|
80
|
+
| `--auto` | still pauses unless taste pre-cleared (`--approve-taste` → `idea_approved=true`) |
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: inline-pipeline-driver
|
|
3
|
+
description: "Interactive host-session interpreter for task-pipeline.yaml: execute the existing FSM without a workflow agent subprocess while preserving actions, guards, artifacts, and provenance."
|
|
4
|
+
see_also:
|
|
5
|
+
- spur-dev
|
|
6
|
+
- execution-workflow
|
|
7
|
+
- execution-batch
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Inline Pipeline Driver
|
|
11
|
+
|
|
12
|
+
This driver is the interactive control-inversion path granted by ADR-047. It applies only when an
|
|
13
|
+
interactive `/sp:dev-run --mode full` or sequential `/sp:dev-runall` invocation omits `--agent` or
|
|
14
|
+
passes `--agent inline`. A named executor, `--agent auto`, parallel batch mode, `spur workflow run`,
|
|
15
|
+
and `spur agent run` keep the existing subprocess path.
|
|
16
|
+
|
|
17
|
+
The project runtime definition at `.spur/workflows/task-pipeline.yaml` remains the sole FSM definition.
|
|
18
|
+
The driver MUST read that file
|
|
19
|
+
at invocation time. It must not copy the state list, actions, guards, or transition order into a
|
|
20
|
+
command, skill, script, or second workflow.
|
|
21
|
+
|
|
22
|
+
## Run setup
|
|
23
|
+
|
|
24
|
+
1. Resolve `<wbs>`, `--auto`, and any explicit `--vars`; read the YAML and overlay its `vars` defaults
|
|
25
|
+
with those invocation values. An explicit `vars.agent` / `vars.implementAgent` is an executor
|
|
26
|
+
selection and therefore chooses the subprocess workflow path.
|
|
27
|
+
2. Allocate a collision-resistant inline run id (`uuidgen`, with a timestamp/pid fallback), create
|
|
28
|
+
`.spur/run/`, and use `.spur/run/<run-id>.log` as the run log.
|
|
29
|
+
3. Resolve the host session id from `.spur/context/.session.json`, accepting the normalized hook key
|
|
30
|
+
`session` and the Codex key `session_id` (in that order). If neither is available, allocate
|
|
31
|
+
`host-session-<run-id>` and record that fallback in the log; provenance must never be blank or
|
|
32
|
+
guessed from an executor subprocess.
|
|
33
|
+
4. Record lifecycle provenance before entering the FSM:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
spur task run-link <wbs> --source inline-full --run-id <run-id> --json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
This is required for the normal `testing → done` provenance guard. It is not a guard bypass.
|
|
40
|
+
|
|
41
|
+
## YAML interpreter
|
|
42
|
+
|
|
43
|
+
Start at `initialState`. For each current state, execute its `onEnter` actions in declaration order,
|
|
44
|
+
then evaluate outgoing transitions in declaration order and take the first passing guard. Stop only
|
|
45
|
+
at a declared terminal state or a surfaced HITL pause. The `iterationBound` remains mandatory.
|
|
46
|
+
|
|
47
|
+
Action semantics come from the YAML and the workflow action contract:
|
|
48
|
+
|
|
49
|
+
- `shell` — run the expanded command in the project working tree with resolved vars exported as
|
|
50
|
+
environment variables. A non-zero result follows the action's existing failure policy.
|
|
51
|
+
- `note` — append the expanded message to the inline run log.
|
|
52
|
+
- `file.read.into-var` — read the declared file into the declared run variable before subsequent
|
|
53
|
+
actions/guards.
|
|
54
|
+
- `hitl.confirm` — under `profile=auto`, follow the YAML's auto-skip transition. Otherwise pause,
|
|
55
|
+
surface the prompt, and resume from the same state with the operator's answer.
|
|
56
|
+
- `agent.run` — execute the action's slash command, native-subagent-first (task 0508). Do not call
|
|
57
|
+
`spur agent run` and do not re-enter `/sp:dev-run --mode full`. Preserve the YAML options: capture
|
|
58
|
+
`answerFile`; assert `expectFile`; enforce `requireDiff` against a pre-action git snapshot,
|
|
59
|
+
including the task-scope guard; honor declared error policy. `timeoutMs` is recorded as not
|
|
60
|
+
applicable because the host session has no independent kill boundary.
|
|
61
|
+
|
|
62
|
+
**Native-subagent dispatch (R2 eligibility, evaluated before each action):**
|
|
63
|
+
|
|
64
|
+
1. The invocation is one of the two interactive inline full-pipeline surfaces (`dev-run --mode full`
|
|
65
|
+
or sequential `dev-runall`, omit/`inline`).
|
|
66
|
+
2. The YAML action kind is `agent.run` and its input is a pure slash command. Shell, note, file,
|
|
67
|
+
guard, and operator-interaction actions remain host-executed.
|
|
68
|
+
3. The current state/action has no operator-confirmation action, `pause: true`, approve/taste/ask
|
|
69
|
+
decision, or other operator prompt.
|
|
70
|
+
4. The platform exposes a native subagent that shares the working tree and has read, write, shell,
|
|
71
|
+
and Spur task/run-artifact access.
|
|
72
|
+
|
|
73
|
+
All four pass → dispatch. Any pre-dispatch failure → execute the stage **once** in the host session.
|
|
74
|
+
No token estimate, stage-size threshold, model heuristic, or configuration switch is added.
|
|
75
|
+
|
|
76
|
+
**Dispatch and join:** before dispatch, capture the same pre-action git snapshot used by
|
|
77
|
+
`requireDiff` enforcement. Send only: the stage id, the YAML's exact pure slash command, and
|
|
78
|
+
`execution surface already resolved: native subagent; do not dispatch this stage again`. The WBS/path
|
|
79
|
+
already carried by the slash command is the handoff — do not paste task/session transcripts or embed
|
|
80
|
+
machine-specific session paths. Dispatch exactly one native subagent and wait for it; the inline FSM
|
|
81
|
+
must not advance actions or guards concurrently (one writer at a time). After join, validate
|
|
82
|
+
`answerFile`, `expectFile`, `requireDiff`, task scope, and the action's error policy from the shared
|
|
83
|
+
filesystem — a subagent success message is not evidence. On success append exactly:
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
stage <id> executed via subagent <agent-id> (host session <session-id>)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Host fallback retains exactly `stage <id> executed inline in session <session-id>`. If launch fails
|
|
90
|
+
before the subagent starts, log the reason and use host fallback. If a started subagent fails or
|
|
91
|
+
leaves invalid artifacts, do **not** replay the stage in the host — follow the YAML error policy so
|
|
92
|
+
partial mutations are not duplicated.
|
|
93
|
+
|
|
94
|
+
**Host-owned interaction:** the host alone executes operator-confirmation actions, owns
|
|
95
|
+
`pause: true`, and surfaces approve/taste/ask decisions. A subagent that discovers missing authority
|
|
96
|
+
or an operator decision returns a blocker; the host pauses at the current state and presents it. The
|
|
97
|
+
subagent cannot approve, infer consent, or recursively invoke the full pipeline.
|
|
98
|
+
|
|
99
|
+
After every successful inline `agent.run` action append exactly one provenance line (inline or
|
|
100
|
+
subagent form above) to `.spur/run/<run-id>.log`, where `<id>` is the current YAML state id. Also
|
|
101
|
+
log start/failure and the ignored timeout value so an inline run remains auditable without
|
|
102
|
+
fabricating an `AgentRunTracedResult`.
|
|
103
|
+
|
|
104
|
+
Transition guards are not advisory. Execute the declared guard exactly, in order, with the same
|
|
105
|
+
resolved variables and artifacts. `--no-lifecycle` remains bookkeeping only; the YAML's task checks,
|
|
106
|
+
verdict gate, record step, and done guard all remain authoritative.
|
|
107
|
+
|
|
108
|
+
## Batch use
|
|
109
|
+
|
|
110
|
+
Sequential `/sp:dev-runall` with omit/`inline` runs this driver once per ready WBS, with a fresh run
|
|
111
|
+
id and the same frozen/topologically ordered batch plan. Batch inspection, halt/keep-going policy,
|
|
112
|
+
and reporting remain in `execution-batch.md`. Parallel mode cannot share one host session safely and
|
|
113
|
+
therefore keeps the existing isolated subprocess/worktree path (trigger 4).
|
|
114
|
+
|
|
115
|
+
## Failure contract
|
|
116
|
+
|
|
117
|
+
Never silently fall back from this interactive inline path to `agent.default`. If the driver cannot
|
|
118
|
+
read the YAML, allocate provenance, execute an action, or evaluate a guard, stop at that state and
|
|
119
|
+
report the run id, state id, original error, and the concrete resume/retry command. The working tree
|
|
120
|
+
and run artifacts are the recovery input.
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: planning-workflow
|
|
3
|
+
description: "Extracted section: the planning half — intake → feature create → AC generation → feature check gate → decomposition → batch-create gate → refine. The full step-by-step procedure for turning a vague description into a validated, decomposed feature."
|
|
4
|
+
see_also:
|
|
5
|
+
- spur-dev
|
|
6
|
+
- decomposition
|
|
7
|
+
- ac-style-guide
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Planning Workflow
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
vague description
|
|
14
|
+
→ intake (clarify scope, constraints — prompt work)
|
|
15
|
+
→ spur feature create … ; AC authored/generated (spur agent run, bdd templates)
|
|
16
|
+
→ GATE: spur feature check (BDD validator; loop until clean)
|
|
17
|
+
→ decomposition (prompt work) → task-batch JSON
|
|
18
|
+
→ GATE: task-batch.schema.json + spur task batch-create (atomic: all-or-nothing)
|
|
19
|
+
→ design doc (conditional: seam heuristic under default; skip with --skip-design) → docs/design/<slug>.md + 04 index
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
The planning half transforms a description into a validated feature file with acceptance
|
|
24
|
+
criteria, then decomposes it into a batch of tasks. Two CLI gates make LLM regressions
|
|
25
|
+
unable to corrupt the corpus: `spur feature check` validates the AC, and
|
|
26
|
+
`task-batch.schema.json` validates the decomposition shape before `spur task batch-create`
|
|
27
|
+
writes anything.
|
|
28
|
+
|
|
29
|
+
## Step 1: Intake
|
|
30
|
+
|
|
31
|
+
When given a feature description, clarify before creating:
|
|
32
|
+
|
|
33
|
+
1. **Scope** — what is in, what is explicitly out. Record both.
|
|
34
|
+
2. **Constraints** — existing systems it must work with, performance/security boundaries.
|
|
35
|
+
3. **Success criteria** — how will we know it's done? (Feeds AC generation.)
|
|
36
|
+
|
|
37
|
+
Ask only what is ambiguous. A crisp description needs no Q&A loop — proceed directly to feature
|
|
38
|
+
creation.
|
|
39
|
+
|
|
40
|
+
## Step 2: Feature creation + AC generation
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
spur feature create "<name>" [--parent <id>]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The feature file lands in `docs/features/<ID>_<slug>.md`. Immediately author the `## Goal`
|
|
47
|
+
(single sentence) and `## Scope` (in/out bullets).
|
|
48
|
+
|
|
49
|
+
Then generate **BDD acceptance criteria** in the `## Acceptance Criteria` section using the
|
|
50
|
+
Gherkin template. Conventions:
|
|
51
|
+
|
|
52
|
+
- **R-numbered scenarios:** each scenario carries an `R1, R2, …` prefix in its title for
|
|
53
|
+
cheap, human-readable traceability. (Coverage matching is by **normalized scenario title** —
|
|
54
|
+
the R-prefix is stripped before matching — so keep the title text stable, not just the number.)
|
|
55
|
+
- **Two AC tiers:** core scenarios (the must-pass gate) and edge-case scenarios (advisory
|
|
56
|
+
warnings — the permissive start, per DD-06). Mark edge-case scenarios explicitly.
|
|
57
|
+
- **Scenario-title mapping:** the scenario title is the identity key for traceability edges
|
|
58
|
+
to task files — keep them stable and unique.
|
|
59
|
+
- Generate AC inline (current session) with the BDD template
|
|
60
|
+
(`.spur/templates/bdd/gherkin.md`), or escalate to `spur agent run` only when a
|
|
61
|
+
[subprocess trigger](cross-cutting.md#inline-default-execution-surface) applies. **Thread
|
|
62
|
+
`--agent` through** when the command forwarded one. See the
|
|
63
|
+
[inline-default execution-surface contract](cross-cutting.md#inline-default-execution-surface).
|
|
64
|
+
|
|
65
|
+
Full authoring conventions: see [ac-style-guide.md](ac-style-guide.md).
|
|
66
|
+
|
|
67
|
+
## Step 3: Feature check gate (loop)
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
spur feature check <id> --json
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The BDD validator gate. A non-zero exit means findings:
|
|
74
|
+
|
|
75
|
+
1. Read each finding from the JSON output.
|
|
76
|
+
2. Fix the **specific** AC issue — never restructure unrelated scenarios.
|
|
77
|
+
3. Re-run. Loop until exit 0.
|
|
78
|
+
|
|
79
|
+
This gate catches: malformed Gherkin, missing required scenario elements, traceability gaps.
|
|
80
|
+
A skill regression can never corrupt the corpus — worst case is a rejected write with findings
|
|
81
|
+
the skill can react to.
|
|
82
|
+
|
|
83
|
+
## Step 4: Decomposition
|
|
84
|
+
|
|
85
|
+
**Default: do not decompose.** A clean feature does not automatically become many tasks. The
|
|
86
|
+
default outcome is one task whose `## Plan` carries the implementation steps; splitting is the
|
|
87
|
+
exception you justify with the rubric. See the `sp:spec-decomposition` skill ("Default to NOT
|
|
88
|
+
decomposing") — read it before this step.
|
|
89
|
+
|
|
90
|
+
1. **Score the feature with the rubric first.** Compute E/D/L/C/R for the *whole* feature. Record
|
|
91
|
+
the assessment (this is a required artifact, not optional):
|
|
92
|
+
- **Score 0–2 → keep as one task.** Stop. Author one task (Background + Requirements from the
|
|
93
|
+
feature, the implementation steps as its `## Plan`). Do NOT call `batch-create`. You're done
|
|
94
|
+
with decomposition.
|
|
95
|
+
- **Score 3–4 → decomposition optional.** Prefer one task with a rationale unless a clear
|
|
96
|
+
deliverable boundary justifies a split.
|
|
97
|
+
- **Score 5+, or a force-decompose override fires → decompose.** Continue to step 2.
|
|
98
|
+
2. **Only now design the split** — by deliverable boundary, never by phase or by list-item. Read
|
|
99
|
+
the feature's scenarios (the AC); each resulting task maps to ≥1 scenario by title.
|
|
100
|
+
3. **Score each candidate child.** Any candidate that scores 0–2 on its own is a `## Plan` step of
|
|
101
|
+
a sibling, not a task — merge it. This is the check that stops a 6-item finding list becoming 6
|
|
102
|
+
tiny tasks.
|
|
103
|
+
4. Produce a **task-batch JSON** document conforming to `task-batch.schema.json` — a top-level
|
|
104
|
+
JSON **array** of strict task items (no `tasks` wrapper, only documented fields).
|
|
105
|
+
|
|
106
|
+
Decomposition heuristics (apply only after deciding to decompose):
|
|
107
|
+
- **One task = one atomic unit of work** a single agent can complete (target 2–8h; never <2h).
|
|
108
|
+
- **Scenario coverage:** every core scenario maps to ≥1 task; edge-case scenarios may map
|
|
109
|
+
or be deferred.
|
|
110
|
+
- **Sub-tasks:** record `parent_wbs` (quoted, e.g. `"0042"`) for sub-tasks; note ordering in
|
|
111
|
+
`background` prose (the item schema has no `dependencies` field).
|
|
112
|
+
- **Template variants:** choose `feature-impl` for implementation tasks (pulls Goal →
|
|
113
|
+
Background from the linked feature, per B09).
|
|
114
|
+
- **Record the rubric score** in each child's `background` (a trailing line, e.g.
|
|
115
|
+
*"Rubric: E2 D1 L1 C1 R2 = 7 → decompose (force: R=high)."*) — the assessment artifact the
|
|
116
|
+
gate below checks for.
|
|
117
|
+
|
|
118
|
+
The batch JSON is the LLM→CLI contract — see the `sp:spec-decomposition` skill for the
|
|
119
|
+
full schema and conventions.
|
|
120
|
+
|
|
121
|
+
## Step 5: Batch-create gate
|
|
122
|
+
|
|
123
|
+
**Pre-check (soundness, before the CLI gate).** Re-read each item in the batch JSON against the
|
|
124
|
+
rubric before submitting. Specifically:
|
|
125
|
+
|
|
126
|
+
- Would this item score 0–2 on its own? → it is a Plan step; merge it into a sibling or back into
|
|
127
|
+
the parent. Do not submit it as a task.
|
|
128
|
+
- Is the batch one-item-per-list-entry (one finding → one task, one scenario → one task)? → you
|
|
129
|
+
are reflex-decomposing. Re-score and merge.
|
|
130
|
+
- Does each item carry its rubric-score line in `background`? → if not, the assessment is missing;
|
|
131
|
+
score it before submitting.
|
|
132
|
+
|
|
133
|
+
Only then run the CLI gate:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
spur task batch-create --file <batch.json>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Atomic: all-or-nothing. If `task-batch.schema.json` validation fails, **nothing is written**
|
|
140
|
+
and findings are returned. The schema validates shape only (it cannot reject over-decomposition —
|
|
141
|
+
that is the pre-check's job above). Common shape failures:
|
|
142
|
+
|
|
143
|
+
- Missing required fields per the template variant's section matrix.
|
|
144
|
+
- Invalid status values (must be lowercase canonical).
|
|
145
|
+
- `feature_id` referencing a non-existent feature.
|
|
146
|
+
- WBS collisions (already-allocated range).
|
|
147
|
+
|
|
148
|
+
Loop until the command exits 0 — then the batch is created and each task appears in the
|
|
149
|
+
feature's `## Tasks` block on next `spur feature refresh`.
|
|
150
|
+
|
|
151
|
+
**If you decomposed a parent task into sub-task files** (the children carry `parent_wbs`), the
|
|
152
|
+
sub-task roster is **auto-generated** — `spur task batch-create` invokes `spur task refresh-roster`
|
|
153
|
+
for each distinct `parent_wbs` after the atomic create lands (task 0178 F1), and transitions
|
|
154
|
+
decomposed parents from `todo` to `wip` (task 0178 F2). You do **not** hand-write the roster;
|
|
155
|
+
re-run `spur task refresh-roster <parent-wbs>` to re-emit it after a child status change outside
|
|
156
|
+
`batch-create`. See `sp:spec-decomposition` ("Parent (umbrella) tasks") for the roster format and
|
|
157
|
+
the parent-completion rule.
|
|
158
|
+
|
|
159
|
+
## Step 5.5: Design package (unified `--skip-design` only)
|
|
160
|
+
|
|
161
|
+
Two design surfaces, **one operator opt-out** (aligned with `/sp:dev-idea`):
|
|
162
|
+
|
|
163
|
+
| Surface | What | Default |
|
|
164
|
+
|---------|------|---------|
|
|
165
|
+
| **Feature satellite** | `docs/design/<slug>.md` + `04_DESIGN.md` index | On when seam heuristic fires; **ties lean design**; off only with `--skip-design` |
|
|
166
|
+
| **Task `### Design`** | Per-task WHAT/WHY in each batch item's `design` field | **On by default** at decompose/batch-create; off with `--skip-design` |
|
|
167
|
+
|
|
168
|
+
There is **no** `--design` force flag. Design is **on by default**; **`--skip-design`** is the only
|
|
169
|
+
opt-out.
|
|
170
|
+
|
|
171
|
+
**`--skip-design` (unified):** skip the feature satellite **and** leave task `design` empty (scaffold
|
|
172
|
+
only). Refine is the **fallback** that fills blank Design before implement.
|
|
173
|
+
|
|
174
|
+
| Flags | Feature satellite | Task `### Design` in batch |
|
|
175
|
+
|-------|-------------------|----------------------------|
|
|
176
|
+
| (default / `--auto`) | seam heuristic (ties lean **design**) | **author `design` on each item** |
|
|
177
|
+
| `--skip-design` | skip | **omit `design`** (refine later) |
|
|
178
|
+
|
|
179
|
+
A task's in-file `### Design` is code-level and narrow. The feature satellite is cross-cutting. Both
|
|
180
|
+
are part of the same planning "design package" controlled by `--skip-design`.
|
|
181
|
+
|
|
182
|
+
**The seam heuristic (default / `--auto` decision).** A design doc is warranted when the feature
|
|
183
|
+
introduces an **ADR-worthy** change — anything that shifts a boundary another engineer must reason
|
|
184
|
+
about:
|
|
185
|
+
|
|
186
|
+
- a **new command** or a new flag that changes a command's contract,
|
|
187
|
+
- a **new module / package / service** (a new `apps/*` or `packages/*`, a new app-layer service),
|
|
188
|
+
- a **new schema** — a DB table/migration, a Zod config key, a DTO/contract shape,
|
|
189
|
+
- a **new transport / boundary** — an oRPC seam, an auth boundary, a job-queue or EventBus topic.
|
|
190
|
+
|
|
191
|
+
If the work is clearly internal to one module, a bug fix, a doc/chore, or a refactor with no boundary
|
|
192
|
+
change, **skip** — note the skip in the report. **When in doubt, lean design** (same ties rule as
|
|
193
|
+
idea-path `needs_design`). Use `--skip-design` only when the operator wants no satellite and blank
|
|
194
|
+
task Design.
|
|
195
|
+
|
|
196
|
+
**Authoring (skill-prose — no CLI verb).** The `04` index is a hand-curated derived doc
|
|
197
|
+
(constitution §4.5 rule 4 / §6.5), so write it directly, in the fixed **detail-first then index**
|
|
198
|
+
order (§4.5 rule 5 / sync trigger **T9**):
|
|
199
|
+
|
|
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. Capture
|
|
202
|
+
the chosen approach + one-line reason, rejected alternatives, key interface/type **signatures**
|
|
203
|
+
(not bodies), invariants, and the surface it touches. Do **not** restate the satellite file format
|
|
204
|
+
here — follow the shape of existing satellites (`docs/design/server-side-adjustment-design.md`,
|
|
205
|
+
`workflow-observability.md`).
|
|
206
|
+
2. **Index second.** Add or update the satellite's row in `docs/04_DESIGN.md §0` (the `| Satellite |
|
|
207
|
+
Area | Status |` table) — pointer + one-line area + status only, never a restatement of the body.
|
|
208
|
+
|
|
209
|
+
**Idempotency (re-runnable).** `/sp:dev-plan` may run many times for one feature. If the
|
|
210
|
+
satellite already exists: **update in place** — merge new design content into its sections, refresh
|
|
211
|
+
its `updated_at`, and leave its existing `04` index row alone (or adjust only its status). **Never**
|
|
212
|
+
overwrite the whole file, create a second satellite, or add a duplicate index row. The invariant
|
|
213
|
+
(§4.5 rule 1): exactly one `04 §0` row per satellite, every satellite reachable from exactly one row.
|
|
214
|
+
|
|
215
|
+
**Report (no confirmation pause).** Under `--auto`, generation is autonomous — when the heuristic
|
|
216
|
+
fires, author the doc and **report** the chosen slug and a one-line rationale ("authored
|
|
217
|
+
`docs/design/<slug>.md` — new `spur <noun>` command + config key"); when it does not fire, report the
|
|
218
|
+
skip and why. Do not pause to ask; the operator reviews the satellite afterward.
|
|
219
|
+
|
|
220
|
+
## Step 6: Refine before execute (the spec-completion gate)
|
|
221
|
+
|
|
222
|
+
`batch-create` accepts optional `design` / `plan` / `acceptance_criteria` fields (plus
|
|
223
|
+
`background` / `requirements`). **Default planning path:** the decomposition agent fills `design`
|
|
224
|
+
(and preferably Plan/AC) so tasks land **content-ready**. **`--skip-design`:** leave `design`
|
|
225
|
+
empty — headings only.
|
|
226
|
+
|
|
227
|
+
**Refine is the fallback**, not the primary Design author:
|
|
228
|
+
|
|
229
|
+
```text
|
|
230
|
+
/sp:dev-refine <wbs> # single task — fills blank Design/AC/Plan if L3 gaps
|
|
231
|
+
/sp:dev-refineall --feature X --auto
|
|
232
|
+
/sp:dev-refineall --feature X --auto --depth ready # implement-ready freeze (no L3-only SKIP)
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Under `--auto` + **`--depth standard`** (default), refine **SKIP**s when target sections
|
|
236
|
+
(Background, Requirements, AC, Design, Plan) already have no L3 findings. If Design is still
|
|
237
|
+
placeholder, synthesis runs (standard tier by default; escalates only on gate-fail). Under
|
|
238
|
+
**`--depth ready`**, do not SKIP on L3-clean alone — run the implement-ready checklist in
|
|
239
|
+
[dev-operations.md](dev-operations.md) § refine (frozen APIs, anti-patterns, file targets, handoffs)
|
|
240
|
+
so another agent can implement without inventing design.
|
|
241
|
+
|
|
242
|
+
**Check the variant before you write.** Which sections a task carries is decided by its `template:`
|
|
243
|
+
frontmatter against `.spur/tasks/section-matrix.yaml` — NOT a fixed list. Before authoring any
|
|
244
|
+
section, run `spur task check <wbs> --json` and read `requiredSections` / the L2 findings: they tell
|
|
245
|
+
you exactly what this variant allows at the current status. The default `standard` variant wants
|
|
246
|
+
`Acceptance Criteria` + `Design` + `Plan` at `todo`, but other variants differ — e.g. the `review`
|
|
247
|
+
variant puts findings under `### Background` (`#### Review Findings`) and the fix checklist in
|
|
248
|
+
`### Plan`, and does **not** use `### Requirements`/`### Acceptance Criteria`. Authoring a section
|
|
249
|
+
that isn't in the variant's allowed list produces an L2 "not allowed in this variant/status" warning
|
|
250
|
+
and an off-variant task. Write only what the matrix permits; route findings/checklists into the
|
|
251
|
+
sections the variant actually defines.
|
|
252
|
+
|
|
253
|
+
**Avoid creating off-variant sections in the first place.** There is no section-delete verb —
|
|
254
|
+
intentionally none (the CLI surface stays minimal). Writing an empty body via
|
|
255
|
+
`spur task update <wbs> --section <name> --from-file <empty-file>` currently leaves a **bare
|
|
256
|
+
heading**, not a removal. So once an off-variant section exists, it cannot be cleanly dropped from
|
|
257
|
+
the skill — the prevention (check the variant before writing, above) is the only reliable path. If
|
|
258
|
+
you must correct an off-variant section, overwrite its body with a single line pointing at the
|
|
259
|
+
correct section (e.g. *"See `### Plan` for the fix checklist."*) rather than leaving it empty.
|
|
260
|
+
|
|
261
|
+
**Do this just-in-time, per task, immediately before execution** — not in bulk at decomposition
|
|
262
|
+
time. Design written against a stale snapshot of the codebase rots; design written right before
|
|
263
|
+
`implement` reflects current reality. Refine `0042`, run `0042`; refine `0043`, run `0043`.
|
|
264
|
+
|
|
265
|
+
**Batch refine (optional pre-pass).** When an operator wants every planning-side task under a
|
|
266
|
+
feature filled before a runall, use `/sp:dev-refineall --feature <id> --auto` (batch counterpart
|
|
267
|
+
of `/sp:dev-refine`). It reuses the same per-task refine operation, freezes the set, topo-sorts by
|
|
268
|
+
`dependencies[]`, and emits a batch report — see [dev-operations.md](dev-operations.md) § refineall.
|
|
269
|
+
This does **not** replace just-in-time refine before each implement; it is a bulk pre-pass when the
|
|
270
|
+
feature's tasks are still `backlog`/`todo` placeholders. Prefer `--auto` for batch scale; avoid
|
|
271
|
+
`--next` on large features (that chains each task into run).
|
|
272
|
+
|
|
273
|
+
**Refine arguments** (defined on the `/sp:dev-refine` entry point, passed through verbatim; also
|
|
274
|
+
shared flags on `/sp:dev-refineall`):
|
|
275
|
+
|
|
276
|
+
| Argument | Effect |
|
|
277
|
+
|----------|--------|
|
|
278
|
+
| `--focus <mode>` | Narrows the gap analysis to a subset of domain hints. See the `sp:dev-refine` skill for the full value table (`all`, `requirements`, `background`, `constraints`, `acceptance`, `quick`). Default `all`. |
|
|
279
|
+
| `--depth <standard\|ready>` | Spec depth bar. `standard` (default) = L3 structural completeness + L3 SKIP under `--auto`. `ready` = implement-ready freeze (never L3-only SKIP). See [flag-glossary.md](flag-glossary.md#flag-depth). |
|
|
280
|
+
| `--auto` | Skip interactive Q&A — synthesize improvements from the task content alone. Use for well-scoped tasks where the agent can fill gaps without operator input. **Required for practical batch use** via `dev-refineall`. |
|
|
281
|
+
|
|
282
|
+
**Pre-synthesis skip gate (under `--auto` + `--depth standard`).** Before synthesizing, run `spur task check <wbs> --json`. When the **refine target sections** show no L3 findings, emit a structured SKIP instead of calling the synthesis agent. **Not applied when `--depth ready`.**
|
|
283
|
+
|
|
284
|
+
**Refine target sections (anti-drift lock):** `{Background, Requirements, Acceptance Criteria, Design, Plan}`.
|
|
285
|
+
These must be solid enough that a cheaper implementer cannot invent another path. **Solution is not a refine target** — it is written by implement as the as-built change-map.
|
|
286
|
+
|
|
287
|
+
```
|
|
288
|
+
SKIP — sections already meet L3: sections-considered=[Background, Requirements, Acceptance Criteria, Design, Plan], reason="no L3 findings for target sections"
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
This is the expected outcome for a task that is already well-specified. Under `--auto`, a SKIP is not an error — it means no gap was found. The operator can verify by reading the check output or the task file directly. Synthesis is only invoked when a real gap exists in a target section (including empty/placeholder Design or AC).
|
|
292
|
+
|
|
293
|
+
> **Requirements formatting:** author R-items as a GitHub task-list checkbox — `- [ ] R1. <text>`
|
|
294
|
+
> — one per line, so progress is trackable in the file. Keep the `Rn.` (period) token inside the
|
|
295
|
+
> marker so the R-numbering rule recognizes it.
|
|
296
|
+
>
|
|
297
|
+
> The L3 check *tolerates* `- Rn.` and bare `Rn.` for backward compatibility with the existing
|
|
298
|
+
> corpus — that tolerance is **not** permission to emit them. A bare `Rn.` line carries no markdown
|
|
299
|
+
> list marker, so consecutive items collapse into one run-on paragraph in the Board's markdown
|
|
300
|
+
> preview while `spur task check` still passes. Emit the checkbox form on every write path
|
|
301
|
+
> (refine synthesis, `spur task update --section`, and `batch-create` bodies — see
|
|
302
|
+
> `sp:spec-decomposition` → `references/decomposition.md`, "Section bodies are markdown").
|