@opengsd/gsd-core 1.11.0 → 1.13.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 (498) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.opencode/plugins/gsd-core.js +12 -0
  4. package/agents/gsd-code-fixer.md +1 -1
  5. package/agents/gsd-debug-session-manager.md +1 -1
  6. package/agents/gsd-debugger.md +1 -1
  7. package/agents/gsd-dom-verifier.md +169 -0
  8. package/agents/gsd-eval-auditor.md +1 -1
  9. package/agents/gsd-executor.md +78 -42
  10. package/agents/gsd-framework-selector.md +1 -3
  11. package/agents/gsd-intel-updater.md +1 -1
  12. package/agents/gsd-mempalace-curator.md +0 -1
  13. package/agents/gsd-pattern-mapper.md +11 -0
  14. package/agents/gsd-phase-researcher.md +3 -1
  15. package/agents/gsd-plan-checker.md +91 -112
  16. package/agents/gsd-planner.md +20 -4
  17. package/agents/gsd-project-researcher.md +1 -1
  18. package/agents/gsd-research-synthesizer.md +2 -2
  19. package/agents/gsd-roadmapper.md +15 -11
  20. package/agents/gsd-ui-checker.md +82 -7
  21. package/agents/gsd-ui-researcher.md +70 -3
  22. package/agents/gsd-verifier.md +24 -2
  23. package/bin/install.js +847 -200
  24. package/commands/gsd/discuss-phase.md +1 -1
  25. package/commands/gsd/execute-phase.md +1 -1
  26. package/commands/gsd/import.md +1 -1
  27. package/commands/gsd/ns-workflow.md +2 -1
  28. package/commands/gsd/phase.md +1 -1
  29. package/commands/gsd/quick-batch.md +105 -0
  30. package/commands/gsd/quick.md +8 -4
  31. package/commands/gsd/surface.md +18 -8
  32. package/gsd-core/bin/gsd-tools.cjs +761 -100
  33. package/gsd-core/bin/lib/active-workstream-store.cjs +8 -0
  34. package/gsd-core/bin/lib/adr-parser.cjs +13 -7
  35. package/gsd-core/bin/lib/agent-install-check.cjs +162 -0
  36. package/gsd-core/bin/lib/api-coverage.cjs +30 -9
  37. package/gsd-core/bin/lib/artifacts.cjs +2 -0
  38. package/gsd-core/bin/lib/assumption-delta.cjs +30 -11
  39. package/gsd-core/bin/lib/audit.cjs +163 -41
  40. package/gsd-core/bin/lib/broken-windows.cjs +306 -28
  41. package/gsd-core/bin/lib/capability-activation.cjs +27 -0
  42. package/gsd-core/bin/lib/capability-lock.cjs +10 -4
  43. package/gsd-core/bin/lib/capability-registry.cjs +785 -144
  44. package/gsd-core/bin/lib/capability-state.cjs +25 -4
  45. package/gsd-core/bin/lib/capability-validator.cjs +321 -18
  46. package/gsd-core/bin/lib/capability-writer.cjs +14 -4
  47. package/gsd-core/bin/lib/check-command-router.cjs +229 -6
  48. package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
  49. package/gsd-core/bin/lib/cli-exit.cjs +496 -10
  50. package/gsd-core/bin/lib/clusters.cjs +1 -0
  51. package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
  52. package/gsd-core/bin/lib/codex-agent-toml.cjs +410 -4
  53. package/gsd-core/bin/lib/command-aliases.cjs +16 -0
  54. package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
  55. package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
  56. package/gsd-core/bin/lib/commands.cjs +877 -54
  57. package/gsd-core/bin/lib/complexity-trigger.cjs +26 -6
  58. package/gsd-core/bin/lib/config-loader.cjs +121 -29
  59. package/gsd-core/bin/lib/config.cjs +92 -2
  60. package/gsd-core/bin/lib/configuration.cjs +129 -37
  61. package/gsd-core/bin/lib/core-utils.cjs +118 -14
  62. package/gsd-core/bin/lib/decisions.cjs +213 -1
  63. package/gsd-core/bin/lib/edge-probe.cjs +23 -2
  64. package/gsd-core/bin/lib/estimate-cli.cjs +55 -11
  65. package/gsd-core/bin/lib/exit-code-registry.cjs +98 -0
  66. package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
  67. package/gsd-core/bin/lib/frontmatter.cjs +975 -326
  68. package/gsd-core/bin/lib/gap-checker.cjs +41 -8
  69. package/gsd-core/bin/lib/git-base-branch.cjs +182 -39
  70. package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +7 -3
  71. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +8 -2
  72. package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +60 -14
  73. package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +75 -22
  74. package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +22 -8
  75. package/gsd-core/bin/lib/health-diagnostic.cjs +23 -3
  76. package/gsd-core/bin/lib/host-integration.cjs +96 -11
  77. package/gsd-core/bin/lib/init-command-router.cjs +132 -21
  78. package/gsd-core/bin/lib/init.cjs +252 -56
  79. package/gsd-core/bin/lib/install-engine.cjs +252 -15
  80. package/gsd-core/bin/lib/install-model-override-resolver.cjs +78 -1
  81. package/gsd-core/bin/lib/install-profiles.cjs +100 -18
  82. package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
  83. package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
  84. package/gsd-core/bin/lib/installer-migrations.cjs +10 -7
  85. package/gsd-core/bin/lib/intel.cjs +101 -26
  86. package/gsd-core/bin/lib/io.cjs +195 -15
  87. package/gsd-core/bin/lib/learnings.cjs +85 -14
  88. package/gsd-core/bin/lib/legacy-cleanup.cjs +8 -2
  89. package/gsd-core/bin/lib/loop-resolver.cjs +14 -8
  90. package/gsd-core/bin/lib/markdown-table.cjs +175 -4
  91. package/gsd-core/bin/lib/milestone.cjs +112 -7
  92. package/gsd-core/bin/lib/model-catalog.cjs +177 -19
  93. package/gsd-core/bin/lib/model-resolver.cjs +10 -28
  94. package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
  95. package/gsd-core/bin/lib/phase-command-router.cjs +13 -6
  96. package/gsd-core/bin/lib/phase-estimation.cjs +17 -8
  97. package/gsd-core/bin/lib/phase-id.cjs +321 -13
  98. package/gsd-core/bin/lib/phase-lifecycle.cjs +24 -16
  99. package/gsd-core/bin/lib/phase-locator.cjs +138 -17
  100. package/gsd-core/bin/lib/phase.cjs +1175 -115
  101. package/gsd-core/bin/lib/plan-document.cjs +273 -0
  102. package/gsd-core/bin/lib/plan-scan.cjs +13 -2
  103. package/gsd-core/bin/lib/planning-command-router.cjs +61 -0
  104. package/gsd-core/bin/lib/planning-inspect.cjs +1168 -0
  105. package/gsd-core/bin/lib/planning-snapshot.cjs +165 -34
  106. package/gsd-core/bin/lib/planning-workspace.cjs +159 -28
  107. package/gsd-core/bin/lib/probe-core.cjs +4 -1
  108. package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +50 -7
  109. package/gsd-core/bin/lib/profile-pipeline.cjs +6 -3
  110. package/gsd-core/bin/lib/quick-batch-command-router.cjs +285 -0
  111. package/gsd-core/bin/lib/quick-batch-dispatch.cjs +250 -0
  112. package/gsd-core/bin/lib/quick-batch.cjs +840 -0
  113. package/gsd-core/bin/lib/real-home-guard.cjs +419 -0
  114. package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +71 -45
  115. package/gsd-core/bin/lib/review-lane-descriptor.cjs +62 -14
  116. package/gsd-core/bin/lib/review-lane-invocation.cjs +73 -1
  117. package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
  118. package/gsd-core/bin/lib/roadmap-command-router.cjs +45 -31
  119. package/gsd-core/bin/lib/roadmap-parser.cjs +577 -41
  120. package/gsd-core/bin/lib/roadmap.cjs +248 -64
  121. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +329 -41
  122. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +16 -17
  123. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +320 -109
  124. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +487 -83
  125. package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
  126. package/gsd-core/bin/lib/runtime-slash.cjs +72 -2
  127. package/gsd-core/bin/lib/shell-command-projection.cjs +75 -8
  128. package/gsd-core/bin/lib/smart-entry.cjs +19 -31
  129. package/gsd-core/bin/lib/spec-section.cjs +12 -7
  130. package/gsd-core/bin/lib/state-command-router.cjs +47 -18
  131. package/gsd-core/bin/lib/state-contract.cjs +359 -0
  132. package/gsd-core/bin/lib/state-document.cjs +216 -5
  133. package/gsd-core/bin/lib/state-md-schema.cjs +231 -0
  134. package/gsd-core/bin/lib/state-transition.cjs +850 -145
  135. package/gsd-core/bin/lib/state.cjs +1629 -287
  136. package/gsd-core/bin/lib/surface.cjs +33 -10
  137. package/gsd-core/bin/lib/task-command-router.cjs +111 -1
  138. package/gsd-core/bin/lib/task-content-resolution.cjs +368 -0
  139. package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
  140. package/gsd-core/bin/lib/teams-status.cjs +4 -1
  141. package/gsd-core/bin/lib/uat-predicate.cjs +58 -20
  142. package/gsd-core/bin/lib/uat.cjs +2542 -387
  143. package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
  144. package/gsd-core/bin/lib/ui-safety-gate.cjs +37 -7
  145. package/gsd-core/bin/lib/unusable-input.cjs +13 -0
  146. package/gsd-core/bin/lib/update-context.cjs +6 -2
  147. package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
  148. package/gsd-core/bin/lib/validate.cjs +230 -12
  149. package/gsd-core/bin/lib/vendor/README.md +43 -5
  150. package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
  151. package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
  152. package/gsd-core/bin/lib/verification.cjs +287 -13
  153. package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
  154. package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
  155. package/gsd-core/bin/lib/verify.cjs +441 -56
  156. package/gsd-core/bin/lib/workstream-inventory.cjs +20 -2
  157. package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
  158. package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
  159. package/gsd-core/bin/lib/worktree-safety.cjs +185 -21
  160. package/gsd-core/bin/shared/config-defaults.manifest.json +7 -1
  161. package/gsd-core/bin/shared/config-schema.manifest.json +13 -0
  162. package/gsd-core/bin/shared/exit-codes.json +8 -0
  163. package/gsd-core/bin/shared/exit-codes.sh +20 -0
  164. package/gsd-core/bin/shared/model-catalog.json +8 -1
  165. package/gsd-core/bin/verify-reapply-patches.cjs +70 -3
  166. package/gsd-core/references/agent-contracts.md +6 -5
  167. package/gsd-core/references/api-coverage.md +24 -2
  168. package/gsd-core/references/autonomous-smart-discuss.md +3 -3
  169. package/gsd-core/references/checkpoints.md +37 -19
  170. package/gsd-core/references/decimal-phase-calculation.md +5 -5
  171. package/gsd-core/references/edge-probe.md +17 -5
  172. package/gsd-core/references/execute-mvp-tdd.md +18 -18
  173. package/gsd-core/references/execute-phase-between-wave-reset.md +9 -12
  174. package/gsd-core/references/execute-phase-response-language.md +6 -0
  175. package/gsd-core/references/execute-phase-wave-guard.md +11 -9
  176. package/gsd-core/references/executor-examples.md +42 -0
  177. package/gsd-core/references/failing-direction.md +78 -0
  178. package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
  179. package/gsd-core/references/gate-prompts.md +1 -1
  180. package/gsd-core/references/git-integration.md +5 -5
  181. package/gsd-core/references/git-planning-commit.md +3 -3
  182. package/gsd-core/references/gsd-run-resolver.md +1 -1
  183. package/gsd-core/references/loop-hook-dispatch.md +22 -0
  184. package/gsd-core/references/model-profiles.md +1 -1
  185. package/gsd-core/references/mvp-concepts.md +2 -2
  186. package/gsd-core/references/nyquist-compliance.md +74 -0
  187. package/gsd-core/references/offer-next.md +3 -5
  188. package/gsd-core/references/phase-argument-parsing.md +3 -3
  189. package/gsd-core/references/plan-checker-examples.md +41 -0
  190. package/gsd-core/references/planner-antipatterns.md +25 -0
  191. package/gsd-core/references/planner-chunked.md +5 -1
  192. package/gsd-core/references/planner-coupling.md +42 -0
  193. package/gsd-core/references/planner-failing-direction.md +53 -0
  194. package/gsd-core/references/planner-human-verify-mode.md +15 -1
  195. package/gsd-core/references/planner-quick-batch.md +71 -0
  196. package/gsd-core/references/planner-reviews.md +47 -0
  197. package/gsd-core/references/planner-revision.md +76 -3
  198. package/gsd-core/references/planner-verify-command-grounding.md +17 -0
  199. package/gsd-core/references/planning-config.md +39 -9
  200. package/gsd-core/references/response-language-directive.md +9 -0
  201. package/gsd-core/references/reviewer-instances.md +31 -0
  202. package/gsd-core/references/revision-loop.md +118 -11
  203. package/gsd-core/references/runtime-aware-dispatch.md +1 -1
  204. package/gsd-core/references/tdd.md +15 -12
  205. package/gsd-core/references/ui-brand.md +65 -21
  206. package/gsd-core/references/ui-consideration-probe.md +1 -1
  207. package/gsd-core/references/universal-anti-patterns.md +2 -2
  208. package/gsd-core/references/verifier-evidence-gate.md +160 -0
  209. package/gsd-core/references/verify-command-path-resolvability.md +42 -0
  210. package/gsd-core/references/verify-mvp-mode.md +1 -1
  211. package/gsd-core/references/workstream-flag.md +11 -11
  212. package/gsd-core/templates/README.md +1 -1
  213. package/gsd-core/templates/SECURITY.md +3 -3
  214. package/gsd-core/templates/UI-SPEC.md +25 -3
  215. package/gsd-core/templates/VALIDATION.md +3 -3
  216. package/gsd-core/templates/phase-prompt.md +7 -0
  217. package/gsd-core/templates/state.md +7 -0
  218. package/gsd-core/templates/verification-report.md +5 -0
  219. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
  220. package/gsd-core/workflows/add-backlog.md +3 -1
  221. package/gsd-core/workflows/add-phase.md +5 -3
  222. package/gsd-core/workflows/add-tests.md +4 -9
  223. package/gsd-core/workflows/add-todo.md +2 -2
  224. package/gsd-core/workflows/ai-integration-phase.md +5 -10
  225. package/gsd-core/workflows/analyze-dependencies.md +2 -0
  226. package/gsd-core/workflows/audit-fix.md +14 -3
  227. package/gsd-core/workflows/audit-milestone.md +11 -9
  228. package/gsd-core/workflows/audit-uat.md +19 -2
  229. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
  230. package/gsd-core/workflows/autonomous.md +12 -26
  231. package/gsd-core/workflows/check-todos.md +2 -2
  232. package/gsd-core/workflows/cleanup.md +3 -3
  233. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +16 -14
  234. package/gsd-core/workflows/code-review-fix.md +3 -1
  235. package/gsd-core/workflows/code-review.md +192 -69
  236. package/gsd-core/workflows/complete-milestone.md +28 -14
  237. package/gsd-core/workflows/debug.md +6 -4
  238. package/gsd-core/workflows/diagnose-issues.md +17 -7
  239. package/gsd-core/workflows/discuss-phase/modes/advisor.md +3 -1
  240. package/gsd-core/workflows/discuss-phase/modes/all.md +2 -0
  241. package/gsd-core/workflows/discuss-phase/modes/analyze.md +2 -0
  242. package/gsd-core/workflows/discuss-phase/modes/auto.md +2 -0
  243. package/gsd-core/workflows/discuss-phase/modes/batch.md +2 -0
  244. package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -7
  245. package/gsd-core/workflows/discuss-phase/modes/default.md +2 -0
  246. package/gsd-core/workflows/discuss-phase/modes/power.md +2 -0
  247. package/gsd-core/workflows/discuss-phase/modes/text.md +3 -1
  248. package/gsd-core/workflows/discuss-phase/templates/context.md +2 -0
  249. package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +2 -0
  250. package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +1 -3
  251. package/gsd-core/workflows/discuss-phase-assumptions.md +3 -3
  252. package/gsd-core/workflows/discuss-phase-power.md +2 -0
  253. package/gsd-core/workflows/discuss-phase.md +2 -2
  254. package/gsd-core/workflows/do.md +46 -19
  255. package/gsd-core/workflows/docs-update.md +6 -5
  256. package/gsd-core/workflows/edit-phase.md +3 -1
  257. package/gsd-core/workflows/eval-review.md +5 -10
  258. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +3 -1
  259. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +129 -11
  260. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
  261. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
  262. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
  263. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +29 -5
  264. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +2 -2
  265. package/gsd-core/workflows/execute-phase/steps/protected-branch.md +21 -0
  266. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +4 -2
  267. package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
  268. package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
  269. package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
  270. package/gsd-core/workflows/execute-phase.md +68 -66
  271. package/gsd-core/workflows/execute-plan.md +25 -20
  272. package/gsd-core/workflows/explore.md +3 -1
  273. package/gsd-core/workflows/extract-learnings.md +3 -1
  274. package/gsd-core/workflows/fast.md +8 -2
  275. package/gsd-core/workflows/forensics.md +3 -1
  276. package/gsd-core/workflows/graduation.md +6 -6
  277. package/gsd-core/workflows/health.md +4 -7
  278. package/gsd-core/workflows/help/modes/brief.md +2 -0
  279. package/gsd-core/workflows/help/modes/default.md +2 -0
  280. package/gsd-core/workflows/help/modes/full.md +12 -0
  281. package/gsd-core/workflows/help/modes/topic.md +2 -0
  282. package/gsd-core/workflows/help.md +2 -0
  283. package/gsd-core/workflows/import.md +17 -14
  284. package/gsd-core/workflows/inbox.md +5 -6
  285. package/gsd-core/workflows/ingest-docs.md +45 -12
  286. package/gsd-core/workflows/insert-phase.md +7 -5
  287. package/gsd-core/workflows/list-phase-assumptions.md +2 -0
  288. package/gsd-core/workflows/list-seeds.md +7 -3
  289. package/gsd-core/workflows/list-workspaces.md +3 -1
  290. package/gsd-core/workflows/manager.md +15 -26
  291. package/gsd-core/workflows/map-codebase.md +3 -1
  292. package/gsd-core/workflows/milestone-summary.md +3 -1
  293. package/gsd-core/workflows/mvp-phase.md +3 -3
  294. package/gsd-core/workflows/new-milestone.md +10 -22
  295. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
  296. package/gsd-core/workflows/new-project.md +17 -29
  297. package/gsd-core/workflows/new-workspace.md +2 -2
  298. package/gsd-core/workflows/next.md +4 -2
  299. package/gsd-core/workflows/node-repair.md +2 -0
  300. package/gsd-core/workflows/note.md +2 -0
  301. package/gsd-core/workflows/onboard.md +1 -1
  302. package/gsd-core/workflows/pause-work.md +20 -5
  303. package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +1 -1
  304. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
  305. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +4 -4
  306. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +12 -3
  307. package/gsd-core/workflows/plan-phase.md +251 -54
  308. package/gsd-core/workflows/plan-review-convergence.md +148 -19
  309. package/gsd-core/workflows/plant-seed.md +3 -3
  310. package/gsd-core/workflows/pr-branch.md +195 -51
  311. package/gsd-core/workflows/profile-user.md +17 -15
  312. package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
  313. package/gsd-core/workflows/progress.md +52 -15
  314. package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
  315. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +38 -5
  316. package/gsd-core/workflows/quick/steps/quick-verification.md +2 -4
  317. package/gsd-core/workflows/quick/steps/research-phase.md +5 -7
  318. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
  319. package/gsd-core/workflows/quick-batch/steps/batch-init.md +55 -0
  320. package/gsd-core/workflows/quick-batch/steps/completion.md +65 -0
  321. package/gsd-core/workflows/quick-batch/steps/merge-wave.md +100 -0
  322. package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +147 -0
  323. package/gsd-core/workflows/quick-batch/steps/planner-wave.md +158 -0
  324. package/gsd-core/workflows/quick-batch/steps/research-phase.md +95 -0
  325. package/gsd-core/workflows/quick-batch/steps/resume-mode.md +49 -0
  326. package/gsd-core/workflows/quick-batch/steps/verification-wave.md +73 -0
  327. package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +169 -0
  328. package/gsd-core/workflows/quick-batch.md +203 -0
  329. package/gsd-core/workflows/quick.md +33 -32
  330. package/gsd-core/workflows/reapply-patches.md +2 -0
  331. package/gsd-core/workflows/remove-phase.md +6 -4
  332. package/gsd-core/workflows/remove-workspace.md +3 -3
  333. package/gsd-core/workflows/resume-project.md +14 -14
  334. package/gsd-core/workflows/review.md +404 -21
  335. package/gsd-core/workflows/scan.md +3 -1
  336. package/gsd-core/workflows/section-manifest.json +12 -0
  337. package/gsd-core/workflows/secure-phase.md +3 -3
  338. package/gsd-core/workflows/session-report.md +2 -0
  339. package/gsd-core/workflows/settings-advanced.md +9 -9
  340. package/gsd-core/workflows/settings-integrations.md +66 -32
  341. package/gsd-core/workflows/settings.md +4 -6
  342. package/gsd-core/workflows/ship.md +22 -16
  343. package/gsd-core/workflows/sketch-wrap-up.md +13 -17
  344. package/gsd-core/workflows/sketch.md +13 -19
  345. package/gsd-core/workflows/smart-entry.md +4 -6
  346. package/gsd-core/workflows/spec-phase.md +31 -4
  347. package/gsd-core/workflows/spike-wrap-up.md +9 -11
  348. package/gsd-core/workflows/spike.md +21 -32
  349. package/gsd-core/workflows/stats.md +4 -2
  350. package/gsd-core/workflows/sync-skills.md +13 -5
  351. package/gsd-core/workflows/thread.md +13 -7
  352. package/gsd-core/workflows/transition.md +7 -5
  353. package/gsd-core/workflows/ui-phase.md +36 -21
  354. package/gsd-core/workflows/ui-review.md +7 -11
  355. package/gsd-core/workflows/ultraplan-phase.md +7 -13
  356. package/gsd-core/workflows/undo.md +9 -17
  357. package/gsd-core/workflows/update.md +47 -48
  358. package/gsd-core/workflows/validate-phase.md +3 -3
  359. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +25 -1
  360. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
  361. package/gsd-core/workflows/verify-work.md +106 -21
  362. package/hooks/dist/gsd-agent-isolation-guard.js +77 -38
  363. package/hooks/dist/gsd-check-update-worker.js +19 -2
  364. package/hooks/dist/gsd-config-reload.js +18 -12
  365. package/hooks/dist/gsd-context-monitor.js +302 -22
  366. package/hooks/dist/gsd-cursor-post-tool.js +3 -1
  367. package/hooks/dist/gsd-cursor-pre-tool.js +3 -1
  368. package/hooks/dist/gsd-cursor-session-start.js +2 -1
  369. package/hooks/dist/gsd-cursor-stop.js +2 -1
  370. package/hooks/dist/gsd-cursor-subagent-start.js +28 -23
  371. package/hooks/dist/gsd-cursor-subagent-stop.js +3 -1
  372. package/hooks/dist/gsd-ensure-canonical-path.js +2 -1
  373. package/hooks/dist/gsd-graphify-update.sh +22 -18
  374. package/hooks/dist/gsd-node-runner.sh +77 -0
  375. package/hooks/dist/gsd-phase-boundary.sh +1 -0
  376. package/hooks/dist/gsd-prompt-guard.js +46 -12
  377. package/hooks/dist/gsd-read-guard.js +18 -7
  378. package/hooks/dist/gsd-read-injection-scanner.js +22 -13
  379. package/hooks/dist/gsd-secret-read-guard.js +1079 -0
  380. package/hooks/dist/gsd-session-state.sh +1 -0
  381. package/hooks/dist/gsd-statusline.js +222 -29
  382. package/hooks/dist/gsd-validate-commit.sh +523 -12
  383. package/hooks/dist/gsd-windsurf-pre-command.js +16 -11
  384. package/hooks/dist/gsd-windsurf-pre-write.js +22 -13
  385. package/hooks/dist/gsd-workflow-guard.js +36 -17
  386. package/hooks/dist/gsd-worktree-path-guard.js +36 -21
  387. package/hooks/dist/gsd-write-guard.js +35 -25
  388. package/hooks/dist/lib/cli-exit.js +560 -0
  389. package/hooks/dist/lib/exit-code-registry.js +98 -0
  390. package/hooks/dist/lib/git-cmd.js +210 -1
  391. package/hooks/dist/lib/git-probe.js +84 -0
  392. package/hooks/dist/lib/hook-exit.js +81 -0
  393. package/hooks/dist/lib/injection-patterns.js +36 -6
  394. package/hooks/dist/managed-hooks-registry.cjs +4 -0
  395. package/hooks/gsd-agent-isolation-guard.js +77 -38
  396. package/hooks/gsd-check-update-worker.js +19 -2
  397. package/hooks/gsd-config-reload.js +18 -12
  398. package/hooks/gsd-context-monitor.js +302 -22
  399. package/hooks/gsd-cursor-post-tool.js +3 -1
  400. package/hooks/gsd-cursor-pre-tool.js +3 -1
  401. package/hooks/gsd-cursor-session-start.js +2 -1
  402. package/hooks/gsd-cursor-stop.js +2 -1
  403. package/hooks/gsd-cursor-subagent-start.js +28 -23
  404. package/hooks/gsd-cursor-subagent-stop.js +3 -1
  405. package/hooks/gsd-ensure-canonical-path.js +2 -1
  406. package/hooks/gsd-graphify-update.sh +22 -18
  407. package/hooks/gsd-node-runner.sh +77 -0
  408. package/hooks/gsd-phase-boundary.sh +1 -0
  409. package/hooks/gsd-prompt-guard.js +46 -12
  410. package/hooks/gsd-read-guard.js +18 -7
  411. package/hooks/gsd-read-injection-scanner.js +22 -13
  412. package/hooks/gsd-secret-read-guard.js +1079 -0
  413. package/hooks/gsd-session-state.sh +1 -0
  414. package/hooks/gsd-statusline.js +222 -29
  415. package/hooks/gsd-validate-commit.sh +523 -12
  416. package/hooks/gsd-windsurf-pre-command.js +16 -11
  417. package/hooks/gsd-windsurf-pre-write.js +22 -13
  418. package/hooks/gsd-workflow-guard.js +36 -17
  419. package/hooks/gsd-worktree-path-guard.js +36 -21
  420. package/hooks/gsd-write-guard.js +35 -25
  421. package/hooks/hooks.json +6 -0
  422. package/hooks/lib/cli-exit.js +560 -0
  423. package/hooks/lib/exit-code-registry.js +98 -0
  424. package/hooks/lib/git-cmd.js +210 -1
  425. package/hooks/lib/git-probe.js +84 -0
  426. package/hooks/lib/hook-exit.js +81 -0
  427. package/hooks/lib/injection-patterns.js +36 -6
  428. package/hooks/managed-hooks-registry.cjs +4 -0
  429. package/package.json +14 -9
  430. package/scripts/base64-scan.sh +74 -12
  431. package/scripts/build-hooks.js +12 -0
  432. package/scripts/check-glossary-refs.cjs +77 -15
  433. package/scripts/check-mutation-score-ratchet.cjs +156 -0
  434. package/scripts/ci-check-job-near-cap.cjs +49 -0
  435. package/scripts/ci-pr-mergeability.cjs +262 -0
  436. package/scripts/ci-test-scope.cjs +52 -12
  437. package/scripts/ci-timeout-report.cjs +230 -0
  438. package/scripts/docs-guard-registry.cjs +406 -0
  439. package/scripts/gen-capability-registry.cjs +8 -6
  440. package/scripts/gen-exit-code-docs.cjs +318 -0
  441. package/scripts/gen-exit-code-registry.cjs +891 -0
  442. package/scripts/gen-features.cjs +836 -0
  443. package/scripts/gen-hooks-cli-exit.cjs +239 -0
  444. package/scripts/gen-install-tree-fixtures.cjs +2 -2
  445. package/scripts/gen-loop-host-contract.cjs +189 -4
  446. package/scripts/gen-scripts-cli-exit.cjs +185 -0
  447. package/scripts/gen-state-md-docs.cjs +727 -0
  448. package/scripts/{test-failure-reasons.cjs → gsd-test-gate-reasons.cjs} +6 -0
  449. package/scripts/lib/ci-job-timing.cjs +72 -0
  450. package/scripts/lib/cli-exit.cjs +546 -44
  451. package/scripts/lib/drift-scan.cjs +32 -2
  452. package/scripts/lib/exit-code-registry.cjs +98 -0
  453. package/scripts/lib/ndjson-reporter.cjs +119 -0
  454. package/scripts/lib/shellcheck-fetch.cjs +247 -0
  455. package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -6
  456. package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
  457. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
  458. package/scripts/lint-docs-guard-registration.cjs +495 -0
  459. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +198 -0
  460. package/scripts/lint-eslint-glob-coverage.allowlist.json +4 -0
  461. package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
  462. package/scripts/lint-health-diagnostic-rule-table.cjs +65 -8
  463. package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
  464. package/scripts/lint-phase-enumeration-drift.cjs +45 -14
  465. package/scripts/lint-phase-id-drift.cjs +133 -8
  466. package/scripts/lint-planning-prompt-drift.cjs +38 -1
  467. package/scripts/lint-portable-grep.cjs +176 -0
  468. package/scripts/lint-removed-but-needed.cjs +184 -16
  469. package/scripts/lint-response-language-coverage.cjs +524 -0
  470. package/scripts/lint-seam-enforcement.cjs +182 -0
  471. package/scripts/lint-slug-derivation-drift.cjs +921 -0
  472. package/scripts/lint-source-test-name-collision.cjs +241 -0
  473. package/scripts/lint-state-write-path-drift.cjs +337 -432
  474. package/scripts/lint-test-file-count.allowlist.json +124 -4
  475. package/scripts/lint-test-file-count.cjs +25 -3
  476. package/scripts/lint-unreachable-guard-drift.cjs +51 -64
  477. package/scripts/lint-vendored-deps.cjs +208 -35
  478. package/scripts/lint-workflow-shellcheck-baseline.json +1027 -0
  479. package/scripts/lint-workflow-shellcheck.cjs +614 -0
  480. package/scripts/mutation-matrix.cjs +599 -50
  481. package/scripts/npm-audit-baseline.cjs +376 -0
  482. package/scripts/prompt-injection-scan.sh +83 -14
  483. package/scripts/require-issue-link-policy.cjs +16 -1
  484. package/scripts/secret-scan.sh +75 -13
  485. package/scripts/select-docs-guards.cjs +56 -0
  486. package/scripts/sync-runtime-launcher.cjs +22 -3
  487. package/skills/gsd-discuss-phase/SKILL.md +1 -1
  488. package/skills/gsd-execute-phase/SKILL.md +1 -1
  489. package/skills/gsd-import/SKILL.md +1 -1
  490. package/skills/gsd-ns-workflow/SKILL.md +1 -0
  491. package/skills/gsd-phase/SKILL.md +1 -1
  492. package/skills/gsd-quick/SKILL.md +8 -4
  493. package/skills/gsd-quick-batch/SKILL.md +105 -0
  494. package/skills/gsd-surface/SKILL.md +18 -8
  495. package/vscode/package.json +1 -1
  496. package/bin/lib/ui-safety-gate.cjs +0 -109
  497. package/scripts/lint-emitted-drift-ack.cjs +0 -344
  498. package/scripts/state-write-path-drift-baseline.json +0 -19
