@opengsd/gsd-core 1.13.0 → 1.15.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 (441) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.ja-JP.md +3 -3
  4. package/README.ko-KR.md +3 -3
  5. package/README.pt-BR.md +3 -3
  6. package/README.zh-CN.md +3 -3
  7. package/agents/gsd-advisor-researcher.compact.md +85 -0
  8. package/agents/gsd-ai-researcher.compact.md +96 -0
  9. package/agents/gsd-assumptions-analyzer.compact.md +81 -0
  10. package/agents/gsd-code-fixer.compact.md +459 -0
  11. package/agents/gsd-code-fixer.md +9 -8
  12. package/agents/gsd-code-reviewer.compact.md +269 -0
  13. package/agents/gsd-code-reviewer.md +15 -3
  14. package/agents/gsd-codebase-mapper.compact.md +760 -0
  15. package/agents/gsd-debug-session-manager.compact.md +360 -0
  16. package/agents/gsd-debug-session-manager.md +17 -2
  17. package/agents/gsd-debugger.md +2 -2
  18. package/agents/gsd-doc-classifier.compact.md +192 -0
  19. package/agents/gsd-doc-synthesizer.compact.md +200 -0
  20. package/agents/gsd-doc-verifier.compact.md +143 -0
  21. package/agents/gsd-doc-writer.compact.md +440 -0
  22. package/agents/gsd-dom-verifier.compact.md +138 -0
  23. package/agents/gsd-domain-researcher.compact.md +141 -0
  24. package/agents/gsd-eval-auditor.compact.md +160 -0
  25. package/agents/gsd-eval-auditor.md +1 -1
  26. package/agents/gsd-eval-planner.compact.md +137 -0
  27. package/agents/gsd-executor.md +13 -8
  28. package/agents/gsd-framework-selector.compact.md +82 -0
  29. package/agents/gsd-integration-checker.compact.md +245 -0
  30. package/agents/gsd-intel-updater.compact.md +226 -0
  31. package/agents/gsd-intel-updater.md +1 -1
  32. package/agents/gsd-mempalace-curator.compact.md +45 -0
  33. package/agents/gsd-nyquist-auditor.compact.md +179 -0
  34. package/agents/gsd-pattern-mapper.compact.md +275 -0
  35. package/agents/gsd-phase-researcher.md +19 -11
  36. package/agents/gsd-plan-checker.md +8 -7
  37. package/agents/gsd-planner.md +12 -8
  38. package/agents/gsd-project-researcher.compact.md +587 -0
  39. package/agents/gsd-project-researcher.md +1 -1
  40. package/agents/gsd-research-synthesizer.compact.md +212 -0
  41. package/agents/gsd-research-synthesizer.md +1 -1
  42. package/agents/gsd-roadmapper.compact.md +454 -0
  43. package/agents/gsd-roadmapper.md +13 -0
  44. package/agents/gsd-security-auditor.compact.md +162 -0
  45. package/agents/gsd-ui-auditor.compact.md +404 -0
  46. package/agents/gsd-ui-auditor.md +155 -17
  47. package/agents/gsd-ui-checker.compact.md +277 -0
  48. package/agents/gsd-ui-researcher.compact.md +282 -0
  49. package/agents/gsd-ui-researcher.md +1 -1
  50. package/agents/gsd-user-profiler.compact.md +108 -0
  51. package/agents/gsd-verifier.md +10 -9
  52. package/bin/install.js +848 -163
  53. package/commands/gsd/autonomous.md +2 -2
  54. package/commands/gsd/capture.md +1 -1
  55. package/commands/gsd/cleanup.md +1 -0
  56. package/commands/gsd/code-review.md +2 -1
  57. package/commands/gsd/complete-milestone.md +1 -0
  58. package/commands/gsd/config.md +1 -0
  59. package/commands/gsd/debug.md +1 -0
  60. package/commands/gsd/graphify.md +1 -0
  61. package/commands/gsd/health.md +1 -0
  62. package/commands/gsd/mempalace-capture.md +8 -3
  63. package/commands/gsd/mempalace-recall.md +1 -0
  64. package/commands/gsd/new-milestone.md +1 -0
  65. package/commands/gsd/new-project.md +1 -0
  66. package/commands/gsd/next.md +1 -0
  67. package/commands/gsd/pause-work.md +1 -0
  68. package/commands/gsd/phase.md +1 -0
  69. package/commands/gsd/plan-review-convergence.md +6 -6
  70. package/commands/gsd/pr-branch.md +1 -0
  71. package/commands/gsd/progress.md +1 -1
  72. package/commands/gsd/quick-batch.md +1 -1
  73. package/commands/gsd/resume-work.md +1 -0
  74. package/commands/gsd/review-backlog.md +1 -0
  75. package/commands/gsd/review.md +2 -3
  76. package/commands/gsd/settings.md +2 -1
  77. package/commands/gsd/stats.md +1 -0
  78. package/commands/gsd/thread.md +1 -0
  79. package/commands/gsd/workspace.md +1 -0
  80. package/commands/gsd/workstreams.md +1 -0
  81. package/gsd-core/bin/check-latest-version.cjs +8 -3
  82. package/gsd-core/bin/gsd-tools.cjs +672 -146
  83. package/gsd-core/bin/lib/adr-parser.cjs +4 -2
  84. package/gsd-core/bin/lib/artifacts.cjs +2 -1
  85. package/gsd-core/bin/lib/audit.cjs +119 -34
  86. package/gsd-core/bin/lib/broken-windows.cjs +168 -49
  87. package/gsd-core/bin/lib/capability-lifecycle.cjs +10 -6
  88. package/gsd-core/bin/lib/capability-loader.cjs +135 -1
  89. package/gsd-core/bin/lib/capability-registry.cjs +96 -189
  90. package/gsd-core/bin/lib/capability-source.cjs +19 -2
  91. package/gsd-core/bin/lib/capability-validator.cjs +14 -2
  92. package/gsd-core/bin/lib/check-command-router.cjs +213 -49
  93. package/gsd-core/bin/lib/code-review-depth.cjs +2 -2
  94. package/gsd-core/bin/lib/codex-agent-toml.cjs +21 -25
  95. package/gsd-core/bin/lib/commands.cjs +823 -112
  96. package/gsd-core/bin/lib/config-loader.cjs +66 -4
  97. package/gsd-core/bin/lib/config.cjs +186 -45
  98. package/gsd-core/bin/lib/coverage.cjs +1 -1
  99. package/gsd-core/bin/lib/decisions.cjs +164 -45
  100. package/gsd-core/bin/lib/external-descriptor-trust.cjs +29 -14
  101. package/gsd-core/bin/lib/frontmatter.cjs +13 -0
  102. package/gsd-core/bin/lib/graphify.cjs +10 -2
  103. package/gsd-core/bin/lib/gsd2-import.cjs +1 -2
  104. package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +12 -1
  105. package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +1 -1
  106. package/gsd-core/bin/lib/host-runtime-detection.cjs +9 -0
  107. package/gsd-core/bin/lib/init.cjs +614 -86
  108. package/gsd-core/bin/lib/install-engine.cjs +29 -3
  109. package/gsd-core/bin/lib/install-profiles.cjs +14 -0
  110. package/gsd-core/bin/lib/installer-migrations.cjs +41 -5
  111. package/gsd-core/bin/lib/loop-resolver.cjs +50 -31
  112. package/gsd-core/bin/lib/mcp-catalog.cjs +2 -2
  113. package/gsd-core/bin/lib/milestone.cjs +37 -13
  114. package/gsd-core/bin/lib/model-resolver.cjs +253 -53
  115. package/gsd-core/bin/lib/phase-command-router.cjs +16 -2
  116. package/gsd-core/bin/lib/phase-id-card.cjs +32 -0
  117. package/gsd-core/bin/lib/phase-id-display.cjs +78 -0
  118. package/gsd-core/bin/lib/phase-id.cjs +268 -27
  119. package/gsd-core/bin/lib/phase-lifecycle.cjs +61 -0
  120. package/gsd-core/bin/lib/phase-locator.cjs +29 -10
  121. package/gsd-core/bin/lib/phase.cjs +393 -88
  122. package/gsd-core/bin/lib/plan-document.cjs +49 -1
  123. package/gsd-core/bin/lib/planning-document.cjs +459 -0
  124. package/gsd-core/bin/lib/planning-inspect.cjs +52 -19
  125. package/gsd-core/bin/lib/planning-snapshot.cjs +61 -12
  126. package/gsd-core/bin/lib/planning-workspace.cjs +57 -3
  127. package/gsd-core/bin/lib/pr-branch-patterns.cjs +57 -0
  128. package/gsd-core/bin/lib/pristine-baseline.cjs +182 -0
  129. package/gsd-core/bin/lib/probe-core.cjs +7 -1
  130. package/gsd-core/bin/lib/prohibition-enforcement.cjs +91 -4
  131. package/gsd-core/bin/lib/project-root.cjs +41 -2
  132. package/gsd-core/bin/lib/quick-batch.cjs +1 -1
  133. package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +61 -2
  134. package/gsd-core/bin/lib/research-store.cjs +11 -12
  135. package/gsd-core/bin/lib/review-lane-descriptor.cjs +10 -30
  136. package/gsd-core/bin/lib/review-lane-invocation.cjs +23 -0
  137. package/gsd-core/bin/lib/review-reviewer-selection.cjs +2 -2
  138. package/gsd-core/bin/lib/reviewer-step-dispatch.cjs +337 -0
  139. package/gsd-core/bin/lib/roadmap-command-router.cjs +12 -4
  140. package/gsd-core/bin/lib/roadmap-parser.cjs +219 -18
  141. package/gsd-core/bin/lib/roadmap-upgrade.cjs +1539 -13
  142. package/gsd-core/bin/lib/roadmap.cjs +356 -42
  143. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +310 -41
  144. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +15 -4
  145. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +13 -5
  146. package/gsd-core/bin/lib/runtime-homes.cjs +4 -0
  147. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +408 -37
  148. package/gsd-core/bin/lib/runtime-name-policy.cjs +111 -1
  149. package/gsd-core/bin/lib/security.cjs +126 -7
  150. package/gsd-core/bin/lib/shell-command-projection.cjs +10 -6
  151. package/gsd-core/bin/lib/state-document.cjs +130 -28
  152. package/gsd-core/bin/lib/state-md-schema.cjs +21 -14
  153. package/gsd-core/bin/lib/state-transition.cjs +181 -30
  154. package/gsd-core/bin/lib/state.cjs +265 -27
  155. package/gsd-core/bin/lib/surface.cjs +77 -3
  156. package/gsd-core/bin/lib/task-command-router.cjs +12 -6
  157. package/gsd-core/bin/lib/tdd-red-evidence.cjs +78 -5
  158. package/gsd-core/bin/lib/uat-predicate.cjs +47 -4
  159. package/gsd-core/bin/lib/uat.cjs +9 -1
  160. package/gsd-core/bin/lib/ui-consideration-probe.cjs +15 -2
  161. package/gsd-core/bin/lib/ui-frontend-evidence.cjs +100 -9
  162. package/gsd-core/bin/lib/undo-commit-selection.cjs +131 -0
  163. package/gsd-core/bin/lib/update-context.cjs +30 -24
  164. package/gsd-core/bin/lib/vendor/js-yaml.cjs +11 -3
  165. package/gsd-core/bin/lib/verification.cjs +315 -30
  166. package/gsd-core/bin/lib/verify-command-grounding.cjs +47 -3
  167. package/gsd-core/bin/lib/verify.cjs +320 -48
  168. package/gsd-core/bin/lib/workstream-inventory.cjs +1 -0
  169. package/gsd-core/bin/lib/worktree-base-ref.cjs +482 -73
  170. package/gsd-core/bin/lib/worktree-safety.cjs +797 -58
  171. package/gsd-core/bin/shared/config-defaults.manifest.json +4 -0
  172. package/gsd-core/bin/shared/config-schema.manifest.json +6 -0
  173. package/gsd-core/bin/verify-reapply-patches.cjs +439 -80
  174. package/gsd-core/references/checkpoints.md +5 -3
  175. package/gsd-core/references/compact-content-gate.md +66 -0
  176. package/gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +28 -3
  177. package/gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +37 -4
  178. package/gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +28 -3
  179. package/gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +28 -3
  180. package/gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +37 -4
  181. package/gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +37 -4
  182. package/gsd-core/references/edge-probe.md +195 -21
  183. package/gsd-core/references/execute-phase-between-wave-reset.md +7 -6
  184. package/gsd-core/references/execute-phase-wave-guard.md +22 -11
  185. package/gsd-core/references/gsd-run-resolver.md +1 -1
  186. package/gsd-core/references/loop-hook-dispatch.md +18 -0
  187. package/gsd-core/references/model-profiles.md +13 -4
  188. package/gsd-core/references/phase-argument-parsing.md +9 -7
  189. package/gsd-core/references/phase-id-convention.md +28 -0
  190. package/gsd-core/references/planner-gap-closure.md +2 -0
  191. package/gsd-core/references/planner-load-graph-context.md +24 -13
  192. package/gsd-core/references/planner-verify-command-grounding.md +14 -0
  193. package/gsd-core/references/planning-config.md +14 -2
  194. package/gsd-core/references/tdd.md +30 -4
  195. package/gsd-core/references/thinking-models-planning.md +18 -2
  196. package/gsd-core/references/ui-consideration-probe.md +10 -5
  197. package/gsd-core/references/verification-patterns.md +17 -4
  198. package/gsd-core/references/verify-command-path-resolvability.md +10 -2
  199. package/gsd-core/references/worktree-path-safety.md +433 -2
  200. package/gsd-core/templates/README.md +7 -1
  201. package/gsd-core/templates/state.md +6 -3
  202. package/gsd-core/templates/summary.compact.md +212 -0
  203. package/gsd-core/templates/user-setup.compact.md +199 -0
  204. package/gsd-core/templates/user-setup.md +0 -9
  205. package/gsd-core/templates/verification-report.md +1 -1
  206. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
  207. package/gsd-core/workflows/add-backlog.md +1 -1
  208. package/gsd-core/workflows/add-phase.md +1 -1
  209. package/gsd-core/workflows/add-tests.md +2 -2
  210. package/gsd-core/workflows/add-todo.md +6 -5
  211. package/gsd-core/workflows/ai-integration-phase.md +11 -3
  212. package/gsd-core/workflows/audit-fix.md +1 -1
  213. package/gsd-core/workflows/audit-milestone.md +1 -1
  214. package/gsd-core/workflows/audit-uat.md +1 -1
  215. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +9 -18
  216. package/gsd-core/workflows/autonomous.md +29 -16
  217. package/gsd-core/workflows/check-todos.md +6 -4
  218. package/gsd-core/workflows/cleanup.md +5 -3
  219. package/gsd-core/workflows/code-review/steps/dispatch-fix.md +4 -3
  220. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +8 -1
  221. package/gsd-core/workflows/code-review-fix.md +108 -22
  222. package/gsd-core/workflows/code-review.md +216 -73
  223. package/gsd-core/workflows/complete-milestone/detail/elaboration.md +274 -0
  224. package/gsd-core/workflows/complete-milestone.md +41 -264
  225. package/gsd-core/workflows/debug.md +3 -3
  226. package/gsd-core/workflows/diagnose-issues.md +1 -1
  227. package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
  228. package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
  229. package/gsd-core/workflows/discuss-phase-assumptions.md +1 -1
  230. package/gsd-core/workflows/discuss-phase.md +1 -1
  231. package/gsd-core/workflows/do.md +2 -2
  232. package/gsd-core/workflows/docs-update/detail/elaboration.md +179 -0
  233. package/gsd-core/workflows/docs-update.md +17 -158
  234. package/gsd-core/workflows/edit-phase.md +1 -1
  235. package/gsd-core/workflows/eval-review.md +10 -3
  236. package/gsd-core/workflows/execute-phase/detail/elaboration.md +124 -0
  237. package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +1017 -0
  238. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +19 -4
  239. package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +56 -0
  240. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +43 -4
  241. package/gsd-core/workflows/execute-phase/steps/executor-progress-policy.md +43 -0
  242. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
  243. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
  244. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
  245. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +1 -1
  246. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +46 -9
  247. package/gsd-core/workflows/execute-phase/steps/protected-branch.md +1 -1
  248. package/gsd-core/workflows/execute-phase/steps/ready-wave-gate.md +37 -0
  249. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +1 -1
  250. package/gsd-core/workflows/execute-phase/steps/sequential-root-pin.md +35 -0
  251. package/gsd-core/workflows/execute-phase/steps/stale-reverification.md +24 -0
  252. package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +1 -1
  253. package/gsd-core/workflows/execute-phase/steps/threat-id-gate.md +28 -0
  254. package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +1 -1
  255. package/gsd-core/workflows/execute-phase/steps/worktree-base-check.md +25 -0
  256. package/gsd-core/workflows/execute-phase.md +83 -172
  257. package/gsd-core/workflows/execute-plan.md +24 -10
  258. package/gsd-core/workflows/explore.md +3 -3
  259. package/gsd-core/workflows/extract-learnings.md +2 -1
  260. package/gsd-core/workflows/fast.md +1 -1
  261. package/gsd-core/workflows/forensics.md +1 -1
  262. package/gsd-core/workflows/graduation.md +1 -1
  263. package/gsd-core/workflows/health.md +2 -2
  264. package/gsd-core/workflows/help/modes/full.compact.md +398 -0
  265. package/gsd-core/workflows/help/modes/full.md +5 -5
  266. package/gsd-core/workflows/help/modes/topic.md +15 -5
  267. package/gsd-core/workflows/help.md +1 -1
  268. package/gsd-core/workflows/import.md +2 -2
  269. package/gsd-core/workflows/inbox.md +2 -2
  270. package/gsd-core/workflows/ingest-docs.md +3 -3
  271. package/gsd-core/workflows/insert-phase.md +1 -1
  272. package/gsd-core/workflows/list-seeds.md +1 -1
  273. package/gsd-core/workflows/list-workspaces.md +1 -1
  274. package/gsd-core/workflows/manager.md +2 -2
  275. package/gsd-core/workflows/map-codebase.md +52 -5
  276. package/gsd-core/workflows/milestone-summary.md +1 -1
  277. package/gsd-core/workflows/mvp-phase.md +1 -1
  278. package/gsd-core/workflows/new-milestone.md +56 -14
  279. package/gsd-core/workflows/new-project/detail/elaboration.md +216 -0
  280. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +3 -3
  281. package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +1 -1
  282. package/gsd-core/workflows/new-project.md +39 -209
  283. package/gsd-core/workflows/new-workspace.md +2 -2
  284. package/gsd-core/workflows/next.md +1 -1
  285. package/gsd-core/workflows/note.md +1 -1
  286. package/gsd-core/workflows/onboard.md +1 -1
  287. package/gsd-core/workflows/pause-work.md +1 -1
  288. package/gsd-core/workflows/plan-phase/detail/elaboration.md +209 -0
  289. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +17 -5
  290. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
  291. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +23 -5
  292. package/gsd-core/workflows/plan-phase.md +45 -187
  293. package/gsd-core/workflows/plan-review-convergence.md +21 -5
  294. package/gsd-core/workflows/plant-seed.md +62 -20
  295. package/gsd-core/workflows/pr-branch.md +132 -20
  296. package/gsd-core/workflows/profile-user.md +2 -2
  297. package/gsd-core/workflows/progress.md +1 -1
  298. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +25 -0
  299. package/gsd-core/workflows/quick/steps/quick-verification.md +1 -1
  300. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +1 -1
  301. package/gsd-core/workflows/quick-batch/steps/batch-init.md +1 -1
  302. package/gsd-core/workflows/quick-batch/steps/completion.md +1 -1
  303. package/gsd-core/workflows/quick-batch/steps/merge-wave.md +1 -1
  304. package/gsd-core/workflows/quick-batch/steps/planner-wave.md +1 -1
  305. package/gsd-core/workflows/quick-batch/steps/research-phase.md +1 -1
  306. package/gsd-core/workflows/quick-batch/steps/resume-mode.md +1 -1
  307. package/gsd-core/workflows/quick-batch/steps/verification-wave.md +1 -1
  308. package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +1 -1
  309. package/gsd-core/workflows/quick-batch.md +1 -1
  310. package/gsd-core/workflows/quick.md +29 -10
  311. package/gsd-core/workflows/reapply-patches.md +86 -6
  312. package/gsd-core/workflows/remove-phase.md +1 -1
  313. package/gsd-core/workflows/remove-workspace.md +2 -2
  314. package/gsd-core/workflows/resume-project.md +1 -1
  315. package/gsd-core/workflows/review.md +31 -16
  316. package/gsd-core/workflows/scan.md +1 -1
  317. package/gsd-core/workflows/secure-phase.md +3 -2
  318. package/gsd-core/workflows/settings-advanced.md +30 -10
  319. package/gsd-core/workflows/settings-integrations.md +2 -3
  320. package/gsd-core/workflows/settings.md +22 -9
  321. package/gsd-core/workflows/ship.md +3 -2
  322. package/gsd-core/workflows/sketch-wrap-up.md +1 -1
  323. package/gsd-core/workflows/sketch.md +1 -1
  324. package/gsd-core/workflows/smart-entry.md +2 -2
  325. package/gsd-core/workflows/spec-phase.md +15 -5
  326. package/gsd-core/workflows/spike-wrap-up.md +1 -1
  327. package/gsd-core/workflows/spike.md +1 -1
  328. package/gsd-core/workflows/stats.md +1 -1
  329. package/gsd-core/workflows/sync-skills.md +5 -5
  330. package/gsd-core/workflows/thread.md +1 -1
  331. package/gsd-core/workflows/transition.md +1 -1
  332. package/gsd-core/workflows/ui-phase.md +44 -8
  333. package/gsd-core/workflows/ui-review.md +18 -4
  334. package/gsd-core/workflows/ultraplan-phase.md +1 -1
  335. package/gsd-core/workflows/undo.md +339 -20
  336. package/gsd-core/workflows/update.md +14 -12
  337. package/gsd-core/workflows/validate-phase.md +3 -2
  338. package/gsd-core/workflows/verify-work/detail/elaboration.md +230 -0
  339. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +1 -1
  340. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
  341. package/gsd-core/workflows/verify-work.md +101 -196
  342. package/hooks/dist/gsd-agent-isolation-guard.js +66 -16
  343. package/hooks/dist/gsd-context-monitor.js +88 -15
  344. package/hooks/dist/gsd-cursor-subagent-start.js +34 -14
  345. package/hooks/dist/gsd-secret-read-guard.js +71 -19
  346. package/hooks/dist/gsd-statusline.js +81 -20
  347. package/hooks/dist/gsd-validate-commit.sh +97 -8
  348. package/hooks/dist/gsd-worktree-path-guard.js +25 -14
  349. package/hooks/dist/gsd-write-guard.js +46 -1
  350. package/hooks/dist/lib/dispatch-identity.js +187 -0
  351. package/hooks/dist/lib/filename-classification.js +64 -0
  352. package/hooks/dist/lib/isolation-deny-reason.js +53 -1
  353. package/hooks/dist/lib/isolation-sentinel.js +58 -19
  354. package/hooks/gsd-agent-isolation-guard.js +66 -16
  355. package/hooks/gsd-context-monitor.js +88 -15
  356. package/hooks/gsd-cursor-subagent-start.js +34 -14
  357. package/hooks/gsd-secret-read-guard.js +71 -19
  358. package/hooks/gsd-statusline.js +81 -20
  359. package/hooks/gsd-validate-commit.sh +97 -8
  360. package/hooks/gsd-worktree-path-guard.js +25 -14
  361. package/hooks/gsd-write-guard.js +46 -1
  362. package/hooks/lib/dispatch-identity.js +187 -0
  363. package/hooks/lib/filename-classification.js +64 -0
  364. package/hooks/lib/isolation-deny-reason.js +53 -1
  365. package/hooks/lib/isolation-sentinel.js +58 -19
  366. package/package.json +11 -6
  367. package/scripts/benchmark-compact-content-variants.cjs +298 -0
  368. package/scripts/benchmark-compact-content.cjs +368 -0
  369. package/scripts/build-hooks.js +15 -6
  370. package/scripts/check-contract-drift.cjs +131 -12
  371. package/scripts/check-env.cjs +36 -8
  372. package/scripts/check-glossary-refs.cjs +25 -21
  373. package/scripts/ci-next-health.cjs +271 -0
  374. package/scripts/ci-prepare-test-scope.cjs +7 -7
  375. package/scripts/ci-test-scope.cjs +126 -20
  376. package/scripts/ci-timeout-report.cjs +1 -1
  377. package/scripts/command-contract-helpers.cjs +3 -0
  378. package/scripts/diff-touches-shipped-paths.cjs +1 -1
  379. package/scripts/docs-guard-registry.cjs +35 -2
  380. package/scripts/gen-adr-index.cjs +8 -2
  381. package/scripts/gen-inventory-manifest.cjs +12 -0
  382. package/scripts/gen-loop-host-contract.cjs +69 -0
  383. package/scripts/gen-platform-conformance-tier.cjs +557 -0
  384. package/scripts/lib/drift-scan.cjs +1 -1
  385. package/scripts/lib/macos-conformance-tier.generated.cjs +224 -0
  386. package/scripts/lib/ndjson-reporter.cjs +3 -2
  387. package/scripts/lib/npm-version-check-diagnosis.cjs +59 -0
  388. package/scripts/lib/platform-conformance-tier.generated.cjs +287 -0
  389. package/scripts/lib/suite-detection.cjs +32 -0
  390. package/scripts/lint-allowed-tools-parity.cjs +221 -0
  391. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +47 -3
  392. package/scripts/lint-phase-arg-assignment.cjs +257 -0
  393. package/scripts/lint-phase-id-drift.cjs +623 -13
  394. package/scripts/lint-pr-branch-pattern-drift.cjs +148 -0
  395. package/scripts/lint-response-language-coverage.cjs +9 -3
  396. package/scripts/lint-retired-runtime-name.cjs +619 -0
  397. package/scripts/lint-source-test-name-collision.cjs +1 -1
  398. package/scripts/lint-state-write-path-drift.cjs +93 -0
  399. package/scripts/lint-test-file-count.allowlist.json +29 -9
  400. package/scripts/lint-vendored-deps.cjs +128 -17
  401. package/scripts/lint-workflow-shellcheck-baseline.json +100 -0
  402. package/scripts/prompt-injection-scan.sh +18 -0
  403. package/scripts/release-tarball-smoke.cjs +194 -1
  404. package/scripts/workflow-size.cjs +139 -0
  405. package/skills/gsd-autonomous/SKILL.md +2 -2
  406. package/skills/gsd-capture/SKILL.md +1 -1
  407. package/skills/gsd-cleanup/SKILL.md +1 -0
  408. package/skills/gsd-code-review/SKILL.md +2 -1
  409. package/skills/gsd-complete-milestone/SKILL.md +1 -0
  410. package/skills/gsd-config/SKILL.md +1 -0
  411. package/skills/gsd-debug/SKILL.md +1 -0
  412. package/skills/gsd-graphify/SKILL.md +1 -0
  413. package/skills/gsd-health/SKILL.md +1 -0
  414. package/skills/gsd-mempalace-capture/SKILL.md +8 -3
  415. package/skills/gsd-mempalace-recall/SKILL.md +1 -0
  416. package/skills/gsd-new-milestone/SKILL.md +1 -0
  417. package/skills/gsd-new-project/SKILL.md +1 -0
  418. package/skills/gsd-next/SKILL.md +1 -0
  419. package/skills/gsd-pause-work/SKILL.md +1 -0
  420. package/skills/gsd-phase/SKILL.md +1 -0
  421. package/skills/gsd-plan-review-convergence/SKILL.md +5 -5
  422. package/skills/gsd-pr-branch/SKILL.md +1 -0
  423. package/skills/gsd-progress/SKILL.md +1 -1
  424. package/skills/gsd-quick-batch/SKILL.md +1 -1
  425. package/skills/gsd-resume-work/SKILL.md +1 -0
  426. package/skills/gsd-review/SKILL.md +2 -3
  427. package/skills/gsd-review-backlog/SKILL.md +1 -0
  428. package/skills/gsd-settings/SKILL.md +2 -1
  429. package/skills/gsd-stats/SKILL.md +1 -0
  430. package/skills/gsd-thread/SKILL.md +1 -0
  431. package/skills/gsd-workspace/SKILL.md +1 -0
  432. package/skills/gsd-workstreams/SKILL.md +1 -0
  433. package/vscode/package.json +1 -1
  434. package/gsd-core/templates/claude-md.md +0 -145
  435. package/gsd-core/templates/codebase/concerns.md +0 -310
  436. package/gsd-core/templates/codebase/conventions.md +0 -307
  437. package/gsd-core/templates/codebase/integrations.md +0 -280
  438. package/gsd-core/templates/codebase/structure.md +0 -285
  439. package/gsd-core/templates/codebase/testing.md +0 -480
  440. package/gsd-core/templates/debug-subagent-prompt.md +0 -91
  441. package/gsd-core/templates/discovery.md +0 -146
