@gobing-ai/spur 0.3.80 → 0.3.82

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 (177) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.example.yaml +31 -18
  3. package/config/config.global.yaml +13 -11
  4. package/config/pipeline-budgets.json +34 -2
  5. package/config/plugin-scripts.json +25 -0
  6. package/config/rules/boundary/config-loading-ownership.yaml +0 -3
  7. package/config/rules/boundary/dao-boundary.yaml +4 -17
  8. package/config/rules/boundary/planning-folder-hardcode.yaml +0 -1
  9. package/config/rules/boundary/sp-no-vendor-refs.yaml +3 -2
  10. package/config/rules/boundary/sp-runtime-path.yaml +3 -14
  11. package/config/rules/quality/coverage-gate.yaml +3 -14
  12. package/config/rules/quality/tsdoc-exports.yaml +4 -7
  13. package/config/rules/strict/http-boundaries.yaml +5 -8
  14. package/config/rules/strict/runtime-boundaries.yaml +1 -5
  15. package/config/rules/structure/protected-files.yaml +9 -3
  16. package/config/rules/structure/test-focus-skip.yaml +0 -2
  17. package/config/rules/structure/test-location.yaml +0 -5
  18. package/config/rules/surface/check-cli-surface.yaml +3 -2
  19. package/config/rules/typescript/bun-tooling.yaml +5 -7
  20. package/config/rules/typescript/guarded-happy-dom-register.yaml +0 -2
  21. package/config/rules/typescript/happy-dom-teardown.yaml +0 -2
  22. package/config/rules/typescript/no-biome-suppressions.yaml +0 -2
  23. package/config/rules/typescript/no-debugger.yaml +0 -2
  24. package/config/rules/typescript/no-eslint-suppressions.yaml +0 -4
  25. package/config/rules/typescript/no-leaky-module-mocks.yaml +6 -13
  26. package/config/rules/typescript/no-module-scope-import-calls.yaml +0 -2
  27. package/config/rules/typescript/no-syscall-emulation-in-boundary-mock.yaml +0 -3
  28. package/config/rules/typescript/no-unmocked-module-eval-side-effects.yaml +0 -3
  29. package/config/rules/typescript/output-boundaries.yaml +0 -3
  30. package/config/rules/typescript/prefer-accessible-role-for-button-queries.yaml +0 -3
  31. package/config/rules/ui/ui-import-boundary.yaml +1 -5
  32. package/config/templates/docs/99_PROJECT_CONSTITUTION.md +75 -13
  33. package/config/transition-shims.json +0 -7
  34. package/config/workflows/basic.yaml +4 -0
  35. package/config/workflows/docs-pipeline.yaml +13 -14
  36. package/config/workflows/feature-dev.yaml +20 -65
  37. package/config/workflows/history-anatomy.yaml +22 -1
  38. package/config/workflows/idea-pipeline.yaml +53 -97
  39. package/config/workflows/pr-review.yaml +21 -33
  40. package/config/workflows/task-pipeline.yaml +87 -330
  41. package/config/workflows/wayfinder-resolution.yaml +12 -26
  42. package/config/workflows/wrapup-pipeline.yaml +48 -189
  43. package/package.json +9 -9
  44. package/plugins/sp/README.md +12 -3
  45. package/plugins/sp/agents/expert-spur.md +41 -19
  46. package/plugins/sp/lib/idea-handoff.generated.d.mts +17 -0
  47. package/plugins/sp/lib/idea-handoff.generated.mjs +1301 -0
  48. package/plugins/sp/plugin.json +1 -1
  49. package/plugins/sp/scripts/feature-dev-precheck.mjs +146 -0
  50. package/plugins/sp/scripts/feature-dev-precheck.ts +238 -0
  51. package/plugins/sp/scripts/idea-handoff.mjs +27 -0
  52. package/plugins/sp/scripts/idea-handoff.ts +44 -0
  53. package/plugins/sp/scripts/inline-run-setup.ts +69 -1
  54. package/plugins/sp/scripts/quality-gate.mjs +216 -0
  55. package/plugins/sp/scripts/quality-gate.ts +287 -0
  56. package/plugins/sp/scripts/surface-drift-inventory.ts +0 -2
  57. package/plugins/sp/scripts/task-size-precheck.ts +44 -16
  58. package/plugins/sp/scripts/verify-answer-lint.ts +17 -1
  59. package/plugins/sp/scripts/workflow-step-profile.mjs +319 -0
  60. package/plugins/sp/scripts/workflow-step-profile.ts +456 -0
  61. package/plugins/sp/scripts/wrapup-steps.mjs +350 -0
  62. package/plugins/sp/scripts/wrapup-steps.ts +466 -0
  63. package/plugins/sp/skills/code-review/references/review-lenses.md +3 -0
  64. package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
  65. package/plugins/sp/skills/spec-decomposition/references/decomposition.md +29 -0
  66. package/plugins/sp/skills/spur-cli/SKILL.md +4 -8
  67. package/plugins/sp/skills/spur-cli/references/agent.md +44 -69
  68. package/plugins/sp/skills/spur-cli/references/message.md +30 -3
  69. package/plugins/sp/skills/spur-cli/references/projects.md +25 -1
  70. package/plugins/sp/skills/spur-cli/references/self.md +6 -5
  71. package/plugins/sp/skills/spur-cli/references/serve.md +8 -7
  72. package/plugins/sp/skills/spur-cli/references/tasks.md +1 -1
  73. package/plugins/sp/skills/spur-cli/references/workflows/operations.md +6 -3
  74. package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +57 -18
  75. package/plugins/sp/skills/spur-composer/SKILL.md +145 -0
  76. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +10 -0
  77. package/plugins/sp/skills/spur-dev/references/execution-batch.md +1 -1
  78. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +4 -6
  79. package/plugins/sp/skills/spur-dev/references/glossary.md +1 -1
  80. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +11 -1
  81. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +24 -0
  82. package/plugins/sp/skills/spur-doctor/SKILL.md +138 -0
  83. package/plugins/sp/skills/taste-refactoring-api/README.md +43 -0
  84. package/plugins/sp/skills/taste-refactoring-api/SKILL.md +334 -0
  85. package/plugins/sp/skills/taste-refactoring-api/checklists/daily-api-review.md +71 -0
  86. package/plugins/sp/skills/taste-refactoring-api/examples/refactor-example.md +72 -0
  87. package/plugins/sp/skills/taste-refactoring-api/examples/review-template.md +93 -0
  88. package/plugins/sp/skills/taste-refactoring-api/references/api-refactoring-playbook.md +253 -0
  89. package/plugins/sp/skills/taste-refactoring-api/references/protocol-modes.md +79 -0
  90. package/plugins/sp/skills/taste-refactoring-api/references/research-basis.md +58 -0
  91. package/plugins/sp/skills/taste-refactoring-architect/README.md +26 -0
  92. package/plugins/sp/skills/taste-refactoring-architect/SKILL.md +471 -0
  93. package/plugins/sp/skills/taste-refactoring-architect/checklists/daily-architecture-review.md +48 -0
  94. package/plugins/sp/skills/taste-refactoring-architect/examples/refactor-example.md +55 -0
  95. package/plugins/sp/skills/taste-refactoring-architect/examples/review-template.md +51 -0
  96. package/plugins/sp/skills/taste-refactoring-architect/references/architecture-refactoring-playbook.md +173 -0
  97. package/plugins/sp/skills/taste-refactoring-architect/references/research-basis.md +28 -0
  98. package/plugins/sp/skills/taste-refactoring-tests/README.md +28 -0
  99. package/plugins/sp/skills/taste-refactoring-tests/SKILL.md +482 -0
  100. package/plugins/sp/skills/taste-refactoring-tests/checklists/daily-test-review.md +39 -0
  101. package/plugins/sp/skills/taste-refactoring-tests/examples/refactor-example.md +85 -0
  102. package/plugins/sp/skills/taste-refactoring-tests/examples/review-template.md +59 -0
  103. package/plugins/sp/skills/taste-refactoring-tests/references/research-basis.md +47 -0
  104. package/plugins/sp/skills/taste-refactoring-tests/references/test-refactoring-playbook.md +222 -0
  105. package/plugins/sp/skills/taste-refactoring-ui/README.md +12 -0
  106. package/plugins/sp/skills/taste-refactoring-ui/SKILL.md +290 -0
  107. package/plugins/sp/skills/taste-refactoring-ui/checklists/daily-ui-review.md +72 -0
  108. package/plugins/sp/skills/taste-refactoring-ui/examples/review-template.md +51 -0
  109. package/plugins/sp/skills/taste-refactoring-ui/references/refactoring-ui-playbook.md +170 -0
  110. package/plugins/sp/skills/wayfinder/SKILL.md +2 -2
  111. package/plugins/sp/skills/wayfinder/references/pipeline-resolution.md +30 -0
  112. package/schemas/spur-config.schema.json +105 -85
  113. package/spur.js +44616 -43320
  114. package/web/_astro/BoardApp.D-WlxiN2.js +1 -0
  115. package/web/_astro/{BoardApp.CHQ1lycZ.js → BoardApp.D8bM9pKL.js} +97 -95
  116. package/web/_astro/{TaskDetail.GKfQJ60c.js → TaskDetail.BPRqgVUE.js} +1 -1
  117. package/web/_astro/{arc.DWEtA3Tx.js → arc.BPrPES3z.js} +1 -1
  118. package/web/_astro/{architectureDiagram-3BPJPVTR.DB42oWmP.js → architectureDiagram-3BPJPVTR.qX_7q02P.js} +1 -1
  119. package/web/_astro/{blockDiagram-GPEHLZMM.rhv-zNQV.js → blockDiagram-GPEHLZMM.CUZfj5V7.js} +1 -1
  120. package/web/_astro/{c4Diagram-AAUBKEIU.Ci4-4VvY.js → c4Diagram-AAUBKEIU.CTaOr8hH.js} +1 -1
  121. package/web/_astro/channel.DGZaFHZx.js +1 -0
  122. package/web/_astro/{chunk-2J33WTMH.Cc9veUgf.js → chunk-2J33WTMH.Dt-9wf3h.js} +1 -1
  123. package/web/_astro/{chunk-4BX2VUAB.Bec9c4eI.js → chunk-4BX2VUAB.CTC2sdoN.js} +1 -1
  124. package/web/_astro/{chunk-55IACEB6.DoV8S1iB.js → chunk-55IACEB6.DQcxt2_g.js} +1 -1
  125. package/web/_astro/{chunk-727SXJPM.DwR-Qlyj.js → chunk-727SXJPM.DXFPSn-a.js} +1 -1
  126. package/web/_astro/{chunk-AQP2D5EJ.ND_a81WY.js → chunk-AQP2D5EJ.BCx3U4bT.js} +1 -1
  127. package/web/_astro/{chunk-FMBD7UC4.Wv_jwG48.js → chunk-FMBD7UC4.DL2tJkdO.js} +1 -1
  128. package/web/_astro/{chunk-ND2GUHAM.CXKXCMmp.js → chunk-ND2GUHAM.DZyflMro.js} +1 -1
  129. package/web/_astro/{chunk-QZHKN3VN.nkaoNYQq.js → chunk-QZHKN3VN.CUI2mT09.js} +1 -1
  130. package/web/_astro/{classDiagram-4FO5ZUOK.cMQcVlQu.js → classDiagram-4FO5ZUOK.g4rX4Fr1.js} +1 -1
  131. package/web/_astro/{classDiagram-v2-Q7XG4LA2.cMQcVlQu.js → classDiagram-v2-Q7XG4LA2.g4rX4Fr1.js} +1 -1
  132. package/web/_astro/{cose-bilkent-S5V4N54A.OaDJ7Mr2.js → cose-bilkent-S5V4N54A.CzWJLqp0.js} +1 -1
  133. package/web/_astro/{cynefin-OW5HDTMX.Chi8IphF.js → cynefin-OW5HDTMX.WgsvQeCR.js} +1 -1
  134. package/web/_astro/{cytoscape.esm.DzSz-X2X.js → cytoscape.esm.BB4DxJjf.js} +1 -1
  135. package/web/_astro/{dagre-BM42HDAG.CzK2t_Fp.js → dagre-BM42HDAG.Dzv6ngql.js} +1 -1
  136. package/web/_astro/{diagram-2AECGRRQ.DRvxlVS7.js → diagram-2AECGRRQ.CpJ4a9rU.js} +1 -1
  137. package/web/_astro/{diagram-5GNKFQAL.CnYvNdwA.js → diagram-5GNKFQAL.CzPlF_dq.js} +1 -1
  138. package/web/_astro/{diagram-KO2AKTUF.CpLpMw5R.js → diagram-KO2AKTUF.TAkZNTcQ.js} +1 -1
  139. package/web/_astro/{diagram-LMA3HP47.JTb78qUA.js → diagram-LMA3HP47.uCjoKSag.js} +1 -1
  140. package/web/_astro/{diagram-OG6HWLK6.Bk-1jDIb.js → diagram-OG6HWLK6.eMplIjoK.js} +1 -1
  141. package/web/_astro/{erDiagram-TEJ5UH35.D8hN9GZq.js → erDiagram-TEJ5UH35.Bf7zoXGz.js} +1 -1
  142. package/web/_astro/{flowDiagram-I6XJVG4X.-6zQr6m5.js → flowDiagram-I6XJVG4X.B_bHj3gN.js} +1 -1
  143. package/web/_astro/{ganttDiagram-6RSMTGT7.DboLQ9ca.js → ganttDiagram-6RSMTGT7.BasrHRMj.js} +1 -1
  144. package/web/_astro/{gitGraphDiagram-PVQCEYII.4tYvJKGR.js → gitGraphDiagram-PVQCEYII.C6iphq1x.js} +1 -1
  145. package/web/_astro/index.DayyIngm.css +1 -0
  146. package/web/_astro/{infoDiagram-5YYISTIA.Bd9rXpsB.js → infoDiagram-5YYISTIA.HXmDMhW4.js} +1 -1
  147. package/web/_astro/{ishikawaDiagram-YF4QCWOH.CvMoaf67.js → ishikawaDiagram-YF4QCWOH.BSmW8NiU.js} +1 -1
  148. package/web/_astro/{journeyDiagram-JHISSGLW.Ccy1CA7y.js → journeyDiagram-JHISSGLW.DEQow5fo.js} +1 -1
  149. package/web/_astro/{kanban-definition-UN3LZRKU.0MaMqHNS.js → kanban-definition-UN3LZRKU.IVm9cTdc.js} +1 -1
  150. package/web/_astro/{linear.CHXgcIbN.js → linear.CrsM73_9.js} +1 -1
  151. package/web/_astro/{mermaid.core.Ca-kcelG.js → mermaid.core.CfBeDJls.js} +6 -6
  152. package/web/_astro/{mindmap-definition-RKZ34NQL.BUIDlHa0.js → mindmap-definition-RKZ34NQL.C3j60Y-0.js} +1 -1
  153. package/web/_astro/ordinal.BYWQX77i.js +1 -0
  154. package/web/_astro/{pieDiagram-4H26LBE5.2dX3CU1s.js → pieDiagram-4H26LBE5.B-aCMeEA.js} +1 -1
  155. package/web/_astro/{quadrantDiagram-W4KKPZXB.B3LBlRiv.js → quadrantDiagram-W4KKPZXB.Cib965yq.js} +1 -1
  156. package/web/_astro/{requirementDiagram-4Y6WPE33.X12I2uNx.js → requirementDiagram-4Y6WPE33.D61cS4O-.js} +1 -1
  157. package/web/_astro/{sankeyDiagram-5OEKKPKP.BXohIHqx.js → sankeyDiagram-5OEKKPKP.GKF2qVPy.js} +1 -1
  158. package/web/_astro/{sequenceDiagram-3UESZ5HK.C37ZIUzg.js → sequenceDiagram-3UESZ5HK.DZnq8F2h.js} +1 -1
  159. package/web/_astro/{stateDiagram-AJRCARHV.BRgz317z.js → stateDiagram-AJRCARHV.DXUFmdgM.js} +1 -1
  160. package/web/_astro/{stateDiagram-v2-BHNVJYJU.7VYSXN9-.js → stateDiagram-v2-BHNVJYJU.BtHmhLEz.js} +1 -1
  161. package/web/_astro/{timeline-definition-PNZ67QCA.BVNz_HiN.js → timeline-definition-PNZ67QCA.Cy-WW2ln.js} +1 -1
  162. package/web/_astro/{vennDiagram-CIIHVFJN.CHVDkPX4.js → vennDiagram-CIIHVFJN.SLp5b9KI.js} +1 -1
  163. package/web/_astro/{wardleyDiagram-YWT4CUSO.EQQ_qT9v.js → wardleyDiagram-YWT4CUSO.Bww45mWV.js} +1 -1
  164. package/web/_astro/{xychartDiagram-2RQKCTM6.DrAT9WoP.js → xychartDiagram-2RQKCTM6.DR4swI6a.js} +1 -1
  165. package/web/apple-touch-icon.png +0 -0
  166. package/web/favicon.ico +0 -0
  167. package/web/favicon.svg +17 -4
  168. package/web/icon-192.png +0 -0
  169. package/web/icon-512.png +0 -0
  170. package/web/index.html +2 -2
  171. package/web/site.webmanifest +31 -0
  172. package/web/spur_logo.svg +1 -0
  173. package/plugins/sp/skills/spur-cli/references/team.md +0 -145
  174. package/web/_astro/BoardApp.DV9kx0wo.js +0 -1
  175. package/web/_astro/channel.BAI6xLeV.js +0 -1
  176. package/web/_astro/index.Dcr_8fiK.css +0 -1
  177. package/web/_astro/ordinal.DBvzRdQf.js +0 -1