@@ -31,7 +31,7 @@ const ui_safety_gate_cjs_1 = require("./ui-safety-gate.cjs");
31
31
  const ui_frontend_evidence_cjs_1 = require("./ui-frontend-evidence.cjs");
32
32
  // eslint-disable-next-line @typescript-eslint/no-require-imports
33
33
  const verifyModule = require("./verify.cjs");
34
- const { cmdVerifySchemaDrift, cmdVerifyCodebaseDrift } = verifyModule;
34
+ const { cmdVerifySchemaDrift, cmdVerifyCodebaseDrift, cmdVerifyContextDrift } = verifyModule;
35
35
  // eslint-disable-next-line @typescript-eslint/no-require-imports
36
36
  const roadmapModule = require("./roadmap.cjs");
37
37
  const { getRoadmapPhaseWithFallback } = roadmapModule;
@@ -39,6 +39,7 @@ const { getRoadmapPhaseWithFallback } = roadmapModule;
39
39
  const gapCheckerModule = require("./gap-checker.cjs");
40
40
  const { runGapAnalysis } = gapCheckerModule;
41
41
  const prohibition_enforcement_cjs_1 = require("./prohibition-enforcement.cjs");
42
+ const tdd_red_evidence_cjs_1 = require("./tdd-red-evidence.cjs");
42
43
  // eslint-disable-next-line @typescript-eslint/no-require-imports
