@gobing-ai/spur 0.4.12 → 0.4.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/rules/boundary/config-loading-ownership.yaml +1 -1
- package/config/rules/strict/runtime-boundaries.yaml +2 -2
- package/config/rules/typescript/output-boundaries.yaml +4 -10
- package/config/workflows/task-pipeline.yaml +2 -2
- package/package.json +1 -1
- package/plugins/sp/commands/dev-run.md +1 -1
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +3 -3
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +4 -4
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
- package/plugins/sp/skills/spur-dev/references/idea-evaluation.md +1 -1
- package/spur.js +251 -246
- package/web/_astro/{BoardApp.BMprmPRc.js → BoardApp.Bjdp3XWV.js} +36 -36
- package/web/_astro/{BoardApp.B5rTVNd_.js → BoardApp.DCDZxLlQ.js} +1 -1
- package/web/_astro/{TaskDetail.Ddsur8qd.js → TaskDetail.B3vBxynO.js} +1 -1
- package/web/_astro/{arc.DLqVVBxP.js → arc.DcuHTB_T.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.C-Pk3uAi.js → architectureDiagram-3BPJPVTR.ClOFWBON.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.BRO1i_Nm.js → blockDiagram-GPEHLZMM.otYyr7Zb.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.BU_cWu6e.js → c4Diagram-AAUBKEIU.BCjpc9LP.js} +1 -1
- package/web/_astro/channel.qgOLXjI_.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.D2VXiQ2t.js → chunk-2J33WTMH.D5Wpnpt_.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.BcHT772J.js → chunk-4BX2VUAB.DkQGtWNz.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.DhDtICmo.js → chunk-55IACEB6.B7dqjAip.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.BoKHp7gV.js → chunk-727SXJPM.BDQvnKE2.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.Chu4JRpE.js → chunk-AQP2D5EJ.D92doBX5.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.wHdwKPlq.js → chunk-FMBD7UC4.C968oI5G.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.ffN-M1JB.js → chunk-ND2GUHAM.AkkYC1bY.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.FRubwg4S.js → chunk-QZHKN3VN.sCc-rKKo.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.c22tQsc_.js → classDiagram-4FO5ZUOK.pOQ9u0mY.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.c22tQsc_.js → classDiagram-v2-Q7XG4LA2.pOQ9u0mY.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.B9c6fiSj.js → cose-bilkent-S5V4N54A.CRaeD6FY.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.DrZsrUHl.js → cynefin-OW5HDTMX.BiCPBu54.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.DG1U4b3y.js → dagre-BM42HDAG.C1-q3vkT.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.CH15b-K3.js → diagram-2AECGRRQ.BSVOv30O.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.BH1j7twR.js → diagram-5GNKFQAL.CHMkjJ-V.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.q2zCkbAj.js → diagram-KO2AKTUF.CKY9M564.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.BLaaZnHV.js → diagram-LMA3HP47.B9yNJiTP.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.BcpRdQwI.js → diagram-OG6HWLK6.Dk8AUGsk.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.D7KBlqfM.js → erDiagram-TEJ5UH35.BQHR89TZ.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.D_gmuRqg.js → flowDiagram-I6XJVG4X.oNkWVgoK.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.DzgWYniD.js → ganttDiagram-6RSMTGT7.Kz2U2nu9.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.576i3hm3.js → gitGraphDiagram-PVQCEYII.DHIZ_wPq.js} +1 -1
- package/web/_astro/{infoDiagram-5YYISTIA.DMCclBiz.js → infoDiagram-5YYISTIA.D0NJLcv9.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.9Kyca4SH.js → ishikawaDiagram-YF4QCWOH.CFEfTWRG.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.chbdG-8q.js → journeyDiagram-JHISSGLW.Dc7IE7I4.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.Bds54-e0.js → kanban-definition-UN3LZRKU.D5v0xO9k.js} +1 -1
- package/web/_astro/{linear.D5ND9GN_.js → linear.wR5KzXnE.js} +1 -1
- package/web/_astro/{mermaid.core.D9N_PGbj.js → mermaid.core.BDQ2FoPd.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.t0xop5vp.js → mindmap-definition-RKZ34NQL.W6_INsia.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.DqgKh6hM.js → pieDiagram-4H26LBE5.61ihbgkK.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.DeuHVi2t.js → quadrantDiagram-W4KKPZXB.B5lEpFLo.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.BdYFSG4W.js → requirementDiagram-4Y6WPE33.CmhVBVX0.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.k1LPPETJ.js → sankeyDiagram-5OEKKPKP.D7Vvj9Wf.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.DdyfpzoG.js → sequenceDiagram-3UESZ5HK.B1vPLixM.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.DSEI8il0.js → stateDiagram-AJRCARHV.BnACmrGi.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.CoMnQRKo.js → stateDiagram-v2-BHNVJYJU.CW4pnmc3.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.DM1AHNm-.js → timeline-definition-PNZ67QCA.CkzMCPnC.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.C-cJmVtl.js → vennDiagram-CIIHVFJN.CY4aNdAR.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.D0xMzKPb.js → wardleyDiagram-YWT4CUSO.BtoU9UFk.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.BH5xJcEq.js → xychartDiagram-2RQKCTM6._9ijUUAs.js} +1 -1
- package/web/index.html +1 -1
- package/web/_astro/channel.Bs3Illhy.js +0 -1
|
@@ -67,7 +67,7 @@ rules:
|
|
|
67
67
|
exclude:
|
|
68
68
|
- "packages/config/src/**"
|
|
69
69
|
- "apps/cli/src/index.ts"
|
|
70
|
-
- "apps/cli/src/workflow-transport.ts" # boot-free composition root of `spur workflow
|
|
70
|
+
- "apps/cli/src/workflow-transport.ts" # boot-free composition root of `spur workflow commit-guard|persist-*` (PR-4)
|
|
71
71
|
- "apps/server/src/serve.ts"
|
|
72
72
|
- "apps/server/src/context.ts"
|
|
73
73
|
- "**/tests/**"
|
|
@@ -101,8 +101,8 @@ rules:
|
|
|
101
101
|
- "packages/app/src/services/history-anatomy.ts" # deterministic history-anatomy cache core (task 1005 R2): fsync'd tmp+rename atomic publish, readdir digest scans and sync report reads must stay byte-stable; bundled standalone for the bare-node plugin twin (mirrors agent-usage-producer.ts / history-service.ts exemptions)
|
|
102
102
|
- "packages/app/src/observability/workflow-run-log-sink.ts" # sync FD append for mid-run tail-able all-in-one run log (task 0426 / feature D2); append() is sync from the observability bus
|
|
103
103
|
- "packages/app/src/observability/agent-run-log.ts" # same primitive as the sink above for the per-run agent stream (task 1076 R1, ADR-132); append() is sync from the agent service's own onOutput hook, and the byte cap needs the FD position it tracks
|
|
104
|
-
#
|
|
105
|
-
# verbatim from the plugin scripts
|
|
104
|
+
# Workflow transports (script-absorption PR-4, `spur workflow commit-guard`): moved
|
|
105
|
+
# verbatim from the plugin scripts; synchronous probes and
|
|
106
106
|
# atomic tmp+rename snapshot writes inside one short-lived CLI process.
|
|
107
107
|
- "packages/app/src/workflow/commit-guard.ts" # .spur/run/<run>-tree-start.json atomic snapshot + target conflict-marker reads
|
|
108
108
|
- "packages/app/src/workflow/persist-check.ts" # recursive evidence-tree listing + byte comparison of both trees
|
|
@@ -17,11 +17,6 @@ rules:
|
|
|
17
17
|
type: rg
|
|
18
18
|
config:
|
|
19
19
|
pattern: "console\\.(log|error|warn|info|debug|dir|time|trace)"
|
|
20
|
-
# Task 1006 R3: the inline-run driver's fail-closed stderr lines moved here from the
|
|
21
|
-
# plugin script (byte-stable driver contract, emitted through the bundled lib under
|
|
22
|
-
# bare node); the output seam is a CLI-layer dependency the app service cannot take.
|
|
23
|
-
exclude:
|
|
24
|
-
- "packages/app/src/services/inline-run-setup.ts"
|
|
25
20
|
|
|
26
21
|
- id: no-raw-stdout-stderr
|
|
27
22
|
description: "Use the output seam (ts-utils echo/echoError) instead of process.stdout/stderr.write directly."
|
|
@@ -30,10 +25,9 @@ rules:
|
|
|
30
25
|
type: rg
|
|
31
26
|
config:
|
|
32
27
|
pattern: "process\\.(stdout|stderr)\\.write"
|
|
33
|
-
#
|
|
34
|
-
# stdout contract)
|
|
35
|
-
#
|
|
36
|
-
#
|
|
28
|
+
# Task 1006 R1: gate receipts (`check-receipt/v1`, one JSON line — the runner's parsed
|
|
29
|
+
# stdout contract) moved here from the plugin script. It must stay byte-stable through the
|
|
30
|
+
# bundled lib under bare node; the seam would rewrite framing the CLI/tests parse. Mirrors
|
|
31
|
+
# the history-anatomy bundling exemptions.
|
|
37
32
|
exclude:
|
|
38
33
|
- "packages/app/src/services/quality-gate.ts"
|
|
39
|
-
- "packages/app/src/services/inline-run-setup.ts"
|
|
@@ -114,8 +114,8 @@ vars:
|
|
|
114
114
|
# Timeout for the `implement` step specifically (R2a). Implementation is the
|
|
115
115
|
# heaviest agent.run step (full read/write/test-probe loop); the old 600s default
|
|
116
116
|
# failed five consecutive dogfood runs (bugs 742/744/746/748). Default is 45 min
|
|
117
|
-
# (task 1108);
|
|
118
|
-
#
|
|
117
|
+
# (task 1108); the host executor forwards it only when the host's dispatch tool
|
|
118
|
+
# accepts a timeout.
|
|
119
119
|
# Override per run: `--vars '{"implementTimeoutMs":"3600000"}'`.
|
|
120
120
|
implementTimeoutMs: "2700000"
|
|
121
121
|
# Answer captured by the review's approval decision point: "yes" | "no" | "cancel"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobing-ai/spur",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.13",
|
|
4
4
|
"description": "Spur CLI — local-first harness for mainstream coding agents: constraint checking, workflow orchestration, agent health, and history analytics. Bun-native; exposes the `spur` command.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"spur",
|
|
@@ -53,7 +53,7 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
53
53
|
|
|
54
54
|
**Flags:**
|
|
55
55
|
|
|
56
|
-
- `--auto` | `--agent <inline|auto|name>` — Skip objective HITL confirmations (taste/irreversible gates still pause). `--agent` names who does the model-bearing work. Interactive omit/`inline` keeps the controller and implement-only stages in this session; full mode reads `task-pipeline.yaml` as the SSOT and
|
|
56
|
+
- `--auto` | `--agent <inline|auto|name>` — Skip objective HITL confirmations (taste/irreversible gates still pause). `--agent` names who does the model-bearing work. Interactive omit/`inline` keeps the controller and implement-only stages in this session; full mode reads `task-pipeline.yaml` as the SSOT and runs on the host executor (`vars.executor: 'host'`; the engine walks its actions/guards and `spur workflow continue` advances each pause), whose eligible `agent.run` stages dispatch once to a native subagent and otherwise run in the host (0508 eligibility — task 0687 resolved-inline) It records `stage <id> executed inline in session <session-id>` or `stage <id> executed via subagent <agent-id> (host session <session-id>)` in the run log. `auto` or a name is merged into `vars.agent` and `vars.implementAgent` and keeps the existing subprocess workflow; `--agent fleet` maps the run to `vars.executor: 'fleet'` instead (fleet dispatch, 0942). Headless `spur workflow run` / `spur agent run` is unchanged. See the [execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
57
57
|
- `--escalation-file <path>` (implement step only, 0933) — names the Q/A escalation transcript
|
|
58
58
|
(default `.spur/run/<wbs>-escalation.md`). Absent on a first attempt means "no prior
|
|
59
59
|
escalations". When the implement agent needs an operator decision it appends its question to
|
package/plugins/sp/plugin.json
CHANGED
|
@@ -239,13 +239,13 @@ Inline avoids process startup and preserves the host session's context and tools
|
|
|
239
239
|
subprocess dispatch it provides **no isolated workspace**, **no per-stage subprocess action
|
|
240
240
|
record**, **no independent timeout or abort boundary**, and **no tier-selected executor**: the
|
|
241
241
|
executor is the current coding agent. Interactive pipelines retain a run log and session provenance
|
|
242
|
-
through the
|
|
242
|
+
through the host executor; task pipelines additionally record a task run-link. If process isolation or an independently killable
|
|
243
243
|
stage is required, select the subprocess path (`--agent auto` or `--agent <name>`).
|
|
244
244
|
|
|
245
245
|
## Shared startup contract (task 0814 R1/R3/R4/R6/R7/R8)
|
|
246
246
|
|
|
247
247
|
The workflow-backed dev commands (`dev-run`, `dev-runall`, `dev-refineall`, `dev-verifyall`) share one
|
|
248
|
-
startup order. The order is load-bearing and applies on both the
|
|
248
|
+
startup order. The order is load-bearing and applies on both the host executor and the subprocess
|
|
249
249
|
path. Runs that resolve a workflow definition publish the generated plan as their first action
|
|
250
250
|
(1105 R1); skill-only operations (refine/verify batches with no nested workflow) display their owned
|
|
251
251
|
procedure and do not fabricate a workflow YAML.
|
|
@@ -571,7 +571,7 @@ does not earn another full-gate run:
|
|
|
571
571
|
final gate.
|
|
572
572
|
3. **Red alone**, or a failure that is not a timeout → it is a real failure. Fix it.
|
|
573
573
|
4. Give the test an explicit per-test timeout and a WHY comment (see
|
|
574
|
-
`plugins/sp/tests/
|
|
574
|
+
`plugins/sp/tests/helpers/cli-surface.test.ts:81`) as soon as EITHER (a) the same test
|
|
575
575
|
load-flakes in two separate runs, OR (b) it times out once **outside the change scope** and then
|
|
576
576
|
passes green alone on three consecutive isolated reruns. **Prefer making the test cheap or
|
|
577
577
|
hermetic first** — a test that hashes the live checkout transitively, or writes a probe file into
|
|
@@ -76,7 +76,7 @@ each would be scope creep for one-liner procedures.
|
|
|
76
76
|
| 4 | run | `dev-run` | `Skill()` | `sp:spur-dev` (`run` / `implement`) | `<wbs> [--mode <full\|implement>] [--agent <inline\|auto\|name>] [--auto] [--next] [--wrap] [--continue] [--worktree [<name>]] [--no-summary]` |
|
|
77
77
|
| 5 | refine | `dev-refine` | `Skill()` | `sp:spur-dev` (`refine`) | `<wbs> [--focus <mode>] [--description <text>] [--depth <standard\|ready>] [--agent <inline\|auto\|name>] [--auto] [--next]` |
|
|
78
78
|
| 5a | refineall | `dev-refineall` | `Skill()` | `sp:spur-dev` (`refineall`) | `--feature <id> \| --tasks <selector> [--focus <mode>] [--description <text>] [--depth <standard\|ready>] [--agent <inline\|auto\|name>] [--auto] [--keep-going] [--status <s>] [--json] [--worktree [<name>]]` |
|
|
79
|
-
| 6 | plan | `dev-plan` | `Skill()` |
|
|
79
|
+
| 6 | plan | `dev-plan` | `Skill()` | host executor (`idea-pipeline`) or async workflow | `"<description>" [--feature <id>] [--parent <feature-id>] [--skip-design] [--agent <inline\|auto\|name>] [--auto]` |
|
|
80
80
|
| 7 | docs | _(no thin wrapper)_ | `Skill()` | `sp:doc-evolve` | `"<change description>"` |
|
|
81
81
|
| 8 | changelog | `dev-changelog` | `inline` | git log + conventional-commit grouping | `[<file>] [--since <ref>] [--until <ref>] [--version <ver>]` |
|
|
82
82
|
| 9 | gitmsg | `dev-gitmsg` | `inline` | bounded diff capture → concern grouping → conventional commit | `[--commit] [--squash] [--all] [--scope <path>] [--check <cmd>]` |
|
|
@@ -89,7 +89,7 @@ each would be scope creep for one-liner procedures.
|
|
|
89
89
|
| 13 | runall | `dev-runall` | `Skill()` → agent | `sp:spur-dev` (`runall`) → `sp:super-planner` | `--tasks <selector> [--feature <id>] [--mode <sequential\|parallel\|auto>] [--concurrency <n>] [--keep-going] [--auto] [--agent <inline\|auto\|name>] [--json] [--wrap] [--next] [--continue] [--worktree [<name>]] [--no-summary] [--defer-gate]` |
|
|
90
90
|
| 14 | wrap | `dev-wrap` | `Skill()` | `spur workflow run` (wrapup-pipeline) | `<wbs> [--agent <inline\|auto\|name>] [--auto] [--merge] [--dry-run]` |
|
|
91
91
|
| 15 | wrapall | `dev-wrapall` | `Skill()` | `spur workflow run` (wrapup-pipeline) | `[--since <iso>] [--feature <id>] [--status <s>] [--agent <inline\|auto\|name>] [--auto] [--merge] [--dry-run]` |
|
|
92
|
-
| 16 | idea | `dev-idea` | `Skill()` |
|
|
92
|
+
| 16 | idea | `dev-idea` | `Skill()` | host executor (`idea-pipeline`) or async workflow | `"<idea>" \| --from-file <path> [--skip-design] [--agent <inline\|auto\|name>] [--auto]` |
|
|
93
93
|
| 17 | refactor | `dev-refactor` | `Skill()` | `sp:code-refactoring` skill (thin wrapper, ADR-032) | `[<description>] [--scope <path>] [--focus <api\|architect\|tests\|ui\|auto>] [--fix <none\|blockers-first\|all>] [--check <cmd>] [--agent <inline\|auto\|name>] [--auto]` |
|
|
94
94
|
|
|
95
95
|
## Skill-backed operations
|
|
@@ -537,9 +537,9 @@ gate commands, pending questions and approval requirements.>
|
|
|
537
537
|
`--from-file` contents) unmodified to `.spur/run/<run-id>-idea-input.md` (0887 R1); the precheck
|
|
538
538
|
fails the run when that file is empty or missing, and every model-bearing stage prompt treats
|
|
539
539
|
it as the authoritative ask (R2).
|
|
540
|
-
- **Backing:** `idea-pipeline.yaml`
|
|
540
|
+
- **Backing:** `idea-pipeline.yaml` on the host executor (`vars.executor: host`, advanced by `spur workflow continue`) for omitted/`inline`, or `spur workflow run idea-pipeline.yaml --async` for `auto`/name.
|
|
541
541
|
- **Behavior:** Builds vars from the table above and drives the idea pipeline. Flow: discovery → **idea-eval** (taste; reject → cancelled) → feature-create → ac-generate → feature-check → system-design (conditional) → design-approval (taste) → decompose → batch-create (`--skip-ready`) → ready-prepare (ready checklist per created task + ready-evidence sidecar, 0788) → handoff. STOPS at handoff — no task execution, no pipeline nesting. Headless runs use one `trace --follow`; cancellation is reported stopped only when `workflow cancel --json` returns `killed: true`.
|
|
542
|
-
- **Delegation:** Host
|
|
542
|
+
- **Delegation:** Host executor (this session answers each work item) by default; explicit executor selection uses the async workflow worker.
|
|
543
543
|
- **Idea-evaluation gate:** After discovery, operator reviews `.spur/run/idea-eval-report.md` ([idea-evaluation.md](idea-evaluation.md)). Approve continues; reject/cancel → no feature. Under `--auto`, follows the report's recommendation (`drop` → cancelled; missing recommendation → pauses). Enhanced idea is a sidecar — `vars.idea` is not overwritten.
|
|
544
544
|
- **Design package (`--skip-design` only):**
|
|
545
545
|
|
|
@@ -101,7 +101,7 @@ cache-conservation discipline (`plugins/sp/skills/dogfood-testing/references/mon
|
|
|
101
101
|
|
|
102
102
|
**`--worktree [<name>]` wraps Step 2, on either surface.** When `/sp:dev-run --mode full` carries
|
|
103
103
|
[`--worktree`](flag-glossary.md#flag-worktree), create or adopt the worktree *before* launching the
|
|
104
|
-
pipeline, `cd` into it (`spur workflow run` and
|
|
104
|
+
pipeline, `cd` into it (`spur workflow run` and `spur workflow continue` both resolve cwd from the process),
|
|
105
105
|
and merge-or-retain after the run reports. The lifecycle is
|
|
106
106
|
[execution-batch.md § Worktree isolation](execution-batch.md#worktree-isolation---worktree-name)
|
|
107
107
|
applied to a batch of one. Rejected with `--mode implement`.
|
|
@@ -21,7 +21,7 @@ re-author the report.
|
|
|
21
21
|
|
|
22
22
|
**Sidecar rule:** The enhanced idea does **not** overwrite `vars.idea`. Feature-create reads both
|
|
23
23
|
the original idea and this report. The operator's verbatim ask of record is the run's
|
|
24
|
-
`.spur/run/<run-id>-idea-input.md` (persisted by the pipeline `start` state
|
|
24
|
+
`.spur/run/<run-id>-idea-input.md` (persisted by the pipeline `start` state on every executor surface
|
|
25
25
|
before any processing); the `## Requirement inventory` items trace back to it.
|
|
26
26
|
|
|
27
27
|
## Template
|