@@ -7,7 +7,7 @@
7
7
  "plugins": [
8
8
  {
9
9
  "name": "sp",
10
- "version": "0.3.80",
10
+ "version": "0.3.82",
11
11
  "source": "./plugins/sp"
12
12
  }
13
13
  ]
@@ -180,24 +180,26 @@ agent:
180
180
  # dev-run: omp
181
181
  # dev-review: claude
182
182
 
183
- # Declarative teams (feature M) — materialize with `spur team up <teamId>`.
184
- # team:
185
- # demo:
186
- # name: "Demo Team"
187
- # work_dir: ~/path/to/project
188
- # members:
189
- # - executor: claude
190
- # purpose: "Lead — planning & review"
191
- # - executor: omp
192
- # purpose: "Implementer"
193
- # # Role is the primary axis (0543): a role-only member resolves an
194
- # # executor through the tier ladder at materialization; the resolved
195
- # # executor and the role are both recorded on the materialized spec.
196
- # - role: reviewer
197
- # - role: coder
198
- # executor: omp
199
- # purpose: "Pinned executor, role recorded alongside
200
- # (pin beats policy)"
183
+ # A project's agent roster is a **fleet** declared in the project's own
184
+ # `.spur/config.yaml` under `agent.fleet` — never in this global file, and never
185
+ # in the retired `<projectPath>/.spur/fleet.json` (ADR-116 carrier moved by task
186
+ # 0858). Materialized and autostarted at `spur serve` start only when
187
+ # `agent.fleet.enabled` is true; preview with `spur projects list --fleet`.
188
+ # Shape (project layer; a member declares role or executor):
189
+ # agent:
190
+ # fleet:
191
+ # enabled: true
192
+ # strategy: gtd # rest | gtd (default rest)
193
+ # orchestrator: planner-1
194
+ # members:
195
+ # - { role: planner, purpose: orchestrator }
196
+ # - { role: coder, executor: omp }
197
+ # - { role: reviewer, enabled: false }
198
+ # `enabled: false` keeps the member's derived `<role>-<n>` id index, so later
199
+ # members never silently reallocate ids. The retired per-team config key is no
200
+ # longer read — a leftover block fails the load and names `agent.fleet` as the
201
+ # replacement — a leftover `fleet.json` fails the load too, and the roster is
202
+ # keyed on the worktree path now, not on a config-global team name.
201
203
 