43
44
  const gatePredicateEval = require("./gate-predicate-evaluator.cjs");
44
45
  const { evaluatePredicate } = gatePredicateEval;
@@ -52,6 +53,9 @@ const { scanPhasePlans } = planScanMod;
52
53
  // eslint-disable-next-line @typescript-eslint/no-require-imports
53
54
  const planningScopeMod = require("./planning-scope.cjs");
54
55
  const { SCOPE } = planningScopeMod;
56
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
57
+ const verifyCommandGroundingMod = require("./verify-command-grounding.cjs");
58
+ const { probePhaseVerifyCommands, probePhaseFailingDirections } = verifyCommandGroundingMod;
55
59
  // ─── Helpers ──────────────────────────────────────────────────────────────────
56
60
  function normalizePhrase(text) {
57
61
  // eslint-disable-next-line @typescript-eslint/no-base-to-string
@@ -783,14 +787,11 @@ function cmdTddReviewCheckpoint(projectDir, args, raw) {
783
787
  }
784
788
  const violations = rows.filter(r => r.status === 'FAIL').length;
785
789
  // Build review table
786
- const sep = '━'.repeat(53);
787
790
  const tableHeader = '| Plan | RED | GREEN | REFACTOR | Status |';
788
791
  const tableDivider = '|------|-----|-------|----------|--------|';
789
792
  const tableRows = rows.map(r => `| ${r.planId.padEnd(4)} | ${r.red ? ' ✓ ' : ' ✗ '} | ${r.green ? ' ✓ ' : ' ✗ '} | ${r.refactor ? ' ✓ ' : ' — '} | ${r.status.padEnd(6)} |`);
790
793
  let table = [
791
- sep,
792
- ` TDD REVIEW — Phase ${phase}`,
793
- sep,
794
+ `### TDD REVIEW — Phase ${phase}`,
794
795
  '',
795
796
  `TDD Plans: ${tddPlanFiles.length} | Gate violations: ${violations}`,
796
797
  '',
@@ -825,6 +826,179 @@ function cmdTddReviewCheckpoint(projectDir, args, raw) {
825
826
  // the host-loop dispatch's advisory branch can surface it.
826
827
  output(result, raw, undefined);
827
828
  }
829
+ // ─── tdd-red-evidence (#3770) ──────────────────────────────────────────────────
830
+ /**
831
+ * tdd-red-evidence: validates a persisted RED-phase test-run record for a
832
+ * `type: tdd` plan (#3770). Only an INTENTIONAL failure of the target test
833
+ * (verdict RED_EVIDENCE_OK) may authorize GREEN; zero-test discovery, fixture/
834
+ * load crashes, nonzero exits without a failing test, unrelated failures, and
835
+ * unexpected greens are INVALID_RED and block GREEN.
836
+ *
837
+ * The record is the JSON the executor persists after running the RED command:
838
+ * { command, exitCode, output, targetTest, targetFile?, expected?, actual? }
839
+ * Fail-closed: a missing/unreadable/unparseable record is INVALID_RED
840
+ * (reason unreadable_record), never a pass.
841
+ *
842
+ * Args: check tdd-red-evidence <record.json>
843
+ */
844
+ function cmdTddRedEvidence(_projectDir, args, raw) {
845
+ const recordPath = typeof args[2] === 'string' ? args[2] : '';
846
+ if (!recordPath) {
847
+ error('tdd-red-evidence requires a record path: check tdd-red-evidence <record.json>', ERROR_REASON.SDK_MISSING_ARG);
848
+ return;
849
+ }
850
+ const resolved = node_path_1.default.resolve(recordPath);
851
+ const text = readIfExists(resolved);
852
+ const input = (() => {
853
+ if (!text)
854
+ return null;
855
+ try {
856
+ return (JSON.parse(text) ?? {});
857
+ }
858
+ catch {
859
+ return null;
860
+ }
861
+ })();
862
+ if (!input) {
863
+ output({
864
+ passed: false,
865
+ block: true,
866
+ verdict: 'INVALID_RED',
867
+ reason: 'unreadable_record',
868
+ record: resolved,
869
+ readError: text ? `record is not valid JSON: ${resolved}` : `record not found or unreadable: ${resolved}`,
870
+ }, raw, undefined);
871
+ return;
872
+ }
873
+ const evidenceInput = {
874
+ command: input['command'],
875
+ exitCode: input['exitCode'],
876
+ output: input['output'],
877
+ targetTest: input['targetTest'],
878
+ targetFile: input['targetFile'],
879
+ expected: input['expected'],
880
+ actual: input['actual'],
881
+ };
882
+ const result = (0, tdd_red_evidence_cjs_1.classifyRedEvidence)(evidenceInput);
883
+ const record = (0, tdd_red_evidence_cjs_1.buildRedEvidenceRecord)(evidenceInput, result);
884
+ output({
885
+ // Uniform gate contract: block = !passed. INVALID_RED blocks GREEN.
886
+ passed: result.verdict === 'RED_EVIDENCE_OK',
887
+ block: result.verdict !== 'RED_EVIDENCE_OK',
888
+ verdict: result.verdict,
889
+ reason: result.reason,
890
+ evidence: result.evidence,
891
+ record,
892
+ message: result.verdict === 'RED_EVIDENCE_OK'
893
+ ? `RED evidence verified: target test "${result.evidence.target_test}" failed as expected (exit ${result.evidence.exit_code}). GREEN authorized.`
894
+ : `INVALID_RED (${result.reason}): GREEN blocked. Fix the RED phase — only an intentional failure of target test "${result.evidence.target_test}" authorizes production edits.`,
895
+ }, raw, undefined);
896
+ }
897
+ /**
898
+ * Resolve a phase argument to an absolute phase directory, or '' when it
899
+ * cannot be resolved. Shared by every `check` arm that probes a phase's
900
+ * PLAN.md files, so the two never drift (DEFECT.GENERATIVE-FIX-DIVERGENCE).
901
+ * Never throws — the callers emit a degraded JSON payload instead, because
902
+ * a consumer must be able to tell "nothing to report" from "could not look".
903
+ */
904
+ function resolvePhaseDirOrEmpty(projectDir, phase) {
905
+ try {
906
+ const result = findPhaseInternal(projectDir, phase);
907
+ if (result && typeof result === 'object') {
908
+ // findPhaseInternal returns { directory: '<relative-posix-path>', ... }
909
+ // directory is relative to cwd — resolve it to absolute.
910
+ const relDir = typeof result['directory'] === 'string' ? result['directory'] : '';
911
+ if (relDir) {
912
+ return node_path_1.default.resolve(projectDir, relDir);
913
+ }
914
+ }
915
+ else if (typeof result === 'string') {
916
+ return result;
917
+ }
918
+ }
919
+ catch { /* phase dir lookup failure → caller emits degraded payload */ }
920
+ return '';
921
+ }
922
+ // ─── verify-command-paths (#2401) ──────────────────────────────────────────────
923
+ /**
924
+ * verify-command-paths: probes every `<automated>` verify command declared in a
925
+ * phase's `-PLAN.md` files against the filesystem WITHOUT executing anything —
926
+ * see verify-command-grounding.cjs for the recognizer contract.
927
+ *
928
+ * Args: check verify-command-paths <phase>
929
+ * Invocable as: gsd_run check verify-command-paths <phase>
930
+ *
931
+ * When the phase cannot be resolved to a directory, this emits a non-throwing
932
+ * degraded JSON payload (status/commands/counts all zeroed, `readError`
933
+ * populated) rather than calling `error()` — the plan-checker parses this
934
+ * result and must be able to distinguish "nothing to report" from "could not
935
+ * look", which a non-zero exit / thrown error would collapse.
936
+ */
937
+ function cmdVerifyCommandPaths(projectDir, args, raw) {
938
+ // args[0] = 'check', args[1] = 'verify-command-paths', args[2] = phase
939
+ const phase = args[2] || '';
940
+ if (!phase) {
941
+ output({
942
+ status: 'unresolvable',
943
+ commands: [],
944
+ counts: { blocker: 0, warning: 0, total: 0 },
945
+ readError: 'verify-command-paths requires a phase argument: check verify-command-paths <phase>',
946
+ }, raw, undefined);
947
+ return;
948
+ }
949
+ const phaseDir = resolvePhaseDirOrEmpty(projectDir, phase);
950
+ if (!phaseDir) {
951
+ output({
952
+ status: 'unresolvable',
953
+ commands: [],
954
+ counts: { blocker: 0, warning: 0, total: 0 },
955
+ readError: `could not resolve phase directory for phase ${phase}`,
956
+ }, raw, undefined);
957
+ return;
958
+ }
959
+ const probed = probePhaseVerifyCommands({ phaseDir, projectRoot: projectDir });
960
+ output(probed, raw, undefined);
961
+ }
962
+ // ─── verify-failure-directions (#3172) ─────────────────────────────────────────
963
+ /**
964
+ * verify-failure-directions: probes every `<automated>` verify command
965
+ * declared in a phase's `-PLAN.md` files for a stated `<fails_when>` failing
966
+ * direction — see verify-command-grounding.cjs for the recognizer contract.
967
+ *
968
+ * Args: check verify-failure-directions <phase>
969
+ * Invocable as: gsd_run check verify-failure-directions <phase>
970
+ *
971
+ * When the phase cannot be resolved to a directory, this emits a non-throwing
972
+ * degraded JSON payload (status/commands/counts all zeroed, `readError`
973
+ * populated) rather than calling `error()` — the plan-checker parses this
974
+ * result and must be able to distinguish "nothing to report" from "could not
975
+ * look", which a non-zero exit / thrown error would collapse.
976
+ */
977
+ function cmdVerifyFailureDirections(projectDir, args, raw) {
978
+ // args[0] = 'check', args[1] = 'verify-failure-directions', args[2] = phase
979
+ const phase = args[2] || '';
980
+ if (!phase) {
981
+ output({
982
+ status: 'unresolvable',
983
+ commands: [],
984
+ counts: { blocker: 0, warning: 0, total: 0 },
985
+ readError: 'verify-failure-directions requires a phase argument: check verify-failure-directions <phase>',
986
+ }, raw, undefined);
987
+ return;
988
+ }
989
+ const phaseDir = resolvePhaseDirOrEmpty(projectDir, phase);
990
+ if (!phaseDir) {
991
+ output({
992
+ status: 'unresolvable',
993
+ commands: [],
994
+ counts: { blocker: 0, warning: 0, total: 0 },
995
+ readError: `could not resolve phase directory for phase ${phase}`,
996
+ }, raw, undefined);
997
+ return;
998
+ }
999
+ const result = probePhaseFailingDirections({ phaseDir });
1000
+ output(result, raw, undefined);
1001
+ }
828
1002
  // ─── gap-analysis-plan-post ───────────────────────────────────────────────────
829
1003
  /**
830
1004
  * gap-analysis-plan-post: non-blocking advisory check that runs the post-planning
@@ -1203,6 +1377,27 @@ function cmdApiCoverageVerifyPre(projectDir, args, raw) {
1203
1377
  }, raw, undefined);
1204
1378
  return;
1205
1379
  }
1380
+ // An EMPTY scope is not a negative verdict. This gate's neighbouring arms
1381
+ // already fail closed (unresolvable phase → block; unreadable plan → block),
1382
+ // but a phase with no plan body AND no roadmap section fell through to
1383
+ // detection over zero bytes and CERTIFIED "no external-API integration" —
1384
+ // clearing a blocking seal gate on a probe that examined nothing
1385
+ // (ADR-3889 failure class (c), #3909). The discriminator is BYTES EXAMINED,
1386
+ // never SIGNALS FOUND: a phase with real plans and no API vocabulary still
1387
+ // reaches the pass below unchanged.
1388
+ if (scope.text.trim() === '') {
1389
+ output({
1390
+ block: true,
1391
+ passed: false,
1392
+ coverage_present: false,
1393
+ detected: false,
1394
+ scope_unavailable: true,
1395
+ message: 'api-coverage: the phase scope is empty — no plan body and no roadmap section were ' +
1396
+ 'found, so nothing was examined. Refusing to certify no external-API integration ' +
1397
+ 'from an unestablished scope. Add the phase plan, or add a COVERAGE.md declaration.',
1398
+ }, raw, undefined);
1399
+ return;
1400
+ }
1206
1401
  const detection = detectApiIntegration(scope.text);
1207
1402
  if (detection.detected) {
1208
1403
  // Surface only verb/noun (typed, bounded) — NOT raw prose snippets — so the
@@ -1324,6 +1519,18 @@ function routeCheckCommand({ args, cwd, raw }) {
1324
1519
  cmdGapAnalysisPlanPost(cwd, args, raw);
1325
1520
  return;
1326
1521
  }
1522
+ if (subcommand === 'verify-command-paths') {
1523
+ // Deterministic filesystem probe for <automated> verify commands (#2401) —
1524
+ // never executes anything; see verify-command-grounding.cjs.
1525
+ cmdVerifyCommandPaths(cwd, args, raw);
1526
+ return;
1527
+ }
1528
+ if (subcommand === 'verify-failure-directions') {
1529
+ // Presence probe for a stated <fails_when> per <automated> command
1530
+ // (#3172) — never executes anything; see verify-command-grounding.cjs.
1531
+ cmdVerifyFailureDirections(cwd, args, raw);
1532
+ return;
1533
+ }
1327
1534
  if (subcommand === 'api-coverage-verify-pre') {
1328
1535
  // ai-integration capability blocking gate at verify:pre (#1562). Dot-to-
1329
1536
  // hyphen normalization means query "api-coverage.verify-pre" routes here.
@@ -1334,6 +1541,12 @@ function routeCheckCommand({ args, cwd, raw }) {
1334
1541
  cmdTddReviewCheckpoint(cwd, args, raw);
1335
1542
  return;
1336
1543
  }
1544
+ if (subcommand === 'tdd-red-evidence') {
1545
+ // #3770: intentional-RED evidence gate — only a target-test failure may
1546
+ // authorize GREEN. Validates the persisted record; never executes anything.
1547
+ cmdTddRedEvidence(cwd, args, raw);
1548
+ return;
1549
+ }
1337
1550
  if (subcommand === 'ui-safety-gate') {
1338
1551
  cmdUiSafetyGate(cwd, args, raw);
1339
1552
  return;
@@ -1353,6 +1566,13 @@ function routeCheckCommand({ args, cwd, raw }) {
1353
1566
  cmdVerifyCodebaseDrift(cwd, raw);
1354
1567
  return;
1355
1568
  }
1569
+ if (subcommand === 'verify-context-drift') {
1570
+ // Delegates to verify.context-drift — drift capability gate at plan:pre (non-blocking).
1571
+ // Dot-to-hyphen normalization means query "verify.context-drift" routes here.
1572
+ const phaseArg = typeof args[2] === 'string' ? args[2] : '';
1573
+ cmdVerifyContextDrift(cwd, phaseArg, raw);
1574
+ return;
1575
+ }
1356
1576
  if (subcommand === 'predicate') {
1357
1577
  // Generic gate-predicate evaluator (#2008). The workflow gate-dispatch calls
1358
1578
  // this for any gate whose `check` carries a `predicate` (instead of a `query`),
@@ -1370,7 +1590,7 @@ function routeCheckCommand({ args, cwd, raw }) {
1370
1590
  (0, prohibition_enforcement_cjs_1.routeProhibitionEnforcement)(args, raw);
1371
1591
  return;
1372
1592
  }
1373
- error('Unknown check subcommand. Available: api-coverage-verify-pre, auto-mode, decision-coverage-plan, decision-coverage-verify, gap-analysis-plan-post, predicate, prohibition-enforcement, tdd-review-checkpoint, ui-plan-gate, ui-safety-gate, verify-schema-drift, verify-codebase-drift', ERROR_REASON.SDK_UNKNOWN_COMMAND);
1593
+ error('Unknown check subcommand. Available: api-coverage-verify-pre, auto-mode, decision-coverage-plan, decision-coverage-verify, gap-analysis-plan-post, predicate, prohibition-enforcement, tdd-red-evidence, tdd-review-checkpoint, ui-plan-gate, ui-safety-gate, verify-command-paths, verify-failure-directions, verify-schema-drift, verify-codebase-drift, verify-context-drift', ERROR_REASON.SDK_UNKNOWN_COMMAND);
1374
1594
  }
1375
1595
  module.exports = {
1376
1596
  routeCheckCommand,
@@ -1379,7 +1599,10 @@ module.exports = {
1379
1599
  computeUiPlanGate,
1380
1600
  computeUiSafetyGate,
1381
1601
  cmdGapAnalysisPlanPost,
1602
+ cmdVerifyCommandPaths,
1603
+ cmdVerifyFailureDirections,
1382
1604
  cmdTddReviewCheckpoint,
1605
+ cmdTddRedEvidence,
1383
1606
  cmdCheckPredicate,
1384
1607
  buildPredicateDeps,
1385
1608
  parsePredicateFlags,
@@ -43,6 +43,9 @@
43
43
  *
44
44
  * Zero external dependencies. Pure functions. Never throws on bad input.
45
45
  */
46
+ // eslint-disable-next-line @typescript-eslint/no-require-imports -- file-overlap-partitioner.cjs is an export= CommonJS module
47
+ const fileOverlapPartitionerMod = require("./file-overlap-partitioner.cjs");
48
+ const { partitionByFileOverlap } = fileOverlapPartitionerMod;
46
49
  // ─── Constants ────────────────────────────────────────────────────────────────
47
50
  /**
48
51
  * The Agent SDK version that introduced the Workflow tool (#1143 prior art).
@@ -226,33 +229,15 @@ function detectWorkflowBackend(input) {
226
229
  *
227
230
  * This is the same overlap rule execute-phase applies inline — the only difference
228
231
  * is the execution vehicle (Workflow `parallel()` vs one-agent-per-message).
232
+ *
233
+ * #3674: the algorithm itself now lives in the generic, dependency-free
234
+ * `file-overlap-partitioner.cts` module (`partitionByFileOverlap`) — this is a
235
+ * thin adapter mapping this module's own `Plan[]` shape onto that module's
236
+ * generic `{ id, files }[]` input and back. Behavior-preserving extraction:
237
+ * same greedy first-fit algorithm, same output, only the implementation moved.
229
238
  */
230
239
  function partitionStages(plans) {
231
- const stages = [];
232
- for (const plan of plans) {
233
- const fileSet = new Set(plan.files_modified);
234
- let placed = false;
235
- for (const stage of stages) {
236
- let overlap = false;
237
- for (const f of fileSet) {
238
- if (stage.files.has(f)) {
239
- overlap = true;
240
- break;
241
- }
242
- }
243
- if (!overlap) {
244
- stage.plans.push(plan);
245
- for (const f of fileSet)
246
- stage.files.add(f);
247
- placed = true;
248
- break;
249
- }
250
- }
251
- if (!placed) {
252
- stages.push({ plans: [plan], files: new Set(fileSet) });
253
- }
254
- }
255
- return stages.map((s) => s.plans.map((p) => p.id));
240
+ return partitionByFileOverlap(plans.map((p) => ({ id: p.id, files: p.files_modified })));
256
241
  }
257
242
  /**
258
243
  * Quote a free-text value for safe embedding as a JavaScript/Workflow double-quoted