@gobing-ai/spur 0.4.31 → 0.4.34

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.
Files changed (91) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.global.yaml +1 -4
  3. package/config/decisions/task-pipeline.yaml +1 -29
  4. package/config/rules/boundary/sp-runtime-path.yaml +0 -2
  5. package/config/rules/strict/runtime-boundaries.yaml +2 -12
  6. package/config/rules/structure/protected-files.yaml +0 -3
  7. package/config/rules/surface/check-cli-surface.yaml +1 -2
  8. package/config/workflow-candidates.json +1 -1
  9. package/config/workflows/idea-pipeline.yaml +1 -1
  10. package/config/workflows/task-pipeline.yaml +53 -185
  11. package/package.json +1 -1
  12. package/plugins/sp/agents/super-reviewer.md +18 -60
  13. package/plugins/sp/commands/dev-fixall.md +0 -7
  14. package/plugins/sp/commands/dev-review.md +1 -1
  15. package/plugins/sp/commands/dev-run.md +8 -3
  16. package/plugins/sp/commands/dev-runall.md +7 -4
  17. package/plugins/sp/commands/dev-verify.md +0 -10
  18. package/plugins/sp/commands/dev-verifyall.md +0 -5
  19. package/plugins/sp/plugin.json +1 -1
  20. package/plugins/sp/skills/code-implementation/SKILL.md +1 -3
  21. package/plugins/sp/skills/code-verification/SKILL.md +11 -41
  22. package/plugins/sp/skills/code-verification/references/verdict-schema.md +18 -119
  23. package/plugins/sp/skills/issue-finding/SKILL.md +1 -1
  24. package/plugins/sp/skills/next-router/references/routing-table.md +0 -7
  25. package/plugins/sp/skills/spec-decomposition/references/decomposition.md +1 -6
  26. package/plugins/sp/skills/spur-cli/references/decision.md +3 -6
  27. package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +0 -28
  28. package/plugins/sp/skills/spur-cli/references/tasks.md +9 -7
  29. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +5 -12
  30. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +2 -3
  31. package/plugins/sp/skills/spur-dev/references/dev-operations.md +4 -4
  32. package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +4 -5
  33. package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +9 -5
  34. package/plugins/sp/skills/spur-dev/references/execution-batch.md +4 -5
  35. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
  36. package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +34 -0
  37. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +14 -1
  38. package/spur.js +1437 -4409
  39. package/web/_astro/{BoardApp.CuCuw0lw.js → BoardApp.BzY_krKQ.js} +1 -1
  40. package/web/_astro/{BoardApp.BGGDrfHl.js → BoardApp.CIImQFjG.js} +3 -3
  41. package/web/_astro/{TaskDetail.DWXct9_X.js → TaskDetail.c48Pnba6.js} +1 -1
  42. package/web/_astro/{arc.BxG3NS1o.js → arc.CpU6Cddr.js} +1 -1
  43. package/web/_astro/{architectureDiagram-3BPJPVTR.BxaiM2Hv.js → architectureDiagram-3BPJPVTR.CaXT9ZEz.js} +1 -1
  44. package/web/_astro/{blockDiagram-GPEHLZMM.DJ3r6SdD.js → blockDiagram-GPEHLZMM.Cnv3IsW9.js} +1 -1
  45. package/web/_astro/{c4Diagram-AAUBKEIU.BkzpXBQs.js → c4Diagram-AAUBKEIU.VO_hjv9n.js} +1 -1
  46. package/web/_astro/channel.DrtdR7d_.js +1 -0
  47. package/web/_astro/{chunk-2J33WTMH.DI7UanTc.js → chunk-2J33WTMH.BOunhbrU.js} +1 -1
  48. package/web/_astro/{chunk-4BX2VUAB.C2uLhAlQ.js → chunk-4BX2VUAB.Brg-Gmb2.js} +1 -1
  49. package/web/_astro/{chunk-55IACEB6.KwNI2kxL.js → chunk-55IACEB6.BqF9dxiC.js} +1 -1
  50. package/web/_astro/{chunk-727SXJPM.CHZUthkg.js → chunk-727SXJPM.CEIGJZdc.js} +1 -1
  51. package/web/_astro/{chunk-AQP2D5EJ.DLr4QNJo.js → chunk-AQP2D5EJ.BxXI0bx9.js} +1 -1
  52. package/web/_astro/{chunk-FMBD7UC4.B1G8WrnE.js → chunk-FMBD7UC4.CveXCF83.js} +1 -1
  53. package/web/_astro/{chunk-ND2GUHAM.CzsA-SkD.js → chunk-ND2GUHAM.DwKjp403.js} +1 -1
  54. package/web/_astro/{chunk-QZHKN3VN.DAvBQYli.js → chunk-QZHKN3VN.DgwjHrXx.js} +1 -1
  55. package/web/_astro/{classDiagram-4FO5ZUOK.Cddmz8Ze.js → classDiagram-4FO5ZUOK.BcVv8Qmo.js} +1 -1
  56. package/web/_astro/{classDiagram-v2-Q7XG4LA2.Cddmz8Ze.js → classDiagram-v2-Q7XG4LA2.BcVv8Qmo.js} +1 -1
  57. package/web/_astro/{cose-bilkent-S5V4N54A.CKEu7KRX.js → cose-bilkent-S5V4N54A.28xfMBER.js} +1 -1
  58. package/web/_astro/{cynefin-OW5HDTMX.-B4Cy_Vl.js → cynefin-OW5HDTMX.BAFHBcJj.js} +1 -1
  59. package/web/_astro/{dagre-BM42HDAG.bLxFvI-t.js → dagre-BM42HDAG.DzR6wa9Z.js} +1 -1
  60. package/web/_astro/{diagram-2AECGRRQ.DAHU0t5h.js → diagram-2AECGRRQ.IpFlr4yd.js} +1 -1
  61. package/web/_astro/{diagram-5GNKFQAL.DFciwCNk.js → diagram-5GNKFQAL.DGNU2pOL.js} +1 -1
  62. package/web/_astro/{diagram-KO2AKTUF.BvH0dGId.js → diagram-KO2AKTUF.D_wP6t4w.js} +1 -1
  63. package/web/_astro/{diagram-LMA3HP47.BgVlskRO.js → diagram-LMA3HP47.B0DMC97s.js} +1 -1
  64. package/web/_astro/{diagram-OG6HWLK6.BpurMISo.js → diagram-OG6HWLK6.DQXmNEBs.js} +1 -1
  65. package/web/_astro/{erDiagram-TEJ5UH35.SDj5bUMU.js → erDiagram-TEJ5UH35.BZ0VPjjp.js} +1 -1
  66. package/web/_astro/{flowDiagram-I6XJVG4X.Bm5U58FE.js → flowDiagram-I6XJVG4X.zu5gJs9Z.js} +1 -1
  67. package/web/_astro/{ganttDiagram-6RSMTGT7.CnMnds77.js → ganttDiagram-6RSMTGT7.DYy6LDqD.js} +1 -1
  68. package/web/_astro/{gitGraphDiagram-PVQCEYII.BQUwwyWo.js → gitGraphDiagram-PVQCEYII.C6c_wPdO.js} +1 -1
  69. package/web/_astro/index.C4tUn4AU.css +1 -0
  70. package/web/_astro/{infoDiagram-5YYISTIA.BiSKdORH.js → infoDiagram-5YYISTIA.C3bQPQl8.js} +1 -1
  71. package/web/_astro/{ishikawaDiagram-YF4QCWOH.Br69sBTI.js → ishikawaDiagram-YF4QCWOH.Cc1D58oG.js} +1 -1
  72. package/web/_astro/{journeyDiagram-JHISSGLW.C39WX1W8.js → journeyDiagram-JHISSGLW.CY51-lNM.js} +1 -1
  73. package/web/_astro/{kanban-definition-UN3LZRKU.DppWcbSX.js → kanban-definition-UN3LZRKU.D_3v92y6.js} +1 -1
  74. package/web/_astro/{linear.DeivTDuc.js → linear.C6BrJ38s.js} +1 -1
  75. package/web/_astro/{mermaid.core.Dixrjrnj.js → mermaid.core.DO9lF20B.js} +4 -4
  76. package/web/_astro/{mindmap-definition-RKZ34NQL.BWIQ2MWG.js → mindmap-definition-RKZ34NQL.BMiM91P6.js} +1 -1
  77. package/web/_astro/{pieDiagram-4H26LBE5.vvtHpfT7.js → pieDiagram-4H26LBE5.CcgIgRlR.js} +1 -1
  78. package/web/_astro/{quadrantDiagram-W4KKPZXB.9c-T6qCy.js → quadrantDiagram-W4KKPZXB.CM1CzrHl.js} +1 -1
  79. package/web/_astro/{requirementDiagram-4Y6WPE33.9ZuRw-kn.js → requirementDiagram-4Y6WPE33.CQvQ1E8r.js} +1 -1
  80. package/web/_astro/{sankeyDiagram-5OEKKPKP.CTIWteEl.js → sankeyDiagram-5OEKKPKP.D-b1ONCV.js} +1 -1
  81. package/web/_astro/{sequenceDiagram-3UESZ5HK.DEvu4vLL.js → sequenceDiagram-3UESZ5HK.BQzFGYtH.js} +1 -1
  82. package/web/_astro/{stateDiagram-AJRCARHV.Bxvsgk-_.js → stateDiagram-AJRCARHV.DiCukZ7I.js} +1 -1
  83. package/web/_astro/{stateDiagram-v2-BHNVJYJU.CVuog5yY.js → stateDiagram-v2-BHNVJYJU.4Iut-DMk.js} +1 -1
  84. package/web/_astro/{timeline-definition-PNZ67QCA.CpPItB3E.js → timeline-definition-PNZ67QCA.BKQiLF24.js} +1 -1
  85. package/web/_astro/{vennDiagram-CIIHVFJN.C7eKaLRK.js → vennDiagram-CIIHVFJN.CyeSCofx.js} +1 -1
  86. package/web/_astro/{wardleyDiagram-YWT4CUSO.DWXHT_CW.js → wardleyDiagram-YWT4CUSO.B140ei48.js} +1 -1
  87. package/web/_astro/{xychartDiagram-2RQKCTM6.DOsrNQOF.js → xychartDiagram-2RQKCTM6.DjPyVoO1.js} +1 -1
  88. package/web/index.html +2 -2
  89. package/config/rules/structure/scratch-evidence-pointer.yaml +0 -35
  90. package/web/_astro/channel.CYWRkoDI.js +0 -1
  91. package/web/_astro/index.CKtaGArK.css +0 -1
