@opengsd/gsd-core 1.9.1 → 1.11.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 (426) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +2 -3
  3. package/.opencode/plugins/gsd-core.js +8 -1
  4. package/agents/gsd-code-fixer.md +27 -3
  5. package/agents/gsd-debug-session-manager.md +11 -0
  6. package/agents/gsd-debugger.md +12 -246
  7. package/agents/gsd-doc-synthesizer.md +2 -4
  8. package/agents/gsd-executor.md +12 -10
  9. package/agents/gsd-integration-checker.md +3 -0
  10. package/agents/gsd-mempalace-curator.md +5 -2
  11. package/agents/gsd-phase-researcher.md +20 -1
  12. package/agents/gsd-plan-checker.md +46 -0
  13. package/agents/gsd-planner.md +49 -54
  14. package/agents/gsd-roadmapper.md +21 -3
  15. package/agents/gsd-user-profiler.md +3 -0
  16. package/agents/gsd-verifier.md +26 -73
  17. package/bin/install.js +1272 -1238
  18. package/bin/lib/ui-safety-gate.cjs +2 -0
  19. package/commands/gsd/code-review.md +1 -1
  20. package/commands/gsd/execute-phase.md +1 -1
  21. package/commands/gsd/map-codebase.md +1 -1
  22. package/commands/gsd/mempalace-capture.md +2 -2
  23. package/commands/gsd/mempalace-recall.md +1 -1
  24. package/commands/gsd/new-milestone.md +2 -2
  25. package/commands/gsd/plan-phase.md +1 -1
  26. package/commands/gsd/quick.md +1 -1
  27. package/commands/gsd/review-backlog.md +2 -1
  28. package/commands/gsd/verify-work.md +1 -1
  29. package/gsd-core/bin/gsd-tools.cjs +1009 -115
  30. package/gsd-core/bin/lib/active-workstream-store.cjs +153 -12
  31. package/gsd-core/bin/lib/agent-install-check.cjs +268 -38
  32. package/gsd-core/bin/lib/api-coverage.cjs +123 -5
  33. package/gsd-core/bin/lib/artifacts.cjs +3 -0
  34. package/gsd-core/bin/lib/assumption-delta.cjs +2 -4
  35. package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
  36. package/gsd-core/bin/lib/audit.cjs +926 -202
  37. package/gsd-core/bin/lib/broken-windows.cjs +36 -6
  38. package/gsd-core/bin/lib/capability-consent.cjs +149 -15
  39. package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
  40. package/gsd-core/bin/lib/capability-registry.cjs +608 -148
  41. package/gsd-core/bin/lib/capability-source.cjs +92 -0
  42. package/gsd-core/bin/lib/capability-trust.cjs +444 -25
  43. package/gsd-core/bin/lib/capability-validator.cjs +507 -24
  44. package/gsd-core/bin/lib/capability-writer.cjs +3 -2
  45. package/gsd-core/bin/lib/check-command-router.cjs +114 -38
  46. package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
  47. package/gsd-core/bin/lib/codex-agent-toml.cjs +329 -0
  48. package/gsd-core/bin/lib/command-aliases.cjs +94 -0
  49. package/gsd-core/bin/lib/command-roster.cjs +44 -1
  50. package/gsd-core/bin/lib/commands.cjs +665 -99
  51. package/gsd-core/bin/lib/commonjs-marker.cjs +142 -0
  52. package/gsd-core/bin/lib/complexity-trigger.cjs +1172 -0
  53. package/gsd-core/bin/lib/config-loader.cjs +76 -0
  54. package/gsd-core/bin/lib/config.cjs +22 -2
  55. package/gsd-core/bin/lib/context-composer.cjs +278 -0
  56. package/gsd-core/bin/lib/context-predicates.cjs +506 -0
  57. package/gsd-core/bin/lib/core-utils.cjs +217 -40
  58. package/gsd-core/bin/lib/decisions.cjs +23 -0
  59. package/gsd-core/bin/lib/docs.cjs +3 -2
  60. package/gsd-core/bin/lib/external-job.cjs +19 -4
  61. package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
  62. package/gsd-core/bin/lib/frontmatter.cjs +239 -32
  63. package/gsd-core/bin/lib/gap-checker.cjs +68 -7
  64. package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
  65. package/gsd-core/bin/lib/git-base-branch.cjs +160 -15
  66. package/gsd-core/bin/lib/graphify.cjs +142 -27
  67. package/gsd-core/bin/lib/gsd2-import.cjs +37 -5
  68. package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
  69. package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
  70. package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +145 -0
  71. package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
  72. package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
  73. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
  74. package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +265 -0
  75. package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
  76. package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
  77. package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +173 -0
  78. package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
  79. package/gsd-core/bin/lib/health-diagnostic.cjs +431 -0
  80. package/gsd-core/bin/lib/host-integration.cjs +13 -1
  81. package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
  82. package/gsd-core/bin/lib/init-command-router.cjs +83 -8
  83. package/gsd-core/bin/lib/init.cjs +1325 -169
  84. package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
  85. package/gsd-core/bin/lib/install-engine.cjs +805 -264
  86. package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
  87. package/gsd-core/bin/lib/install-model-override-resolver.cjs +203 -0
  88. package/gsd-core/bin/lib/install-profiles.cjs +160 -57
  89. package/gsd-core/bin/lib/install-scope.cjs +270 -0
  90. package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
  91. package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
  92. package/gsd-core/bin/lib/installer-migration-authoring.cjs +3 -1
  93. package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
  94. package/gsd-core/bin/lib/installer-migrations/007-retire-config-root-commonjs-marker.cjs +149 -0
  95. package/gsd-core/bin/lib/installer-migrations/008-cursor-retire-commands-surface.cjs +55 -0
  96. package/gsd-core/bin/lib/installer-migrations/009-pi-retire-reserved-hooks-dir.cjs +199 -0
  97. package/gsd-core/bin/lib/installer-migrations.cjs +206 -13
  98. package/gsd-core/bin/lib/io.cjs +38 -3
  99. package/gsd-core/bin/lib/markdown-sectionizer.cjs +8 -1
  100. package/gsd-core/bin/lib/markdown-table.cjs +133 -20
  101. package/gsd-core/bin/lib/mcp-catalog.cjs +518 -0
  102. package/gsd-core/bin/lib/mcp-server.cjs +135 -3
  103. package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
  104. package/gsd-core/bin/lib/milestone.cjs +821 -109
  105. package/gsd-core/bin/lib/model-catalog.cjs +59 -1
  106. package/gsd-core/bin/lib/model-resolver.cjs +183 -40
  107. package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
  108. package/gsd-core/bin/lib/pattern.cjs +122 -0
  109. package/gsd-core/bin/lib/phase-estimation.cjs +1 -1
  110. package/gsd-core/bin/lib/phase-id.cjs +507 -36
  111. package/gsd-core/bin/lib/phase-lifecycle.cjs +28 -3
  112. package/gsd-core/bin/lib/phase-locator.cjs +258 -58
  113. package/gsd-core/bin/lib/phase.cjs +891 -156
  114. package/gsd-core/bin/lib/plan-dependency-graph.cjs +303 -0
  115. package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
  116. package/gsd-core/bin/lib/plan-scan.cjs +86 -2
  117. package/gsd-core/bin/lib/planning-scope.cjs +31 -0
  118. package/gsd-core/bin/lib/planning-snapshot.cjs +890 -0
  119. package/gsd-core/bin/lib/planning-workspace.cjs +60 -6
  120. package/gsd-core/bin/lib/probe-core.cjs +1 -1
  121. package/gsd-core/bin/lib/profile-output.cjs +1 -1
  122. package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
  123. package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +740 -0
  124. package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +85 -0
  125. package/gsd-core/bin/lib/review-lane-descriptor.cjs +108 -0
  126. package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
  127. package/gsd-core/bin/lib/review-lane-runner.cjs +447 -68
  128. package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
  129. package/gsd-core/bin/lib/roadmap-command-router.cjs +76 -9
  130. package/gsd-core/bin/lib/roadmap-parser.cjs +1035 -194
  131. package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
  132. package/gsd-core/bin/lib/roadmap.cjs +405 -84
  133. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +795 -100
  134. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
  135. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +440 -57
  136. package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
  137. package/gsd-core/bin/lib/runtime-homes.cjs +220 -41
  138. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +220 -44
  139. package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
  140. package/gsd-core/bin/lib/runtime-slash.cjs +27 -9
  141. package/gsd-core/bin/lib/section-manifest.cjs +209 -0
  142. package/gsd-core/bin/lib/security.cjs +104 -5
  143. package/gsd-core/bin/lib/shell-command-projection.cjs +388 -30
  144. package/gsd-core/bin/lib/smart-entry.cjs +154 -22
  145. package/gsd-core/bin/lib/state-command-router.cjs +5 -1
  146. package/gsd-core/bin/lib/state-document.cjs +152 -8
  147. package/gsd-core/bin/lib/state-transition.cjs +424 -105
  148. package/gsd-core/bin/lib/state.cjs +1927 -401
  149. package/gsd-core/bin/lib/surface.cjs +35 -10
  150. package/gsd-core/bin/lib/text-lines.cjs +80 -0
  151. package/gsd-core/bin/lib/token-scanner.cjs +76 -0
  152. package/gsd-core/bin/lib/uat-predicate.cjs +20 -4
  153. package/gsd-core/bin/lib/uat.cjs +706 -64
  154. package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
  155. package/gsd-core/bin/lib/ui-safety-gate.cjs +14 -5
  156. package/gsd-core/bin/lib/unusable-input.cjs +33 -0
  157. package/gsd-core/bin/lib/update-context.cjs +8 -2
  158. package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
  159. package/gsd-core/bin/lib/validate.cjs +20 -6
  160. package/gsd-core/bin/lib/vendor/README.md +37 -0
  161. package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
  162. package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
  163. package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
  164. package/gsd-core/bin/lib/verification.cjs +287 -20
  165. package/gsd-core/bin/lib/verify.cjs +368 -880
  166. package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
  167. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +203 -19
  168. package/gsd-core/bin/lib/workstream-inventory.cjs +576 -31
  169. package/gsd-core/bin/lib/workstream.cjs +8 -2
  170. package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
  171. package/gsd-core/bin/lib/worktree-safety.cjs +450 -125
  172. package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
  173. package/gsd-core/bin/shared/config-schema.manifest.json +9 -1
  174. package/gsd-core/references/agent-contracts.md +43 -26
  175. package/gsd-core/references/artifact-types.md +10 -3
  176. package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
  177. package/gsd-core/references/checkpoints.md +2 -2
  178. package/gsd-core/references/context-budget.md +1 -1
  179. package/gsd-core/references/debugger-techniques.md +255 -0
  180. package/gsd-core/references/dispatch-isolation-gate.md +138 -0
  181. package/gsd-core/references/doc-conflict-engine.md +1 -1
  182. package/gsd-core/references/execute-mvp-tdd.md +3 -3
  183. package/gsd-core/references/execute-phase-between-wave-reset.md +6 -2
  184. package/gsd-core/references/execute-phase-context-guard.md +1 -1
  185. package/gsd-core/references/execute-phase-response-language.md +1 -1
  186. package/gsd-core/references/execute-phase-wave-guard.md +6 -2
  187. package/gsd-core/references/gate-prompts.md +1 -1
  188. package/gsd-core/references/git-planning-commit.md +2 -1
  189. package/gsd-core/references/loop-hook-dispatch.md +39 -2
  190. package/gsd-core/references/model-profiles.md +12 -4
  191. package/gsd-core/references/mvp-concepts.md +9 -9
  192. package/gsd-core/references/planner-guidance.md +3 -9
  193. package/gsd-core/references/planner-preconditions.md +1 -1
  194. package/gsd-core/references/planner-reviews.md +1 -1
  195. package/gsd-core/references/planning-config.md +8 -6
  196. package/gsd-core/references/research-documentation-lookup.md +5 -3
  197. package/gsd-core/references/revision-loop.md +1 -1
  198. package/gsd-core/references/specless-probe-fallback.md +8 -7
  199. package/gsd-core/references/universal-anti-patterns.md +3 -3
  200. package/gsd-core/references/verifier-phase-gates.md +192 -0
  201. package/gsd-core/references/verifier-wiring-patterns.md +100 -0
  202. package/gsd-core/references/verify-mvp-mode.md +1 -1
  203. package/gsd-core/references/workstream-flag.md +22 -6
  204. package/gsd-core/references/worktree-branch-check.md +2 -2
  205. package/gsd-core/templates/discussion-log.md +1 -1
  206. package/gsd-core/templates/phase-prompt.md +2 -4
  207. package/gsd-core/templates/state.md +4 -4
  208. package/gsd-core/templates/summary-complex.md +2 -0
  209. package/gsd-core/templates/summary-minimal.md +2 -0
  210. package/gsd-core/templates/summary-standard.md +2 -0
  211. package/gsd-core/templates/summary.md +2 -0
  212. package/gsd-core/templates/verification-report.md +9 -1
  213. package/gsd-core/workflows/ai-integration-phase.md +9 -11
  214. package/gsd-core/workflows/audit-milestone.md +3 -0
  215. package/gsd-core/workflows/autonomous/steps/converge-banner.md +1 -0
  216. package/gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md +11 -0
  217. package/gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md +7 -0
  218. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +21 -0
  219. package/gsd-core/workflows/autonomous/steps/converge-loop.md +7 -0
  220. package/gsd-core/workflows/autonomous.md +33 -70
  221. package/gsd-core/workflows/cleanup.md +62 -3
  222. package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
  223. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +93 -0
  224. package/gsd-core/workflows/code-review-fix.md +37 -10
  225. package/gsd-core/workflows/code-review.md +74 -166
  226. package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
  227. package/gsd-core/workflows/complete-milestone.md +160 -95
  228. package/gsd-core/workflows/debug.md +16 -17
  229. package/gsd-core/workflows/diagnose-issues.md +56 -8
  230. package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -1
  231. package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
  232. package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
  233. package/gsd-core/workflows/discuss-phase-assumptions.md +7 -17
  234. package/gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md +51 -0
  235. package/gsd-core/workflows/docs-update.md +8 -51
  236. package/gsd-core/workflows/edit-phase.md +26 -1
  237. package/gsd-core/workflows/eval-review.md +3 -5
  238. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +64 -7
  239. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +50 -0
  240. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +31 -0
  241. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +77 -0
  242. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +21 -0
  243. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +42 -0
  244. package/gsd-core/workflows/execute-phase/steps/regression-gate.md +43 -37
  245. package/gsd-core/workflows/execute-phase.md +103 -187
  246. package/gsd-core/workflows/execute-plan.md +36 -4
  247. package/gsd-core/workflows/explore.md +131 -4
  248. package/gsd-core/workflows/fast.md +10 -2
  249. package/gsd-core/workflows/health.md +73 -4
  250. package/gsd-core/workflows/help/modes/full.md +6 -1
  251. package/gsd-core/workflows/import.md +4 -4
  252. package/gsd-core/workflows/ingest-docs.md +7 -6
  253. package/gsd-core/workflows/mvp-phase.md +6 -3
  254. package/gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md +16 -0
  255. package/gsd-core/workflows/new-milestone/steps/reset-phase-safety.md +19 -0
  256. package/gsd-core/workflows/new-milestone.md +35 -47
  257. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +176 -0
  258. package/gsd-core/workflows/new-project/steps/auto-mode-detection.md +32 -0
  259. package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +18 -0
  260. package/gsd-core/workflows/new-project.md +27 -240
  261. package/gsd-core/workflows/next.md +12 -0
  262. package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +15 -0
  263. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +110 -0
  264. package/gsd-core/workflows/plan-phase/steps/prd-express-gate.md +8 -0
  265. package/gsd-core/workflows/plan-phase/steps/research-only-early-exit.md +17 -0
  266. package/gsd-core/workflows/plan-phase/steps/research-only-modifiers.md +16 -0
  267. package/gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md +17 -0
  268. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +149 -0
  269. package/gsd-core/workflows/plan-phase.md +89 -209
  270. package/gsd-core/workflows/plan-review-convergence.md +50 -2
  271. package/gsd-core/workflows/progress/steps/forensic-audit.md +125 -0
  272. package/gsd-core/workflows/progress/steps/mvp-display.md +18 -0
  273. package/gsd-core/workflows/progress.md +45 -159
  274. package/gsd-core/workflows/quick/steps/discussion-phase.md +124 -0
  275. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +111 -0
  276. package/gsd-core/workflows/quick/steps/quick-verification.md +67 -0
  277. package/gsd-core/workflows/quick/steps/research-phase.md +72 -0
  278. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +37 -0
  279. package/gsd-core/workflows/quick.md +55 -405
  280. package/gsd-core/workflows/resume-project.md +3 -0
  281. package/gsd-core/workflows/review/steps/reviewer-instances-note-1.md +4 -0
  282. package/gsd-core/workflows/review/steps/reviewer-instances-note-2.md +3 -0
  283. package/gsd-core/workflows/review.md +41 -13
  284. package/gsd-core/workflows/section-manifest.json +219 -0
  285. package/gsd-core/workflows/secure-phase.md +1 -1
  286. package/gsd-core/workflows/session-report.md +2 -1
  287. package/gsd-core/workflows/settings.md +66 -2
  288. package/gsd-core/workflows/ship.md +104 -44
  289. package/gsd-core/workflows/sketch.md +1 -1
  290. package/gsd-core/workflows/spec-phase.md +41 -20
  291. package/gsd-core/workflows/spike-wrap-up.md +20 -5
  292. package/gsd-core/workflows/spike.md +50 -16
  293. package/gsd-core/workflows/sync-skills.md +106 -13
  294. package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
  295. package/gsd-core/workflows/transition.md +53 -31
  296. package/gsd-core/workflows/ui-phase.md +13 -12
  297. package/gsd-core/workflows/ui-review.md +2 -2
  298. package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
  299. package/gsd-core/workflows/update.md +19 -8
  300. package/gsd-core/workflows/validate-phase.md +1 -1
  301. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +36 -0
  302. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +21 -0
  303. package/gsd-core/workflows/verify-work.md +17 -65
  304. package/hooks/dist/gsd-agent-isolation-guard.js +517 -0
  305. package/hooks/dist/gsd-check-update-worker.js +64 -12
  306. package/hooks/dist/gsd-check-update.js +19 -1
  307. package/hooks/dist/gsd-cursor-pre-tool.js +0 -3
  308. package/hooks/dist/gsd-cursor-subagent-start.js +607 -26
  309. package/hooks/dist/gsd-cursor-subagent-stop.js +3 -2
  310. package/hooks/dist/gsd-prompt-guard.js +21 -20
  311. package/hooks/dist/gsd-read-injection-scanner.js +45 -24
  312. package/hooks/dist/gsd-statusline.js +90 -6
  313. package/hooks/dist/gsd-update-banner.js +22 -1
  314. package/hooks/dist/gsd-workflow-guard.js +134 -36
  315. package/hooks/dist/gsd-worktree-path-guard.js +2 -1
  316. package/hooks/dist/gsd-write-guard.js +359 -0
  317. package/hooks/dist/lib/git-cmd.js +92 -59
  318. package/hooks/dist/lib/injection-patterns.js +45 -0
  319. package/hooks/dist/lib/isolation-deny-reason.js +39 -0
  320. package/hooks/dist/lib/isolation-sentinel.js +277 -0
  321. package/hooks/dist/managed-hooks-registry.cjs +2 -0
  322. package/hooks/gsd-agent-isolation-guard.js +517 -0
  323. package/hooks/gsd-check-update-worker.js +64 -12
  324. package/hooks/gsd-check-update.js +19 -1
  325. package/hooks/gsd-cursor-pre-tool.js +0 -3
  326. package/hooks/gsd-cursor-subagent-start.js +607 -26
  327. package/hooks/gsd-cursor-subagent-stop.js +3 -2
  328. package/hooks/gsd-prompt-guard.js +21 -20
  329. package/hooks/gsd-read-injection-scanner.js +45 -24
  330. package/hooks/gsd-statusline.js +90 -6
  331. package/hooks/gsd-update-banner.js +22 -1
  332. package/hooks/gsd-workflow-guard.js +134 -36
  333. package/hooks/gsd-worktree-path-guard.js +2 -1
  334. package/hooks/gsd-write-guard.js +359 -0
  335. package/hooks/hooks.json +12 -0
  336. package/hooks/lib/git-cmd.js +92 -59
  337. package/hooks/lib/injection-patterns.js +45 -0
  338. package/hooks/lib/isolation-deny-reason.js +39 -0
  339. package/hooks/lib/isolation-sentinel.js +277 -0
  340. package/hooks/managed-hooks-registry.cjs +2 -0
  341. package/package.json +31 -10
  342. package/pi/gsd.cjs +71 -12
  343. package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
  344. package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
  345. package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
  346. package/scripts/build-hooks.js +9 -0
  347. package/scripts/changeset/lint.cjs +68 -6
  348. package/scripts/changeset/serialize.cjs +5 -1
  349. package/scripts/check-alias-drift.cjs +7 -43
  350. package/scripts/check-contract-drift.cjs +297 -0
  351. package/scripts/ci-test-scope.cjs +19 -2
  352. package/scripts/command-contract-helpers.cjs +903 -1
  353. package/scripts/gen-adr-index.cjs +728 -38
  354. package/scripts/gen-capability-matrix.cjs +1 -1
  355. package/scripts/gen-capability-registry.cjs +3 -15
  356. package/scripts/gen-context-index.cjs +439 -0
  357. package/scripts/gen-health-docs.cjs +390 -0
  358. package/scripts/gen-inventory-manifest.cjs +150 -4
  359. package/scripts/gen-loop-host-contract.cjs +4 -24
  360. package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
  361. package/scripts/gen-registry.cjs +3 -14
  362. package/scripts/gen-section-manifest.cjs +638 -0
  363. package/scripts/generate-package-identity.cjs +4 -2
  364. package/scripts/lib/alias-drift-families.cjs +46 -0
  365. package/scripts/lib/drift-scan.cjs +278 -0
  366. package/scripts/lint-allow-test-rule-refs.allowlist.json +15 -54
  367. package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
  368. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
  369. package/scripts/lint-canary-version-leak.cjs +73 -0
  370. package/scripts/lint-command-contract.cjs +96 -13
  371. package/scripts/lint-compiled-artifact-sync.cjs +6 -1
  372. package/scripts/lint-completion-predicate-drift.cjs +933 -0
  373. package/scripts/lint-completion-ratio-drift.cjs +214 -0
  374. package/scripts/lint-default-flip-documentation.cjs +193 -0
  375. package/scripts/lint-docs-command-form.cjs +195 -0
  376. package/scripts/lint-docs-required.cjs +9 -1
  377. package/scripts/lint-emitted-drift-ack.cjs +215 -20
  378. package/scripts/lint-eslint-glob-coverage.allowlist.json +34 -0
  379. package/scripts/lint-eslint-glob-coverage.cjs +340 -0
  380. package/scripts/lint-example-parser-parity.cjs +395 -0
  381. package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
  382. package/scripts/lint-health-diagnostic-rule-table.cjs +404 -0
  383. package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
  384. package/scripts/lint-milestone-window-drift.cjs +468 -0
  385. package/scripts/lint-phase-enumeration-drift.cjs +479 -0
  386. package/scripts/lint-plan-count-drift.cjs +318 -0
  387. package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
  388. package/scripts/lint-planning-prompt-drift.cjs +434 -0
  389. package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
  390. package/scripts/lint-regression-test-names.cjs +15 -13
  391. package/scripts/lint-removed-but-needed.cjs +320 -0
  392. package/scripts/lint-state-field-drift.cjs +805 -0
  393. package/scripts/lint-state-write-path-drift.cjs +1045 -0
  394. package/scripts/lint-test-file-count.allowlist.json +40 -3
  395. package/scripts/lint-unreachable-guard-drift.cjs +843 -0
  396. package/scripts/lint-vendored-deps.cjs +124 -0
  397. package/scripts/mutation-matrix.cjs +13 -0
  398. package/scripts/pr-changed-files.cjs +63 -0
  399. package/scripts/pr-template-policy.cjs +14 -4
  400. package/scripts/prompt-injection-scan.sh +52 -6
  401. package/scripts/require-issue-link-policy.cjs +192 -0
  402. package/scripts/state-write-path-drift-baseline.json +19 -0
  403. package/scripts/sync-runtime-launcher.cjs +2 -4
  404. package/skills/gsd-autonomous/SKILL.md +0 -1
  405. package/skills/gsd-code-review/SKILL.md +1 -1
  406. package/skills/gsd-execute-phase/SKILL.md +1 -2
  407. package/skills/gsd-map-codebase/SKILL.md +1 -1
  408. package/skills/gsd-mempalace-capture/SKILL.md +2 -2
  409. package/skills/gsd-mempalace-recall/SKILL.md +1 -1
  410. package/skills/gsd-new-milestone/SKILL.md +2 -2
  411. package/skills/gsd-next/SKILL.md +0 -1
  412. package/skills/gsd-plan-phase/SKILL.md +1 -2
  413. package/skills/gsd-progress/SKILL.md +0 -1
  414. package/skills/gsd-quick/SKILL.md +1 -1
  415. package/skills/gsd-review-backlog/SKILL.md +2 -1
  416. package/skills/gsd-stats/SKILL.md +0 -1
  417. package/skills/gsd-verify-work/SKILL.md +1 -1
  418. package/vscode/package.json +1 -1
  419. package/gsd-core/workflows/discovery-phase.md +0 -298
  420. package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
  421. package/gsd-core/workflows/verify-phase.md +0 -577
  422. package/scripts/affected-tests-lib.cjs +0 -554
  423. package/scripts/gen-emitted-baseline.cjs +0 -145
  424. package/scripts/lint-allow-test-rule-refs.cjs +0 -162
  425. package/scripts/run-affected-tests.cjs +0 -7
  426. package/scripts/run-tests.cjs +0 -1050
