@specship/specship-win32-arm64 0.24.0 → 0.28.0

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 (341) hide show
  1. package/bin/specship.cmd +31 -1
  2. package/lib/dist/activation/cheatsheet.d.ts +17 -1
  3. package/lib/dist/activation/cheatsheet.d.ts.map +1 -1
  4. package/lib/dist/activation/cheatsheet.js +47 -3
  5. package/lib/dist/activation/cheatsheet.js.map +1 -1
  6. package/lib/dist/activation/hook-output.d.ts +80 -0
  7. package/lib/dist/activation/hook-output.d.ts.map +1 -0
  8. package/lib/dist/activation/hook-output.js +103 -0
  9. package/lib/dist/activation/hook-output.js.map +1 -0
  10. package/lib/dist/activation/search-intercept.d.ts +60 -29
  11. package/lib/dist/activation/search-intercept.d.ts.map +1 -1
  12. package/lib/dist/activation/search-intercept.js +159 -55
  13. package/lib/dist/activation/search-intercept.js.map +1 -1
  14. package/lib/dist/activation/steering.d.ts +11 -13
  15. package/lib/dist/activation/steering.d.ts.map +1 -1
  16. package/lib/dist/activation/steering.js +25 -10
  17. package/lib/dist/activation/steering.js.map +1 -1
  18. package/lib/dist/behaviour/behaviour-surface.d.ts +47 -0
  19. package/lib/dist/behaviour/behaviour-surface.d.ts.map +1 -1
  20. package/lib/dist/behaviour/behaviour-surface.js +108 -2
  21. package/lib/dist/behaviour/behaviour-surface.js.map +1 -1
  22. package/lib/dist/bin/node-version-check.d.ts +22 -7
  23. package/lib/dist/bin/node-version-check.d.ts.map +1 -1
  24. package/lib/dist/bin/node-version-check.js +39 -9
  25. package/lib/dist/bin/node-version-check.js.map +1 -1
  26. package/lib/dist/bin/specship.js +989 -116
  27. package/lib/dist/bin/specship.js.map +1 -1
  28. package/lib/dist/commands/specship/learn.md +27 -3
  29. package/lib/dist/commands/specship/spec.md +85 -15
  30. package/lib/dist/db/spec-queries.d.ts +73 -3
  31. package/lib/dist/db/spec-queries.d.ts.map +1 -1
  32. package/lib/dist/db/spec-queries.js +139 -5
  33. package/lib/dist/db/spec-queries.js.map +1 -1
  34. package/lib/dist/db/sqlite-adapter.d.ts +7 -5
  35. package/lib/dist/db/sqlite-adapter.d.ts.map +1 -1
  36. package/lib/dist/db/sqlite-adapter.js +11 -9
  37. package/lib/dist/db/sqlite-adapter.js.map +1 -1
  38. package/lib/dist/enforce/changed-files.d.ts +39 -0
  39. package/lib/dist/enforce/changed-files.d.ts.map +1 -0
  40. package/lib/dist/enforce/changed-files.js +114 -0
  41. package/lib/dist/enforce/changed-files.js.map +1 -0
  42. package/lib/dist/enforce/enforce.d.ts +53 -2
  43. package/lib/dist/enforce/enforce.d.ts.map +1 -1
  44. package/lib/dist/enforce/enforce.js +95 -8
  45. package/lib/dist/enforce/enforce.js.map +1 -1
  46. package/lib/dist/enforce/mutation.d.ts +46 -0
  47. package/lib/dist/enforce/mutation.d.ts.map +1 -0
  48. package/lib/dist/enforce/mutation.js +104 -0
  49. package/lib/dist/enforce/mutation.js.map +1 -0
  50. package/lib/dist/enforce/suppressions.d.ts +33 -0
  51. package/lib/dist/enforce/suppressions.d.ts.map +1 -0
  52. package/lib/dist/enforce/suppressions.js +159 -0
  53. package/lib/dist/enforce/suppressions.js.map +1 -0
  54. package/lib/dist/extraction/grammars.d.ts +10 -0
  55. package/lib/dist/extraction/grammars.d.ts.map +1 -1
  56. package/lib/dist/extraction/grammars.js +32 -3
  57. package/lib/dist/extraction/grammars.js.map +1 -1
  58. package/lib/dist/extraction/index.d.ts +7 -0
  59. package/lib/dist/extraction/index.d.ts.map +1 -1
  60. package/lib/dist/extraction/index.js.map +1 -1
  61. package/lib/dist/extraction/specs/markdown-spec-extractor.d.ts +7 -0
  62. package/lib/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -1
  63. package/lib/dist/extraction/specs/markdown-spec-extractor.js +97 -10
  64. package/lib/dist/extraction/specs/markdown-spec-extractor.js.map +1 -1
  65. package/lib/dist/extraction/wasm/tree-sitter-pascal.wasm.gz +0 -0
  66. package/lib/dist/extraction/wasm/tree-sitter-scala.wasm.gz +0 -0
  67. package/lib/dist/graph/spec-coverage.d.ts +142 -0
  68. package/lib/dist/graph/spec-coverage.d.ts.map +1 -0
  69. package/lib/dist/graph/spec-coverage.js +276 -0
  70. package/lib/dist/graph/spec-coverage.js.map +1 -0
  71. package/lib/dist/health/smoke-check.js +2 -2
  72. package/lib/dist/health/smoke-check.js.map +1 -1
  73. package/lib/dist/index.d.ts +75 -7
  74. package/lib/dist/index.d.ts.map +1 -1
  75. package/lib/dist/index.js +191 -23
  76. package/lib/dist/index.js.map +1 -1
  77. package/lib/dist/installer/gemini-commands.d.ts +107 -0
  78. package/lib/dist/installer/gemini-commands.d.ts.map +1 -0
  79. package/lib/dist/installer/gemini-commands.js +264 -0
  80. package/lib/dist/installer/gemini-commands.js.map +1 -0
  81. package/lib/dist/installer/index.d.ts +55 -8
  82. package/lib/dist/installer/index.d.ts.map +1 -1
  83. package/lib/dist/installer/index.js +72 -53
  84. package/lib/dist/installer/index.js.map +1 -1
  85. package/lib/dist/installer/init-offer.d.ts +14 -9
  86. package/lib/dist/installer/init-offer.d.ts.map +1 -1
  87. package/lib/dist/installer/init-offer.js +13 -9
  88. package/lib/dist/installer/init-offer.js.map +1 -1
  89. package/lib/dist/installer/install-defaults.d.ts +81 -0
  90. package/lib/dist/installer/install-defaults.d.ts.map +1 -0
  91. package/lib/dist/installer/install-defaults.js +95 -0
  92. package/lib/dist/installer/install-defaults.js.map +1 -0
  93. package/lib/dist/installer/instructions-template.d.ts +22 -0
  94. package/lib/dist/installer/instructions-template.d.ts.map +1 -1
  95. package/lib/dist/installer/instructions-template.js +37 -1
  96. package/lib/dist/installer/instructions-template.js.map +1 -1
  97. package/lib/dist/installer/targets/claude.d.ts +18 -0
  98. package/lib/dist/installer/targets/claude.d.ts.map +1 -1
  99. package/lib/dist/installer/targets/claude.js +70 -23
  100. package/lib/dist/installer/targets/claude.js.map +1 -1
  101. package/lib/dist/installer/targets/gemini.d.ts +85 -12
  102. package/lib/dist/installer/targets/gemini.d.ts.map +1 -1
  103. package/lib/dist/installer/targets/gemini.js +527 -30
  104. package/lib/dist/installer/targets/gemini.js.map +1 -1
  105. package/lib/dist/installer/targets/shared.d.ts +13 -0
  106. package/lib/dist/installer/targets/shared.d.ts.map +1 -1
  107. package/lib/dist/installer/targets/shared.js +22 -4
  108. package/lib/dist/installer/targets/shared.js.map +1 -1
  109. package/lib/dist/installer/targets/types.d.ts +12 -0
  110. package/lib/dist/installer/targets/types.d.ts.map +1 -1
  111. package/lib/dist/jira/auto-publish.d.ts +71 -4
  112. package/lib/dist/jira/auto-publish.d.ts.map +1 -1
  113. package/lib/dist/jira/auto-publish.js +186 -17
  114. package/lib/dist/jira/auto-publish.js.map +1 -1
  115. package/lib/dist/jira/reconcile.d.ts +24 -1
  116. package/lib/dist/jira/reconcile.d.ts.map +1 -1
  117. package/lib/dist/jira/reconcile.js +46 -2
  118. package/lib/dist/jira/reconcile.js.map +1 -1
  119. package/lib/dist/jira/repo-config.d.ts +9 -0
  120. package/lib/dist/jira/repo-config.d.ts.map +1 -1
  121. package/lib/dist/jira/repo-config.js +11 -0
  122. package/lib/dist/jira/repo-config.js.map +1 -1
  123. package/lib/dist/jira/types.d.ts +7 -0
  124. package/lib/dist/jira/types.d.ts.map +1 -1
  125. package/lib/dist/jira/types.js.map +1 -1
  126. package/lib/dist/knowledge/enforce.d.ts +75 -0
  127. package/lib/dist/knowledge/enforce.d.ts.map +1 -0
  128. package/lib/dist/knowledge/enforce.js +250 -0
  129. package/lib/dist/knowledge/enforce.js.map +1 -0
  130. package/lib/dist/knowledge/facts.d.ts +33 -0
  131. package/lib/dist/knowledge/facts.d.ts.map +1 -0
  132. package/lib/dist/knowledge/facts.js +117 -0
  133. package/lib/dist/knowledge/facts.js.map +1 -0
  134. package/lib/dist/knowledge/proposals.d.ts +88 -0
  135. package/lib/dist/knowledge/proposals.d.ts.map +1 -0
  136. package/lib/dist/knowledge/proposals.js +360 -0
  137. package/lib/dist/knowledge/proposals.js.map +1 -0
  138. package/lib/dist/knowledge/stale.d.ts +64 -0
  139. package/lib/dist/knowledge/stale.d.ts.map +1 -0
  140. package/lib/dist/knowledge/stale.js +174 -0
  141. package/lib/dist/knowledge/stale.js.map +1 -0
  142. package/lib/dist/mcp/fitness-tool.d.ts +5 -6
  143. package/lib/dist/mcp/fitness-tool.d.ts.map +1 -1
  144. package/lib/dist/mcp/fitness-tool.js +0 -16
  145. package/lib/dist/mcp/fitness-tool.js.map +1 -1
  146. package/lib/dist/mcp/gemini-session.d.ts +50 -0
  147. package/lib/dist/mcp/gemini-session.d.ts.map +1 -0
  148. package/lib/dist/mcp/gemini-session.js +159 -0
  149. package/lib/dist/mcp/gemini-session.js.map +1 -0
  150. package/lib/dist/mcp/health-tool.d.ts +26 -0
  151. package/lib/dist/mcp/health-tool.d.ts.map +1 -0
  152. package/lib/dist/mcp/health-tool.js +50 -0
  153. package/lib/dist/mcp/health-tool.js.map +1 -0
  154. package/lib/dist/mcp/jira-tools.d.ts.map +1 -1
  155. package/lib/dist/mcp/jira-tools.js +25 -0
  156. package/lib/dist/mcp/jira-tools.js.map +1 -1
  157. package/lib/dist/mcp/maintainability-tool.d.ts +5 -7
  158. package/lib/dist/mcp/maintainability-tool.d.ts.map +1 -1
  159. package/lib/dist/mcp/maintainability-tool.js +0 -16
  160. package/lib/dist/mcp/maintainability-tool.js.map +1 -1
  161. package/lib/dist/mcp/model-context.d.ts +31 -7
  162. package/lib/dist/mcp/model-context.d.ts.map +1 -1
  163. package/lib/dist/mcp/model-context.js +70 -21
  164. package/lib/dist/mcp/model-context.js.map +1 -1
  165. package/lib/dist/mcp/proxy.d.ts.map +1 -1
  166. package/lib/dist/mcp/proxy.js +5 -2
  167. package/lib/dist/mcp/proxy.js.map +1 -1
  168. package/lib/dist/mcp/server-instructions.d.ts +16 -15
  169. package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
  170. package/lib/dist/mcp/server-instructions.js +72 -5
  171. package/lib/dist/mcp/server-instructions.js.map +1 -1
  172. package/lib/dist/mcp/session.js +1 -1
  173. package/lib/dist/mcp/session.js.map +1 -1
  174. package/lib/dist/mcp/spec-tools.d.ts +9 -1
  175. package/lib/dist/mcp/spec-tools.d.ts.map +1 -1
  176. package/lib/dist/mcp/spec-tools.js +282 -49
  177. package/lib/dist/mcp/spec-tools.js.map +1 -1
  178. package/lib/dist/mcp/tools.d.ts +49 -9
  179. package/lib/dist/mcp/tools.d.ts.map +1 -1
  180. package/lib/dist/mcp/tools.js +210 -58
  181. package/lib/dist/mcp/tools.js.map +1 -1
  182. package/lib/dist/pulse/pulse.d.ts +93 -0
  183. package/lib/dist/pulse/pulse.d.ts.map +1 -0
  184. package/lib/dist/pulse/pulse.js +401 -0
  185. package/lib/dist/pulse/pulse.js.map +1 -0
  186. package/lib/dist/reflect/apply.d.ts.map +1 -1
  187. package/lib/dist/reflect/apply.js +38 -3
  188. package/lib/dist/reflect/apply.js.map +1 -1
  189. package/lib/dist/reflect/auto-sweep.d.ts +26 -0
  190. package/lib/dist/reflect/auto-sweep.d.ts.map +1 -0
  191. package/lib/dist/reflect/auto-sweep.js +90 -0
  192. package/lib/dist/reflect/auto-sweep.js.map +1 -0
  193. package/lib/dist/reflect/cli.d.ts +62 -0
  194. package/lib/dist/reflect/cli.d.ts.map +1 -0
  195. package/lib/dist/reflect/cli.js +163 -0
  196. package/lib/dist/reflect/cli.js.map +1 -0
  197. package/lib/dist/reflect/miner.d.ts.map +1 -1
  198. package/lib/dist/reflect/miner.js +119 -0
  199. package/lib/dist/reflect/miner.js.map +1 -1
  200. package/lib/dist/reflect/sweep.d.ts +1 -0
  201. package/lib/dist/reflect/sweep.d.ts.map +1 -1
  202. package/lib/dist/reflect/sweep.js +62 -13
  203. package/lib/dist/reflect/sweep.js.map +1 -1
  204. package/lib/dist/reflect/targets.d.ts +2 -0
  205. package/lib/dist/reflect/targets.d.ts.map +1 -1
  206. package/lib/dist/reflect/targets.js +33 -0
  207. package/lib/dist/reflect/targets.js.map +1 -1
  208. package/lib/dist/reflect/types.d.ts +19 -2
  209. package/lib/dist/reflect/types.d.ts.map +1 -1
  210. package/lib/dist/resolution/spec-link-resolver.d.ts +44 -2
  211. package/lib/dist/resolution/spec-link-resolver.d.ts.map +1 -1
  212. package/lib/dist/resolution/spec-link-resolver.js +132 -0
  213. package/lib/dist/resolution/spec-link-resolver.js.map +1 -1
  214. package/lib/dist/resolution/test-title-links.d.ts +62 -0
  215. package/lib/dist/resolution/test-title-links.d.ts.map +1 -0
  216. package/lib/dist/resolution/test-title-links.js +97 -0
  217. package/lib/dist/resolution/test-title-links.js.map +1 -0
  218. package/lib/dist/search/query-parser.d.ts.map +1 -1
  219. package/lib/dist/search/query-parser.js +6 -1
  220. package/lib/dist/search/query-parser.js.map +1 -1
  221. package/lib/dist/server/project-registry.js +1 -1
  222. package/lib/dist/server/routes/claude.js +24 -43
  223. package/lib/dist/server/routes/graph.js +53 -7
  224. package/lib/dist/server/routes/knowledge.js +118 -0
  225. package/lib/dist/server/routes/mcp.js +4 -3
  226. package/lib/dist/server/routes/projects.js +4 -4
  227. package/lib/dist/server/routes/spec.js +49 -7
  228. package/lib/dist/server/server.js +31 -17
  229. package/lib/dist/skills/spec-author/SKILL.md +164 -0
  230. package/lib/dist/skills/spec-author/references/format.md +210 -0
  231. package/lib/dist/skills/spec-author/references/gap-questions.md +152 -0
  232. package/lib/dist/skills/spec-author/references/quality-rubric.md +125 -0
  233. package/lib/dist/skills/spec-author/references/review-checklist.md +175 -0
  234. package/lib/dist/spec-lint/lint.d.ts +82 -0
  235. package/lib/dist/spec-lint/lint.d.ts.map +1 -0
  236. package/lib/dist/spec-lint/lint.js +491 -0
  237. package/lib/dist/spec-lint/lint.js.map +1 -0
  238. package/lib/dist/spec-quality/criterion-ids.d.ts +13 -0
  239. package/lib/dist/spec-quality/criterion-ids.d.ts.map +1 -0
  240. package/lib/dist/spec-quality/criterion-ids.js +38 -0
  241. package/lib/dist/spec-quality/criterion-ids.js.map +1 -0
  242. package/lib/dist/spec-quality/evidence-kind.d.ts +54 -0
  243. package/lib/dist/spec-quality/evidence-kind.d.ts.map +1 -0
  244. package/lib/dist/spec-quality/evidence-kind.js +183 -0
  245. package/lib/dist/spec-quality/evidence-kind.js.map +1 -0
  246. package/lib/dist/spec-quality/link-persist.d.ts +65 -0
  247. package/lib/dist/spec-quality/link-persist.d.ts.map +1 -0
  248. package/lib/dist/spec-quality/link-persist.js +249 -0
  249. package/lib/dist/spec-quality/link-persist.js.map +1 -0
  250. package/lib/dist/spec-quality/plan-scope.d.ts +38 -0
  251. package/lib/dist/spec-quality/plan-scope.d.ts.map +1 -0
  252. package/lib/dist/spec-quality/plan-scope.js +129 -0
  253. package/lib/dist/spec-quality/plan-scope.js.map +1 -0
  254. package/lib/dist/spec-quality/postcheck.d.ts +85 -0
  255. package/lib/dist/spec-quality/postcheck.d.ts.map +1 -0
  256. package/lib/dist/spec-quality/postcheck.js +390 -0
  257. package/lib/dist/spec-quality/postcheck.js.map +1 -0
  258. package/lib/dist/spec-quality/readiness.d.ts +72 -0
  259. package/lib/dist/spec-quality/readiness.d.ts.map +1 -0
  260. package/lib/dist/spec-quality/readiness.js +226 -0
  261. package/lib/dist/spec-quality/readiness.js.map +1 -0
  262. package/lib/dist/statusline/index.js.map +1 -1
  263. package/lib/dist/statusline/render.d.ts +1 -1
  264. package/lib/dist/statusline/render.d.ts.map +1 -1
  265. package/lib/dist/statusline/render.js +3 -1
  266. package/lib/dist/statusline/render.js.map +1 -1
  267. package/lib/dist/ui/assets/index-BzuUWUAE.js +50 -0
  268. package/lib/dist/ui/index.html +1 -1
  269. package/lib/dist/verify/report-ingest.d.ts +88 -0
  270. package/lib/dist/verify/report-ingest.d.ts.map +1 -0
  271. package/lib/dist/verify/report-ingest.js +269 -0
  272. package/lib/dist/verify/report-ingest.js.map +1 -0
  273. package/lib/dist/workflows/agents/claude.d.ts +16 -0
  274. package/lib/dist/workflows/agents/claude.d.ts.map +1 -0
  275. package/lib/dist/workflows/agents/claude.js +82 -0
  276. package/lib/dist/workflows/agents/claude.js.map +1 -0
  277. package/lib/dist/workflows/agents/gemini.d.ts +21 -0
  278. package/lib/dist/workflows/agents/gemini.d.ts.map +1 -0
  279. package/lib/dist/workflows/agents/gemini.js +124 -0
  280. package/lib/dist/workflows/agents/gemini.js.map +1 -0
  281. package/lib/dist/workflows/agents/index.d.ts +28 -0
  282. package/lib/dist/workflows/agents/index.d.ts.map +1 -0
  283. package/lib/dist/workflows/agents/index.js +104 -0
  284. package/lib/dist/workflows/agents/index.js.map +1 -0
  285. package/lib/dist/workflows/agents/types.d.ts +55 -0
  286. package/lib/dist/workflows/agents/types.d.ts.map +1 -0
  287. package/lib/dist/workflows/agents/types.js +46 -0
  288. package/lib/dist/workflows/agents/types.js.map +1 -0
  289. package/lib/dist/workflows/batch.d.ts +63 -0
  290. package/lib/dist/workflows/batch.d.ts.map +1 -0
  291. package/lib/dist/workflows/batch.js +151 -0
  292. package/lib/dist/workflows/batch.js.map +1 -0
  293. package/lib/dist/workflows/defaults/claude-design-implement.yaml +3 -4
  294. package/lib/dist/workflows/defaults/spec-author.yaml +11 -9
  295. package/lib/dist/workflows/defaults/spec-fix.yaml +103 -12
  296. package/lib/dist/workflows/defaults/spec-implement-mixed.yaml +21 -193
  297. package/lib/dist/workflows/defaults/spec-implement.yaml +701 -41
  298. package/lib/dist/workflows/defaults/spec-verify.yaml +60 -9
  299. package/lib/dist/workflows/discovery.d.ts +13 -0
  300. package/lib/dist/workflows/discovery.d.ts.map +1 -1
  301. package/lib/dist/workflows/discovery.js +79 -17
  302. package/lib/dist/workflows/discovery.js.map +1 -1
  303. package/lib/dist/workflows/executor.d.ts +18 -0
  304. package/lib/dist/workflows/executor.d.ts.map +1 -1
  305. package/lib/dist/workflows/executor.js +130 -33
  306. package/lib/dist/workflows/executor.js.map +1 -1
  307. package/lib/dist/workflows/gc.d.ts +50 -0
  308. package/lib/dist/workflows/gc.d.ts.map +1 -0
  309. package/lib/dist/workflows/gc.js +120 -0
  310. package/lib/dist/workflows/gc.js.map +1 -0
  311. package/lib/dist/workflows/merge-queue.d.ts +64 -0
  312. package/lib/dist/workflows/merge-queue.d.ts.map +1 -0
  313. package/lib/dist/workflows/merge-queue.js +162 -0
  314. package/lib/dist/workflows/merge-queue.js.map +1 -0
  315. package/lib/dist/workflows/runners/approval.d.ts +1 -1
  316. package/lib/dist/workflows/runners/approval.d.ts.map +1 -1
  317. package/lib/dist/workflows/runners/approval.js +11 -2
  318. package/lib/dist/workflows/runners/approval.js.map +1 -1
  319. package/lib/dist/workflows/runners/bash.d.ts +15 -0
  320. package/lib/dist/workflows/runners/bash.d.ts.map +1 -1
  321. package/lib/dist/workflows/runners/bash.js +50 -1
  322. package/lib/dist/workflows/runners/bash.js.map +1 -1
  323. package/lib/dist/workflows/runners/prompt.d.ts +16 -41
  324. package/lib/dist/workflows/runners/prompt.d.ts.map +1 -1
  325. package/lib/dist/workflows/runners/prompt.js +55 -120
  326. package/lib/dist/workflows/runners/prompt.js.map +1 -1
  327. package/lib/dist/workflows/runners/types.d.ts +12 -0
  328. package/lib/dist/workflows/runners/types.d.ts.map +1 -1
  329. package/lib/dist/workflows/schemas/workflow.d.ts +17 -0
  330. package/lib/dist/workflows/schemas/workflow.d.ts.map +1 -1
  331. package/lib/dist/workflows/schemas/workflow.js +27 -0
  332. package/lib/dist/workflows/schemas/workflow.js.map +1 -1
  333. package/lib/node_modules/.package-lock.json +1 -1
  334. package/lib/package.json +8 -4
  335. package/package.json +5 -3
  336. package/lib/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
  337. package/lib/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
  338. package/lib/dist/server/ingest/impact-query.js +0 -343
  339. package/lib/dist/server/routes/events.js +0 -152
  340. package/lib/dist/ui/assets/index-CjjaftDw.js +0 -50
  341. package/node.exe +0 -4