202
204
  rules:
203
205
  paths:
@@ -210,6 +212,17 @@ workflows:
210
212
  redaction:
211
213
  enabled: false
212
214
 
215
+ # ── Release (spur builder bump-ver / drop-tags) ──
216
+ # Optional. Release plumbing knobs for `spur builder bump-ver` / `drop-tags`;
217
+ # every value defaults as shown, so an absent section keeps default behavior.
218
+ # builder:
219
+ # bump-ver:
220
+ # tagVersionSeparator: "-v"
221
+ # publishWorkflow: publish.yml
222
+ # releaseCommitType: chore
223
+ # releaseCommitScope: release
224
+ # ghRunListLimit: 5
225
+
213
226
  # ── Planning (design §2.1 / §9) ──
214
227
  tasks:
215
228
  active: docs/tasks
@@ -17,8 +17,14 @@
17
17
  # here.
18
18
  #
19
19
  # Only machine-wide keys belong in this file. Project-shaped keys — `name`,
20
- # `bootstrap`, `rules`, `redaction`, `tasks`, `features`, `agent.team` — resolve
21
- # against a project's own folder structure and must stay in `.spur/config.yaml`.
20
+ # `bootstrap`, `rules`, `redaction`, `tasks`, `features` — resolve against a
21
+ # project's own folder structure and must stay in `.spur/config.yaml`. The agent
22
+ # roster is not a config key at all any more: it is the project-layer `agent.fleet`
23
+ # section of `.spur/config.yaml` (ADR-116 carrier moved by 0858; it replaced
24
+ # `<projectPath>/.spur/fleet.json`). The retired team roster key is gone: a leftover
25
+ # block fails the load and names `agent.fleet` as the replacement (0857), a leftover
26
+ # `fleet.json` fails it too (0858), and the `spur team` noun was removed at the G64
27
+ # cutover.
22
28
 