@@ -25,6 +25,7 @@ exports.getFieldClassification = getFieldClassification;
25
25
  exports.getPreserveWhenUnchangedFields = getPreserveWhenUnchangedFields;
26
26
  exports.openStateTransaction = openStateTransaction;
27
27
  exports.rebuildStateTransaction = rebuildStateTransaction;
28
+ exports.createStateWriteIntent = createStateWriteIntent;
28
29
  exports.applyPreserveWhenUnchanged = applyPreserveWhenUnchanged;
29
30
  exports.applyStatePreservation = applyStatePreservation;
30
31
  exports.transitionCore = transitionCore;
@@ -36,6 +37,11 @@ const state_document_cjs_2 = require("./state-document.cjs");
36
37
  const markdown_sectionizer_cjs_1 = require("./markdown-sectionizer.cjs");
37
38
  const phase_lifecycle_cjs_1 = require("./phase-lifecycle.cjs");
38
39
  const pattern_cjs_1 = require("./pattern.cjs");
40
+ // #4129: the completion-ratio kernel for the resync-arm ratchet's percent
41
+ // (planning-scope's SCOPE — state-document's own dependency, no cycle here:
42
+ // state-document never imports this module).
43
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
44
+ const planningScopeMod = require("./planning-scope.cjs");
39
45
  // eslint-disable-next-line @typescript-eslint/no-require-imports