@@ -14,8 +14,10 @@ inputs:
14
14
  systemPromptAppend: |
15
15
  You are fixing code so a spec's link returns to "verified" state.
16
16
  Call specship_spec($INPUT.SPEC_ID) first to see the current state and
17
- drift_axis. After fixing, call specship_link_verify({result: "pass"})
18
- on each affected link before reporting done.
17
+ drift_axis. Link state changes only in the link_verify node, only after
18
+ the reviewer's approval, and only as the run's VERIFY_RESULT marker
19
+ allows — a verify leg that was skipped or never got past install/build
20
+ proves nothing and promotes nothing (REQ-REVINT-006).
19
21
 
20
22
  nodes:
21
23
  - id: diagnose
@@ -78,33 +80,122 @@ nodes:
78
80
  output_type: test_results
79
81
  timeout: 600000
80
82
  bash: |
83
+ # Same VERIFY_RESULT marker contract as spec-implement
84
+ # (REQ-REVINT-006.A2): the link_verify node routes on the marker, so a
85
+ # skipped run can never be mistaken for a passing one, and an
86
+ # environment or build failure is never attributed to the tests.
81
87
  if [ -f package.json ]; then
82
- npm test
88
+ # A fresh worktree has no node_modules/ or build output.
89
+ if [ ! -d node_modules ]; then
90
+ if ! { npm ci --no-audit --no-fund || npm install --no-audit --no-fund; }; then
91
+ echo "VERIFY_RESULT=env-failed"; exit 1
92
+ fi
93
+ fi
94
+ if ! npm run build --if-present; then echo "VERIFY_RESULT=build-failed"; exit 1; fi
95
+ if npm test; then echo "VERIFY_RESULT=ran-and-passed"; else echo "VERIFY_RESULT=ran-and-failed"; exit 1; fi
83
96
  elif [ -f Cargo.toml ]; then