@@ -210,6 +210,42 @@ issue:
210
210
  fix_hint: "Plan 02 depends on 03, but 03 depends on 02"
211
211
  ```
212
212
 
213
+ ## Dimension 3b: Undeclared / Temporal Coupling
214
+
215
+ **Question:** Do two same-wave plans depend on each other through shared mutable state or
216
+ execution order without declaring it? Dimension 3 checks *declared* edges and the wave guard
217
+ checks `files_modified` overlap; neither sees an undeclared edge, which under parallel
218
+ execution becomes an intermittent failure nobody can attribute.
219
+
220
+ **Scope: PLAN pairs, not tasks.** Tasks inside one plan run sequentially and cannot race.
221
+ Compare same-wave plan pairs over the union of their tasks' `<files>` and `<action>`.
222
+
223
+ **FLAG only when ALL THREE hold** (coupling that is strong *and* non-local — Connascence of
224
+ Execution; strong-but-local coupling inside one plan is fine):
225
+ 1. both plans sit in the same wave, and
226
+ 2. neither declares `depends_on` on the other, and
227
+ 3. their actions name a *specific* shared mutable resource (config key, table/row, migration,
228
+ env var, singleton, cache) with at least one WRITER, or one names a prerequisite the other
229
+ produces.
230
+
231
+ **Do NOT flag:** both sides only READ it, or it is immutable; the pair already overlaps in
232
+ `files_modified` (report that once, on the file axis); the plans sit in a different wave, which
233
+ already orders them; two tasks inside one plan; a vague same-subsystem claim naming no
234
+ resource; incompatible *transformations* of one entity — that is Dimension 9.
235
+
236
+ **Severity: ALWAYS WARNING, never a blocker.** Coupling is sometimes intentional; the finding
237
+ lets the planner declare the edge, move a plan to a later wave, or justify the pair.
238
+
239
+ ```yaml
240
+ issue:
241
+ dimension: dependency_correctness
242
+ severity: warning
243
+ description: "Plans 02 and 03 are both Wave 1 with no depends_on, but 02 writes config key
244
+ auth.session_ttl and 03 reads it"
245
+ plans: ["02", "03"]
246
+ fix_hint: "Declare depends_on, move 03 to a later wave, or justify either order"
247
+ ```
248
+
213
249
  ## Dimension 4: Key Links Planned
214
250
 
215
251
  **Question:** Are artifacts wired together, not just created in isolation?
@@ -714,6 +750,9 @@ Extract from init JSON: `phase_dir`, `phase_number`, `has_plans`, `plan_count`.
714
750
  Orchestrator provides CONTEXT.md content in the verification prompt. If provided, parse for locked decisions, discretion areas, deferred ideas.
715
751
 
716
752
  ```bash