40
46
  const stateMdSchemaMod = require("./state-md-schema.cjs");
41
47
  const { STATE_FIELD_SCHEMA } = stateMdSchemaMod;
@@ -44,12 +50,13 @@ function formatProgressMachineSegment(percent) {
44
50
  // ADR-3180 Decision 7: rounding and the 100 ceiling belong to the
45
51
  // completion-ratio kernel. The floor is added here because this helper is
46
52
  // also fed persisted frontmatter values (hand-editable, unlike the
47
- // count-shaped entries into that kernel), and `'░'.repeat` throws on a
48
- // negative count. Bar and printed percent use the clamped value so the two
49
- // halves of the segment can never disagree.
53
+ // count-shaped entries into that kernel). Bar and printed percent use the
54
+ // clamped value so the two halves of the segment can never disagree.
55
+ // #4294: the CELL count is the render kernel's — `renderProgressBar` holds a
56
+ // sub-100 percent one cell short of full, so `[██████████]` beside `95%`
57
+ // cannot recur here as a seventh inline copy of the rounding.
50
58
  const clamped = Math.max(0, (0, phase_lifecycle_cjs_1.clampPercentFromFraction)(percent / 100));
51
- const filled = Math.round(clamped / 10);
52
- return `[${'█'.repeat(filled)}${'░'.repeat(10 - filled)}] ${clamped}%`;
59
+ return `[${(0, phase_lifecycle_cjs_1.renderProgressBar)(clamped, 10)}] ${clamped}%`;
53
60
  }