@@ -7,7 +7,7 @@
7
7
  "plugins": [
8
8
  {
9
9
  "name": "sp",
10
- "version": "0.4.31",
10
+ "version": "0.4.34",
11
11
  "source": "./plugins/sp"
12
12
  }
13
13
  ]
@@ -167,7 +167,7 @@ decisions:
167
167
  paths: []
168
168
  maker: typesafe
169
169
  # makers:
170
- # task-semantic-risk: laya-local
170
+ # failure-class: laya-local
171
171
  # What "the decision was right" means (task 1263 R5): per decision id, the recorded outcomes
172
172
  # that count as correct for each served value. `String(value)` keys, so a yes/no decision uses
173
173
  # "true"/"false". The outcome verb records them (`spur decision outcome <invocation-id> ...`);
@@ -177,6 +177,3 @@ decisions:
177
177
  failure-class:
178
178
  fix: [fixed]
179
179
  stop: [not-fixed]
180
- task-semantic-risk:
181
- "false": [none, p4, p3]
182
- "true": [p1, p2]
@@ -2,7 +2,7 @@ $schema: "@gobing-ai/spur/schemas/decision-catalog.schema.json"
2
2
  # Decision catalogs for the task pipeline (feature P1, ADR-134).
3
3
  #
4
4
  # The shipped `config/workflows/task-pipeline.yaml` decide actions reference these ids