84
- cargo test
97
+ if ! cargo build; then echo "VERIFY_RESULT=build-failed"; exit 1; fi
98
+ if cargo test; then echo "VERIFY_RESULT=ran-and-passed"; else echo "VERIFY_RESULT=ran-and-failed"; exit 1; fi
85
99
  elif [ -f pyproject.toml ] || [ -f requirements.txt ]; then
86
- python -m pytest
100
+ if ! python -c 'import pytest' 2>/dev/null; then echo "VERIFY_RESULT=env-failed"; exit 1; fi
101
+ if python -m pytest; then echo "VERIFY_RESULT=ran-and-passed"; else echo "VERIFY_RESULT=ran-and-failed"; exit 1; fi
87
102
  else
88
- echo "no recognised test framework; skipping"
103
+ echo "no recognised test framework; tests did NOT run"
104
+ echo "VERIFY_RESULT=skipped"
89
105
  fi
90
106
 
107
+ - id: route_verify
108
+ kind: bash
109
+ depends_on: [verify]
110
+ output_type: verify_route
111
+ bash: |
112
+ # Deterministic verify routing (REQ-VSTATE-005.A1): code parses the
113
+ # VERIFY_RESULT marker and emits the LINK_ACTION the link node obeys, so
114
+ # the decision that governs link promotion isn't a prompt's reading of a
115
+ # test log. env-failed / build-failed halt here, before the approval gate
116
+ # and before any link mutation, naming the cause (REQ-VSTATE-005.A3).
117
+ VERIFY_OUT=$verify.output
118
+ MARKER=$(printf '%s' "$VERIFY_OUT" | grep -oE 'VERIFY_RESULT=[a-z-]+' | tail -n 1 | cut -d= -f2)
119
+ [ -n "$MARKER" ] || MARKER=missing
120
+ echo "VERIFY_RESULT=$MARKER"
121
+ case "$MARKER" in
122
+ ran-and-passed)
123
+ echo "LINK_ACTION=verify-pass" ;;
124
+ ran-and-failed)
125
+ echo "LINK_ACTION=verify-fail" ;;
126
+ skipped)
127
+ echo "LINK_ACTION=no-verify" ;;
128
+ env-failed)
129
+ echo "HALT_CAUSE=environment setup failed (dependency install) — nothing is known about the tests"
130
+ exit 1 ;;
131
+ build-failed)
132
+ echo "HALT_CAUSE=build failed — nothing is known about the tests"
133
+ exit 1 ;;
134
+ *)
135
+ echo "HALT_CAUSE=no VERIFY_RESULT marker found in the verify output — an unknown result is never a pass"
136
+ exit 1 ;;
137
+ esac
138
+
139
+ - id: approve_links
140
+ kind: approval
141
+ depends_on: [route_verify]
142
+ message: |
143
+ Fix applied for $INPUT.SPEC_ID — approve before any link changes state
144
+ (REQ-REVINT-006.A4).
145
+
146
+ Files changed:
147
+ $apply.output
148
+
149
+ Verify routing (computed in code, REQ-VSTATE-005.A1 — `no-verify`
150
+ means no test ran, so nothing here can reach `verified`):
151
+ $route_verify.output
152
+
153
+ Test results:
154
+ $verify.output
155
+
156
+ Approve to let the link states be updated, or reject to leave every
157
+ link exactly as it is.
158
+ capture_response: true
159
+
91
160
  - id: link_verify
