@opengsd/gsd-core 1.14.0 → 1.16.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 (551) 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 +85 -5
  4. package/README.ja-JP.md +3 -3
  5. package/README.ko-KR.md +3 -3
  6. package/README.pt-BR.md +3 -3
  7. package/README.zh-CN.md +3 -3
  8. package/agents/gsd-code-fixer.compact.md +7 -6
  9. package/agents/gsd-code-fixer.md +9 -8
  10. package/agents/gsd-code-reviewer.compact.md +5 -3
  11. package/agents/gsd-code-reviewer.md +8 -6
  12. package/agents/gsd-debug-session-manager.compact.md +17 -2
  13. package/agents/gsd-debug-session-manager.md +17 -2
  14. package/agents/gsd-debugger.md +3 -3
  15. package/agents/gsd-eval-auditor.compact.md +1 -1
  16. package/agents/gsd-eval-auditor.md +1 -1
  17. package/agents/gsd-executor.md +17 -12
  18. package/agents/gsd-intel-updater.compact.md +1 -1
  19. package/agents/gsd-intel-updater.md +1 -1
  20. package/agents/gsd-mempalace-curator.md +2 -2
  21. package/agents/gsd-phase-researcher.md +19 -11
  22. package/agents/gsd-plan-checker.md +15 -9
  23. package/agents/gsd-planner.md +15 -11
  24. package/agents/gsd-project-researcher.compact.md +1 -1
  25. package/agents/gsd-project-researcher.md +1 -1
  26. package/agents/gsd-research-synthesizer.compact.md +1 -1
  27. package/agents/gsd-research-synthesizer.md +1 -1
  28. package/agents/gsd-ui-auditor.compact.md +21 -30
  29. package/agents/gsd-ui-auditor.md +166 -37
  30. package/agents/gsd-ui-researcher.compact.md +1 -1
  31. package/agents/gsd-ui-researcher.md +1 -1
  32. package/agents/gsd-verifier.md +37 -14
  33. package/bin/install.js +764 -287
  34. package/commands/gsd/add-tests.md +6 -1
  35. package/commands/gsd/ai-integration-phase.md +6 -1
  36. package/commands/gsd/audit-fix.md +5 -0
  37. package/commands/gsd/audit-milestone.md +6 -1
  38. package/commands/gsd/autonomous.md +7 -2
  39. package/commands/gsd/capture.md +9 -5
  40. package/commands/gsd/code-review.md +7 -2
  41. package/commands/gsd/complete-milestone.md +4 -0
  42. package/commands/gsd/config.md +7 -3
  43. package/commands/gsd/debug.md +11 -7
  44. package/commands/gsd/discuss-phase.md +7 -3
  45. package/commands/gsd/docs-update.md +12 -7
  46. package/commands/gsd/eval-review.md +6 -1
  47. package/commands/gsd/execute-phase.md +12 -7
  48. package/commands/gsd/extract-learnings.md +5 -0
  49. package/commands/gsd/fast.md +4 -0
  50. package/commands/gsd/forensics.md +5 -1
  51. package/commands/gsd/graphify.md +10 -6
  52. package/commands/gsd/health.md +5 -0
  53. package/commands/gsd/help.md +7 -2
  54. package/commands/gsd/import.md +7 -3
  55. package/commands/gsd/inbox.md +5 -0
  56. package/commands/gsd/ingest-docs.md +5 -1
  57. package/commands/gsd/manager.md +6 -1
  58. package/commands/gsd/map-codebase.md +7 -3
  59. package/commands/gsd/mempalace-capture.md +12 -4
  60. package/commands/gsd/mempalace-recall.md +5 -1
  61. package/commands/gsd/milestone-summary.md +5 -1
  62. package/commands/gsd/mvp-phase.md +8 -3
  63. package/commands/gsd/new-milestone.md +6 -1
  64. package/commands/gsd/new-project.md +5 -0
  65. package/commands/gsd/next.md +6 -1
  66. package/commands/gsd/ns-context.md +4 -0
  67. package/commands/gsd/ns-ideate.md +4 -0
  68. package/commands/gsd/ns-manage.md +4 -0
  69. package/commands/gsd/ns-project.md +4 -0
  70. package/commands/gsd/ns-review.md +4 -0
  71. package/commands/gsd/ns-workflow.md +4 -0
  72. package/commands/gsd/onboard.md +6 -1
  73. package/commands/gsd/pause-work.md +5 -1
  74. package/commands/gsd/phase.md +8 -4
  75. package/commands/gsd/plan-phase.md +6 -1
  76. package/commands/gsd/plan-review-convergence.md +11 -7
  77. package/commands/gsd/pr-branch.md +4 -0
  78. package/commands/gsd/profile-user.md +5 -1
  79. package/commands/gsd/progress.md +7 -2
  80. package/commands/gsd/quick-batch.md +21 -9
  81. package/commands/gsd/quick.md +12 -7
  82. package/commands/gsd/review.md +7 -4
  83. package/commands/gsd/secure-phase.md +6 -1
  84. package/commands/gsd/ship.md +5 -0
  85. package/commands/gsd/sketch.md +7 -2
  86. package/commands/gsd/spec-phase.md +5 -1
  87. package/commands/gsd/spike.md +8 -3
  88. package/commands/gsd/surface.md +5 -1
  89. package/commands/gsd/thread.md +4 -0
  90. package/commands/gsd/ui-phase.md +6 -1
  91. package/commands/gsd/ui-review.md +6 -1
  92. package/commands/gsd/ultraplan-phase.md +5 -1
  93. package/commands/gsd/undo.md +5 -1
  94. package/commands/gsd/update.md +6 -2
  95. package/commands/gsd/validate-phase.md +6 -1
  96. package/commands/gsd/verify-work.md +6 -1
  97. package/commands/gsd/workspace.md +7 -3
  98. package/gsd-core/bin/gsd-tools.cjs +477 -78
  99. package/gsd-core/bin/lib/active-workstream-store.cjs +15 -0
  100. package/gsd-core/bin/lib/adr-parser.cjs +3 -1
  101. package/gsd-core/bin/lib/agent-install-check.cjs +4 -1
  102. package/gsd-core/bin/lib/audit.cjs +144 -42
  103. package/gsd-core/bin/lib/broken-windows.cjs +13 -13
  104. package/gsd-core/bin/lib/capability-activation.cjs +9 -4
  105. package/gsd-core/bin/lib/capability-registry.cjs +197 -222
  106. package/gsd-core/bin/lib/capability-validator.cjs +16 -1
  107. package/gsd-core/bin/lib/check-auto-mode.cjs +35 -0
  108. package/gsd-core/bin/lib/check-command-router.cjs +164 -1625
  109. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +13 -2
  110. package/gsd-core/bin/lib/cli-exit.cjs +12 -0
  111. package/gsd-core/bin/lib/codex-agent-toml.cjs +32 -33
  112. package/gsd-core/bin/lib/command-aliases.cjs +7 -0
  113. package/gsd-core/bin/lib/command-routing-hub.cjs +48 -1
  114. package/gsd-core/bin/lib/commands.cjs +343 -207
  115. package/gsd-core/bin/lib/complexity-trigger.cjs +8 -7
  116. package/gsd-core/bin/lib/config-loader.cjs +65 -4
  117. package/gsd-core/bin/lib/config.cjs +76 -19
  118. package/gsd-core/bin/lib/core-utils.cjs +6 -1
  119. package/gsd-core/bin/lib/coverage.cjs +4 -8
  120. package/gsd-core/bin/lib/decision-coverage-support.cjs +259 -0
  121. package/gsd-core/bin/lib/decisions.cjs +30 -14
  122. package/gsd-core/bin/lib/drift.cjs +177 -42
  123. package/gsd-core/bin/lib/frontmatter-fence.cjs +90 -0
  124. package/gsd-core/bin/lib/frontmatter-splice.cjs +494 -0
  125. package/gsd-core/bin/lib/frontmatter.cjs +426 -234
  126. package/gsd-core/bin/lib/gap-checker.cjs +72 -29
  127. package/gsd-core/bin/lib/gate-api-coverage-verify-pre.cjs +381 -0
  128. package/gsd-core/bin/lib/gate-args.cjs +53 -0
  129. package/gsd-core/bin/lib/gate-codebase-drift.cjs +285 -0
  130. package/gsd-core/bin/lib/gate-config.cjs +46 -0
  131. package/gsd-core/bin/lib/gate-context-drift.cjs +141 -0
  132. package/gsd-core/bin/lib/gate-decision-coverage-plan.cjs +169 -0
  133. package/gsd-core/bin/lib/gate-decision-coverage-verify.cjs +126 -0
  134. package/gsd-core/bin/lib/gate-evaluation-scope.cjs +555 -0
  135. package/gsd-core/bin/lib/gate-evidence.cjs +138 -0
  136. package/gsd-core/bin/lib/gate-exit.cjs +27 -0
  137. package/gsd-core/bin/lib/gate-gap-analysis-plan-post.cjs +61 -0
  138. package/gsd-core/bin/lib/gate-phase-context.cjs +170 -0
  139. package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +1 -1
  140. package/gsd-core/bin/lib/gate-predicate.cjs +165 -0
  141. package/gsd-core/bin/lib/gate-prohibition-enforcement.cjs +94 -0
  142. package/gsd-core/bin/lib/gate-schema-drift.cjs +165 -0
  143. package/gsd-core/bin/lib/gate-tdd-red-evidence.cjs +100 -0
  144. package/gsd-core/bin/lib/gate-tdd-review-checkpoint.cjs +182 -0
  145. package/gsd-core/bin/lib/gate-ui-plan.cjs +86 -0
  146. package/gsd-core/bin/lib/gate-ui-safety.cjs +80 -0
  147. package/gsd-core/bin/lib/gate-verdict.cjs +64 -0
  148. package/gsd-core/bin/lib/gate-verify-command-paths.cjs +78 -0
  149. package/gsd-core/bin/lib/gate-verify-failure-directions.cjs +41 -0
  150. package/gsd-core/bin/lib/graphify.cjs +10 -2
  151. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +43 -47
  152. package/gsd-core/bin/lib/health-diagnostic.cjs +45 -8
  153. package/gsd-core/bin/lib/host-runtime-detection.cjs +9 -0
  154. package/gsd-core/bin/lib/init.cjs +364 -132
  155. package/gsd-core/bin/lib/install-engine.cjs +30 -33
  156. package/gsd-core/bin/lib/install-profiles.cjs +7 -4
  157. package/gsd-core/bin/lib/installer-migrations.cjs +8 -1
  158. package/gsd-core/bin/lib/io.cjs +122 -3
  159. package/gsd-core/bin/lib/loop-resolver.cjs +95 -0
  160. package/gsd-core/bin/lib/markdown-sectionizer.cjs +75 -1
  161. package/gsd-core/bin/lib/milestone.cjs +37 -6
  162. package/gsd-core/bin/lib/model-resolver.cjs +171 -62
  163. package/gsd-core/bin/lib/observability/event.cjs +1 -1
  164. package/gsd-core/bin/lib/observability/logger.cjs +46 -1
  165. package/gsd-core/bin/lib/pattern.cjs +10 -0
  166. package/gsd-core/bin/lib/phase-command-router.cjs +20 -5
  167. package/gsd-core/bin/lib/phase-estimation.cjs +5 -4
  168. package/gsd-core/bin/lib/phase-id-card.cjs +32 -0
  169. package/gsd-core/bin/lib/phase-id-display.cjs +78 -0
  170. package/gsd-core/bin/lib/phase-id.cjs +110 -8
  171. package/gsd-core/bin/lib/phase-lifecycle.cjs +9 -2
  172. package/gsd-core/bin/lib/phase-locator.cjs +29 -10
  173. package/gsd-core/bin/lib/phase-status.cjs +360 -0
  174. package/gsd-core/bin/lib/phase.cjs +489 -88
  175. package/gsd-core/bin/lib/plan-document.cjs +142 -20
  176. package/gsd-core/bin/lib/plan-drift-guard.cjs +5 -0
  177. package/gsd-core/bin/lib/planning-document.cjs +692 -0
  178. package/gsd-core/bin/lib/planning-inspect.cjs +60 -9
  179. package/gsd-core/bin/lib/planning-snapshot.cjs +18 -0
  180. package/gsd-core/bin/lib/planning-workspace.cjs +83 -55
  181. package/gsd-core/bin/lib/pr-branch-patterns.cjs +57 -0
  182. package/gsd-core/bin/lib/pristine-baseline.cjs +10 -0
  183. package/gsd-core/bin/lib/probe-core.cjs +7 -1
  184. package/gsd-core/bin/lib/profile-output.cjs +6 -3
  185. package/gsd-core/bin/lib/prohibition-enforcement.cjs +0 -55
  186. package/gsd-core/bin/lib/project-root.cjs +41 -2
  187. package/gsd-core/bin/lib/quick-batch-command-router.cjs +35 -9
  188. package/gsd-core/bin/lib/quick-batch-dispatch.cjs +11 -8
  189. package/gsd-core/bin/lib/real-home-guard.cjs +9 -1
  190. package/gsd-core/bin/lib/report-parser.cjs +269 -0
  191. package/gsd-core/bin/lib/review-lane-descriptor.cjs +10 -30
  192. package/gsd-core/bin/lib/review-reviewer-selection.cjs +2 -2
  193. package/gsd-core/bin/lib/roadmap-command-router.cjs +25 -19
  194. package/gsd-core/bin/lib/roadmap-parser.cjs +242 -15
  195. package/gsd-core/bin/lib/roadmap-upgrade.cjs +1653 -65
  196. package/gsd-core/bin/lib/roadmap.cjs +405 -88
  197. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +373 -187
  198. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +5 -2
  199. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +57 -1
  200. package/gsd-core/bin/lib/runtime-homes.cjs +14 -7
  201. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +522 -624
  202. package/gsd-core/bin/lib/runtime-name-policy.cjs +246 -21
  203. package/gsd-core/bin/lib/runtime-slash.cjs +47 -30
  204. package/gsd-core/bin/lib/shell-command-projection.cjs +47 -8
  205. package/gsd-core/bin/lib/smart-entry.cjs +19 -3
  206. package/gsd-core/bin/lib/stale-bake-guard.cjs +32 -48
  207. package/gsd-core/bin/lib/state-contract.cjs +15 -18
  208. package/gsd-core/bin/lib/state-document.cjs +100 -22
  209. package/gsd-core/bin/lib/state-transition.cjs +39 -2
  210. package/gsd-core/bin/lib/state.cjs +256 -105
  211. package/gsd-core/bin/lib/surface.cjs +19 -2
  212. package/gsd-core/bin/lib/tdd-red-evidence.cjs +48 -79
  213. package/gsd-core/bin/lib/uat-predicate.cjs +359 -38
  214. package/gsd-core/bin/lib/uat.cjs +432 -7
  215. package/gsd-core/bin/lib/ui-consideration-probe.cjs +15 -2
  216. package/gsd-core/bin/lib/ui-frontend-evidence.cjs +167 -40
  217. package/gsd-core/bin/lib/undo-commit-selection.cjs +131 -0
  218. package/gsd-core/bin/lib/vendor/README.md +31 -9
  219. package/gsd-core/bin/lib/vendor/saxes.cjs +1934 -0
  220. package/gsd-core/bin/lib/vendor/saxes.cjs.LICENSE.txt +92 -0
  221. package/gsd-core/bin/lib/vendor/tap-parser.cjs +8927 -0
  222. package/gsd-core/bin/lib/vendor/tap-parser.cjs.LICENSE.txt +152 -0
  223. package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
  224. package/gsd-core/bin/lib/verification.cjs +1378 -274
  225. package/gsd-core/bin/lib/verify-command-grounding.cjs +46 -2
  226. package/gsd-core/bin/lib/verify-command-router.cjs +18 -7
  227. package/gsd-core/bin/lib/verify.cjs +357 -531
  228. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +14 -6
  229. package/gsd-core/bin/lib/workstream-inventory.cjs +31 -21
  230. package/gsd-core/bin/lib/workstream-name-policy.cjs +31 -1
  231. package/gsd-core/bin/lib/workstream.cjs +11 -2
  232. package/gsd-core/bin/lib/worktree-base-ref.cjs +482 -73
  233. package/gsd-core/bin/lib/worktree-safety.cjs +784 -51
  234. package/gsd-core/bin/shared/config-defaults.manifest.json +8 -0
  235. package/gsd-core/bin/shared/config-schema.manifest.json +5 -0
  236. package/gsd-core/references/autonomous-smart-discuss.md +2 -1
  237. package/gsd-core/references/autonomous-ui-design-contract.md +3 -3
  238. package/gsd-core/references/checkpoints.md +5 -3
  239. package/gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +28 -3
  240. package/gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +37 -4
  241. package/gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +28 -3
  242. package/gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +28 -3
  243. package/gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +37 -4
  244. package/gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +37 -4
  245. package/gsd-core/references/edge-probe.md +195 -21
  246. package/gsd-core/references/execute-mvp-tdd.md +5 -10
  247. package/gsd-core/references/execute-phase-between-wave-reset.md +10 -6
  248. package/gsd-core/references/execute-phase-response-language.md +1 -1
  249. package/gsd-core/references/execute-phase-wave-guard.md +22 -11
  250. package/gsd-core/references/gsd-run-resolver.md +1 -1
  251. package/gsd-core/references/loop-hook-dispatch.md +7 -1
  252. package/gsd-core/references/model-profiles.md +1 -1
  253. package/gsd-core/references/offer-next.md +1 -1
  254. package/gsd-core/references/phase-argument-parsing.md +9 -7
  255. package/gsd-core/references/phase-id-convention.md +28 -0
  256. package/gsd-core/references/planner-gap-closure.md +2 -0
  257. package/gsd-core/references/planner-load-graph-context.md +24 -13
  258. package/gsd-core/references/planner-verify-command-grounding.md +14 -0
  259. package/gsd-core/references/planning-config.md +12 -3
  260. package/gsd-core/references/spidr-splitting.md +1 -1
  261. package/gsd-core/references/tdd.md +37 -8
  262. package/gsd-core/references/ui-consideration-probe.md +10 -5
  263. package/gsd-core/references/verifier-phase-gates.md +5 -2
  264. package/gsd-core/references/verify-command-path-resolvability.md +10 -2
  265. package/gsd-core/references/verify-mvp-mode.md +2 -2
  266. package/gsd-core/references/workstream-flag.md +33 -3
  267. package/gsd-core/references/worktree-path-safety.md +321 -0
  268. package/gsd-core/templates/README.md +1 -1
  269. package/gsd-core/templates/UAT.md +17 -1
  270. package/gsd-core/templates/config.json +2 -11
  271. package/gsd-core/templates/verification-report.md +1 -1
  272. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
  273. package/gsd-core/workflows/add-backlog.md +1 -1
  274. package/gsd-core/workflows/add-phase.md +8 -7
  275. package/gsd-core/workflows/add-tests.md +4 -3
  276. package/gsd-core/workflows/add-todo.md +6 -5
  277. package/gsd-core/workflows/ai-integration-phase.md +13 -4
  278. package/gsd-core/workflows/audit-fix.md +1 -1
  279. package/gsd-core/workflows/audit-milestone.md +4 -3
  280. package/gsd-core/workflows/audit-uat.md +1 -1
  281. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +9 -18
  282. package/gsd-core/workflows/autonomous.md +43 -23
  283. package/gsd-core/workflows/check-todos.md +7 -6
  284. package/gsd-core/workflows/cleanup.md +2 -2
  285. package/gsd-core/workflows/code-review/steps/dispatch-fix.md +4 -3
  286. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +20 -13
  287. package/gsd-core/workflows/code-review-fix.md +112 -25
  288. package/gsd-core/workflows/code-review.md +146 -135
  289. package/gsd-core/workflows/complete-milestone/detail/elaboration.md +4 -3
  290. package/gsd-core/workflows/complete-milestone.md +13 -8
  291. package/gsd-core/workflows/debug.md +32 -7
  292. package/gsd-core/workflows/diagnose-issues.md +3 -2
  293. package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
  294. package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
  295. package/gsd-core/workflows/discuss-phase-assumptions.md +4 -3
  296. package/gsd-core/workflows/discuss-phase.md +4 -3
  297. package/gsd-core/workflows/do.md +2 -2
  298. package/gsd-core/workflows/docs-update.md +6 -5
  299. package/gsd-core/workflows/edit-phase.md +4 -3
  300. package/gsd-core/workflows/eval-review.md +14 -5
  301. package/gsd-core/workflows/execute-phase/detail/elaboration.md +2 -2
  302. package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +1019 -0
  303. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +15 -4
  304. package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +10 -7
  305. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +37 -3
  306. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +3 -1
  307. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +2 -2
  308. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
  309. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +1 -1
  310. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +46 -9
  311. package/gsd-core/workflows/execute-phase/steps/protected-branch.md +1 -1
  312. package/gsd-core/workflows/execute-phase/steps/ready-wave-gate.md +37 -0
  313. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +1 -1
  314. package/gsd-core/workflows/execute-phase/steps/regression-gate.md +2 -0
  315. package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +1 -1
  316. package/gsd-core/workflows/execute-phase/steps/threat-id-gate.md +28 -0
  317. package/gsd-core/workflows/execute-phase/steps/verify-phase-goal.md +187 -0
  318. package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +2 -3
  319. package/gsd-core/workflows/execute-phase/steps/worktree-base-check.md +25 -0
  320. package/gsd-core/workflows/execute-phase.md +96 -178
  321. package/gsd-core/workflows/execute-plan.md +18 -23
  322. package/gsd-core/workflows/explore.md +4 -4
  323. package/gsd-core/workflows/extract-learnings.md +4 -2
  324. package/gsd-core/workflows/fast.md +1 -1
  325. package/gsd-core/workflows/forensics.md +1 -1
  326. package/gsd-core/workflows/graduation.md +1 -1
  327. package/gsd-core/workflows/health.md +3 -2
  328. package/gsd-core/workflows/help/modes/full.compact.md +3 -3
  329. package/gsd-core/workflows/help/modes/full.md +5 -5
  330. package/gsd-core/workflows/help/modes/topic.md +15 -5
  331. package/gsd-core/workflows/import.md +4 -3
  332. package/gsd-core/workflows/inbox.md +2 -2
  333. package/gsd-core/workflows/ingest-docs.md +3 -3
  334. package/gsd-core/workflows/insert-phase.md +4 -3
  335. package/gsd-core/workflows/list-seeds.md +1 -1
  336. package/gsd-core/workflows/list-workspaces.md +1 -1
  337. package/gsd-core/workflows/manager.md +6 -4
  338. package/gsd-core/workflows/map-codebase.md +5 -4
  339. package/gsd-core/workflows/milestone-summary.md +3 -2
  340. package/gsd-core/workflows/mvp-phase.md +14 -14
  341. package/gsd-core/workflows/new-milestone.md +11 -11
  342. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +3 -3
  343. package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +1 -1
  344. package/gsd-core/workflows/new-project.md +7 -7
  345. package/gsd-core/workflows/new-workspace.md +2 -2
  346. package/gsd-core/workflows/next.md +1 -1
  347. package/gsd-core/workflows/note.md +1 -1
  348. package/gsd-core/workflows/onboard.md +1 -1
  349. package/gsd-core/workflows/pause-work.md +2 -2
  350. package/gsd-core/workflows/plan-phase/detail/elaboration.md +1 -1
  351. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +17 -5
  352. package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +1 -1
  353. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
  354. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +23 -5
  355. package/gsd-core/workflows/plan-phase.md +50 -24
  356. package/gsd-core/workflows/plan-review-convergence.md +21 -5
  357. package/gsd-core/workflows/plant-seed.md +62 -20
  358. package/gsd-core/workflows/pr-branch.md +113 -13
  359. package/gsd-core/workflows/profile-user.md +2 -2
  360. package/gsd-core/workflows/progress.md +19 -49
  361. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +27 -0
  362. package/gsd-core/workflows/quick/steps/quick-verification.md +4 -4
  363. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +30 -11
  364. package/gsd-core/workflows/quick-batch/steps/batch-init.md +1 -1
  365. package/gsd-core/workflows/quick-batch/steps/completion.md +1 -1
  366. package/gsd-core/workflows/quick-batch/steps/merge-wave.md +1 -1
  367. package/gsd-core/workflows/quick-batch/steps/planner-wave.md +1 -1
  368. package/gsd-core/workflows/quick-batch/steps/research-phase.md +1 -1
  369. package/gsd-core/workflows/quick-batch/steps/resume-mode.md +1 -1
  370. package/gsd-core/workflows/quick-batch/steps/verification-wave.md +9 -3
  371. package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +1 -1
  372. package/gsd-core/workflows/quick-batch.md +15 -10
  373. package/gsd-core/workflows/quick.md +62 -39
  374. package/gsd-core/workflows/reapply-patches.md +9 -3
  375. package/gsd-core/workflows/remove-phase.md +3 -2
  376. package/gsd-core/workflows/remove-workspace.md +2 -2
  377. package/gsd-core/workflows/resume-project.md +3 -2
  378. package/gsd-core/workflows/review.md +33 -17
  379. package/gsd-core/workflows/scan.md +3 -2
  380. package/gsd-core/workflows/secure-phase.md +13 -13
  381. package/gsd-core/workflows/settings-advanced.md +30 -10
  382. package/gsd-core/workflows/settings-integrations.md +2 -3
  383. package/gsd-core/workflows/settings.md +4 -4
  384. package/gsd-core/workflows/ship.md +14 -13
  385. package/gsd-core/workflows/sketch-wrap-up.md +1 -1
  386. package/gsd-core/workflows/sketch.md +1 -1
  387. package/gsd-core/workflows/smart-entry.md +2 -2
  388. package/gsd-core/workflows/spec-phase.md +15 -5
  389. package/gsd-core/workflows/spike-wrap-up.md +1 -1
  390. package/gsd-core/workflows/spike.md +1 -1
  391. package/gsd-core/workflows/stats.md +1 -1
  392. package/gsd-core/workflows/sync-skills.md +5 -5
  393. package/gsd-core/workflows/thread.md +2 -2
  394. package/gsd-core/workflows/transition.md +13 -23
  395. package/gsd-core/workflows/ui-phase.md +48 -11
  396. package/gsd-core/workflows/ui-review.md +21 -6
  397. package/gsd-core/workflows/ultraplan-phase.md +3 -2
  398. package/gsd-core/workflows/undo.md +339 -20
  399. package/gsd-core/workflows/update.md +7 -7
  400. package/gsd-core/workflows/validate-phase.md +12 -13
  401. package/gsd-core/workflows/verify-work/detail/elaboration.md +43 -3
  402. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +1 -1
  403. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +5 -3
  404. package/gsd-core/workflows/verify-work.md +129 -55
  405. package/hooks/dist/gsd-agent-isolation-guard.js +32 -0
  406. package/hooks/dist/gsd-check-update-worker.js +8 -0
  407. package/hooks/dist/gsd-check-update.js +8 -0
  408. package/hooks/dist/gsd-context-monitor.js +31 -8
  409. package/hooks/dist/gsd-cursor-subagent-start.js +8 -0
  410. package/hooks/dist/gsd-secret-read-guard.js +161 -4
  411. package/hooks/dist/gsd-statusline.js +85 -20
  412. package/hooks/dist/gsd-update-banner.js +8 -0
  413. package/hooks/dist/gsd-validate-commit.sh +63 -4
  414. package/hooks/dist/gsd-windsurf-pre-write.js +11 -2
  415. package/hooks/dist/gsd-workflow-guard.js +5 -4
  416. package/hooks/dist/gsd-worktree-path-guard.js +6 -2
  417. package/hooks/dist/lib/cli-exit.js +12 -0
  418. package/hooks/dist/lib/git-probe.js +17 -1
  419. package/hooks/dist/lib/isolation-sentinel.js +2 -2
  420. package/hooks/gsd-agent-isolation-guard.js +32 -0
  421. package/hooks/gsd-check-update-worker.js +8 -0
  422. package/hooks/gsd-check-update.js +8 -0
  423. package/hooks/gsd-context-monitor.js +31 -8
  424. package/hooks/gsd-cursor-subagent-start.js +8 -0
  425. package/hooks/gsd-secret-read-guard.js +161 -4
  426. package/hooks/gsd-statusline.js +85 -20
  427. package/hooks/gsd-update-banner.js +8 -0
  428. package/hooks/gsd-validate-commit.sh +63 -4
  429. package/hooks/gsd-windsurf-pre-write.js +11 -2
  430. package/hooks/gsd-workflow-guard.js +5 -4
  431. package/hooks/gsd-worktree-path-guard.js +6 -2
  432. package/hooks/hooks.json +5 -5
  433. package/hooks/lib/cli-exit.js +12 -0
  434. package/hooks/lib/git-probe.js +17 -1
  435. package/hooks/lib/isolation-sentinel.js +2 -2
  436. package/package.json +22 -4
  437. package/scripts/build-hooks.js +15 -6
  438. package/scripts/changeset/parse.cjs +52 -4
  439. package/scripts/check-contract-drift.cjs +127 -11
  440. package/scripts/ci-timeout-report.cjs +770 -4
  441. package/scripts/command-contract-helpers.cjs +15 -8
  442. package/scripts/docs-guard-registry.cjs +34 -0
  443. package/scripts/gen-features.cjs +13 -8
  444. package/scripts/gen-hooks-cli-exit.cjs +12 -28
  445. package/scripts/gen-loop-host-contract.cjs +79 -1
  446. package/scripts/gen-platform-conformance-tier.cjs +187 -1
  447. package/scripts/gen-plugin-skills.cjs +87 -1
  448. package/scripts/gen-research-agents.cjs +24 -31
  449. package/scripts/gen-scripts-cli-exit.cjs +30 -3
  450. package/scripts/gen-test-timings.cjs +32 -7
  451. package/scripts/lib/cli-exit.cjs +12 -0
  452. package/scripts/lib/macos-conformance-tier.generated.cjs +34 -2
  453. package/scripts/lib/ndjson-reporter.cjs +31 -5
  454. package/scripts/lib/platform-conformance-tier.generated.cjs +45 -5
  455. package/scripts/lib/registration-ledger-preload.cjs +155 -0
  456. package/scripts/lib/vendor-bundle.cjs +59 -0
  457. package/scripts/lib/vendor-licenses/saxes-6.0.0.txt +64 -0
  458. package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
  459. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
  460. package/scripts/lint-completion-predicate-drift.cjs +18 -19
  461. package/scripts/lint-descriptions.cjs +7 -3
  462. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +38 -1
  463. package/scripts/lint-eslint-glob-coverage.allowlist.json +20 -0
  464. package/scripts/lint-frontmatter-fence-drift.cjs +313 -0
  465. package/scripts/lint-frontmatter-scalar-broad-grep.cjs +122 -16
  466. package/scripts/lint-phase-arg-assignment.cjs +257 -0
  467. package/scripts/lint-phase-enumeration-drift.cjs +12 -8
  468. package/scripts/lint-phase-id-drift.cjs +319 -5
  469. package/scripts/lint-planning-document-positive-control.cjs +329 -0
  470. package/scripts/lint-pr-branch-pattern-drift.cjs +148 -0
  471. package/scripts/lint-response-language-coverage.cjs +3 -0
  472. package/scripts/lint-retired-runtime-name.cjs +619 -0
  473. package/scripts/lint-skill-deps.cjs +7 -3
  474. package/scripts/lint-state-write-path-drift.cjs +93 -0
  475. package/scripts/lint-test-file-count.allowlist.json +38 -9
  476. package/scripts/lint-test-file-count.cjs +34 -1
  477. package/scripts/lint-vendored-deps.cjs +41 -5
  478. package/scripts/lint-workflow-shellcheck-baseline.json +25 -10
  479. package/scripts/mutation-matrix.cjs +50 -5
  480. package/scripts/prompt-injection-scan.sh +4 -0
  481. package/scripts/release-tarball-smoke.cjs +194 -1
  482. package/scripts/require-issue-link-policy.cjs +6 -2
  483. package/scripts/sync-runtime-launcher.cjs +184 -2
  484. package/scripts/verify-npm-publish.cjs +76 -20
  485. package/skills/gsd-add-tests/SKILL.md +6 -1
  486. package/skills/gsd-ai-integration-phase/SKILL.md +6 -1
  487. package/skills/gsd-audit-fix/SKILL.md +5 -0
  488. package/skills/gsd-audit-milestone/SKILL.md +6 -1
  489. package/skills/gsd-autonomous/SKILL.md +7 -2
  490. package/skills/gsd-capture/SKILL.md +9 -5
  491. package/skills/gsd-code-review/SKILL.md +7 -2
  492. package/skills/gsd-complete-milestone/SKILL.md +4 -0
  493. package/skills/gsd-config/SKILL.md +8 -4
  494. package/skills/gsd-debug/SKILL.md +11 -7
  495. package/skills/gsd-discuss-phase/SKILL.md +7 -3
  496. package/skills/gsd-docs-update/SKILL.md +12 -7
  497. package/skills/gsd-eval-review/SKILL.md +6 -1
  498. package/skills/gsd-execute-phase/SKILL.md +12 -7
  499. package/skills/gsd-extract-learnings/SKILL.md +5 -0
  500. package/skills/gsd-fast/SKILL.md +4 -0
  501. package/skills/gsd-forensics/SKILL.md +5 -1
  502. package/skills/gsd-graphify/SKILL.md +10 -6
  503. package/skills/gsd-health/SKILL.md +5 -0
  504. package/skills/gsd-help/SKILL.md +7 -2
  505. package/skills/gsd-import/SKILL.md +7 -3
  506. package/skills/gsd-inbox/SKILL.md +5 -0
  507. package/skills/gsd-ingest-docs/SKILL.md +5 -1
  508. package/skills/gsd-manager/SKILL.md +6 -1
  509. package/skills/gsd-map-codebase/SKILL.md +7 -3
  510. package/skills/gsd-mempalace-capture/SKILL.md +12 -4
  511. package/skills/gsd-mempalace-recall/SKILL.md +5 -1
  512. package/skills/gsd-milestone-summary/SKILL.md +5 -1
  513. package/skills/gsd-mvp-phase/SKILL.md +8 -3
  514. package/skills/gsd-new-milestone/SKILL.md +6 -1
  515. package/skills/gsd-new-project/SKILL.md +5 -0
  516. package/skills/gsd-next/SKILL.md +6 -1
  517. package/skills/gsd-ns-context/SKILL.md +4 -0
  518. package/skills/gsd-ns-ideate/SKILL.md +4 -0
  519. package/skills/gsd-ns-manage/SKILL.md +4 -0
  520. package/skills/gsd-ns-project/SKILL.md +4 -0
  521. package/skills/gsd-ns-review/SKILL.md +4 -0
  522. package/skills/gsd-ns-workflow/SKILL.md +4 -0
  523. package/skills/gsd-onboard/SKILL.md +6 -1
  524. package/skills/gsd-pause-work/SKILL.md +5 -1
  525. package/skills/gsd-phase/SKILL.md +8 -4
  526. package/skills/gsd-plan-phase/SKILL.md +6 -1
  527. package/skills/gsd-plan-review-convergence/SKILL.md +10 -6
  528. package/skills/gsd-pr-branch/SKILL.md +4 -0
  529. package/skills/gsd-profile-user/SKILL.md +5 -1
  530. package/skills/gsd-progress/SKILL.md +7 -2
  531. package/skills/gsd-quick/SKILL.md +16 -10
  532. package/skills/gsd-quick-batch/SKILL.md +21 -9
  533. package/skills/gsd-review/SKILL.md +7 -4
  534. package/skills/gsd-review-backlog/SKILL.md +3 -2
  535. package/skills/gsd-secure-phase/SKILL.md +6 -1
  536. package/skills/gsd-ship/SKILL.md +5 -0
  537. package/skills/gsd-sketch/SKILL.md +7 -2
  538. package/skills/gsd-spec-phase/SKILL.md +5 -1
  539. package/skills/gsd-spike/SKILL.md +8 -3
  540. package/skills/gsd-surface/SKILL.md +5 -1
  541. package/skills/gsd-thread/SKILL.md +4 -0
  542. package/skills/gsd-ui-phase/SKILL.md +6 -1
  543. package/skills/gsd-ui-review/SKILL.md +6 -1
  544. package/skills/gsd-ultraplan-phase/SKILL.md +5 -1
  545. package/skills/gsd-undo/SKILL.md +5 -1
  546. package/skills/gsd-update/SKILL.md +6 -2
  547. package/skills/gsd-validate-phase/SKILL.md +6 -1
  548. package/skills/gsd-verify-work/SKILL.md +6 -1
  549. package/skills/gsd-workspace/SKILL.md +7 -3
  550. package/skills/gsd-workstreams/SKILL.md +6 -6
  551. package/vscode/package.json +1 -1