5
- # (`failure-class`, and `task-semantic-risk` once its evidence bar is met). Each entry's
5
+ # (`failure-class`). Each entry's
6
6
  # reliability is measured from recorded `decision.*` events — `spur decision status
7
7
  # --reliability` — and an adoption slice only keeps a decision point while that evidence
8
8
  # shows it adds information the deterministic guards do not.
@@ -17,34 +17,6 @@ defaults:
17
17
  minConfidence: 0.8
18
18
 
19
19
  decisions:
20
- task-semantic-risk:
21
- type: noul
22
- description: >
23
- Does this task's change set change behaviour a reviewer must reason about beyond what
24
- the diffstat already shows? (false projects the fast lane, true or a fallback the
25
- standard lane.)
26
- instructions: |
27
- You are classifying one Spur task's change set for review depth.
28
- Change set: ${params.instructions}
29
- Answer true when the change alters behaviour a reviewer must reason about: control
30
- flow, a data shape, persistence, security, an external contract, or error handling.
31
- Answer false only when the change is mechanical — docs, comments, formatting, renames,
32
- test-only edits, or a dependency bump with no source edit.
33
- Judge the change set only; do not score its quality or estimate its size.
34
- parameters:
35
- wbs:
36
- type: string
37
- description: Task WBS whose change set is being classified.
38
- criteria:
39
- "true": >
40
- The change set touches executable behaviour — a branch, a boundary, a stored
41
- schema, a public signature, or a failure path — so a reviewer must read the diff,
42
- not only its diffstat.
43
- "false": >
44
- The change set is mechanical — docs, comments, formatting, renames, test-only
45
- edits, or a version bump with no executable change — so the diffstat is enough.
46
- fallback: true
47
-
48
20
  failure-class:
49
21
  type: choice
50
22
  description: Is a failed quality gate fixable by the repair agent, or should the run stop?
@@ -24,8 +24,6 @@ exclude:
24
24
  # legitimately contains `config/...` documentation / self-references — not
25
25
  # runtime paths.
26
26
  - "apps/cli/config/**"
27
- # Desktop stage copies the same generated build-time asset payload beside each binary.
28
- - "apps/desktop/resources/**"
29
27
  rules:
30
28
  - id: sp-runtime-path
31
29
  description: >
@@ -32,10 +32,6 @@ rules:
32
32
  - "**/tests/**"
33
33
  - "**/*.test.ts"
34
34
 
35
- # Electron Node adapter: ts-runtime's streaming handle uses Bun.spawn.
36
- # Owns the detached process-group handle needed for startup cancellation and quit.
37
- - "apps/desktop/src/server-process.ts"
38
-
39
35
  # Low-level system primitives:
40
36
  # `spur builder pr-*` spine (script-absorption PR-7, moved from plugins/sp/scripts/pr-reviewing.ts):
41
37
  # every git/gh call goes through ONE synchronous, test-injectable CommandRunner seam
@@ -114,22 +110,16 @@ rules:
114
110
  - "packages/app/src/services/quality-gate.ts" # gate artifacts (log/findings/receipt) written directly; merged-fd gate log and fsync-free atomic writes must stay byte-stable (task 1006 R1; `spur task gate` since script-absorption PR-3; mirrors history-anatomy.ts)
115
111
  - "packages/app/src/workflow/wrapup/steps.ts" # `spur task wrapup` steps (script-absorption PR-5): sync status/metrics appends and run-artifact writes byte-pinned to the retired plugin scripts' golden output (apps/cli/tests/script-absorption-pr5-parity.test.ts); the FileSystem seam is async and has no append
116
112
  - "packages/app/src/workflow/wrapup/drift-probe.ts" # drift-probe step beside steps.ts (same exemption)
117
- # Script-absorption PR-3: the residual sweep and triage diffstat glue moved here from the retired
118
- # plugin scripts (`spur task residual` / `spur task diffstat`). Same class as quality-gate.ts:
113
+ # Script-absorption PR-3: the triage diffstat glue moved here from the retired
114
+ # plugin scripts (`spur task diffstat`). Same class as quality-gate.ts:
119
115
  # synchronous `wx`/tmp+rename artifact writes, mtime-ordered verdict copies, and an fstat(1)
120
116
  # dev/ino identity check (1067 R3) that the async FileSystem seam cannot express.
121
- - "packages/app/src/services/residual-scan-run.ts"
122
117
  - "packages/app/src/workflow/task-diffstat.ts"
123
118
  - "packages/app/src/workflow/feature-verification-run.ts" # the pass opens the run's single merged log fd (`openSync(path,'a')`) and mkdirs the run dir beside the receipt writer, exactly as the plugin entry did before the move; the fd cannot be expressed through the FileSystem seam (task 1176 R2; same class as the quality-gate exemption above)
124
119
  - "packages/app/src/services/pr-review/index.ts" # `spur builder pr-*` (PR-7): sync --status-file verdict writes and the AGENTS.md review-rules probe inside the synchronous spine (same exemption as its process seam above)
125
120
  - "packages/app/src/services/run-storage.ts" # durable-evidence migration core (task 1025 R4): atomic tmp+rename byte copies with digest reread and atomic manifest publish must stay byte-stable (mirrors agent-usage-producer.ts / project-registry.ts exemptions)