54
61
  // Consumers (a future STATE.md writer that bypasses all three reintroduces the
55
62
  // #4213 divergence class): `cmdStateUpdateProgress` and `syncCore`'s progress
@@ -60,11 +67,29 @@ function formatProgressMachineSegment(percent) {
60
67
  // `syncCore`'s call here.
61
68
  function stateReplaceProgressPercent(content, percent) {
62
69
  const body = stripFrontmatter(content);
63
- // #2177: bold `**Progress:**` anywhere in the body wins outright; the plain
64
- // `^Progress:` form is the fallback only when no bold line exists, so an
65
- // earlier free-text line starting with `Progress:` cannot capture the
66
- // rewrite ahead of the real status line.
67
- const boldProgressPattern = /(\*\*Progress:\*\*[ \t]*)([^\r\n]*)/i;
70
+ // #2177: bold `**Progress:**` takes priority over the plain `^Progress:`
71
+ // form, so an earlier free-text line starting with `Progress:` cannot
72
+ // capture the rewrite ahead of the real status line.
73
+ //
74
+ // #4243 (follow-up to #4453, maintainer ruling 2026-09-07): the bold form
75
+ // is also ANCHORED to line start, with same-line leading whitespace only —
76
+ // the exact idiom #4453 applied to stateReplaceField's bold branch. The
77
+ // pre-fix pattern carried no `^` and no `m` flag, so a bold percent-ish
78
+ // label quoted MID-SENTENCE inside prose (an Accumulated Context bullet
79
+ // mentioning `**Progress:**`) captured the machine-segment rewrite and
80
+ // destroyed the rest of its line, silently, while the real Progress line
81
+ // stayed stale — every caller (cmdStateUpdateProgress, syncCore's percent
82
+ // arm, applyPostSyncPreservation) feeds the whole document. #2177's own
83
+ // recorded requirements are unaffected: the frontmatter is stripped before
84
+ // matching (its defect was the YAML `progress:` key shadowing the body
85
+ // line), the suffix-preserving machine-segment swap is untouched, and the
86
+ // bold-beats-plain priority now governs LINE-START forms. The leading class
87
+ // is `[ \t]*`, deliberately NOT `\s*` — `^\s*\*\*` can consume the newlines
88
+ // before the label into the match and drop them on rebuild (#4010's
89
+ // same-line confinement hazard). `$` is explicit-and-inert (`[^\r\n]*`
90
+ // never crosses line terminators) and documents that the match ends at
91
+ // end-of-line.
92
+ const boldProgressPattern = /^([ \t]*\*\*Progress:\*\*[ \t]*)([^\r\n]*)$/im;
68
93
  const plainProgressPattern = /^(Progress:[ \t]*)([^\r\n]*)/im;
69
94
  const pattern = boldProgressPattern.test(body)
70
95
  ? boldProgressPattern
@@ -377,6 +402,28 @@ function openStateTransaction(init) {
377
402
  function rebuildStateTransaction(init) {
378
403
  return createStateTransaction('rebuild', init, 'rebuildStateTransaction');
379
404
  }
405
+ /**
406
+ * Extend an existing StateTransaction into a StateWriteIntent. The base
407
+ * transaction is REQUIRED — an absent base is a construction failure, mirroring
408
+ * `createStateTransaction`'s ADR-3473 §8.6 posture (do not tolerate null). `scope`
409
+ * defaults to the conservative `'narrow'`; `assertions` defaults to none. Frozen
410
+ * so an intent, like a transaction, cannot be mutated after construction.
411
+ */
412
+ function createStateWriteIntent(transaction, init = {}) {
413
+ if (transaction === null || typeof transaction !== 'object' || Array.isArray(transaction)) {
414
+ const err = new Error('createStateWriteIntent: a base StateTransaction is required (build it with ' +
415
+ 'openStateTransaction / rebuildStateTransaction first). Per ADR-4629 §8.1, an absent ' +
416
+ 'transaction is a construction failure — do not tolerate null.');
417
+ err.code = 'STATE_WRITE_INTENT_TRANSACTION_REQUIRED';
418
+ throw err;
419
+ }
420
+ const assertions = Object.freeze((init.assertions ?? []).map((a) => Object.freeze({ field: a.field, requirement: a.requirement })));
421
+ return Object.freeze({
422
+ ...transaction,
423
+ assertions,
424
+ scope: init.scope ?? 'narrow',
425
+ });
426
+ }
380
427
  /**
381
428
  * ADR-3408 §8.2: an unenforced `preserve-when-unchanged` row throws. Both
382
429
  * ends of this invariant are gsd-core's own source — a declared row the
@@ -508,6 +555,72 @@ function preservedValuesEqual(a, b) {
508
555
  }
509
556
  return a === b;
510
557
  }
558
+ /**
559
+ * #4129: the resync-arm progress merge. A resyncing write whose scan MEASURED
560
+ * something no longer wholesale-replaces the curated block — the declared
561
+ * `progress-ratchet` mergeStrategy ("completed_plans/completed_phases only ever
562
+ * ratchet UP toward the derived value (#2969)", state-md-schema.cts) now holds
563
+ * on the write path too, matching what the read path (`shouldPreserveExistingProgress`)
564
+ * has always enforced. Rules, mirroring the `deriveProgressKeys` branch above:
565
+ *
566
+ * - total_plans / total_phases always take the derived value (#2440 — totals
567
+ * correct in BOTH directions).
568
+ * - completed_plans / completed_phases take the derived value only when it is
569
+ * strictly GREATER (#2969's `>` not `>=`); else the curated value survives
570
+ * (a hand-corrected or previously-correct counter can never be re-derived
571
+ * downward — the #4129 clobber).
572
+ * - any other key keeps the curated value (the existing branch's convention).
573
+ * - percent is RECOMPUTED from the merged counters through the single kernel
574
+ * (`computeProgressPercent`), because either side's stored percent was
575
+ * computed against that side's counters and the merged block may mix them
576
+ * (curated completed, derived totals). Recomputation runs ONLY when the
577
+ * derived block itself carried a percent — an upstream withhold
578
+ * (#1761 milestone-unbounded, #3217 scope) nulled percent deliberately and
579
+ * this merge must not resurrect it.
580
+ *
581
+ * Frontmatter scalars arrive as STRINGS ("2", not 2), so every comparison
582
+ * coerces through `toFiniteNumber` — never a `typeof === 'number'` test
583
+ * (scanMeasuredSomething's own convention).
584
+ */
585
+ function mergeResyncProgressRatchet(curatedRecord, derivedRecord) {
586
+ const merged = { ...derivedRecord };
587
+ for (const [key, value] of Object.entries(curatedRecord)) {
588
+ if (key === 'total_plans' || key === 'total_phases' || key === 'percent')
589
+ continue;
590
+ if (key === 'completed_plans' || key === 'completed_phases') {
591
+ const derivedNum = (0, state_document_cjs_2.toFiniteNumber)(derivedRecord[key]) ?? -Infinity;
592
+ const curatedNum = (0, state_document_cjs_2.toFiniteNumber)(value) ?? -Infinity;
593
+ // Ratchet up only (strictly greater, #2969); else keep curated.
594
+ if (derivedNum > curatedNum)
595
+ continue;
596
+ // Numerically EQUAL keeps the derived value VERBATIM. The two sides
597
+ // arrive in different scalar shapes (the re-parsed derived block
598
+ // carries string totals "2" while the curated snapshot carries numbers
599
+ // 2), and substituting the curated spelling over an equal derived one
600
+ // is a no-op in substance but a shape churn the §8.7 reporting loop
601
+ // would surface as a phantom `preserved-over-disagreeing-derived`
602
+ // warning (it diffs structurally). Only a curated counter that is
603
+ // STRICTLY greater replaces the derived value.
604
+ if (derivedNum === curatedNum)
605
+ continue;
606
+ merged[key] = value;
607
+ }
608
+ else {
609
+ merged[key] = value;
610
+ }
611
+ }
612
+ if ((0, state_document_cjs_2.toFiniteNumber)(derivedRecord.percent) !== null) {
613
+ const recomputed = (0, state_document_cjs_2.computeProgressPercent)((0, state_document_cjs_2.toFiniteNumber)(merged.completed_plans), (0, state_document_cjs_2.toFiniteNumber)(merged.total_plans), (0, state_document_cjs_2.toFiniteNumber)(merged.completed_phases), (0, state_document_cjs_2.toFiniteNumber)(merged.total_phases), planningScopeMod.SCOPE.COMPLETE);
614
+ // Same verbatim rule for percent: assign only when the recomputed value
615
+ // numerically differs, so a string-spelled derived percent ("67") is not
616
+ // churned into a number-spelled 67 (phantom-divergence noise, not a
617
+ // change).
618
+ if (recomputed !== null && recomputed !== (0, state_document_cjs_2.toFiniteNumber)(merged.percent)) {
619
+ merged.percent = recomputed;
620
+ }
621
+ }
622
+ return merged;
623
+ }
511
624
  /**
512
625
  * Executor for `preservation: 'preserve-always'` (ADR-3408 §8.1). Only
513
626
  * `progress` carries this policy today. Preserves #3242/#1446/#2440/#2969
@@ -523,25 +636,39 @@ function applyPreserveAlways(field, cls, ctx) {
523
636
  const derived = ctx.postFm[field];
524
637
  const derivedMeasured = scanMeasuredSomething(cls, derived);
525
638
  const curatedMeasured = scanMeasuredSomething(cls, curated);
526
- // On a resyncing write the fresh derivation is authoritative — UNLESS it
527
- // measured nothing while the curated block did (#3756), AND the caller did
528
- // not explicitly name a progress-affecting field this write. The
529
- // unmeasured-scan guard exists to stop an INCIDENTAL resync (e.g. `state
530
- // add-decision`, whose `resync` defaults true for reasons that have
531
- // nothing to do with `progress`) from dropping a real curated block when a
532
- // milestone-scoped disk scan measures nothing (#3756's archived-milestone
533
- // case). It must not also block a write the user pointed AT `progress` on
534
- // purpose: `preserve-always`'s own contract is "never overwrite unless the
535
- // caller explicitly names this field" (FIELD_CLASSIFICATION doc comment),
536
- // and `state update Progress` / `state patch Progress=...` are exactly
537
- // that naming — the resync they trigger must win even when the disk scan
538
- // it also drives (e.g. because there are no phase dirs at all) reads as
539
- // "unmeasured" (tests/frontmatter.test.cjs: "state.update \"Progress\"
540
- // resyncs progress frontmatter from the updated body", pre-existing, #3242).
541
- if (ctx.resync && (derivedMeasured || !curatedMeasured || ctx.explicitProgressField))
639
+ // On a resyncing write the fresh derivation is authoritative in two cases
640
+ // (#3756 / ADR-3473 §8.6, unchanged): when the caller EXPLICITLY named a
641
+ // progress-affecting field (`preserve-always`'s contract is "never
642
+ // overwrite unless the caller explicitly names this field" — `state update
643
+ // Progress` is exactly that naming, pre-existing #3242 behavior), and when
644
+ // the derivation measured something the curated block did not (an
645
+ // unmeasured CURATED block is not worth protecting). The unmeasured-DERIVED
646
+ // guard also stands: an incidental resync (e.g. `state add-decision`, whose
647
+ // `resync` defaults true for reasons that have nothing to do with
648
+ // `progress`) that measured nothing must not drop a real curated block
649
+ // (#3756's archived-milestone case) — that falls through to the wholesale
650
+ // restore below.
651
+ //
652
+ // #4129 narrows the remaining arm. A resyncing write whose scan MEASURED
653
+ // something while the curated block is also real previously wholesale-
654
+ // replaced the curated block with the derived one — no monotonic guard, so
655
+ // any under-counting derivation (a stale-dated verification, #2348) silently
656
+ // reverted every hand-correction and every correct value an earlier write
657
+ // had persisted, while the read path (`shouldPreserveExistingProgress`)
658
+ // kept reporting the higher stored counters. That arm now falls through to
659
+ // `mergeResyncProgressRatchet` — the declared `progress-ratchet`
660
+ // mergeStrategy, finally enforced on the write path: totals derived both
661
+ // directions (#2440), completed counters up-only (#2969), percent
662
+ // recomputed from the merged counters.
663
+ if (ctx.resync && (ctx.explicitProgressField || (derivedMeasured && !curatedMeasured)))
542
664
  return;
543
665
  let next;
544
- if (cls.mergeStrategy === 'progress-ratchet' && ctx.deriveProgressKeys && derived && derivedMeasured) {
666
+ if (cls.mergeStrategy === 'progress-ratchet' && ctx.resync && derived && derivedMeasured && curatedMeasured) {
667
+ // #4129 resync arm — see mergeResyncProgressRatchet's doc. Reached only
668
+ // after the early-out above, so curatedMeasured is guaranteed true here.
669
+ next = mergeResyncProgressRatchet(curated, (derived ?? {}));
670
+ }
671
+ else if (cls.mergeStrategy === 'progress-ratchet' && ctx.deriveProgressKeys && derived && derivedMeasured) {
545
672
  // #2440: total_plans and total_phases always take the derived (post-sync)
546
673
  // value even under !resync. This is used by cmdStatePlannedPhase where
547
674
  // total_plans must correct upward after plans are added. For body-only
@@ -824,7 +951,17 @@ function beginPhaseCore(content, intent, deps) {
824
951
  const focusLabel = intent.phaseName
825
952
  ? `Phase ${intent.phaseNumber} — ${intent.phaseName}`
826
953
  : `Phase ${intent.phaseNumber}`;
827
- const focusPattern = /(\*\*Current focus:\*\*\s*).*/i;
954
+ // #4469: anchored to line start with same-line whitespace only, mirroring
955
+ // #4243/PR #4453's fix to stateReplaceField's bold branch. The pre-fix
956
+ // pattern carried no `^`/`m` and used `\s*` (crosses newlines), so a bold
957
+ // `**Current focus:**` quoted mid-sentence elsewhere in the body (e.g. an
958
+ // Accumulated Context bullet) matched first and had the rest of its line
959
+ // silently overwritten with the new focus label -- the same #4010
960
+ // data-loss class. `[ \t]*` (not `\s*`) avoids consuming the newlines
961
+ // before the label into the match; `$` documents the match ends at
962
+ // end-of-line (inert here since `.` never crosses line terminators
963
+ // without `/s`, which is not set).
964
+ const focusPattern = /^([ \t]*\*\*Current focus:\*\*[ \t]*)(.*)$/im;
828
965
  if (focusPattern.test(body)) {
829
966
  body = body.replace(focusPattern, (_match, prefix) => `${prefix}${focusLabel}`);
830
967
  updated.push('Current focus');
@@ -1534,8 +1671,22 @@ function completePhaseCore(content, intent, deps) {
1534
1671
  body = statusAfter;
1535
1672
  updated.push('Status');
1536
1673
  }
1537
- // Current Plan — reset for the next phase.
1538
- const planAfter = (0, state_document_cjs_1.stateReplaceFieldWithFallback)(body, 'Current Plan', 'Plan', 'Not started');
1674
+ // Current Plan — reset for the next phase. #4823: when a Current Position
1675
+ // section exists (the canonical layout, #2956 locator), the reset is scoped
1676
+ // to it — the whole-body fallback 'Plan' run matched any hard-wrapped prose
1677
+ // line starting with `plan:` anywhere in the document and rewrote it to
1678
+ // 'Not started', silently destroying narrative. Legacy sectionless layouts
1679
+ // (fields at top level, no section) keep the whole-body behavior unchanged:
1680
+ // there is no section to scope to, and their fields are the intended
1681
+ // targets.
1682
+ let planAfter;
1683
+ const positionScope = (0, state_document_cjs_1.stateCurrentPositionSlice)(body);
1684
+ if (positionScope !== null) {
1685
+ planAfter = (0, markdown_sectionizer_cjs_1.withSection)(body, (h) => (h.level === 2 || h.level === 3) && h.text.trim().toLowerCase() === 'current position', (sectionBody) => (0, state_document_cjs_1.stateReplaceFieldWithFallback)(sectionBody, 'Current Plan', 'Plan', 'Not started'), { levelBounded: true });
1686
+ }
1687
+ else {
1688
+ planAfter = (0, state_document_cjs_1.stateReplaceFieldWithFallback)(body, 'Current Plan', 'Plan', 'Not started');
1689
+ }
1539
1690
  if (planAfter !== body) {
1540
1691
  body = planAfter;
1541
1692
  updated.push('Current Plan');