23
29
  $schema: "@gobing-ai/spur/schemas/spur-config.schema.json"
24
30
 
@@ -132,13 +138,9 @@ agent:
132
138
  model: gpt-5.6
133
139
  tier: capable-3
134
140
 
135
- # `bundled:workflows` resolves against the installed package's own config root
136
- # at read time (BUNDLED_PATH_PREFIX in apps/cli/src/commands/workflow.ts), so
137
- # every project discovers the shipped workflows without a machine-specific
138
- # absolute path ever being persisted here. A project's own `workflows.paths`
139
- # concatenates over this (loader merge), and the run-time adapter resolves
140
- # bundled → project on its own (make-lifecycle-adapter.ts, two tiers since
141
- # task 0648).
141
+ # Workflow layers (ADR-113): the project layer is always `<cwd>/.spur/workflows`
142
+ # and the shared layer is the installed package's own `config/workflows`, so no
143
+ # config entry is needed to discover the shipped workflows. A project registers
144
+ # extra workflow folders by concatenating them here (loader merge):
142
145
  workflows:
143
- paths:
144
- - bundled:workflows
146
+ paths: []
@@ -11,11 +11,15 @@
11
11
  "decision": null
12
12
  },
13
13
  "idea-pipeline": {
14
- "modelQueries": 5,
14
+ "modelQueries": 6,
15
15
  "wallClockMs": 7200000,
16
16
  "tokenCostUsd": null,
17
17
  "source": "No fixture (0607 option a). Real-run reading (R5): median ~435s, max-sane 8.8h (n=37). Budget = 2h gross-regression ceiling; authoritative fixture measurement pending (operator command in 0607 Solution).",
18
- "decision": null
18
+ "decision": {
19
+ "date": "2026-09-12",
20
+ "wbs": "0826",
21
+ "note": "I21 closeout: operator requested completion of the remaining items before commit. Reconcile the stale 5-query budget with the six existing stages: discovery, feature-create, ac-generate, system-design, decompose and ready-prepare (0788). Gates and corpus creation separate these judgments; preserve ready preparation and add no dispatch. Static live-count regression now guards the ceiling. Wall-clock and cost limits are unchanged."
22
+ }
19
23
  },