92
161
  kind: prompt
93
- depends_on: [verify]
162
+ depends_on: [approve_links]
94
163
  output_type: link_summary
95
164
  allowed_tools:
96
165
  - mcp__specship__specship_spec
97
166
  - mcp__specship__specship_link_assert
98
167
  - mcp__specship__specship_link_verify
99
168
  prompt: |
100
- For each link that was drifted/broken on $INPUT.SPEC_ID, now that
101
- the fix has been applied and tests pass, call specship_link_verify
102
- with result="pass" (or "fail" if a test failed for that link).
169
+ The reviewer has approved updating link state for $INPUT.SPEC_ID.
170
+
171
+ Act on LINK_ACTION — a bash node already derived it from the
172
+ VERIFY_RESULT marker (REQ-VSTATE-005.A1). Do NOT re-derive it from the
173
+ test log; read it here:
174
+
175
+ $route_verify.output
176
+
177
+ - LINK_ACTION=verify-pass → for each link that was drifted/broken, call
178
+ specship_link_verify with result="pass" (or "fail" if a test failed
179
+ for that link specifically).
180
+ - LINK_ACTION=verify-fail → call specship_link_verify with
181
+ result="fail" for the affected links. Never "pass".
182
+ - LINK_ACTION=no-verify → no test ran, so nothing is proven. Do NOT
183
+ call specship_link_verify at all; no link may reach `verified`
184
+ (REQ-REVINT-006.A3). Report that verification was skipped.
185
+
186
+ A run whose environment or build broke never reaches this node — the
187
+ routing step halts it first (REQ-VSTATE-005.A3).
103
188
 