126
121
  - "packages/app/src/services/durable-plane-ignore.ts" # .git/info/exclude append moved verbatim out of run-storage.ts to break an import cycle (same exemption)
127
122
 
128
- # Electron Node adapters cannot load Bun runtime implementations; keep the
129
- # synchronous existence/directory probes injected for unit testing (desktop contract).
130
- - "apps/desktop/src/layout.ts"
131
- - "apps/desktop/src/server-process.ts"
132
-
133
123
  # Synchronous bootstrap & path resolution:
134
124
  - "packages/config/src/bundled-config.ts" # sync bundledConfigRoot() directory walk
135
125
  - "packages/config/src/loader.ts" # sync resolveConfigFile() / schema specifier lookup
@@ -37,9 +37,6 @@ rules:
37
37
  # this rule's include scope — scanning generated copies only adds noise
38
38
  # (e.g. `id: task-implement-transition` trips the sk- token shape).
39
39
  - "apps/cli/config/"
40
- # Desktop ships the same generated config payload beside each compiled binary.
41
- # Its source remains outside this source-code rule, just like the CLI bundle.
42
- - "apps/desktop/resources/"
43
40
  # `apps/cli/plugins/` is the same kind of gitignored build:bundle output — a staged
44
41
  # npm copy of `plugins/`, itself outside the include scope. Minified generated libs
45
42
  # there tripped the api-key shape (0976; the generated libs were retired by script-absorption PR-6).
@@ -75,10 +75,9 @@ rules:
75
75
  # declare no --json of their own.
76
76
  - "apps/cli/src/commands/workflow/persist.ts"
77
77
  # Pipeline-internal task verbs (script-absorption PR-3) declare no --json: their contract is
78
- # the .spur/run artifact they write (gate status/receipt, residuals.json, diffstat.json) and
78
+ # the .spur/run artifact they write (gate status/receipt, diffstat.json) and
79
79
  # the exit code; the gate's own status line is serialized by the app service.
80
80
  - "apps/cli/src/commands/task/gate.ts"
81
- - "apps/cli/src/commands/task/residual.ts"
82
81
  - "apps/cli/src/commands/task/diffstat.ts"
83
82
  # Absorbed measurement/report verbs (script-absorption PR-6): the app module serializes the
84
83
  # golden-pinned JSON (step-profile-cli for `workflow profile --json`, run-summary-cli for
@@ -7,7 +7,7 @@
7
7
  "canonical": "task-pipeline",
8
8
  "deadline": "2026-11-24",
9
9
  "createdAt": "2026-09-25",