20
24
  "wrapup-pipeline": {
21
25
  "modelQueries": 1,
@@ -41,6 +45,34 @@
41
45
  "tokenCostUsd": null,
42
46
  "source": "Zero-query pipeline (the live definition declares no model queries); query budget trivially 0 — the gate handles an empty list (0607 R3). No real full run recorded; wall-clock unenforced.",
43
47
  "decision": null
48
+ },
49
+ "history-anatomy": {
50
+ "modelQueries": 4,
51
+ "wallClockMs": null,
52
+ "tokenCostUsd": null,
53
+ "source": "Coverage entry (0826 R2): the live definition's model-query count (extractResolvedWorkflowFacts, 2026-09-11). No real-run measurement yet: wall-clock and cost are unenforced until measured, never 0.",
54
+ "decision": null
55
+ },
56
+ "feature-dev": {
57
+ "modelQueries": 2,
58
+ "wallClockMs": null,
59
+ "tokenCostUsd": null,
60
+ "source": "Coverage entry (0826 R2): the live definition's model-query count (extractResolvedWorkflowFacts, 2026-09-11). No real-run measurement yet: wall-clock and cost are unenforced until measured, never 0.",
61
+ "decision": null
62
+ },
63
+ "wayfinder-resolution": {
64
+ "modelQueries": 2,
65
+ "wallClockMs": null,
66
+ "tokenCostUsd": null,
67
+ "source": "Coverage entry (0826 R2): the live definition's model-query count (extractResolvedWorkflowFacts, 2026-09-11). No real-run measurement yet: wall-clock and cost are unenforced until measured, never 0.",
68
+ "decision": null
69
+ },
70
+ "basic": {
71
+ "modelQueries": 1,
72
+ "wallClockMs": null,
73
+ "tokenCostUsd": null,
74
+ "source": "Coverage entry (0826 R2): the live definition's model-query count (extractResolvedWorkflowFacts, 2026-09-11). No real-run measurement yet: wall-clock and cost are unenforced until measured, never 0.",
75
+ "decision": null
44
76
  }
45
77
  }
46
78
  }
@@ -26,11 +26,26 @@
26
26
  "contract": "standard",
27
27
  "twin": "dogfood-testing/validate-report.mjs"
28
28
  },
29
+ {
30
+ "rel": "feature-dev-precheck.ts",
31
+ "contract": "standard",
32
+ "twin": "feature-dev-precheck.mjs"
33
+ },
29
34
  {
30
35
  "rel": "feature-sync-bounded.ts",
31
36
  "contract": "standard",
32
37
  "twin": "feature-sync-bounded.mjs"
33
38
  },
39
+ {
40
+ "rel": "idea-handoff.ts",
41
+ "contract": "standard",
42
+ "twin": "idea-handoff.mjs"
43
+ },
44
+ {
45
+ "rel": "wrapup-steps.ts",
46
+ "contract": "standard",
47
+ "twin": "wrapup-steps.mjs"
48
+ },
34
49
  {
35
50
  "rel": "history-anatomy-cache.ts",
36
51
  "contract": "standard",
@@ -49,6 +64,11 @@
49
64
  "contract": "standard",
50
65
  "twin": "pr-reviewing.mjs"
51
66
  },
67
+ {
68
+ "rel": "quality-gate.ts",
69
+ "contract": "standard",
70
+ "twin": "quality-gate.mjs"
71
+ },
52
72
  {
53
73
  "rel": "script-contract-check.ts",
54
74
  "contract": "repo-only"
@@ -84,6 +104,11 @@
84
104
  {
85
105
  "rel": "validate-flag-contracts.ts",
86
106
  "contract": "repo-only"
107
+ },
108
+ {
109
+ "rel": "workflow-step-profile.ts",
110
+ "contract": "standard",
111
+ "twin": "workflow-step-profile.mjs"
87
112
  }
88
113
  ]
89
114
  }
@@ -29,7 +29,6 @@ rules:
29
29
  - "packages/**/src/**/*.ts"
30
30
  exclude:
31
31
  - "packages/config/src/**"
32
- - "**/node_modules/**"
33
32
  - "**/tests/**"
34
33
 
35
34
  - id: no-legacy-tasks-config-jsonc
@@ -50,7 +49,6 @@ rules:
50
49
  - "apps/**/src/**/*.tsx"
51
50
  - "packages/**/src/**/*.ts"
52
51
  exclude:
53
- - "**/node_modules/**"
54
52
  - "**/tests/**"
55
53
 
56
54
  - id: spur-config-loader-only-at-composition-roots
@@ -71,5 +69,4 @@ rules:
71
69
  - "apps/cli/src/index.ts"
72
70
  - "apps/server/src/serve.ts"
73
71
  - "apps/server/src/context.ts"
74
- - "**/node_modules/**"
75
72
  - "**/tests/**"
@@ -24,8 +24,6 @@ rules:
24
24
  - "packages/config/src/**/*.ts"
25
25
  - "packages/contracts/src/**/*.ts"
26
26
  exclude:
27
- - "**/node_modules/**"
28
- - "**/tests/**"
29
27
  # apps/cli/src/index.ts carries a side-effect import of ts-db as a
30
28
  # bundler hint for Bun --compile. The import does not use ts-db APIs;
31
29
  # it ensures the dynamic import('@gobing-ai/ts-db') calls from within
@@ -53,10 +51,9 @@ rules:
53
51
  include:
54
52
  - "apps/**/src/**/*.ts"
55
53
  - "packages/**/src/**/*.ts"
56
- exclude:
57
- - "packages/domain/src/schema/**"
58
- - "**/node_modules/**"
59
- - "**/tests/**"
54
+ # (no schema/** exemption: schema files author via defineTable and
55
+ # import zero drizzle modules today — verified by strip probe)
56
+ exclude: []
60
57
 
61
58
  - id: tables-via-defineTable
62
59
  description: >
@@ -71,9 +68,6 @@ rules:
71
68
  include:
72
69
  - "apps/**/src/**/*.ts"
73
70
  - "packages/**/src/**/*.ts"
74
- exclude:
75
- - "**/node_modules/**"
76
- - "**/tests/**"
77
71
 
78
72
  - id: no-hand-written-ddl-for-drizzle-tables
79
73
  description: >
@@ -92,9 +86,8 @@ rules:
92
86
  - "apps/**/src/**/*.ts"
93
87
  - "packages/**/src/**/*.ts"
94
88
  exclude:
89
+ # the CLI migration journal — 43 DDL statements (verified load-bearing)
95
90
  - "packages/domain/src/migrations.ts"
96
- - "**/node_modules/**"
97
- - "**/tests/**"
98
91
 
99
92
  - id: raw-sql-only-in-domain
100
93
  description: >
@@ -111,9 +104,6 @@ rules:
111
104
  - "packages/app/src/**/*.ts"
112
105
  - "packages/config/src/**/*.ts"
113
106
  - "packages/contracts/src/**/*.ts"
114
- exclude:
115
- - "**/node_modules/**"
116
- - "**/tests/**"
117
107
 
118
108
  - id: no-sql-text-imports
119
109
  description: >
@@ -128,6 +118,3 @@ rules:
128
118
  include:
129
119
  - "apps/**/src/**/*.ts"
130
120
  - "packages/**/src/**/*.ts"
131
- exclude:
132
- - "**/node_modules/**"
133
- - "**/tests/**"
@@ -15,7 +15,6 @@ include:
15
15
  - "apps/**/src/**/*.tsx"
16
16
  - "packages/**/src/**/*.ts"
17
17
  exclude:
18
- - "**/node_modules/**"
19
18
  - "**/tests/**"
20
19
  # The single source of truth — the literal is allowed to exist here.
21
20
  - "packages/config/src/index.ts"
@@ -12,8 +12,9 @@ include:
12
12
  - "plugins/sp/**/*.json"
13
13
  - "plugins/sp/**/*.ts"
14
14
  exclude:
15
- - "**/node_modules/**"
16
- - "plugins/sp/tests/**"
15
+ # skill-structure.test.ts legitimately names vendors/ paths in its R20
16
+ # structural assertions; no other plugins/sp test does (verified 2026-09).
17
+ - "plugins/sp/tests/skill-structure.test.ts"
17
18
  rules:
18
19
  - id: sp-no-vendor-refs
19
20
  description: >
@@ -19,22 +19,11 @@ include:
19
19
  - "packages/**"
20
20
  - "plugins/sp/**"
21
21
  exclude:
22
- - "**/node_modules/**"
23
- - "**/dist/**"
24
- # `.pi-lens/cache/` holds autogenerated project snapshots (absolute paths that
25
- # legitimately contain `config/...` substrings). Not source — exclude to avoid
26
- # triaging snapshot noise every pre-check.
27
- - "**/.pi-lens/**"
28
- # `.spur/` runtime dirs hold run records, agent sessions, and captured test
29
- # output (e.g. e2e failed-agent dumps embedding real source diffs). Not
30
- # source — same class as the .pi-lens exclusion above.
31
- - "**/.spur/**"
32
22
  # Package build artifacts: `build:bundle` copies repo-root config/ →
33
- # apps/cli/config/ (and legacy spur-cli/config/). Those trees are the ADR-015
34
- # SSOT payload itself and legitimately contain `config/...` documentation /
35
- # self-references — not runtime paths.
23
+ # apps/cli/config/. That tree is the ADR-015 SSOT payload itself and
24
+ # legitimately contains `config/...` documentation / self-references — not
25
+ # runtime paths.
36
26
  - "apps/cli/config/**"
37
- - "apps/cli/spur-cli/**"
38
27
  rules:
39
28
  - id: sp-runtime-path
40
29
  description: >
@@ -10,11 +10,9 @@ $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
10
10
  # - threshold kept at 90 matching bunfig.toml coverageThreshold
11
11
  # - no drizzle exclude needed (Spur doesn't vendor generated SQL in src/)
12
12
  #
13
- # Scope tightened to production source only and aligned with the tsdoc-export
14
- # gate's exclusions: tests carry no coverage obligation, stubs are
15
- # declaration-only, and schema/migrations/db are implementation internals
16
- # (DDL, journals, adapter wiring) whose per-file coverage is noise rather than
17
- # a meaningful test-gap signal.
13
+ # Scope tightened to production source only. No per-file exclusions: every
14
+ # measured source file must meet the threshold. (Former vendors/stubs/schema/
15
+ # migrations/db exclusions were verified stale — all measured files pass 90%.)
18
16
  rules:
19
17
  - id: coverage-gate
20
18
  description: "Per-file line coverage meets 90% threshold (read from lcov)"
@@ -27,12 +25,3 @@ rules:
27
25
  include:
28
26
  - "apps/**/src/**"
29
27
  - "packages/**/src/**"
30
- exclude:
31
- - "**/node_modules/**"
32
- - "**/vendors/**"
33
- - "**/dist/**"
34
- - "**/tests/**"
35
- - "**/stubs/**"
36
- - "**/schema/**"
37
- - "**/migrations.ts"
38
- - "**/db.ts"
@@ -6,17 +6,14 @@ $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
6
6
  # are public integration points that warrant doc comments. The post-check gate
7
7
  # keeps those boundaries documented.
8
8
  #