@@ -14,7 +14,9 @@ module.exports = {
14
14
  "tests/assumption-delta-checkpoint-e2e.test.cjs",
15
15
  "tests/assumption-delta.test.cjs",
16
16
  "tests/audit-command-cutover.test.cjs",
17
+ "tests/audit-workstream-layouts.test.cjs",
17
18
  "tests/augment-upgrades.test.cjs",
19
+ "tests/blocking-guard-budget-parity.test.cjs",
18
20
  "tests/broken-windows.test.cjs",
19
21
  "tests/capability-cli.test.cjs",
20
22
  "tests/capability-command-dispatch.test.cjs",
@@ -27,10 +29,13 @@ module.exports = {
27
29
  "tests/capability-source.test.cjs",
28
30
  "tests/capability-state.test.cjs",
29
31
  "tests/changeset-new.test.cjs",
32
+ "tests/check-contract-drift.test.cjs",
30
33
  "tests/check-env.test.cjs",
31
34
  "tests/check-gap-analysis-plan-post-e2e.test.cjs",
32
35
  "tests/check-glossary-refs.test.cjs",
33
36
  "tests/check-predicate.test.cjs",
37
+ "tests/check-router-cutover-equivalence.test.cjs",
38
+ "tests/check-router-gate-boundaries.test.cjs",
34
39
  "tests/check-tdd-review-checkpoint-e2e.test.cjs",
35
40
  "tests/check-ui-safety-gate.test.cjs",
36
41
  "tests/check-update-config-dir.test.cjs",
@@ -42,6 +47,7 @@ module.exports = {
42
47
  "tests/claude-md.test.cjs",
43
48
  "tests/cline-install.test.cjs",
44
49
  "tests/close-phase-todos-padded-resolves.test.cjs",
50
+ "tests/code-review-fix-pipeline-regression.test.cjs",
45
51
  "tests/code-review-pipeline-regression.test.cjs",
46
52
  "tests/code-review-tier3-files-override-scoping.test.cjs",
47
53
  "tests/code-review.test.cjs",
@@ -51,7 +57,7 @@ module.exports = {
51
57
  "tests/codex-config.test.cjs",
52
58
  "tests/codex-inherit-smoke.test.cjs",
53
59
  "tests/command-routing-hub.test.cjs",
54
- "tests/commands.test.cjs",
60
+ "tests/commands.platform.test.cjs",
55
61
  "tests/commit-files-deletion.test.cjs",
56
62
  "tests/commit-files-pathspec.test.cjs",
57
63
  "tests/commonjs-marker.test.cjs",
@@ -61,16 +67,21 @@ module.exports = {
61
67
  "tests/config-get-default.test.cjs",
62
68
  "tests/config-loader.test.cjs",
63
69
  "tests/config-schema.property.test.cjs",
64
- "tests/config.test.cjs",
70
+ "tests/config.platform.test.cjs",
71
+ "tests/configured-entrypoint-validation.test.cjs",
72
+ "tests/context-drift.test.cjs",
65
73
  "tests/copilot-install.test.cjs",
66
74
  "tests/copilot-upgrades.test.cjs",
67
75
  "tests/core-utils.test.cjs",
68
76
  "tests/cursor-hook-workspace-roots.test.cjs",
69
77
  "tests/cursor-hooks.test.cjs",
70
78
  "tests/cursor-subagent-isolation.test.cjs",
79
+ "tests/debug-session-management.test.cjs",
71
80
  "tests/dispatch-identity.test.cjs",
72
81
  "tests/dispatcher.test.cjs",
73
82
  "tests/drift-detection.test.cjs",
83
+ "tests/drift-whole-change-set.test.cjs",
84
+ "tests/effort-local-install.test.cjs",
74
85
  "tests/effort-surface-axis.test.cjs",
75
86
  "tests/effort-sync-installed-runtime.test.cjs",
76
87
  "tests/emitted-ack-trailer.test.cjs",
@@ -92,6 +103,16 @@ module.exports = {
92
103
  "tests/features-index-gate.test.cjs",
93
104
  "tests/frontmatter.test.cjs",
94
105
  "tests/gap-checker.property.test.cjs",
106
+ "tests/gate-api-coverage-verify-pre-escape.test.cjs",
107
+ "tests/gate-consumer-exit-awareness.test.cjs",
108
+ "tests/gate-decision-coverage-verify-stderr.test.cjs",
109
+ "tests/gate-exit.test.cjs",
110
+ "tests/gate-tdd-red-evidence-containment.test.cjs",
111
+ "tests/gate-tdd-review-checkpoint-hardening.test.cjs",
112
+ "tests/gate-tdd-review-checkpoint.unit.test.cjs",
113
+ "tests/gate-ui-plan.unit.test.cjs",
114
+ "tests/gate-ui-safety.unit.test.cjs",
115
+ "tests/gate-verify-command-paths.unit.test.cjs",
95
116
  "tests/gemini-runtime-removed.test.cjs",
96
117
  "tests/gen-context-index.test.cjs",
97
118
  "tests/gen-health-docs.test.cjs",
@@ -107,6 +128,7 @@ module.exports = {
107
128
  "tests/gsd-mcp-server-bin.test.cjs",
108
129
  "tests/gsd-statusline.test.cjs",
109
130
  "tests/gsd-validate-commit-crash-policy.test.cjs",
131
+ "tests/gsd-validate-commit-sigpipe.test.cjs",
110
132
  "tests/gsd-write-guard.test.cjs",
111
133
  "tests/health-diagnostic-rules/config-validation.test.cjs",
112
134
  "tests/health-diagnostic-rules/worktree-health.test.cjs",
@@ -114,12 +136,12 @@ module.exports = {
114
136
  "tests/helpers-cleanup.test.cjs",
115
137
  "tests/helpers-process-isolation.test.cjs",
116
138
  "tests/hermes-skills-migration.test.cjs",
139
+ "tests/hook-activation-probe.test.cjs",
117
140
  "tests/hooks-commonjs-marker.test.cjs",
118
141
  "tests/hooks-crash-policy.test.cjs",
119
142
  "tests/hooks-opt-in.test.cjs",
120
143
  "tests/host-integration.test.cjs",
121
144
  "tests/init-manager.test.cjs",
122
- "tests/init.test.cjs",
123
145
  "tests/install-minimal-hooks.test.cjs",
124
146
  "tests/install-nested-layout.test.cjs",
125
147
  "tests/install-path-detection.test.cjs",
@@ -141,6 +163,8 @@ module.exports = {
141
163
  "tests/kimi-agent-converter.test.cjs",
142
164
  "tests/kimi-upgrades.test.cjs",
143
165
  "tests/kimi-variant-disambiguation.test.cjs",
166
+ "tests/launcher-homes-derivation.test.cjs",
167
+ "tests/lint-phase-arg-assignment.test.cjs",
144
168
  "tests/lint-workflow-shellcheck-fetch.test.cjs",
145
169
  "tests/live-config-guard.test.cjs",
146
170
  "tests/lockfile-cve-audit.test.cjs",
@@ -165,6 +189,7 @@ module.exports = {
165
189
  "tests/no-unbounded-dirname-walk.rule.test.cjs",
166
190
  "tests/no-unbounded-spawn.test.cjs",
167
191
  "tests/no-unguarded-nonportable-exec.rule.test.cjs",
192
+ "tests/node-compile-cache.test.cjs",
168
193
  "tests/npm-audit-baseline.test.cjs",
169
194
  "tests/npm-integrity-gate.test.cjs",
170
195
  "tests/nsegment-phase-grammar.test.cjs",
@@ -180,7 +205,7 @@ module.exports = {
180
205
  "tests/phase-completion-single-owner.test.cjs",
181
206
  "tests/phase-estimation.test.cjs",
182
207
  "tests/phase-locator.test.cjs",
183
- "tests/phase.test.cjs",
208
+ "tests/phase.platform.test.cjs",
184
209
  "tests/phase6-capstone-conformance.test.cjs",
185
210
  "tests/pi-config-dir-env-override.test.cjs",
186
211
  "tests/plan-count-single-owner.test.cjs",
@@ -207,6 +232,7 @@ module.exports = {
207
232
  "tests/profile-pipeline.test.cjs",
208
233
  "tests/prohibition-enforcement.test.cjs",
209
234
  "tests/project-root.test.cjs",
235
+ "tests/quick-batch-command-router.stdin.test.cjs",
210
236
  "tests/quick-batch.test.cjs",
211
237
  "tests/quick-branching.test.cjs",
212
238
  "tests/quick-research.test.cjs",
@@ -231,16 +257,20 @@ module.exports = {
231
257
  "tests/reviewer-step-dispatch.test.cjs",
232
258
  "tests/revision-remediation-binding.test.cjs",
233
259
  "tests/roadmap-parser.test.cjs",
260
+ "tests/roadmap-upgrade-bracket.test.cjs",
234
261
  "tests/roadmap.test.cjs",
262
+ "tests/run-tests-accounting.test.cjs",
235
263
  "tests/run-tests-harness.test.cjs",
236
264
  "tests/run-tests-temp-root.test.cjs",
237
265
  "tests/run-with-timeout.test.cjs",
238
266
  "tests/runtime-artifact-layout-surface.test.cjs",
239
267
  "tests/runtime-artifact-layout.test.cjs",
240
268
  "tests/runtime-converters.test.cjs",
269
+ "tests/runtime-descriptor-owner.test.cjs",
241
270
  "tests/runtime-homes-descriptor-drive.test.cjs",
242
271
  "tests/runtime-identity.test.cjs",
243
272
  "tests/runtime-launcher-parity.test.cjs",
273
+ "tests/schema-drift.test.cjs",
244
274
  "tests/security.test.cjs",
245
275
  "tests/settings-jsonc.test.cjs",
246
276
  "tests/sh-hook-paths.test.cjs",
@@ -248,20 +278,30 @@ module.exports = {
248
278
  "tests/shell-command-projection-dispatch.test.cjs",
249
279
  "tests/shell-command-projection-path-sep.test.cjs",
250
280
  "tests/ship-notes-wedged-pr.test.cjs",
281
+ "tests/shipped-reference-cites.test.cjs",
251
282
  "tests/skill-manifest.test.cjs",
252
283
  "tests/slug-derivation-drift-guard.test.cjs",
253
284
  "tests/state-todos-render.test.cjs",
254
- "tests/state.test.cjs",
285
+ "tests/state.platform.test.cjs",
255
286
  "tests/teams-status.test.cjs",
287
+ "tests/test-gate-watch-mode.test.cjs",
256
288
  "tests/todos-workstream-scope.test.cjs",
289
+ "tests/uat-complete-session.test.cjs",
290
+ "tests/ui-auditor-screenshot-block.test.cjs",
291
+ "tests/ui-interaction-capture.test.cjs",
292
+ "tests/undo-commit-selection-4465.test.cjs",
293
+ "tests/undo-commit-selection.test.cjs",
257
294
  "tests/unreachable-guard-drift.test.cjs",
258
295
  "tests/unreachable-shell-guard.test.cjs",
259
296
  "tests/unusable-input.test.cjs",
260
297
  "tests/update-custom-backup.test.cjs",
261
298
  "tests/user-artifact-staging.test.cjs",
299
+ "tests/verification-append-audit.test.cjs",
262
300
  "tests/verification-status.test.cjs",
263
301
  "tests/verify-archive-dirs-live-path.test.cjs",
264
302
  "tests/verify-command-grounding.test.cjs",
303
+ "tests/verify-lifecycle-writes-e2e.test.cjs",
304
+ "tests/verify-work-auto-transition.test.cjs",
265
305
  "tests/verify.test.cjs",
266
306
  "tests/windsurf-hooks-bridge.test.cjs",
267
307
  "tests/workflow-guard.test.cjs",
@@ -0,0 +1,155 @@
1
+ 'use strict';
2
+
3
+ // Registration ledger preload for scripts/run-tests.cjs (#4031).
4
+ //
5
+ // Why this exists. The runner passes `--test-force-exit` to every chunk (the
6
+ // Windows post-test hang backstop, #1051/#869). Under process isolation each
7
+ // test file's child streams its results to the `node --test` parent over a
8
+ // pipe, and a force-exit can end the parent while bytes of that pipe are still
9
+ // unread (nodejs/node#64833). The reporters never see the lost tail, so the
10
+ // run printed a smaller pass count and exited 0: a test that executed and
11
+ // passed (or failed) was indistinguishable from one that never existed.
12
+ //
13
+ // The parent cannot know what it did not receive, so the count of results the
14
+ // child produced has to come from the child, over a channel that does not
15
+ // share the pipe: this module is loaded into each test-file child with
16
+ // `--require` (`--test` forwards it to the file children) and counts the leaf
17
+ // `test:pass` / `test:fail` events the child's own reporter hands to the V8
18
+ // serializer that frames them onto that pipe, keyed by the `file` each event
19
+ // carries. When the child exits it appends one line per file to the file named
20
+ // by GSD_RUN_TESTS_LEDGER_FILE. The runner compares that per-file count with
21
+ // the leaf results its ndjson reporter actually received
22
+ // (analyzeChunkAccounting in run-tests.cjs) and fails the chunk when
23
+ // registered > reported.
24
+ //
25
+ // Why it taps the serializer and does NOT wrap `test()` / `it()`. node:test
26
+ // stamps every test with the location of the code that called it
27
+ // (`getCallerLocation()` in lib/internal/test_runner/harness.js) and reports
28
+ // that as the event's `file`. A wrapper around `test` is a JS frame between the
29
+ // test file and node:test, so every event would report THIS file as its
30
+ // location: spec-reporter failure locations would point here and no result
31
+ // could be matched back to its test file. Counting at the serializer adds no
32
+ // frame to the call and counts exactly what is put on the pipe, so the count
33
+ // and the parent's report are compared like for like: a skipped or todo test,
34
+ // a skipped suite and a test name/only filter need no special case
35
+ // (an excluded test emits no event on either side).
36
+ //
37
+ // Blind spots, stated plainly: a child that emits nothing counts 0 (no loss is
38
+ // visible); a SIGKILLed child never runs the `exit` handler below, so it leaves no
39
+ // ledger line; a file the parent reported but the ledger never saw is not flagged
40
+ // per file; and the whole count depends on node:test's child reporter framing its
41
+ // events through v8.DefaultSerializer.prototype.writeValue (true on Node 24). If a
42
+ // Node change moves that, every count becomes 0: the runner then fails a chunk whose
43
+ // ledger counted 0 while its reporter received results (analyzeChunkAccounting,
44
+ // `ledgerCountedNothing`), and tests/run-tests-accounting.test.cjs pins the hook.
45
+ //
46
+ // Inert unless it is inside a test-file child (NODE_TEST_CONTEXT is set by
47
+ // `node --test` for those, not for the runner parent), so requiring it anywhere
48
+ // else is a no-op. There it does two things: it makes the child's stdout pipe
49
+ // blocking (blockChildStdout: this is what stops `--test-force-exit` from
50
+ // discarding queued results, the loss this accounting exists to detect), and,
51
+ // when a ledger path was supplied, counts results. Never throws into the code it
52
+ // observes.
53
+
54
+ const fs = require('fs');
55
+ const path = require('path');
56
+ const { DefaultSerializer } = require('v8');
57
+
58
+ const RESULT_TYPES = new Set(['test:pass', 'test:fail']);
59
+
60
+ /**
61
+ * The file a reporter event counts toward, or null when the event is not a leaf test result the
62
+ * runner's ndjson reporter would record (anything but a pass/fail, a suite, an event with no file).
63
+ * analyzeChunkAccounting applies the same three conditions to the events it reads back.
64
+ */
65
+ function resultFileOf(item) {
66
+ if (item === null || typeof item !== 'object' || !RESULT_TYPES.has(item.type)) return null;
67
+ const data = item.data;
68
+ if (data === null || typeof data !== 'object' || typeof data.file !== 'string') return null;
69
+ if (data.details && data.details.type === 'suite') return null;
70
+ return data.file;
71
+ }
72
+
73
+ /**
74
+ * One spelling for every ledger line: the real path. node reports a result's `file` already resolved
75
+ * through symlinks (macOS /var -> /private/var), while a zero-result child's only name is process.argv[1],
76
+ * as given, so without this the two kinds of line disagree on the same file. Best-effort: a path that cannot
77
+ * be resolved keeps its absolute spelling (analyzeChunkAccounting normalizes both sides again regardless).
78
+ */
79
+ function canonicalPath(file) {
80
+ const absolute = path.resolve(file);
81
+ try {
82
+ return fs.realpathSync.native(absolute);
83
+ } catch {
84
+ return absolute;
85
+ }
86
+ }
87
+
88
+ function install(ledgerPath,serializerPrototype = DefaultSerializer.prototype) {
89
+ const counts = new Map(); // file -> leaf results handed to the serializer
90
+
91
+ const original = serializerPrototype.writeValue;
92
+ serializerPrototype.writeValue = function writeValueCountingResults(value) {
93
+ try {
94
+ const file = resultFileOf(value);
95
+ if (file !== null) counts.set(file, (counts.get(file) || 0) + 1);
96
+ } catch {
97
+ // Counting must never change what is serialized.
98
+ }
99
+ return Reflect.apply(original, this, arguments);
100
+ };
101
+
102
+ process.on('exit', () => {
103
+ try {
104
+ // A child that produced no result still records itself (count 0), so the runner can tell
105
+ // "the preload ran and saw nothing" from "the preload never ran".
106
+ if (counts.size === 0 && process.argv[1]) counts.set(process.argv[1], 0);
107
+ const lines = [];
108
+ for (const [file, count] of counts) {
109
+ lines.push(JSON.stringify({ type: 'registered', file: canonicalPath(file), count }));
110
+ }
111
+ fs.appendFileSync(ledgerPath, `${lines.join('\n')}\n`);
112
+ } catch {
113
+ // Best-effort: the ledger is a diagnostic channel and must never change
114
+ // the exit status of the test file it observes.
115
+ }
116
+ });
117
+ }
118
+
119
+ /**
120
+ * Make the test-file child's stdout (the pipe its results travel to the `node --test` parent on)
121
+ * blocking, so every frame it wrote has reached the OS when the child exits.
122
+ *
123
+ * Why: the runner passes `--test-force-exit`, and node forwards it to each file child. A forced
124
+ * child calls process.exit() as soon as its root test ends; its stdout is a non-blocking pipe on
125
+ * POSIX, so frames still queued in the Socket are discarded and the parent never receives those
126
+ * results (nodejs/node#64833; the fix proposed there, nodejs/node#64875, does exactly this with
127
+ * `_handle.setBlocking(true)` at force-exit). Measured on Node 24.18 / Linux with 20 files x 300
128
+ * tests, `--test-force-exit --test-concurrency=8`: 5039-5139 of 6000 results reported without
129
+ * this, 6000 of 6000 with it (and 6000 without force-exit). Doing it at load time rather than at
130
+ * exit means nothing is ever queued. The Windows hang guard that force-exit exists for (#1051)
131
+ * is untouched. Best-effort: a stdout with no pipe handle (a file, a TTY) is left alone.
132
+ */
133
+ function blockChildStdout(stdout) {
134
+ try {
135
+ const target = stdout === undefined ? process.stdout : stdout;
136
+ const handle = target && target._handle;
137
+ if (handle && typeof handle.setBlocking === 'function') {
138
+ handle.setBlocking(true);
139
+ return true;
140
+ }
141
+ } catch {
142
+ // Never throw into the test file this observes.
143
+ }
144
+ return false;
145
+ }
146
+
147
+ // Inside a test-file child only (NODE_TEST_CONTEXT is set by `node --test` for those, not for the
148
+ // runner parent): the blocking stdout needs no ledger path; the ledger count needs one.
149
+ if (process.env.NODE_TEST_CONTEXT) {
150
+ blockChildStdout();
151
+ const ledgerPath = process.env.GSD_RUN_TESTS_LEDGER_FILE;
152
+ if (ledgerPath) install(ledgerPath);
153
+ }
154
+
155
+ module.exports = { install, resultFileOf, blockChildStdout };
@@ -0,0 +1,59 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+ const { isBuiltin } = require('node:module');
6
+ const { buildSync } = require('esbuild');
7
+
8
+ /** Rebuild locked upstream code without edits; installed trees need no node_modules. */
9
+ function buildVendorBundle(root, entry) {
10
+ const result = buildSync({
11
+ absWorkingDir: root,
12
+ entryPoints: [entry],
13
+ bundle: true,
14
+ platform: 'node',
15
+ format: 'cjs',
16
+ target: 'node24',
17
+ write: false,
18
+ metafile: true,
19
+ legalComments: 'inline',
20
+ banner: { js: '// Generated from locked npm dependencies by lint-vendored-deps.cjs --fix. Do not edit.' },
21
+ });
22
+ for (const output of Object.values(result.metafile.outputs)) {
23
+ for (const imported of output.imports) {
24
+ if (imported.external && !isBuiltin(imported.path)) {
25
+ throw new Error(`Vendor bundle has an external dependency: ${imported.path}`);
26
+ }
27
+ }
28
+ }
29
+ const packages = new Map();
30
+ for (const input of Object.keys(result.metafile.inputs)) {
31
+ let dir = path.dirname(path.resolve(root, input));
32
+ while (dir !== root && dir !== path.dirname(dir)) {
33
+ const manifest = path.join(dir, 'package.json');
34
+ if (fs.existsSync(manifest)) {
35
+ const pkg = JSON.parse(fs.readFileSync(manifest, 'utf8'));
36
+ if (pkg.name && pkg.version) {
37
+ const licenses = fs.readdirSync(dir).filter((name) => /^(licen[sc]e|copying|notice)(\.|$)/i.test(name)).sort();
38
+ // saxes 6.0.0 omits its LICENSE from npm; preserve the exact tagged
39
+ // upstream file (https://github.com/lddubeau/saxes/blob/v6.0.0/LICENSE).
40
+ const supplemental = path.join(__dirname, 'vendor-licenses', `${pkg.name}-${pkg.version}.txt`);
41
+ if (licenses.length === 0 && !fs.existsSync(supplemental)) throw new Error(`Missing upstream license: ${pkg.name}`);
42
+ packages.set(`${pkg.name}@${pkg.version}`, [
43
+ `${pkg.name}@${pkg.version} (package metadata: ${pkg.license})`,
44
+ ...licenses.map((name) => `${name}:\n${fs.readFileSync(path.join(dir, name), 'utf8')}`),
45
+ ...(licenses.length === 0 ? [fs.readFileSync(supplemental, 'utf8')] : []),
46
+ ].join('\n\n'));
47
+ break;
48
+ }
49
+ }
50
+ dir = path.dirname(dir);
51
+ }
52
+ }
53
+ return {
54
+ code: result.outputFiles[0].contents,
55
+ notices: Buffer.from([...packages.keys()].sort().map((name) => packages.get(name)).join('\n\n---\n\n') + '\n'),
56
+ };
57
+ }
58
+
59
+ module.exports = { buildVendorBundle };
@@ -0,0 +1,64 @@
1
+ The ISC License
2
+
3
+ Copyright (c) Contributors
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
15
+ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
+
17
+ ====
18
+
19
+ The following license is the one that governed sax, from which saxes
20
+ was forked. Isaac Schlueter is not *directly* involved with saxes so
21
+ don't go bugging him for saxes issues.
22
+
23
+ The ISC License
24
+
25
+ Copyright (c) Isaac Z. Schlueter and Contributors
26
+
27
+ Permission to use, copy, modify, and/or distribute this software for any
28
+ purpose with or without fee is hereby granted, provided that the above
29
+ copyright notice and this permission notice appear in all copies.
30
+
31
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
32
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
33
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
34
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
35
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
36
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
37
+ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
38
+
39
+ ====
40
+
41
+ `String.fromCodePoint` by Mathias Bynens is no longer used, but it can
42
+ still be found in old commits. It was once used according to terms of
43
+ MIT License, as follows:
44
+
45
+ Copyright Mathias Bynens <https://mathiasbynens.be/>
46
+
47
+ Permission is hereby granted, free of charge, to any person obtaining
48
+ a copy of this software and associated documentation files (the
49
+ "Software"), to deal in the Software without restriction, including
50
+ without limitation the rights to use, copy, modify, merge, publish,
51
+ distribute, sublicense, and/or sell copies of the Software, and to
52
+ permit persons to whom the Software is furnished to do so, subject to
53
+ the following conditions:
54
+
55
+ The above copyright notice and this permission notice shall be
56
+ included in all copies or substantial portions of the Software.
57
+
58
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
59
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
60
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
61
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
62
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
63
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
64
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,4 +1,4 @@
1
1
  {
2
- "maxSites": 84,
2
+ "maxSites": 64,
3
3
  "grace": 2
4
4
  }
@@ -1,3 +1,3 @@
1
1
  {
2
- "maxFiles": 283
2
+ "maxFiles": 284
3
3
  }
@@ -805,17 +805,17 @@ const OWNER_FILE = path.join('src', 'verification.cts');
805
805
  // one (the owner consumes plan counts, never the reverse). Left as its
806
806
  // own, differently-scoped answer, per design's "Rejected" list item 1.
807
807
  //
808
- // - `buildWorkstreamInventory` (src/workstream-inventory-builder.cts) — a
809
- // PURE, I/O-free projection (see the module's own header) over
810
- // PRE-COLLECTED `planCount`/`summaryCount`/`verificationStatus` inputs.
811
- // `summariesMeetPlans = summaryCount >= planCount && planCount > 0`
812
- // answers "are all plans summarized?" (combined with the caller-supplied
813
- // verification verdict for its own `status` projection) — it cannot call
808
+ // - `buildWorkstreamInventory` (src/workstream-inventory-builder.cts) —
809
+ // formerly exempted here (a PURE, I/O-free projection that hand-rolled
810
+ // `summaryCount >= planCount && planCount > 0` locally, unable to call
814
811
  // the I/O-bound `isPhaseComplete` without breaking its "No I/O. No
815
- // async." contract, and re-plumbing its callers to pass a pre-computed
816
- // `complete` boolean instead of raw counts is a larger architectural
817
- // change than this phase's declared 6 call sites. Declared deviation —
818
- // see the Phase 4 migration PR for the full reasoning.
812
+ // async." contract). #5060 (Phase Status Module, epic #5056) gave this
813
+ // exact "pure function over pre-collected facts" shape a real owner —
814
+ // `phaseStatusFromFacts` (`src/phase-status.cts`) — which is itself
815
+ // import-free at load time and does no I/O, so this function now calls
816
+ // it instead of re-deriving the comparison locally. The local textual
817
+ // shapes this guard matches are gone; the exemption entry was removed
818
+ // rather than left dead.
819
819
  //
820
820
  // - `buildPhaseCompletionProjection` (src/init.cts) — MIGRATED onto
821
821
  // `isPhaseComplete` for `phase_complete`/`verification_status` (shape
@@ -832,17 +832,17 @@ const OWNER_FILE = path.join('src', 'verification.cts');
832
832
  //
833
833
  // SHAPE (d) reuses this exact map (`findScanPhasePlansCompletedReadDrift`
834
834
  // takes the same `exemptFunctions` set every other shape's finder does). The
835
- // four entries above were entered for shapes (a)/(b)/(c); of them, only
835
+ // entries above were entered for shapes (a)/(b)/(c); of them, only
836
836
  // `scanPhasePlans` (src/plan-scan.cts) also legitimately reads its OWN
837
837
  // `completed` field for shape (d)'s purposes (building the return value it
838
838
  // itself defines — not a call-then-read of another `scanPhasePlans(`
839
- // invocation). `isPhaseComplete`, `buildWorkstreamInventory`, and
840
- // `buildPhaseCompletionProjection` do not read `.completed` off a
841
- // `scanPhasePlans(` call result at all (verified by direct inspection of
842
- // each function's body as of this guard's shape-(d) addition — they consume
843
- // `planCount`/`summaryCount`/`summaryFiles`, never `.completed`), so their
844
- // presence in this map exempts nothing NEW for shape (d); they are listed
845
- // here only because the map is shared. As of this addition, a whole-repo
839
+ // invocation). `isPhaseComplete` and `buildPhaseCompletionProjection` do not
840
+ // read `.completed` off a `scanPhasePlans(` call result at all (verified by
841
+ // direct inspection of each function's body as of this guard's shape-(d)
842
+ // addition — they consume `planCount`/`summaryCount`/`summaryFiles`, never
843
+ // `.completed`), so their presence in this map exempts nothing NEW for shape
844
+ // (d); they are listed here only because the map is shared. As of this
845
+ // addition, a whole-repo
846
846
  // scan found ZERO live shape-(d) sites needing a fresh exemption entry — the
847
847
  // one real instance this shape exists to catch (`cmdStateSync`,
848
848
  // src/state.cts) was fixed by routing through `isPhaseComplete` rather than
@@ -852,7 +852,6 @@ const OWNER_FILE = path.join('src', 'verification.cts');
852
852
  const FUNCTION_SCOPED_EXEMPTIONS = new Map([
853
853
  [OWNER_FILE, new Set(['isPhaseComplete'])],
854
854
  [path.join('src', 'plan-scan.cts'), new Set(['scanPhasePlans'])],
855
- [path.join('src', 'workstream-inventory-builder.cts'), new Set(['buildWorkstreamInventory'])],
856
855
  [path.join('src', 'init.cts'), new Set(['buildPhaseCompletionProjection'])],
857
856
  ]);
858
857
 
@@ -16,6 +16,9 @@
16
16
  const fs = require('fs');
17
17
  const path = require('path');
18
18
  const { ExitError, runMain } = require('./lib/cli-exit.cjs');
19
+ // The one frontmatter fence owner (src/frontmatter-fence.cts, built by build:lib).
20
+ // This dev-time script runs after the build (`npm run lint:descriptions`, the tests).
21
+ const { locateFrontmatterFence } = require('../gsd-core/bin/lib/frontmatter-fence.cjs');
19
22
 
20
23
  const MAX_LENGTH = 100;
21
24
  const COMMANDS_DIR = path.join(__dirname, '..', 'commands', 'gsd');
@@ -25,9 +28,10 @@ const COMMANDS_DIR = path.join(__dirname, '..', 'commands', 'gsd');
25
28
  * Returns null if no description is found.
26
29
  */
27
30
  function parseDescription(content) {
28
- const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
29
- if (!fmMatch) return null;
30
- const fm = fmMatch[1];
31
+ // The block is the one the one fence owner finds (found while implementing #5105).
32
+ const fence = locateFrontmatterFence(content);
33
+ if (!fence || !fence.closed) return null;
34
+ const fm = content.slice(fence.openEnd, fence.bodyEnd);
31
35
 
32
36
  const quoted = fm.match(/^description:\s+"((?:[^"\\]|\\.)*)"\s*$/m);
33
37
  if (quoted) return quoted[1];
@@ -68,6 +68,7 @@ const DOCS_GUARD_EXEMPT_BASELINE = [
68
68
  'lint-allow-test-rule-refs.test.cjs',
69
69
  'lint-docs-command-form.test.cjs',
70
70
  'lint-docs-required.test.cjs',
71
+ 'lint-retired-runtime-name.test.cjs',
71
72
  'manifest-version-sync.test.cjs',
72
73
  'milestone-archive.test.cjs',
73
74
  'model-resolver.test.cjs',
@@ -87,6 +88,7 @@ const DOCS_GUARD_EXEMPT_BASELINE = [
87
88
  'security-prompt-injection.security.test.cjs',
88
89
  'shipped-reference-cites.test.cjs',
89
90
  'state.test.cjs',
91
+ 'verification-status.test.cjs',
90
92
  'worktree-safety.test.cjs',
91
93
  ];
92
94
 
@@ -178,13 +180,39 @@ const DOCS_GUARD_EXEMPT_DOCS_PATHS = {
178
180
  'docs/COMMANDS.md', 'docs/USER-GUIDE.md', 'docs/adr', 'docs/adr/0001-foo.md', 'docs/adr/0099-new.md',
179
181
  'docs/agents', 'docs/agents/triage-labels.md',
180
182
  ],
183
+ // #4729: `writeFile('docs/...', ...)` calls WRITE fabricated fixture
184
+ // content into a throwaway mkdtemp repo; the file never reads real shipped
185
+ // docs/ content — every path here is fixture data for the guard under
186
+ // test.
187
+ // Re-confirmed: every path below is WRITTEN as fabricated fixture content
188
+ // into a throwaway mkdtemp repo; none reads real shipped docs. The a*/b*/c*/
189
+ // d* entries are the adversarial-regression fixtures (dialect-plus-runtime-
190
+ // word, adjacency laundering, version laundering, bare-marker abuse).
191
+ 'lint-retired-runtime-name.test.cjs': [
192
+ 'docs/adr', 'docs/adr/999-retired-runtime-record.md', 'docs/filler/note-',
193
+ 'docs/guides/a1.md', 'docs/guides/a2.md', 'docs/guides/b1.md',
194
+ 'docs/guides/b2.md', 'docs/guides/b3.md', 'docs/guides/c3.md',
195
+ 'docs/guides/c4.md', 'docs/guides/config-homes.md', 'docs/guides/d1.md',
196
+ 'docs/guides/hooks.md', 'docs/guides/one.md', 'docs/guides/runtime-claim.md',
197
+ 'docs/guides/setup.md', 'docs/history/migration-note.md',
198
+ 'docs/ja-JP/guides/runtimes.md', 'docs/pt-BR/guides/a3.md',
199
+ 'docs/pt-BR/guides/hooks.md', 'docs/pt-BR/guides/policy.md',
200
+ 'docs/reference/client-models.md', 'docs/reference/models.md',
201
+ 'docs/zh-CN/guides/a4.md', 'docs/zh-CN/reference/models.md',
202
+ ],
181
203
  'manifest-version-sync.test.cjs': [],
182
204
  // #3884: re-confirmed — the added docs/CLI-TOOLS.md:458 reference is the
183
205
  // same class as the existing docs/TESTING-SUITES.md one (a placement-note
184
206
  // / explanatory comment citing documented CLI behavior for context, never
185
207
  // a read target); the exemption's premise still holds for both.
186
208
  'milestone-archive.test.cjs': ['docs/CLI-TOOLS.md', 'docs/TESTING-SUITES.md'],
187
- 'model-resolver.test.cjs': ['docs/TESTING-SUITES.md'],
209
+ // #4505: additionally cites docs/features/dynamic-routing-with-failure-tier-escalation.md
210
+ // in explanatory comments, quoting the documented first-spawn contract the new rows
211
+ // assert against; the file never reads that (or any) docs/ file — every read it makes
212
+ // targets a tmpdir .planning fixture.
213
+ 'model-resolver.test.cjs': [
214
+ 'docs/TESTING-SUITES.md', 'docs/features/dynamic-routing-with-failure-tier-escalation.md',
215
+ ],
188
216
  'new-project-mvp-prompt.test.cjs': ['docs/CONFIGURATION.md'],
189
217
  'onboard-command.test.cjs': ['docs/adr/0001-runtime.md'],
190
218
  'opencode-command-dir-plural.test.cjs': ['docs/commands'],
@@ -209,6 +237,15 @@ const DOCS_GUARD_EXEMPT_DOCS_PATHS = {
209
237
  // #4186: the record-session usage-contract test cites the documented
210
238
  // signature in docs/CLI-TOOLS.md in its explanatory comment.
211
239
  'state.test.cjs': ['docs/CLI-TOOLS.md', 'docs/CONFIGURATION.md', 'docs/reference/state-md.md'],
240
+ // #5095: 'docs/VERIFICATION.md' is a tmpdir fixture basename (proving the
241
+ // report-shaped filter matches basename, not full path); 'docs/planning'
242
+ // and its two nested PLAN/SUMMARY children are an in-repo `.planning ->
243
+ // docs/planning` symlink-alias fixture. All are WRITTEN into a throwaway
244
+ // mkdtemp/createTempGitProject tree; none reads real shipped docs/ content.
245
+ 'verification-status.test.cjs': [
246
+ 'docs/VERIFICATION.md', 'docs/planning', 'docs/planning/phases',
247
+ 'docs/planning/phases/01-foo/01-01-PLAN.md', 'docs/planning/phases/01-foo/01-01-SUMMARY.md',
248
+ ],
212
249
  'worktree-safety.test.cjs': ['docs/SUMMARY.md'],
213
250
  };
214
251