104
189
  If a link is orphaned because the symbol moved, call
105
- specship_link_assert at the new location.
190
+ specship_link_assert at the new location. Never pass kind: 'tests' —
191
+ test evidence is file-derived (`verifies:` block or an `@verifies`
192
+ comment), never minted by this workflow (REQ-REVINT-005.A1).
193
+
194
+ Reviewer feedback (if any):
195
+ $approve_links.output
106
196
 
107
197
  Test results:
108
198
  $verify.output
109
199
 
110
- Output: one line per link with the new state.
200
+ Output: one line per link with the new state, ending with one line
201
+ stating whether verification ran, failed, or was skipped.
@@ -1,197 +1,25 @@
1
1
  name: spec-implement-mixed
2
2
  description: Implement a spec with mixed models — sonnet plans, haiku executes, tests + gates verify. Same steps and gates as spec-implement at a fraction of the token cost.
3
3
  tags: [spec, default, mixed-model]
4
- requires: [specship, git]
5
4
 
6
- worktree:
7
- enabled: true
8
-
9
- inputs:
10
- - name: SPEC_ID
11
- description: The spec ID to implement (e.g. REQ-AUTH-005)
12
- required: true
13
-
14
- systemPromptAppend: |
15
- You are implementing a specific requirement. Before editing code, call
16
- specship_spec($INPUT.SPEC_ID) to see the spec body and any code it
17
- already links to. After editing, call specship_link_assert with the
18
- spec_id and the symbol you implemented BEFORE reporting done.
19
-
20
- nodes:
21
- - id: fetch_spec
22
- # MIXMODEL-DOC: mechanical step → haiku
23
- model: haiku
24
- kind: prompt
25
- output_type: spec_summary
26
- allowed_tools:
27
- - mcp__specship__specship_spec
28
- - mcp__specship__specship_explore
29
- prompt: |
30
- Spec ID: $INPUT.SPEC_ID
31
-
32
- Call specship_spec to fetch the spec. Then call specship_explore on
33
- a small bag of terms drawn from the spec title and acceptance
34
- criteria to find the relevant code area.
35
-
36
- Output: a short summary (≤300 words) of (a) what the spec asks for,
37
- (b) which code areas / symbols are most relevant, and (c) whether
38
- any code currently claims to implement it (look at linked_code).
39
-
40
- - id: plan
41
- # MIXMODEL-DOC: judgment step → sonnet
42
- model: sonnet
43
- kind: prompt
44
- depends_on: [fetch_spec]
45
- output_type: plan
46
- allowed_tools:
47
- - mcp__specship__specship_explore
48
- - mcp__specship__specship_node
49
- - mcp__specship__specship_spec
50
- - Read
51
- prompt: |
52
- Based on this spec summary, write a concrete implementation plan:
53
-
54
- $fetch_spec.output
55
-
56
- The plan should list:
57
- - Files to create or modify (with project-relative paths)
58
- - Specific functions/methods/classes to add or change
59
- - Tests to add or update
60
- - Order of changes
61
-
62
- Keep it tight (≤500 words). Do NOT edit code in this step.
63
-
64
- - id: approve_plan
65
- kind: approval
66
- depends_on: [plan]
67
- message: |
68
- Plan ready for $INPUT.SPEC_ID. Review the plan output and approve
69
- to proceed with implementation, or reject with feedback to revise.
70
- capture_response: true
71
- on_reject:
72
- prompt: |
73
- The plan was rejected with this feedback. Revise:
74
-
75
- $approve_plan.output
76
- max_attempts: 3
77
-
78
- - id: implement
79
- # MIXMODEL-DOC: mechanical step → haiku
80
- model: haiku
81
- kind: prompt
82
- depends_on: [approve_plan]
83
- output_type: diff
84
- allowed_tools:
85
- - Read
86
- - Edit
87
- - Write
88
- - Bash
89
- - mcp__specship__specship_explore
90
- - mcp__specship__specship_node
91
- - mcp__specship__specship_spec
92
- prompt: |
93
- Implement the approved plan. Follow it closely.
94
-
95
- Plan:
96
- $plan.output
97
-
98
- Approval feedback (if any):
99
- $approve_plan.output
100
-
101
- When done, output a short diff summary (which files changed and why).
102
-
103
- - id: verify
104
- kind: bash
105
- depends_on: [implement]
106
- output_type: test_results
107
- timeout: 600000
108
- bash: |
109
- # Run the project's test suite. The verify node's exit code drives
110
- # the gating for the link node — non-zero halts the workflow.
111
- # The VERIFY_RESULT marker is the machine-readable contract the link
112
- # node routes on (REQ-IMPLINT-001.A1): a skipped run must never be
113
- # mistaken for a passing one.
114
- if [ -f package.json ]; then
115
- # A fresh worktree has no node_modules/ or build output — a verify
116
- # failure must mean the tests failed, not that the environment was
117
- # missing (WF-REJECT-DOC, REQ-WFREJ-005).
118
- if [ ! -d node_modules ]; then npm ci --no-audit --no-fund || npm install --no-audit --no-fund; fi
119
- npm run build --if-present
120
- if npm test; then echo "VERIFY_RESULT=ran-and-passed"; else echo "VERIFY_RESULT=ran-and-failed"; exit 1; fi
121
- elif [ -f Cargo.toml ]; then
122
- if cargo test; then echo "VERIFY_RESULT=ran-and-passed"; else echo "VERIFY_RESULT=ran-and-failed"; exit 1; fi
123
- elif [ -f pyproject.toml ] || [ -f requirements.txt ]; then
124
- if python -m pytest; then echo "VERIFY_RESULT=ran-and-passed"; else echo "VERIFY_RESULT=ran-and-failed"; exit 1; fi
125
- else
126
- echo "no recognised test framework; tests did NOT run"
127
- echo "VERIFY_RESULT=skipped"
128
- fi
129
-
130
- - id: link
131
- # MIXMODEL-DOC: mechanical step → haiku
132
- model: haiku
133
- kind: prompt
134
- depends_on: [verify]
135
- output_type: link_summary
136
- allowed_tools:
137
- - mcp__specship__specship_link_assert
138
- - mcp__specship__specship_link_verify
139
- - mcp__specship__specship_spec
140
- prompt: |
141
- Assert spec→code links for the changes made in the implement step.
142
- For each symbol that implements $INPUT.SPEC_ID (or its child
143
- requirements), call specship_link_assert with the spec_id, the
144
- file path, and the qualified symbol name.
145
-
146
- Then route on the VERIFY_RESULT marker in the test results below
147
- (REQ-IMPLINT-001):
148
- - VERIFY_RESULT=ran-and-passed → after each assert, call
149
- specship_link_verify with result="pass".
150
- - VERIFY_RESULT=skipped → do NOT call specship_link_verify at all;
151
- the links stay in the `implemented` state. Tests that did not run
152
- are never reported as passing.
153
-
154
- Implementation diff summary:
155
- $implement.output
156
-
157
- Test results:
158
- $verify.output
159
-
160
- Output: a short list of "spec_id → file:symbol [verified|implemented]"
161
- lines, ending with one line stating whether verification ran or was
162
- skipped.
163
-
164
- - id: coverage
165
- # MIXMODEL-DOC: mechanical step → haiku
166
- model: haiku
167
- kind: prompt
168
- depends_on: [link]
169
- output_type: coverage_summary
170
- allowed_tools:
171
- - mcp__specship__specship_spec
172
- prompt: |
173
- Report acceptance-criteria test coverage for $INPUT.SPEC_ID
174
- (REQ-IMPLINT-002). Call specship_spec with the spec_id, count its
175
- acceptance criteria (the .A<N> children; if the spec has none,
176
- treat the requirement itself as one criterion), and count how many
177
- of them carry a `tests`-kind link.
178
-
179
- Output exactly one or two lines:
180
- - "N of M acceptance criteria for $INPUT.SPEC_ID have linked tests."
181
- - If N < M, add: "Close the gap with /specship:spec behaviour
182
- $INPUT.SPEC_ID."
183
-
184
- - id: final_review
185
- kind: approval
186
- depends_on: [coverage]
187
- message: |
188
- Implementation complete for $INPUT.SPEC_ID.
189
-
190
- Links asserted:
191
- $link.output
192
-
193
- Acceptance-criteria test coverage:
194
- $coverage.output
195
-
196
- Approve to finalize the run (worktree is left for you to inspect
197
- and merge), or reject to abandon.
5
+ # THROUGHPUT-DOC, REQ-THRU-004 — one source of truth for the implement
6
+ # pipeline. This variant inherits every node, gate and prompt from
7
+ # spec-implement and states only what differs: which model runs each step
8
+ # (MIXMODEL-DOC). Judgment steps are pinned up (sonnet); mechanical steps are
9
+ # pinned down (haiku); bash gates, approvals, verify, routing and coverage are
10
+ # model-free and identical by construction.
11
+ extends: spec-implement
12
+
13
+ node_overrides:
14
+ fetch_spec:
15
+ model: haiku # mechanical: read the spec and summarize
16
+ plan:
17
+ model: sonnet # judgment: the plan the human approves
18
+ implement:
19
+ model: haiku # mechanical: execute the approved plan
20
+ fix_quality:
21
+ model: haiku # mechanical: fix what the linter named
22
+ link:
23
+ model: haiku # mechanical: record implementations bullets
24
+ adversarial_review:
25
+ model: sonnet # judgment: try to break the change