9
- # Scope tightened from the evaluator's default (**/*.ts) to production source only.
10
- # Excluded: tests (no public API contract), stubs (declaration-only), schema/
11
- # migrations/db (implementation internals, not public API), dist, node_modules.
9
+ # Scope tightened from the evaluator's default (**/*.ts) to production source
10
+ # only (src-scoped includes make tests unreachable). Excluded: schema/,
11
+ # migrations/db (implementation internals — DDL/journals/adapter wiring, not
12
+ # public API surface; verified load-bearing: 6 doc violations when stripped).
12
13
  include:
13
14
  - "apps/**/src/**/*.ts"
14
15
  - "packages/**/src/**/*.ts"
15
16
  exclude:
16
- - "**/node_modules/**"
17
- - "**/dist/**"
18
- - "**/tests/**"
19
- - "**/stubs/**"
20
17
  - "**/schema/**" # drizzle DDL definitions — not public API surface
21
18
  - "**/migrations.ts"
22
19
  - "**/db.ts"
@@ -7,11 +7,9 @@ $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
7
7
  include:
8
8
  - "apps/**/src/**/*.ts"
9
9
  - "packages/**/src/**/*.ts"
10
- exclude:
11
- - "**/tests/**"
12
- - "**/*.test.ts"
13
- - "**/node_modules/**"
14
- - "**/dist/**"
10
+ # NOTE: no doc-level tests exclusion — the globalThis.fetch* rules deliberately
11
+ # include tests, and a doc-level `**/tests/**` would neuter them (verified:
12
+ # zero globalThis.fetch usage in tests today, so removing it stays green).
15
13
 
16
14
  rules:
17
15
  - id: no-direct-fetch
@@ -22,9 +20,9 @@ rules:
22
20
  config:
23
21
  pattern: "(^|[^.[:alnum:]_])fetch\\("
24
22
  exclude:
25
- # Hono/Cloudflare Workers entrypoint — `fetch` is the platform contract.
23
+ # Hono/Cloudflare Workers entrypoint — `fetch` is the platform contract
24
+ # (worker.ts:55 `async fetch(` matches the pattern when stripped).
26
25
  - "apps/server/src/worker.ts"
27
- - "apps/server/src/app.ts"
28
26
 
29
27
  - id: no-globalthis-fetch
30
28
  description: "Avoid globalThis.fetch(...); route HTTP through a client seam when one exists."
@@ -87,4 +85,3 @@ rules:
87
85
  exclude:
88
86
  - "**/tests/**"
89
87
  - "**/*.test.ts"
90
- - "**/dist/**"
@@ -6,8 +6,6 @@ include:
6
6
  exclude:
7
7
  - "**/tests/**"
8
8
  - "**/*.test.ts"
9
- - "**/node_modules/**"
10
- - "**/dist/**"
11
9
 
12
10
  rules:
13
11
  - id: no-direct-process-spawn
@@ -33,7 +31,6 @@ rules:
33
31
  exclude:
34
32
  - "**/tests/**"
35
33
  - "**/*.test.ts"
36
- - "**/dist/**"
37
34
 
38
35
  - id: no-direct-fs-io
39
36
  description: "Prefer ts-runtime's FileSystem seam for fs IO."
@@ -53,7 +50,6 @@ rules:
53
50
  exclude:
54
51
  - "**/tests/**"
55
52
  - "**/*.test.ts"
56
- - "**/dist/**"
57
53
 
58
54
  # Low-level system primitives (O_EXCL locks, FD byte-tailing, FS watcher, atomic registry, Vite glob fallback):
59
55
  - "packages/domain/src/planning/locks.ts" # POSIX atomic O_EXCL file locks
@@ -75,6 +71,6 @@ rules:
75
71
 
76
72
  # Synchronous template & workflow resolvers:
77
73
  - "apps/cli/src/commands/task.ts" # sync loadTemplateContent/Bodies callbacks
78
- - "apps/cli/src/workflow/make-lifecycle-adapter.ts" # sync resolveWorkflowPath lookup
79
74
  - "packages/app/src/services/workflow-service.ts" # composition advisory source (0775: facts extracted from the live definition inside the synchronous validate path; the baseline snapshot sync read was retired)
80
75
  - "apps/cli/src/release-ops.ts" # sync manifest/workspace reads + Bun.write rewrites inside the git release flow (task 0617); mirrors task.ts sync-template exemption
76
+ - "apps/cli/src/version-carriers.ts" # sync manifest reads + Bun.write rewrites for registered release carriers (task 0854); mirrors release-ops.ts sync exemption
@@ -24,12 +24,19 @@ rules:
24
24
  exclude:
25
25
  - "/tests/"
26
26
  - ".test.ts"
27
- - "/node_modules/"
28
- - "/dist/"
29
27
  # nested engine scratch dirs under the included app/package trees;
30
28
  # root .spur/ is outside this rule's include scope
29
+ # `/`.spur/` is load-bearing: the secrets-scanner's in-process walker
30
+ # does NOT skip dot-dirs, so nested .spur/ scratch dirs under app/package
31
+ # trees are scanned. `vendors/` fires today (LOOSE include fragments match
32
+ # `vendors/*/scripts/**`), so it must stay excluded.
31
33
  - "/.spur/"
32
34
  - "vendors/"
35
+ # `apps/cli/config/` is the gitignored bundle-config output (.gitignore
36
+ # `bundle-config`); it duplicates config/workflows YAML, which is outside
37
+ # this rule's include scope — scanning generated copies only adds noise
38
+ # (e.g. `id: task-implement-transition` trips the sk- token shape).
39
+ - "apps/cli/config/"
33
40
 
34
41
  - id: no-unsafe-git-commands
35
42
  description: "Unsafe git commands (force-push, hard reset) can overwrite history or cause data loss (AGENTS.md CRITICAL safety)."
@@ -58,7 +65,6 @@ rules:
58
65
  - "**/.env.*"
59
66
  exclude:
60
67
  - "**/.env.example"
61
- - "**/node_modules/**"
62
68
 