10
- "rationale": "0943 (feature D64): task-pipeline work routes by triage lane and failure class instead of static graphs. Between a green gate and the review/verify fork a deterministic `triage` state writes the diffstat (`spur task diffstat`, formerly plugins/sp/scripts/task-diffstat.ts; numstat + untracked scan against the precheck-anchored run base), honors a caller-set mode verbatim (never overridden), pins the safety lane on sensitive paths (drizzle/, packages/config/, server auth basenames, *secret*, .github/, plugins/sp/hooks/, *.sql) or >400 changed lines with NO model call, otherwise consults `decide task-triage` (low → fast lane skips review; standard/high → review), and appends the route reason to .spur/memory/task-pipeline-routes.log (R5). On a red gate, `decide failure-class` routes retryable → test-recheck (attempt counted, qualityGateMaxFixAttempts still bounds), fix → test-fix, stop → failed(failed-check); missing/corrupt decision fails closed. Projected basis: the 0938 baseline (docs/reports/2026-09-workflow-cost-baseline.md) measured task-pipeline wall median 7983s over 1 real terminal run with agent.run median 0; the fast lane saves the review agent.run + wall on triage-low diffs, and retryable classification saves fixall hops (and their gate re-runs) on transient failures. Measurement gap honestly named: with workflow.decideDecisionMaker off (R4) triage degrades to standard lanes (diffstat-guard-sensitive/large still forced safety — pure shell, no model), so benefit only materializes with the flag on; per-lane route counts are observable post-merge in .spur/memory/task-pipeline-routes.log. Measured-benefit status: projected from 0938, NOT shadow-run-confirmed — plan step 5 (recorded-input shadow runs) is DEFERRED out of the 0943 session and tracked by this candidate's deadline; `promotion evaluate` runs post-merge. If it does not beat the baseline, it is reverted (ADR-076).",
10
+ "rationale": "0943 (feature D64): task-pipeline work routes by triage lane and failure class instead of static graphs. Between a green gate and the review/verify fork a deterministic `triage` state writes the diffstat (`spur task diffstat`, formerly plugins/sp/scripts/task-diffstat.ts; numstat + untracked scan against the precheck-anchored run base), honors a caller-set mode verbatim (never overridden), pins the safety lane on sensitive paths (drizzle/, packages/config/, server auth basenames, *secret*, .github/, plugins/sp/hooks/, *.sql) or >400 changed lines with NO model call, otherwise consults `decide task-triage` (low → fast lane skips review; standard/high → review), and appends the route reason to .spur/memory/task-pipeline-routes.log (R5). On a red gate, `decide failure-class` routes retryable → test-recheck (attempt counted, qualityGateMaxFixAttempts still bounds), fix → test-fix, stop → failed(failed-check); missing/corrupt decision fails closed. Projected basis: the 0938 baseline (docs/reports/2026-09-workflow-cost-baseline.md) measured task-pipeline wall median 7983s over 1 real terminal run with agent.run median 0; the fast lane saves the review agent.run + wall on triage-low diffs, and retryable classification saves fixall hops (and their gate re-runs) on transient failures. Measurement gap honestly named: with workflow.decideDecisionMaker off (R4) triage degrades to standard lanes (diffstat-guard-sensitive/large still forced safety — pure shell, no model), so benefit only materializes with the flag on; per-lane route counts are observable post-merge in .spur/memory/task-pipeline-routes.log. Measured-benefit status: projected from 0938, NOT shadow-run-confirmed — plan step 5 (recorded-input shadow runs) is DEFERRED out of the 0943 session and tracked by this candidate's deadline; `promotion evaluate` runs post-merge. If it does not beat the baseline, it is reverted (ADR-076). 2026-11-13: the lane no longer consults `decide task-triage` — `triage` is a deterministic diffstat rule (docs/tests-only → fast, sensitive or >400 lines → safety, else standard) after the maker proved to serve only its fallback; evaluate against that rule, not the retired decide.",
11
11
  "measurement": {
12
12
  "workflow": "task-pipeline"
13
13
  },
@@ -213,7 +213,7 @@ states:
213
213
  - kind: agent.run
214
214
  options:
215
215
  agent: ${vars.planningAgent}
216
- input: "Generate acceptance criteria for feature ${vars.featureId}. The operator's ask of record is .spur/run/${vars.__runId}-idea-input.md — idea persisted verbatim at start; authoritative. Read the feature file and author R-numbered BDD Gherkin scenarios per ac-style-guide.md. Tie every scenario to the `## Requirement inventory` of .spur/run/${vars.__runId}-idea-eval-report.md: under each `Scenario:` heading add a comment `# covers: I1, I3` listing covered ids — every non-`[deferred: ...]` item needs at least one covering scenario. Two `spur task check` rules bind AC text: (1) AC bullets copy scenario titles verbatim — the title is the byte-identical identity key of its bullet; (2) gate-language words (HITL, approval/approved, merged/merge event, content-gate, GATED, capstone standalone) are forbidden in titles, bodies, and enum values (L4.gate-language) — rephrase around them. Output only the Acceptance Criteria section body (gherkin fence included), no commentary, no heading."
216
+ input: "Generate acceptance criteria for feature ${vars.featureId}. The operator's ask of record is .spur/run/${vars.__runId}-idea-input.md — idea persisted verbatim at start; authoritative. Read the feature file and author R-numbered BDD Gherkin scenarios per ac-style-guide.md. Tie every scenario to the `## Requirement inventory` of .spur/run/${vars.__runId}-idea-eval-report.md: under each `Scenario:` heading add a comment `# covers: I1, I3` listing covered ids — every non-`[deferred: ...]` item needs at least one covering scenario. AC bullets copy scenario titles verbatim — the title is the byte-identical identity key of its bullet. Output only the Acceptance Criteria section body (gherkin fence included), no commentary, no heading."
217
217
  role: planner
218
218
  session: fresh
219
219
  answerFile: .spur/run/${vars.__runId}-idea-ac-content.md