753
+ # #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
754
+ shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
755
+
717
756
  gsd_run query phase.list-plans "$phase_number"
718
757
  # Research / brief artifacts (deterministic listing)
719
758
  gsd_run query phase.list-artifacts "$phase_number" --type research
@@ -735,6 +774,9 @@ done
735
774
  Use `gsd-tools query` to validate plan structure:
736
775
 
737
776
  ```bash
777
+ # #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
778
+ shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
779
+
738
780
  for plan in "$PHASE_DIR"/*-PLAN.md; do
739
781
  echo "=== $plan ==="
740
782
  PLAN_STRUCTURE=$(gsd_run query verify.plan-structure "$plan")
@@ -820,6 +862,9 @@ Inspect `tasks` in the JSON; open the PLAN in the editor for prose-level review.
820
862
  ## Step 6: Verify Dependency Graph
821
863
 
822
864
  ```bash
865
+ # #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
866
+ shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
867
+
823
868
  for plan in "$PHASE_DIR"/*-PLAN.md; do
824
869
  grep "depends_on:" "$plan"
825
870
  done
@@ -1027,6 +1072,7 @@ Plan verification complete when:
1027
1072
  - [ ] Requirement coverage checked (all requirements have tasks)
1028
1073
  - [ ] Task completeness validated (all required fields present)
1029
1074
  - [ ] Dependency graph verified (no cycles, valid references)
1075
+ - [ ] Undeclared/temporal coupling checked (same-wave plan pairs, advisory)
1030
1076
  - [ ] Key links checked (wiring planned, not just artifacts)
1031
1077
  - [ ] Scope assessed (within context budget)
1032
1078
  - [ ] must_haves derivation verified (user-observable truths)
@@ -374,7 +374,7 @@ Output: [Artifacts created]
374
374
  |-----------|----------|-----------|----------|-------------|-----------------|
375
375
  | T-{phase}-01 | {S/T/R/I/D/E} | {function/endpoint/file} | {critical\|high\|medium\|low} | mitigate | {specific mitigation action} |
376
376
  | T-{phase}-02 | {category} | {component} | low | accept | {rationale for acceptance} |
377
- | T-{phase}-SC | Tampering | npm/pip/cargo installs | high | mitigate | slopcheck + blocking human checkpoint for [ASSUMED]/[SUS] |
377
+ | T-{phase}-SC | Tampering | npm/pip/cargo installs | high | mitigate | package-legitimacy gate + blocking human checkpoint for [ASSUMED]/[SUS] |
378
378
  </threat_model>
379
379
 
380
380
  <verification>
@@ -485,47 +485,7 @@ See @~/.claude/gsd-core/references/planner-guidance.md for a worked example and
485
485
 
486
486
  ## Checkpoint Types
487
487
 
488
- **checkpoint:human-verify (90% of checkpoints)**
489
- Human confirms Claude's automated work works correctly.
490
-
491
- Use for: Visual UI checks, interactive flows, functional verification, animation/accessibility.
492
-
493
- ```xml
494
- <task type="checkpoint:human-verify" gate="blocking">
495
- <what-built>[What Claude automated]</what-built>
496
- <how-to-verify>
497
- [Exact steps to test - URLs, commands, expected behavior]
498
- </how-to-verify>
499
- <resume-signal>Type "approved" or describe issues</resume-signal>
500
- </task>
501
- ```
502
-
503
- **checkpoint:decision (9% of checkpoints)**
504
- Human makes implementation choice affecting direction.
505
-
506
- Use for: Technology selection, architecture decisions, design choices.
507
-
508
- ```xml
509
- <task type="checkpoint:decision" gate="blocking">
510
- <decision>[What's being decided]</decision>
511
- <context>[Why this matters]</context>
512
- <options>
513
- <option id="option-a">
514
- <name>[Name]</name>
515
- <pros>[Benefits]</pros>
516
- <cons>[Tradeoffs]</cons>
517
- </option>
518
- </options>
519
- <resume-signal>Select: option-a, option-b, or ...</resume-signal>
520
- </task>
521
- ```
522
-
523
- **checkpoint:human-action (1% - rare)**
524
- Action has NO CLI/API and requires human-only interaction.
525
-
526
- Use ONLY for: Email verification links, SMS 2FA codes, manual account approvals, credit card 3D Secure flows.
527
-
528
- Do NOT use for: Deploying (use CLI), creating webhooks (use API), creating databases (use provider CLI), running builds/tests (use Bash), creating files (use Write).
488
+ Three types: **checkpoint:human-verify (90%)**, **checkpoint:decision (9%)**, **checkpoint:human-action (1% - rare)**. Full "use for" criteria and XML templates for each: @~/.claude/gsd-core/references/checkpoints.md
529
489
 
530
490
  ## Authentication Gates
531
491
 
@@ -696,7 +656,8 @@ Select top 2-4 phases. Skip phases with no relevance signal.
696
656
 
697
657
  **Step 3 — Read full SUMMARYs for selected phases:**
698
658
  ```bash
699
- cat .planning/phases/{selected-phase}/*-SUMMARY.md
659
+ _SUMMARIES=( .planning/phases/{selected-phase}/*-SUMMARY.md )
660
+ if [ -e "${_SUMMARIES[0]}" ]; then cat "${_SUMMARIES[@]}"; fi
700
661
  ```
701
662
 
702
663
  From full SUMMARYs extract:
@@ -733,9 +694,12 @@ If `features.global_learnings` is `true`: run `gsd_run query learnings.query --t
733
694
  Use `phase_dir` from init context (already loaded in load_project_state).
734
695
 
735
696
  ```bash
736
- cat "$phase_dir"/*-CONTEXT.md 2>/dev/null # From /gsd:discuss-phase
737
- cat "$phase_dir"/*-RESEARCH.md 2>/dev/null # Research output
738
- cat "$phase_dir"/*-DISCOVERY.md 2>/dev/null # From mandatory discovery
697
+ _CTX=( "$phase_dir"/*-CONTEXT.md )
698
+ if [ -e "${_CTX[0]}" ]; then cat "${_CTX[@]}"; fi # From /gsd:discuss-phase
699
+ _RESEARCH=( "$phase_dir"/*-RESEARCH.md )
700
+ if [ -e "${_RESEARCH[0]}" ]; then cat "${_RESEARCH[@]}"; fi # Research output
701
+ _DISCOVERY=( "$phase_dir"/*-DISCOVERY.md )
702
+ if [ -e "${_DISCOVERY[0]}" ]; then cat "${_DISCOVERY[@]}"; fi # From mandatory discovery
739
703
  ```
740
704
 
741
705
  **If CONTEXT.md exists (has_context=true from init):** Honor user's vision, prioritize essential features, respect boundaries. Locked decisions — do not revisit.
@@ -869,18 +833,15 @@ Include all frontmatter fields.
869
833
  </step>
870
834
 
871
835
  <step name="validate_plan">
872
- Validate each created PLAN.md using `gsd-tools query`:
836
+ `$SCHEMA`: `plan-gap-closure` in gap_closure mode, else `plan`. `gap_closure` must be literal lowercase `true`.
873
837
 
874
838
  ```bash
875
- VALID=$(gsd_run query frontmatter.validate "$PLAN_PATH" --schema plan)
839
+ VALID=$(gsd_run query frontmatter.validate "$PLAN_PATH" --schema "$SCHEMA")
876
840
  ```
877
841
 
878
- Returns JSON: `{ valid, missing, present, schema }`
842
+ Returns JSON: `{ valid, missing, present, invalidValue, schema }`
879
843
 
880
- **If `valid=false`:** Fix missing required fields before proceeding.
881
-
882
- Required plan frontmatter fields:
883
- - `phase`, `plan`, `type`, `wave`, `depends_on`, `files_modified`, `autonomous`, `must_haves`
844
+ **If `valid=false`:** `missing` = absent fields, `invalidValue` = present but wrong-valued. Fix either before proceeding.
884
845
 
885
846
  Also validate plan structure:
886
847
 
@@ -937,7 +898,7 @@ Return structured planning outcome to orchestrator.
937
898
 
938
899
  <structured_returns>
939
900
 
940
- See @~/.claude/gsd-core/references/planner-guidance.md for `## PLANNING COMPLETE` and `## GAP CLOSURE PLANS CREATED` return format templates.
901
+ See @~/.claude/gsd-core/references/planner-guidance.md for return formats; gap-closure returns are artifact-based (#3440).
941
902
 
942
903
  See @~/.claude/gsd-core/references/planner-chunked.md for `## OUTLINE COMPLETE` and `## PLAN COMPLETE` return formats used in chunked mode.
943
904
 
@@ -954,6 +915,40 @@ See @~/.claude/gsd-core/references/planner-chunked.md for `## OUTLINE COMPLETE`
954
915
 
955
916
  <success_criteria>
956
917
 
918
+ ## Return Markers
919
+
920
+ Your orchestrator dispatches on exact marker strings in your final output. Emit exactly one of:
921
+
922
+ ```markdown
923
+ ## PLANNING COMPLETE
924
+ ```
925
+ (final plans committed, ready for verification)
926
+
927
+ ```markdown
928
+ ## OUTLINE COMPLETE
929
+ ```
930
+ (outline produced, awaiting confirmation — chunked planning mode)
931
+
932
+ ```markdown
933
+ ## PHASE SPLIT RECOMMENDED
934
+ ```
935
+ (phase too large to plan as one unit, include the proposed split)
936
+
937
+ ```markdown
938
+ ## ⚠ Source Audit
939
+ ```
940
+ (unplanned items found in the requirements, include the options)
941
+
942
+ ```markdown
943
+ ## CHECKPOINT REACHED
944
+ ```
945
+ (paused at a user checkpoint, include resume instructions)
946
+
947
+ ```markdown
948
+ ## PLANNING INCONCLUSIVE
949
+ ```
950
+ (cannot produce a plan, include exactly what is missing)
951
+
957
952
  ## Standard Mode
958
953
 
959
954
  Phase planning complete when:
@@ -560,9 +560,27 @@ If gaps found, include in draft for user decision.
560
560
 
561
561
  Write files first, then return. This ensures artifacts persist even if context is lost.
562
562
 
563
- 1. **Write ROADMAP.md** using output format
564
-
565
- 2. **Write STATE.md** using output format
563
+ **Arm the write-guard sentinel before each curated write, when the target already exists.** On a
564
+ `/gsd:new-milestone` run `.planning/ROADMAP.md` and `.planning/STATE.md` still hold the *outgoing*
565
+ milestone's content, and the replacement carries only the new milestone's phases — a legitimate,
566
+ intentional shrink that the `gsd-write-guard` PreToolUse hook (#2255) hard-blocks on curated
567
+ `.planning/` artifacts. A hook inherits the *runtime's* environment, so no per-step env var can reach
568
+ it; the hatch is a **single-use sentinel file the guard itself consumes**. It is path-bound and
569
+ single-use, so arm it immediately before each Write — one arming can never cover both files. On a
570
+ `/gsd:new-project` run neither target exists, the guard exempts the write (ENOENT), and the `[ -f ]`
571
+ test skips the arming so no unconsumed token is left on disk.
572
+
573
+ 1. **Write ROADMAP.md** using output format — arm first, then Write:
574
+
575
+ ```bash
576
+ [ -f .planning/ROADMAP.md ] && printf '.planning/ROADMAP.md\n' > .planning/.gsd-allow-shrink
577
+ ```
578
+
579
+ 2. **Write STATE.md** using output format — arm first, then Write:
580
+
581
+ ```bash
582
+ [ -f .planning/STATE.md ] && printf '.planning/STATE.md\n' > .planning/.gsd-allow-shrink
583
+ ```
566
584
 
567
585
  3. **Update REQUIREMENTS.md traceability section**
568
586
 
@@ -13,6 +13,9 @@ You are spawned by the profile orchestration workflow (Phase 3) or by write-prof
13
13
  Your job: Apply the heuristics defined in the user-profiling reference document to score each dimension with evidence and confidence. Return structured JSON analysis.
14
14
 
15
15
  CRITICAL: You must apply the rubric defined in the reference document. Do not invent dimensions, scoring rules, or patterns beyond what the reference doc specifies. The reference doc is the single source of truth for what to look for and how to score it.
16
+
17
+ **CRITICAL: Mandatory Initial Read**
18
+ If the prompt contains a `<required_reading>` block, you MUST use the `Read` tool to load every file listed there before performing any other actions. This is your primary context.
16
19
  </role>
17
20
 
18
21
  <input>
@@ -41,6 +41,7 @@ Every truth must resolve to VERIFIED, FAILED (BLOCKER), or UNCERTAIN (WARNING wi
41
41
  <required_reading>
42
42
  @~/.claude/gsd-core/references/verification-overrides.md
43
43
  @~/.claude/gsd-core/references/gates.md
44
+ @~/.claude/gsd-core/references/verifier-phase-gates.md
44
45
  </required_reading>
45
46
 
46
47
  This agent implements the **Escalation Gate** pattern (surfaces unresolvable gaps to the developer for decision).
@@ -81,7 +82,8 @@ At verification decision points, reference calibration examples:
81
82
  ## Step 0: Check for Previous Verification
82
83
 
83
84
  ```bash
84
- cat "$PHASE_DIR"/*-VERIFICATION.md 2>/dev/null
85
+ _VERIF=( "$PHASE_DIR"/*-VERIFICATION.md )
86
+ if [ -e "${_VERIF[0]}" ]; then cat "${_VERIF[@]}"; fi
85
87
  ```
86
88
 
87
89
  **If previous verification exists with `gaps:` section → RE-VERIFICATION MODE:**
@@ -199,7 +201,8 @@ For each truth:
199
201
  - A pre-existing test exercises the transition/invariant and passes (confirm via Step 7b's single-named-test path) → ✓ VERIFIED.
200
202
  - No such test exists, or it can't run without a server/state mutation → ⚠️ PRESENT_BEHAVIOR_UNVERIFIED. Emit a human-verification item (Step 8) and do not count it toward the verified score (Step 9).
201
203
  - An accepted override (Step 3b) carries the truth as PASSED (override), exactly as it does for a FAILED truth.
202
- 5b. **Non-inferable (`backstop`) truths:** a `verification: backstop` truth (via `truthVerification()`) abstains unless confirmed by explicit evidence — mark `insufficient_spec` -> a human-verification item -> `human_needed`. See `references/honest-verifier.md`.
204
+ 5b. **Non-inferable truths** (`verification: backstop`, `truthVerification()`): abstain absent explicit evidence — a passing wired held-out/property-based test or directly observed behavior; presence+wiring *never* qualifies. Mark `insufficient_spec` -> human-verification item -> `human_needed`.
205
+ 5c. **Reliance check (advisory, #1955).** Before finalizing a ✓ VERIFIED truth, ask *why* it holds. Classify the evidence already recorded, not your confidence in it. Endogenous, and so weaker than the exogenous `backstop` tag (`gsd-core/references/honest-verifier.md`) — advisory for exactly that reason. Flag `coincidental-reliance` when the evidence names one of: **undeclared-precondition** (state nothing in the phase's artifacts or a declared prerequisite guarantees), **incidental-ordering** (an order or side effect nothing in the code enforces), **fixture-only** (the test's own setup establishes the precondition; the production path has no equivalent). **Do NOT flag:** a precondition the code establishes or explicitly defaults; ordering the code enforces (await, explicit sequencing); a fixture merely supplying input the real caller also supplies; unease naming no specific state, ordering, or fixture. Out of scope: ⚠️ PRESENT_BEHAVIOR_UNVERIFIED and ⚠️ `insufficient_spec` (already routed to human), and PASSED (override) truths. Record `✓ VERIFIED (coincidental-reliance)` and add a `coincidental_reliance_items` entry. **Advisory only — not the score, not the status, and never a human-verification item** (Step 9 rule 2 would flip a passing phase to `human_needed`). The usual fix: promote the hidden assumption into a declared precondition.
203
206
  6. Determine truth status
204
207
 
205
208
  ## Step 3b: Check Verification Overrides
@@ -285,46 +288,16 @@ grep -r "$artifact_name" "${search_path:-src/}" --include="*.ts" --include="*.ts
285
288
 
286
289
  ## Step 4b: Data-Flow Trace (Level 4)
287
290
 
288
- Artifacts that pass Levels 1-3 (exist, substantive, wired) can still be hollow if their data source produces empty or hardcoded values. Level 4 traces upstream from the artifact to verify real data flows through the wiring.
291
+ Trace each rendered value back to a real data source. Full procedure and shell
292
+ recipes: @gsd-core/references/verifier-wiring-patterns.md
289
293
 
290
- **When to run:** For each artifact that passes Level 3 (WIRED) and renders dynamic data (components, pages, dashboards — not utilities or configs).
294
+ Flag any value whose chain terminates in a static return, a hardcoded literal, or
295
+ a mock rather than a real query.
291
296
 
292
- **How:**
293
-
294
- 1. **Identify the data variable** — what state/prop does the artifact render?
295
-
296
- ```bash
297
- # Find state variables that are rendered in JSX/TSX
298
- grep -n -E "useState|useQuery|useSWR|useStore|props\." "$artifact" 2>/dev/null
299
- ```
300
-
301
- 2. **Trace the data source** — where does that variable get populated?
302
-
303
- ```bash
304
- # Find the fetch/query that populates the state
305
- grep -n -A 5 "set${STATE_VAR}\|${STATE_VAR}\s*=" "$artifact" 2>/dev/null | grep -E "fetch|axios|query|store|dispatch|props\."
306
- ```
307
-
308
- 3. **Verify the source produces real data** — does the API/store return actual data or static/empty values?
309
-
310
- ```bash
311
- # Check the API route or data source for real DB queries vs static returns
312
- grep -n -E "prisma\.|db\.|query\(|findMany|findOne|select|FROM" "$source_file" 2>/dev/null
313
- # Flag: static returns with no query
314
- grep -n -E "return.*json\(\s*\[\]|return.*json\(\s*\{\}" "$source_file" 2>/dev/null
315
- ```
316
-
317
- 4. **Check for disconnected props** — props passed to child components that are hardcoded empty at the call site
318
-
319
- ```bash
320
- # Find where the component is used and check prop values
321
- grep -r -A 3 "<${COMPONENT_NAME}" "${search_path:-src/}" --include="*.tsx" 2>/dev/null | grep -E "=\{(\[\]|\{\}|null|''|\"\")\}"
322
- ```
323
-
324
- **Data-flow status:**
297
+ **Data-flow status vocabulary:**
325
298
 
326
- | Data Source | Produces Real Data | Status |
327
- | ---------- | ------------------ | ------ |
299
+ | Data source | Flows | Status |
300
+ | ----------- | ----- | ------ |
328
301
  | DB query found | Yes | ✓ FLOWING |
329
302
  | Fetch exists, static fallback only | No | ⚠️ STATIC |
330
303
  | No data source found | N/A | ✗ DISCONNECTED |
@@ -359,41 +332,15 @@ For each link:
359
332
 
360
333
  **Fallback patterns** (if must_haves.key_links not defined in PLAN):
361
334
 
362
- ### Pattern: Component → API
335
+ ### Wiring patterns
363
336
 
364
- ```bash
365
- grep -E "fetch\(['\"].*$api_path|axios\.(get|post).*$api_path" "$component" 2>/dev/null
366
- grep -A 5 "fetch\|axios" "$component" | grep -E "await|\.then|setData|setState" 2>/dev/null
367
- ```
368
-
369
- Status: WIRED (call + response handling) | PARTIAL (call, no response use) | NOT_WIRED (no call)
370
-
371
- ### Pattern: API → Database
372
-
373
- ```bash
374
- grep -E "prisma\.$model|db\.$model|$model\.(find|create|update|delete)" "$route" 2>/dev/null
375
- grep -E "return.*json.*\w+|res\.json\(\w+" "$route" 2>/dev/null
376
- ```
377
-
378
- Status: WIRED (query + result returned) | PARTIAL (query, static return) | NOT_WIRED (no query)
379
-
380
- ### Pattern: Form → Handler
381
-
382
- ```bash
383
- grep -E "onSubmit=\{|handleSubmit" "$component" 2>/dev/null
384
- grep -A 10 "onSubmit.*=" "$component" | grep -E "fetch|axios|mutate|dispatch" 2>/dev/null
385
- ```
386
-
387
- Status: WIRED (handler + API call) | STUB (only logs/preventDefault) | NOT_WIRED (no handler)
388
-
389
- ### Pattern: State → Render
390
-
391
- ```bash
392
- grep -E "useState.*$state_var|\[$state_var," "$component" 2>/dev/null
393
- grep -E "\{.*$state_var.*\}|\{$state_var\." "$component" 2>/dev/null
394
- ```
337
+ Verify each link below; full per-pattern procedures and shell recipes:
338
+ @gsd-core/references/verifier-wiring-patterns.md
395
339
 
396
- Status: WIRED (state displayed) | NOT_WIRED (state exists, not rendered)
340
+ - **Component → API** — the component actually calls the endpoint it claims.
341
+ - **API → Database** — the endpoint issues a real query, not a static return.
342
+ - **Form → Handler** — submission reaches a handler that persists.
343
+ - **State → Render** — state changes actually reach the rendered output.
397
344
 
398
345
  ## Step 6: Check Requirements Coverage
399
346
 
@@ -610,6 +557,7 @@ Classify status using this decision tree IN ORDER (most restrictive first):
610
557
 
611
558
  - `verified_truths` counts ✓ VERIFIED truths plus PASSED (override) truths (Step 3b). For a behavior-dependent truth, VERIFIED means a behavioral test passed, not just that symbols are present.
612
559
  - ⚠️ PRESENT_BEHAVIOR_UNVERIFIED truths are the *only* ones excluded from `verified_truths`; they are reported separately as `behavior_unverified`.
560
+ - `✓ VERIFIED (coincidental-reliance)` counts as VERIFIED — the advisory changes no score and no status.
613
561
 
614
562
  ```text
615
563
  score: verified_truths / total_truths # e.g. 6/7
@@ -694,7 +642,7 @@ Deferred items are informational only — they do not require closure plans.
694
642
 
695
643
  **VERIFICATION.md output structure under MVP mode:**
696
644
 
697
- 1. Top-level "User Flow Coverage" table: each step of the user story → expected → evidence in codebase → status. (Format defined in `references/verify-mvp-mode.md`.)
645
+ 1. Top-level "User Flow Coverage" table: each step of the user story → expected → evidence in codebase → status. (Format defined in `gsd-core/references/verify-mvp-mode.md`.)
698
646
  2. Standard technical-check sections (API verification, error handling, etc.) follow below — only if the user flow coverage is complete.
699
647
 
700
648
  **User Story format guard:** Apply via the centralized verb instead of inlining the regex:
@@ -757,6 +705,10 @@ behavior_unverified_items: # Only if behavior_unverified > 0 — emitted regardl
757
705
  test: "What to trigger"
758
706
  expected: "What state must hold afterward"
759
707
  why_human: "Why presence checks can't see it"
708
+ coincidental_reliance_items: # Only if a ✓ VERIFIED truth holds incidentally — emitted regardless of overall status (survives gaps_found)
709
+ - truth: "Observable truth that holds incidentally"
710
+ reason: undeclared-precondition | incidental-ordering | fixture-only
711
+ harden: "Precondition/ordering to declare or enforce"
760
712
  human_verification: # Only if status: human_needed
761
713
  - test: "What to do"
762
714
  expected: "What should happen"
@@ -779,6 +731,7 @@ human_verification: # Only if status: human_needed
779
731
  | 1 | {truth} | ✓ VERIFIED | {evidence} |
780
732
  | 2 | {truth} | ✗ FAILED | {what's wrong} |
781
733
  | 3 | {truth} | ⚠️ PRESENT_BEHAVIOR_UNVERIFIED | {present + wired; no test exercises the transition/invariant — see Human Verification} |
734
+ | 4 | {truth} | ✓ VERIFIED (coincidental-reliance) | {holds, but incidentally — see coincidental_reliance_items} |
782
735
 
783
736
  **Score:** {N}/{M} truths verified ({P} present, behavior-unverified)
784
737