63
69
  # NOTE: the ts-libs `no-github-workflows` rule (asserting .github/workflows must be
64
70
  # ABSENT) was intentionally NOT absorbed — ts-libs is a library repo with no CI,
@@ -13,8 +13,6 @@ include:
13
13
  - "apps/**/tests/**/*.test.tsx"
14
14
  - "packages/**/tests/**/*.test.ts"
15
15
  - "packages/**/tests/**/*.test.tsx"
16
- exclude:
17
- - "**/node_modules/**"
18
16
  rules:
19
17
  - id: no-focused-or-skipped-tests
20
18
  description: >
@@ -33,13 +33,10 @@ rules:
33
33
  requireCorrespondingTest: true
34
34
  include:
35
35
  - "packages/**/src/**/*.ts"
36
- - "packages/**/src/**/*.tsx"
37
36
  - "apps/**/src/**/*.ts"
38
- - "apps/**/src/**/*.tsx"
39
37
 
40
38
  exclude:
41
39
  - "**/index.ts"
42
- - "**/*.tsx"
43
40
  - "**/*.d.ts"
44
41
  - "**/types.ts"
45
42
  - "**/schema/**"
@@ -48,8 +45,6 @@ rules:
48
45
  - "**/db.ts"
49
46
  ## Entity declarations — contracts are transport DTOs tested by the single contract.test.ts
50
47
  - "packages/contracts/src/**"
51
- - "**/node_modules/**"
52
- - "**/tests/**"
53
48
  ## pure re-export for UI components
54
49
  - "apps/web/src/ui.ts"
55
50
  - "apps/web/src/modules/config.ts"
@@ -10,9 +10,10 @@ include:
10
10
  - "apps/cli/src/commands/*.ts"
11
11
 
12
12
  exclude:
13
+ # Not command files: stubs.ts is an empty module shim (consistency.test.ts
14
+ # excludes it too); shared-options.ts is the option registry.
13
15
  - "apps/cli/src/commands/stubs.ts"
14
- - "apps/cli/src/commands/shared-options.ts" # option registry, not a command
15
- # module (consistency.test.ts excludes it too)
16
+ - "apps/cli/src/commands/shared-options.ts"
16
17
 
17
18
  rules:
18
19
  - id: cli-register-pattern
@@ -8,11 +8,6 @@ include:
8
8
  - "apps/**/*.ts"
9
9
  - "packages/**/*.ts"
10
10
  - "scripts/**/*.ts"
11
- - ".spur/**/*.yaml"
12
- exclude:
13
- - "**/node_modules/**"
14
- - "**/dist/**"
15
-
16
11
  rules:
17
12
  - id: no-npm-pnpm-yarn-scripts
18
13
  description: "Use bun scripts instead of npm, pnpm, or yarn commands (AGENTS.md: no npm/pnpm/yarn)."
@@ -30,8 +25,9 @@ rules:
30
25
  - "**/*.yaml"
31
26
  exclude:
32
27
  # Rule-definition YAML legitimately names these tools in patterns/descriptions.
28
+ # (`.spur/rules/**` was de-listed: ripgrep never descends into hidden dirs,
29
+ # so that tree is unreachable by the rg evaluator.)
33
30
  - "config/rules/**"
34
- - ".spur/rules/**"
35
31
 
36
32
  - id: enforce-bun-test
37
33
  description: "Unit/integration tests must use bun:test, not Jest or Mocha. The server's Cloudflare Workers suite (*.cf.ts) is the only sanctioned Vitest runner."
@@ -57,6 +53,8 @@ rules:
57
53
  - "packages/**/*.ts"
58
54
  - "scripts/**/*.ts"
59
55
  exclude:
60
- - "apps/server/tests/cf/**"
56
+ # Sanctioned Cloudflare Workers Vitest wiring; `**/*.cf.ts` covers the
57
+ # test files themselves (apps/server/tests/cf/** was redundant — its only
58
+ # occupant is worker-runtime.cf.ts).
61
59
  - "apps/server/vitest.cf.config.ts"
62
60
  - "**/*.cf.ts"
@@ -20,8 +20,6 @@ include:
20
20
  - "apps/web/tests/**/*.test.ts"
21
21
  - "apps/web/tests/**/*.test.tsx"
22
22
  exclude:
23
- - "**/node_modules/**"
24
- - "**/dist/**"
25
23
  # The shared helper is the one legitimate caller of register().
26
24
  - "apps/web/tests/happy-dom.ts"
27
25
 
@@ -21,8 +21,6 @@ include:
21
21
  - "apps/web/tests/**/*.test.ts"
22
22
  - "apps/web/tests/**/*.test.tsx"
23
23
  exclude:
24
- - "**/node_modules/**"
25
- - "**/dist/**"
26
24
  # The shared teardown helper is the sanctioned place that calls unregister().
27
25
  - "apps/web/tests/happy-dom.ts"
28
26
 
@@ -18,8 +18,6 @@ include:
18
18
  - "packages/**/src/**/*.tsx"
19
19
  - "scripts/**/*.tsx"
20
20
  exclude:
21
- - "**/node_modules/**"
22
- - "**/dist/**"
23
21
  - "**/tests/**"
24
22
  rules:
25
23
  - id: no-biome-suppressions
@@ -13,8 +13,6 @@ include:
13
13
  - "packages/**/src/**/*.ts"
14
14
  - "scripts/**/*.ts"
15
15
  exclude:
16
- - "**/node_modules/**"
17
- - "**/dist/**"
18
16
  - "**/tests/**"
19
17
  rules:
20
18
  - id: no-debugger-statement
@@ -12,10 +12,6 @@ include:
12
12
  - "packages/**/*.tsx"
13
13
  - "plugins/**/*.ts"
14
14
  - "scripts/**/*.ts"
15
- exclude:
16
- - "**/node_modules/**"
17
- - "**/dist/**"
18
- - "**/vendors/**"
19
15
  rules:
20
16
  - id: no-eslint-suppressions
21
17
  description: >