@hegemonart/get-design-done 1.42.0 → 1.44.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 (430) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +1126 -1038
  4. package/README.md +159 -155
  5. package/SKILL.md +42 -42
  6. package/agents/README.md +53 -53
  7. package/agents/a11y-mapper.md +3 -3
  8. package/agents/component-benchmark-harvester.md +8 -8
  9. package/agents/component-benchmark-synthesizer.md +11 -11
  10. package/agents/component-taxonomy-mapper.md +5 -5
  11. package/agents/compose-executor.md +25 -25
  12. package/agents/conflict-resolver.md +8 -8
  13. package/agents/cost-forecaster.md +12 -12
  14. package/agents/decision-journal-exporter.md +5 -5
  15. package/agents/design-advisor.md +19 -19
  16. package/agents/design-assumptions-analyzer.md +16 -16
  17. package/agents/design-auditor.md +39 -39
  18. package/agents/design-authority-watcher.md +28 -28
  19. package/agents/design-component-generator.md +27 -27
  20. package/agents/design-context-builder.md +66 -66
  21. package/agents/design-context-checker-gate.md +5 -5
  22. package/agents/design-context-checker.md +20 -20
  23. package/agents/design-discussant.md +23 -23
  24. package/agents/design-doc-writer.md +12 -12
  25. package/agents/design-executor.md +38 -38
  26. package/agents/design-figma-writer.md +31 -31
  27. package/agents/design-fixer.md +27 -27
  28. package/agents/design-integration-checker-gate.md +5 -5
  29. package/agents/design-integration-checker.md +29 -29
  30. package/agents/design-paper-writer.md +14 -14
  31. package/agents/design-pattern-mapper.md +9 -9
  32. package/agents/design-pencil-writer.md +12 -12
  33. package/agents/design-phase-researcher.md +14 -14
  34. package/agents/design-plan-checker.md +13 -13
  35. package/agents/design-planner.md +24 -24
  36. package/agents/design-reflector.md +48 -48
  37. package/agents/design-research-synthesizer.md +21 -21
  38. package/agents/design-start-writer.md +7 -7
  39. package/agents/design-update-checker.md +8 -8
  40. package/agents/design-verifier-gate.md +5 -5
  41. package/agents/design-verifier.md +80 -80
  42. package/agents/ds-generator.md +14 -14
  43. package/agents/ds-migration-planner.md +12 -12
  44. package/agents/email-executor.md +26 -26
  45. package/agents/experiment-result-ingester.md +10 -10
  46. package/agents/flutter-executor.md +28 -28
  47. package/agents/gdd-graph-refresh.md +10 -10
  48. package/agents/gdd-intel-updater.md +11 -11
  49. package/agents/gdd-learnings-extractor.md +2 -2
  50. package/agents/motion-mapper.md +8 -8
  51. package/agents/motion-verifier.md +16 -16
  52. package/agents/pdf-executor.md +27 -27
  53. package/agents/perf-analyzer.md +20 -20
  54. package/agents/pr-commenter.md +24 -24
  55. package/agents/prototype-gate.md +29 -29
  56. package/agents/quality-gate-runner.md +21 -21
  57. package/agents/rollout-coordinator.md +8 -8
  58. package/agents/swift-executor.md +41 -41
  59. package/agents/ticket-sync-agent.md +19 -19
  60. package/agents/token-mapper.md +6 -6
  61. package/agents/user-research-synthesizer.md +13 -13
  62. package/agents/visual-hierarchy-mapper.md +2 -2
  63. package/dist/claude-code/.claude/skills/add-backlog/SKILL.md +3 -3
  64. package/dist/claude-code/.claude/skills/analyze-dependencies/SKILL.md +10 -10
  65. package/dist/claude-code/.claude/skills/apply-reflections/SKILL.md +13 -13
  66. package/dist/claude-code/.claude/skills/apply-reflections/apply-reflections-procedure.md +20 -20
  67. package/dist/claude-code/.claude/skills/audit/SKILL.md +7 -7
  68. package/dist/claude-code/.claude/skills/bandit-status/SKILL.md +7 -7
  69. package/dist/claude-code/.claude/skills/benchmark/SKILL.md +7 -7
  70. package/dist/claude-code/.claude/skills/bootstrap-ds/SKILL.md +10 -10
  71. package/dist/claude-code/.claude/skills/brief/SKILL.md +20 -20
  72. package/dist/claude-code/.claude/skills/budget/SKILL.md +4 -4
  73. package/dist/claude-code/.claude/skills/cache-manager/SKILL.md +6 -6
  74. package/dist/claude-code/.claude/skills/cache-manager/cache-policy.md +5 -5
  75. package/dist/claude-code/.claude/skills/check-update/SKILL.md +5 -5
  76. package/dist/claude-code/.claude/skills/compare/SKILL.md +15 -15
  77. package/dist/claude-code/.claude/skills/compare/compare-rubric.md +17 -17
  78. package/dist/claude-code/.claude/skills/complete-cycle/SKILL.md +5 -5
  79. package/dist/claude-code/.claude/skills/connections/SKILL.md +11 -11
  80. package/dist/claude-code/.claude/skills/connections/connections-onboarding.md +76 -76
  81. package/dist/claude-code/.claude/skills/continue/SKILL.md +2 -2
  82. package/dist/claude-code/.claude/skills/darkmode/SKILL.md +17 -17
  83. package/dist/claude-code/.claude/skills/darkmode/darkmode-audit-procedure.md +7 -7
  84. package/dist/claude-code/.claude/skills/debug/SKILL.md +3 -3
  85. package/dist/claude-code/.claude/skills/debug/debug-feedback-loops.md +12 -12
  86. package/dist/claude-code/.claude/skills/design/SKILL.md +12 -12
  87. package/dist/claude-code/.claude/skills/design/design-procedure.md +23 -23
  88. package/dist/claude-code/.claude/skills/discover/SKILL.md +7 -7
  89. package/dist/claude-code/.claude/skills/discover/discover-procedure.md +18 -18
  90. package/dist/claude-code/.claude/skills/discuss/SKILL.md +12 -12
  91. package/dist/claude-code/.claude/skills/do/SKILL.md +1 -1
  92. package/dist/claude-code/.claude/skills/explore/SKILL.md +21 -21
  93. package/dist/claude-code/.claude/skills/explore/explore-procedure.md +48 -48
  94. package/dist/claude-code/.claude/skills/export/SKILL.md +9 -9
  95. package/dist/claude-code/.claude/skills/extract-learnings/SKILL.md +5 -5
  96. package/dist/claude-code/.claude/skills/fast/SKILL.md +7 -7
  97. package/dist/claude-code/.claude/skills/figma-extract/SKILL.md +11 -11
  98. package/dist/claude-code/.claude/skills/figma-write/SKILL.md +6 -6
  99. package/dist/claude-code/.claude/skills/graphify/SKILL.md +4 -4
  100. package/dist/claude-code/.claude/skills/health/SKILL.md +16 -16
  101. package/dist/claude-code/.claude/skills/health/health-mcp-detection.md +3 -3
  102. package/dist/claude-code/.claude/skills/health/health-skill-length-report.md +6 -6
  103. package/dist/claude-code/.claude/skills/help/SKILL.md +1 -1
  104. package/dist/claude-code/.claude/skills/list-assumptions/SKILL.md +4 -4
  105. package/dist/claude-code/.claude/skills/map/SKILL.md +12 -12
  106. package/dist/claude-code/.claude/skills/migrate/SKILL.md +5 -5
  107. package/dist/claude-code/.claude/skills/new-cycle/SKILL.md +2 -2
  108. package/dist/claude-code/.claude/skills/new-cycle/milestone-completeness-rubric.md +16 -16
  109. package/dist/claude-code/.claude/skills/new-project/SKILL.md +1 -1
  110. package/dist/claude-code/.claude/skills/next/SKILL.md +5 -5
  111. package/dist/claude-code/.claude/skills/note/SKILL.md +1 -1
  112. package/dist/claude-code/.claude/skills/openrouter-status/SKILL.md +4 -4
  113. package/dist/claude-code/.claude/skills/optimize/SKILL.md +15 -15
  114. package/dist/claude-code/.claude/skills/pause/SKILL.md +5 -5
  115. package/dist/claude-code/.claude/skills/peer-cli-add/SKILL.md +11 -11
  116. package/dist/claude-code/.claude/skills/peer-cli-add/peer-cli-protocol.md +39 -39
  117. package/dist/claude-code/.claude/skills/peer-cli-customize/SKILL.md +14 -14
  118. package/dist/claude-code/.claude/skills/peers/SKILL.md +4 -4
  119. package/dist/claude-code/.claude/skills/plan/SKILL.md +13 -13
  120. package/dist/claude-code/.claude/skills/plan/plan-procedure.md +24 -24
  121. package/dist/claude-code/.claude/skills/plant-seed/SKILL.md +4 -4
  122. package/dist/claude-code/.claude/skills/pr-branch/SKILL.md +2 -2
  123. package/dist/claude-code/.claude/skills/progress/SKILL.md +15 -15
  124. package/dist/claude-code/.claude/skills/quality-gate/SKILL.md +22 -22
  125. package/dist/claude-code/.claude/skills/quality-gate/threat-modeling.md +19 -19
  126. package/dist/claude-code/.claude/skills/quick/SKILL.md +5 -5
  127. package/dist/claude-code/.claude/skills/reapply-patches/SKILL.md +7 -7
  128. package/dist/claude-code/.claude/skills/reflect/SKILL.md +3 -3
  129. package/dist/claude-code/.claude/skills/reflect/procedures/capability-gap-scan.md +11 -11
  130. package/dist/claude-code/.claude/skills/report-issue/SKILL.md +5 -5
  131. package/dist/claude-code/.claude/skills/report-issue/report-issue-procedure.md +27 -27
  132. package/dist/claude-code/.claude/skills/resume/SKILL.md +9 -9
  133. package/dist/claude-code/.claude/skills/review-backlog/SKILL.md +3 -3
  134. package/dist/claude-code/.claude/skills/review-decisions/SKILL.md +3 -3
  135. package/dist/claude-code/.claude/skills/roi/SKILL.md +5 -5
  136. package/dist/claude-code/.claude/skills/rollout-status/SKILL.md +4 -4
  137. package/dist/claude-code/.claude/skills/router/SKILL.md +11 -11
  138. package/dist/claude-code/.claude/skills/router/capability-gap-emitter.md +6 -6
  139. package/dist/claude-code/.claude/skills/router/router-pick-emitter.md +9 -9
  140. package/dist/claude-code/.claude/skills/router/router-rules.md +7 -7
  141. package/dist/claude-code/.claude/skills/scan/SKILL.md +16 -16
  142. package/dist/claude-code/.claude/skills/scan/scan-procedure.md +42 -42
  143. package/dist/claude-code/.claude/skills/settings/SKILL.md +2 -2
  144. package/dist/claude-code/.claude/skills/ship/SKILL.md +7 -7
  145. package/dist/claude-code/.claude/skills/sketch/SKILL.md +10 -10
  146. package/dist/claude-code/.claude/skills/sketch-wrap-up/SKILL.md +12 -12
  147. package/dist/claude-code/.claude/skills/skill-manifest/SKILL.md +5 -5
  148. package/dist/claude-code/.claude/skills/spike/SKILL.md +7 -7
  149. package/dist/claude-code/.claude/skills/spike-wrap-up/SKILL.md +13 -13
  150. package/dist/claude-code/.claude/skills/start/SKILL.md +8 -8
  151. package/dist/claude-code/.claude/skills/start/start-procedure.md +9 -9
  152. package/dist/claude-code/.claude/skills/stats/SKILL.md +5 -5
  153. package/dist/claude-code/.claude/skills/style/SKILL.md +12 -12
  154. package/dist/claude-code/.claude/skills/style/style-doc-procedure.md +12 -12
  155. package/dist/claude-code/.claude/skills/synthesize/SKILL.md +10 -10
  156. package/dist/claude-code/.claude/skills/timeline/SKILL.md +4 -4
  157. package/dist/claude-code/.claude/skills/todo/SKILL.md +3 -3
  158. package/dist/claude-code/.claude/skills/turn-closeout/SKILL.md +10 -10
  159. package/dist/claude-code/.claude/skills/unlock-decision/SKILL.md +3 -3
  160. package/dist/claude-code/.claude/skills/update/SKILL.md +9 -9
  161. package/dist/claude-code/.claude/skills/using-gdd/SKILL.md +17 -17
  162. package/dist/claude-code/.claude/skills/verify/SKILL.md +13 -13
  163. package/dist/claude-code/.claude/skills/verify/verify-procedure.md +34 -34
  164. package/dist/claude-code/.claude/skills/warm-cache/SKILL.md +8 -8
  165. package/dist/claude-code/.claude/skills/watch-authorities/SKILL.md +9 -9
  166. package/dist/claude-code/.claude/skills/zoom-out/SKILL.md +4 -4
  167. package/package.json +9 -2
  168. package/reference/DEPRECATIONS.md +10 -10
  169. package/reference/STATE-TEMPLATE.md +26 -26
  170. package/reference/accessibility.md +13 -13
  171. package/reference/adr-format.md +13 -13
  172. package/reference/ai-native-tool-interface.md +5 -5
  173. package/reference/anti-patterns.md +9 -9
  174. package/reference/architecture-vocabulary.md +31 -31
  175. package/reference/audit-scoring.md +13 -13
  176. package/reference/authority-feeds.md +36 -36
  177. package/reference/bandit-integration.md +25 -25
  178. package/reference/brand-voice.md +36 -36
  179. package/reference/capability-gap-stage-gate.md +20 -20
  180. package/reference/checklists.md +26 -26
  181. package/reference/cli-localization.md +13 -13
  182. package/reference/codex-tools.md +2 -2
  183. package/reference/color-theory.md +28 -28
  184. package/reference/component-authoring.md +4 -4
  185. package/reference/components/README.md +13 -13
  186. package/reference/components/TEMPLATE.md +13 -13
  187. package/reference/components/accordion.md +15 -15
  188. package/reference/components/alert.md +25 -25
  189. package/reference/components/badge.md +18 -18
  190. package/reference/components/breadcrumbs.md +24 -24
  191. package/reference/components/button.md +21 -21
  192. package/reference/components/card.md +13 -13
  193. package/reference/components/checkbox.md +20 -20
  194. package/reference/components/chip.md +20 -20
  195. package/reference/components/command-palette.md +15 -15
  196. package/reference/components/date-picker.md +22 -22
  197. package/reference/components/drawer.md +13 -13
  198. package/reference/components/file-upload.md +22 -22
  199. package/reference/components/input.md +18 -18
  200. package/reference/components/label.md +25 -25
  201. package/reference/components/link.md +19 -19
  202. package/reference/components/list.md +17 -17
  203. package/reference/components/menu.md +19 -19
  204. package/reference/components/modal-dialog.md +16 -16
  205. package/reference/components/navbar.md +19 -19
  206. package/reference/components/pagination.md +18 -18
  207. package/reference/components/popover.md +12 -12
  208. package/reference/components/progress.md +18 -18
  209. package/reference/components/radio.md +17 -17
  210. package/reference/components/rich-text-editor.md +24 -24
  211. package/reference/components/select-combobox.md +16 -16
  212. package/reference/components/sidebar.md +15 -15
  213. package/reference/components/skeleton.md +20 -20
  214. package/reference/components/slider.md +20 -20
  215. package/reference/components/stepper.md +24 -24
  216. package/reference/components/switch.md +19 -19
  217. package/reference/components/table.md +21 -21
  218. package/reference/components/tabs.md +11 -11
  219. package/reference/components/toast.md +19 -19
  220. package/reference/components/tooltip.md +19 -19
  221. package/reference/components/tree.md +17 -17
  222. package/reference/composition.md +38 -38
  223. package/reference/config-schema.md +37 -37
  224. package/reference/context-md-format.md +9 -9
  225. package/reference/contrast-advanced.md +29 -29
  226. package/reference/conversational-ui.md +17 -17
  227. package/reference/cost-governance.md +14 -14
  228. package/reference/css-grid-layout.md +8 -8
  229. package/reference/cycle-handoff-preamble.md +3 -3
  230. package/reference/data-visualization.md +67 -67
  231. package/reference/debugger-philosophy.md +5 -5
  232. package/reference/design-system-guidance.md +21 -21
  233. package/reference/design-systems-catalog.md +20 -20
  234. package/reference/design-variants.md +11 -11
  235. package/reference/domains/civic-patterns.md +10 -10
  236. package/reference/domains/finance-patterns.md +9 -9
  237. package/reference/domains/gaming-patterns.md +9 -9
  238. package/reference/domains/healthcare-patterns.md +11 -11
  239. package/reference/ds-bootstrap-rubric.md +13 -13
  240. package/reference/email-design.md +22 -22
  241. package/reference/emotional-design.md +10 -10
  242. package/reference/error-recovery.md +11 -11
  243. package/reference/export-formats.md +7 -7
  244. package/reference/figma-sandbox.md +6 -6
  245. package/reference/first-principles.md +10 -10
  246. package/reference/form-patterns.md +26 -26
  247. package/reference/framer-motion-patterns.md +49 -49
  248. package/reference/gdd-runtime-audit.md +17 -17
  249. package/reference/gdd-threat-model.md +44 -44
  250. package/reference/gemini-tools.md +3 -3
  251. package/reference/gestalt.md +24 -24
  252. package/reference/heuristics.md +32 -32
  253. package/reference/i18n.md +44 -44
  254. package/reference/iconography.md +24 -24
  255. package/reference/image-optimization.md +14 -14
  256. package/reference/information-architecture.md +47 -47
  257. package/reference/intel-schema.md +1 -1
  258. package/reference/known-failure-modes.md +37 -37
  259. package/reference/meta-rules.md +5 -5
  260. package/reference/migrations/material-3-to-4.md +17 -17
  261. package/reference/migrations/mui-v6.md +16 -16
  262. package/reference/migrations/shadcn-v2.md +25 -25
  263. package/reference/migrations/tailwind-v4.md +21 -21
  264. package/reference/model-prices.md +3 -3
  265. package/reference/model-tiers.md +40 -40
  266. package/reference/motion-advanced.md +21 -21
  267. package/reference/motion-easings.md +29 -29
  268. package/reference/motion-interpolate.md +1 -1
  269. package/reference/motion-spring.md +13 -13
  270. package/reference/motion-transition-taxonomy.md +34 -34
  271. package/reference/motion.md +31 -31
  272. package/reference/multi-author-model.md +13 -13
  273. package/reference/native-platforms.md +28 -28
  274. package/reference/notification-routing.md +6 -6
  275. package/reference/onboarding-progressive-disclosure.md +32 -32
  276. package/reference/openrouter-tier-mapping.md +8 -8
  277. package/reference/palette-catalog.md +37 -37
  278. package/reference/parallelism-rules.md +20 -20
  279. package/reference/peer-cli-capabilities.md +14 -14
  280. package/reference/peer-protocols.md +21 -21
  281. package/reference/perf-budget.md +21 -21
  282. package/reference/performance.md +22 -22
  283. package/reference/platforms.md +51 -51
  284. package/reference/pr-review-integration.md +7 -7
  285. package/reference/prices/antigravity.md +3 -3
  286. package/reference/prices/augment.md +3 -3
  287. package/reference/prices/claude.md +2 -2
  288. package/reference/prices/cline.md +4 -4
  289. package/reference/prices/codebuddy.md +3 -3
  290. package/reference/prices/codex.md +2 -2
  291. package/reference/prices/copilot.md +3 -3
  292. package/reference/prices/cursor.md +3 -3
  293. package/reference/prices/gemini.md +2 -2
  294. package/reference/prices/kilo.md +3 -3
  295. package/reference/prices/opencode.md +4 -4
  296. package/reference/prices/qwen.md +2 -2
  297. package/reference/prices/trae.md +3 -3
  298. package/reference/prices/windsurf.md +3 -3
  299. package/reference/prices.openrouter.md +5 -5
  300. package/reference/print-design.md +36 -36
  301. package/reference/priority-matrix.md +2 -2
  302. package/reference/project-skills-guide.md +3 -3
  303. package/reference/proportion-systems.md +23 -23
  304. package/reference/pseudonymization-rules.md +30 -30
  305. package/reference/retrieval-contract.md +14 -14
  306. package/reference/review-format.md +7 -7
  307. package/reference/rollout-coordination.md +10 -10
  308. package/reference/rtl-cjk-cultural.md +39 -39
  309. package/reference/runtime-models.md +28 -28
  310. package/reference/shared-preamble.md +26 -26
  311. package/reference/skill-authoring-contract.md +16 -16
  312. package/reference/skill-placeholders.md +3 -3
  313. package/reference/start-interview.md +10 -10
  314. package/reference/style-vocabulary.md +25 -25
  315. package/reference/surfaces.md +4 -4
  316. package/reference/ticket-sync.md +9 -9
  317. package/reference/typography.md +64 -64
  318. package/reference/user-research.md +54 -54
  319. package/reference/variable-fonts-loading.md +15 -15
  320. package/reference/visual-hierarchy-layout.md +41 -41
  321. package/scripts/lib/harness-freshness.cjs +59 -0
  322. package/scripts/lib/health-mirror/index.cjs +27 -0
  323. package/scripts/lib/manifest/harnesses.json +280 -14
  324. package/scripts/lib/manifest/prose-denylist.json +1 -1
  325. package/scripts/lib/manifest/schemas/harnesses.schema.json +32 -0
  326. package/sdk/mcp/gdd-mcp/server.js +125 -0
  327. package/skills/add-backlog/SKILL.md +3 -3
  328. package/skills/analyze-dependencies/SKILL.md +10 -10
  329. package/skills/apply-reflections/SKILL.md +13 -13
  330. package/skills/apply-reflections/apply-reflections-procedure.md +20 -20
  331. package/skills/audit/SKILL.md +7 -7
  332. package/skills/bandit-status/SKILL.md +7 -7
  333. package/skills/benchmark/SKILL.md +7 -7
  334. package/skills/bootstrap-ds/SKILL.md +10 -10
  335. package/skills/brief/SKILL.md +20 -20
  336. package/skills/budget/SKILL.md +4 -4
  337. package/skills/cache-manager/SKILL.md +6 -6
  338. package/skills/cache-manager/cache-policy.md +5 -5
  339. package/skills/check-update/SKILL.md +5 -5
  340. package/skills/compare/SKILL.md +15 -15
  341. package/skills/compare/compare-rubric.md +17 -17
  342. package/skills/complete-cycle/SKILL.md +5 -5
  343. package/skills/connections/SKILL.md +11 -11
  344. package/skills/connections/connections-onboarding.md +76 -76
  345. package/skills/continue/SKILL.md +2 -2
  346. package/skills/darkmode/SKILL.md +17 -17
  347. package/skills/darkmode/darkmode-audit-procedure.md +7 -7
  348. package/skills/debug/SKILL.md +3 -3
  349. package/skills/debug/debug-feedback-loops.md +12 -12
  350. package/skills/design/SKILL.md +12 -12
  351. package/skills/design/design-procedure.md +23 -23
  352. package/skills/discover/SKILL.md +7 -7
  353. package/skills/discover/discover-procedure.md +18 -18
  354. package/skills/discuss/SKILL.md +12 -12
  355. package/skills/do/SKILL.md +1 -1
  356. package/skills/explore/SKILL.md +21 -21
  357. package/skills/explore/explore-procedure.md +48 -48
  358. package/skills/export/SKILL.md +9 -9
  359. package/skills/extract-learnings/SKILL.md +5 -5
  360. package/skills/fast/SKILL.md +7 -7
  361. package/skills/figma-extract/SKILL.md +11 -11
  362. package/skills/figma-write/SKILL.md +6 -6
  363. package/skills/graphify/SKILL.md +4 -4
  364. package/skills/health/SKILL.md +16 -16
  365. package/skills/health/health-mcp-detection.md +3 -3
  366. package/skills/health/health-skill-length-report.md +6 -6
  367. package/skills/help/SKILL.md +1 -1
  368. package/skills/list-assumptions/SKILL.md +4 -4
  369. package/skills/map/SKILL.md +12 -12
  370. package/skills/migrate/SKILL.md +5 -5
  371. package/skills/new-cycle/SKILL.md +2 -2
  372. package/skills/new-cycle/milestone-completeness-rubric.md +16 -16
  373. package/skills/new-project/SKILL.md +1 -1
  374. package/skills/next/SKILL.md +5 -5
  375. package/skills/note/SKILL.md +1 -1
  376. package/skills/openrouter-status/SKILL.md +4 -4
  377. package/skills/optimize/SKILL.md +15 -15
  378. package/skills/pause/SKILL.md +5 -5
  379. package/skills/peer-cli-add/SKILL.md +11 -11
  380. package/skills/peer-cli-add/peer-cli-protocol.md +39 -39
  381. package/skills/peer-cli-customize/SKILL.md +14 -14
  382. package/skills/peers/SKILL.md +4 -4
  383. package/skills/plan/SKILL.md +13 -13
  384. package/skills/plan/plan-procedure.md +24 -24
  385. package/skills/plant-seed/SKILL.md +4 -4
  386. package/skills/pr-branch/SKILL.md +2 -2
  387. package/skills/progress/SKILL.md +15 -15
  388. package/skills/quality-gate/SKILL.md +22 -22
  389. package/skills/quality-gate/threat-modeling.md +19 -19
  390. package/skills/quick/SKILL.md +5 -5
  391. package/skills/reapply-patches/SKILL.md +7 -7
  392. package/skills/reflect/SKILL.md +3 -3
  393. package/skills/reflect/procedures/capability-gap-scan.md +11 -11
  394. package/skills/report-issue/SKILL.md +5 -5
  395. package/skills/report-issue/report-issue-procedure.md +27 -27
  396. package/skills/resume/SKILL.md +9 -9
  397. package/skills/review-backlog/SKILL.md +3 -3
  398. package/skills/review-decisions/SKILL.md +3 -3
  399. package/skills/roi/SKILL.md +5 -5
  400. package/skills/rollout-status/SKILL.md +4 -4
  401. package/skills/router/SKILL.md +11 -11
  402. package/skills/router/capability-gap-emitter.md +6 -6
  403. package/skills/router/router-pick-emitter.md +9 -9
  404. package/skills/router/router-rules.md +7 -7
  405. package/skills/scan/SKILL.md +16 -16
  406. package/skills/scan/scan-procedure.md +42 -42
  407. package/skills/settings/SKILL.md +2 -2
  408. package/skills/ship/SKILL.md +7 -7
  409. package/skills/sketch/SKILL.md +10 -10
  410. package/skills/sketch-wrap-up/SKILL.md +12 -12
  411. package/skills/skill-manifest/SKILL.md +5 -5
  412. package/skills/spike/SKILL.md +7 -7
  413. package/skills/spike-wrap-up/SKILL.md +13 -13
  414. package/skills/start/SKILL.md +8 -8
  415. package/skills/start/start-procedure.md +9 -9
  416. package/skills/stats/SKILL.md +5 -5
  417. package/skills/style/SKILL.md +12 -12
  418. package/skills/style/style-doc-procedure.md +12 -12
  419. package/skills/synthesize/SKILL.md +10 -10
  420. package/skills/timeline/SKILL.md +4 -4
  421. package/skills/todo/SKILL.md +3 -3
  422. package/skills/turn-closeout/SKILL.md +10 -10
  423. package/skills/unlock-decision/SKILL.md +3 -3
  424. package/skills/update/SKILL.md +9 -9
  425. package/skills/using-gdd/SKILL.md +17 -17
  426. package/skills/verify/SKILL.md +13 -13
  427. package/skills/verify/verify-procedure.md +34 -34
  428. package/skills/warm-cache/SKILL.md +8 -8
  429. package/skills/watch-authorities/SKILL.md +9 -9
  430. package/skills/zoom-out/SKILL.md +4 -4
package/CHANGELOG.md CHANGED
@@ -4,9 +4,97 @@ All notable changes to get-design-done are documented here. Versions follow [sem
4
4
 
5
5
  ---
6
6
 
7
+ ## [1.44.0] - 2026-06-02
8
+
9
+ ### Phase 44 - Harness Capability Matrix
10
+
11
+ Verifying support for a harness used to mean reading five reference files plus the README, with no "is
12
+ this still current?" stamp anywhere. Phase 44 consolidates it into a generated `HARNESSES.md` backed by
13
+ one source of truth, with an honest status taxonomy and a freshness gate. Planned and executed via the GSD
14
+ pipeline (parallel research + pattern-mapper subagents, then parallel executor agents). No new runtime
15
+ dependency, no new egress.
16
+
17
+ ### Breaking changes
18
+
19
+ - **A harness freshness gate now runs in CI.** `npm run check:harness-freshness` warns at 60 days and
20
+ fails at 180 days for harnesses marked `tested` (others report `n/a` and never fail). A `tested` harness
21
+ whose `last_verified` stamp goes stale will fail the build until re-verified with
22
+ `npm run verify:harness <id>`. CI also gains `npm run build:harnesses:check` (HARNESSES.md drift gate)
23
+ and `npm run validate:manifest`. Contributors editing harness support must edit
24
+ `scripts/lib/manifest/harnesses.json` and regenerate `HARNESSES.md`; see `CONTRIBUTING.md`.
25
+
26
+ ### Added
27
+
28
+ - **`HARNESSES.md`** at repo root - the human-readable capability matrix (skill discovery, command syntax,
29
+ MCP, placeholder substitution, install path, status) + per-harness deep-dive links + a `Last verified`
30
+ stamp. GENERATED by `scripts/generate-harnesses-md.cjs` from the SoT; CI drift-gates it.
31
+ - **Harness matrix as a view of the Phase 41.5 SoT** - `scripts/lib/manifest/harnesses.json` records gain
32
+ a `capability_matrix` + `last_verified` + `fragment_links`; the manifest schema + `validate:manifest`
33
+ gate them. Unified with Phase 42's `harness-configs.cjs` (a `phase-44-harness-agreement` test fails on
34
+ any ID or command-syntax disagreement).
35
+ - **`scripts/lib/harness-freshness.cjs`** (shippable, pure, status-aware) + `scripts/check-harness-freshness.cjs`
36
+ (CLI) + `gdd:health` check #8 (`harness_freshness`).
37
+ - **`scripts/verify-harness.cjs <id>`** - runs the Phase 42 compile + smoke, then atomically stamps
38
+ `last_verified` and regenerates `HARNESSES.md`.
39
+ - **Honest status taxonomy** - `claude` is `tested`; the five peer-CLI runtimes (codex, gemini, cursor,
40
+ copilot, qwen) are `experimental`; the other eight are `untested`. The five reference fragments stay as
41
+ appendices, cross-linked from the matrix (a cross-link checker fails generation on a broken anchor).
42
+
43
+ ### Notes
44
+
45
+ - 6-manifest lockstep at **v1.44.0** + `OFF_CADENCE_VERSIONS.add('1.44.0')` + 37 `manifests-version.txt`
46
+ baselines forward-propagated 1.43.0 -> 1.44.0.
47
+ - `gdd_health` now returns 8 checks (harness_freshness added). The generator, freshness CLI, and verify
48
+ script are maintainer-only (not shipped); only `scripts/lib/harness-freshness.cjs` ships. Tarball golden
49
+ 868 -> 869 (+`scripts/lib/harness-freshness.cjs`). `HARNESSES.md` is repo-root, not in the npm tarball.
50
+
51
+ ---
52
+
53
+ ## [1.43.0] - 2026-06-02
54
+
55
+ ### Phase 43 - Editorial Quality Floor
56
+
57
+ Get Design Done audits design quality but never held its own prose to the same bar. Phase 43 ships a
58
+ build-time editorial lint that fails CI on em dashes, prose double hyphens, and AI-prose tells in the
59
+ project's own documentation. No new runtime dependency, no new egress.
60
+
61
+ ### Breaking changes
62
+
63
+ - **Contributors must keep prose clean of em dashes, prose double hyphens, and the AI-tell denylist.**
64
+ `npm run lint:prose` is now a CI gate over `README.md`, `README.*.md`, `SKILL.md`, `source/skills/**`,
65
+ `agents/**`, `CHANGELOG.md`, and `reference/**` (bodies AND frontmatter `description` fields). Put CLI
66
+ flags in code spans; replace an em dash with a comma, colon, parentheses, or a spaced hyphen; wrap a
67
+ genuine quote in a `prose-lint-disable` block. See `STYLE.md` and `CONTRIBUTING.md`. The one-time purge
68
+ rewrote roughly 6700 em dashes plus tells across the existing corpus, so CI starts green.
69
+
70
+ ### Added
71
+
72
+ - **`scripts/lint-prose.cjs`** (maintainer, `npm run lint:prose`) - dep-free editorial linter reading the
73
+ shared denylist at `scripts/lib/manifest/prose-denylist.json` (the Phase 41.5 SoT). Skips fenced code
74
+ (any indent, nested), inline code (per-line, stray-tick-safe), frontmatter, HTML comments,
75
+ `prose-lint-disable` blocks, and Cyrillic-majority files. The double-hyphen rule uses an exactly-two
76
+ guard so structural `---` (tables, rules, frontmatter) never trips.
77
+ - **`STYLE.md`** at repo root, generated from the denylist by `scripts/generate-style-md.cjs`
78
+ (`npm run build:style`; CI drift-gated via `build:style:check`).
79
+ - **Frontmatter description denylist** (SC#7): `lint:prose` also checks skill and agent `description`
80
+ fields for em dashes and tells (the `--` flag token is exempt there, since descriptions name flags).
81
+ - **`CONTRIBUTING.md`** editorial-style section; regression fixtures at `test/fixtures/baselines/phase-43/`
82
+ (clean, violations, Cyrillic-skip).
83
+
84
+ ### Notes
85
+
86
+ - 6-manifest lockstep at **v1.43.0** + `OFF_CADENCE_VERSIONS.add('1.43.0')` + 37 `manifests-version.txt`
87
+ baselines forward-propagated 1.42.0 -> 1.43.0.
88
+ - The purge changed skill/agent prose, so 18 snapshot/assertion fixtures were reconciled (regenerated
89
+ byte-for-byte SKILL.md baselines + hyphenated em-dash literals in 7 baseline tests). `lint-prose.cjs`
90
+ and `generate-style-md.cjs` are maintainer-only (not shipped); `STYLE.md` is contributor-facing (not in
91
+ the npm tarball). Tarball file list unchanged.
92
+
93
+ ---
94
+
7
95
  ## [1.42.0] - 2026-06-02
8
96
 
9
- ### Phase 42 Multi-Harness Source Compilation
97
+ ### Phase 42 - Multi-Harness Source Compilation
10
98
 
11
99
  One skill source, N provider bundles. The README advertised 14 harnesses but every skill hard-coded
12
100
  Claude syntax (`/gdd:`…). Phase 42 authors each skill **once** in `source/skills/` with placeholders and
@@ -20,26 +108,26 @@ compiles per-harness bundles via a pure transformer factory that reads the Phase
20
108
  tree is regenerated from it for the Claude-Code default, and CI's `npm run build:skills:check` fails on
21
109
  any drift. **Contributors must edit `source/skills/`, never `skills/` directly**, then run
22
110
  `npm run build:skills` and commit the regenerated `skills/` + `dist/claude-code/`. The plugin contract is
23
- unchanged `.claude-plugin/plugin.json` still loads `./skills/`, now produced from `source/skills/`.
111
+ unchanged - `.claude-plugin/plugin.json` still loads `./skills/`, now produced from `source/skills/`.
24
112
  See `reference/DEPRECATIONS.md` → Authoring surfaces and `reference/skill-placeholders.md`.
25
113
 
26
114
  ### Added
27
115
 
28
- - **`source/skills/`** all 83 skills (107 `.md`) authored once with placeholders. `/gdd:` →
116
+ - **`source/skills/`** - all 83 skills (107 `.md`) authored once with placeholders. `/gdd:` →
29
117
  `{{command_prefix}}` is a pure string inverse, so the Claude compile reproduces `skills/` byte-for-byte.
30
- - **`scripts/lib/build/factory.cjs`** the pure `compile(text, config)` transformer (no I/O): the four
118
+ - **`scripts/lib/build/factory.cjs`** - the pure `compile(text, config)` transformer (no I/O): the four
31
119
  placeholders, `<!-- harness-only: a,b -->` blocks, and `\{{…}}` escapes.
32
- - **`scripts/lib/build/harness-configs.cjs`** per-harness substitutions layered over
120
+ - **`scripts/lib/build/harness-configs.cjs`** - per-harness substitutions layered over
33
121
  `scripts/lib/manifest/harnesses.json` (41.5). 14 records; `codex` is the flat-prefix (`/gdd-`) outlier.
34
122
  Adding a 15th harness = one manifest entry plus an optional override row.
35
- - **`scripts/build-skills.cjs`** (`npm run build:skills`, `build:skills:check`) orchestrator with
123
+ - **`scripts/build-skills.cjs`** (`npm run build:skills`, `build:skills:check`) - orchestrator with
36
124
  `--harness`, `--check` (drift gate), and `--zip`. Writes `dist/<bundle>/<configDir>/skills/…` and
37
125
  regenerates `skills/` in place. Idempotent + byte-stable.
38
- - **`dist/claude-code/`** the default Claude-Code bundle, committed + shipped in the npm tarball (other
126
+ - **`dist/claude-code/`** - the default Claude-Code bundle, committed + shipped in the npm tarball (other
39
127
  per-harness bundles stay build-only artifacts; `--zip` packages them for releases).
40
- - **`gdd-sdk build skills [--harness <id>] [--zip] [--check]`** SDK CLI surface (operates in a repo clone
128
+ - **`gdd-sdk build skills [--harness <id>] [--zip] [--check]`** - SDK CLI surface (operates in a repo clone
41
129
  where `source/skills/` is present; the orchestrator + source are dev-only, not shipped).
42
- - **`reference/skill-placeholders.md`** the placeholder catalogue + per-harness substitution table +
130
+ - **`reference/skill-placeholders.md`** - the placeholder catalogue + per-harness substitution table +
43
131
  escape and harness-only rules.
44
132
 
45
133
  ### Notes
@@ -55,29 +143,29 @@ compiles per-harness bundles via a pure transformer factory that reads the Phase
55
143
 
56
144
  ## [1.41.5] - 2026-06-02
57
145
 
58
- ### Phase 41.5 SoT Manifest Consolidation
146
+ ### Phase 41.5 - SoT Manifest Consolidation
59
147
 
60
148
  A 2026-05-16 audit found Phase 42/44/45/47 each scoping its own "single source of truth" in a different
61
- corner four formats, four schemas, four CI drift gates. 41.5 lands **one** root, **one** schema
149
+ corner - four formats, four schemas, four CI drift gates. 41.5 lands **one** root, **one** schema
62
150
  directory, **one** validator, **before** those phases plan their work. **No new runtime dependency, no
63
151
  new egress.**
64
152
 
65
153
  ### Added
66
154
 
67
- - **`scripts/lib/manifest/`** the cross-phase SoT root:
68
- - `loader.cjs` the one shared reader; a missing/unparseable file returns an empty fallback + a
155
+ - **`scripts/lib/manifest/`** - the cross-phase SoT root:
156
+ - `loader.cjs` - the one shared reader; a missing/unparseable file returns an empty fallback + a
69
157
  one-line warning (never throws), with a file-mtime cache. Dep-free.
70
- - `index.cjs` typed readers `readHarnesses()` / `readSkills()` / `readProseDenylist()`.
71
- - `harnesses.json` (+ `.cjs` view) the 14 canonical runtimes (Phase 42 adds build config, Phase 45
72
- the capability matrix, as views of this one record). `skills.json` the 83 live skill names (Phase
73
- 47 enriches). `prose-denylist.json` the AI-tell denylist + em-dash/`--` markers (Phase 43/44 consume).
74
- - `schemas/*.schema.json` one JSON Schema per manifest. `README.md` the contract + migration note.
75
- - **`scripts/validate-manifest.cjs`** (`npm run validate:manifest`) the single ajv CI gate that
158
+ - `index.cjs` - typed readers `readHarnesses()` / `readSkills()` / `readProseDenylist()`.
159
+ - `harnesses.json` (+ `.cjs` view) - the 14 canonical runtimes (Phase 42 adds build config, Phase 45
160
+ the capability matrix, as views of this one record). `skills.json` - the 83 live skill names (Phase
161
+ 47 enriches). `prose-denylist.json` - the AI-tell denylist + em-dash/`--` markers (Phase 43/44 consume).
162
+ - `schemas/*.schema.json` - one JSON Schema per manifest. `README.md` - the contract + migration note.
163
+ - **`scripts/validate-manifest.cjs`** (`npm run validate:manifest`) - the single ajv CI gate that
76
164
  replaces the four per-file drift gates 43/44/45/47 would each have shipped.
77
165
 
78
166
  ### Notes
79
167
 
80
- - **No new runtime dependency** the shipped `loader.cjs`/`index.cjs` are dep-free; `validate-manifest.cjs`
168
+ - **No new runtime dependency** - the shipped `loader.cjs`/`index.cjs` are dep-free; `validate-manifest.cjs`
81
169
  uses the already-present `ajv` and is maintainer-only (not shipped, like `lint-changelog.cjs`).
82
170
  - 6-manifest lockstep at **v1.41.5** + `OFF_CADENCE_VERSIONS.add('1.41.5')` + the 36 live-pinned
83
171
  `manifests-version.txt` baselines forward-propagated 1.41.0 → 1.41.5.
@@ -87,44 +175,44 @@ new egress.**
87
175
 
88
176
  ## [1.41.0] - 2026-06-02
89
177
 
90
- ### Phase 41 Deterministic Anti-Pattern CLI (`gdd-detect`)
178
+ ### Phase 41 - Deterministic Anti-Pattern CLI (`gdd-detect`)
91
179
 
92
180
  GDD's BAN-NN anti-pattern catalogue was consumable only by spawning a Claude session through
93
- `design-auditor` no fast CI gate, no pre-commit hook, no zero-LLM regression check. 41 ships
181
+ `design-auditor` - no fast CI gate, no pre-commit hook, no zero-LLM regression check. 41 ships
94
182
  **`gdd-detect`**: a **dep-free, offline** Node CLI that scans HTML/CSS/JSX for the 11 statically-
95
183
  detectable BAN rules and emits JSON or human findings, each linked to its catalogue paragraph.
96
184
  (Inspired by `pbakaus/impeccable`.) **No new runtime dependency, no new egress.**
97
185
 
98
186
  ### Breaking changes
99
187
 
100
- **None.** `gdd-detect` is purely additive a new `bin` entry + a new `lint:design` script + new
188
+ **None.** `gdd-detect` is purely additive - a new `bin` entry + a new `lint:design` script + new
101
189
  `scripts/lib/detect/` modules. Nothing existing changes behavior; `design-auditor` swaps its inline
102
190
  BAN greps for a `gdd-detect --json` call (same findings, deterministic). Upgrading from v1.40.5 is a no-op for existing workflows.
103
191
 
104
192
  ### Added
105
193
 
106
- - **`bin/gdd-detect`** (`gdd-detect <path> [--json] [--fast] [--rule BAN-NN] [--puppeteer]`) exit
194
+ - **`bin/gdd-detect`** (`gdd-detect <path> [--json] [--fast] [--rule BAN-NN] [--puppeteer]`) - exit
107
195
  `0` clean / `2` findings / `1` invocation error. Recursive scan of HTML/CSS/JSX/TSX.
108
- - **`scripts/lib/detect/`** a pure, dep-free engine + `rule-schema.json` + 11 per-rule matchers
196
+ - **`scripts/lib/detect/`** - a pure, dep-free engine + `rule-schema.json` + 11 per-rule matchers
109
197
  (`rules/ban-NN.cjs`) ported verbatim from the catalogue's own `**Grep**` patterns
110
198
  (BAN-01/02/03/05/06/07/08/09/11/12/13). BAN-04 + BAN-10 are subjective (matcher-exempt).
111
- - **`scripts/sync-rule-catalogue.cjs`** bidirectional parity gate: every rule ↔ a `### BAN-NN:`
199
+ - **`scripts/sync-rule-catalogue.cjs`** - bidirectional parity gate: every rule ↔ a `### BAN-NN:`
112
200
  heading + a `bdId: BAN-NN` marker; no orphans; no un-ported detectable rule.
113
- - **`scripts/hooks/pre-commit-detect.sh`** opt-in pre-commit scaffold.
201
+ - **`scripts/hooks/pre-commit-detect.sh`** - opt-in pre-commit scaffold.
114
202
  - **`lint:design`** npm script + `sync:rule-catalogue` npm script.
115
203
 
116
204
  ### Changed
117
205
 
118
- - **`reference/anti-patterns.md`** `bdId: BAN-NN` markers under every BAN heading.
119
- - **`agents/design-auditor.md`** Pillar-7 inline BAN greps replaced by one `gdd-detect --json` call.
120
- - **`skills/quality-gate/SKILL.md`** `lint:design` added to the Phase-25 auto-detect linter allowlist.
206
+ - **`reference/anti-patterns.md`** - `bdId: BAN-NN` markers under every BAN heading.
207
+ - **`agents/design-auditor.md`** - Pillar-7 inline BAN greps replaced by one `gdd-detect --json` call.
208
+ - **`skills/quality-gate/SKILL.md`** - `lint:design` added to the Phase-25 auto-detect linter allowlist.
121
209
 
122
210
  ### Notes
123
211
 
124
212
  - **Two execution paths**: regex-fast (the dep-free default) and DOM-aware (`jsdom`, a soft
125
- `try-require` optional **not** a `package.json` dependency); `--fast` forces regex; absent jsdom
213
+ `try-require` optional - **not** a `package.json` dependency); `--fast` forces regex; absent jsdom
126
214
  falls back with a one-line warning. A `http(s)://` path needs `--puppeteer` (also soft-optional) and
127
- prints a clear install message otherwise never a stack trace. The CLI is **offline by default** (a
215
+ prints a clear install message otherwise - never a stack trace. The CLI is **offline by default** (a
128
216
  static network-isolation test fails the build on any network primitive in the detect tree).
129
217
  - 6-manifest lockstep at **v1.41.0** + `OFF_CADENCE_VERSIONS.add('1.41.0')` (minor) + the 35 live-pinned
130
218
  `manifests-version.txt` baselines forward-propagated 1.40.5 → 1.41.0.
@@ -135,29 +223,29 @@ BAN greps for a `gdd-detect --json` call (same findings, deterministic). Upgradi
135
223
 
136
224
  ## [1.40.5] - 2026-06-01
137
225
 
138
- ### Phase 40.5 GDD CLI Localization
226
+ ### Phase 40.5 - GDD CLI Localization
139
227
 
140
228
  GDD's README is multilingual, but the CLI talked English. 40.5 adds locale resolution + per-locale
141
- message tables for the highest-traffic surface `--help`, common error messages, and skill prompt
229
+ message tables for the highest-traffic surface - `--help`, common error messages, and skill prompt
142
230
  headers. English is always the final fallback, so a partial locale never breaks the CLI. **No new
143
231
  runtime dependency, no new egress.**
144
232
 
145
233
  ### Added
146
234
 
147
- - **`scripts/lib/i18n/index.cjs`** locale resolver: `resolveLocale` (`config.locale` > env `LANG`/`LC_ALL` > `en`), `fallbackChain` (`locale → base → en`), `translate` (chain walk; a missing key returns the key, never throws), `descriptionFor` (`description_i18n` || English). Pure functions + a thin `loadTable` reader.
148
- - **`scripts/lib/i18n/messages/{en,ru,uk,de,fr,zh,ja}.json`** flat message tables. `en` is the complete source (24 keys: `help.*`/`error.*`/`prompt.*`/`status.*`), `ru` a full translation, `uk`/`de`/`fr`/`zh`/`ja` placeholders (a `_meta` marker + a starter subset) that fall back to English.
149
- - **`skills/locale/SKILL.md`** (`/gdd:locale [<code>]`) inspect the resolved locale + per-locale coverage, or set `.design/config.json#locale`.
150
- - **`reference/cli-localization.md`** the resolver contract + the add-a-locale contribution path (translate the table, add a `NOTICE` translator credit, open a PR; warn-only completeness). Registered. Distinct from `reference/i18n.md` (which covers *user-design* i18n).
235
+ - **`scripts/lib/i18n/index.cjs`** - locale resolver: `resolveLocale` (`config.locale` > env `LANG`/`LC_ALL` > `en`), `fallbackChain` (`locale → base → en`), `translate` (chain walk; a missing key returns the key, never throws), `descriptionFor` (`description_i18n` || English). Pure functions + a thin `loadTable` reader.
236
+ - **`scripts/lib/i18n/messages/{en,ru,uk,de,fr,zh,ja}.json`** - flat message tables. `en` is the complete source (24 keys: `help.*`/`error.*`/`prompt.*`/`status.*`), `ru` a full translation, `uk`/`de`/`fr`/`zh`/`ja` placeholders (a `_meta` marker + a starter subset) that fall back to English.
237
+ - **`skills/locale/SKILL.md`** (`/gdd:locale [<code>]`) - inspect the resolved locale + per-locale coverage, or set `.design/config.json#locale`.
238
+ - **`reference/cli-localization.md`** - the resolver contract + the add-a-locale contribution path (translate the table, add a `NOTICE` translator credit, open a PR; warn-only completeness). Registered. Distinct from `reference/i18n.md` (which covers *user-design* i18n).
151
239
 
152
240
  ### Changed
153
241
 
154
- - **`reference/schemas/config.schema.json`** + `locale` (enum en/ru/uk/de/fr/zh/ja); `generated.d.ts` regenerated.
155
- - **`agents/README.md`** document the opt-in `description_i18n` frontmatter field (falls back to the English `description`; backward-compatible the 28.5 contract validates it only when present).
242
+ - **`reference/schemas/config.schema.json`** - + `locale` (enum en/ru/uk/de/fr/zh/ja); `generated.d.ts` regenerated.
243
+ - **`agents/README.md`** - document the opt-in `description_i18n` frontmatter field (falls back to the English `description`; backward-compatible - the 28.5 contract validates it only when present).
156
244
 
157
245
  ### Notes
158
246
 
159
247
  - **No new runtime dependency, no new egress.** Pure resolver + JSON tables + docs.
160
- - The completeness gate is **warn-only** only `en` + `ru` are full; the five placeholder locales rely on the English fallback and are never required to be 100%.
248
+ - The completeness gate is **warn-only** - only `en` + `ru` are full; the five placeholder locales rely on the English fallback and are never required to be 100%.
161
249
  - 6-manifest lockstep at **v1.40.5** + `OFF_CADENCE_VERSIONS.add('1.40.5')` + the 34 live-pinned `manifests-version.txt` baselines forward-propagated 1.40.0 → 1.40.5.
162
250
  - Inventory relock: registry-diff 159 → 160 (+`cli-localization`), skill-list 82 → 83 (+`locale`), skill-length-distribution relocked, tarball golden 721 → 731 (+10). No agent/event deltas. Root `SKILL.md` command table += `locale`.
163
251
 
@@ -165,9 +253,9 @@ runtime dependency, no new egress.**
165
253
 
166
254
  ## [1.40.0] - 2026-06-01
167
255
 
168
- ### Phase 40 Team Collaboration Mode
256
+ ### Phase 40 - Team Collaboration Mode
169
257
 
170
- The largest architectural phase: GDD's single-operator baseline (Phase 20 lockfile + atomic STATE.md) now extends to **multiple developers**. Multi-writer STATE.md merges per-section, decisions are attributed + reviewed through an async queue with hard locks, a conflict-resolver reconciles parallel branches, decisions export to a read-only shared journal, and per-section permissions + sectional handoff gate who writes what. Everything is **git-native + advisory** no server, no live multiplayer, no SSO. **No new runtime dependency, no new egress.**
258
+ The largest architectural phase: GDD's single-operator baseline (Phase 20 lockfile + atomic STATE.md) now extends to **multiple developers**. Multi-writer STATE.md merges per-section, decisions are attributed + reviewed through an async queue with hard locks, a conflict-resolver reconciles parallel branches, decisions export to a read-only shared journal, and per-section permissions + sectional handoff gate who writes what. Everything is **git-native + advisory** - no server, no live multiplayer, no SSO. **No new runtime dependency, no new egress.**
171
259
 
172
260
  ### Breaking changes
173
261
 
@@ -175,22 +263,22 @@ The largest architectural phase: GDD's single-operator baseline (Phase 20 lockfi
175
263
 
176
264
  ### Added
177
265
 
178
- - **`reference/multi-author-model.md`** the team-collaboration contract (merge model, attribution, review queue + locks, lock policy, sectional handoff, permissions, journal export + PR threading, opt-in sync). Registered.
179
- - **`scripts/lib/collab/`** 7 pure, dep-free cores: `attribution` (decision `[author= co-author=]` suffix), `section-merge` (git-merge-driver per-section semantic merge union by D-id, conflict only on same-id divergence), `lock-policy` (team-mode advisory-lock backoff), `review-queue` (proposed→reviewing→approved→locked + audited unlock), `cycle-mode` (sectional handoff stage gate), `permissions` (per-section `can()`), `sync-backend` (git/s3/git-lfs selector).
180
- - **`agents/conflict-resolver.md`** three-way STATE.md merge, per-section + human-confirmed; never auto-picks or drops a decision.
181
- - **`agents/decision-journal-exporter.md`** `<decisions>` → `pseudonymize` → read-only Notion/Confluence on cycle close (write-only; degrades to local markdown).
266
+ - **`reference/multi-author-model.md`** - the team-collaboration contract (merge model, attribution, review queue + locks, lock policy, sectional handoff, permissions, journal export + PR threading, opt-in sync). Registered.
267
+ - **`scripts/lib/collab/`** - 7 pure, dep-free cores: `attribution` (decision `[author= co-author=]` suffix), `section-merge` (git-merge-driver per-section semantic merge - union by D-id, conflict only on same-id divergence), `lock-policy` (team-mode advisory-lock backoff), `review-queue` (proposed→reviewing→approved→locked + audited unlock), `cycle-mode` (sectional handoff stage gate), `permissions` (per-section `can()`), `sync-backend` (git/s3/git-lfs selector).
268
+ - **`agents/conflict-resolver.md`** - three-way STATE.md merge, per-section + human-confirmed; never auto-picks or drops a decision.
269
+ - **`agents/decision-journal-exporter.md`** - `<decisions>` → `pseudonymize` → read-only Notion/Confluence on cycle close (write-only; degrades to local markdown).
182
270
  - **`skills/review-decisions/SKILL.md`** (`/gdd:review-decisions`) + **`skills/unlock-decision/SKILL.md`** (`/gdd:unlock-decision <id> --approver`, the only audited escape from a hard lock).
183
271
 
184
272
  ### Changed
185
273
 
186
- - **`reference/schemas/config.schema.json`** + `gdd_cycle_mode` (designer|dev|full) + `permissions` + `collab` (multi_writer_enabled / lock_timeout_ms / sync_backend); `generated.d.ts` regenerated.
187
- - **`reference/STATE-TEMPLATE.md`** document the optional decision attribution suffix.
188
- - **`agents/design-reflector.md`** a "Per-author patterns" note (reads attribution).
189
- - **`agents/pr-commenter.md`** thread PR comments on `D-XX` decisions (team-mode).
274
+ - **`reference/schemas/config.schema.json`** - + `gdd_cycle_mode` (designer|dev|full) + `permissions` + `collab` (multi_writer_enabled / lock_timeout_ms / sync_backend); `generated.d.ts` regenerated.
275
+ - **`reference/STATE-TEMPLATE.md`** - document the optional decision attribution suffix.
276
+ - **`agents/design-reflector.md`** - a "Per-author patterns" note (reads attribution).
277
+ - **`agents/pr-commenter.md`** - thread PR comments on `D-XX` decisions (team-mode).
190
278
 
191
279
  ### Notes
192
280
 
193
- - **No new runtime dependency, no new egress** 7 pure cores + reference/agent/skill prose + an additive config-schema; the live S3/git-LFS sync client is explicitly out of scope (the selector ships, the backend is pluggable).
281
+ - **No new runtime dependency, no new egress** - 7 pure cores + reference/agent/skill prose + an additive config-schema; the live S3/git-LFS sync client is explicitly out of scope (the selector ships, the backend is pluggable).
194
282
  - 6-manifest lockstep at **v1.40.0** + `OFF_CADENCE_VERSIONS.add('1.40.0')` (a minor bump) + the 33 live-pinned `manifests-version.txt` baselines forward-propagated 1.39.5 → 1.40.0.
195
283
  - Inventory relock: registry-diff 158 → 159 (+`multi-author-model`), skill-list 80 → 82 (+`review-decisions`, +`unlock-decision`), agent-list +`conflict-resolver` +`decision-journal-exporter` + both frontmatter-snapshots, skill-length-distribution relocked, tarball golden 709 → 721 (+12). Root `SKILL.md` command table += both skills.
196
284
 
@@ -198,13 +286,13 @@ The largest architectural phase: GDD's single-operator baseline (Phase 20 lockfi
198
286
 
199
287
  ## [1.39.5] - 2026-06-01
200
288
 
201
- ### Phase 39.5 GDD Self-Migration Tooling
289
+ ### Phase 39.5 - GDD Self-Migration Tooling
202
290
 
203
291
  GDD migrates *user* design systems (39.1) but had no systematic story for **its own** breaking
204
- changes Phase 31.5 moved `scripts/lib/**` → `sdk/**` with ad-hoc shims. 39.5 formalizes it: a
292
+ changes - Phase 31.5 moved `scripts/lib/**` → `sdk/**` with ad-hoc shims. 39.5 formalizes it: a
205
293
  machine-readable deprecation registry, a version-aware reader, a `/gdd:migrate` skill, a post-update
206
294
  advisory, and two CI gates (a completeness check + a CHANGELOG Breaking-changes linter). **No new
207
- runtime dependency, no new egress** two pure helpers + a docs/skill surface.
295
+ runtime dependency, no new egress** - two pure helpers + a docs/skill surface.
208
296
 
209
297
  ### Breaking changes
210
298
 
@@ -213,22 +301,22 @@ None. (This release *adds* the deprecation machinery; it removes nothing. The hi
213
301
 
214
302
  ### Added
215
303
 
216
- - **`reference/DEPRECATIONS.md`** a `## Path migrations (machine-readable)` table
304
+ - **`reference/DEPRECATIONS.md`** - a `## Path migrations (machine-readable)` table
217
305
  (`Since · Removed in · Old · New · Migration hint`) + status semantics, backfilled with the 10
218
306
  verified Phase 31.5 → `sdk/` removals (all confirmed gone from the tree).
219
- - **`scripts/lib/deprecation-registry.cjs`** pure, dep-free reader: `compareVersions`,
307
+ - **`scripts/lib/deprecation-registry.cjs`** - pure, dep-free reader: `compareVersions`,
220
308
  `parseDeprecations` (markdown-table parser), `classify` (pending/deprecated/removed by version),
221
309
  `checkReference`.
222
- - **`skills/migrate/SKILL.md`** (`/gdd:migrate [--yes] [--dry-run]`) scans a project's references for
310
+ - **`skills/migrate/SKILL.md`** (`/gdd:migrate [--yes] [--dry-run]`) - scans a project's references for
223
311
  paths deprecated/removed at the installed version and **previews a diff** before rewriting. Preview-first.
224
- - **`scripts/lint-changelog.cjs`** (`npm run lint:changelog`) every `## [x.y.0]` minor at/after the
312
+ - **`scripts/lint-changelog.cjs`** (`npm run lint:changelog`) - every `## [x.y.0]` minor at/after the
225
313
  1.39.0 floor must declare a `### Breaking changes` section; historical minors are grandfathered.
226
- - **`test/suite/deprecation-completeness.test.cjs`** the SC#4 gate: every `removed` entry's old path
314
+ - **`test/suite/deprecation-completeness.test.cjs`** - the SC#4 gate: every `removed` entry's old path
227
315
  is gone + its replacement exists; every `deprecated` entry still has a shim. No orphan entries.
228
316
 
229
317
  ### Changed
230
318
 
231
- - **`skills/update/SKILL.md`** a post-update step that reports deprecations crossing into
319
+ - **`skills/update/SKILL.md`** - a post-update step that reports deprecations crossing into
232
320
  `deprecated`/`removed` over the upgrade window and points the user at `/gdd:migrate`.
233
321
 
234
322
  ### Notes
@@ -244,29 +332,29 @@ None. (This release *adds* the deprecation machinery; it removes nothing. The hi
244
332
 
245
333
  ## [1.39.2] - 2026-06-01
246
334
 
247
- ### Phase 39.2 Long-Horizon Cost Governance
335
+ ### Phase 39.2 - Long-Horizon Cost Governance
248
336
 
249
- Closes the split Phase 39 (39.1 shipped DS migration). Phase 10.1 per-task caps + Phase 26 per-runtime telemetry track *cost* none **forecast** it, cap it at the *project* level, or show whether the spend actually *shipped* anything. 39.2 adds a per-cycle spend **forecast**, a **`project_cap`** hard-halt, and an **ROI dashboard**. **No new runtime dependency, no new egress** three pure helpers + an additive, disabled-by-default branch on the existing budget-enforcer hook.
337
+ Closes the split Phase 39 (39.1 shipped DS migration). Phase 10.1 per-task caps + Phase 26 per-runtime telemetry track *cost* - none **forecast** it, cap it at the *project* level, or show whether the spend actually *shipped* anything. 39.2 adds a per-cycle spend **forecast**, a **`project_cap`** hard-halt, and an **ROI dashboard**. **No new runtime dependency, no new egress** - three pure helpers + an additive, disabled-by-default branch on the existing budget-enforcer hook.
250
338
 
251
339
  ### Added
252
340
 
253
- - **`scripts/lib/budget/cost-forecast.cjs`** pure, dep-free per-cycle forecast: `forecast()` (best/typical/worst from the mean ± k·σ of historical per-cycle rates) + `cyclesToCap()` ("hit your cap in Y cycles"). Deterministic.
254
- - **`scripts/lib/budget/roi.cjs`** pure ROI join: `computeRoi()` (per-cycle cost ⋈ shipped/reverted commits → cost-per-shipped-commit + stick rate) + `roiTableMarkdown()`.
255
- - **`scripts/lib/budget/project-cap.cjs`** pure cap classifier: `classifyProjectBudget(spend, cap)` → `ok`/`warn-50`/`warn-80`/`halt`; **disabled when `cap ≤ 0`** (the non-breaking default).
256
- - **`agents/cost-forecaster.md`** groups `costs.jsonl` by cycle, runs the model, supports `--scenario best|typical|worst`, emits a `budget_forecast` event. Report-only (sonnet, size_budget M).
257
- - **`skills/budget/SKILL.md`** (`/gdd:budget [--cycles N] [--scenario …]`) forecast + "at the current rate you'll hit your $X project cap in Y cycles."
258
- - **`skills/roi/SKILL.md`** (`/gdd:roi [--since <date>] [--window-days 14]`) the ROI table; "shipped" = a commit surviving ≥ 14 days (catches revert-after-bug-discovery).
259
- - **`reference/cost-governance.md`** the contract (forecast model, `project_cap` semantics, ROI signal, events). Registered.
341
+ - **`scripts/lib/budget/cost-forecast.cjs`** - pure, dep-free per-cycle forecast: `forecast()` (best/typical/worst from the mean ± k·σ of historical per-cycle rates) + `cyclesToCap()` ("hit your cap in Y cycles"). Deterministic.
342
+ - **`scripts/lib/budget/roi.cjs`** - pure ROI join: `computeRoi()` (per-cycle cost ⋈ shipped/reverted commits → cost-per-shipped-commit + stick rate) + `roiTableMarkdown()`.
343
+ - **`scripts/lib/budget/project-cap.cjs`** - pure cap classifier: `classifyProjectBudget(spend, cap)` → `ok`/`warn-50`/`warn-80`/`halt`; **disabled when `cap ≤ 0`** (the non-breaking default).
344
+ - **`agents/cost-forecaster.md`** - groups `costs.jsonl` by cycle, runs the model, supports `--scenario best|typical|worst`, emits a `budget_forecast` event. Report-only (sonnet, size_budget M).
345
+ - **`skills/budget/SKILL.md`** (`/gdd:budget [--cycles N] [--scenario …]`) - forecast + "at the current rate you'll hit your $X project cap in Y cycles."
346
+ - **`skills/roi/SKILL.md`** (`/gdd:roi [--since <date>] [--window-days 14]`) - the ROI table; "shipped" = a commit surviving ≥ 14 days (catches revert-after-bug-discovery).
347
+ - **`reference/cost-governance.md`** - the contract (forecast model, `project_cap` semantics, ROI signal, events). Registered.
260
348
 
261
349
  ### Changed
262
350
 
263
- - **`hooks/budget-enforcer.ts`** an **additive** `project_cap` branch (delegates the threshold math to `project-cap.cjs`): warns at 50% + 80%, hard-halts at 100% under `enforce`. **Disabled by default** (`project_cap_usd: 0`) so existing users see zero behavior change. **Graceful** it blocks the *next* PreToolUse:Agent spawn, letting the current stage finish.
264
- - **`reference/schemas/budget.schema.json`** + `project_cap_usd` (≥ 0; 0/absent = disabled) + `project_cap_enforcement_mode` (enforce|warn|log).
265
- - **`reference/schemas/events.schema.json`** free-form `type` seed += `budget_forecast` / `project_cap_warning` / `project_cap_halt` (schema-seed only; `KNOWN_EVENT_TYPES` count unchanged).
351
+ - **`hooks/budget-enforcer.ts`** - an **additive** `project_cap` branch (delegates the threshold math to `project-cap.cjs`): warns at 50% + 80%, hard-halts at 100% under `enforce`. **Disabled by default** (`project_cap_usd: 0`) so existing users see zero behavior change. **Graceful** - it blocks the *next* PreToolUse:Agent spawn, letting the current stage finish.
352
+ - **`reference/schemas/budget.schema.json`** - + `project_cap_usd` (≥ 0; 0/absent = disabled) + `project_cap_enforcement_mode` (enforce|warn|log).
353
+ - **`reference/schemas/events.schema.json`** - free-form `type` seed += `budget_forecast` / `project_cap_warning` / `project_cap_halt` (schema-seed only; `KNOWN_EVENT_TYPES` count unchanged).
266
354
 
267
355
  ### Notes
268
356
 
269
- - **No new runtime dependency, no new egress** three pure text/arithmetic helpers + a local `package.json`/`costs.jsonl` read; the hook only ever *blocks*, never spends.
357
+ - **No new runtime dependency, no new egress** - three pure text/arithmetic helpers + a local `package.json`/`costs.jsonl` read; the hook only ever *blocks*, never spends.
270
358
  - 6-manifest lockstep at **v1.39.2** + `OFF_CADENCE_VERSIONS.add('1.39.2')` + the 31 live-pinned `manifests-version.txt` baselines forward-propagated 1.39.1 → 1.39.2.
271
359
  - Inventory relock: registry-diff 157 → 158 (+`cost-governance`), skill-list 77 → 79 (+`budget`, +`roi`), agent-list +`cost-forecaster` + both frontmatter-snapshots, event-schema-snapshot sha256 re-locked (the seed-list edit, LF-normalized), tarball golden 700 → 707 (+7). Root `SKILL.md` command table += `budget` + `roi`.
272
360
 
@@ -274,20 +362,20 @@ Closes the split Phase 39 (39.1 shipped DS migration). Phase 10.1 per-task caps
274
362
 
275
363
  ## [1.39.1] - 2026-06-01
276
364
 
277
- ### Phase 39.1 DS Migration Workflows
365
+ ### Phase 39.1 - DS Migration Workflows
278
366
 
279
- Opens the v1.39.x arc and the first half of the split Phase 39. When a design system ships a breaking major (shadcn/ui v1→v2, Tailwind v3→v4, MUI v5→v6, Material 2/3 token rename), GDD can now read the in-repo `package.json`, detect the version skew, consult a curated rule library, and produce an **impact-scored, proposal-only migration plan** with codemod scaffolds. Nothing runs automatically and no codemod engine is bundled `codemod-gen` emits jscodeshift/ast-grep template **text** the developer reviews and runs themselves. **No new runtime dependency, no new egress.**
367
+ Opens the v1.39.x arc and the first half of the split Phase 39. When a design system ships a breaking major (shadcn/ui v1→v2, Tailwind v3→v4, MUI v5→v6, Material 2/3 token rename), GDD can now read the in-repo `package.json`, detect the version skew, consult a curated rule library, and produce an **impact-scored, proposal-only migration plan** with codemod scaffolds. Nothing runs automatically and no codemod engine is bundled - `codemod-gen` emits jscodeshift/ast-grep template **text** the developer reviews and runs themselves. **No new runtime dependency, no new egress.**
280
368
 
281
369
  ### Added
282
370
 
283
- - **`reference/migrations/{shadcn-v2,tailwind-v4,mui-v6,material-3-to-4}.md`** 4 curated rule libraries. Each carries `## Detection` (package.json dep + version), a `## Migration rules` table (Rule ID · Kind · From → To · Note, where Kind ∈ `rename-class`/`rename-prop`/`remove-component`/`token-rename`/`new-default`), and `## Impact notes`. Grounded in the official upstream migration guides (Tailwind v4 browser baseline, MUI Grid2/`experimental_` removal, Material M2→M3 `--mdc-*` → `--md-sys-*` tokens). Registered.
284
- - **`scripts/lib/migration/codemod-gen.cjs`** pure, dep-free `emitCodemod(rule, { engine: 'jscodeshift' | 'ast-grep' })` → `{ ruleId, engine, kind, template }`. One template per rule kind; deterministic. Emits template **text only** it never imports or runs jscodeshift/ast-grep.
285
- - **`agents/ds-migration-planner.md`** detects the DS + version from `package.json`, consults `reference/migrations/<ds>.md`, scores each affected component (visual-delta × usage × tests-affected), and emits codemod scaffolds to `.design/migration/` via `codemod-gen`. **Proposal-only**; long-tail DS fall back to a generic template.
286
- - **`agents/design-verifier.md`** an in-place note (net-zero, stays at the 700-line cap): when a DS migration is in flight, the verifier also asserts the migration preserved the contract (visual-diff within threshold, component API surface unchanged, tests pass) and treats an unmigrated high-impact rule as a gap.
371
+ - **`reference/migrations/{shadcn-v2,tailwind-v4,mui-v6,material-3-to-4}.md`** - 4 curated rule libraries. Each carries `## Detection` (package.json dep + version), a `## Migration rules` table (Rule ID · Kind · From → To · Note, where Kind ∈ `rename-class`/`rename-prop`/`remove-component`/`token-rename`/`new-default`), and `## Impact notes`. Grounded in the official upstream migration guides (Tailwind v4 browser baseline, MUI Grid2/`experimental_` removal, Material M2→M3 `--mdc-*` → `--md-sys-*` tokens). Registered.
372
+ - **`scripts/lib/migration/codemod-gen.cjs`** - pure, dep-free `emitCodemod(rule, { engine: 'jscodeshift' | 'ast-grep' })` → `{ ruleId, engine, kind, template }`. One template per rule kind; deterministic. Emits template **text only** - it never imports or runs jscodeshift/ast-grep.
373
+ - **`agents/ds-migration-planner.md`** - detects the DS + version from `package.json`, consults `reference/migrations/<ds>.md`, scores each affected component (visual-delta × usage × tests-affected), and emits codemod scaffolds to `.design/migration/` via `codemod-gen`. **Proposal-only**; long-tail DS fall back to a generic template.
374
+ - **`agents/design-verifier.md`** - an in-place note (net-zero, stays at the 700-line cap): when a DS migration is in flight, the verifier also asserts the migration preserved the contract (visual-diff within threshold, component API surface unchanged, tests pass) and treats an unmigrated high-impact rule as a gap.
287
375
 
288
376
  ### Notes
289
377
 
290
- - **No new runtime dependency, no new egress** `codemod-gen` is a pure text emitter; version detection is a local `package.json` read.
378
+ - **No new runtime dependency, no new egress** - `codemod-gen` is a pure text emitter; version detection is a local `package.json` read.
291
379
  - 6-manifest lockstep at **v1.39.1** + `OFF_CADENCE_VERSIONS.add('1.39.1')` + the 30 live-pinned `manifests-version.txt` baselines forward-propagated 1.38.5 → 1.39.1.
292
380
  - Inventory relock: registry-diff 153 → 157 (+4 rule libraries), agent-list +`ds-migration-planner` + both frontmatter-snapshots, tarball golden 694 → 700 (+6: 4 rule libraries + `codemod-gen.cjs` + `ds-migration-planner.md`). No skill/connection deltas.
293
381
 
@@ -295,21 +383,21 @@ Opens the v1.39.x arc and the first half of the split Phase 39. When a design sy
295
383
 
296
384
  ## [1.38.5] - 2026-06-01
297
385
 
298
- ### Phase 38.5 Deployment Coordination Loop
386
+ ### Phase 38.5 - Deployment Coordination Loop
299
387
 
300
- Bridges the gap between `/gdd:verify` passing and the design **actually being live**. `/gdd:ship` ends at "PR merged"; the post-merge journey (staging → canary % → 100% rollout) was invisible. 38.5 reads the feature-flag service (Phase 38's LaunchDarkly/Statsig/GrowthBook connections), tracks per-cycle rollout %, and weights the `design_arms` posterior by how widely a variant actually deployed. **No new runtime dependency, no new egress** (pure classifier + the Phase-38 read-only connections). **Read-only** GDD reports + notifies; it never advances or rolls back.
388
+ Bridges the gap between `/gdd:verify` passing and the design **actually being live**. `/gdd:ship` ends at "PR merged"; the post-merge journey (staging → canary % → 100% rollout) was invisible. 38.5 reads the feature-flag service (Phase 38's LaunchDarkly/Statsig/GrowthBook connections), tracks per-cycle rollout %, and weights the `design_arms` posterior by how widely a variant actually deployed. **No new runtime dependency, no new egress** (pure classifier + the Phase-38 read-only connections). **Read-only** - GDD reports + notifies; it never advances or rolls back.
301
389
 
302
390
  ### Added
303
391
 
304
- - **`scripts/lib/rollout/rollout-status.cjs`** pure, dep-free classifier: `classifyRollout` (`unrolled`/`staging-only`/`canary-N%`/`prod-100%`), `deployedPct`, `isStuck` (default 14 days), `deployedWeight` (linear). Deterministic.
305
- - **`agents/rollout-coordinator.md`** reads the flag service → classifies → writes `STATE.md <rollout_status>` → emits `rollout_*`/`verify_outcome` events → folds the outcome into `design_arms` weighted by `deployedPct` (a 10%-rolled variant counts 0.1; a 100% one counts 1.0). Read-only, notify-on-stuck.
306
- - **`skills/rollout-status/SKILL.md`** (`/gdd:rollout-status [<cycle>] [--all] [--stuck]`) reports rollout state + surfaces stuck rollouts.
307
- - **`reference/rollout-coordination.md`** the `<rollout_status>` schema + state transitions + the deployed_pct weighting + the events. Registered.
308
- - **`reference/schemas/events.schema.json`** the free-form `type` seed list gains `verify_outcome` / `rollout_started` / `rollout_advanced` / `rollout_stuck` (Phase 22 extension).
392
+ - **`scripts/lib/rollout/rollout-status.cjs`** - pure, dep-free classifier: `classifyRollout` (`unrolled`/`staging-only`/`canary-N%`/`prod-100%`), `deployedPct`, `isStuck` (default 14 days), `deployedWeight` (linear). Deterministic.
393
+ - **`agents/rollout-coordinator.md`** - reads the flag service → classifies → writes `STATE.md <rollout_status>` → emits `rollout_*`/`verify_outcome` events → folds the outcome into `design_arms` weighted by `deployedPct` (a 10%-rolled variant counts 0.1; a 100% one counts 1.0). Read-only, notify-on-stuck.
394
+ - **`skills/rollout-status/SKILL.md`** (`/gdd:rollout-status [<cycle>] [--all] [--stuck]`) - reports rollout state + surfaces stuck rollouts.
395
+ - **`reference/rollout-coordination.md`** - the `<rollout_status>` schema + state transitions + the deployed_pct weighting + the events. Registered.
396
+ - **`reference/schemas/events.schema.json`** - the free-form `type` seed list gains `verify_outcome` / `rollout_started` / `rollout_advanced` / `rollout_stuck` (Phase 22 extension).
309
397
 
310
398
  ### Notes
311
399
 
312
- - **No new runtime dependency, no new egress** pure classifier; the flag-service reads reuse Phase 38's read-only connections.
400
+ - **No new runtime dependency, no new egress** - pure classifier; the flag-service reads reuse Phase 38's read-only connections.
313
401
  - 6-manifest lockstep at **v1.38.5** + `OFF_CADENCE_VERSIONS.add('1.38.5')` + the 29 live-pinned `manifests-version.txt` baselines forward-propagated 1.38.0 → 1.38.5.
314
402
  - Inventory relock: skill-list 76 → 77 (+`rollout-status`), agent-list 52 → 53 (+`rollout-coordinator`) + both frontmatter-snapshots, registry-diff 152 → 153, tarball golden 690 → 694 (+4), and the phase-20 `event-schema-snapshot.json` sha256 re-locked (the seed-list edit). Root `SKILL.md` command table + `command-count-sync` updated.
315
403
 
@@ -317,22 +405,22 @@ Bridges the gap between `/gdd:verify` passing and the design **actually being li
317
405
 
318
406
  ## [1.38.0] - 2026-06-01
319
407
 
320
- ### Phase 38 Outcome-Driven Adaptation (A/B Variants + Inbound User-Research Signals)
408
+ ### Phase 38 - Outcome-Driven Adaptation (A/B Variants + Inbound User-Research Signals)
321
409
 
322
- Closes the external-outcome loop. The bandit's reward was **internal** (lint/test/visual pass-fail); it couldn't learn "which design pattern wins with **users**" because user-outcome signals never entered the system. Phase 38 adds two external signal sources **A/B experiments** + **user research** feeding a new `design_arms` posterior + the brief/verify loop. **No new runtime dependency** (a pure Beta-posterior store + injectable `fetch`; the platforms are opt-in, read-only).
410
+ Closes the external-outcome loop. The bandit's reward was **internal** (lint/test/visual pass-fail); it couldn't learn "which design pattern wins with **users**" because user-outcome signals never entered the system. Phase 38 adds two external signal sources - **A/B experiments** + **user research** - feeding a new `design_arms` posterior + the brief/verify loop. **No new runtime dependency** (a pure Beta-posterior store + injectable `fetch`; the platforms are opt-in, read-only).
323
411
 
324
412
  ### Added
325
413
 
326
- - **`scripts/lib/ds-arms/design-arms-store.cjs`** a pure `design_arms` posterior class, **distinct from the routing bandit** (`bandit-router.cjs`). Keyed by `(component_type, variant_pattern_hash)` (inline FNV-1a no `crypto`), conservative **Beta(2, 8)** prior (mean 0.2 a pattern earns trust from real outcomes). `variantKey` / `pull` / `observe` / `all`; atomic persist to `.design/telemetry/design-arms.json`. node-builtins only.
327
- - **`reference/design-variants.md`** + **`design` `--variants N`** N competing, hypothesis-tagged variants (`<variant id component pattern hypothesis>`, default N=2); the design stage consults the posterior to bias generation **advisory, never directive (the user always wins, D-03)**. Registered.
328
- - **`connections/launchdarkly.md` + `statsig.md` + `growthbook.md`** A/B **experiment-source** connections (read-only; never run experiments D-04). **`agents/experiment-result-ingester.md`** maps variant→outcome by the primary metric + significance → `observe()` into `design_arms` → `experiment_result` event.
329
- - **`connections/usertesting.md` + `maze.md` + `hotjar.md`** + **`agents/user-research-synthesizer.md`** user-research sources (read-only, indexed insights). **PII guard (D-05): every payload routes through `scripts/lib/pseudonymize.cjs` BEFORE any agent context** enforced by `test/suite/phase-38-pii-guard.test.cjs`. Synthesizes ranked findings (finding · frequency · severity) into the brief **`<prior-research>`** block.
330
- - **Verify cross-check** `design-verifier` asserts each `<prior-research>` finding is addressed or explicitly deferred (unaddressed `critical`/`serious` = a gap).
414
+ - **`scripts/lib/ds-arms/design-arms-store.cjs`** - a pure `design_arms` posterior class, **distinct from the routing bandit** (`bandit-router.cjs`). Keyed by `(component_type, variant_pattern_hash)` (inline FNV-1a - no `crypto`), conservative **Beta(2, 8)** prior (mean 0.2 - a pattern earns trust from real outcomes). `variantKey` / `pull` / `observe` / `all`; atomic persist to `.design/telemetry/design-arms.json`. node-builtins only.
415
+ - **`reference/design-variants.md`** + **`design` `--variants N`** - N competing, hypothesis-tagged variants (`<variant id component pattern hypothesis>`, default N=2); the design stage consults the posterior to bias generation - **advisory, never directive (the user always wins, D-03)**. Registered.
416
+ - **`connections/launchdarkly.md` + `statsig.md` + `growthbook.md`** - A/B **experiment-source** connections (read-only; never run experiments - D-04). **`agents/experiment-result-ingester.md`** maps variant→outcome by the primary metric + significance → `observe()` into `design_arms` → `experiment_result` event.
417
+ - **`connections/usertesting.md` + `maze.md` + `hotjar.md`** + **`agents/user-research-synthesizer.md`** - user-research sources (read-only, indexed insights). **PII guard (D-05): every payload routes through `scripts/lib/pseudonymize.cjs` BEFORE any agent context** - enforced by `test/suite/phase-38-pii-guard.test.cjs`. Synthesizes ranked findings (finding · frequency · severity) into the brief **`<prior-research>`** block.
418
+ - **Verify cross-check** - `design-verifier` asserts each `<prior-research>` finding is addressed or explicitly deferred (unaddressed `critical`/`serious` = a gap).
331
419
 
332
420
  ### Notes
333
421
 
334
- - **No new runtime dependency, no new egress** pure Beta store + injectable `fetchImpl` (hermetic tests); the A/B + research platforms are opt-in user-connected MCP/API, read-only.
335
- - The 6 outcome connections are **Active-table + onboarding entries** (27 → 33 onboarded), NOT pipeline-stage capability-matrix rows outcome-ingest is post-pipeline (the Notion export-only precedent), so it does not occupy a stage column.
422
+ - **No new runtime dependency, no new egress** - pure Beta store + injectable `fetchImpl` (hermetic tests); the A/B + research platforms are opt-in user-connected MCP/API, read-only.
423
+ - The 6 outcome connections are **Active-table + onboarding entries** (27 → 33 onboarded), NOT pipeline-stage capability-matrix rows - outcome-ingest is post-pipeline (the Notion export-only precedent), so it does not occupy a stage column.
336
424
  - 6-manifest lockstep at **v1.38.0** + `OFF_CADENCE_VERSIONS.add('1.38.0')` + the 28 live-pinned `manifests-version.txt` baselines forward-propagated 1.37.2 → 1.38.0.
337
425
  - Inventory relock: connection-list 35 → 41 (+6), phase-20 agent-list 50 → 52 (+`experiment-result-ingester` + `user-research-synthesizer`) + both frontmatter-snapshots, registry-diff 151 → 152 (+`design-variants`), tarball golden 680 → 690 (+10). `design-verifier` augmented in place (stays at the 700 cap).
338
426
 
@@ -340,16 +428,16 @@ Closes the external-outcome loop. The bandit's reward was **internal** (lint/tes
340
428
 
341
429
  ## [1.37.2] - 2026-06-01
342
430
 
343
- ### Phase 37.2 Greenfield Design-System Bootstrap (`/gdd:bootstrap-ds`) completes Phase 37
431
+ ### Phase 37.2 - Greenfield Design-System Bootstrap (`/gdd:bootstrap-ds`) - completes Phase 37
344
432
 
345
- Second and **FINAL** sub-phase of the split **Phase 37** completing it marks the **parent Phase 37 COMPLETE** (AI-Native Tools Wave 2 + Greenfield DS Bootstrap). Closes the greenfield gap: GDD assumed a design system already existed (in code or Figma) a brand-new project has none. `/gdd:bootstrap-ds` turns a brand input into a coherent token system + proof components. **No new runtime dependency** the token math emits native CSS `oklch()` (no color-conversion library).
433
+ Second and **FINAL** sub-phase of the split **Phase 37** - completing it marks the **parent Phase 37 COMPLETE** (AI-Native Tools Wave 2 + Greenfield DS Bootstrap). Closes the greenfield gap: GDD assumed a design system already existed (in code or Figma) - a brand-new project has none. `/gdd:bootstrap-ds` turns a brand input into a coherent token system + proof components. **No new runtime dependency** - the token math emits native CSS `oklch()` (no color-conversion library).
346
434
 
347
435
  ### Added
348
436
 
349
- - **`scripts/lib/ds/token-scale.cjs`** a pure, dependency-free (zero `require`) token generator. `oklchScale(primary)` → 9 tint/shade stops as native CSS `oklch()`, anchored at the primary, lightness interpolated toward white/black, chroma damped at the extremes (no OKLab→sRGB conversion, no color library); `typeScale` (modular), `spacingScale` (4pt/8pt), `radiusScale`. Deterministic.
350
- - **`reference/ds-bootstrap-rubric.md`** greenfield emission rules: primary → 9 tints; **never more than 2 brand colors**; neutrals + semantic colors; type ratios 1.2/1.25/1.333; 4pt/8pt spacing; radius + motion defaults; the 3 variants; role-named CSS-custom-property emission + framework mapping; proof scaffolding. Registered (`type: heuristic`, `phase: 37.2`; 150 → 151).
351
- - **`agents/ds-generator.md`** brand-input → token system via `token-scale.cjs` + the rubric + `color-theory.md`. Emits **3 variants** (conservative / balanced / bold), the user picks one, then scaffolds **button / input / card** in the detected framework (web default; native via Phase 34). Never invents a brand; never overwrites an existing DS; proposal→confirm.
352
- - **`skills/bootstrap-ds/SKILL.md`** (`/gdd:bootstrap-ds`) brand-input intake (primary + secondary + tone tags + target framework) → `ds-generator`. 43 lines (≤100 Phase-28.5 contract).
437
+ - **`scripts/lib/ds/token-scale.cjs`** - a pure, dependency-free (zero `require`) token generator. `oklchScale(primary)` → 9 tint/shade stops as native CSS `oklch()`, anchored at the primary, lightness interpolated toward white/black, chroma damped at the extremes (no OKLab→sRGB conversion, no color library); `typeScale` (modular), `spacingScale` (4pt/8pt), `radiusScale`. Deterministic.
438
+ - **`reference/ds-bootstrap-rubric.md`** - greenfield emission rules: primary → 9 tints; **never more than 2 brand colors**; neutrals + semantic colors; type ratios 1.2/1.25/1.333; 4pt/8pt spacing; radius + motion defaults; the 3 variants; role-named CSS-custom-property emission + framework mapping; proof scaffolding. Registered (`type: heuristic`, `phase: 37.2`; 150 → 151).
439
+ - **`agents/ds-generator.md`** - brand-input → token system via `token-scale.cjs` + the rubric + `color-theory.md`. Emits **3 variants** (conservative / balanced / bold), the user picks one, then scaffolds **button / input / card** in the detected framework (web default; native via Phase 34). Never invents a brand; never overwrites an existing DS; proposal→confirm.
440
+ - **`skills/bootstrap-ds/SKILL.md`** (`/gdd:bootstrap-ds`) - brand-input intake (primary + secondary + tone tags + target framework) → `ds-generator`. 43 lines (≤100 Phase-28.5 contract).
353
441
 
354
442
  ### Notes
355
443
 
@@ -362,20 +450,20 @@ Second and **FINAL** sub-phase of the split **Phase 37** — completing it marks
362
450
 
363
451
  ## [1.37.1] - 2026-06-01
364
452
 
365
- ### Phase 37.1 AI-Native Tools Wave 2 (Framer + Penpot + Webflow + v0.dev + Plasmic + Builder.io)
453
+ ### Phase 37.1 - AI-Native Tools Wave 2 (Framer + Penpot + Webflow + v0.dev + Plasmic + Builder.io)
366
454
 
367
- First sub-phase of the split **Phase 37**. Schedules Phase 14's explicit backlog: six AI-native design tools, each under the existing connection capability contract (canvas | generator | shared probe). **No new runtime dependency, no new egress** each tool is an opt-in user-connected MCP/API, probed via ToolSearch/env; absent → degrade-to-code-only.
455
+ First sub-phase of the split **Phase 37**. Schedules Phase 14's explicit backlog: six AI-native design tools, each under the existing connection capability contract (canvas | generator | shared probe). **No new runtime dependency, no new egress** - each tool is an opt-in user-connected MCP/API, probed via ToolSearch/env; absent → degrade-to-code-only.
368
456
 
369
457
  ### Added
370
458
 
371
- - **`connections/framer.md`** + **`penpot.md`** + **`webflow.md`** canvas-category specs. Framer (read frames + write proposals), Penpot (open-source Figma alt; self-hosted-vs-cloud probe), Webflow (read site structure as a design-adaptation source not CMS authoring). Contribute at the **design** stage.
372
- - **`connections/v0-dev.md`** + **`plasmic.md`** + **`builder-io.md`** generator-category specs. v0.dev (MCP-first → REST + `V0_API_KEY`), Plasmic (dual: canvas read + code emission), Builder.io Visual Copilot (pull-only this phase). Drive the **generator** stage.
373
- - **`agents/design-component-generator.md`** Step-0 detection + `--tool` flag extended to `v0|plasmic|builder-io`, plus compact `<!-- impl: v0 -->` / `<!-- impl: plasmic -->` / `<!-- impl: builder-io -->` sections that cross-link to the connection specs (231 → 259, under the LARGE budget). Priority: magic-patterns > 21st.dev > v0 > plasmic > builder-io; `--tool` overrides.
374
- - **`connections/connections.md`** + onboarding 21 → 27 onboarded (6 Active rows + 6 capability-matrix rows: framer/penpot → canvas, webflow/v0/builder-io → generator, **Plasmic → canvas + generator dual**; probes + value-prop + setup matrix).
459
+ - **`connections/framer.md`** + **`penpot.md`** + **`webflow.md`** - canvas-category specs. Framer (read frames + write proposals), Penpot (open-source Figma alt; self-hosted-vs-cloud probe), Webflow (read site structure as a design-adaptation source - not CMS authoring). Contribute at the **design** stage.
460
+ - **`connections/v0-dev.md`** + **`plasmic.md`** + **`builder-io.md`** - generator-category specs. v0.dev (MCP-first → REST + `V0_API_KEY`), Plasmic (dual: canvas read + code emission), Builder.io Visual Copilot (pull-only this phase). Drive the **generator** stage.
461
+ - **`agents/design-component-generator.md`** - Step-0 detection + `--tool` flag extended to `v0|plasmic|builder-io`, plus compact `<!-- impl: v0 -->` / `<!-- impl: plasmic -->` / `<!-- impl: builder-io -->` sections that cross-link to the connection specs (231 → 259, under the LARGE budget). Priority: magic-patterns > 21st.dev > v0 > plasmic > builder-io; `--tool` overrides.
462
+ - **`connections/connections.md`** + onboarding - 21 → 27 onboarded (6 Active rows + 6 capability-matrix rows: framer/penpot → canvas, webflow/v0/builder-io → generator, **Plasmic → canvas + generator dual**; probes + value-prop + setup matrix).
375
463
 
376
464
  ### Notes
377
465
 
378
- - **No new runtime dependency, no new egress** opt-in MCP/API connections; the generator never writes to `src/` without proposal→confirm.
466
+ - **No new runtime dependency, no new egress** - opt-in MCP/API connections; the generator never writes to `src/` without proposal→confirm.
379
467
  - 6-manifest lockstep at **v1.37.1** + `OFF_CADENCE_VERSIONS.add('1.37.1')` + the 26 live-pinned `manifests-version.txt` baselines forward-propagated 1.36.3 → 1.37.1 (opens the v1.37.x arc).
380
468
  - Inventory relock: connection-list 29 → 35 (+6), onboarding → 27, tarball golden 670 → 676 (+6). Registry unchanged (no `reference/` doc); no new skill/agent dir (the generator agent pre-exists).
381
469
 
@@ -383,38 +471,38 @@ First sub-phase of the split **Phase 37**. Schedules Phase 14's explicit backlog
383
471
 
384
472
  ## [1.36.3] - 2026-06-01
385
473
 
386
- ### Phase 36.3 Knowledge Tier-3: Conversational UI completes Phase 36
474
+ ### Phase 36.3 - Knowledge Tier-3: Conversational UI - completes Phase 36
387
475
 
388
- Third and **FINAL** sub-phase of the split **Phase 36 (Knowledge Tier 3)** completing it marks the **parent Phase 36 COMPLETE** (domain packs 36.1 + motion-tool verification 36.2 + conversational UI 36.3 all shipped). Conversational UI was zero-coverage even though it's a real surface (chatbot empty-states, voice flow design, prompt-as-UX). **No new pillar, no new runtime dependency, no new egress** (reference markdown + an agent-prompt enum addition).
476
+ Third and **FINAL** sub-phase of the split **Phase 36 (Knowledge Tier 3)** - completing it marks the **parent Phase 36 COMPLETE** (domain packs 36.1 + motion-tool verification 36.2 + conversational UI 36.3 all shipped). Conversational UI was zero-coverage even though it's a real surface (chatbot empty-states, voice flow design, prompt-as-UX). **No new pillar, no new runtime dependency, no new egress** (reference markdown + an agent-prompt enum addition).
389
477
 
390
478
  ### Added
391
479
 
392
- - **`reference/conversational-ui.md`** voice-flow patterns (no-input / no-match reprompts, confirmation, human handoff), multi-turn dialogue (context carryover, slot-filling, repair), prompt-as-UX (the assistant persona/tone/boundaries as a versioned design artifact), chatbot empty-states + suggested replies, voice-first onboarding, and error recovery + accessibility (transcripts/captions). Carries a `## Detection signals` section + an `## Audit checklist`. Registered in `reference/registry.json` (`type: heuristic`, `phase: 36.3`; 149 → 150). CLI/REPL UX is out of scope this phase.
393
- - **`agents/design-context-builder.md`** Step 0E gains a **7th** project type `conversational` (enum 6 → 7). It routes to `design-executor` (a chat widget / voice-app card is still rendered code) **and loads `reference/conversational-ui.md`** for the interaction patterns. Detection from brief keywords (chatbot, voice, assistant, conversational) + `package.json` deps (`botpress`, `rasa`, `dialogflow`, `actions-on-google`, `ask-sdk-core`, `botframework`). The first six project types remain the Phase-34 rendered-output set; `conversational` is the Phase-36.3 interaction-surface type on the same axis.
480
+ - **`reference/conversational-ui.md`** - voice-flow patterns (no-input / no-match reprompts, confirmation, human handoff), multi-turn dialogue (context carryover, slot-filling, repair), prompt-as-UX (the assistant persona/tone/boundaries as a versioned design artifact), chatbot empty-states + suggested replies, voice-first onboarding, and error recovery + accessibility (transcripts/captions). Carries a `## Detection signals` section + an `## Audit checklist`. Registered in `reference/registry.json` (`type: heuristic`, `phase: 36.3`; 149 → 150). CLI/REPL UX is out of scope this phase.
481
+ - **`agents/design-context-builder.md`** - Step 0E gains a **7th** project type `conversational` (enum 6 → 7). It routes to `design-executor` (a chat widget / voice-app card is still rendered code) **and loads `reference/conversational-ui.md`** for the interaction patterns. Detection from brief keywords (chatbot, voice, assistant, conversational) + `package.json` deps (`botpress`, `rasa`, `dialogflow`, `actions-on-google`, `ask-sdk-core`, `botframework`). The first six project types remain the Phase-34 rendered-output set; `conversational` is the Phase-36.3 interaction-surface type on the same axis.
394
482
 
395
483
  ### Notes
396
484
 
397
485
  - **No new runtime dependency, no new egress.** Detection is the agent matching keywords/deps; no code, no network.
398
486
  - 6-manifest lockstep at **v1.36.3** + `OFF_CADENCE_VERSIONS.add('1.36.3')` + the 25 live-pinned `manifests-version.txt` baselines forward-propagated 1.36.2 → 1.36.3.
399
487
  - Inventory relock: registry-diff 149 → 150, tarball golden 669 → 670 (+`reference/conversational-ui.md`). No new connection/skill/agent dir. `design-verifier.md` deliberately untouched (it is at its 700-line cap; conversational verify rides the normal web path).
400
- - **This completes the parent Phase 36 (Knowledge Tier 3) domain packs + motion-tool verification + conversational UI.**
488
+ - **This completes the parent Phase 36 (Knowledge Tier 3) - domain packs + motion-tool verification + conversational UI.**
401
489
 
402
490
  ---
403
491
 
404
492
  ## [1.36.2] - 2026-06-01
405
493
 
406
- ### Phase 36.2 Knowledge Tier-3: Motion-Tool Verification (Lottie + Rive)
494
+ ### Phase 36.2 - Knowledge Tier-3: Motion-Tool Verification (Lottie + Rive)
407
495
 
408
- Second sub-phase of the split **Phase 36**. Motion existed as a *principle* (Phase 18) but not as a *verifiable artifact* Lottie/Rive ship animation exports + state machines and GDD never opened them. 36.2 adds a pure motion validator + two optional connections + a verify-time agent. **No new runtime dependency, no new egress** (pure `JSON.parse` + file checks; the Lottie player / Rive runtime are opt-in). Every motion finding is a **warning, never a blocker** (motion is creative, not contractually broken).
496
+ Second sub-phase of the split **Phase 36**. Motion existed as a *principle* (Phase 18) but not as a *verifiable artifact* - Lottie/Rive ship animation exports + state machines and GDD never opened them. 36.2 adds a pure motion validator + two optional connections + a verify-time agent. **No new runtime dependency, no new egress** (pure `JSON.parse` + file checks; the Lottie player / Rive runtime are opt-in). Every motion finding is a **warning, never a blocker** (motion is creative, not contractually broken).
409
497
 
410
498
  ### Added
411
499
 
412
- - **`scripts/lib/motion/validate-motion.cjs`** a pure, dependency-free (zero `require`) motion validator. `validateLottie(json, {bytes, budgetBytes})` checks frame-rate sanity, non-positive duration, layer count, embedded-asset bloat, and the perf budget (rules `MO-PARSE/FR/DUR/LAYERS/IMG/BUDGET`); `motionBudget` is the shared byte-cap check; `riveHeader` is the `.riv` magic-byte sanity. Deterministic.
413
- - **`connections/lottie.md`** file-probe connection for Lottie JSON exports; static floor = `validateLottie`; the live player is opt-in; degrade-to-static → code-only.
414
- - **`connections/rive.md`** file-probe connection for Rive `.riv` exports. `.riv` is binary, so the deep state-machine graph (unreachable states, no-exit loops) needs the opt-in Rive runtime; the pure-JS floor is size + the `RIVE` header + a manual-review advisory.
415
- - **`agents/motion-verifier.md`** at verify time, discovers Lottie/Rive exports, runs `validate-motion.cjs`, enforces a perf budget (`motion_budget_kb`, fallback 200 KB), and WARNs. Reads-only.
416
- - **`agents/design-verifier.md`** Phase 4E motion hook (gate on exports → delegate to `motion-verifier` → degrade-to-noop).
417
- - **`connections/connections.md`** + onboarding 19 → 21 (Lottie + Rive Active rows, `verify` capability-matrix entries, file probes, value-prop + setup matrix).
500
+ - **`scripts/lib/motion/validate-motion.cjs`** - a pure, dependency-free (zero `require`) motion validator. `validateLottie(json, {bytes, budgetBytes})` checks frame-rate sanity, non-positive duration, layer count, embedded-asset bloat, and the perf budget (rules `MO-PARSE/FR/DUR/LAYERS/IMG/BUDGET`); `motionBudget` is the shared byte-cap check; `riveHeader` is the `.riv` magic-byte sanity. Deterministic.
501
+ - **`connections/lottie.md`** - file-probe connection for Lottie JSON exports; static floor = `validateLottie`; the live player is opt-in; degrade-to-static → code-only.
502
+ - **`connections/rive.md`** - file-probe connection for Rive `.riv` exports. `.riv` is binary, so the deep state-machine graph (unreachable states, no-exit loops) needs the opt-in Rive runtime; the pure-JS floor is size + the `RIVE` header + a manual-review advisory.
503
+ - **`agents/motion-verifier.md`** - at verify time, discovers Lottie/Rive exports, runs `validate-motion.cjs`, enforces a perf budget (`motion_budget_kb`, fallback 200 KB), and WARNs. Reads-only.
504
+ - **`agents/design-verifier.md`** - Phase 4E motion hook (gate on exports → delegate to `motion-verifier` → degrade-to-noop).
505
+ - **`connections/connections.md`** + onboarding - 19 → 21 (Lottie + Rive Active rows, `verify` capability-matrix entries, file probes, value-prop + setup matrix).
418
506
 
419
507
  ### Notes
420
508
 
@@ -426,23 +514,23 @@ Second sub-phase of the split **Phase 36**. Motion existed as a *principle* (Pha
426
514
 
427
515
  ## [1.36.1] - 2026-06-01
428
516
 
429
- ### Phase 36.1 Knowledge Tier-3: Domain Packs (finance + healthcare + gaming + civic)
517
+ ### Phase 36.1 - Knowledge Tier-3: Domain Packs (finance + healthcare + gaming + civic)
430
518
 
431
- First sub-phase of the split **Phase 36 (Knowledge Tier 3)**. Adds four industry-specific design-pattern reference packs and wires **domain detection** into the pipeline closing the industry-lens gap (GDD shipped 18 generic design systems + foundational Tier-2, but no domain-specific patterns). Finance and healthcare especially carry regulatory constraints (PCI-DSS, MiFID II, HIPAA, Section 508) that bleed into UI. **No new pillar, no breaking scoring change, no new runtime dependency, no new egress** pure reference markdown + agent-prompt edits; detection is keyword/dep matching done by the agent.
519
+ First sub-phase of the split **Phase 36 (Knowledge Tier 3)**. Adds four industry-specific design-pattern reference packs and wires **domain detection** into the pipeline - closing the industry-lens gap (GDD shipped 18 generic design systems + foundational Tier-2, but no domain-specific patterns). Finance and healthcare especially carry regulatory constraints (PCI-DSS, MiFID II, HIPAA, Section 508) that bleed into UI. **No new pillar, no breaking scoring change, no new runtime dependency, no new egress** - pure reference markdown + agent-prompt edits; detection is keyword/dep matching done by the agent.
432
520
 
433
521
  ### Added
434
522
 
435
- - **`reference/domains/finance-patterns.md`** data-table density (tabular-nums, right-aligned numerics), trading-interface conventions (gain/loss never color-alone), regulatory disclosure placement (Reg-T, MiFID II cost & charges), PCI-DSS PAN masking, number-formatting precision, real-time data states.
436
- - **`reference/domains/healthcare-patterns.md`** HIPAA-aware PHI isolation (no PHI in URLs/logs/analytics), idle auto-logout, audit-trail-as-UI, MyChart-class flows, WCAG 2.1 AAA, medical-data visualization. Surfaces risk; does **not** certify compliance.
437
- - **`reference/domains/gaming-patterns.md`** HUD/diegetic UI taxonomy, vestibular + photosensitive safety (≤3 flashes/sec, reduced-motion + in-game toggles), ESRB/PEGI age-gates, input-model adaptation (controller/touch/KBM), TV-safe area.
438
- - **`reference/domains/civic-patterns.md`** Section 508 + WCAG 2.1 AA hard floor, multi-language gov forms (EN/ES/zh-Hans), Plain Writing Act (grade 6-8), USWDS, session-timeout warnings, one-thing-per-page forms.
439
- - **`agents/design-context-builder.md`** new **Step 0F (Domain Detection)**: a dispatcher table (keywords + `package.json` deps → pack) + the confidence rule (≥2 signals or any dep match → auto-apply; 1 weak keyword → suggest; none → skip) + a `<domain>` line in DESIGN-CONTEXT.md. Orthogonal to project-type.
440
- - **`agents/design-auditor.md`** **domain checklist addendum**: when a `<domain>` is active, also run that pack's `## Audit checklist` and fold findings into the relevant pillar (additive never replaces the 7-pillar scoring).
523
+ - **`reference/domains/finance-patterns.md`** - data-table density (tabular-nums, right-aligned numerics), trading-interface conventions (gain/loss never color-alone), regulatory disclosure placement (Reg-T, MiFID II cost & charges), PCI-DSS PAN masking, number-formatting precision, real-time data states.
524
+ - **`reference/domains/healthcare-patterns.md`** - HIPAA-aware PHI isolation (no PHI in URLs/logs/analytics), idle auto-logout, audit-trail-as-UI, MyChart-class flows, WCAG 2.1 AAA, medical-data visualization. Surfaces risk; does **not** certify compliance.
525
+ - **`reference/domains/gaming-patterns.md`** - HUD/diegetic UI taxonomy, vestibular + photosensitive safety (≤3 flashes/sec, reduced-motion + in-game toggles), ESRB/PEGI age-gates, input-model adaptation (controller/touch/KBM), TV-safe area.
526
+ - **`reference/domains/civic-patterns.md`** - Section 508 + WCAG 2.1 AA hard floor, multi-language gov forms (EN/ES/zh-Hans), Plain Writing Act (grade 6-8), USWDS, session-timeout warnings, one-thing-per-page forms.
527
+ - **`agents/design-context-builder.md`** - new **Step 0F (Domain Detection)**: a dispatcher table (keywords + `package.json` deps → pack) + the confidence rule (≥2 signals or any dep match → auto-apply; 1 weak keyword → suggest; none → skip) + a `<domain>` line in DESIGN-CONTEXT.md. Orthogonal to project-type.
528
+ - **`agents/design-auditor.md`** - **domain checklist addendum**: when a `<domain>` is active, also run that pack's `## Audit checklist` and fold findings into the relevant pillar (additive - never replaces the 7-pillar scoring).
441
529
  - All four packs **registered** in `reference/registry.json` (`type: heuristic`, `phase: 36.1`); 145 → 149 entries.
442
530
 
443
531
  ### Notes
444
532
 
445
- - **No new runtime dependency, no new egress.** Detection is the agent matching a small embedded signal table no code, no network.
533
+ - **No new runtime dependency, no new egress.** Detection is the agent matching a small embedded signal table - no code, no network.
446
534
  - 6-manifest lockstep at **v1.36.1** + `OFF_CADENCE_VERSIONS.add('1.36.1')` + the 23 live-pinned `manifests-version.txt` baselines forward-propagated 1.35.5 → 1.36.1 (opens the v1.36.x arc).
447
535
  - The 31.5 tarball golden was regenerated as a reviewed delta: **+4** (the four domain packs), zero removals (661 → 665).
448
536
 
@@ -450,20 +538,20 @@ First sub-phase of the split **Phase 36 (Knowledge Tier 3)**. Adds four industry
450
538
 
451
539
  ## [1.35.5] - 2026-06-01
452
540
 
453
- ### Phase 35.5 Design-Artifact Export (`/gdd:export`)
541
+ ### Phase 35.5 - Design-Artifact Export (`/gdd:export`)
454
542
 
455
- Closes the gap that a completed cycle's design output (`EXPERIENCE.md`, `DESIGN.md`, `DESIGN-VERIFICATION.md`, the decision log, screenshots) lives only in the repo stakeholders not in code can't consume it. `/gdd:export <cycle> --format html|pdf|notion` packages it into a shareable artifact. **No new runtime dependency** (D-02): `build-html.cjs` is a pure, dep-free assembler; the PDF format is the same HTML plus Paged.js-compatible `@page` print CSS that the user renders (GDD ships **no** PDF runtime); Notion is written via the Notion MCP. Every artifact is **redacted** (mandatory `scripts/lib/redact.cjs`); `--pseudonymize` masks git identity / paths / hostname for external sharing; `--pr` posts the HTML preview as a PR comment via `pr-commenter`.
543
+ Closes the gap that a completed cycle's design output (`EXPERIENCE.md`, `DESIGN.md`, `DESIGN-VERIFICATION.md`, the decision log, screenshots) lives only in the repo - stakeholders not in code can't consume it. `/gdd:export <cycle> --format html|pdf|notion` packages it into a shareable artifact. **No new runtime dependency** (D-02): `build-html.cjs` is a pure, dep-free assembler; the PDF format is the same HTML plus Paged.js-compatible `@page` print CSS that the user renders (GDD ships **no** PDF runtime); Notion is written via the Notion MCP. Every artifact is **redacted** (mandatory `scripts/lib/redact.cjs`); `--pseudonymize` masks git identity / paths / hostname for external sharing; `--pr` posts the HTML preview as a PR comment via `pr-commenter`.
456
544
 
457
545
  ### Added
458
546
 
459
- - **`scripts/lib/export/build-html.cjs`** a pure, dependency-free self-contained HTML assembler: inline `<style>`, base64-embedded screenshots, **zero external resource references**, a minimal deterministic markdown→HTML subset. `print: true` adds the Paged.js `@page` print CSS for the PDF format. Same input → byte-identical output.
460
- - **`skills/export/SKILL.md`** (`/gdd:export`) resolves the cycle, reads the design source set, redacts always (+ pseudonymizes on `--pseudonymize`), renders html/pdf via `build-html` or a Notion page via the MCP, and hands the HTML to `pr-commenter` on `--pr`.
461
- - **`connections/notion.md`** Notion MCP write-path (`mcp__notion__*`, ToolSearch probe, redact, `GDD_DISABLE_NOTION` kill-switch, degrade-to-HTML). Onboarded 18 → 19 **export-only** (not a pipeline stage; no capability-matrix column).
462
- - **`reference/export-formats.md`** the `/gdd:export` contract (source set, the three formats, redact + `--pseudonymize`, the `--pr` hand-off, the self-contained guarantee); registered in `reference/registry.json`.
547
+ - **`scripts/lib/export/build-html.cjs`** - a pure, dependency-free self-contained HTML assembler: inline `<style>`, base64-embedded screenshots, **zero external resource references**, a minimal deterministic markdown→HTML subset. `print: true` adds the Paged.js `@page` print CSS for the PDF format. Same input → byte-identical output.
548
+ - **`skills/export/SKILL.md`** (`/gdd:export`) - resolves the cycle, reads the design source set, redacts always (+ pseudonymizes on `--pseudonymize`), renders html/pdf via `build-html` or a Notion page via the MCP, and hands the HTML to `pr-commenter` on `--pr`.
549
+ - **`connections/notion.md`** - Notion MCP write-path (`mcp__notion__*`, ToolSearch probe, redact, `GDD_DISABLE_NOTION` kill-switch, degrade-to-HTML). Onboarded 18 → 19 - **export-only** (not a pipeline stage; no capability-matrix column).
550
+ - **`reference/export-formats.md`** - the `/gdd:export` contract (source set, the three formats, redact + `--pseudonymize`, the `--pr` hand-off, the self-contained guarantee); registered in `reference/registry.json`.
463
551
 
464
552
  ### Notes
465
553
 
466
- - **No new runtime dependency** (D-02) and **no new egress** (`scan:outbound` unchanged Notion is written via MCP tools, not raw HTTP).
554
+ - **No new runtime dependency** (D-02) and **no new egress** (`scan:outbound` unchanged - Notion is written via MCP tools, not raw HTTP).
467
555
  - 6-manifest lockstep at **v1.35.5** + `OFF_CADENCE_VERSIONS.add('1.35.5')` + the 22 live-pinned `manifests-version.txt` baselines forward-propagated 1.35.3 → 1.35.5 (1.35.4 not used).
468
556
  - The 31.5 tarball golden was regenerated as a reviewed delta: **+4** (`scripts/lib/export/build-html.cjs`, `skills/export/SKILL.md`, `connections/notion.md`, `reference/export-formats.md`), zero removals (657 → 661).
469
557
 
@@ -471,39 +559,39 @@ Closes the gap that a completed cycle's design output (`EXPERIENCE.md`, `DESIGN.
471
559
 
472
560
  ## [1.35.3] - 2026-06-01
473
561
 
474
- ### Phase 35.3 Team Surfaces: Ticket Sync (Linear + Jira) completes Phase 35
562
+ ### Phase 35.3 - Team Surfaces: Ticket Sync (Linear + Jira) - completes Phase 35
475
563
 
476
- Third and **FINAL** sub-phase of the split **Phase 35 (Team Surfaces Layer)** completing it marks the **parent Phase 35 COMPLETE** (PR-inline 35.1 + Notification 35.2 + Ticket-sync 35.3 all shipped). Wires GDD ↔ Linear/Jira bidirectionally: it reads a linked ticket's comments as cycle context (via the decision-injector) and, on cycle completion, transitions the ticket + posts a redacted summary. **MCP-based** (`mcp__linear__*` / `mcp__atlassian__*`) no bundled SDK, no new outbound egress. Every outbound body is redacted; per-system kill-switches + degrade-to-noop guarantee ticket-sync never gates the cycle.
564
+ Third and **FINAL** sub-phase of the split **Phase 35 (Team Surfaces Layer)** - completing it marks the **parent Phase 35 COMPLETE** (PR-inline 35.1 + Notification 35.2 + Ticket-sync 35.3 all shipped). Wires GDD ↔ Linear/Jira bidirectionally: it reads a linked ticket's comments as cycle context (via the decision-injector) and, on cycle completion, transitions the ticket + posts a redacted summary. **MCP-based** (`mcp__linear__*` / `mcp__atlassian__*`) - no bundled SDK, no new outbound egress. Every outbound body is redacted; per-system kill-switches + degrade-to-noop guarantee ticket-sync never gates the cycle.
477
565
 
478
566
  ### Added
479
567
 
480
- - **`connections/linear.md` + `connections/jira.md`** MCP-based bidirectional ticket-sync connections (Linear MCP / Atlassian MCP; ToolSearch probe, redact + kill-switch + degrade-to-noop). Onboarded 16 → 18.
481
- - **`agents/ticket-sync-agent.md`** reads linked-ticket comments on `.design/**.md` open (decision-injector), maintains the STATE `<ticket_links>` block, and on cycle completion transitions the ticket + posts a **redacted** summary via the MCP tools. `size_budget: M`, `## Record`; tracker-wins conflict resolution.
482
- - **`reference/ticket-sync.md`** the `<ticket_links>` schema + read/write flow + the default status-transition map + redact + kill-switch contract; registered in `reference/registry.json`.
483
- - **`connections/connections.md`** a **ticket-sync** capability-matrix column + Linear/Jira rows + ToolSearch probes.
568
+ - **`connections/linear.md` + `connections/jira.md`** - MCP-based bidirectional ticket-sync connections (Linear MCP / Atlassian MCP; ToolSearch probe, redact + kill-switch + degrade-to-noop). Onboarded 16 → 18.
569
+ - **`agents/ticket-sync-agent.md`** - reads linked-ticket comments on `.design/**.md` open (decision-injector), maintains the STATE `<ticket_links>` block, and on cycle completion transitions the ticket + posts a **redacted** summary via the MCP tools. `size_budget: M`, `## Record`; tracker-wins conflict resolution.
570
+ - **`reference/ticket-sync.md`** - the `<ticket_links>` schema + read/write flow + the default status-transition map + redact + kill-switch contract; registered in `reference/registry.json`.
571
+ - **`connections/connections.md`** - a **ticket-sync** capability-matrix column + Linear/Jira rows + ToolSearch probes.
484
572
 
485
573
  ### Notes
486
574
 
487
- - **No new runtime dependency** (MCP tools, no Linear/Jira SDK) and **no new egress** (`scan:outbound` unchanged GDD calls MCP tools, not raw HTTP). Per-system kill-switch `GDD_DISABLE_LINEAR` / `GDD_DISABLE_JIRA`.
575
+ - **No new runtime dependency** (MCP tools, no Linear/Jira SDK) and **no new egress** (`scan:outbound` unchanged - GDD calls MCP tools, not raw HTTP). Per-system kill-switch `GDD_DISABLE_LINEAR` / `GDD_DISABLE_JIRA`.
488
576
  - 6-manifest lockstep at **v1.35.3** + `OFF_CADENCE_VERSIONS.add('1.35.3')` + the 21 live-pinned `manifests-version.txt` baselines forward-propagated 1.35.2 → 1.35.3.
489
577
  - The 31.5 tarball golden was regenerated as a reviewed delta: **+4** (`connections/linear.md`, `connections/jira.md`, `agents/ticket-sync-agent.md`, `reference/ticket-sync.md`), zero removals.
490
- - **This completes the parent Phase 35 (Team Surfaces Layer) PR inline + notifications + ticket sync.**
578
+ - **This completes the parent Phase 35 (Team Surfaces Layer) - PR inline + notifications + ticket sync.**
491
579
 
492
580
  ---
493
581
 
494
582
  ## [1.35.2] - 2026-06-01
495
583
 
496
- ### Phase 35.2 Team Surfaces: Notification Backplane (Slack + Discord)
584
+ ### Phase 35.2 - Team Surfaces: Notification Backplane (Slack + Discord)
497
585
 
498
- Second sub-phase of the split **Phase 35**. Routes GDD pipeline events (verify-fail, audit-pass, ship) to **Slack + Discord** via incoming webhooks, so a non-GDD-running teammate is alerted in the channel they watch. **No new runtime dependency** the dispatcher POSTs via an injectable `fetchImpl` (default global `fetch`; no `@slack/*` / `discord.js` SDK). Every outbound body is **redacted** at a single chokepoint; per-channel kill-switches + degrade-to-noop guarantee notification delivery never blocks the pipeline. A decimal on the v1.35.x arc. The parent Phase 35 stays open (35.3 Ticket Sync remains).
586
+ Second sub-phase of the split **Phase 35**. Routes GDD pipeline events (verify-fail, audit-pass, ship) to **Slack + Discord** via incoming webhooks, so a non-GDD-running teammate is alerted in the channel they watch. **No new runtime dependency** - the dispatcher POSTs via an injectable `fetchImpl` (default global `fetch`; no `@slack/*` / `discord.js` SDK). Every outbound body is **redacted** at a single chokepoint; per-channel kill-switches + degrade-to-noop guarantee notification delivery never blocks the pipeline. A decimal on the v1.35.x arc. The parent Phase 35 stays open (35.3 Ticket Sync remains).
499
587
 
500
588
  ### Added
501
589
 
502
- - **`connections/slack.md` + `connections/discord.md`** incoming-webhook notification specs (`SLACK_WEBHOOK_URL` / `DISCORD_WEBHOOK_URL` env; env-presence probe; redact + kill-switch + degrade-to-noop).
503
- - **`scripts/lib/notify/dispatch.cjs`** `dispatch(event, {fetchImpl, config, env})`: resolves event→channel routing, builds the **redacted** payload (single chokepoint), honors per-channel kill-switches, POSTs via an **injectable fetchImpl** (no Slack/Discord SDK), and **degrades-to-noop** (missing URL / disabled / error never throws). Allowlisted under the Phase-33.5 outbound gate (`scripts/lib/notify/**`); `scan:outbound` 0 findings.
504
- - **`reference/notification-routing.md`** event→channel routing contract + the redact chokepoint + kill-switches; registered in `reference/registry.json`.
505
- - **`connections/connections.md`** a **notify** capability-matrix column + Slack/Discord rows + env-based probes; onboarded 14 → 16.
506
- - **Privacy guard** `test/suite/notify-privacy-guard.test.cjs` asserts no `scripts/lib/notify/*.cjs` builds an outbound body without `redact` (SC#5).
590
+ - **`connections/slack.md` + `connections/discord.md`** - incoming-webhook notification specs (`SLACK_WEBHOOK_URL` / `DISCORD_WEBHOOK_URL` env; env-presence probe; redact + kill-switch + degrade-to-noop).
591
+ - **`scripts/lib/notify/dispatch.cjs`** - `dispatch(event, {fetchImpl, config, env})`: resolves event→channel routing, builds the **redacted** payload (single chokepoint), honors per-channel kill-switches, POSTs via an **injectable fetchImpl** (no Slack/Discord SDK), and **degrades-to-noop** (missing URL / disabled / error never throws). Allowlisted under the Phase-33.5 outbound gate (`scripts/lib/notify/**`); `scan:outbound` 0 findings.
592
+ - **`reference/notification-routing.md`** - event→channel routing contract + the redact chokepoint + kill-switches; registered in `reference/registry.json`.
593
+ - **`connections/connections.md`** - a **notify** capability-matrix column + Slack/Discord rows + env-based probes; onboarded 14 → 16.
594
+ - **Privacy guard** - `test/suite/notify-privacy-guard.test.cjs` asserts no `scripts/lib/notify/*.cjs` builds an outbound body without `redact` (SC#5).
507
595
 
508
596
  ### Notes
509
597
 
@@ -515,20 +603,20 @@ Second sub-phase of the split **Phase 35**. Routes GDD pipeline events (verify-f
515
603
 
516
604
  ## [1.35.1] - 2026-06-01
517
605
 
518
- ### Phase 35.1 Team Surfaces: PR Inline Integration
606
+ ### Phase 35.1 - Team Surfaces: PR Inline Integration
519
607
 
520
- First sub-phase of the split **Phase 35 (Team Surfaces Layer)**. Makes GDD's verify/audit output visible **inline on the pull request** the surface a non-GDD-running teammate actually watches. After `/gdd:ship` creates the PR, the new `pr-commenter` agent posts inline review comments on changed lines, attaches Preview/Chromatic before-after screenshot pairs, and registers a `gdd/design-review` status check (audit pillar scores + verify pass/fail + a11y). **No new runtime dependency** `gh` is the outbound channel (the `/gdd:ship` + `/gdd:report-issue` precedent); every outbound body is redacted; a `GDD_DISABLE_PR_COMMENTER` kill-switch + degrade-to-noop guarantee the agent never fails the ship. Opens the v1.35.x arc (CHANGELOG-only decimal). The parent Phase 35 stays open (35.2 Notification Backplane + 35.3 Ticket Sync remain).
608
+ First sub-phase of the split **Phase 35 (Team Surfaces Layer)**. Makes GDD's verify/audit output visible **inline on the pull request** - the surface a non-GDD-running teammate actually watches. After `/gdd:ship` creates the PR, the new `pr-commenter` agent posts inline review comments on changed lines, attaches Preview/Chromatic before-after screenshot pairs, and registers a `gdd/design-review` status check (audit pillar scores + verify pass/fail + a11y). **No new runtime dependency** - `gh` is the outbound channel (the `/gdd:ship` + `/gdd:report-issue` precedent); every outbound body is redacted; a `GDD_DISABLE_PR_COMMENTER` kill-switch + degrade-to-noop guarantee the agent never fails the ship. Opens the v1.35.x arc (CHANGELOG-only decimal). The parent Phase 35 stays open (35.2 Notification Backplane + 35.3 Ticket Sync remain).
521
609
 
522
610
  ### Added
523
611
 
524
612
  - **`agents/pr-commenter.md` (inline PR review + status check, D-02/D-03).** A single-shot post-ship agent: posts inline review comments via `gh api .../pulls/{n}/comments` (selector-specific WCAG/verify findings on changed lines), attaches Preview (Phase 8) / Chromatic (Phase 25) before-after screenshot pairs when present, and registers the `gdd/design-review` check-run via `gh api .../check-runs` carrying audit pillar scores + verify pass/fail + a11y result. `size_budget: M`, `## Record`.
525
- - **`reference/pr-review-integration.md` (the gh contract, registered).** The authoritative `gh`-CLI shapes the agent posts against inline-comment payload, summary review, the `gdd/design-review` check-run, screenshot-pair attachment, mandatory `redact.cjs`, the kill-switch, and the consent-driven branch-protection setup (`scripts/apply-branch-protection.sh`; GDD registers the check, never force-edits protection). Registered in `reference/registry.json`.
526
- - **`/gdd:ship` wiring (D-06).** `skills/ship/SKILL.md` Step 6.5 spawns `pr-commenter` (via `Task`) after `gh pr create` degrade-to-noop, never blocks the ship success path.
613
+ - **`reference/pr-review-integration.md` (the gh contract, registered).** The authoritative `gh`-CLI shapes the agent posts against - inline-comment payload, summary review, the `gdd/design-review` check-run, screenshot-pair attachment, mandatory `redact.cjs`, the kill-switch, and the consent-driven branch-protection setup (`scripts/apply-branch-protection.sh`; GDD registers the check, never force-edits protection). Registered in `reference/registry.json`.
614
+ - **`/gdd:ship` wiring (D-06).** `skills/ship/SKILL.md` Step 6.5 spawns `pr-commenter` (via `Task`) after `gh pr create` - degrade-to-noop, never blocks the ship success path.
527
615
  - **Regression baseline.** `test/fixtures/baselines/phase-35-1/` + `test/suite/phase-35-1-baseline.test.cjs` (version-agnostic); plus structural + ship-wiring tests (`pr-commenter-static`, `ship-pr-commenter-wiring`).
528
616
 
529
617
  ### Notes
530
618
 
531
- - **No new runtime dependency** `gh` only (no `@octokit`/GitHub SDK); every outbound body routes through `scripts/lib/redact.cjs`; per-surface kill-switch `GDD_DISABLE_PR_COMMENTER` mirrors Phase 30.
619
+ - **No new runtime dependency** - `gh` only (no `@octokit`/GitHub SDK); every outbound body routes through `scripts/lib/redact.cjs`; per-surface kill-switch `GDD_DISABLE_PR_COMMENTER` mirrors Phase 30.
532
620
  - The 31.5 tarball golden was regenerated as a reviewed delta: **+2** (`agents/pr-commenter.md`, `reference/pr-review-integration.md`), zero removals.
533
621
  - 6-manifest lockstep at **v1.35.1**. Version-sync hygiene upfront (D-09): `OFF_CADENCE_VERSIONS.add('1.35.1')` + the 19 live-pinned `manifests-version.txt` baselines forward-propagated 1.34.4 → 1.35.1.
534
622
 
@@ -536,20 +624,20 @@ First sub-phase of the split **Phase 35 (Team Surfaces Layer)**. Makes GDD's ver
536
624
 
537
625
  ## [1.34.4] - 2026-06-01
538
626
 
539
- ### Phase 34.4 Lazyweb + Mobbin Research Connections (recovered)
627
+ ### Phase 34.4 - Lazyweb + Mobbin Research Connections (recovered)
540
628
 
541
- Adds **two visual-reference MCP connections** to the discover stage **Lazyweb** (free) and **Mobbin** (paid) modeled on the existing Refero/Pinterest connection contract. Purely additive: no new pipeline stage, no new artifact, no new audit pillar; **no new runtime dependency** (both are optional user-installed MCPs, documented in their spec, never pre-declared in the plugin manifest the Refero precedent). Recovered from a stranded Phase 30.5 fork (authored 2026-05-04 → expanded 2026-05-16) that never reached the canonical roadmap because `.planning/` is gitignored and a parallel session reused the 30.5 slot. A decimal release on the v1.34.x arc (CHANGELOG-only, D-02).
629
+ Adds **two visual-reference MCP connections** to the discover stage - **Lazyweb** (free) and **Mobbin** (paid) - modeled on the existing Refero/Pinterest connection contract. Purely additive: no new pipeline stage, no new artifact, no new audit pillar; **no new runtime dependency** (both are optional user-installed MCPs, documented in their spec, never pre-declared in the plugin manifest - the Refero precedent). Recovered from a stranded Phase 30.5 fork (authored 2026-05-04 → expanded 2026-05-16) that never reached the canonical roadmap because `.planning/` is gitignored and a parallel session reused the 30.5 slot. A decimal release on the v1.34.x arc (CHANGELOG-only, D-02).
542
630
 
543
631
  ### Added
544
632
 
545
- - **`connections/lazyweb.md` free reference MCP (discover Tier 1, D-01).** Free bearer-token Streamable-HTTP MCP at `https://www.lazyweb.com/mcp` (`lazyweb_search` + `lazyweb_health`); 250k+ real app screens for pricing pages, onboarding flows, redesign comparisons, UI benchmarking. Copy-command setup (token at `~/.lazyweb/lazyweb_mcp_token`, then `claude plugin install lazyweb@lazyweb`) **no auto-run** (the token write is a user-consent step). ToolSearch-only probe.
546
- - **`connections/mobbin.md` curated mobile/flow reference MCP (discover Tier 2, D-01).** HTTP MCP at `https://api.mobbin.com/mcp` (`claude mcp add mobbin --transport http https://api.mobbin.com/mcp`, auto-run-safe OAuth on first call, requires an active Mobbin subscription); 600k+ screens / 130k+ flows for mobile + flow-level references. ToolSearch-only probe.
547
- - **Cost-aware discover tier order (D-01).** Reference sources now resolve **Lazyweb (free, tried first) → Mobbin / Refero (paid, whichever is bound + subscribed) → Pinterest → awesome-design-md → WebFetch** try the zero-cost source before any paid one. Wired through `connections/connections.md` (table + Capability Matrix + probe pattern, onboarded 12 → 14), `skills/discover/discover-procedure.md` (probes D/E), `skills/connections/` (`/gdd:connections` wizard + onboarding reference), and `agents/design-context-builder.md` (Area 5 rewrite + `tools` frontmatter).
633
+ - **`connections/lazyweb.md` - free reference MCP (discover Tier 1, D-01).** Free bearer-token Streamable-HTTP MCP at `https://www.lazyweb.com/mcp` (`lazyweb_search` + `lazyweb_health`); 250k+ real app screens for pricing pages, onboarding flows, redesign comparisons, UI benchmarking. Copy-command setup (token at `~/.lazyweb/lazyweb_mcp_token`, then `claude plugin install lazyweb@lazyweb`) - **no auto-run** (the token write is a user-consent step). ToolSearch-only probe.
634
+ - **`connections/mobbin.md` - curated mobile/flow reference MCP (discover Tier 2, D-01).** HTTP MCP at `https://api.mobbin.com/mcp` (`claude mcp add mobbin --transport http https://api.mobbin.com/mcp`, auto-run-safe - OAuth on first call, requires an active Mobbin subscription); 600k+ screens / 130k+ flows for mobile + flow-level references. ToolSearch-only probe.
635
+ - **Cost-aware discover tier order (D-01).** Reference sources now resolve **Lazyweb (free, tried first) → Mobbin / Refero (paid, whichever is bound + subscribed) → Pinterest → awesome-design-md → WebFetch** - try the zero-cost source before any paid one. Wired through `connections/connections.md` (table + Capability Matrix + probe pattern, onboarded 12 → 14), `skills/discover/discover-procedure.md` (probes D/E), `skills/connections/` (`/gdd:connections` wizard + onboarding reference), and `agents/design-context-builder.md` (Area 5 rewrite + `tools` frontmatter).
548
636
  - **Regression baseline.** `test/fixtures/baselines/phase-34-4/` (onboarded-connections snapshot + `manifests-version.txt`=1.34.4) pinned by `test/suite/phase-34-4-baseline.test.cjs`.
549
637
 
550
638
  ### Notes
551
639
 
552
- - **No new runtime dependency** both connections are optional user-installed MCPs (Refero precedent); neither is declared in `.claude-plugin/plugin.json`. Discover-stage only no scan/plan/design/verify integration.
640
+ - **No new runtime dependency** - both connections are optional user-installed MCPs (Refero precedent); neither is declared in `.claude-plugin/plugin.json`. Discover-stage only - no scan/plan/design/verify integration.
553
641
  - The 31.5 tarball golden (`test/fixtures/baselines/phase-31-5/tarball-manifest.txt`) was regenerated as a reviewed delta: **+2** newly-shipped files (`connections/lazyweb.md`, `connections/mobbin.md`), zero removals. Tests are not shipped.
554
642
  - 6-manifest lockstep at **v1.34.4** (`package.json` + `package-lock.json` (root + `packages.""`) + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`). Version-sync hygiene upfront (D-09): `OFF_CADENCE_VERSIONS.add('1.34.4')` + the 18 live-pinned `manifests-version.txt` baselines forward-propagated 1.34.3 → 1.34.4.
555
643
  - **Provenance:** recovered from the `thirsty-curran` worktree's stranded `.planning` fork during a roadmap-reconciliation audit; the contiguity renumber (Phase 36→35 …, 2026-06-01) is unrelated and concurrent.
@@ -558,63 +646,63 @@ Adds **two visual-reference MCP connections** to the discover stage — **Lazywe
558
646
 
559
647
  ## [1.34.3] - 2026-05-31
560
648
 
561
- ### Phase 34.3 Non-Web Output Layer: Print/PDF
649
+ ### Phase 34.3 - Non-Web Output Layer: Print/PDF
562
650
 
563
- Third and **FINAL** sub-phase of the split Phase 34 (Non-Web Output Layer) **completing it completes the parent Phase 34** (native 34.1 + email 34.2 + print 34.3 all shipped). Adds **print/PDF output** a dedicated executor that generates print-ready HTML/CSS honoring the real production constraints (`@page` box model, bleed + crop marks, CMYK color-space awareness, font embedding, 300dpi raster fallback) that screen-RGB web HTML ignores behind the same project-type detector that routes native (34.1) and email (34.2). Print generation is **opt-in via project-type detection web remains the default**. A decimal release on the v1.34.x arc (CHANGELOG-only, D-01); **no new runtime dependency** the executor generates the print HTML/CSS as an agent-prompt and the plugin checks it with a deterministic static validator, no `pdfkit`/`paged`/`puppeteer`/`playwright` runtime (D-02/D-10). Print is the final Phase-34 output type the project-type seam is now **closed**. 4 plans across Waves A–C.
651
+ Third and **FINAL** sub-phase of the split Phase 34 (Non-Web Output Layer) - **completing it completes the parent Phase 34** (native 34.1 + email 34.2 + print 34.3 all shipped). Adds **print/PDF output** - a dedicated executor that generates print-ready HTML/CSS honoring the real production constraints (`@page` box model, bleed + crop marks, CMYK color-space awareness, font embedding, 300dpi raster fallback) that screen-RGB web HTML ignores - behind the same project-type detector that routes native (34.1) and email (34.2). Print generation is **opt-in via project-type detection - web remains the default**. A decimal release on the v1.34.x arc (CHANGELOG-only, D-01); **no new runtime dependency** - the executor generates the print HTML/CSS as an agent-prompt and the plugin checks it with a deterministic static validator, no `pdfkit`/`paged`/`puppeteer`/`playwright` runtime (D-02/D-10). Print is the final Phase-34 output type - the project-type seam is now **closed**. 4 plans across Waves A–C.
564
652
 
565
653
  ### Added
566
654
 
567
- - **Print-constraint catalogue + static validator (no `pdfkit`/`paged` dependency, D-02/D-03).** `reference/print-design.md` the authoritative print-constraint catalogue (`@page` size/margin/marks the print box model, bleed box + crop/registration marks, CMYK color-space awareness, font embedding/outlining, 300dpi raster fallback, and the on-press guidance the render-test verifies), registered in `reference/registry.json`. `scripts/lib/print/validate-print-css.cjs` a pure, deterministic static checker (zero `require`, no fs/network/pdfkit/paged) that flags the statically-verifiable subset: `PR-PAGE-01` (an `@page` rule present), `PR-BLEED-01` (a bleed box / crop-marks signal), `PR-CMYK-01` (a CMYK-awareness signal), `PR-FONT-01` (a font-embed signal), `PR-DPI-01` (a 300dpi raster-fallback signal) returning `{ ok, violations:[{ rule, detail }] }`.
568
- - **`pdf-executor` agent (Paged.js-compatible HTML/CSS + PDFKit fallback, D-02/D-04).** `agents/pdf-executor.md` generates **print-ready output per task**: Paged.js-compatible print HTML/CSS (`@page` size/margin/marks, bleed, CMYK-aware color notes, font embedding, 300dpi raster fallback) against the `reference/print-design.md` catalogue, with PDFKit-fallback notes for Chrome-less runtimes, run through the static validator as its own self-check. It is an agent-prompt (like `design-executor`/`email-executor`), **not** a compiler no running headless Chrome, no PDFKit, no network is required to produce the print HTML/CSS. Carries a `## Record` section from the start (the record-contract lesson) and an honest `size_budget`.
569
- - **`print-renderer` connection (optional render-test, degrade-to-static-validator, D-03).** `connections/print-renderer.md` Paged.js-via-headless-Chrome (or PDFKit on Chrome-less runtimes) rendered PDF/page evidence for the verify stage when present, mirroring `connections/preview.md`. **Never hard-required**: when absent the verify stage degrades to the static print-CSS validator / code-only structural audit. Added to the `connections/connections.md` index + Capability Matrix in this closeout.
570
- - **`design-context-builder` `print` project-type route (seam CLOSED) + `design-verifier` consolidated non-web verify (D-06/D-07).** The context-builder appends the `print` enum + the `pdf-executor` route at the 34.1/34.2 seam and **closes the seam** print is the final Phase-34 output type. The verifier gains the print-verify branch by **consolidating** the native + email + print non-web verify branches into ONE delegated "Non-Web Verify" section (routing by `<project_type>` to native-platforms.md / email-design.md / print-design.md + the matching validator) a net line-reduction that keeps the verifier within its ≤700-line budget.
571
- - **Regression baseline.** `test/fixtures/baselines/phase-34-3/` freezes the print surface a valid print fixture (`print-good.css`), a validator golden (`validator-golden.json`, the recorded `validatePrintCss` output for a passing + a failing fixture, proving the rule-output shape is frozen), and `manifests-version.txt`=1.34.3 pinned by `test/suite/phase-34-3-baseline.test.cjs` so a future change cannot silently break the validator or its verdict shape.
655
+ - **Print-constraint catalogue + static validator (no `pdfkit`/`paged` dependency, D-02/D-03).** `reference/print-design.md` - the authoritative print-constraint catalogue (`@page` size/margin/marks - the print box model, bleed box + crop/registration marks, CMYK color-space awareness, font embedding/outlining, 300dpi raster fallback, and the on-press guidance the render-test verifies), registered in `reference/registry.json`. `scripts/lib/print/validate-print-css.cjs` - a pure, deterministic static checker (zero `require`, no fs/network/pdfkit/paged) that flags the statically-verifiable subset: `PR-PAGE-01` (an `@page` rule present), `PR-BLEED-01` (a bleed box / crop-marks signal), `PR-CMYK-01` (a CMYK-awareness signal), `PR-FONT-01` (a font-embed signal), `PR-DPI-01` (a 300dpi raster-fallback signal) - returning `{ ok, violations:[{ rule, detail }] }`.
656
+ - **`pdf-executor` agent (Paged.js-compatible HTML/CSS + PDFKit fallback, D-02/D-04).** `agents/pdf-executor.md` - generates **print-ready output per task**: Paged.js-compatible print HTML/CSS (`@page` size/margin/marks, bleed, CMYK-aware color notes, font embedding, 300dpi raster fallback) against the `reference/print-design.md` catalogue, with PDFKit-fallback notes for Chrome-less runtimes, run through the static validator as its own self-check. It is an agent-prompt (like `design-executor`/`email-executor`), **not** a compiler - no running headless Chrome, no PDFKit, no network is required to produce the print HTML/CSS. Carries a `## Record` section from the start (the record-contract lesson) and an honest `size_budget`.
657
+ - **`print-renderer` connection (optional render-test, degrade-to-static-validator, D-03).** `connections/print-renderer.md` - Paged.js-via-headless-Chrome (or PDFKit on Chrome-less runtimes) rendered PDF/page evidence for the verify stage when present, mirroring `connections/preview.md`. **Never hard-required**: when absent the verify stage degrades to the static print-CSS validator / code-only structural audit. Added to the `connections/connections.md` index + Capability Matrix in this closeout.
658
+ - **`design-context-builder` `print` project-type route (seam CLOSED) + `design-verifier` consolidated non-web verify (D-06/D-07).** The context-builder appends the `print` enum + the `pdf-executor` route at the 34.1/34.2 seam and **closes the seam** - print is the final Phase-34 output type. The verifier gains the print-verify branch by **consolidating** the native + email + print non-web verify branches into ONE delegated "Non-Web Verify" section (routing by `<project_type>` to native-platforms.md / email-design.md / print-design.md + the matching validator) - a net line-reduction that keeps the verifier within its ≤700-line budget.
659
+ - **Regression baseline.** `test/fixtures/baselines/phase-34-3/` freezes the print surface - a valid print fixture (`print-good.css`), a validator golden (`validator-golden.json`, the recorded `validatePrintCss` output for a passing + a failing fixture, proving the rule-output shape is frozen), and `manifests-version.txt`=1.34.3 - pinned by `test/suite/phase-34-3-baseline.test.cjs` so a future change cannot silently break the validator or its verdict shape.
572
660
 
573
661
  ### Notes
574
662
 
575
663
  - All Phase 34.3 tests are hermetic (D-10): the static print-CSS validator is a pure string→verdict function (fixture CSS → constraint checks, no network/headless-Chrome/PDFKit), the pdf-executor is validated **structurally** (frontmatter + catalogue reference + validator reference + presence), and the default `npm test` invokes **no** headless Chrome / PDFKit and pulls in **no** `pdfkit`/`paged`/`puppeteer`/`playwright` runtime. Rendered PDF/page verification is the opt-in degraded-mode path (D-03).
576
664
  - The 31.5 tarball golden (`test/fixtures/baselines/phase-31-5/tarball-manifest.txt`) was regenerated as a reviewed delta: **+4** newly-shipped files (`agents/pdf-executor.md`, `connections/print-renderer.md`, `reference/print-design.md`, `scripts/lib/print/validate-print-css.cjs`), zero removals. Tests are not shipped.
577
- - 6-manifest lockstep at **v1.34.3** (`package.json` + `package-lock.json` (root + `packages.""`) + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`); marketplace `plugins[0].keywords` + plugin keywords gain `print`/`pdf`. Version-sync hygiene done upfront (D-09): `OFF_CADENCE_VERSIONS.add('1.34.3')` + the 17 live-pinned `manifests-version.txt` baselines forward-propagated 1.34.2 → 1.34.3 (phase-34-2, the prior closeout's own baseline, joined the set). **This completes the parent Phase 34 (Non-Web Output Layer native + email + print).**
665
+ - 6-manifest lockstep at **v1.34.3** (`package.json` + `package-lock.json` (root + `packages.""`) + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`); marketplace `plugins[0].keywords` + plugin keywords gain `print`/`pdf`. Version-sync hygiene done upfront (D-09): `OFF_CADENCE_VERSIONS.add('1.34.3')` + the 17 live-pinned `manifests-version.txt` baselines forward-propagated 1.34.2 → 1.34.3 (phase-34-2, the prior closeout's own baseline, joined the set). **This completes the parent Phase 34 (Non-Web Output Layer - native + email + print).**
578
666
 
579
667
  ---
580
668
 
581
669
  ## [1.34.2] - 2026-05-31
582
670
 
583
- ### Phase 34.2 Non-Web Output Layer: Email
671
+ ### Phase 34.2 - Non-Web Output Layer: Email
584
672
 
585
- Second sub-phase of the split Phase 34 (Non-Web Output Layer). Adds **email-template output** a dedicated executor that generates email honoring the real client constraints (table-based layout, inline styles, MSO conditional comments for Outlook's Word engine, dark-mode `color-scheme` handling, and the top-20-client quirks) that modern web HTML/CSS breaks on behind the same project-type detector that routes native (34.1). Email generation is **opt-in via project-type detection web remains the default**. A decimal release on the v1.34.x arc (CHANGELOG-only, D-01); **no new runtime dependency** the executor generates the email as an agent-prompt and the plugin checks it with a deterministic static validator, no `mjml` runtime (D-02/D-10). Native (Phase 34.1) shipped; Print/PDF (Phase 34.3) is the next sub-phase, out of 34.2 (D-07). 4 plans across Waves A–C.
673
+ Second sub-phase of the split Phase 34 (Non-Web Output Layer). Adds **email-template output** - a dedicated executor that generates email honoring the real client constraints (table-based layout, inline styles, MSO conditional comments for Outlook's Word engine, dark-mode `color-scheme` handling, and the top-20-client quirks) that modern web HTML/CSS breaks on - behind the same project-type detector that routes native (34.1). Email generation is **opt-in via project-type detection - web remains the default**. A decimal release on the v1.34.x arc (CHANGELOG-only, D-01); **no new runtime dependency** - the executor generates the email as an agent-prompt and the plugin checks it with a deterministic static validator, no `mjml` runtime (D-02/D-10). Native (Phase 34.1) shipped; Print/PDF (Phase 34.3) is the next sub-phase, out of 34.2 (D-07). 4 plans across Waves A–C.
586
674
 
587
675
  ### Added
588
676
 
589
- - **Email-constraint catalogue + static validator (no `mjml` dependency, D-02/D-03).** `reference/email-design.md` the authoritative email-constraint catalogue (~30 catalogued constraints: table-based layout, inline styles, MSO conditional comments, dark-mode `color-scheme`, ~600px width, image/alt rules, and the top-20-client quirks), registered in `reference/registry.json`. `scripts/lib/email/validate-email-html.cjs` a pure, deterministic static checker (zero `require`, no fs/network/mjml) that flags the statically-verifiable subset: `EM-LAYOUT-01` (no flexbox/grid/`position`), `EM-STYLE-01` (no `<style>` as the primary styling mechanism; a small `@media`-only block is tolerated), `EM-MSO-01` (an MSO conditional comment in a full email), `EM-DARK-01` (a `color-scheme` signal present) returning `{ ok, violations:[{ rule, detail }] }`.
590
- - **`email-executor` agent (MJML canonical + derived HTML, D-02/D-04).** `agents/email-executor.md` generates **one email template per task**: an MJML source (the canonical artifact) plus the equivalent derived HTML, generated against the `reference/email-design.md` catalogue and run through the static validator as its own self-check. It is an agent-prompt (like `design-executor`/`flutter-executor`), **not** a compiler no running `mjml`, no Litmus account, no network is required to produce the email. Carries a `## Record` section from the start (the record-contract lesson) and an honest `size_budget`.
591
- - **`litmus` connection (optional render-test, degrade-to-static-validator, D-03).** `connections/litmus.md` cross-client rendered screenshots (Email-on-Acid is the documented alternative) for the verify stage when present, mirroring `connections/chromatic.md`. **Never hard-required**: when absent the verify stage degrades to the static email-HTML validator / code-only structural audit. Added to the `connections/connections.md` index + Capability Matrix in this closeout.
677
+ - **Email-constraint catalogue + static validator (no `mjml` dependency, D-02/D-03).** `reference/email-design.md` - the authoritative email-constraint catalogue (~30 catalogued constraints: table-based layout, inline styles, MSO conditional comments, dark-mode `color-scheme`, ~600px width, image/alt rules, and the top-20-client quirks), registered in `reference/registry.json`. `scripts/lib/email/validate-email-html.cjs` - a pure, deterministic static checker (zero `require`, no fs/network/mjml) that flags the statically-verifiable subset: `EM-LAYOUT-01` (no flexbox/grid/`position`), `EM-STYLE-01` (no `<style>` as the primary styling mechanism; a small `@media`-only block is tolerated), `EM-MSO-01` (an MSO conditional comment in a full email), `EM-DARK-01` (a `color-scheme` signal present) - returning `{ ok, violations:[{ rule, detail }] }`.
678
+ - **`email-executor` agent (MJML canonical + derived HTML, D-02/D-04).** `agents/email-executor.md` - generates **one email template per task**: an MJML source (the canonical artifact) plus the equivalent derived HTML, generated against the `reference/email-design.md` catalogue and run through the static validator as its own self-check. It is an agent-prompt (like `design-executor`/`flutter-executor`), **not** a compiler - no running `mjml`, no Litmus account, no network is required to produce the email. Carries a `## Record` section from the start (the record-contract lesson) and an honest `size_budget`.
679
+ - **`litmus` connection (optional render-test, degrade-to-static-validator, D-03).** `connections/litmus.md` - cross-client rendered screenshots (Email-on-Acid is the documented alternative) for the verify stage when present, mirroring `connections/chromatic.md`. **Never hard-required**: when absent the verify stage degrades to the static email-HTML validator / code-only structural audit. Added to the `connections/connections.md` index + Capability Matrix in this closeout.
592
680
  - **`design-context-builder` `email` project-type route + `design-verifier` email-verify branch (delegated, D-06/D-09).** The context-builder appends the `email` enum + the `email-executor` route at the 34.1 seam (the seam is left open for 34.3/print). The verifier gains an email-verify branch by **delegation** to `reference/email-design.md` (the verifier stayed within its ≤700-line budget).
593
- - **Regression baseline.** `test/fixtures/baselines/phase-34-2/` freezes the email surface a valid email fixture (`email-good.html`), a validator golden (`validator-golden.json`, the recorded `validateEmailHtml` output for a passing + a failing fixture, proving the rule-output shape is frozen), and `manifests-version.txt`=1.34.2 pinned by `test/suite/phase-34-2-baseline.test.cjs` so a future change cannot silently break the validator or its verdict shape.
681
+ - **Regression baseline.** `test/fixtures/baselines/phase-34-2/` freezes the email surface - a valid email fixture (`email-good.html`), a validator golden (`validator-golden.json`, the recorded `validateEmailHtml` output for a passing + a failing fixture, proving the rule-output shape is frozen), and `manifests-version.txt`=1.34.2 - pinned by `test/suite/phase-34-2-baseline.test.cjs` so a future change cannot silently break the validator or its verdict shape.
594
682
 
595
683
  ### Notes
596
684
 
597
685
  - All Phase 34.2 tests are hermetic (D-10): the static email-HTML validator is a pure string→verdict function (fixture HTML → constraint checks, no network/mjml), the email-executor is validated **structurally** (frontmatter + catalogue reference + validator reference + presence), and the default `npm test` invokes **no** Litmus/Email-on-Acid and pulls in **no** `mjml` runtime. Rendered cross-client verification is the opt-in degraded-mode path (D-03).
598
- - The 31.5 tarball golden (`test/fixtures/baselines/phase-31-5/tarball-manifest.txt`) was regenerated as a reviewed delta: **+2** newly-shipped files (`agents/email-executor.md`, `connections/litmus.md`), zero removals (641 paths). The other two new email files (`reference/email-design.md`, `scripts/lib/email/validate-email-html.cjs`) were already in the golden from their Wave-A (34.2-01) commit so the four new shipped files net to a +2 line-delta on the golden.
686
+ - The 31.5 tarball golden (`test/fixtures/baselines/phase-31-5/tarball-manifest.txt`) was regenerated as a reviewed delta: **+2** newly-shipped files (`agents/email-executor.md`, `connections/litmus.md`), zero removals (641 paths). The other two new email files (`reference/email-design.md`, `scripts/lib/email/validate-email-html.cjs`) were already in the golden from their Wave-A (34.2-01) commit - so the four new shipped files net to a +2 line-delta on the golden.
599
687
  - 6-manifest lockstep at **v1.34.2** (`package.json` + `package-lock.json` (root + `packages.""`) + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`); marketplace `plugins[0].keywords` + plugin keywords gain `email`. Version-sync hygiene done upfront (D-08): `OFF_CADENCE_VERSIONS.add('1.34.2')` + the 16 live-pinned `manifests-version.txt` baselines forward-propagated 1.34.1 → 1.34.2 (phase-34-1, the prior closeout's own baseline, joined the set).
600
688
 
601
689
  ---
602
690
 
603
691
  ## [1.34.1] - 2026-05-31
604
692
 
605
- ### Phase 34.1 Non-Web Output Layer: Native Mobile
693
+ ### Phase 34.1 - Non-Web Output Layer: Native Mobile
606
694
 
607
- First sub-phase of the split Phase 34 (Non-Web Output Layer). Crosses GDD past web-only generation into **native mobile** SwiftUI, Jetpack Compose, and Flutter fed by a shared **token-bridge** that maps the canonical CSS-token form (Phase 23) deterministically onto each platform's theme primitives, behind a **project-type detector** that routes the brief to the matching native executor. Phase 19 shipped platform *references* (iOS/Android conventions) but zero generators; 34.1 adds the generators. Native generation is **opt-in via project-type detection web remains the default**. A decimal release on the v1.34.x arc (CHANGELOG-only, D-01); no new runtime dependency (the emitters extend the existing Phase-23 token engine, D-02). Email (Phase 34.2) and Print/PDF (Phase 34.3) are separate sub-phases, out of 34.1 (D-07). 6 plans across Waves A–C.
695
+ First sub-phase of the split Phase 34 (Non-Web Output Layer). Crosses GDD past web-only generation into **native mobile** - SwiftUI, Jetpack Compose, and Flutter - fed by a shared **token-bridge** that maps the canonical CSS-token form (Phase 23) deterministically onto each platform's theme primitives, behind a **project-type detector** that routes the brief to the matching native executor. Phase 19 shipped platform *references* (iOS/Android conventions) but zero generators; 34.1 adds the generators. Native generation is **opt-in via project-type detection - web remains the default**. A decimal release on the v1.34.x arc (CHANGELOG-only, D-01); no new runtime dependency (the emitters extend the existing Phase-23 token engine, D-02). Email (Phase 34.2) and Print/PDF (Phase 34.3) are separate sub-phases, out of 34.1 (D-07). 6 plans across Waves A–C.
608
696
 
609
697
  ### Added
610
698
 
611
- - **Native token-bridge (extends the Phase-23 token engine, D-02).** `reference/native-platforms.md` (the canonical CSS-token → native-theme bridge spec + the precision contract, registered in `reference/registry.json`) plus three new emitters on the `scripts/lib/design-tokens/` facade `swift.cjs` / `compose.cjs` / `flutter.cjs` (with a shared `_native-shared.cjs`) that map a canonical token (`#3B82F6`, `16px`, `Inter`) onto SwiftUI `Color`/`CGFloat`/`Font`, Compose `Color`/`Shapes`/`Typography`/`MaterialTheme`, and Flutter `ThemeData`/`ColorScheme`/`TextTheme`. The bridge is **deterministic and round-trippable**: each emitter has a symmetric re-extractor, and the documented precision contract is colour 8-bit-per-channel exact (`#RGB`→`#RRGGBB`), integer pt/dp (logical-px double for Flutter), and typography string pass-through; non-mappable `var()`/`calc()` values pass through verbatim and are excluded from the identity set. The facade re-exports `emitSwift`/`emitCompose`/`emitFlutter` + `reextractSwift`/`reextractCompose`/`reextractFlutter` (the Phase-23 readers are untouched).
612
- - **`swift-executor` agent (SwiftUI).** `agents/swift-executor.md` generates compilable SwiftUI views per `reference/platforms.md` iOS conventions (NavigationStack/TabView, safe areas, gesture reservations, SF Pro Dynamic Type) while consuming the token-bridge (`emitSwift`) for all `Color`/`Font`/`CGFloat`; it never hand-authors hex→Color math.
613
- - **`compose-executor` agent (Jetpack Compose, Material 3).** `agents/compose-executor.md` generates Material 3 composables in Kotlin per the Android conventions (edge-to-edge + inset handling, the back-gesture reservation, the Material 3 `sp` type scale), consuming `emitCompose` for the `Color`/`Shapes`/`Typography`/`MaterialTheme` mapping.
614
- - **`flutter-executor` agent (multi-target Material 3 + Cupertino).** `agents/flutter-executor.md` the one cross-platform executor: a single Dart codebase that adapts the **theme per target** (Material 3 for web/Android, Cupertino for iOS) from one bridge output (`emitFlutter` → `ThemeData`/`ColorScheme`/`TextTheme`).
699
+ - **Native token-bridge (extends the Phase-23 token engine, D-02).** `reference/native-platforms.md` (the canonical CSS-token → native-theme bridge spec + the precision contract, registered in `reference/registry.json`) plus three new emitters on the `scripts/lib/design-tokens/` facade - `swift.cjs` / `compose.cjs` / `flutter.cjs` (with a shared `_native-shared.cjs`) - that map a canonical token (`#3B82F6`, `16px`, `Inter`) onto SwiftUI `Color`/`CGFloat`/`Font`, Compose `Color`/`Shapes`/`Typography`/`MaterialTheme`, and Flutter `ThemeData`/`ColorScheme`/`TextTheme`. The bridge is **deterministic and round-trippable**: each emitter has a symmetric re-extractor, and the documented precision contract is colour 8-bit-per-channel exact (`#RGB`→`#RRGGBB`), integer pt/dp (logical-px double for Flutter), and typography string pass-through; non-mappable `var()`/`calc()` values pass through verbatim and are excluded from the identity set. The facade re-exports `emitSwift`/`emitCompose`/`emitFlutter` + `reextractSwift`/`reextractCompose`/`reextractFlutter` (the Phase-23 readers are untouched).
700
+ - **`swift-executor` agent (SwiftUI).** `agents/swift-executor.md` - generates compilable SwiftUI views per `reference/platforms.md` iOS conventions (NavigationStack/TabView, safe areas, gesture reservations, SF Pro Dynamic Type) while consuming the token-bridge (`emitSwift`) for all `Color`/`Font`/`CGFloat`; it never hand-authors hex→Color math.
701
+ - **`compose-executor` agent (Jetpack Compose, Material 3).** `agents/compose-executor.md` - generates Material 3 composables in Kotlin per the Android conventions (edge-to-edge + inset handling, the back-gesture reservation, the Material 3 `sp` type scale), consuming `emitCompose` for the `Color`/`Shapes`/`Typography`/`MaterialTheme` mapping.
702
+ - **`flutter-executor` agent (multi-target Material 3 + Cupertino).** `agents/flutter-executor.md` - the one cross-platform executor: a single Dart codebase that adapts the **theme per target** (Material 3 for web/Android, Cupertino for iOS) from one bridge output (`emitFlutter` → `ThemeData`/`ColorScheme`/`TextTheme`).
615
703
  - **`xcode-simulator` + `android-emulator` connections (optional, degrade-to-code-only, D-03).** `connections/xcode-simulator.md` (macOS/`simctl`) and `connections/android-emulator.md` (`adb`/`emulator`) provide *rendered* native evidence for the verify stage when present, mirroring `connections/preview.md`. They are **never hard-required**: when absent the verify stage degrades to a code-only structural audit and the executors still produce compilable code with no simulator. Both are added to the `connections/connections.md` index + Capability Matrix in this closeout.
616
- - **`design-verifier` native no-DOM branch + `design-context-builder` project-type routing (D-06).** The verifier gains a native verification branch (snapshot-diff when a simulator/emulator + screenshots are available, else code-only structural audit); the context-builder detects `web` (default) / `native-ios` / `native-android` / `flutter` from the brief + `package.json`/`pubspec.yaml`/`*.xcodeproj` presence and routes to the matching executor. The detector is left **extensible** `email`/`print` enum values are added by 34.2/34.3, not 34.1.
617
- - **Regression baseline.** `test/fixtures/baselines/phase-34-1/` freezes the native surface one byte-equal native-theme fixture per platform (`swift`/`compose`/`flutter-theme.txt`, the emitter output over the canonical token map), a token-bridge round-trip snapshot (`token-bridge-roundtrip.json`, the input + per-emitter re-extraction proving identity-within-precision), and `manifests-version.txt`=1.34.1 pinned by `test/suite/phase-34-1-baseline.test.cjs` so a future change cannot silently break an emitter or the precision contract.
704
+ - **`design-verifier` native no-DOM branch + `design-context-builder` project-type routing (D-06).** The verifier gains a native verification branch (snapshot-diff when a simulator/emulator + screenshots are available, else code-only structural audit); the context-builder detects `web` (default) / `native-ios` / `native-android` / `flutter` from the brief + `package.json`/`pubspec.yaml`/`*.xcodeproj` presence and routes to the matching executor. The detector is left **extensible** - `email`/`print` enum values are added by 34.2/34.3, not 34.1.
705
+ - **Regression baseline.** `test/fixtures/baselines/phase-34-1/` freezes the native surface - one byte-equal native-theme fixture per platform (`swift`/`compose`/`flutter-theme.txt`, the emitter output over the canonical token map), a token-bridge round-trip snapshot (`token-bridge-roundtrip.json`, the input + per-emitter re-extraction proving identity-within-precision), and `manifests-version.txt`=1.34.1 - pinned by `test/suite/phase-34-1-baseline.test.cjs` so a future change cannot silently break an emitter or the precision contract.
618
706
 
619
707
  ### Notes
620
708
 
@@ -626,22 +714,22 @@ First sub-phase of the split Phase 34 (Non-Web Output Layer). Crosses GDD past w
626
714
 
627
715
  ## [1.33.6] - 2026-05-31
628
716
 
629
- ### Phase 33.6 OpenRouter Provider Adapter
717
+ ### Phase 33.6 - OpenRouter Provider Adapter
630
718
 
631
- Adds **OpenRouter** as a tier-resolver provider so users can route any agent's tier (`opus`/`sonnet`/`haiku`) through OpenRouter's aggregator catalog (one API key → Claude/GPT/Llama/Gemini/DeepSeek) **alongside** native provider auth. This introduces the plugin's **first plugin-side outbound REST client** it lands under the Phase-33.5 audited outbound baseline (the catalog-fetcher's egress is explicitly allowlisted, the outbound CI gate stays green). A decimal release on the v1.33.x arc (CHANGELOG-only, D-01); no new runtime dependency (Node built-in `fetch` only, D-10). OpenRouter is **opt-in alongside** native auth, never OpenRouter-only (D-08).
719
+ Adds **OpenRouter** as a tier-resolver provider so users can route any agent's tier (`opus`/`sonnet`/`haiku`) through OpenRouter's aggregator catalog (one API key → Claude/GPT/Llama/Gemini/DeepSeek) **alongside** native provider auth. This introduces the plugin's **first plugin-side outbound REST client** - it lands under the Phase-33.5 audited outbound baseline (the catalog-fetcher's egress is explicitly allowlisted, the outbound CI gate stays green). A decimal release on the v1.33.x arc (CHANGELOG-only, D-01); no new runtime dependency (Node built-in `fetch` only, D-10). OpenRouter is **opt-in alongside** native auth, never OpenRouter-only (D-08).
632
720
 
633
721
  ### Added
634
722
 
635
- - **Dynamic OpenRouter catalog fetcher.** `scripts/lib/openrouter/catalog-fetcher.cjs` fetches `https://openrouter.ai/api/v1/models`, maps it into the cache shape, and writes it ATOMICALLY to `.design/cache/openrouter-models.json` (gitignored runtime artifact) with a **24h TTL** skip-if-fresh (D-02, configurable via `.design/config.json#openrouter_catalog_ttl_hours`). The fetch is gated behind an **injectable `fetchImpl`** (default global `fetch`) so the entire default test suite is hermetic no live network in `npm test` (D-07) and uses the `sdk/primitives` jittered-backoff + error-classifier + `rate-guard` for bounded transient/rate-limit retry. The `fetch(` egress is allowlisted via `scripts/lib/openrouter/**` in `scripts/security/outbound-allowlist.json`, with a matching egress entry in `reference/gdd-threat-model.md` (D-06). The `OPENROUTER_API_KEY` is sent only as an `Authorization: Bearer` header and is never persisted to the cache.
636
- - **OpenRouter tier-resolver adapter.** `scripts/lib/tier-resolver-openrouter.cjs` `resolve(tier) → openrouter-model-id | null` maps GDD's `opus`/`sonnet`/`haiku` vocabulary (D-04) onto a concrete catalog id via a deterministic closed-vs-open + completion-price heuristic (opus = top closed, sonnet = mid/top-open, haiku = cheap open), with a `.design/config.json#openrouter_tier_overrides` escape hatch that wins verbatim (D-03). Never throws; an absent key / missing cache / unknown tier degrades to `null` so the caller falls back to the native provider via the existing Phase-26 tier-resolver chain (graceful-degrade D-08). `reference/openrouter-tier-mapping.md` documents the heuristic and is registered in `reference/registry.json` in the same plan that created it (D-11).
637
- - **OpenRouter connection + status skill.** `connections/openrouter.md` (the Phase-14 connection spec Setup / Probe Pattern / Tools / Pipeline Integration / Fallback Behavior) and the `/gdd:openrouter-status` skill (`skills/openrouter-status/SKILL.md`) report catalog freshness, the resolved tier→model mapping, and override state.
638
- - **Optional `cost.update` provider tag (back-compat).** The `cost.update` event payload gains an OPTIONAL `provider` field, set to `'openrouter'` when the adapter resolved the model; absent otherwise. Additive the events JSON schema is unchanged, so existing consumers are unaffected.
639
- - **OpenRouter price sub-table + catalog-drift watch.** `reference/prices.openrouter.md` (a catalog-derived view; the dynamic catalog stays the source of truth) and an authority-watcher catalog-drift classifier (`diffOpenRouterCatalog`) that surfaces deprecated/withdrawn models matching `openrouter_tier_overrides` (noise-controlled new-model / pricing-change are classified but not surfaced).
640
- - **Regression baseline.** `test/fixtures/baselines/phase-33-6/` freezes the OpenRouter surface a golden tier-resolution snapshot (the `opus`/`sonnet`/`haiku` ids the adapter resolves from the shared fixture catalog) plus encoded TTL / fallback-no-key / drift-on-synthetic-deprecation expectations pinned by `test/suite/phase-33-6-baseline.test.cjs` so a future change cannot silently undo the heuristic, the TTL, the graceful-degrade, or the drift classifier.
723
+ - **Dynamic OpenRouter catalog fetcher.** `scripts/lib/openrouter/catalog-fetcher.cjs` fetches `https://openrouter.ai/api/v1/models`, maps it into the cache shape, and writes it ATOMICALLY to `.design/cache/openrouter-models.json` (gitignored runtime artifact) with a **24h TTL** skip-if-fresh (D-02, configurable via `.design/config.json#openrouter_catalog_ttl_hours`). The fetch is gated behind an **injectable `fetchImpl`** (default global `fetch`) so the entire default test suite is hermetic - no live network in `npm test` (D-07) - and uses the `sdk/primitives` jittered-backoff + error-classifier + `rate-guard` for bounded transient/rate-limit retry. The `fetch(` egress is allowlisted via `scripts/lib/openrouter/**` in `scripts/security/outbound-allowlist.json`, with a matching egress entry in `reference/gdd-threat-model.md` (D-06). The `OPENROUTER_API_KEY` is sent only as an `Authorization: Bearer` header and is never persisted to the cache.
724
+ - **OpenRouter tier-resolver adapter.** `scripts/lib/tier-resolver-openrouter.cjs` - `resolve(tier) → openrouter-model-id | null` - maps GDD's `opus`/`sonnet`/`haiku` vocabulary (D-04) onto a concrete catalog id via a deterministic closed-vs-open + completion-price heuristic (opus = top closed, sonnet = mid/top-open, haiku = cheap open), with a `.design/config.json#openrouter_tier_overrides` escape hatch that wins verbatim (D-03). Never throws; an absent key / missing cache / unknown tier degrades to `null` so the caller falls back to the native provider via the existing Phase-26 tier-resolver chain (graceful-degrade - D-08). `reference/openrouter-tier-mapping.md` documents the heuristic and is registered in `reference/registry.json` in the same plan that created it (D-11).
725
+ - **OpenRouter connection + status skill.** `connections/openrouter.md` (the Phase-14 connection spec - Setup / Probe Pattern / Tools / Pipeline Integration / Fallback Behavior) and the `/gdd:openrouter-status` skill (`skills/openrouter-status/SKILL.md`) report catalog freshness, the resolved tier→model mapping, and override state.
726
+ - **Optional `cost.update` provider tag (back-compat).** The `cost.update` event payload gains an OPTIONAL `provider` field, set to `'openrouter'` when the adapter resolved the model; absent otherwise. Additive - the events JSON schema is unchanged, so existing consumers are unaffected.
727
+ - **OpenRouter price sub-table + catalog-drift watch.** `reference/prices.openrouter.md` (a catalog-derived view; the dynamic catalog stays the source of truth) and an authority-watcher catalog-drift classifier (`diffOpenRouterCatalog`) that surfaces deprecated/withdrawn models matching `openrouter_tier_overrides` (noise-controlled - new-model / pricing-change are classified but not surfaced).
728
+ - **Regression baseline.** `test/fixtures/baselines/phase-33-6/` freezes the OpenRouter surface - a golden tier-resolution snapshot (the `opus`/`sonnet`/`haiku` ids the adapter resolves from the shared fixture catalog) plus encoded TTL / fallback-no-key / drift-on-synthetic-deprecation expectations - pinned by `test/suite/phase-33-6-baseline.test.cjs` so a future change cannot silently undo the heuristic, the TTL, the graceful-degrade, or the drift classifier.
641
729
 
642
730
  ### Notes
643
731
 
644
- - **OpenRouter is a tier-RESOLUTION-layer adapter, not an install-registry runtime (D-12).** SC#5's "runtimes.cjs extension" wording is reinterpreted: `scripts/lib/install/runtimes.cjs` is the Phase-24-locked install matrix (how to install GDD *into* a runtime; guarded at exactly 16 entries) you don't install GDD "into" OpenRouter. OpenRouter lives only in the tier-resolution adapter (`scripts/lib/tier-resolver-openrouter.cjs`), which reads the dynamic catalog rather than the install registry, so it fully delivers SC#5's intent without polluting or weakening the Phase-24 install lock. `install/runtimes.cjs` and its 16-count guard are preserved intact.
732
+ - **OpenRouter is a tier-RESOLUTION-layer adapter, not an install-registry runtime (D-12).** SC#5's "runtimes.cjs extension" wording is reinterpreted: `scripts/lib/install/runtimes.cjs` is the Phase-24-locked install matrix (how to install GDD *into* a runtime; guarded at exactly 16 entries) - you don't install GDD "into" OpenRouter. OpenRouter lives only in the tier-resolution adapter (`scripts/lib/tier-resolver-openrouter.cjs`), which reads the dynamic catalog rather than the install registry, so it fully delivers SC#5's intent without polluting or weakening the Phase-24 install lock. `install/runtimes.cjs` and its 16-count guard are preserved intact.
645
733
  - All Phase 33.6 tests are hermetic (injected stub fetch + a fixture catalog; no network, no real `OPENROUTER_API_KEY`), so the default `npm test` stays green (D-07), and `npm run scan:outbound` stays green with the OpenRouter egress allowlisted (D-06).
646
734
  - The 31.5 tarball golden (`test/fixtures/baselines/phase-31-5/tarball-manifest.txt`) was regenerated as a reviewed delta: **+6** shipped OpenRouter files (`connections/openrouter.md`, `reference/openrouter-tier-mapping.md`, `reference/prices.openrouter.md`, `scripts/lib/openrouter/catalog-fetcher.cjs`, `scripts/lib/tier-resolver-openrouter.cjs`, `skills/openrouter-status/SKILL.md`), zero removals (627 paths).
647
735
  - 6-manifest lockstep at **v1.33.6** (`package.json` + `package-lock.json` (root + `packages.""`) + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`). Version-sync hygiene done upfront (D-09): `OFF_CADENCE_VERSIONS.add('1.33.6')` + the 14 live-pinned `manifests-version.txt` baselines forward-propagated 1.33.5 → 1.33.6.
@@ -650,9 +738,9 @@ Adds **OpenRouter** as a tier-resolver provider so users can route any agent's t
650
738
 
651
739
  ## [1.33.5] - 2026-05-31
652
740
 
653
- ### Phase 33.5 GDD Runtime Security Hardening
741
+ ### Phase 33.5 - GDD Runtime Security Hardening
654
742
 
655
- Audits and hardens GDD's **own** runtime attack surface the multi-MCP-server, peer-CLI-spawning, WebSocket-transport-emitting SDK that grew across Phases 20–27 without a formalized security model. Phase 14.5 ships a safety floor for *user code being audited*; this phase is the equivalent for GDD's *own* runtime. Ships a STRIDE threat model + static runtime audit, an outbound-network CI gate, WebSocket bind hardening, gdd-state MCP input validation, peer-CLI env sandboxing, a secret-scan extension + fuzz, a published disclosure policy, and a regression baseline. A decimal release on the v1.33.x arc (CHANGELOG-only, D-01); no new runtime dependency (built-ins only, D-12). 6 plans across Waves A–C.
743
+ Audits and hardens GDD's **own** runtime attack surface - the multi-MCP-server, peer-CLI-spawning, WebSocket-transport-emitting SDK that grew across Phases 20–27 without a formalized security model. Phase 14.5 ships a safety floor for *user code being audited*; this phase is the equivalent for GDD's *own* runtime. Ships a STRIDE threat model + static runtime audit, an outbound-network CI gate, WebSocket bind hardening, gdd-state MCP input validation, peer-CLI env sandboxing, a secret-scan extension + fuzz, a published disclosure policy, and a regression baseline. A decimal release on the v1.33.x arc (CHANGELOG-only, D-01); no new runtime dependency (built-ins only, D-12). 6 plans across Waves A–C.
656
744
 
657
745
  ### Added
658
746
 
@@ -661,13 +749,13 @@ Audits and hardens GDD's **own** runtime attack surface — the multi-MCP-server
661
749
  - **WebSocket localhost-default bind + timing-safe token.** `scripts/lib/transports/ws.cjs` now defaults its bind host to **127.0.0.1** (was the implicit `0.0.0.0` all-interfaces bind); a remote bind is opt-in via `.design/config.json` `event_stream.bind_host` or the `GDD_WS_BIND_HOST` env override, and `scripts/scan-ws-bind.cjs` gates that the default config would never bind `0.0.0.0`. The Bearer-token compare is upgraded to `crypto.timingSafeEqual` (was `!==`, timing-unsafe); the existing ≥8-char-token rule is retained (D-04).
662
750
  - **gdd-state MCP input validation.** `sdk/mcp/gdd-state/tools/shared.ts` gains a `resolveStatePath()` path-traversal guard (rejects `..`-escape / absolute-outside / best-effort symlink-escape on the `GDD_STATE_PATH` override) and an `assertInputWithinLimits()` payload cap (64 KiB input / 8192-char string / depth-32 JSON-bomb guard) wired into all 11 tool handlers; the 11 tool input schemas are tightened with `maxLength`/`maxItems` (and already carried `additionalProperties:false`) (D-08).
663
751
  - **Peer-CLI env sandbox (allowlist-forward / default-deny).** A shared `scripts/lib/peer-cli/sanitize-env.cjs` helper builds the spawned child's environment from an OS-essential baseline **plus** an explicit allowlist read from `.design/config.json` `peer_cli.env_allowlist`, applied to both the acp and asp clients. GDD's `ANTHROPIC_API_KEY` / `GH_TOKEN` / `GDD_*` and anything secret-shaped are never forwarded to a spawned peer unless explicitly allowlisted (D-03).
664
- - **Secret-scan extension + fuzz.** `scripts/lib/redact.cjs` adds three modern token formats Gemini/GCP `AIza…`, GitHub fine-grained `github_pat_…`, and GitHub server/oauth/user/refresh `gh[sour]_…` bringing the redaction set to **11 patterns**, with a synthetic-secret fuzz test asserting zero leak per provider format (D-07). The existing PEM/JWT/anthropic/stripe/slack/`ghp_`/AWS/`sk-` patterns are retained.
752
+ - **Secret-scan extension + fuzz.** `scripts/lib/redact.cjs` adds three modern token formats - Gemini/GCP `AIza…`, GitHub fine-grained `github_pat_…`, and GitHub server/oauth/user/refresh `gh[sour]_…` - bringing the redaction set to **11 patterns**, with a synthetic-secret fuzz test asserting zero leak per provider format (D-07). The existing PEM/JWT/anthropic/stripe/slack/`ghp_`/AWS/`sk-` patterns are retained.
665
753
  - **`SECURITY.md` disclosure policy.** A repo-root `SECURITY.md` documents the supported-versions stance and routes vulnerability reports through **GitHub private security advisories** (the repo Security tab → "Report a vulnerability"); it publishes no email / no PII (D-02) and notes that enabling private vulnerability reporting is a one-line repo setting the maintainer must toggle (D-11).
666
- - **Regression baseline.** `test/fixtures/baselines/phase-33-5/` freezes the hardened surface a STRIDE-checklist snapshot, a hardening-surface invariant manifest (ws default host, redact pattern count, sanitize-env module + allowlist key, 11 gdd-state schemas, allowlist/threat-model/audit paths), and a synthetic secret-fuzz corpus pinned by `test/suite/phase-33-5-baseline.test.cjs` so a future change cannot silently undo a hardened surface.
754
+ - **Regression baseline.** `test/fixtures/baselines/phase-33-5/` freezes the hardened surface - a STRIDE-checklist snapshot, a hardening-surface invariant manifest (ws default host, redact pattern count, sanitize-env module + allowlist key, 11 gdd-state schemas, allowlist/threat-model/audit paths), and a synthetic secret-fuzz corpus - pinned by `test/suite/phase-33-5-baseline.test.cjs` so a future change cannot silently undo a hardened surface.
667
755
 
668
756
  ### Notes
669
757
 
670
- - **WebSocket event-stream now binds `127.0.0.1` by default (was `0.0.0.0`).** Opt into a remote bind via `.design/config.json` `event_stream.bind_host` or the `GDD_WS_BIND_HOST` env override. This is **not marked BREAKING** the event stream is a token-gated observability surface (Bearer auth ships on every upgrade), and the safe-by-default localhost bind only restricts an unintended off-box exposure; the opt-in escape hatch preserves the remote-bind workflow for anyone who relied on it.
758
+ - **WebSocket event-stream now binds `127.0.0.1` by default (was `0.0.0.0`).** Opt into a remote bind via `.design/config.json` `event_stream.bind_host` or the `GDD_WS_BIND_HOST` env override. This is **not marked BREAKING** - the event stream is a token-gated observability surface (Bearer auth ships on every upgrade), and the safe-by-default localhost bind only restricts an unintended off-box exposure; the opt-in escape hatch preserves the remote-bind workflow for anyone who relied on it.
671
759
  - All Phase 33.5 tests are hermetic (no network, no live peer; the WS test binds ephemeral localhost; the outbound + bind gates are static scans), so the default `npm test` stays green (D-10).
672
760
  - 6-manifest lockstep at **v1.33.5** (`package.json` + `package-lock.json` (root + `packages.""`) + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`). Version-sync hygiene done upfront (D-09): `OFF_CADENCE_VERSIONS.add('1.33.5')` + the 13 live-pinned `manifests-version.txt` baselines forward-propagated 1.33.0 → 1.33.5.
673
761
 
@@ -675,31 +763,31 @@ Audits and hardens GDD's **own** runtime attack surface — the multi-MCP-server
675
763
 
676
764
  ## [1.33.0] - 2026-05-30
677
765
 
678
- ### Phase 33 Skill Behavior Tests (Pressure-Scenario Harness)
766
+ ### Phase 33 - Skill Behavior Tests (Pressure-Scenario Harness)
679
767
 
680
768
  Adds a **behavior-test category** that complements the static validators (Phase 28.5 line/frontmatter) and static guardrails (Phase 32 `<HARD-GATE>` presence) with tests that verify skills hold UNDER PRESSURE. A manifest-driven runner drives a pressure scenario (time / sunk-cost / authority / exhaustion / scope-minimization) through an injectable agent-invoker and validates the response against a compliance/violation rubric with N-attempts + majority rule. Ships the harness + 8 baseline scenarios + synthetic RED baselines + the description-format A/B methodology + reflector telemetry integration. Ports the TDD-for-skills methodology + the pressure-scenario pattern from [`obra/superpowers/skills/writing-skills`](https://github.com/obra/superpowers) (MIT). 6 plans across Waves A–C.
681
769
 
682
770
  ### Added
683
771
 
684
- - **Manifest-driven pressure-scenario runner** `scripts/lib/skill-behavior/runner.cjs` exposes an INJECTABLE `invokeAgent(prompt, opts) -> { text }` seam (no `@anthropic-ai/sdk` dependency D-03): a deterministic STUB invoker (`scripts/lib/skill-behavior/stub-invoker.cjs`) for CI/tests, plus a documented real-invoker adapter for the opt-in keyed run. Runs each scenario N times and decides compliance by majority.
685
- - **Pressure-scenario schema** `reference/schemas/pressure-scenario.schema.json` (wired into `validate:schemas`), with conformance tests for the 8 scenario manifests.
686
- - **8 pressure scenarios + synthetic RED baselines** `test/suite/skill-behavior/scenarios/` (7 stage skills + `using-gdd`) with synthetic-from-observed-cycle-drift RED baselines at `test/fixtures/skill-behavior-baseline/` (D-02 ROADMAP-sanctioned).
687
- - **Description-format A/B methodology** `docs/research/description-format-ab.md` documents the trigger-only vs `<what>. Use when` counterfactual + the 7/10-run threshold (D-08), with a `pending: keyed run` marker. The empirical result is an opt-in maintainer follow-up (no API key in CI).
688
- - **Reflector telemetry** `scripts/lib/skill-behavior/telemetry.cjs` emits to `.design/telemetry/skill-behavior.jsonl`; a sustained-failure signal (≥3 of last 10 runs failing for a scenario) feeds an `apply-reflections` proposal (stub-tested integration D-07).
689
- - **`npm run test:behavior` (opt-in, D-06).** A new script that runs the behavior tests ONLY when `ANTHROPIC_API_KEY` is set (a clear skip message + exit 0 otherwise). The default `npm test` is UNCHANGED the structural stub tests stay CI-green (LLM non-determinism keeps live behavior runs out of the default suite).
690
- - **Docs** `CONTRIBUTING.md` gains a "How to add a pressure scenario" section + the keyed `ANTHROPIC_API_KEY=… npm run test:behavior` procedure; `README.md` gains a "Skill behavior tests" subsection.
772
+ - **Manifest-driven pressure-scenario runner** - `scripts/lib/skill-behavior/runner.cjs` exposes an INJECTABLE `invokeAgent(prompt, opts) -> { text }` seam (no `@anthropic-ai/sdk` dependency - D-03): a deterministic STUB invoker (`scripts/lib/skill-behavior/stub-invoker.cjs`) for CI/tests, plus a documented real-invoker adapter for the opt-in keyed run. Runs each scenario N times and decides compliance by majority.
773
+ - **Pressure-scenario schema** - `reference/schemas/pressure-scenario.schema.json` (wired into `validate:schemas`), with conformance tests for the 8 scenario manifests.
774
+ - **8 pressure scenarios + synthetic RED baselines** - `test/suite/skill-behavior/scenarios/` (7 stage skills + `using-gdd`) with synthetic-from-observed-cycle-drift RED baselines at `test/fixtures/skill-behavior-baseline/` (D-02 - ROADMAP-sanctioned).
775
+ - **Description-format A/B methodology** - `docs/research/description-format-ab.md` documents the trigger-only vs `<what>. Use when` counterfactual + the 7/10-run threshold (D-08), with a `pending: keyed run` marker. The empirical result is an opt-in maintainer follow-up (no API key in CI).
776
+ - **Reflector telemetry** - `scripts/lib/skill-behavior/telemetry.cjs` emits to `.design/telemetry/skill-behavior.jsonl`; a sustained-failure signal (≥3 of last 10 runs failing for a scenario) feeds an `apply-reflections` proposal (stub-tested integration - D-07).
777
+ - **`npm run test:behavior` (opt-in, D-06).** A new script that runs the behavior tests ONLY when `ANTHROPIC_API_KEY` is set (a clear skip message + exit 0 otherwise). The default `npm test` is UNCHANGED - the structural stub tests stay CI-green (LLM non-determinism keeps live behavior runs out of the default suite).
778
+ - **Docs** - `CONTRIBUTING.md` gains a "How to add a pressure scenario" section + the keyed `ANTHROPIC_API_KEY=… npm run test:behavior` procedure; `README.md` gains a "Skill behavior tests" subsection.
691
779
 
692
780
  ### Removed
693
781
 
694
- - **BREAKING: the Phase-31.5 deprecation shims are removed (D-04).** The 10 `GDD-DEPRECATION-SHIM` re-exports re-created at the OLD SDK paths in v1.31.5 `scripts/lib/{cli,event-stream,gdd-state,gdd-errors}/index.ts`, `scripts/lib/{error-classifier,iteration-budget,jittered-backoff,lockfile}.cjs`, and `scripts/mcp-servers/{gdd-state,gdd-mcp}/server.ts` are deleted. The grace window elapsed (v1.31.5 shipped with shims → v1.32.0 still had them → v1.33.0 removes them). The now-empty `scripts/mcp-servers/` is dropped from the `package.json` `files` allowlist. **If you imported `scripts/lib/…` or `scripts/mcp-servers/…` directly, import from `sdk/…` instead** (e.g. `scripts/lib/cli` → `sdk/cli`, `scripts/lib/error-classifier.cjs` → `sdk/primitives/error-classifier.cjs`, `scripts/mcp-servers/gdd-state/server.ts` → `sdk/mcp/gdd-state/server.ts`). Internal callers were all repointed to `sdk/` in 31.5 + the Phase-32 gdd-events fix; the `gdd-state-mcp` / `gdd-mcp` bins target `sdk/`, so deletion drops only the external re-export proven by the `no-stale-internal-refs` guard + the full suite + the 31.5 headless pack→install→run E2E.
782
+ - **BREAKING: the Phase-31.5 deprecation shims are removed (D-04).** The 10 `GDD-DEPRECATION-SHIM` re-exports re-created at the OLD SDK paths in v1.31.5 - `scripts/lib/{cli,event-stream,gdd-state,gdd-errors}/index.ts`, `scripts/lib/{error-classifier,iteration-budget,jittered-backoff,lockfile}.cjs`, and `scripts/mcp-servers/{gdd-state,gdd-mcp}/server.ts` - are deleted. The grace window elapsed (v1.31.5 shipped with shims → v1.32.0 still had them → v1.33.0 removes them). The now-empty `scripts/mcp-servers/` is dropped from the `package.json` `files` allowlist. **If you imported `scripts/lib/…` or `scripts/mcp-servers/…` directly, import from `sdk/…` instead** (e.g. `scripts/lib/cli` → `sdk/cli`, `scripts/lib/error-classifier.cjs` → `sdk/primitives/error-classifier.cjs`, `scripts/mcp-servers/gdd-state/server.ts` → `sdk/mcp/gdd-state/server.ts`). Internal callers were all repointed to `sdk/` in 31.5 + the Phase-32 gdd-events fix; the `gdd-state-mcp` / `gdd-mcp` bins target `sdk/`, so deletion drops only the external re-export - proven by the `no-stale-internal-refs` guard + the full suite + the 31.5 headless pack→install→run E2E.
695
783
 
696
784
  ### Attribution
697
785
 
698
- - **Methodology + pattern ported from [`obra/superpowers/skills/writing-skills`](https://github.com/obra/superpowers) (MIT).** The TDD-for-skills cycle (RED: agent fails without the skill → GREEN: skill counters the rationalizations → REFACTOR: close new loopholes) and the pressure-scenario pattern. See `NOTICE`. We port the methodology, not the content GDD's scenarios, rubrics, and skills are GDD-specific.
786
+ - **Methodology + pattern ported from [`obra/superpowers/skills/writing-skills`](https://github.com/obra/superpowers) (MIT).** The TDD-for-skills cycle (RED: agent fails without the skill → GREEN: skill counters the rationalizations → REFACTOR: close new loopholes) and the pressure-scenario pattern. See `NOTICE`. We port the methodology, not the content - GDD's scenarios, rubrics, and skills are GDD-specific.
699
787
 
700
788
  ### Notes
701
789
 
702
- - The behavioral evidence (real RED baselines from live agent runs + the empirical A/B result) is NOT capturable autonomously (no API key / SDK in CI). RED baselines are authored synthetic-from-observed-cycle-drift (D-02); the A/B evidence file documents methodology + expected-signal + a `pending: keyed run` marker. A Phase-28.5 feedback note points at `docs/research/description-format-ab.md`; **Phase 28.5's description-format validator regex is unchanged** (33-06 emits the pointer only D-08).
790
+ - The behavioral evidence (real RED baselines from live agent runs + the empirical A/B result) is NOT capturable autonomously (no API key / SDK in CI). RED baselines are authored synthetic-from-observed-cycle-drift (D-02); the A/B evidence file documents methodology + expected-signal + a `pending: keyed run` marker. A Phase-28.5 feedback note points at `docs/research/description-format-ab.md`; **Phase 28.5's description-format validator regex is unchanged** (33-06 emits the pointer only - D-08).
703
791
  - The 31.5 tarball golden (`test/fixtures/baselines/phase-31-5/tarball-manifest.txt`) was regenerated as a reviewed delta: **+4** skill-behavior paths (`reference/schemas/pressure-scenario.schema.json` + the 3 `scripts/lib/skill-behavior/*.cjs`) and **−10** removed shim paths (618 paths).
704
792
  - 6-manifest lockstep at **v1.33.0** (`package.json` + `package-lock.json` + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`). Version-sync hygiene done upfront (D-09): `OFF_CADENCE_VERSIONS.add('1.33.0')` + prior `manifests-version.txt` baselines forward-propagated 1.32.0 → 1.33.0.
705
793
 
@@ -707,59 +795,59 @@ Adds a **behavior-test category** that complements the static validators (Phase
707
795
 
708
796
  ## [1.32.0] - 2026-05-30
709
797
 
710
- ### Phase 32 Skill Auto-Trigger Discipline + Defensive Guardrails
798
+ ### Phase 32 - Skill Auto-Trigger Discipline + Defensive Guardrails
711
799
 
712
- Closes the auto-trigger gap between GDD's 70+ skills and the harness's description-match skill-discovery layer. GDD had zero forcing functions agents consulted skills opportunistically, not disciplinedly. This release ports the skill-discipline **mechanism** (not content) from [`obra/superpowers`](https://github.com/obra/superpowers) (MIT): a SessionStart-injected bootstrap contract, defensive guardrails at every stage transition, and two lightweight skill-discovery instruments that feed Phase 33's behavioral A/B. 9 plans across Waves A–C.
800
+ Closes the auto-trigger gap between GDD's 70+ skills and the harness's description-match skill-discovery layer. GDD had zero forcing functions - agents consulted skills opportunistically, not disciplinedly. This release ports the skill-discipline **mechanism** (not content) from [`obra/superpowers`](https://github.com/obra/superpowers) (MIT): a SessionStart-injected bootstrap contract, defensive guardrails at every stage transition, and two lightweight skill-discovery instruments that feed Phase 33's behavioral A/B. 9 plans across Waves A–C.
713
801
 
714
802
  ### Added
715
803
 
716
- - **`using-gdd` SessionStart bootstrap (the forcing function GDD lacked).** A new `skills/using-gdd/SKILL.md` discipline contract the **1%-rule** ("if you think there is even a 1% chance a skill applies, you ABSOLUTELY MUST invoke it"), a ≥10-row **red-flags table** (Thought → Reality), a skill-priority order (Process → Implementation → Audit), an instruction-priority precedence (user CLAUDE.md > GDD skill > defaults), and the GDD pipeline flow. Carries `disable-model-invocation: true` (it is injected, not model-invoked) and a pure-trigger description (no `<what>` clause, per superpowers' shortcut finding proof-by-implementation; Phase 28.5's description-format validator stays open pending Phase 33's A/B evidence).
717
- - **Per-harness SessionStart inject emitter.** `hooks/inject-using-gdd.sh` is a single polyglot script that reads `using-gdd` and emits it as the host harness's SessionStart `additionalContext` shape Cursor (`additional_context`), Claude Code (`hookSpecificOutput.additionalContext`), and SDK-standard (top-level `additionalContext`) branches via env-var detection, with a pure-bash JSON escaper (no jq/python dependency). A `hooks/run-hook.cmd` polyglot Windows wrapper and a 5th `hooks/hooks.json` SessionStart entry (matcher `startup|clear|compact`) wire it in.
804
+ - **`using-gdd` SessionStart bootstrap (the forcing function GDD lacked).** A new `skills/using-gdd/SKILL.md` discipline contract - the **1%-rule** ("if you think there is even a 1% chance a skill applies, you ABSOLUTELY MUST invoke it"), a ≥10-row **red-flags table** (Thought → Reality), a skill-priority order (Process → Implementation → Audit), an instruction-priority precedence (user CLAUDE.md > GDD skill > defaults), and the GDD pipeline flow. Carries `disable-model-invocation: true` (it is injected, not model-invoked) and a pure-trigger description (no `<what>` clause, per superpowers' shortcut finding - proof-by-implementation; Phase 28.5's description-format validator stays open pending Phase 33's A/B evidence).
805
+ - **Per-harness SessionStart inject emitter.** `hooks/inject-using-gdd.sh` is a single polyglot script that reads `using-gdd` and emits it as the host harness's SessionStart `additionalContext` shape - Cursor (`additional_context`), Claude Code (`hookSpecificOutput.additionalContext`), and SDK-standard (top-level `additionalContext`) branches via env-var detection, with a pure-bash JSON escaper (no jq/python dependency). A `hooks/run-hook.cmd` polyglot Windows wrapper and a 5th `hooks/hooks.json` SessionStart entry (matcher `startup|clear|compact`) wire it in.
718
806
  - **`<SUBAGENT-STOP>` no-cascade structural guarantee.** The inject is wired ONLY under the SessionStart hook event; subagent spawns do not fire SessionStart, so the bootstrap contract cannot cascade into a subagent's context. The `using-gdd` body opens with a `<SUBAGENT-STOP>` tag. (Structural guarantee here; the behavioral proof under pressure is deferred to Phase 33.)
719
- - **`<HARD-GATE>` at the 5 stage transitions.** `skills/{brief,explore,plan,design,verify}/SKILL.md` each gain a `<HARD-GATE>` block that refuses to advance the pipeline until the stage's required artifact (`.design/BRIEF.md`, `DESIGN.md` + `DESIGN-CONTEXT.md`, etc.) exists and is approved reading the artifact path from `.design/STATE.md` when a project uses a custom location.
807
+ - **`<HARD-GATE>` at the 5 stage transitions.** `skills/{brief,explore,plan,design,verify}/SKILL.md` each gain a `<HARD-GATE>` block that refuses to advance the pipeline until the stage's required artifact (`.design/BRIEF.md`, `DESIGN.md` + `DESIGN-CONTEXT.md`, etc.) exists and is approved - reading the artifact path from `.design/STATE.md` when a project uses a custom location.
720
808
  - **Rationalization tables in the 7 stage-orchestrator skills.** `brief / explore / plan / design / verify / discuss / audit` each carry a `| Thought | Reality |` rationalization table (≥6 rows) that names the common "skip the stage" justifications and rebuts each.
721
- - **Inline self-review blocks** in `brief` and `plan` (the 2 spec-producing transitions) a 4-line inline checklist (Phase 28.5 progressive-disclosure: a short check belongs at the transition surface, not behind a skill-discovery hop).
809
+ - **Inline self-review blocks** in `brief` and `plan` (the 2 spec-producing transitions) - a 4-line inline checklist (Phase 28.5 progressive-disclosure: a short check belongs at the transition surface, not behind a skill-discovery hop).
722
810
  - **Portable discipline blocks** in `AGENTS.md` + `GEMINI.md` so non-Claude-Code harnesses (Codex, Gemini, etc.) inherit the same skill-discipline contract.
723
- - **`router_pick` skill-discovery telemetry** a new `router_pick` event in `reference/schemas/events.schema.json` plus an emit point (`skills/router/router-pick-emitter.md`). Records a sha256 `context_hash` (never the raw intent no PII) so Phase 33 can measure which skill the router actually selected.
724
- - **`lint-skill-descriptions.cjs` drift detector** a maintainer/CI script (not shipped to npm) that flags any skill whose one-line `description:` is stale while its body changed ≥3 times since (the D-02 heuristic).
811
+ - **`router_pick` skill-discovery telemetry** - a new `router_pick` event in `reference/schemas/events.schema.json` plus an emit point (`skills/router/router-pick-emitter.md`). Records a sha256 `context_hash` (never the raw intent - no PII) so Phase 33 can measure which skill the router actually selected.
812
+ - **`lint-skill-descriptions.cjs` drift detector** - a maintainer/CI script (not shipped to npm) that flags any skill whose one-line `description:` is stale while its body changed ≥3 times since (the D-02 heuristic).
725
813
  - **`gdd-health` `skill_discipline` check (#7).** `scripts/lib/health-mirror/index.cjs` gains a 7th read-only check reporting `skill-discipline: ready` (using-gdd present AND `hooks.json` SessionStart wires the inject), `skill-discipline: missing using-gdd`, or `skill-discipline: hook not wired`. Documented in `skills/health/SKILL.md`.
726
814
 
727
815
  ### Attribution
728
816
 
729
- - **Mechanism ported from [`obra/superpowers`](https://github.com/obra/superpowers) (MIT).** Three artifacts: the SessionStart hook-script structure, the 1%-rule + red-flags-table format, and the defensive-guardrail patterns (`<HARD-GATE>` / `<SUBAGENT-STOP>` / rationalization-table). See `NOTICE`. We port the MECHANISM, not the content GDD's skills, gates, and tables are GDD-specific.
817
+ - **Mechanism ported from [`obra/superpowers`](https://github.com/obra/superpowers) (MIT).** Three artifacts: the SessionStart hook-script structure, the 1%-rule + red-flags-table format, and the defensive-guardrail patterns (`<HARD-GATE>` / `<SUBAGENT-STOP>` / rationalization-table). See `NOTICE`. We port the MECHANISM, not the content - GDD's skills, gates, and tables are GDD-specific.
730
818
 
731
819
  ### Notes
732
820
 
733
821
  - The pure-trigger `using-gdd` description ships as **proof-by-implementation** of superpowers' shortcut finding (a `<what>`-clause can make agents follow the description summary instead of reading the body). The counterfactual A/B description test and the pressure-scenario behavior runner are **deferred to Phase 33** (D-02); Phase 32 ships the `router_pick` events + drift-lint instruments that Phase 33 consumes. Phase 28.5's global description-format validator regex stays open until that evidence lands.
734
- - 4 stage skills (`brief`, `explore`, `plan`, `verify`) sit in the validator's advisory **warn** band (≥100 lines) after gaining the mandatory discipline blocks well under the **block** threshold (250). Accepted by design: the gates + tables are the deliverable.
822
+ - 4 stage skills (`brief`, `explore`, `plan`, `verify`) sit in the validator's advisory **warn** band (≥100 lines) after gaining the mandatory discipline blocks - well under the **block** threshold (250). Accepted by design: the gates + tables are the deliverable.
735
823
  - 6-manifest lockstep at **v1.32.0** (`package.json` + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`).
736
824
 
737
825
  ---
738
826
 
739
827
  ## [1.31.5] - 2026-05-29
740
828
 
741
- ### Phase 31.5 Repo Structure Consolidation
829
+ ### Phase 31.5 - Repo Structure Consolidation
742
830
 
743
831
  One audit-clean repo layout with **zero changes to the public surface** (commands, agents, skills, hooks, connections, install flow) and **no file content lost**. The SDK that `plugin.json` has advertised since v1.20.0 now actually lives in `sdk/`; the npm tarball ships only what plugin users need; the repo root is decluttered. Every move was history-preserving (`git mv`), guarded by three independent regression nets (test-parity, tarball-diff golden, headless-E2E install) and a one-minor deprecation-shim grace window. 10 plans + 1 follow-up across Waves A–E (31-5-01..31-5-10 + 31-5-9.5).
744
832
 
745
833
  ### Added
746
834
 
747
- - **`sdk/` the public SDK, collected.** `git mv` consolidated the strewn modules into one place: `sdk/cli`, `sdk/state`, `sdk/event-stream`, `sdk/errors`, `sdk/primitives/*` (the 4 typed `.cjs`+`.d.cts` pairs), and **both** MCP servers under `sdk/mcp/` (`sdk/mcp/gdd-state`, `sdk/mcp/gdd-mcp` D-08). A `sdk/index.ts` barrel re-exports the surface, and `sdk/README.md` (≤120 lines, D-06) documents what the SDK is with a per-module import-path table (module → public import → helpers → stability tag). Public import paths are explicit per-module (`/sdk/cli`, `/sdk/state`, `/sdk/event-stream`, `/sdk/primitives/*`, `/sdk/errors`, `/sdk/mcp/gdd-state`, `/sdk/mcp/gdd-mcp`) plus the barrel (D-04).
748
- - **3 SDK bins that now work from an npm install.** `bin/gdd-sdk`, `bin/gdd-state-mcp`, and `bin/gdd-mcp` are dual-mode trampolines (prefer a compiled `.js` sibling, fall back to `.ts` strip in-repo). A `prepack` step (`npm run build:sdk` → esbuild) bundles the three TS-entry bins to self-contained CommonJS siblings that ship in the tarball fixing a **pre-existing latent break**: raw `.ts` bins cannot run under `--experimental-strip-types` from inside `node_modules` (`ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING`), which had silently shipped since the TS bins were introduced. The `.ts` remain the source of truth; the `.js` are gitignored build artifacts (`postpack` cleans them).
749
- - **`recipes/` scaffold** `recipes/` + a recipe-loader + `reference/schemas/recipe.schema.json`. Ships empty of recipes (the loading machinery, not content).
750
- - **`docs/i18n/`** the 6 `README.{de,fr,it,ja,ko,zh-CN}.md` translations relocated from the repo root (D-11). English `README.md` stays at root; its language-selector links were repointed.
751
- - **`.npmignore`** a defense-in-depth duplicate of the `package.json` `files` allowlist (D-10).
752
- - **Private-files CI guard** `test/suite/no-private-files-tracked.test.cjs` asserts 0 tracked `.planning/` / `REVIEW.md` / `tmp_support_preview*` files so the (already-remediated) leak stays closed (D-03).
753
- - **`no-stale-internal-refs` static guard** `test/suite/no-stale-internal-refs.test.cjs` greps the shipped user-facing surface (hooks/, agents/, skills/, bin/, scripts/cli/, scripts/install.cjs) for any reference to an OLD moved-SDK path and fails on any hit outside a deprecation shim. Proves every internal caller was repointed to `sdk/`.
835
+ - **`sdk/` - the public SDK, collected.** `git mv` consolidated the strewn modules into one place: `sdk/cli`, `sdk/state`, `sdk/event-stream`, `sdk/errors`, `sdk/primitives/*` (the 4 typed `.cjs`+`.d.cts` pairs), and **both** MCP servers under `sdk/mcp/` (`sdk/mcp/gdd-state`, `sdk/mcp/gdd-mcp` - D-08). A `sdk/index.ts` barrel re-exports the surface, and `sdk/README.md` (≤120 lines, D-06) documents what the SDK is with a per-module import-path table (module → public import → helpers → stability tag). Public import paths are explicit per-module (`/sdk/cli`, `/sdk/state`, `/sdk/event-stream`, `/sdk/primitives/*`, `/sdk/errors`, `/sdk/mcp/gdd-state`, `/sdk/mcp/gdd-mcp`) plus the barrel (D-04).
836
+ - **3 SDK bins that now work from an npm install.** `bin/gdd-sdk`, `bin/gdd-state-mcp`, and `bin/gdd-mcp` are dual-mode trampolines (prefer a compiled `.js` sibling, fall back to `.ts` strip in-repo). A `prepack` step (`npm run build:sdk` → esbuild) bundles the three TS-entry bins to self-contained CommonJS siblings that ship in the tarball - fixing a **pre-existing latent break**: raw `.ts` bins cannot run under `--experimental-strip-types` from inside `node_modules` (`ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING`), which had silently shipped since the TS bins were introduced. The `.ts` remain the source of truth; the `.js` are gitignored build artifacts (`postpack` cleans them).
837
+ - **`recipes/` scaffold** - `recipes/` + a recipe-loader + `reference/schemas/recipe.schema.json`. Ships empty of recipes (the loading machinery, not content).
838
+ - **`docs/i18n/`** - the 6 `README.{de,fr,it,ja,ko,zh-CN}.md` translations relocated from the repo root (D-11). English `README.md` stays at root; its language-selector links were repointed.
839
+ - **`.npmignore`** - a defense-in-depth duplicate of the `package.json` `files` allowlist (D-10).
840
+ - **Private-files CI guard** - `test/suite/no-private-files-tracked.test.cjs` asserts 0 tracked `.planning/` / `REVIEW.md` / `tmp_support_preview*` files so the (already-remediated) leak stays closed (D-03).
841
+ - **`no-stale-internal-refs` static guard** - `test/suite/no-stale-internal-refs.test.cjs` greps the shipped user-facing surface (hooks/, agents/, skills/, bin/, scripts/cli/, scripts/install.cjs) for any reference to an OLD moved-SDK path and fails on any hit outside a deprecation shim. Proves every internal caller was repointed to `sdk/`.
754
842
 
755
843
  ### Changed
756
844
 
757
845
  - **`package.json` `files` narrowed to an explicit allowlist (+ `.npmignore`).** Maintainer-only top-level scripts no longer reach a user's `node_modules`. **Tarball diff vs the prior (v1.31.0) tarball:**
758
846
  - **ADDED:** `sdk/` (the SDK, incl. the 3 compiled-bin `.js` siblings), `recipes/`, `docs/i18n/`, `NOTICE`.
759
847
  - **DROPPED (23 maintainer-only files):** `scripts/` wholesale + the top-level `bootstrap*`, `rollback-release.sh`, `apply-branch-protection.sh`, `release-smoke-test.cjs`, `verify-version-sync.cjs`, `extract-changelog-section.cjs`, `detect-stale-refs.cjs`, `run-injection-scanner-ci.cjs`, `injection-patterns.cjs`, `build-*.cjs`, `validate-*` (`.cjs`/`.ts`), `codegen-schema-types.ts`, `aggregate-agent-metrics.ts`, `lint-agentskills-spec.cjs`, `scripts/e2e/`, `scripts/tests/`.
760
- - **KEPT (runtime subtrees, D-09) a "drop `scripts/` wholesale" allowlist would have shipped a *broken* package:** `scripts/lib/` (incl. `scripts/lib/graph/` for `gdd-graph` per D-14 and `scripts/lib/figma-extract/` for the figma-extract SKILL per D-15), `scripts/mcp-servers/` (the residual MCP deprecation shims), `scripts/cli/` (the `gdd-events` target), and `scripts/install.cjs`.
848
+ - **KEPT (runtime subtrees, D-09) - a "drop `scripts/` wholesale" allowlist would have shipped a *broken* package:** `scripts/lib/` (incl. `scripts/lib/graph/` for `gdd-graph` per D-14 and `scripts/lib/figma-extract/` for the figma-extract SKILL per D-15), `scripts/mcp-servers/` (the residual MCP deprecation shims), `scripts/cli/` (the `gdd-events` target), and `scripts/install.cjs`.
761
849
  - Tarball golden manifest pinned at **620 paths** (paths-only per D-07).
762
- - **`tests/` → `test/suite/` and `test-fixture/` → `test/fixtures/`** (D-12) a pure mechanical, history-preserving relocation done with an identical full-suite pass before/after. Contributor-facing only; not shipped in the tarball. All subsequent tests are authored into `test/suite/`.
850
+ - **`tests/` → `test/suite/` and `test-fixture/` → `test/fixtures/`** (D-12) - a pure mechanical, history-preserving relocation done with an identical full-suite pass before/after. Contributor-facing only; not shipped in the tarball. All subsequent tests are authored into `test/suite/`.
763
851
 
764
852
  ### Deprecated
765
853
 
@@ -767,52 +855,52 @@ One audit-clean repo layout with **zero changes to the public surface** (command
767
855
 
768
856
  ### Backward compatibility
769
857
 
770
- - Public surface unchanged no command, agent, skill, hook, or connection was renamed (zero-rename discipline). All install flows and all 6 bins resolve identically; MCP handshakes and primitive imports verified by the headless pack→install→run E2E.
858
+ - Public surface unchanged - no command, agent, skill, hook, or connection was renamed (zero-rename discipline). All install flows and all 6 bins resolve identically; MCP handshakes and primitive imports verified by the headless pack→install→run E2E.
771
859
  - 6-manifest lockstep at v1.31.5 (`package.json` + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`).
772
860
 
773
861
  ### Decisions
774
862
 
775
- - **D-01**: Target version is **v1.31.5** (the stale ROADMAP v1.28.0 was a pre-renumber artifact the phase was renumbered 2026-05-16 to monotonic-with-phase-number).
863
+ - **D-01**: Target version is **v1.31.5** (the stale ROADMAP v1.28.0 was a pre-renumber artifact - the phase was renumbered 2026-05-16 to monotonic-with-phase-number).
776
864
  - **D-02**: Deprecation-shim removal target is **v1.33.0** (the stale ROADMAP v1.29.0 is already shipped/past). One-minor grace window.
777
865
  - **D-03**: The private-file leak was already remediated on main; Plan 01 ships only the CI guard.
778
- - **D-08**: `gdd-mcp` (Phase 27.7) folded in for full symmetry with `gdd-state-mcp` both MCP servers live under `sdk/mcp/`.
866
+ - **D-08**: `gdd-mcp` (Phase 27.7) folded in for full symmetry with `gdd-state-mcp` - both MCP servers live under `sdk/mcp/`.
779
867
  - **D-09**: The `files` allowlist keeps the runtime subtrees `scripts/lib` + `scripts/mcp-servers` + `scripts/cli` + `scripts/install.cjs` so `gdd-graph`, `figma-extract`, and `gdd-mcp` keep working.
780
868
 
781
869
  ---
782
870
 
783
871
  ## [1.31.0] - 2026-05-29
784
872
 
785
- ### Phase 31 Figma Off-Context Extractor + Variables Sync Plugin
873
+ ### Phase 31 - Figma Off-Context Extractor + Variables Sync Plugin
786
874
 
787
- Ships `gdd-figma-extract` pull a whole Figma design system into a compact, queryable local digest (`DESIGN.md` + `tokens.json` + `components.json`) **without the raw JSON ever entering Claude's context**. One command extracts the file via the Figma REST API to a local raw cache; a separate digest stage reduces it to an LLM-readable spec. Plus a thin **"GDD Sync"** Figma plugin that fills the Variables-API-Enterprise gap by reading `figma.variables` from inside Figma (works on any plan including Free) and POSTing them to an ephemeral localhost receiver. 10 plans across 4 waves: Wave A (raw puller + digest + styles resolver + SKILL), Wave B (plugin scaffold + export + receiver), Wave C (`--component` slice + `figma_extract` health check), Wave D (closeout).
875
+ Ships `gdd-figma-extract` - pull a whole Figma design system into a compact, queryable local digest (`DESIGN.md` + `tokens.json` + `components.json`) **without the raw JSON ever entering Claude's context**. One command extracts the file via the Figma REST API to a local raw cache; a separate digest stage reduces it to an LLM-readable spec. Plus a thin **"GDD Sync"** Figma plugin that fills the Variables-API-Enterprise gap by reading `figma.variables` from inside Figma (works on any plan - including Free) and POSTing them to an ephemeral localhost receiver. 10 plans across 4 waves: Wave A (raw puller + digest + styles resolver + SKILL), Wave B (plugin scaffold + export + receiver), Wave C (`--component` slice + `figma_extract` health check), Wave D (closeout).
788
876
 
789
- ### Motivation the spike trail
877
+ ### Motivation - the spike trail
790
878
 
791
879
  Spike 001 (commit `c3a9cf6`, `.planning/spikes/001-figma-offcontext-extractor/`) validated the economics: **898× compression** (223 MB raw → 254 KB digest), a 15.7K-token DESIGN.md (under the 20K target), 127 component sets + 40 singletons captured with variants/props/defaults, ~33s wall time, and crucially **0 Claude tokens + 0 Figma MCP calls during extraction**. This is the economic alternative to Figma MCP for whole-design-system workflows (Figma MCP remains correct for spot questions on individual components). The spike surfaced two gaps, both closed by this phase:
792
880
 
793
- 1. **Variables API → 403 (Enterprise-only)** closed by **Path C** (the GDD Sync plugin reads variables locally and POSTs to the receiver).
794
- 2. **Legacy styles → 0 tokens** closed by **Path B** (two-step `/styles` + `/nodes?ids=` lookup; published-style source nodes live in canvas frames, not the main document tree).
881
+ 1. **Variables API → 403 (Enterprise-only)** - closed by **Path C** (the GDD Sync plugin reads variables locally and POSTs to the receiver).
882
+ 2. **Legacy styles → 0 tokens** - closed by **Path B** (two-step `/styles` + `/nodes?ids=` lookup; published-style source nodes live in canvas frames, not the main document tree).
795
883
 
796
884
  ### Added
797
885
 
798
- - **`gdd-figma-extract` off-context extractor** the two-stage pipeline (D-01: extract → digest stay separated, re-digest without re-pulling):
799
- - `scripts/lib/figma-extract/pull.cjs` productionized Figma REST puller (retry/backoff, version-based cache invalidation with 1h TTL fallback per D-11, drops `geometry=paths` per D-03). Writes raw JSON to disk only; raw bodies never returned to a logging caller.
800
- - `scripts/lib/figma-extract/digest.cjs` reads the raw cache, walks the node tree with **variant rollup** (D-02 naive walk inflates ~16×), assembles tokens via the 3-path chain, renders `DESIGN.md` + `tokens.json` + `components.json`.
801
- - `scripts/lib/figma-extract/styles-resolver.cjs` **Path B** two-step `/styles` + `/nodes?ids=` resolver (fixes the spike's 0-tokens bug).
802
- - `scripts/lib/figma-extract/render-md.cjs` + `walk.cjs` deterministic, byte-stable DESIGN.md renderer + the variant-rollup walker.
803
- - **Three-path token extraction (D-04)** with a fallback chain Path A (Variables API, Enterprise; 403 skipped silently), Path B (`/styles` + `/nodes`), Path C (plugin sync). Resolution priority on collision: Variables > plugin sync > styles, with a `--prefer-styles` escape hatch.
804
- - **"GDD Sync" Figma plugin** (`figma-plugin/`, D-05) TypeScript, single "Export to GDD" button. Reads ALL local variables (D-13 digest filters later), resolves aliases + modes, and POSTs to the localhost receiver.
805
- - **Localhost receiver** (`scripts/lib/figma-extract/receiver.cjs`, D-06) ephemeral, **127.0.0.1-only**, port hardcoded to 5179, schema-validated, refuses non-loopback remotes, exits on first valid receipt or timeout.
806
- - **`--component <name|glob>` digest slice** (D-08) a ~500-token per-component slice instead of the full ~16K digest; strictly additive (omitting it reproduces the full digest unchanged).
807
- - **`figma_extract` health check** (Plan 31-09) `/gdd:health` now reports one of three exact states: `figma extract: ready (token set)`, `figma extract: token missing`, or `figma extract: plugin sync needed for variables (Free tier detected)`. Presence-only token check (D-10); the Free-tier signal is read from the local raw-pull cache only (no network call).
808
- - **`skills/figma-extract/SKILL.md`** (`name: gdd-figma-extract`) off-context orchestration that never instructs reading `raw/*.json` (D-12).
886
+ - **`gdd-figma-extract` off-context extractor** - the two-stage pipeline (D-01: extract → digest stay separated, re-digest without re-pulling):
887
+ - `scripts/lib/figma-extract/pull.cjs` - productionized Figma REST puller (retry/backoff, version-based cache invalidation with 1h TTL fallback per D-11, drops `geometry=paths` per D-03). Writes raw JSON to disk only; raw bodies never returned to a logging caller.
888
+ - `scripts/lib/figma-extract/digest.cjs` - reads the raw cache, walks the node tree with **variant rollup** (D-02 - naive walk inflates ~16×), assembles tokens via the 3-path chain, renders `DESIGN.md` + `tokens.json` + `components.json`.
889
+ - `scripts/lib/figma-extract/styles-resolver.cjs` - **Path B** two-step `/styles` + `/nodes?ids=` resolver (fixes the spike's 0-tokens bug).
890
+ - `scripts/lib/figma-extract/render-md.cjs` + `walk.cjs` - deterministic, byte-stable DESIGN.md renderer + the variant-rollup walker.
891
+ - **Three-path token extraction (D-04)** with a fallback chain - Path A (Variables API, Enterprise; 403 skipped silently), Path B (`/styles` + `/nodes`), Path C (plugin sync). Resolution priority on collision: Variables > plugin sync > styles, with a `--prefer-styles` escape hatch.
892
+ - **"GDD Sync" Figma plugin** (`figma-plugin/`, D-05) - TypeScript, single "Export to GDD" button. Reads ALL local variables (D-13 - digest filters later), resolves aliases + modes, and POSTs to the localhost receiver.
893
+ - **Localhost receiver** (`scripts/lib/figma-extract/receiver.cjs`, D-06) - ephemeral, **127.0.0.1-only**, port hardcoded to 5179, schema-validated, refuses non-loopback remotes, exits on first valid receipt or timeout.
894
+ - **`--component <name|glob>` digest slice** (D-08) - a ~500-token per-component slice instead of the full ~16K digest; strictly additive (omitting it reproduces the full digest unchanged).
895
+ - **`figma_extract` health check** (Plan 31-09) - `/gdd:health` now reports one of three exact states: `figma extract: ready (token set)`, `figma extract: token missing`, or `figma extract: plugin sync needed for variables (Free tier detected)`. Presence-only token check (D-10); the Free-tier signal is read from the local raw-pull cache only (no network call).
896
+ - **`skills/figma-extract/SKILL.md`** (`name: gdd-figma-extract`) - off-context orchestration that never instructs reading `raw/*.json` (D-12).
809
897
  - **`tests/phase-31-baseline.test.cjs`** + 6 baseline files at `test-fixture/baselines/phase-31/` (design-md, components-json, tokens-json, health-line, manifest-network-scope, token-isolation-static), **`tests/phase-31-end-to-end.test.cjs`** (offline pull+digest against fixtures), and **`tests/figma-extract-token-isolation.test.cjs`** (the D-10 static scanner + meta-tests).
810
898
 
811
899
  ### Security & guarantees
812
900
 
813
- - **Off-context guarantee (D-12) statically enforced.** The SKILL never instructs reading `raw/*.json`; the digest is a pure function of the raw cache. The raw pull consumes 0 Claude tokens.
814
- - **Token isolation (D-10) statically enforced.** `FIGMA_TOKEN` (fallback `FIGMA_PERSONAL_ACCESS_TOKEN`) is read from the environment only and is sent ONLY as the `X-Figma-Token` request header never logged, never written to disk. `tests/figma-extract-token-isolation.test.cjs` scans every file under `scripts/lib/figma-extract/` for any `writeFile`/`appendFile`/`console.*`/`logger.*`/`process.std*.write` call referencing the token and fails on a non-zero count (meta-tested to prove the scanner is not vacuous).
815
- - **Receiver network scope (D-06).** The plugin manifest's `allowedDomains` is exactly the localhost pair (`http://localhost:5179`, `http://127.0.0.1:5179`) any widening trips the baseline test. No external host, no wildcard.
901
+ - **Off-context guarantee (D-12) - statically enforced.** The SKILL never instructs reading `raw/*.json`; the digest is a pure function of the raw cache. The raw pull consumes 0 Claude tokens.
902
+ - **Token isolation (D-10) - statically enforced.** `FIGMA_TOKEN` (fallback `FIGMA_PERSONAL_ACCESS_TOKEN`) is read from the environment only and is sent ONLY as the `X-Figma-Token` request header - never logged, never written to disk. `tests/figma-extract-token-isolation.test.cjs` scans every file under `scripts/lib/figma-extract/` for any `writeFile`/`appendFile`/`console.*`/`logger.*`/`process.std*.write` call referencing the token and fails on a non-zero count (meta-tested to prove the scanner is not vacuous).
903
+ - **Receiver network scope (D-06).** The plugin manifest's `allowedDomains` is exactly the localhost pair (`http://localhost:5179`, `http://127.0.0.1:5179`) - any widening trips the baseline test. No external host, no wildcard.
816
904
 
817
905
  ### Deferred
818
906
 
@@ -821,41 +909,41 @@ Spike 001 (commit `c3a9cf6`, `.planning/spikes/001-figma-offcontext-extractor/`)
821
909
  ### Decisions (D-01 through D-13)
822
910
 
823
911
  - **D-01**: Two-stage pipeline (extract → digest) stays separated. Re-run digest without re-pulling.
824
- - **D-02**: Variant rollup default-on skip COMPONENT children of a COMPONENT_SET; record variants as a field on the parent (naive walk inflates ~16×).
912
+ - **D-02**: Variant rollup default-on - skip COMPONENT children of a COMPONENT_SET; record variants as a field on the parent (naive walk inflates ~16×).
825
913
  - **D-03**: Drop the `geometry=paths` query param (~30% smaller raw; geometry is discarded in the digest).
826
914
  - **D-04**: Three-path token extraction with a fallback chain (Variables > plugin sync > styles; `--prefer-styles` escape).
827
915
  - **D-05**: "GDD Sync" plugin as a separate `figma-plugin/` package (TypeScript, single button).
828
916
  - **D-06**: Receiver is ephemeral + 127.0.0.1-only + hardcoded port 5179; refuses non-loopback; closes on receipt or timeout.
829
- - **D-07**: Plugin distribution is dev-build now, Community submission as a follow-up; live-Figma validation is a maintainer follow-up neither blocks v1.31.0.
917
+ - **D-07**: Plugin distribution is dev-build now, Community submission as a follow-up; live-Figma validation is a maintainer follow-up - neither blocks v1.31.0.
830
918
  - **D-08**: `--component <name|glob>` filter on digest for per-component slicing (~500 tokens vs ~16K).
831
919
  - **D-09**: Raw cache gitignored (`.figma-extract-cache/`), reproducible from `pull.cjs`; `digest/` artifacts may be committed.
832
- - **D-10**: Token never logged or persisted `FIGMA_TOKEN` from env only; CI static-analysis test enforces it library-wide.
920
+ - **D-10**: Token never logged or persisted - `FIGMA_TOKEN` from env only; CI static-analysis test enforces it library-wide.
833
921
  - **D-11**: Cache invalidation is content-based via Figma's `version` field, with a 1h wall-clock TTL fallback.
834
- - **D-12**: Off-context guarantee enforced statically the skill never instructs reading `raw/*.json`.
922
+ - **D-12**: Off-context guarantee enforced statically - the skill never instructs reading `raw/*.json`.
835
923
  - **D-13**: Plugin emits ALL local variables (not just published-collection ones); filtering happens at the digest stage.
836
924
 
837
925
  ### Backward compatibility
838
926
 
839
927
  - 4-manifest + 2 Tier-2 manifest lockstep at v1.31.0 (`package.json` + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`). Keywords `figma`, `extractor`, `design-system-sync` added across the manifest keyword arrays.
840
- - `NOTICE` preserved verbatim Phase 31 productionizes our own spike (`c3a9cf6`) and uses Figma's official REST + plugin APIs plus `@figma/plugin-typings` (a normal npm devDependency, not a vendored code transplant). No third-party CODE was vendored, so no new attribution is owed.
928
+ - `NOTICE` preserved verbatim - Phase 31 productionizes our own spike (`c3a9cf6`) and uses Figma's official REST + plugin APIs plus `@figma/plugin-typings` (a normal npm devDependency, not a vendored code transplant). No third-party CODE was vendored, so no new attribution is owed.
841
929
 
842
930
  ---
843
931
 
844
932
  ## [1.30.6] - 2026-05-28
845
933
 
846
- ### Phase 30.6 Graphify Self-Ownership
934
+ ### Phase 30.6 - Graphify Self-Ownership
847
935
 
848
936
  Removes the **last runtime touchpoint** between get-design-done and the user's `~/.claude/get-shit-done/` install. 8 callsites in `agents/`, `skills/`, and `connections/` previously dispatched the upstream `gsd-tools` graphify subcommands at runtime; they now dispatch native `bin/gdd-graph`. After v1.30.6, a user who has never installed GSD (or who only installs the failed upstream and not the redux fork) can still run the full GDD pipeline including everything that touches the knowledge graph. 9 plans across 3 waves: Wave A (research + spec), Wave B (`bin/gdd-graph` core + extensions + decoupling acceptance test, 56 tests), Wave C (migration + rename + cleanup + closeout).
849
937
 
850
- ### Motivation rug-pull resilience
938
+ ### Motivation - rug-pull resilience
851
939
 
852
- The `gsd-build/get-shit-done` rug-pull in May 2026 (TÂCHES drained $GSD Solana token + deleted accounts) was downstream-survivable for us we have zero npm dependency on GSD packages, the community fork `open-gsd/get-shit-done-redux` is MIT-bit-perfect, and Phase 28.7's install-pipeline port is standalone in our tree. The remaining touchpoint was graphify runtime dispatch. Phase 30.6 closes it. After v1.30.6, our runtime is independent of upstream's release cadence and any future subcommand / schema drift.
940
+ The `gsd-build/get-shit-done` rug-pull in May 2026 (TÂCHES drained $GSD Solana token + deleted accounts) was downstream-survivable for us - we have zero npm dependency on GSD packages, the community fork `open-gsd/get-shit-done-redux` is MIT-bit-perfect, and Phase 28.7's install-pipeline port is standalone in our tree. The remaining touchpoint was graphify runtime dispatch. Phase 30.6 closes it. After v1.30.6, our runtime is independent of upstream's release cadence and any future subcommand / schema drift.
853
941
 
854
942
  ### Added
855
943
 
856
944
  - **`bin/gdd-graph`** native Node CLI with 6 subcommands: `build`, `query`, `status`, `diff`, `upsert-node`, `upsert-edge`. Output at `.design/graph/graph.json` (D-02), Ajv-validated against `scripts/lib/graph/schema.json` schema 1.0 (D-03), atomic-write seam per D-05 (tmp + rename in same dir; no `proper-lockfile`).
857
945
  - **Token-budget heuristic** for `gdd-graph query --budget N` per D-04: `Math.ceil(JSON.stringify(payload).length / 4)`; override via `GDD_GRAPH_TOKEN_FACTOR` env for tests.
858
- - **5-scenario decoupling test** at `tests/graph-decoupled.test.cjs` (19 tests) renames `~/.claude/get-shit-done/` to `.bak` for test duration, exercises all 6 subcommands across 5 fixture scenarios (empty / single-node / dense / with-cycles / malformed-intel). Single most important acceptance gate of the phase.
946
+ - **5-scenario decoupling test** at `tests/graph-decoupled.test.cjs` (19 tests) - renames `~/.claude/get-shit-done/` to `.bak` for test duration, exercises all 6 subcommands across 5 fixture scenarios (empty / single-node / dense / with-cycles / malformed-intel). Single most important acceptance gate of the phase.
859
947
  - **`tests/phase-30.6-baseline.test.cjs`** + 5 baseline files at `test-fixture/baselines/phase-30.6/` (manifests-version, decoupling-callsite-count, gdd-graph-subcommand-inventory, graph-schema-shape, no-gsd-runtime-touch).
860
948
  - **D-01 through D-10** locked decisions + 5 sub-decisions (D-03.a/b/c, D-04.a, D-09.a) documented in `.planning/phases/30.6-graphify-self-ownership/`.
861
949
 
@@ -870,24 +958,24 @@ The `gsd-build/get-shit-done` rug-pull in May 2026 (TÂCHES drained $GSD Solana
870
958
  - `skills/connections/connections-onboarding.md`
871
959
  - `connections/connections.md`
872
960
  - `connections/graphify.md` (rewritten for native CLI, no external graphifyy)
873
- - **`agents/gdd-graphify-sync.md`** renamed to **`agents/gdd-graph-refresh.md`** (D-08 one-way rename, no alias) protocol simplified now that we own both ends of the intel→graph translation (single schema; no translation step).
961
+ - **`agents/gdd-graphify-sync.md`** renamed to **`agents/gdd-graph-refresh.md`** (D-08 one-way rename, no alias) - protocol simplified now that we own both ends of the intel→graph translation (single schema; no translation step).
874
962
  - **`scripts/lib/gsd-health-mirror/`** renamed to **`scripts/lib/health-mirror/`** (D-10 cosmetic, atomic with single import-site update at `scripts/mcp-servers/gdd-mcp/tools/gdd_health.ts`). The module is pure local-file inspection; the "mirror" refers to our own `skills/health/SKILL.md` surface, never upstream.
875
- - **`.design/graph/`** replaces upstream's `.planning/graphs/` location (per D-02 aligns with the rest of GDD's `.design/` artifact convention).
963
+ - **`.design/graph/`** replaces upstream's `.planning/graphs/` location (per D-02 - aligns with the rest of GDD's `.design/` artifact convention).
876
964
  - **`connections/graphify.md`** rewritten for native CLI (no external `graphifyy` dependency).
877
965
  - **`reference/start-interview.md`** updated to reference `/gdd:discuss` (our equivalent) instead of `/gsd-discuss-phase`.
878
- - **`README.md`** at the `gsd-build/get-shit-done (MIT — see NOTICE)` citation gains the redux-pointer parenthetical "(now archived; community continuation at `open-gsd/get-shit-done-redux`)". Citation preserved verbatim only annotated for reader clarity.
966
+ - **`README.md`** at the `gsd-build/get-shit-done (MIT — see NOTICE)` citation gains the redux-pointer parenthetical "(now archived; community continuation at `open-gsd/get-shit-done-redux`)". Citation preserved verbatim - only annotated for reader clarity.
879
967
  - **Graphify enable/disable state** (D-09) lives in `.design/config.json` at `{ "graphify": { "enabled": bool } }`. Read directly by `gdd-graph` via fs; no `config-set` / `config-get` CLI subcommand.
880
968
 
881
969
  ### Removed
882
970
 
883
- - **Runtime dispatch into `~/.claude/get-shit-done/`** 8 callsites no longer invoke `gsd-tools.cjs graphify *`.
884
- - **`.planning/get-shit-done-main/`** (10MB pre-rug-pull vendored snapshot) used during Phase 28.7's architectural port; port shipped, snapshot dead weight.
971
+ - **Runtime dispatch into `~/.claude/get-shit-done/`** - 8 callsites no longer invoke `gsd-tools.cjs graphify *`.
972
+ - **`.planning/get-shit-done-main/`** (10MB pre-rug-pull vendored snapshot) - used during Phase 28.7's architectural port; port shipped, snapshot dead weight.
885
973
  - Intel→graphify translation layer (dead code post-migration; intel slices are now the canonical input to `bin/gdd-graph build` with no intermediate translation step).
886
974
 
887
975
  ### Backward compatibility
888
976
 
889
- - Phase 27 / Phase 28.5 / Phase 28.7 `NOTICE` attribution subsections **preserved verbatim** per D-06. Those describe historical MIT/Apache ports (peer-CLI delegation protocol shapes from cc-multi-cli; skill-authoring contract from mattpocock/skills; install-pipeline architecture from gsd-build/get-shit-done) they remain in our tree under the original MIT/Apache terms. Phase 30.6 removes a **runtime touchpoint**, not a **historical port**.
890
- - `.design/intel/` schema unchanged Phase 10's knowledge layer keeps its current ownership; we only consume from it differently.
977
+ - Phase 27 / Phase 28.5 / Phase 28.7 `NOTICE` attribution subsections **preserved verbatim** per D-06. Those describe historical MIT/Apache ports (peer-CLI delegation protocol shapes from cc-multi-cli; skill-authoring contract from mattpocock/skills; install-pipeline architecture from gsd-build/get-shit-done) - they remain in our tree under the original MIT/Apache terms. Phase 30.6 removes a **runtime touchpoint**, not a **historical port**.
978
+ - `.design/intel/` schema unchanged - Phase 10's knowledge layer keeps its current ownership; we only consume from it differently.
891
979
  - 4-manifest + 2 Tier-2 manifest lockstep at v1.30.6 (`package.json` + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`).
892
980
 
893
981
  ### Decisions (D-01 through D-10)
@@ -900,7 +988,7 @@ The `gsd-build/get-shit-done` rug-pull in May 2026 (TÂCHES drained $GSD Solana
900
988
  - **D-06**: `NOTICE` retains Phase 27 / Phase 28.5 / Phase 28.7 architectural attributions verbatim. We're removing a runtime touchpoint, not voiding a historical port.
901
989
  - **D-07**: Phase 30.6 ships off-cadence as a decimal from v1.30.5 parent (same shape v1.30.5 used coming off v1.30.0). NO 1.31.x bump.
902
990
  - **D-08**: Agent rename `gdd-graphify-sync` → `gdd-graph-refresh` is one-way (no alias). Internal name; no external callers from outside the plugin.
903
- - **D-09**: Graphify enable/disable state lives in `.design/config.json` at `{ "graphify": { "enabled": bool } }`. Read directly by `gdd-graph` via `JSON.parse(fs.readFileSync(...))` with sensible default (`enabled: false`). No `config-set` / `config-get` CLI subcommand simpler than the upstream config-tool pattern.
991
+ - **D-09**: Graphify enable/disable state lives in `.design/config.json` at `{ "graphify": { "enabled": bool } }`. Read directly by `gdd-graph` via `JSON.parse(fs.readFileSync(...))` with sensible default (`enabled: false`). No `config-set` / `config-get` CLI subcommand - simpler than the upstream config-tool pattern.
904
992
  - **D-10**: `scripts/lib/gsd-health-mirror/` rename is one-way (no alias). Only one import site (`scripts/mcp-servers/gdd-mcp/tools/gdd_health.ts`) which is updated atomically with the rename.
905
993
 
906
994
  ### Attribution preservation
@@ -911,13 +999,13 @@ Phase 27 / Phase 28.5 / Phase 28.7 attribution subsections in `NOTICE` are prese
911
999
 
912
1000
  ## [1.30.5] - 2026-05-21
913
1001
 
914
- ### Phase 30.5 Failure-Mode Catalogue
1002
+ ### Phase 30.5 - Failure-Mode Catalogue
915
1003
 
916
1004
  Decimal sub-phase building on Phase 30's `/gdd:report-issue` triage gate. Expands the known-failure-modes catalogue, adds a deterministic fuzzy matcher, and wires reflector + authority-watcher proposal flows into a 6th `/gdd:apply-reflections` proposal class. 3 plans ship together at v1.30.5 (D-11 ship-together): catalogue expansion (Wave A), fuzzy matcher (Wave A), reflector/authority-watcher wiring + closeout (Wave B).
917
1005
 
918
1006
  ### Added
919
1007
 
920
- - **Failure-mode catalogue expansion** (`reference/known-failure-modes.md`, Plan 30.5-01). Catalogue grows from 10 → 22 entries (KFM-001..KFM-022) covers EACCES, gh-missing, Node mismatch, npm-ci lockfile drift, webpack chunk collisions, esbuild config errors, vite HMR, TS6133 unused locals, and 14 more long-tail failure modes harvested from closed PRs + reflections cycles + public Node/npm/git failure-mode references. Each entry carries the schema-v2 11-field shape (`id`, `pattern`, `diagnosis`, `remedy`, `severity`, `propose_report`, `symptom`, `root_cause`, `fix`, `related_phases`, `first_observed_cycle`); Phase 30's `triage-matcher.cjs` reads only the original 6 fields (D-02 backward-compat).
1008
+ - **Failure-mode catalogue expansion** (`reference/known-failure-modes.md`, Plan 30.5-01). Catalogue grows from 10 → 22 entries (KFM-001..KFM-022) - covers EACCES, gh-missing, Node mismatch, npm-ci lockfile drift, webpack chunk collisions, esbuild config errors, vite HMR, TS6133 unused locals, and 14 more long-tail failure modes harvested from closed PRs + reflections cycles + public Node/npm/git failure-mode references. Each entry carries the schema-v2 11-field shape (`id`, `pattern`, `diagnosis`, `remedy`, `severity`, `propose_report`, `symptom`, `root_cause`, `fix`, `related_phases`, `first_observed_cycle`); Phase 30's `triage-matcher.cjs` reads only the original 6 fields (D-02 backward-compat).
921
1009
  - **Fuzzy failure-mode matcher** (`scripts/lib/failure-mode-matcher.cjs`, Plan 30.5-02). New `match(errorContext, { topN, threshold, cataloguePath })` API returns top-N candidates ranked by cosine similarity over a stop-word-filtered bag-of-words across `symptom + root_cause + un-regexed pattern`. Default `topN=3`, `threshold=0.4`, dominance-collapse delta `0.15`. Pure CommonJS, zero npm dependencies, deterministic (no `Math.random` / `Date.now` / I/O outside catalogue read). Phase 30's exact-match `triage-matcher.cjs` is untouched (D-04 byte-identity guard).
922
1010
  - **Reflector KFM proposer** (`scripts/lib/reflector-kfm-proposer.cjs`, Plan 30.5-03 D-05). When a Phase 29 `capability_gap` cluster recurs ≥3× with no matching catalogue entry (per `failure-mode-matcher.match()`), the proposer drops a pre-filled draft at `.design/reflections/incubator/kfm-<slug>/CATALOGUE-ENTRY.md`. The draft carries all 11 schema-v2 fields; `pattern` + `fix` are `TODO:` placeholders the user fills via the apply-reflections edit action.
923
1011
  - **Authority-watcher `kfm-candidate` event class** (`reference/schemas/events.schema.json` + `scripts/lib/authority-watcher/index.cjs`, Plan 30.5-03 D-06). New additive `allOf[1]` branch on the events schema; new 7-field `KfmCandidatePayload` definition. When the authority-watcher pipeline encounters an article whose title matches `/common errors|failure modes|troubleshooting|known issues|pitfalls/i`, it emits a `kfm-candidate` event that the reflector consumes into the SAME incubator draft surface as `capability_gap` clusters (one unified user-review path).
@@ -926,19 +1014,19 @@ Decimal sub-phase building on Phase 30's `/gdd:report-issue` triage gate. Expand
926
1014
 
927
1015
  ### Changed
928
1016
 
929
- - **Reflector capability-gap aggregator** (`scripts/lib/reflector-capability-gap-aggregator.cjs`) adds lazy-loaded `proposeKfmDraftsForClusters(clusters, options)` export that invokes the KFM proposer as an additional pass after Phase 29 aggregation. Phase 29's existing 5 proposal classes are untouched (additive).
930
- - **Authority-watcher agent prompt** (`agents/design-authority-watcher.md`) gains a new `Step 7.5 — Emit kfm-candidate events` section documenting the whitelist patterns + payload shape. Phase 13.2's existing fetch/diff/classify/write loop is unchanged.
931
- - **OFF_CADENCE_VERSIONS** (`tests/semver-compare.test.cjs`) registers `'1.30.5'` per Phase 29/30 precedent.
1017
+ - **Reflector capability-gap aggregator** (`scripts/lib/reflector-capability-gap-aggregator.cjs`) - adds lazy-loaded `proposeKfmDraftsForClusters(clusters, options)` export that invokes the KFM proposer as an additional pass after Phase 29 aggregation. Phase 29's existing 5 proposal classes are untouched (additive).
1018
+ - **Authority-watcher agent prompt** (`agents/design-authority-watcher.md`) - gains a new `Step 7.5 — Emit kfm-candidate events` section documenting the whitelist patterns + payload shape. Phase 13.2's existing fetch/diff/classify/write loop is unchanged.
1019
+ - **OFF_CADENCE_VERSIONS** (`tests/semver-compare.test.cjs`) - registers `'1.30.5'` per Phase 29/30 precedent.
932
1020
 
933
1021
  ### Documentation
934
1022
 
935
- - `CHANGELOG.md` this entry (v1.30.5).
936
- - `README.md` + 6 translated READMEs (de/fr/it/ja/ko/zh-CN) single-paragraph mention of v1.30.5's catalogue expansion + fuzzy matcher.
937
- - `reference/known-failure-modes.md` schema-v2 header documenting the 11-field shape (Plan 30.5-01).
1023
+ - `CHANGELOG.md` - this entry (v1.30.5).
1024
+ - `README.md` + 6 translated READMEs (de/fr/it/ja/ko/zh-CN) - single-paragraph mention of v1.30.5's catalogue expansion + fuzzy matcher.
1025
+ - `reference/known-failure-modes.md` - schema-v2 header documenting the 11-field shape (Plan 30.5-01).
938
1026
 
939
1027
  ### Privacy & Safety
940
1028
 
941
- - **No auto-promotion.** The reflector KFM proposer is strictly proposal-only (Phase 11 SC-8). Drafts live in `.design/reflections/incubator/` until the user accepts them via `/gdd:apply-reflections`. The canonical catalogue feeds Phase 30's pre-consent triage gate, so a bad entry could mute legitimate issue reports the user-review gate is non-negotiable (D-05).
1029
+ - **No auto-promotion.** The reflector KFM proposer is strictly proposal-only (Phase 11 SC-8). Drafts live in `.design/reflections/incubator/` until the user accepts them via `/gdd:apply-reflections`. The canonical catalogue feeds Phase 30's pre-consent triage gate, so a bad entry could mute legitimate issue reports - the user-review gate is non-negotiable (D-05).
942
1030
  - **`kfm-candidate` events are local-only.** No new network surfaces. The authority-watcher's existing whitelist (`reference/authority-feeds.md`) is the sole ingress for `kfm-candidate` events; nothing the reflector emits travels off-machine.
943
1031
  - **`raw_excerpt` cap.** Authority-derived excerpts are truncated to 500 chars before draft write (schema-enforced).
944
1032
 
@@ -946,24 +1034,24 @@ Decimal sub-phase building on Phase 30's `/gdd:report-issue` triage gate. Expand
946
1034
 
947
1035
  ## [1.30.0] - 2026-05-20
948
1036
 
949
- ### Phase 30 Consent-First GitHub Issue Reporter
1037
+ ### Phase 30 - Consent-First GitHub Issue Reporter
950
1038
 
951
- Opt-in user feedback channel that pseudonymizes payloads before submission (NOT anonymization see disclosure below). Local-first, consent-gated, no auto-mode. Destination repo is hardcoded. 8 plans across Wave A primitives (30-01..30-03) / Wave B integration (30-04..30-06) / Wave C closeout (30-07..30-08). 6-manifest lockstep at 1.30.0 (D-12 ship-together on-cadence minor from 1.29.0).
1039
+ Opt-in user feedback channel that pseudonymizes payloads before submission (NOT anonymization - see disclosure below). Local-first, consent-gated, no auto-mode. Destination repo is hardcoded. 8 plans across Wave A primitives (30-01..30-03) / Wave B integration (30-04..30-06) / Wave C closeout (30-07..30-08). 6-manifest lockstep at 1.30.0 (D-12 ship-together on-cadence minor from 1.29.0).
952
1040
 
953
1041
  ### Added
954
1042
 
955
1043
  - **Consent-First GitHub Issue Reporter.** Phase 30 ships these surfaces:
956
- - **`/gdd:report-issue` skill** (`skills/report-issue/SKILL.md`, from 30-04) Phase 28.5 compliant (≤100 lines). Walks the user through a consented submission: kill-switch check → triage against known failure modes → dedup against existing issues → assemble pseudonymized payload → draft to disk + open `$EDITOR` → consent prompt → submit via `gh` CLI.
957
- - **`scripts/lib/pseudonymize.cjs`** (from 30-01) 8 pseudonymization rules (R1..R8) covering git identity, absolute paths (Linux/macOS/Windows shapes), hostname, repo origin, env-var values, emails in logs, IPv4/IPv6 addresses, and stable per-user pseudonyms. Pure module: no `fs`, no `child_process`, no env mutation, no network.
958
- - **`scripts/lib/issue-reporter/payload-assembly.cjs`** (from 30-02) composes the final issue payload (title, body, fingerprint, bilingual disclaimer) from pseudonymized inputs. Two-layer scrub: Phase 22 `redact.cjs` then Phase 30 `pseudonymize.cjs` (order non-negotiable). Pure module: returns a string, no I/O.
959
- - **`scripts/lib/issue-reporter/destination.cjs`** (from 30-04) hardcoded `https://github.com/hegemonart/get-design-done` constant. SOLE FILE under the issue-reporter tree allowed to contain the destination URL literal. Frozen export.
960
- - **Triage matcher** (`scripts/lib/issue-reporter/triage-matcher.cjs`, from 30-03) pattern-matches the user's error against `reference/known-failure-modes.md`. On match: surfaces the remedy and stops; user can override with `--force-report`.
961
- - **Dedup matcher** (`scripts/lib/issue-reporter/dedup.cjs`, from 30-05) queries `gh issue list` against the destination repo and surfaces existing-issue matches before submission. Match outcomes: no-match → proceed; single-match → react with +1 + offer "me too" comment; multi-match → user picks. Wired into the report-flow BEFORE the consent prompt.
962
- - **Kill-switch** (`scripts/lib/issue-reporter/kill-switch.cjs`, from 30-06) env-var override (`GDD_DISABLE_ISSUE_REPORTER=1`) OR config-file override (`.design/config.json` with `{ "issue_reporter": false }`). Either disables the reporter; env wins when both set. Halts submission before any network call. `gsd-health` mirrors the same disable line.
963
- - **`gh`-absent fallback** (`scripts/lib/issue-reporter/gh-absent-fallback.cjs`, from 30-06) when GitHub CLI isn't installed, the assembled payload is written to disk under `.design/issue-drafts/` and the issue-template URL is copied to the platform-appropriate clipboard (xclip / pbcopy / clip).
964
- - **Privacy-diff renderer** (`scripts/lib/issue-reporter/privacy-diff.cjs`, from 30-07) renders the before/after pseudonymization diff at consent time and via `/gdd:update --show-privacy-diff`.
965
- - **Network-isolation CI gate** (`tests/issue-reporter-network-isolation.test.cjs`, from 30-07) static-analysis test asserts no `https://` / `fetch(` / `XMLHttpRequest` references exist anywhere under `scripts/lib/issue-reporter/` or `scripts/lib/pseudonymize.cjs` except the single destination URL constant in `destination.cjs`. Whitelisted via explicit allowlist.
966
- - **`reference/pseudonymization-rules.md`** + **`reference/known-failure-modes.md`** (from 30-01 / 30-03) registered in `registry.json`. User-facing docs explaining the 8-rule pseudonymization catalog and the known failure modes / anti-patterns the reporter detects.
1044
+ - **`/gdd:report-issue` skill** (`skills/report-issue/SKILL.md`, from 30-04) - Phase 28.5 compliant (≤100 lines). Walks the user through a consented submission: kill-switch check → triage against known failure modes → dedup against existing issues → assemble pseudonymized payload → draft to disk + open `$EDITOR` → consent prompt → submit via `gh` CLI.
1045
+ - **`scripts/lib/pseudonymize.cjs`** (from 30-01) - 8 pseudonymization rules (R1..R8) covering git identity, absolute paths (Linux/macOS/Windows shapes), hostname, repo origin, env-var values, emails in logs, IPv4/IPv6 addresses, and stable per-user pseudonyms. Pure module: no `fs`, no `child_process`, no env mutation, no network.
1046
+ - **`scripts/lib/issue-reporter/payload-assembly.cjs`** (from 30-02) - composes the final issue payload (title, body, fingerprint, bilingual disclaimer) from pseudonymized inputs. Two-layer scrub: Phase 22 `redact.cjs` then Phase 30 `pseudonymize.cjs` (order non-negotiable). Pure module: returns a string, no I/O.
1047
+ - **`scripts/lib/issue-reporter/destination.cjs`** (from 30-04) - hardcoded `https://github.com/hegemonart/get-design-done` constant. SOLE FILE under the issue-reporter tree allowed to contain the destination URL literal. Frozen export.
1048
+ - **Triage matcher** (`scripts/lib/issue-reporter/triage-matcher.cjs`, from 30-03) - pattern-matches the user's error against `reference/known-failure-modes.md`. On match: surfaces the remedy and stops; user can override with `--force-report`.
1049
+ - **Dedup matcher** (`scripts/lib/issue-reporter/dedup.cjs`, from 30-05) - queries `gh issue list` against the destination repo and surfaces existing-issue matches before submission. Match outcomes: no-match → proceed; single-match → react with +1 + offer "me too" comment; multi-match → user picks. Wired into the report-flow BEFORE the consent prompt.
1050
+ - **Kill-switch** (`scripts/lib/issue-reporter/kill-switch.cjs`, from 30-06) - env-var override (`GDD_DISABLE_ISSUE_REPORTER=1`) OR config-file override (`.design/config.json` with `{ "issue_reporter": false }`). Either disables the reporter; env wins when both set. Halts submission before any network call. `gsd-health` mirrors the same disable line.
1051
+ - **`gh`-absent fallback** (`scripts/lib/issue-reporter/gh-absent-fallback.cjs`, from 30-06) - when GitHub CLI isn't installed, the assembled payload is written to disk under `.design/issue-drafts/` and the issue-template URL is copied to the platform-appropriate clipboard (xclip / pbcopy / clip).
1052
+ - **Privacy-diff renderer** (`scripts/lib/issue-reporter/privacy-diff.cjs`, from 30-07) - renders the before/after pseudonymization diff at consent time and via `/gdd:update --show-privacy-diff`.
1053
+ - **Network-isolation CI gate** (`tests/issue-reporter-network-isolation.test.cjs`, from 30-07) - static-analysis test asserts no `https://` / `fetch(` / `XMLHttpRequest` references exist anywhere under `scripts/lib/issue-reporter/` or `scripts/lib/pseudonymize.cjs` except the single destination URL constant in `destination.cjs`. Whitelisted via explicit allowlist.
1054
+ - **`reference/pseudonymization-rules.md`** + **`reference/known-failure-modes.md`** (from 30-01 / 30-03) - registered in `registry.json`. User-facing docs explaining the 8-rule pseudonymization catalog and the known failure modes / anti-patterns the reporter detects.
967
1055
 
968
1056
  ### Changed
969
1057
 
@@ -971,49 +1059,49 @@ Opt-in user feedback channel that pseudonymizes payloads before submission (NOT
971
1059
 
972
1060
  ### Documentation
973
1061
 
974
- - `reference/pseudonymization-rules.md` + `reference/known-failure-modes.md` added + registered in `reference/registry.json` (2 new entries).
1062
+ - `reference/pseudonymization-rules.md` + `reference/known-failure-modes.md` - added + registered in `reference/registry.json` (2 new entries).
975
1063
  - `README.md` + 6 translated READMEs (de/fr/it/ja/ko/zh-CN) updated with a "Feedback Channel (v1.30.0+)" section disclosing the `/gdd:report-issue` command and the pseudonymization-NOT-anonymization stance.
976
- - `NOTICE` Phase 30 section noting the consent-first reporter discipline (added in 30-07).
1064
+ - `NOTICE` - Phase 30 section noting the consent-first reporter discipline (added in 30-07).
977
1065
 
978
1066
  ### Privacy & Safety
979
1067
 
980
1068
  - **Pseudonymization, not anonymization.** Payloads obscure direct identifiers (username, hostname, absolute paths, git identity, env-var values, emails, IPs) but preserve internal correlation so maintainers can debug. Side-channel data (writing style, code patterns, repo fingerprints) may still re-identify. Users see a full payload preview before submission and explicitly consent per-issue.
981
1069
  - **Kill-switch.** Env-var (`GDD_DISABLE_ISSUE_REPORTER=1`) or config-file (`.design/config.json` `{ "issue_reporter": false }`) overrides halt submission before any network call. `gsd-health` surfaces the disable line.
982
1070
  - **Hardcoded destination.** The issue-reporter cannot be redirected at runtime; the destination URL is a frozen module constant in `scripts/lib/issue-reporter/destination.cjs`. No env-var, config, or flag override.
983
- - **Network isolation.** Issue-reporter modules contain NO `https://` (or equivalent) calls beyond the single destination URL constant verified by Phase 30 baseline static-analysis check (Plan 30-07).
1071
+ - **Network isolation.** Issue-reporter modules contain NO `https://` (or equivalent) calls beyond the single destination URL constant - verified by Phase 30 baseline static-analysis check (Plan 30-07).
984
1072
 
985
1073
  ---
986
1074
 
987
1075
  ## [1.29.0] - 2026-05-19
988
1076
 
989
- ### Phase 29 Capability-Gap Telemetry + Self-Authoring of Agents/Skills
1077
+ ### Phase 29 - Capability-Gap Telemetry + Self-Authoring of Agents/Skills
990
1078
 
991
- First on-cadence minor version after the 1.28.x decimal sub-phase sequence (1.28.0 through 1.28.8). Extends Phase 11's reflector-driven self-improvement loop from authoring reference content to authoring executable artifacts (agents and skills) when capability-gaps recur. Two structural ceilings close here: the artifact-type ceiling (reflector now drafts agents/skills, not just `reference/*.md`) and the signal-source ceiling (capability-lookup failures are now first-class telemetry). Strictly proposal-only `/gdd:apply-reflections` remains the single human gate. 6-manifest lockstep at 1.29.0 (extends Phase 28.8's 4-manifest lockstep with the 2 Tier-2 manifests `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json` bumped in lockstep). 7 plans across Wave A telemetry (29-01..29-03) / Wave B authoring (29-04..29-06) / Wave C closeout (29-07).
1079
+ First on-cadence minor version after the 1.28.x decimal sub-phase sequence (1.28.0 through 1.28.8). Extends Phase 11's reflector-driven self-improvement loop from authoring reference content to authoring executable artifacts (agents and skills) when capability-gaps recur. Two structural ceilings close here: the artifact-type ceiling (reflector now drafts agents/skills, not just `reference/*.md`) and the signal-source ceiling (capability-lookup failures are now first-class telemetry). Strictly proposal-only - `/gdd:apply-reflections` remains the single human gate. 6-manifest lockstep at 1.29.0 (extends Phase 28.8's 4-manifest lockstep with the 2 Tier-2 manifests `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json` bumped in lockstep). 7 plans across Wave A telemetry (29-01..29-03) / Wave B authoring (29-04..29-06) / Wave C closeout (29-07).
992
1080
 
993
1081
  ### Added
994
1082
 
995
1083
  - **Capability-gap telemetry + self-authoring of agents/skills.** Two-stage rollout per Phase 29 D-01:
996
- - **Stage 0 telemetry only (ships immediately).**
1084
+ - **Stage 0 - telemetry only (ships immediately).**
997
1085
  - New typed `capability_gap` event added to the Phase 22 event-chain schema (`reference/schemas/events.schema.json`). 7 fields exactly per D-02 (no PII): `event_id`, `parent_event_id`, `source` (enum: `fast`/`router`/`reflector_pattern`), `context_hash`, `intent_summary`, `suggested_kind` (enum: `agent`/`skill`), `evidence_refs[]` (hash-pinned trajectory-JSONL pointers per D-07, not duplicated content).
998
- - Emitters integrated at three lookup-fail points (29-01): `skills/fast/SKILL.md` no-skill-match path emits `source: "fast"`; `skills/router/SKILL.md` unmatched-intent path emits `source: "router"`. Per D-08, MCP-probe connection failures do NOT emit `capability_gap` those remain Phase 22's connection-status surface.
1086
+ - Emitters integrated at three lookup-fail points (29-01): `skills/fast/SKILL.md` no-skill-match path emits `source: "fast"`; `skills/router/SKILL.md` unmatched-intent path emits `source: "router"`. Per D-08, MCP-probe connection failures do NOT emit `capability_gap` - those remain Phase 22's connection-status surface.
999
1087
  - Reflector pattern-detection pass (29-02) at `scripts/lib/reflector/capability-gap-scan.cjs` scans `.design/intel/` + Phase 23.5 posterior + recent trajectories for `Touches:` clusters recurring without dedicated agent owners and emits `capability_gap` events with `source: "reflector_pattern"`.
1000
1088
  - Reflector aggregation extension (29-03) at `scripts/lib/reflector-capability-gap-aggregator.cjs` reads all `capability_gap` events, clusters by `context_hash`, and writes a `## Capability gaps observed` section to `.design/reflections/<cycle-slug>.md`. `gdd-events --type capability_gap` filter exposed via the existing CLI.
1001
- - `reference/capability-gap-stage-gate.md` Stage-0 → Stage-1 gate spec. K=3 stable clusters across M=10 cycles per D-03, cluster-stability defined as Phase 23.5 posterior `stddev(Beta(α, β)) < 0.05`. Both K and M overridable in the gate doc.
1002
- - **Stage 1 incubator authoring (data-gated, user-opt-in per D-01).**
1089
+ - `reference/capability-gap-stage-gate.md` - Stage-0 → Stage-1 gate spec. K=3 stable clusters across M=10 cycles per D-03, cluster-stability defined as Phase 23.5 posterior `stddev(Beta(α, β)) < 0.05`. Both K and M overridable in the gate doc.
1090
+ - **Stage 1 - incubator authoring (data-gated, user-opt-in per D-01).**
1003
1091
  - `scripts/lib/incubator-author.cjs` (29-04) reads gap clusters above the stability threshold + posterior, then drafts `SKILL.md` or `agents/<slug>.md` at `.design/reflections/incubator/<slug>/` with Phase 28.5-compliant frontmatter (`name`, `description` in `<what>. Use when <triggers>.` form, `tools`, `default-tier`, optional `reasoning-class`, `parallel-safe`, `reads-only`). Origin section with `capability_gap` event refs. Computed usage frequency. Suggested integration point. `delegate_to: null` defensive default per D-12 (forward-compat with Phase 27).
1004
1092
  - `/gdd:apply-reflections` extension (29-05) at `skills/apply-reflections/SKILL.md` and `scripts/lib/incubator-proposals.cjs` surfaces incubator drafts as a new (5th) proposal class alongside frontmatter/reference/budget/discussant. Each proposal renders a diff vs the nearest existing artifact (by name + tools + description embedding per D-09). Four actions per proposal: `accept` (promotes to `agents/`/`skills/` + registers via the Phase 14.5 `reference/registry.json`), `reject`, `defer`, `edit` ($EDITOR). Scope-guard validator at `scripts/validate-incubator-scope.cjs` (D-05) blocks promotion outside `agents/`+`skills/`.
1005
- - **Bandit fairness gate (29-06)** `scripts/lib/bandit-router.cjs` accepts a new `prior_class: "promoted_incubator"` parameter. Promoted arms enter the Phase 23.5 posterior with a conservative `Beta(2, 8)` prior (assume worse-than-average) instead of an optimistic uniform. Per D-04: this IS the staging mechanism single-step promotion gate via `/gdd:apply-reflections accept`, no two-step staging/ratify split.
1006
- - **Incubator TTL (29-06)** drafts not promoted/refreshed within P=30 days (per D-06) auto-archive via `scripts/gsd-cleanup-incubator.cjs` to `.design/reflections/incubator/archive/<slug>/`. Refresh = new `capability_gap` event matching an existing slug's `context_hash` resets the timer.
1093
+ - **Bandit fairness gate (29-06)** - `scripts/lib/bandit-router.cjs` accepts a new `prior_class: "promoted_incubator"` parameter. Promoted arms enter the Phase 23.5 posterior with a conservative `Beta(2, 8)` prior (assume worse-than-average) instead of an optimistic uniform. Per D-04: this IS the staging mechanism - single-step promotion gate via `/gdd:apply-reflections accept`, no two-step staging/ratify split.
1094
+ - **Incubator TTL (29-06)** - drafts not promoted/refreshed within P=30 days (per D-06) auto-archive via `scripts/gsd-cleanup-incubator.cjs` to `.design/reflections/incubator/archive/<slug>/`. Refresh = new `capability_gap` event matching an existing slug's `context_hash` resets the timer.
1007
1095
 
1008
1096
  ### Changed
1009
1097
 
1010
- - Reflector now emits `capability_gap` events alongside the existing learnings / telemetry / agent-metrics signals. No change to existing reflection proposal classes additive only.
1098
+ - Reflector now emits `capability_gap` events alongside the existing learnings / telemetry / agent-metrics signals. No change to existing reflection proposal classes - additive only.
1011
1099
  - `/gdd:apply-reflections` now surfaces 5 proposal classes (was 4: frontmatter / reference / budget / discussant; now adds Incubator agents+skills).
1012
1100
  - `scripts/lib/bandit-router.cjs` accepts a new `prior_class` parameter (default `null` = existing uniform-prior behavior; `"promoted_incubator"` = `Beta(2, 8)` conservative prior).
1013
1101
 
1014
1102
  ### Documentation
1015
1103
 
1016
- - `reference/capability-gap-stage-gate.md` Stage-0 → Stage-1 gate spec (K=3 / M=10 defaults, `stddev(Beta(α, β)) < 0.05` stability threshold, user opt-in flow).
1104
+ - `reference/capability-gap-stage-gate.md` - Stage-0 → Stage-1 gate spec (K=3 / M=10 defaults, `stddev(Beta(α, β)) < 0.05` stability threshold, user opt-in flow).
1017
1105
  - `README.md` + 6 translated READMEs (de/fr/it/ja/ko/zh-CN) updated with the capability-gap telemetry + self-authoring section: Stage 0 ships immediately (telemetry-only, no authoring); Stage 1 authoring is opt-in via `/gdd:apply-reflections` once K=3 stable clusters across M=10 cycles surface.
1018
1106
 
1019
1107
  ### Preserved (no behavior change)
@@ -1027,20 +1115,20 @@ First on-cadence minor version after the 1.28.x decimal sub-phase sequence (1.28
1027
1115
 
1028
1116
  ## [1.28.8] - 2026-05-19
1029
1117
 
1030
- ### Phase 28.8 Tier-2 Distribution Channels
1118
+ ### Phase 28.8 - Tier-2 Distribution Channels
1031
1119
 
1032
- Three new structured distribution channels alongside the Phase 28.7 file-drop install paths. v1.28.8 ships manifest code + bundle generators + doctor mode integration for all three channels; live publish + live install field-tests run post-merge as maintainer steps (D-09 revised, D-16). Off-cadence decimal sub-phase from v1.28.7 parent sequence 1.28.0 → 1.28.5 → 1.28.6 → 1.28.7 → 1.28.8. 12 plans across Wave A (research + lint check) / Wave B (manifests + converters + doctors) / Wave C (bundle builder + Tier-2 doctor aggregation) / Wave D (closeout).
1120
+ Three new structured distribution channels alongside the Phase 28.7 file-drop install paths. v1.28.8 ships manifest code + bundle generators + doctor mode integration for all three channels; live publish + live install field-tests run post-merge as maintainer steps (D-09 revised, D-16). Off-cadence decimal sub-phase from v1.28.7 parent - sequence 1.28.0 → 1.28.5 → 1.28.6 → 1.28.7 → 1.28.8. 12 plans across Wave A (research + lint check) / Wave B (manifests + converters + doctors) / Wave C (bundle builder + Tier-2 doctor aggregation) / Wave D (closeout).
1033
1121
 
1034
1122
  ### Added
1035
1123
 
1036
- - **Tier-2 distribution channels** three new structured channels alongside the Phase 28.7 file-drop install paths:
1124
+ - **Tier-2 distribution channels** - three new structured channels alongside the Phase 28.7 file-drop install paths:
1037
1125
  - **agentskills.io compliance lint** (`scripts/lint-agentskills-spec.cjs`, Workstream A). The open SKILL.md spec adopted by ~38 tools is now enforced against `skills/` on every change. Per D-13 the recommendation was lint-only (our Phase 28.5 frontmatter contract already matches the 2 required spec fields `name` + `description`). 38 PASS / 32 WARN / 0 FAIL across the current `skills/` tree.
1038
- - **Cursor Marketplace** `.cursor-plugin/plugin.json` manifest at repo root + `scripts/lib/install/converters/cursor-marketplace.cjs` bundle generator. New `kind: 'cursor-marketplace'` in `scripts/lib/install/runtimes.cjs`. Doctor reports application status: `not-submitted` / `submitted-pending` / `approved-published` / `rejected` (B2). Per D-04 + D-16: publisher application gated by Cursor team review maintainer submits post-merge.
1039
- - **Codex Plugin** `.codex-plugin/plugin.json` manifest at repo root + `scripts/lib/install/converters/codex-plugin.cjs` bundle generator. New `kind: 'codex-plugin'` in `runtimes.cjs`. Install today via `codex plugin marketplace add hegemonart/get-design-done` against any GitHub URL (D-03). Per D-14: catalog discovery reuses the existing `.claude-plugin/marketplace.json` no separate Codex catalog file authored.
1040
- - `scripts/build-distribution-bundles.cjs` shared source / per-channel bundle builder (X1). Produces `dist/cursor-marketplace/`, `dist/codex-plugin/`, `dist/agentskills-io/` from one `skills/` tree (D-06 single source of truth).
1041
- - `scripts/doctor-tier2.cjs` Tier-2 status aggregator surfaced via `scripts/install.cjs --doctor` (X2).
1042
- - Cross-runtime agentskills.io compat verification reports under `.planning/research/agentskills-io-compat/<runtime>.md` (A2) 5 runtime reports (Codex, Kilo, Augment, Hermes, Qwen).
1043
- - `docs/cursor-marketplace-field-test.md` + `docs/codex-plugin-field-test.md` maintainer-facing field-test playbooks (post-merge live publish + install verification per D-09 revised).
1126
+ - **Cursor Marketplace** - `.cursor-plugin/plugin.json` manifest at repo root + `scripts/lib/install/converters/cursor-marketplace.cjs` bundle generator. New `kind: 'cursor-marketplace'` in `scripts/lib/install/runtimes.cjs`. Doctor reports application status: `not-submitted` / `submitted-pending` / `approved-published` / `rejected` (B2). Per D-04 + D-16: publisher application gated by Cursor team review - maintainer submits post-merge.
1127
+ - **Codex Plugin** - `.codex-plugin/plugin.json` manifest at repo root + `scripts/lib/install/converters/codex-plugin.cjs` bundle generator. New `kind: 'codex-plugin'` in `runtimes.cjs`. Install today via `codex plugin marketplace add hegemonart/get-design-done` against any GitHub URL (D-03). Per D-14: catalog discovery reuses the existing `.claude-plugin/marketplace.json` - no separate Codex catalog file authored.
1128
+ - `scripts/build-distribution-bundles.cjs` - shared source / per-channel bundle builder (X1). Produces `dist/cursor-marketplace/`, `dist/codex-plugin/`, `dist/agentskills-io/` from one `skills/` tree (D-06 single source of truth).
1129
+ - `scripts/doctor-tier2.cjs` - Tier-2 status aggregator surfaced via `scripts/install.cjs --doctor` (X2).
1130
+ - Cross-runtime agentskills.io compat verification reports under `.planning/research/agentskills-io-compat/<runtime>.md` (A2) - 5 runtime reports (Codex, Kilo, Augment, Hermes, Qwen).
1131
+ - `docs/cursor-marketplace-field-test.md` + `docs/codex-plugin-field-test.md` - maintainer-facing field-test playbooks (post-merge live publish + install verification per D-09 revised).
1044
1132
  - Wave A research deep-reads at `.planning/research/`: `agentskills-io-2026-05-19.md`, `cursor-marketplace-2026-05-19.md`, `codex-plugins-2026-05-19.md`.
1045
1133
 
1046
1134
  ### Changed
@@ -1051,43 +1139,43 @@ Three new structured distribution channels alongside the Phase 28.7 file-drop in
1051
1139
 
1052
1140
  ### Documentation
1053
1141
 
1054
- - `docs/cursor-marketplace-field-test.md`, `docs/codex-plugin-field-test.md` added.
1142
+ - `docs/cursor-marketplace-field-test.md`, `docs/codex-plugin-field-test.md` - added.
1055
1143
  - `README.md` + 6 translated READMEs (de/fr/it/ja/ko/zh-CN) updated with Tier-2 install paths per adopted channel (agentskills.io cross-runtime portability note, Cursor Marketplace pending-application note, Codex `codex plugin marketplace add hegemonart/get-design-done`).
1056
1144
 
1057
1145
  ### Backward compatibility
1058
1146
 
1059
- - Per D-05: Phase 28.7 file-drop install (`scripts/lib/install/converters/cursor.cjs`, `scripts/lib/install/converters/codex.cjs`) is UNCHANGED. Tier-2 channels are additive opt-in surfaces existing install paths continue to work exactly as in v1.28.7.
1147
+ - Per D-05: Phase 28.7 file-drop install (`scripts/lib/install/converters/cursor.cjs`, `scripts/lib/install/converters/codex.cjs`) is UNCHANGED. Tier-2 channels are additive opt-in surfaces - existing install paths continue to work exactly as in v1.28.7.
1060
1148
 
1061
1149
  ---
1062
1150
 
1063
- ## [1.28.7] 2026-05-19
1151
+ ## [1.28.7] - 2026-05-19
1064
1152
 
1065
- ### Phase 28.7 Multi-Runtime Install (Pragmatic Port from gsd-build)
1153
+ ### Phase 28.7 - Multi-Runtime Install (Pragmatic Port from gsd-build)
1066
1154
 
1067
- Replaces the Phase 24 `kind: 'agents-md'` placeholder (which dropped a single bare `AGENTS.md` into each non-Claude runtime's config dir content the runtimes did not actually consume) with proper native install for all 14 claimed runtimes. Architecture ported from `gsd-build/get-shit-done` (MIT) see `NOTICE` for the rollup attribution. Per Phase 28.7 D-02 we port the architecture rather than byte-copying the upstream `bin/install.js` monolith. Off-cadence decimal sub-phase from v1.28.0 parent sequence 1.28.0 → 1.28.5 → 1.28.6 → 1.28.7. Re-interpretation of the original ROADMAP Phase 28.7 (verification-gated) per user direction 2026-05-18: skip field-test reports, trust gsd-build's upstream proving of the pattern. 10 plans across Waves A (foundations) / B (converters) / C (wire-up + test + closeout).
1155
+ Replaces the Phase 24 `kind: 'agents-md'` placeholder (which dropped a single bare `AGENTS.md` into each non-Claude runtime's config dir - content the runtimes did not actually consume) with proper native install for all 14 claimed runtimes. Architecture ported from `gsd-build/get-shit-done` (MIT) - see `NOTICE` for the rollup attribution. Per Phase 28.7 D-02 we port the architecture rather than byte-copying the upstream `bin/install.js` monolith. Off-cadence decimal sub-phase from v1.28.0 parent - sequence 1.28.0 → 1.28.5 → 1.28.6 → 1.28.7. Re-interpretation of the original ROADMAP Phase 28.7 (verification-gated) per user direction 2026-05-18: skip field-test reports, trust gsd-build's upstream proving of the pattern. 10 plans across Waves A (foundations) / B (converters) / C (wire-up + test + closeout).
1068
1156
 
1069
1157
  #### New install infrastructure (Wave A)
1070
1158
 
1071
- - `scripts/lib/install/runtime-homes.cjs` (28.7-01) pure per-runtime config-dir resolver for all 14 runtimes. Handles env-var overrides (`CLAUDE_CONFIG_DIR`, `XDG_CONFIG_HOME`, etc.), XDG paths, and special-case nests (Antigravity under `~/.gemini/antigravity`, Windsurf under `~/.codeium/windsurf`). Pure function no I/O.
1072
- - `scripts/lib/install/runtime-artifact-layout.cjs` (28.7-02) per-(runtime, scope) layout table mapping each combination to its `kinds[] = [{kind, destSubpath, prefix}]` shape. Claude global → `skills/<name>/`; Claude local → `commands/gsd/` + `agents/`; cursor/codex/copilot/antigravity/windsurf/augment/trae/qwen/codebuddy → `skills/<name>/`; opencode + kilo → `command/<name>` (slash-command dir, not skills); gemini → `commands/gsd/` (commands-only); cline → `kinds: []` (rules-based embeds in `.clinerules` per D-09).
1073
- - `scripts/lib/install/runtime-slash.cjs` (28.7-03) per-runtime slash-command surface emitter. Codex uses `$gdd-<name>` shell-var form; all others use `/gdd-<name>`. Reserves a forward-compat seam for downstream slash-aware install behaviors.
1159
+ - `scripts/lib/install/runtime-homes.cjs` (28.7-01) - pure per-runtime config-dir resolver for all 14 runtimes. Handles env-var overrides (`CLAUDE_CONFIG_DIR`, `XDG_CONFIG_HOME`, etc.), XDG paths, and special-case nests (Antigravity under `~/.gemini/antigravity`, Windsurf under `~/.codeium/windsurf`). Pure function - no I/O.
1160
+ - `scripts/lib/install/runtime-artifact-layout.cjs` (28.7-02) - per-(runtime, scope) layout table mapping each combination to its `kinds[] = [{kind, destSubpath, prefix}]` shape. Claude global → `skills/<name>/`; Claude local → `commands/gsd/` + `agents/`; cursor/codex/copilot/antigravity/windsurf/augment/trae/qwen/codebuddy → `skills/<name>/`; opencode + kilo → `command/<name>` (slash-command dir, not skills); gemini → `commands/gsd/` (commands-only); cline → `kinds: []` (rules-based - embeds in `.clinerules` per D-09).
1161
+ - `scripts/lib/install/runtime-slash.cjs` (28.7-03) - per-runtime slash-command surface emitter. Codex uses `$gdd-<name>` shell-var form; all others use `/gdd-<name>`. Reserves a forward-compat seam for downstream slash-aware install behaviors.
1074
1162
 
1075
1163
  #### Per-runtime content converters (Wave B)
1076
1164
 
1077
- - 13 per-runtime converters at `scripts/lib/install/converters/<runtime>.cjs` (28.7-04 through 28.7-07), plus `shared.cjs` (frontmatter pass-through, tool-name rewrite, brand pass-through utilities). Each runtime converter exports `convert(content, skillName, ctx) → { path, content }`. Cross-references the Phase 21 cross-harness tool-name maps (`reference/codex-tools.md`, `reference/gemini-tools.md`) tool name rewrites only happen for runtimes whose native tool names differ from Claude's defaults.
1078
- - Wave 1 (28.7-04) `cursor`, `codex`, `copilot`, `antigravity`.
1079
- - Wave 2 (28.7-05) `windsurf`, `augment`, `trae`, `qwen`.
1080
- - Wave 3 (28.7-06) `codebuddy`, `cline`. **Cline** (D-09) writes rule-block aggregation to `.clinerules` rather than a skills directory.
1081
- - Wave 4 (28.7-07) `opencode`, `kilo`, `gemini`. Opencode + kilo use `command/<name>` (slash-command dir); gemini ships commands-only into `commands/gsd/`.
1082
- - **Hermes is OUT of scope** (D-03 + D-10) Phase 24 D-02 runtime-list invariant preserved. The Phase 28.6 baseline tests' "no hermes.cjs" guard is mirrored in the new Phase 28.7 baseline test.
1165
+ - 13 per-runtime converters at `scripts/lib/install/converters/<runtime>.cjs` (28.7-04 through 28.7-07), plus `shared.cjs` (frontmatter pass-through, tool-name rewrite, brand pass-through utilities). Each runtime converter exports `convert(content, skillName, ctx) → { path, content }`. Cross-references the Phase 21 cross-harness tool-name maps (`reference/codex-tools.md`, `reference/gemini-tools.md`) - tool name rewrites only happen for runtimes whose native tool names differ from Claude's defaults.
1166
+ - Wave 1 (28.7-04) - `cursor`, `codex`, `copilot`, `antigravity`.
1167
+ - Wave 2 (28.7-05) - `windsurf`, `augment`, `trae`, `qwen`.
1168
+ - Wave 3 (28.7-06) - `codebuddy`, `cline`. **Cline** (D-09) writes rule-block aggregation to `.clinerules` rather than a skills directory.
1169
+ - Wave 4 (28.7-07) - `opencode`, `kilo`, `gemini`. Opencode + kilo use `command/<name>` (slash-command dir); gemini ships commands-only into `commands/gsd/`.
1170
+ - **Hermes is OUT of scope** (D-03 + D-10) - Phase 24 D-02 runtime-list invariant preserved. The Phase 28.6 baseline tests' "no hermes.cjs" guard is mirrored in the new Phase 28.7 baseline test.
1083
1171
 
1084
1172
  #### Installer wire-up (Wave C.1)
1085
1173
 
1086
- - `scripts/lib/install/installer.cjs` (28.7-08) replaces the broken `kind: 'agents-md'` placeholder with a proper multi-artifact dispatcher. Reads the layout table, invokes the appropriate per-runtime converter for each kind, lands files at the resolved destination per `runtime-homes.cjs`. Backward-compat retained for the existing invocation surface (`--claude`, `--opencode`, …, `--cline`, `--dry-run`, `--global`, `--local`, `--config-dir`). Scope propagation through to converter `ctx` per D-07.
1174
+ - `scripts/lib/install/installer.cjs` (28.7-08) - replaces the broken `kind: 'agents-md'` placeholder with a proper multi-artifact dispatcher. Reads the layout table, invokes the appropriate per-runtime converter for each kind, lands files at the resolved destination per `runtime-homes.cjs`. Backward-compat retained for the existing invocation surface (`--claude`, `--opencode`, …, `--cline`, `--dry-run`, `--global`, `--local`, `--config-dir`). Scope propagation through to converter `ctx` per D-07.
1087
1175
 
1088
1176
  #### Per-runtime simulation suite (Wave C.2)
1089
1177
 
1090
- - `tests/install-per-runtime.test.cjs` (28.7-09) 14 simulation tests + 11 cross-runtime invariants. Each test creates a temp config dir via `mkdtempSync`, invokes the installer with `--config-dir <tmp> --<runtime>`, and asserts files land at the expected paths with content matching the converter output. macOS symlink discipline applied (`os.tmpdir()` + `fs.realpathSync` for path comparison) per Phase 27.6 lesson.
1178
+ - `tests/install-per-runtime.test.cjs` (28.7-09) - 14 simulation tests + 11 cross-runtime invariants. Each test creates a temp config dir via `mkdtempSync`, invokes the installer with `--config-dir <tmp> --<runtime>`, and asserts files land at the expected paths with content matching the converter output. macOS symlink discipline applied (`os.tmpdir()` + `fs.realpathSync` for path comparison) per Phase 27.6 lesson.
1091
1179
 
1092
1180
  #### Fixed
1093
1181
 
@@ -1102,17 +1190,17 @@ Replaces the Phase 24 `kind: 'agents-md'` placeholder (which dropped a single ba
1102
1190
  - Baseline at `test-fixture/baselines/phase-28.7/` (manifests-version, converter-inventory, registry-diff) + `phase-28.6/manifests-version.txt` and `phase-28/manifests-version.txt` forward-propagated to 1.28.7.
1103
1191
  - `phase-20/skill-list.txt` UNCHANGED (no skill add/remove this phase).
1104
1192
  - ROADMAP add + scoped flip (this section + overview entry, 10 inline plan checkboxes pre-flipped).
1105
- - Phase 28.7 ports gsd-build's architecture rather than gating on field-test reports re-interpretation of the original ROADMAP entry per user direction 2026-05-18 (CONTEXT.md D-01).
1193
+ - Phase 28.7 ports gsd-build's architecture rather than gating on field-test reports - re-interpretation of the original ROADMAP entry per user direction 2026-05-18 (CONTEXT.md D-01).
1106
1194
 
1107
1195
  ---
1108
1196
 
1109
- ## [1.28.6] 2026-05-18
1197
+ ## [1.28.6] - 2026-05-18
1110
1198
 
1111
- ### Phase 28.6 Skill Reference Co-Location (Corrective Follow-Up to Phase 28.5)
1199
+ ### Phase 28.6 - Skill Reference Co-Location (Corrective Follow-Up to Phase 28.5)
1112
1200
 
1113
1201
  Corrects Phase 28.5's CONTEXT.md D-06 over-generalization. Phase 28.5 extracted 20 skill-private procedure refs into a central `reference/` folder, but each of those refs is consumed by exactly 1 (or in 2 borderline cases, 2 sibling) skills. Per mattpocock/skills' actual structure at `https://github.com/mattpocock/skills/tree/main/skills`, skill-private procedure docs live next to the `SKILL.md` they describe. Phase 28.6 co-locates the 20 refs into per-skill folders and refreshes the contract's §D-06 to endorse the per-skill folder pattern for 1-/2-consumer content. No new features. No breaking changes. `git mv` preserves history on every file. Phase 28.5's contract spec, validator, CI gate, `zoom-out`, debug Phase 1 patch, CONTEXT.md + ADR project artifacts, decision-injector extension, and 70/70 length compliance are all PRESERVED; only the location of skill-private refs changes.
1114
1202
 
1115
- #### Migrated refs (20 `reference/<topic>.md` -> `skills/<owner>/<topic>.md`)
1203
+ #### Migrated refs (20 - `reference/<topic>.md` -> `skills/<owner>/<topic>.md`)
1116
1204
 
1117
1205
  - `apply-reflections-procedure.md` -> `skills/apply-reflections/`
1118
1206
  - `cache-policy.md` -> `skills/cache-manager/` (primary; `warm-cache` secondary via `./../cache-manager/cache-policy.md`)
@@ -1137,7 +1225,7 @@ Corrects Phase 28.5's CONTEXT.md D-06 over-generalization. Phase 28.5 extracted
1137
1225
 
1138
1226
  #### Contract refresh
1139
1227
 
1140
- - `reference/skill-authoring-contract.md` §D-06 refreshed: per-skill folder pattern explicitly endorsed for skill-private content. Three placement classes codified 1-consumer in `skills/<owner>/<topic>.md`; 2-consumer in primary owner's folder with `./../<primary>/<topic>.md` secondary cross-link; multi-consumer (3+ skills across different domains) in `reference/<topic>.md`. The Phase 28.5 "rare exception only" framing is reversed.
1228
+ - `reference/skill-authoring-contract.md` §D-06 refreshed: per-skill folder pattern explicitly endorsed for skill-private content. Three placement classes codified - 1-consumer in `skills/<owner>/<topic>.md`; 2-consumer in primary owner's folder with `./../<primary>/<topic>.md` secondary cross-link; multi-consumer (3+ skills across different domains) in `reference/<topic>.md`. The Phase 28.5 "rare exception only" framing is reversed.
1141
1229
 
1142
1230
  #### Registry purge
1143
1231
 
@@ -1149,52 +1237,52 @@ Corrects Phase 28.5's CONTEXT.md D-06 over-generalization. Phase 28.5 extracted
1149
1237
 
1150
1238
  #### Plans
1151
1239
 
1152
- - 28.6-01 `git mv` 20 refs + cross-link updates across 23 SKILL.md consumers (`./../reference/<topic>.md` -> `./<topic>.md` or `./../<primary>/<topic>.md`). (COLOC-01)
1153
- - 28.6-02 `reference/registry.json` 20-entry purge (D-03) + `reference/skill-authoring-contract.md` §D-06 refresh (D-04). (COLOC-02)
1154
- - 28.6-03 Validator + baseline + full `npm test` sweep (all green; D-05 confirmation that `scripts/validate-skill-length.cjs` globs `SKILL.md` only; no validator edit). (COLOC-03)
1155
- - 28.6-04 Closeout (4-manifest lockstep at v1.28.6, `OFF_CADENCE_VERSIONS.add('1.28.6')`, CHANGELOG, ROADMAP add + scoped flip, baseline at `test-fixture/baselines/phase-28.6/`, Phase 28.5 CONTEXT.md retrospective annotation). (COLOC-04)
1240
+ - 28.6-01 - `git mv` 20 refs + cross-link updates across 23 SKILL.md consumers (`./../reference/<topic>.md` -> `./<topic>.md` or `./../<primary>/<topic>.md`). (COLOC-01)
1241
+ - 28.6-02 - `reference/registry.json` 20-entry purge (D-03) + `reference/skill-authoring-contract.md` §D-06 refresh (D-04). (COLOC-02)
1242
+ - 28.6-03 - Validator + baseline + full `npm test` sweep (all green; D-05 confirmation that `scripts/validate-skill-length.cjs` globs `SKILL.md` only; no validator edit). (COLOC-03)
1243
+ - 28.6-04 - Closeout (4-manifest lockstep at v1.28.6, `OFF_CADENCE_VERSIONS.add('1.28.6')`, CHANGELOG, ROADMAP add + scoped flip, baseline at `test-fixture/baselines/phase-28.6/`, Phase 28.5 CONTEXT.md retrospective annotation). (COLOC-04)
1156
1244
 
1157
1245
  #### Non-changes
1158
1246
 
1159
- - NOTICE unchanged Phase 28.5's mattpocock/skills MIT attribution still applies (same content; file paths shifted only).
1160
- - `test-fixture/baselines/phase-20/skill-list.txt` unchanged no skills added or removed.
1161
- - `scripts/validate-skill-length.cjs` unchanged D-05 verified the validator globs `SKILL.md` only and is unaffected by co-located procedure refs.
1247
+ - NOTICE unchanged - Phase 28.5's mattpocock/skills MIT attribution still applies (same content; file paths shifted only).
1248
+ - `test-fixture/baselines/phase-20/skill-list.txt` unchanged - no skills added or removed.
1249
+ - `scripts/validate-skill-length.cjs` unchanged - D-05 verified the validator globs `SKILL.md` only and is unaffected by co-located procedure refs.
1162
1250
 
1163
1251
  ---
1164
1252
 
1165
- ## [1.28.5] 2026-05-18
1253
+ ## [1.28.5] - 2026-05-18
1166
1254
 
1167
- ### Phase 28.5 Skill Authoring Contract + Skill Rework + Project Artifacts
1255
+ ### Phase 28.5 - Skill Authoring Contract + Skill Rework + Project Artifacts
1168
1256
 
1169
1257
  Adopts the mattpocock/skills (MIT) authoring contract and applies it retroactively across the entire shipped skill set. Closes the authoring-discipline gap surfaced by the 2026-05-02 comparison audit. 12 plans across 4 waves; off-cadence decimal patch from v1.28.0 parent (CONTEXT.md D-12 convention).
1170
1258
 
1171
1259
  #### New reference files
1172
1260
 
1173
- - `reference/skill-authoring-contract.md` (28.5-01) 100-line `SKILL.md` cap (warn >=100, block >=250 in CI), 1024-char description cap, required `<what>. Use when <triggers>.` form, frontmatter required fields, progressive-disclosure one-level-deep rule, when to add `scripts/`, per-skill domain-specific files allowed only when content is single-skill-private.
1174
- - `reference/context-md-format.md` (28.5-02) DDD-style ubiquitous-language glossary schema with optional `first-seen` + `aliases` GDD additions; CONTEXT-MAP.md multi-context pattern; inline-write-on-resolution trigger.
1175
- - `reference/adr-format.md` (28.5-02) 3-criteria offer gate (hard-to-reverse AND surprising-without-context AND real-tradeoff), 4-state status lifecycle, optional `cycle-id` + `phase-id` cross-refs back to STATE.md (GDD addition).
1176
- - `reference/architecture-vocabulary.md` (28.5-03) Ousterhout's 8 core terms (Module / Interface / Implementation / Depth / Seam / Adapter / Leverage / Locality) + 3 principles (deletion test, interface-is-test-surface, two-adapters-rule).
1177
- - `reference/scan-procedure.md`, `verify-procedure.md`, `design-procedure.md`, `plan-procedure.md`, `explore-procedure.md`, `discover-procedure.md` (28.5-04) 6 procedure references extracted from pipeline-stage skills as progressive-disclosure satellites.
1178
- - `reference/shared-preamble.md` (28.5-05, extended), `style-doc-procedure.md`, `compare-rubric.md`, `darkmode-audit-procedure.md`, `connections-onboarding.md` (28.5-05) 4 new + 1 extended (Bucket 2 design-family rework).
1179
- - `reference/health-mcp-detection.md`, `apply-reflections-procedure.md`, `cache-policy.md`, `router-rules.md`, `start-procedure.md` (28.5-06) 5 references extracted from Bucket 3 orchestrator + utility skills.
1180
- - `reference/debug-feedback-loops.md` (28.5-07 scaffold + 28.5-09 fill) 10 construction paths in priority order, iterate-on-loop sub-discipline, non-determinism reproduction-rate branch.
1181
- - `reference/threat-modeling.md`, `milestone-completeness-rubric.md`, `peer-cli-protocol.md` (28.5-07) 3 additional Bucket 4 extraction targets (analysis + audit skills).
1182
- - `reference/health-skill-length-report.md` (28.5-11) health-skill subsection contract documenting validator JSON shape + threshold rationale.
1261
+ - `reference/skill-authoring-contract.md` (28.5-01) - 100-line `SKILL.md` cap (warn >=100, block >=250 in CI), 1024-char description cap, required `<what>. Use when <triggers>.` form, frontmatter required fields, progressive-disclosure one-level-deep rule, when to add `scripts/`, per-skill domain-specific files allowed only when content is single-skill-private.
1262
+ - `reference/context-md-format.md` (28.5-02) - DDD-style ubiquitous-language glossary schema with optional `first-seen` + `aliases` GDD additions; CONTEXT-MAP.md multi-context pattern; inline-write-on-resolution trigger.
1263
+ - `reference/adr-format.md` (28.5-02) - 3-criteria offer gate (hard-to-reverse AND surprising-without-context AND real-tradeoff), 4-state status lifecycle, optional `cycle-id` + `phase-id` cross-refs back to STATE.md (GDD addition).
1264
+ - `reference/architecture-vocabulary.md` (28.5-03) - Ousterhout's 8 core terms (Module / Interface / Implementation / Depth / Seam / Adapter / Use / Locality) + 3 principles (deletion test, interface-is-test-surface, two-adapters-rule).
1265
+ - `reference/scan-procedure.md`, `verify-procedure.md`, `design-procedure.md`, `plan-procedure.md`, `explore-procedure.md`, `discover-procedure.md` (28.5-04) - 6 procedure references extracted from pipeline-stage skills as progressive-disclosure satellites.
1266
+ - `reference/shared-preamble.md` (28.5-05, extended), `style-doc-procedure.md`, `compare-rubric.md`, `darkmode-audit-procedure.md`, `connections-onboarding.md` (28.5-05) - 4 new + 1 extended (Bucket 2 design-family rework).
1267
+ - `reference/health-mcp-detection.md`, `apply-reflections-procedure.md`, `cache-policy.md`, `router-rules.md`, `start-procedure.md` (28.5-06) - 5 references extracted from Bucket 3 orchestrator + utility skills.
1268
+ - `reference/debug-feedback-loops.md` (28.5-07 scaffold + 28.5-09 fill) - 10 construction paths in priority order, iterate-on-loop sub-discipline, non-determinism reproduction-rate branch.
1269
+ - `reference/threat-modeling.md`, `milestone-completeness-rubric.md`, `peer-cli-protocol.md` (28.5-07) - 3 additional Bucket 4 extraction targets (analysis + audit skills).
1270
+ - `reference/health-skill-length-report.md` (28.5-11) - health-skill subsection contract documenting validator JSON shape + threshold rationale.
1183
1271
 
1184
1272
  #### Skill rework
1185
1273
 
1186
- - Bucket 1 (28.5-04) 11 pipeline-stage skills (`brief`, `discuss`, `plan`, `design`, `verify`, `explore`, `discover`, `scan`, `sketch`, `spike`, `new-cycle`, `complete-cycle`) reworked to <=100 lines.
1187
- - Bucket 2 (28.5-05) 7 design-family skills (`audit`, `style`, `darkmode`, `compare`, `design`, `figma-write`, `connections`, `benchmark`) cross-link cleanup + description standardization.
1188
- - Bucket 3 (28.5-06) 34 orchestrator + utility skills (`help`, `stats`, `note`, `add-backlog`, `todo`, `progress`, `health`, `update`, `undo`, `fast`, `quick`, `next`, `do`, `resume`, `pause`, etc.) `disable-model-invocation: true` whitelist applied; targeted trims on the offenders.
1189
- - Bucket 4 (28.5-07) 17 analysis + audit skills (`scan`, `map`, `analyze-dependencies`, `sketch-wrap-up`, `spike-wrap-up`, `skill-manifest`, `debug`, `peers`, `peer-cli-add`, `peer-cli-customize`, `quality-gate`, `turn-closeout`, `start`, `check-update`, `optimize`, etc.) extraction-then-link pattern; new refs created where content qualified as proper reference material.
1274
+ - Bucket 1 (28.5-04) - 11 pipeline-stage skills (`brief`, `discuss`, `plan`, `design`, `verify`, `explore`, `discover`, `scan`, `sketch`, `spike`, `new-cycle`, `complete-cycle`) reworked to <=100 lines.
1275
+ - Bucket 2 (28.5-05) - 7 design-family skills (`audit`, `style`, `darkmode`, `compare`, `design`, `figma-write`, `connections`, `benchmark`) cross-link cleanup + description standardization.
1276
+ - Bucket 3 (28.5-06) - 34 orchestrator + utility skills (`help`, `stats`, `note`, `add-backlog`, `todo`, `progress`, `health`, `update`, `undo`, `fast`, `quick`, `next`, `do`, `resume`, `pause`, etc.) `disable-model-invocation: true` whitelist applied; targeted trims on the offenders.
1277
+ - Bucket 4 (28.5-07) - 17 analysis + audit skills (`scan`, `map`, `analyze-dependencies`, `sketch-wrap-up`, `spike-wrap-up`, `skill-manifest`, `debug`, `peers`, `peer-cli-add`, `peer-cli-customize`, `quality-gate`, `turn-closeout`, `start`, `check-update`, `optimize`, etc.) extraction-then-link pattern; new refs created where content qualified as proper reference material.
1190
1278
  - All 70 skills under 100 lines post-rework (`scripts/validate-skill-length.cjs --quiet --json` summary: 70 total / 70 clean / 0 warn / 0 block).
1191
1279
 
1192
1280
  #### Skill patches + new skill
1193
1281
 
1194
- - `discuss` + `brief` skill patches (28.5-08) inline `CONTEXT.md` glossary maintenance (no batching) + ADR-offer 3-criteria gate at session end.
1195
- - `hooks/gdd-decision-injector.js` extended (28.5-08) reads `CONTEXT.md` + `docs/adr/*` additively alongside STATE.md cycle-scoped decisions.
1196
- - `debug` skill Phase 1 patch (28.5-09) explicit feedback-loop gate before any hypothesizing; cross-link to `reference/debug-feedback-loops.md` one level deep.
1197
- - New `/gdd:zoom-out` micro-skill (28.5-10) at `skills/zoom-out/SKILL.md` ~10 lines body, frontmatter `disable-model-invocation: true`. Direct port from mattpocock/skills (MIT). Total shipped skills: 69 -> 70.
1282
+ - `discuss` + `brief` skill patches (28.5-08) - inline `CONTEXT.md` glossary maintenance (no batching) + ADR-offer 3-criteria gate at session end.
1283
+ - `hooks/gdd-decision-injector.js` extended (28.5-08) - reads `CONTEXT.md` + `docs/adr/*` additively alongside STATE.md cycle-scoped decisions.
1284
+ - `debug` skill Phase 1 patch (28.5-09) - explicit feedback-loop gate before any hypothesizing; cross-link to `reference/debug-feedback-loops.md` one level deep.
1285
+ - New `/gdd:zoom-out` micro-skill (28.5-10) at `skills/zoom-out/SKILL.md` - ~10 lines body, frontmatter `disable-model-invocation: true`. Direct port from mattpocock/skills (MIT). Total shipped skills: 69 -> 70.
1198
1286
 
1199
1287
  #### CI gate + health reporting (28.5-11)
1200
1288
 
@@ -1214,123 +1302,123 @@ Adopts the mattpocock/skills (MIT) authoring contract and applies it retroactive
1214
1302
 
1215
1303
  ### Decisions locked
1216
1304
 
1217
- - D-01: SKILL.md hard cap = 100 lines (warn), 250 lines (block). Strict description-format off by default validator regex stays open until Phase 33's A/B evidence lands.
1305
+ - D-01: SKILL.md hard cap = 100 lines (warn), 250 lines (block). Strict description-format off by default - validator regex stays open until Phase 33's A/B evidence lands.
1218
1306
  - D-02: Description format follows `<what>. Use when <triggers>.` shape (lax-mode default; Phase 33 A/B will tighten or relax).
1219
1307
  - D-03: NOTICE MIT attribution covers 5 reference ports + zoom-out direct port + debug Phase 1 ordering.
1220
- - D-04: `reference/debug-feedback-loops.md` ships as a proper reference, not inline in the debug SKILL per progressive-disclosure rule.
1308
+ - D-04: `reference/debug-feedback-loops.md` ships as a proper reference, not inline in the debug SKILL - per progressive-disclosure rule.
1221
1309
  - D-05: `gdd-zoom-out` skill ships with `disable-model-invocation: true` (user-invoked-only shortcut).
1222
- - D-06: CI gate is two-tier warn-level advisory, block-level fails the build.
1310
+ - D-06: CI gate is two-tier - warn-level advisory, block-level fails the build.
1223
1311
  - D-07: `hooks/gdd-decision-injector.js` reads CONTEXT.md + `docs/adr/*` additively alongside STATE.md (no replacement, no precedence change).
1224
1312
  - D-08: ADR-offer fires only when ALL three criteria hold (hard-to-reverse AND surprising-without-context AND real-tradeoff). Routine decisions are explicitly skipped.
1225
1313
  - D-09: 28 skills marked `disable-model-invocation: true` (27 from Bucket 3 + new zoom-out).
1226
1314
  - D-10: Health-MCP detection procedure extracted to `reference/health-mcp-detection.md`; SKILL links one level deep.
1227
- - D-11: `gdd-health` SKILL gains skill-length report subsection validator JSON shape documented in `reference/health-skill-length-report.md`.
1315
+ - D-11: `gdd-health` SKILL gains skill-length report subsection - validator JSON shape documented in `reference/health-skill-length-report.md`.
1228
1316
  - D-12: 4-manifest lockstep at v1.28.5; off-cadence decimal patch from v1.28.0 parent. `OFF_CADENCE_VERSIONS.add('1.28.5')` per Phase 27.5/27.6/27.7 closeout discipline.
1229
1317
 
1230
1318
  ### Out of scope (deferred or rejected)
1231
1319
 
1232
- - Description-format regex tightening deferred until Phase 33 A/B evidence on `<what>` clause shortcut behavior lands at `.design/research/description-format-ab.md`.
1233
- - Generating SKILL.md from a frontmatter-only spec (DSL) keeps SKILL.md authorable by humans; reject machine-only generation per first-class-prose principle.
1234
- - Auto-fixer for over-limit skills validator is read-only; manual rework preserves authorial intent.
1235
- - Cross-skill description deduplication accept some triggering overlap; D-02 form is a soft cap, not a uniqueness invariant.
1320
+ - Description-format regex tightening - deferred until Phase 33 A/B evidence on `<what>` clause shortcut behavior lands at `.design/research/description-format-ab.md`.
1321
+ - Generating SKILL.md from a frontmatter-only spec (DSL) - keeps SKILL.md authorable by humans; reject machine-only generation per first-class-prose principle.
1322
+ - Auto-fixer for over-limit skills - validator is read-only; manual rework preserves authorial intent.
1323
+ - Cross-skill description deduplication - accept some triggering overlap; D-02 form is a soft cap, not a uniqueness invariant.
1236
1324
 
1237
1325
  ### Attribution
1238
1326
 
1239
- See `NOTICE` Phase 28.5 block for the mattpocock/skills (MIT) attribution covering ported content. License remains MIT (compatible with mattpocock's MIT) see `LICENSE`.
1327
+ See `NOTICE` Phase 28.5 block for the mattpocock/skills (MIT) attribution covering ported content. License remains MIT (compatible with mattpocock's MIT) - see `LICENSE`.
1240
1328
 
1241
1329
  ---
1242
1330
 
1243
- ## [1.28.0] 2026-05-18
1331
+ ## [1.28.0] - 2026-05-18
1244
1332
 
1245
- ### Phase 28 Foundational References Tier 2 Color, Composition, Proportion, i18n
1333
+ ### Phase 28 - Foundational References Tier 2 - Color, Composition, Proportion, i18n
1246
1334
 
1247
1335
  Closes 4 foundational-fundamentals gaps + 1 contrast layer surfaced by the 2026-05-01 huashu-design comparison audit + parallel i18n-coverage audit. Pure content + light agent wiring; no architectural change, no new pillar, no breaking consumer contract.
1248
1336
 
1249
1337
  #### New reference files (Wave A + B)
1250
1338
 
1251
- - `reference/color-theory.md` (28-01) color spaces (sRGB / HSL / OKLCH / LCH), 6 harmonies in OKLCH, simultaneous contrast, color-blindness palettes, color interpolation in animation (closes the sRGB muddy-mid-transition problem).
1252
- - `reference/composition.md` (28-02) rule of thirds, phi / sqrt(2) / sqrt(3) / sqrt(5) root rectangles, Fibonacci, focal-point construction, visual-weight calculus (size x contrast x isolation x complexity), optical-vs-mathematical centering, Z/F/Gutenberg eye-flow patterns.
1253
- - `reference/proportion-systems.md` (28-03) 4pt / 8pt / sqrt(2) baseline grids, baseline-grid lock, vertical rhythm, modular relationships across type + spacing + sizing + radius.
1254
- - `reference/i18n.md` (28-04) text expansion per locale, CSS logical properties, RTL mirroring + directional-icon flip catalog, bidi isolation, full `Intl.*` family (DateTimeFormat / NumberFormat / PluralRules / RelativeTimeFormat / ListFormat / Collator / Segmenter), ICU MessageFormat, Unicode hygiene, multi-script font stacks, WCAG i18n; spec source for design-verifier + explore probes.
1255
- - `reference/contrast-advanced.md` (28-05) APCA (WCAG 3 draft) Lc 75/60/45/30 thresholds, why 4.5:1 misranks thin/large/colored text (3 worked examples), dual-target pattern with WCAG 2.1 AA, Lc-to-WCAG conversion table. **Ships at v1.28.0 (D-02 not deferred).**
1339
+ - `reference/color-theory.md` (28-01) - color spaces (sRGB / HSL / OKLCH / LCH), 6 harmonies in OKLCH, simultaneous contrast, color-blindness palettes, color interpolation in animation (closes the sRGB muddy-mid-transition problem).
1340
+ - `reference/composition.md` (28-02) - rule of thirds, phi / sqrt(2) / sqrt(3) / sqrt(5) root rectangles, Fibonacci, focal-point construction, visual-weight calculus (size x contrast x isolation x complexity), optical-vs-mathematical centering, Z/F/Gutenberg eye-flow patterns.
1341
+ - `reference/proportion-systems.md` (28-03) - 4pt / 8pt / sqrt(2) baseline grids, baseline-grid lock, vertical rhythm, modular relationships across type + spacing + sizing + radius.
1342
+ - `reference/i18n.md` (28-04) - text expansion per locale, CSS logical properties, RTL mirroring + directional-icon flip catalog, bidi isolation, full `Intl.*` family (DateTimeFormat / NumberFormat / PluralRules / RelativeTimeFormat / ListFormat / Collator / Segmenter), ICU MessageFormat, Unicode hygiene, multi-script font stacks, WCAG i18n; spec source for design-verifier + explore probes.
1343
+ - `reference/contrast-advanced.md` (28-05) - APCA (WCAG 3 draft) Lc 75/60/45/30 thresholds, why 4.5:1 misranks thin/large/colored text (3 worked examples), dual-target pattern with WCAG 2.1 AA, Lc-to-WCAG conversion table. **Ships at v1.28.0 (D-02 - not deferred).**
1256
1344
 
1257
- #### Consumer integration (Wave C 28-06)
1345
+ #### Consumer integration (Wave C - 28-06)
1258
1346
 
1259
1347
  - `agents/design-verifier.md` gains `### i18n probes` subsection with 2 probes: hardcoded-string scan (regex catalog matches react-intl / next-intl / i18next / vue-i18n patterns per D-10) + +40% text-overflow simulation (`scrollWidth > clientWidth` check per D-03). Findings tagged `i18n_readiness` (orthogonal lens, NOT a new pillar).
1260
- - `skills/explore/SKILL.md` gains i18n-readiness probe under Step 2 informational 3-state classification (`framework-managed` / `partial` / `none`) per D-04 + D-11. NO gate, NO blocking.
1261
- - `reference/registry.json` gains 5 new entries (D-05) round-trip schema enforced.
1262
- - `reference/audit-scoring.md` gains 2 orthogonal lens-tags (D-07) `composition_alignment` + `i18n_readiness`. NO new pillar, NO weight change.
1348
+ - `skills/explore/SKILL.md` gains i18n-readiness probe under Step 2 - informational 3-state classification (`framework-managed` / `partial` / `none`) per D-04 + D-11. NO gate, NO blocking.
1349
+ - `reference/registry.json` gains 5 new entries (D-05) - round-trip schema enforced.
1350
+ - `reference/audit-scoring.md` gains 2 orthogonal lens-tags (D-07) - `composition_alignment` + `i18n_readiness`. NO new pillar, NO weight change.
1263
1351
  - 12 additive cross-link insertions across 10 existing reference files (D-06): `palette-catalog.md` Step 4 -> `color-theory.md`; `motion-interpolate.md` -> `color-theory.md`; `visual-hierarchy-layout.md` (Compositional Grids + Asymmetry) -> `composition.md`; `design-system-guidance.md` -> `proportion-systems.md`; `typography.md` (Type Scale Systems + Variable Fonts) -> `proportion-systems.md` + `i18n.md`; `rtl-cjk-cultural.md` (top-of-file) -> `i18n.md`; `form-patterns.md` -> `i18n.md`; `accessibility.md` (x2) -> `i18n.md` + `contrast-advanced.md`; `iconography.md` -> `composition.md`; `style-vocabulary.md` -> `proportion-systems.md`.
1264
1352
 
1265
1353
  #### Decisions locked
1266
1354
 
1267
- - D-01 (rejection): No net-new audit pillar orthogonal lens-tags only on existing pillars.
1355
+ - D-01 (rejection): No net-new audit pillar - orthogonal lens-tags only on existing pillars.
1268
1356
  - D-02: `contrast-advanced.md` ships at v1.28.0 (not deferred).
1269
1357
  - D-03: Verifier overflow probe uses `scrollWidth > clientWidth` after +40% text expansion (cheap synchronous DOM check, no headless-browser dependency).
1270
- - D-04: Explore i18n probe is informational only 3-state output (`framework-managed` / `partial` / `none`), no gate, no blocking.
1358
+ - D-04: Explore i18n probe is informational only - 3-state output (`framework-managed` / `partial` / `none`), no gate, no blocking.
1271
1359
  - D-05: 5 new `reference/registry.json` entries with phase=28.
1272
1360
  - D-06: All 12 cross-link insertions are additive (no removals, no rewordings of existing content).
1273
- - D-07: 2 audit-scoring lens-tags (`composition_alignment` + `i18n_readiness`) orthogonal to existing pillars, not new pillars.
1274
- - D-08: 4-manifest lockstep at 1.28.0 `package.json#version`, `.claude-plugin/plugin.json#version`, `.claude-plugin/marketplace.json#metadata.version`, `.claude-plugin/marketplace.json#plugins[0].version` all align. `OFF_CADENCE_VERSIONS.add('1.28.0')` added to `tests/semver-compare.test.cjs`.
1361
+ - D-07: 2 audit-scoring lens-tags (`composition_alignment` + `i18n_readiness`) - orthogonal to existing pillars, not new pillars.
1362
+ - D-08: 4-manifest lockstep at 1.28.0 - `package.json#version`, `.claude-plugin/plugin.json#version`, `.claude-plugin/marketplace.json#metadata.version`, `.claude-plugin/marketplace.json#plugins[0].version` all align. `OFF_CADENCE_VERSIONS.add('1.28.0')` added to `tests/semver-compare.test.cjs`.
1275
1363
  - D-09: Phase 20 baselines unchanged (no new agents/skills/hooks introduced in Phase 28).
1276
1364
  - D-10: Hardcoded-string scan covers react-intl / next-intl / i18next / vue-i18n call-site patterns; false-positive tightening is reflector carry-forward debt.
1277
1365
  - D-11: Explore probe is single-shot per run (no caching, no telemetry pinning).
1278
- - D-12: ROADMAP scoped flip 7 inline plan checkboxes (28-01..28-07) + 1 top-level overview entry. STRICTLY bounded to Phase 28; other phases' `[ ]` markers untouched.
1366
+ - D-12: ROADMAP scoped flip - 7 inline plan checkboxes (28-01..28-07) + 1 top-level overview entry. STRICTLY bounded to Phase 28; other phases' `[ ]` markers untouched.
1279
1367
 
1280
1368
  #### Tests added
1281
1369
 
1282
- - `tests/phase-28-probes.test.cjs` 21 tests (28-06): verifier i18n probes, explore i18n-readiness probe, 5 registry entries, cross-link integrity across 12 insertions, audit-scoring lens-tags.
1283
- - `tests/phase-28-baseline.test.cjs` 8 tests (28-07): 4-manifest alignment, baseline file presence, reference file presence, registry round-trip, cross-link integrity, verifier + explore probe markers, CHANGELOG block at top, OFF_CADENCE recognition. Version-agnostic (reads `package.json#version` dynamically D-08 lesson).
1284
- - `test-fixture/baselines/phase-28/` 6 baseline text files: `reference-files-presence.txt`, `registry-diff.txt`, `cross-link-integrity.txt`, `verifier-probes-presence.txt`, `explore-probe-presence.txt`, `manifests-version.txt`.
1370
+ - `tests/phase-28-probes.test.cjs` - 21 tests (28-06): verifier i18n probes, explore i18n-readiness probe, 5 registry entries, cross-link integrity across 12 insertions, audit-scoring lens-tags.
1371
+ - `tests/phase-28-baseline.test.cjs` - 8 tests (28-07): 4-manifest alignment, baseline file presence, reference file presence, registry round-trip, cross-link integrity, verifier + explore probe markers, CHANGELOG block at top, OFF_CADENCE recognition. Version-agnostic (reads `package.json#version` dynamically - D-08 lesson).
1372
+ - `test-fixture/baselines/phase-28/` - 6 baseline text files: `reference-files-presence.txt`, `registry-diff.txt`, `cross-link-integrity.txt`, `verifier-probes-presence.txt`, `explore-probe-presence.txt`, `manifests-version.txt`.
1285
1373
 
1286
1374
  #### Out of scope (deferred or rejected)
1287
1375
 
1288
1376
  - 20 designer-school philosophies catalog (huashu-design license unresolved).
1289
- - Brand asset acquisition protocol (5-10-2-8 curation rule separate phase).
1290
- - Color-management profiles (Display-P3 / Rec.2020 / BT.2100 video/print only).
1291
- - Generative color systems (Material You algorithm already in `style-vocabulary.md`).
1377
+ - Brand asset acquisition protocol (5-10-2-8 curation rule - separate phase).
1378
+ - Color-management profiles (Display-P3 / Rec.2020 / BT.2100 - video/print only).
1379
+ - Generative color systems (Material You algorithm - already in `style-vocabulary.md`).
1292
1380
  - Net-new audit pillar (lens-tags instead, per D-07).
1293
- - Translation-management workflows (Crowdin / Lokalise / Phrase ops concern).
1381
+ - Translation-management workflows (Crowdin / Lokalise / Phrase - ops concern).
1294
1382
  - Locale-pack bundling / lazy-loading (production tuning concern).
1295
1383
  - Pseudolocalization tooling (+40% overflow at verifier layer covers same QA goal).
1296
- - RTL typography subtleties beyond mirroring (Arabic kashida, vertical CJK `rtl-cjk-cultural.md` already touches).
1384
+ - RTL typography subtleties beyond mirroring (Arabic kashida, vertical CJK - `rtl-cjk-cultural.md` already touches).
1297
1385
 
1298
1386
  #### Carry-forward debt
1299
1387
 
1300
- - Verifier hardcoded-string scan false-positive rate (D-10) reflector measures over first N runs; tightens regex per Phase 11 self-improvement loop.
1301
- - APCA spec ratification currently WCAG 3 draft; if it advances to candidate-recommendation, `contrast-advanced.md` becomes more authoritative.
1302
- - ICU MessageFormat 2.0 status currently Stage 3 / draft at TC39; if it lands, `i18n.md` ICU section may add 2.0 examples in a follow-up.
1303
- - `Intl.Segmenter` browser-support drift Safari shipped late; polyfill/fallback note may need adding to `i18n.md` Unicode Hygiene section.
1388
+ - Verifier hardcoded-string scan false-positive rate (D-10) - reflector measures over first N runs; tightens regex per Phase 11 self-improvement loop.
1389
+ - APCA spec ratification - currently WCAG 3 draft; if it advances to candidate-recommendation, `contrast-advanced.md` becomes more authoritative.
1390
+ - ICU MessageFormat 2.0 status - currently Stage 3 / draft at TC39; if it lands, `i18n.md` ICU section may add 2.0 examples in a follow-up.
1391
+ - `Intl.Segmenter` browser-support drift - Safari shipped late; polyfill/fallback note may need adding to `i18n.md` Unicode Hygiene section.
1304
1392
 
1305
1393
  ---
1306
1394
 
1307
- ## [1.27.7] 2026-05-18
1395
+ ## [1.27.7] - 2026-05-18
1308
1396
 
1309
1397
  ### Added
1310
1398
 
1311
- - **Phase 27.7 GDD MCP Server** (7 plans). Ships `gdd-mcp`, a read-only Model Context Protocol server that exposes STATE.md sections, phases, decisions, plans, telemetry, intel slices, and the latest reflection as 12 typed MCP tools backed by the same `scripts/lib/*` modules the CLI uses. Sub-3-second priming target on a synthetic project (Storybloq §4.6 pattern transplant). Off-cadence v1.27.7 (CHANGELOG-only; mainline cadence resumes at v1.28.0).
1312
- - `scripts/mcp-servers/gdd-mcp/server.ts` (Plan 27.7-01) MCP server scaffold using `@modelcontextprotocol/sdk` low-level Server + StdioServerTransport. Project-root discovery walks from `process.cwd()` looking for `.design/` OR `.planning/` OR `.claude-plugin/plugin.json`. `bin/gdd-mcp` shim added to `package.json` (alphabetized: gdd-events → gdd-mcp → gdd-sdk → gdd-state-mcp). Tests on handshake + walk-up + missing-marker behavior. (MCP-01)
1313
- - `scripts/mcp-servers/gdd-mcp/tools/` + `reference/schemas/mcp-gdd-tools.schema.json` (Plan 27.7-02) 12 read-only tools: `gdd_status`, `gdd_cycle_recap`, `gdd_decisions_list`, `gdd_events_tail`, `gdd_health`, `gdd_intel_get`, `gdd_learnings_digest`, `gdd_phase_current`, `gdd_phases_list`, `gdd_plans_list`, `gdd_reflections_latest`, `gdd_telemetry_query`. Each tool ≤ 30 LOC (D-06), with per-tool Draft-07 JSON Schema, plus 5 helper libs (state-reader, intel-slicer, telemetry-grouper, reflection-loader, paths-resolver) and a `directory_not_found` typed projection. Tests on input schema + output shape + thin-wrapper assertion. (MCP-02)
1314
- - `scripts/lib/mcp-tools-lint/index.cjs` (Plan 27.7-03) Static lint enforcing 4 invariants: forbid-fs-path (D-06: no direct `fs.*`/`path.*` in tool files), max-loc (≤ 30 LOC per tool), no-write-names (D-04: hard-blocks `_(create|update|delete|append|clear|write|set)` patterns), tool-count-cap (D-03: ≤ 12 files). Tests on each rule + exemptions for `index.ts`/`shared.ts`. (MCP-03)
1315
- - `scripts/lib/install/mcp-register.cjs` + `scripts/install.cjs --register-mcp` extension (Plan 27.7-04) Idempotent registration with `claude mcp add` + `codex mcp add` (D-07 opt-in; absent-CLI fallback). `skills/health/SKILL.md` gains a `check-mcp-registration` step with 4 SKILL-row outputs (registered_with_both, not_registered, dismissed, unknown). Tests on idempotent re-run + absent-CLI paths + `--` arg-injection guard. (MCP-04)
1399
+ - **Phase 27.7 - GDD MCP Server** (7 plans). Ships `gdd-mcp`, a read-only Model Context Protocol server that exposes STATE.md sections, phases, decisions, plans, telemetry, intel slices, and the latest reflection as 12 typed MCP tools backed by the same `scripts/lib/*` modules the CLI uses. Sub-3-second priming target on a synthetic project (Storybloq §4.6 pattern transplant). Off-cadence v1.27.7 (CHANGELOG-only; mainline cadence resumes at v1.28.0).
1400
+ - `scripts/mcp-servers/gdd-mcp/server.ts` (Plan 27.7-01) - MCP server scaffold using `@modelcontextprotocol/sdk` low-level Server + StdioServerTransport. Project-root discovery walks from `process.cwd()` looking for `.design/` OR `.planning/` OR `.claude-plugin/plugin.json`. `bin/gdd-mcp` shim added to `package.json` (alphabetized: gdd-events → gdd-mcp → gdd-sdk → gdd-state-mcp). Tests on handshake + walk-up + missing-marker behavior. (MCP-01)
1401
+ - `scripts/mcp-servers/gdd-mcp/tools/` + `reference/schemas/mcp-gdd-tools.schema.json` (Plan 27.7-02) - 12 read-only tools: `gdd_status`, `gdd_cycle_recap`, `gdd_decisions_list`, `gdd_events_tail`, `gdd_health`, `gdd_intel_get`, `gdd_learnings_digest`, `gdd_phase_current`, `gdd_phases_list`, `gdd_plans_list`, `gdd_reflections_latest`, `gdd_telemetry_query`. Each tool ≤ 30 LOC (D-06), with per-tool Draft-07 JSON Schema, plus 5 helper libs (state-reader, intel-slicer, telemetry-grouper, reflection-loader, paths-resolver) and a `directory_not_found` typed projection. Tests on input schema + output shape + thin-wrapper assertion. (MCP-02)
1402
+ - `scripts/lib/mcp-tools-lint/index.cjs` (Plan 27.7-03) - Static lint enforcing 4 invariants: forbid-fs-path (D-06: no direct `fs.*`/`path.*` in tool files), max-loc (≤ 30 LOC per tool), no-write-names (D-04: hard-blocks `_(create|update|delete|append|clear|write|set)` patterns), tool-count-cap (D-03: ≤ 12 files). Tests on each rule + exemptions for `index.ts`/`shared.ts`. (MCP-03)
1403
+ - `scripts/lib/install/mcp-register.cjs` + `scripts/install.cjs --register-mcp` extension (Plan 27.7-04) - Idempotent registration with `claude mcp add` + `codex mcp add` (D-07 opt-in; absent-CLI fallback). `skills/health/SKILL.md` gains a `check-mcp-registration` step with 4 SKILL-row outputs (registered_with_both, not_registered, dismissed, unknown). Tests on idempotent re-run + absent-CLI paths + `--` arg-injection guard. (MCP-04)
1316
1404
  - `skills/progress/SKILL.md` + `skills/resume/SKILL.md` + `skills/next/SKILL.md` adopted MCP-path + File-read-path fork (Plan 27.7-05). Each skill prefers `gdd-mcp` tools when registered, falls back to direct file reads when not. Structural-compliance tests via the Phase 28.5 validator. (MCP-05)
1317
1405
  - `scripts/mcp-servers/gdd-mcp/README.md` (≤ 120 lines, Plan 27.7-06) + `test-fixture/baselines/phase-27-7/priming-benchmark.json` capturing −31.18% token reduction on a synthetic project (Storybloq's −30% floor met). Tests on README structure + benchmark fixture shape + token-reduction ≥ 30%. (MCP-06)
1318
- - `test-fixture/baselines/phase-27-7/` regression snapshots (Plan 27.7-07): `tool-registry.json` (12 tools, zero write-tools), `handshake-fixture.json` (canonical initialize response shape), `install-doctor-fixture.json` (4 SKILL-row scenarios), `manifests-version.txt` (pinned at 1.27.7). 4-manifest lockstep bump to v1.27.7. CHANGELOG entry. `OFF_CADENCE_VERSIONS.add('1.27.7')`. `reference/registry.json` gains `mcp-gdd-tools-schema` entry. `plugin.json` keywords gain `mcp-server`, `context-loading`, `cross-session`. ROADMAP scoped flip (7 plan checkboxes + 1 top-level overview entry). New `tests/phase-27-7-baseline.test.cjs` (>= 6 version-agnostic baseline tests) + new `tests/gdd-mcp-headless-e2e.test.cjs` (5 E2E tests: pack -> install -> spawn -> MCP initialize handshake -> tools/list returns 12; skip-on-Windows path documented for npm pack symlink false-negatives Blocker #2 acceptance per ROADMAP SC #11). (MCP-07)
1406
+ - `test-fixture/baselines/phase-27-7/` regression snapshots (Plan 27.7-07): `tool-registry.json` (12 tools, zero write-tools), `handshake-fixture.json` (canonical initialize response shape), `install-doctor-fixture.json` (4 SKILL-row scenarios), `manifests-version.txt` (pinned at 1.27.7). 4-manifest lockstep bump to v1.27.7. CHANGELOG entry. `OFF_CADENCE_VERSIONS.add('1.27.7')`. `reference/registry.json` gains `mcp-gdd-tools-schema` entry. `plugin.json` keywords gain `mcp-server`, `context-loading`, `cross-session`. ROADMAP scoped flip (7 plan checkboxes + 1 top-level overview entry). New `tests/phase-27-7-baseline.test.cjs` (>= 6 version-agnostic baseline tests) + new `tests/gdd-mcp-headless-e2e.test.cjs` (5 E2E tests: pack -> install -> spawn -> MCP initialize handshake -> tools/list returns 12; skip-on-Windows path documented for npm pack symlink false-negatives - Blocker #2 acceptance per ROADMAP SC #11). (MCP-07)
1319
1407
 
1320
1408
  ### Decisions locked
1321
1409
 
1322
- - D-01: MCP server is read-mostly (read-only in v1; mutations stay in slash-skills + lockfile-safe writers re-examine at Phase 30/41).
1323
- - D-02: Tool count capped at 12 `TOOL_COUNT > 12` throws at module load. Adding a 13th tool requires re-scoping in a new plan.
1410
+ - D-01: MCP server is read-mostly (read-only in v1; mutations stay in slash-skills + lockfile-safe writers - re-examine at Phase 30/41).
1411
+ - D-02: Tool count capped at 12 - `TOOL_COUNT > 12` throws at module load. Adding a 13th tool requires re-scoping in a new plan.
1324
1412
  - D-03: 12-tool cap is the hard ceiling baselined in `test-fixture/baselines/phase-27-7/tool-registry.json`.
1325
- - D-04: No write-verb tool names `mcp-tools-lint` blocks `_(create|update|delete|append|clear|write|set)(_|$)` patterns. Baseline asserts `write_tools.length === 0`.
1326
- - D-05: stdio-only transport no port allocation, no HTTP surface. Project-root discovery walks up from `process.cwd()` (`.design/` OR `.planning/` OR `.claude-plugin/plugin.json` marker).
1327
- - D-06: Each tool file ≤ 30 non-blank-non-comment LOC. Tools must be thin wrappers no direct `node:fs`/`node:path` imports (enforced by `mcp-tools-lint`). All filesystem I/O routes through `scripts/lib/*` helpers.
1413
+ - D-04: No write-verb tool names - `mcp-tools-lint` blocks `_(create|update|delete|append|clear|write|set)(_|$)` patterns. Baseline asserts `write_tools.length === 0`.
1414
+ - D-05: stdio-only transport - no port allocation, no HTTP surface. Project-root discovery walks up from `process.cwd()` (`.design/` OR `.planning/` OR `.claude-plugin/plugin.json` marker).
1415
+ - D-06: Each tool file ≤ 30 non-blank-non-comment LOC. Tools must be thin wrappers - no direct `node:fs`/`node:path` imports (enforced by `mcp-tools-lint`). All filesystem I/O routes through `scripts/lib/*` helpers.
1328
1416
  - D-07: Installer `--register-mcp` is opt-in (default off). Absent-CLI fallback emits a non-blocking notice. Dismissable nudge via `.design/config.json#mcp_nudge: false`.
1329
- - D-08: Skill-side adoption is forked MCP path (preferred) + File-read path (fallback). Both produce identical output shape. Skills do not hard-depend on MCP registration.
1330
- - D-09: Server name `gdd-mcp` (matches package bin); version read from `package.json#version` (single source of truth D-12 lockstep maintains alignment).
1417
+ - D-08: Skill-side adoption is forked - MCP path (preferred) + File-read path (fallback). Both produce identical output shape. Skills do not hard-depend on MCP registration.
1418
+ - D-09: Server name `gdd-mcp` (matches package bin); version read from `package.json#version` (single source of truth - D-12 lockstep maintains alignment).
1331
1419
  - D-10: `bin/gdd-mcp` block in `package.json` alphabetized at scaffold time (Plan 27.7-01). Manifest bump preserves the alphabetization.
1332
1420
  - D-11: New schema `reference/schemas/mcp-gdd-tools.schema.json` registered in `reference/registry.json` as `mcp-gdd-tools-schema`.
1333
- - D-12: 4-manifest lockstep `package.json#version`, `.claude-plugin/plugin.json#version`, `.claude-plugin/marketplace.json#metadata.version`, `.claude-plugin/marketplace.json#plugins[0].version` all ship together at v1.27.7. `OFF_CADENCE_VERSIONS.add('1.27.7')` added to `tests/semver-compare.test.cjs`.
1421
+ - D-12: 4-manifest lockstep - `package.json#version`, `.claude-plugin/plugin.json#version`, `.claude-plugin/marketplace.json#metadata.version`, `.claude-plugin/marketplace.json#plugins[0].version` all ship together at v1.27.7. `OFF_CADENCE_VERSIONS.add('1.27.7')` added to `tests/semver-compare.test.cjs`.
1334
1422
 
1335
1423
  ### Tests added
1336
1424
 
@@ -1338,33 +1426,33 @@ Closes 4 foundational-fundamentals gaps + 1 contrast layer surfaced by the 2026-
1338
1426
 
1339
1427
  ### Out of scope (deferred or rejected)
1340
1428
 
1341
- - Write tools in v1 `gdd_decision_append`, `gdd_blocker_clear`, `gdd_plan_complete` etc. Mutation belongs to slash-skills + lockfile-safe writers (Phase 20 surface), not callable-by-any-client MCP tools. Re-examine at Phase 30 (issue reporter) or Phase 41 (team mode).
1342
- - Tool sprawl past 12 Storybloq grew to 43 tools because read + write + autonomous + review-lens orchestration share the surface. GDD's autonomous surface is `/gdd:do`, review is `agents/*`. Re-examine when measured token-cost data justifies an additional tool.
1343
- - Live (streaming) MCP resources Phase 48 (`/gdd:live`) handles long-lived browser sessions via `channel/`-style subprocess registry; MCP stays request/response in v1.
1344
- - Multi-project federation one server, one project root. Two GDD projects in two terminals = two MCP servers. Federation is a Phase 41 (team mode) question.
1429
+ - Write tools in v1 - `gdd_decision_append`, `gdd_blocker_clear`, `gdd_plan_complete` etc. Mutation belongs to slash-skills + lockfile-safe writers (Phase 20 surface), not callable-by-any-client MCP tools. Re-examine at Phase 30 (issue reporter) or Phase 41 (team mode).
1430
+ - Tool sprawl past 12 - Storybloq grew to 43 tools because read + write + autonomous + review-lens orchestration share the surface. GDD's autonomous surface is `/gdd:do`, review is `agents/*`. Re-examine when measured token-cost data justifies an additional tool.
1431
+ - Live (streaming) MCP resources - Phase 48 (`/gdd:live`) handles long-lived browser sessions via `channel/`-style subprocess registry; MCP stays request/response in v1.
1432
+ - Multi-project federation - one server, one project root. Two GDD projects in two terminals = two MCP servers. Federation is a Phase 41 (team mode) question.
1345
1433
 
1346
1434
  ### Benchmark
1347
1435
 
1348
- `test-fixture/baselines/phase-27-7/priming-benchmark.json` synthetic-fixture priming run shows −31.18% token reduction (3 MCP calls vs equivalent file-reading path), with a 34× wall-clock speedup vs file-reading. Floor target was −30% (Storybloq's measured number); GDD exceeds the floor. Real-cycle calibration follows in a patch after 1-2 production cycles.
1436
+ `test-fixture/baselines/phase-27-7/priming-benchmark.json` - synthetic-fixture priming run shows −31.18% token reduction (3 MCP calls vs equivalent file-reading path), with a 34× wall-clock speedup vs file-reading. Floor target was −30% (Storybloq's measured number); GDD exceeds the floor. Real-cycle calibration follows in a patch after 1-2 production cycles.
1349
1437
 
1350
1438
  ### Headless E2E (ROADMAP SC #11)
1351
1439
 
1352
- `tests/gdd-mcp-headless-e2e.test.cjs` `npm pack` produces tarball -> `npm install <tarball>` into mkdtempSync prefix -> spawn `gdd-mcp` via the installed bin -> MCP initialize handshake asserts `serverInfo.name === 'gdd-mcp'` + `serverInfo.version === package.json#version` -> follow-up `tools/list` asserts `result.tools.length === 12`. Cleanup at end. Marked `skip: process.platform === 'win32'` for npm pack symlink false-negatives (Blocker #2 acceptance); POSIX CI runs all 5 E2E tests.
1440
+ `tests/gdd-mcp-headless-e2e.test.cjs` - `npm pack` produces tarball -> `npm install <tarball>` into mkdtempSync prefix -> spawn `gdd-mcp` via the installed bin -> MCP initialize handshake asserts `serverInfo.name === 'gdd-mcp'` + `serverInfo.version === package.json#version` -> follow-up `tools/list` asserts `result.tools.length === 12`. Cleanup at end. Marked `skip: process.platform === 'win32'` for npm pack symlink false-negatives (Blocker #2 acceptance); POSIX CI runs all 5 E2E tests.
1353
1441
 
1354
1442
  ---
1355
1443
 
1356
- ## [1.27.6] 2026-05-18
1444
+ ## [1.27.6] - 2026-05-18
1357
1445
 
1358
1446
  ### Added
1359
1447
 
1360
- - **Phase 27.6 Pipeline Performance + Token-Cost Optimization** (6 plans). After 27.5 wired the bandit into production routing, telemetry from `.design/telemetry/{costs,trajectories,events}.jsonl` finally measures real spawns; this phase converts that telemetry into concrete optimizations.
1361
- - `agents/perf-analyzer.md` + `scripts/lib/perf-analyzer/` (Plan 27.6-01) reflector-tier agent that reads telemetry cross-cycle and surfaces top-3 token-cost regressions per agent + cache-hit-rate deltas + p95 latency spikes. Spawned by `/gdd:reflect` or `/gdd:audit`, NOT per-cycle (D-04).
1362
- - `reference/perf-budget.md` + `tests/perf-budget.test.cjs` (Plan 27.6-02) per-agent budget table + CI regression gate that fails on >25% regression vs baseline across 3 cycles (D-01). Thresholds configurable via `.design/budget.json#perf_regression_threshold`.
1363
- - `scripts/lib/cache/gdd-cache-manager.cjs` (Plan 27.6-03) cache-warming heuristic refinement: multiplicative `recency × frequency × cost` score (D-06) + top-N ranking + LRU eviction within warmed set + false-positive event emission when >20% of warmed entries evict before use (D-02).
1364
- - `scripts/lib/parallelism-engine/concurrency-tuner.cjs` (Plan 27.6-04) data-driven concurrency resolver reading `parallelism.verdict` events; default becomes `min(cpu-1, last_observed_optimum)` capped at 8 (D-07). Both explore-parallel-runner and discuss-parallel-runner now use the resolver when `opts.concurrency` is omitted.
1365
- - `hooks/gdd-precompact-snapshot.js` + `hooks/gdd-sessionstart-recap.js` (Plan 27.6-05) Storybloq §4.6 transplant. PreCompact hook writes atomic snapshots to `.design/snapshots/<ts>.json` (D-08; retention last-10 LRU); SessionStart recap emits markdown to stderr + JSON sidecar at `.design/snapshots/last-recap.json` (D-09). Harness-aware: Codex no-op with stderr notice (D-10, Phase 45 dep for full path).
1366
- - `scripts/lib/prompt-dedup/index.cjs` + `reference/retrieval-contract.md` extension (Plan 27.6-06) D-11 dedup: when ≥ 3 agents in same cycle read same `reference/*.md`, the retrieval-contract preamble adds a "shared context loaded once" marker.
1367
- - `docs/PERF-OPTIMIZATION.md` (Plan 27.6-06) operator guide covering all 6 plans, 12 D-XX decisions, the CI regression gate, perf-analyzer proposals, cache-warming tuning, concurrency resolver, snapshot/recap hooks, Codex no-op fallback, prompt-dedup, recalibration process, and troubleshooting.
1448
+ - **Phase 27.6 - Pipeline Performance + Token-Cost Optimization** (6 plans). After 27.5 wired the bandit into production routing, telemetry from `.design/telemetry/{costs,trajectories,events}.jsonl` finally measures real spawns; this phase converts that telemetry into concrete optimizations.
1449
+ - `agents/perf-analyzer.md` + `scripts/lib/perf-analyzer/` (Plan 27.6-01) - reflector-tier agent that reads telemetry cross-cycle and surfaces top-3 token-cost regressions per agent + cache-hit-rate deltas + p95 latency spikes. Spawned by `/gdd:reflect` or `/gdd:audit`, NOT per-cycle (D-04).
1450
+ - `reference/perf-budget.md` + `tests/perf-budget.test.cjs` (Plan 27.6-02) - per-agent budget table + CI regression gate that fails on >25% regression vs baseline across 3 cycles (D-01). Thresholds configurable via `.design/budget.json#perf_regression_threshold`.
1451
+ - `scripts/lib/cache/gdd-cache-manager.cjs` (Plan 27.6-03) - cache-warming heuristic refinement: multiplicative `recency × frequency × cost` score (D-06) + top-N ranking + LRU eviction within warmed set + false-positive event emission when >20% of warmed entries evict before use (D-02).
1452
+ - `scripts/lib/parallelism-engine/concurrency-tuner.cjs` (Plan 27.6-04) - data-driven concurrency resolver reading `parallelism.verdict` events; default becomes `min(cpu-1, last_observed_optimum)` capped at 8 (D-07). Both explore-parallel-runner and discuss-parallel-runner now use the resolver when `opts.concurrency` is omitted.
1453
+ - `hooks/gdd-precompact-snapshot.js` + `hooks/gdd-sessionstart-recap.js` (Plan 27.6-05) - Storybloq §4.6 transplant. PreCompact hook writes atomic snapshots to `.design/snapshots/<ts>.json` (D-08; retention last-10 LRU); SessionStart recap emits markdown to stderr + JSON sidecar at `.design/snapshots/last-recap.json` (D-09). Harness-aware: Codex no-op with stderr notice (D-10, Phase 45 dep for full path).
1454
+ - `scripts/lib/prompt-dedup/index.cjs` + `reference/retrieval-contract.md` extension (Plan 27.6-06) - D-11 dedup: when ≥ 3 agents in same cycle read same `reference/*.md`, the retrieval-contract preamble adds a "shared context loaded once" marker.
1455
+ - `docs/PERF-OPTIMIZATION.md` (Plan 27.6-06) - operator guide covering all 6 plans, 12 D-XX decisions, the CI regression gate, perf-analyzer proposals, cache-warming tuning, concurrency resolver, snapshot/recap hooks, Codex no-op fallback, prompt-dedup, recalibration process, and troubleshooting.
1368
1456
 
1369
1457
  ### Decisions locked
1370
1458
 
@@ -1387,40 +1475,40 @@ Closes 4 foundational-fundamentals gaps + 1 contrast layer surfaced by the 2026-
1387
1475
  - Per-call model substitution (Phase 23.5 bandit territory).
1388
1476
  - Rewriting reference files (Phase 46 territory).
1389
1477
  - Codex `pre-large-context-action` interception (Phase 45 dep).
1390
- - Cache-warming auto-tuning of heuristic weights measurement-gated follow-up.
1391
- - Real-cycle baseline calibration deferred to follow-up patch.
1478
+ - Cache-warming auto-tuning of heuristic weights - measurement-gated follow-up.
1479
+ - Real-cycle baseline calibration - deferred to follow-up patch.
1392
1480
 
1393
1481
  ### Test coverage
1394
1482
 
1395
- - `tests/perf-analyzer-cost-regression.test.cjs` ≥10 tests for detection rules (Plan 27.6-01).
1396
- - `tests/perf-budget.test.cjs` ≥6 tests for CI gate including cold-start tolerance (Plan 27.6-02).
1397
- - `tests/gdd-cache-manager-warming.test.cjs` ≥6 tests for warming heuristic (Plan 27.6-03).
1398
- - `tests/concurrency-tuner.test.cjs` ≥5 tests for D-07 algorithm (Plan 27.6-04).
1399
- - `tests/gdd-precompact-snapshot.test.cjs` ≥6 tests including atomicity + harness fallback (Plan 27.6-05).
1400
- - `tests/gdd-sessionstart-recap.test.cjs` ≥4 tests for diff + Codex no-op (Plan 27.6-05).
1401
- - `tests/prompt-dedup.test.cjs` 12 tests for D-11 threshold + cycle scoping + alphabetic sort + malformed-event filter (Plan 27.6-06).
1402
- - `tests/phase-27-6-baseline.test.cjs` version-agnostic regression baseline (Plan 27.6-06).
1483
+ - `tests/perf-analyzer-cost-regression.test.cjs` - ≥10 tests for detection rules (Plan 27.6-01).
1484
+ - `tests/perf-budget.test.cjs` - ≥6 tests for CI gate including cold-start tolerance (Plan 27.6-02).
1485
+ - `tests/gdd-cache-manager-warming.test.cjs` - ≥6 tests for warming heuristic (Plan 27.6-03).
1486
+ - `tests/concurrency-tuner.test.cjs` - ≥5 tests for D-07 algorithm (Plan 27.6-04).
1487
+ - `tests/gdd-precompact-snapshot.test.cjs` - ≥6 tests including atomicity + harness fallback (Plan 27.6-05).
1488
+ - `tests/gdd-sessionstart-recap.test.cjs` - ≥4 tests for diff + Codex no-op (Plan 27.6-05).
1489
+ - `tests/prompt-dedup.test.cjs` - 12 tests for D-11 threshold + cycle scoping + alphabetic sort + malformed-event filter (Plan 27.6-06).
1490
+ - `tests/phase-27-6-baseline.test.cjs` - version-agnostic regression baseline (Plan 27.6-06).
1403
1491
 
1404
1492
  ---
1405
1493
 
1406
- ## [1.27.5] 2026-05-17
1494
+ ## [1.27.5] - 2026-05-17
1407
1495
 
1408
1496
  ### Added
1409
1497
 
1410
- - **Phase 27.5 Bandit Production Integration** (6 plans). Wires Phase 23.5's bandit posterior + Phase 27-07's `delegate?` dimension into a real production routing path. After v1.27.5, `default-tier:` becomes a default (cold-start prior), not a final answer the bandit picks the final tier from measurement when `adaptive_mode: full`.
1411
- - `scripts/lib/bandit-router/integration.cjs` (Plan 27.5-01) thin shim exposing `consultBandit({agent, bin, delegate, agentFrontmatter, adaptiveMode}) → {tier, decision_log}` and `recordOutcome({agent, bin, delegate, tier, status, costUsd, adaptiveMode}) → void`. Hides `pull` vs `pullWithDelegate` choice. Best-effort posterior write per D-04.
1412
- - `hooks/budget-enforcer.ts` (Plan 27.5-02) bandit consultation per Agent spawn after `resolved_models` is computed, before SDK call. Overrides `resolved_models[agent]` via `tier-resolver.cjs` when the bandit picks a different tier than the router emitted. Emits `bandit.tier_selected` event per spawn. Respects `tier_override:` frontmatter bypass (D-05), `adaptive_mode` gate (D-07), and the 80% auto-downgrade guard.
1413
- - `scripts/lib/session-runner/index.ts` (Plan 27.5-03) calls `recordOutcome()` after every `emit('session.completed', ...)` site (4 call sites: rate-limited, peer-success, turn-cap-zero, terminal retry-exit). Adds 3 optional fields to `SessionRunnerOptions`: `agent`, `bin`, `tier`. Posterior write is best-effort; missing fields silent.
1414
- - `agents/design-reflector.md` Section 8 (Plan 27.5-04) bandit-arbitrage analysis surfaces "agent X frontmatter says sonnet but bandit picks opus" as `[FRONTMATTER]` proposals after 3+ pulls with credible interval < 0.05 and ≥ 50% mean delta vs second-best tier (D-10). New module `scripts/lib/bandit-arbitrage.cjs` mirrors Phase 26-06's cost-arbitrage shape.
1415
- - `skills/peers/SKILL.md` Step 5 + new `skills/bandit-status/SKILL.md` (Plan 27.5-05) `/gdd:peers` now reads canonical posterior path `.design/telemetry/posterior.json` and renders real per-peer reward-delta when posterior is populated. New read-only `/gdd:bandit-status` skill surfaces per-`(agent, bin, delegate, tier)` posterior snapshots (alpha/beta/mean/stddev/count/last-used). Strictly read-only per D-11.
1416
- - `docs/BANDIT-INTEGRATION.md` + `reference/bandit-integration.md` (Plan 27.5-06) operator guide + developer cheat sheet.
1498
+ - **Phase 27.5 - Bandit Production Integration** (6 plans). Wires Phase 23.5's bandit posterior + Phase 27-07's `delegate?` dimension into a real production routing path. After v1.27.5, `default-tier:` becomes a default (cold-start prior), not a final answer - the bandit picks the final tier from measurement when `adaptive_mode: full`.
1499
+ - `scripts/lib/bandit-router/integration.cjs` (Plan 27.5-01) - thin shim exposing `consultBandit({agent, bin, delegate, agentFrontmatter, adaptiveMode}) → {tier, decision_log}` and `recordOutcome({agent, bin, delegate, tier, status, costUsd, adaptiveMode}) → void`. Hides `pull` vs `pullWithDelegate` choice. Best-effort posterior write per D-04.
1500
+ - `hooks/budget-enforcer.ts` (Plan 27.5-02) - bandit consultation per Agent spawn after `resolved_models` is computed, before SDK call. Overrides `resolved_models[agent]` via `tier-resolver.cjs` when the bandit picks a different tier than the router emitted. Emits `bandit.tier_selected` event per spawn. Respects `tier_override:` frontmatter bypass (D-05), `adaptive_mode` gate (D-07), and the 80% auto-downgrade guard.
1501
+ - `scripts/lib/session-runner/index.ts` (Plan 27.5-03) - calls `recordOutcome()` after every `emit('session.completed', ...)` site (4 call sites: rate-limited, peer-success, turn-cap-zero, terminal retry-exit). Adds 3 optional fields to `SessionRunnerOptions`: `agent`, `bin`, `tier`. Posterior write is best-effort; missing fields silent.
1502
+ - `agents/design-reflector.md` Section 8 (Plan 27.5-04) - bandit-arbitrage analysis surfaces "agent X frontmatter says sonnet but bandit picks opus" as `[FRONTMATTER]` proposals after 3+ pulls with credible interval < 0.05 and ≥ 50% mean delta vs second-best tier (D-10). New module `scripts/lib/bandit-arbitrage.cjs` mirrors Phase 26-06's cost-arbitrage shape.
1503
+ - `skills/peers/SKILL.md` Step 5 + new `skills/bandit-status/SKILL.md` (Plan 27.5-05) - `/gdd:peers` now reads canonical posterior path `.design/telemetry/posterior.json` and renders real per-peer reward-delta when posterior is populated. New read-only `/gdd:bandit-status` skill surfaces per-`(agent, bin, delegate, tier)` posterior snapshots (alpha/beta/mean/stddev/count/last-used). Strictly read-only per D-11.
1504
+ - `docs/BANDIT-INTEGRATION.md` + `reference/bandit-integration.md` (Plan 27.5-06) - operator guide + developer cheat sheet.
1417
1505
 
1418
1506
  ### Decisions locked
1419
1507
 
1420
1508
  - D-01: `hooks/budget-enforcer.ts` is the bandit consultation site (single canonical routing decision point).
1421
1509
  - D-02: Per-spawn timing, after `resolved_models` computed, before SDK call.
1422
1510
  - D-03: Override `resolved_models[agent]` with bandit tier through `tier-resolver.cjs`. Preserve `model_tier_overrides[agent]` unchanged (back-compat).
1423
- - D-04: `update()` called in session-runner's terminal-emit path after `session.completed`. Best-effort posterior write errors swallowed.
1511
+ - D-04: `update()` called in session-runner's terminal-emit path after `session.completed`. Best-effort posterior write - errors swallowed.
1424
1512
  - D-05: `tier_override:` frontmatter is the explicit per-agent bandit-bypass surface.
1425
1513
  - D-06: Posterior path stays at `.design/telemetry/posterior.json` (Phase 23.5 D-08 unchanged).
1426
1514
  - D-07: Bandit consultation gated by `adaptive_mode` (static + hedge silent; full active).
@@ -1432,37 +1520,37 @@ Closes 4 foundational-fundamentals gaps + 1 contrast layer surfaced by the 2026-
1432
1520
 
1433
1521
  ### Out of scope (deferred)
1434
1522
 
1435
- - Auto-failover when bandit recommends a delegate not in `enabled_peers` bandit stays advisory.
1436
- - Cross-cycle posterior decay Phase 23.5 D-12 already specifies discounted Thompson sampling.
1437
- - Per-task bandit dimensions beyond `(agent, bin, delegate)` needs convergence proof first.
1438
- - Removing frontmatter `default-tier:` additive only; deprecation is Phase 30+.
1439
- - Bandit-driven complexity_class selection different decision domain.
1523
+ - Auto-failover when bandit recommends a delegate not in `enabled_peers` - bandit stays advisory.
1524
+ - Cross-cycle posterior decay - Phase 23.5 D-12 already specifies discounted Thompson sampling.
1525
+ - Per-task bandit dimensions beyond `(agent, bin, delegate)` - needs convergence proof first.
1526
+ - Removing frontmatter `default-tier:` - additive only; deprecation is Phase 30+.
1527
+ - Bandit-driven complexity_class selection - different decision domain.
1440
1528
 
1441
1529
  ### Test coverage
1442
1530
 
1443
- - `tests/bandit-router-integration.test.cjs` 25+ tests covering all 5 paths × adaptive_mode × tier_override × delegate (Plan 27.5-01).
1444
- - `tests/budget-enforcer-bandit.test.cjs` 8+ tests for hook consultation branches (Plan 27.5-02).
1445
- - `tests/session-runner-bandit-outcome.test.cjs` 6+ tests for recordOutcome paths (Plan 27.5-03).
1446
- - `tests/bandit-arbitrage.test.cjs` 6+ tests for reflector analyzer (Plan 27.5-04).
1447
- - `tests/phase-27-5-baseline.test.cjs` manifests + baseline + integration-exports regression (Plan 27.5-06).
1531
+ - `tests/bandit-router-integration.test.cjs` - 25+ tests covering all 5 paths × adaptive_mode × tier_override × delegate (Plan 27.5-01).
1532
+ - `tests/budget-enforcer-bandit.test.cjs` - 8+ tests for hook consultation branches (Plan 27.5-02).
1533
+ - `tests/session-runner-bandit-outcome.test.cjs` - 6+ tests for recordOutcome paths (Plan 27.5-03).
1534
+ - `tests/bandit-arbitrage.test.cjs` - 6+ tests for reflector analyzer (Plan 27.5-04).
1535
+ - `tests/phase-27-5-baseline.test.cjs` - manifests + baseline + integration-exports regression (Plan 27.5-06).
1448
1536
 
1449
1537
  ---
1450
1538
 
1451
- ## [1.27.1] 2026-04-30
1539
+ ## [1.27.1] - 2026-04-30
1452
1540
 
1453
- Phase 27 wiring patch closes the production-integration gaps left by v1.27.0's "structural ship". v1.27.0 landed all peer-CLI library code + tests + docs but the helpers were exported without callers, so `delegate_to:` on agent frontmatter was validated and then ignored at runtime. v1.27.1 wires the four integration points so delegation actually fires for users who set `delegate_to:` AND allowlist the peer.
1541
+ Phase 27 wiring patch - closes the production-integration gaps left by v1.27.0's "structural ship". v1.27.0 landed all peer-CLI library code + tests + docs but the helpers were exported without callers, so `delegate_to:` on agent frontmatter was validated and then ignored at runtime. v1.27.1 wires the four integration points so delegation actually fires for users who set `delegate_to:` AND allowlist the peer.
1454
1542
 
1455
1543
  ### Fixed
1456
1544
 
1457
- - **`session-runner.run()` now invokes `tryDelegate` (Plan 27-06 wiring)** when `opts.delegateTo` is set to a `<peer>-<role>` value AND the registry can route AND the peer is in `.design/config.json#peer_cli.enabled_peers`, the prompt runs on the peer-CLI and `run()` returns the peer result. On peer-absent / peer-error / null result, falls through transparently to the local Anthropic SDK loop (D-07). Previously the `tryDelegate` helper existed in the file but `run()` never called it.
1545
+ - **`session-runner.run()` now invokes `tryDelegate` (Plan 27-06 wiring)** - when `opts.delegateTo` is set to a `<peer>-<role>` value AND the registry can route AND the peer is in `.design/config.json#peer_cli.enabled_peers`, the prompt runs on the peer-CLI and `run()` returns the peer result. On peer-absent / peer-error / null result, falls through transparently to the local Anthropic SDK loop (D-07). Previously the `tryDelegate` helper existed in the file but `run()` never called it.
1458
1546
 
1459
- - **Real `appendEvent('peer_call_started|complete|failed', ...)` emission (Plan 27-08 wiring)** replaced the stderr-only placeholder in session-runner with three real event-emission calls. Events flow through Phase 22's `appendEvent()` API using the constants registered in v1.27.0, tagged with `runtime_role: 'peer'` and `peer_id`. Reflector cross-runtime cost-arbitrage (Plan 26-06) now sees peer telemetry. `GDD_PEER_DEBUG=1` continues to mirror the failed events to stderr for live tailing.
1547
+ - **Real `appendEvent('peer_call_started|complete|failed', ...)` emission (Plan 27-08 wiring)** - replaced the stderr-only placeholder in session-runner with three real event-emission calls. Events flow through Phase 22's `appendEvent()` API using the constants registered in v1.27.0, tagged with `runtime_role: 'peer'` and `peer_id`. Reflector cross-runtime cost-arbitrage (Plan 26-06) now sees peer telemetry. `GDD_PEER_DEBUG=1` continues to mirror the failed events to stderr for live tailing.
1460
1548
 
1461
- - **`install.cjs` interactive peer-detection nudge (Plan 27-11 wiring)** after a successful (non-uninstall, non-dry-run) install in a TTY, scans `peerBinary` paths via `detectInstalledPeers()`. If 1+ peer detected, prompts via `@clack/prompts` with `confirm()` (default: NO). On yes, writes `.design/config.json#peer_cli.enabled_peers`. New `--no-peer-prompt` flag suppresses the prompt entirely (CI-friendly). Silent skip when zero peers detected. Default-NO preserves the opt-in trust contract (D-11).
1549
+ - **`install.cjs` interactive peer-detection nudge (Plan 27-11 wiring)** - after a successful (non-uninstall, non-dry-run) install in a TTY, scans `peerBinary` paths via `detectInstalledPeers()`. If 1+ peer detected, prompts via `@clack/prompts` with `confirm()` (default: NO). On yes, writes `.design/config.json#peer_cli.enabled_peers`. New `--no-peer-prompt` flag suppresses the prompt entirely (CI-friendly). Silent skip when zero peers detected. Default-NO preserves the opt-in trust contract (D-11).
1462
1550
 
1463
1551
  ### Out of scope (known, deferred)
1464
1552
 
1465
- - **Bandit `pullWithDelegate` caller (Plan 27-07 wiring)** `pullWithDelegate` and `updateWithDelegate` ship in the bandit module surface (v1.27.0) but no production caller invokes them yet. Wiring requires `gdd-router` SKILL.md change (procedural, not code) which is out of scope for a wiring patch. Phase 28+ territory once the integration shape is decided. The `delegate?` dimension stays exported as a library extension for ad-hoc use.
1553
+ - **Bandit `pullWithDelegate` caller (Plan 27-07 wiring)** - `pullWithDelegate` and `updateWithDelegate` ship in the bandit module surface (v1.27.0) but no production caller invokes them yet. Wiring requires `gdd-router` SKILL.md change (procedural, not code) which is out of scope for a wiring patch. Phase 28+ territory once the integration shape is decided. The `delegate?` dimension stays exported as a library extension for ad-hoc use.
1466
1554
 
1467
1555
  ### Tests
1468
1556
 
@@ -1472,215 +1560,215 @@ Phase 27 wiring patch — closes the production-integration gaps left by v1.27.0
1472
1560
 
1473
1561
  ---
1474
1562
 
1475
- ## [1.27.0] 2026-04-30
1563
+ ## [1.27.0] - 2026-04-30
1476
1564
 
1477
- Phase 27 Peer-CLI Delegation Layer milestone closes the **outbound** half of multi-runtime. Phase 24 made gdd installable on 14 runtimes; Phase 21 made the same pipeline run on each; Phase 26 made tier→model resolve correctly per runtime. v1.27.0 adds the missing piece: gdd agents OPTIONALLY delegate to local peer CLIs (Codex via App Server Protocol; Gemini/Cursor/Copilot/Qwen via Agent Client Protocol) when measurably cheaper or higher-quality for the role. Falls back to in-process Anthropic SDK when peer is unavailable. Honors Phase 26 tier maps + Phase 22 event chain + Phase 23.5 bandit posterior `delegate?` becomes another arm in `(agent_type × tier × delegate)` Thompson sampling, no new ML.
1565
+ Phase 27 Peer-CLI Delegation Layer milestone - closes the **outbound** half of multi-runtime. Phase 24 made gdd installable on 14 runtimes; Phase 21 made the same pipeline run on each; Phase 26 made tier→model resolve correctly per runtime. v1.27.0 adds the missing piece: gdd agents OPTIONALLY delegate to local peer CLIs (Codex via App Server Protocol; Gemini/Cursor/Copilot/Qwen via Agent Client Protocol) when measurably cheaper or higher-quality for the role. Falls back to in-process Anthropic SDK when peer is unavailable. Honors Phase 26 tier maps + Phase 22 event chain + Phase 23.5 bandit posterior - `delegate?` becomes another arm in `(agent_type × tier × delegate)` Thompson sampling, no new ML.
1478
1566
 
1479
1567
  ### Added
1480
1568
 
1481
- - **ACP client** `scripts/lib/peer-cli/acp-client.cjs` (Plan 27-01, commit `4a2d201`). Line-delimited JSON-RPC over stdio for Gemini/Cursor/Copilot/Qwen. `initialize` handshake, `prompt` method, notification stream, 16 MiB line-buffer overflow guard. 7 tests pass.
1482
- - **ASP client** `scripts/lib/peer-cli/asp-client.cjs` (Plan 27-02, commit `06fcdf6`). Codex App Server Protocol. `threadStart` + `threadResume` + `turn` lifecycle. `service_name = "gdd_peer_delegation"`. Error path resolves with `{status:"error"}` rather than throwing. 12 tests pass.
1483
- - **spawn-cmd Windows fix + broker-lifecycle** `scripts/lib/peer-cli/spawn-cmd.cjs` + `broker-lifecycle.cjs` (Plan 27-03, commit `f9228cf`). `.cmd` EINVAL workaround per cc-multi-cli `transport-decisions.md` (D-04). Long-lived broker per `(peer, workspace)` over Unix socket on POSIX, named pipe on Windows (D-03). 18 tests pass.
1484
- - **Per-peer adapters** `scripts/lib/peer-cli/adapters/{codex,gemini,cursor,copilot,qwen}.cjs` (Plan 27-04, commit `d58ab4f`). 5 thin wrappers with role→prompt-prefix maps + slash-command translation. 39 tests pass.
1485
- - **Registry + capability matrix** `scripts/lib/peer-cli/registry.cjs` + `reference/peer-cli-capabilities.md` (Plan 27-05, commit `6ef4d27`). `findPeerFor(role, tier)` central dispatch, per-peer health probe, deterministic alphabetical tie-break. Per-peer capability matrix (D-05): codex→execute, gemini→research/exploration, cursor→debug/plan, copilot→review/research, qwen→write. 32 tests pass.
1486
- - **Agent `delegate_to:` frontmatter + session-runner peer-first dispatch** `scripts/validate-frontmatter.ts` + `scripts/lib/session-runner/index.ts` (Plan 27-06, commit `4644d8e`). Optional additive frontmatter field; values are `<peer>-<role>` per capability matrix or `none` (explicit opt-out). Session-runner tries delegate first; transparent fallback on peer-absent OR peer-error per D-07. 8 tests pass.
1487
- - **Bandit posterior `delegate?` context dimension** `scripts/lib/bandit-router.cjs` (Plan 27-07, commit `824bcf5`). Arm space expands from `(agent_type, touches_size_bin)` to `(agent_type, touches_size_bin, delegate)` where `delegate ∈ {none, gemini, codex, cursor, copilot, qwen}`. Bootstrap: existing priors carry forward as the `none` arm; 5 delegation arms start neutral. Reward signal unchanged (two-stage lexicographic). 12 tests pass.
1488
- - **Event chain `runtime_role` + `peer_id` + `peer_call_*` event types** `scripts/lib/event-stream/types.ts` + `index.ts` + `scripts/lib/budget-enforcer.cjs` (Plan 27-08, commit `fd561ed`). Additive Phase 22 extension every event optionally tags `runtime_role: "host" | "peer"` (defaults `"host"` for back-compat) and `peer_id`. 3 new event types: `peer_call_started`, `peer_call_complete`, `peer_call_failed`. costs.jsonl cost rows tag the same fields so Phase 26's reflector cost-arbitrage extends naturally. 8 tests pass.
1489
- - **`/gdd:peers` capability matrix command** `skills/peers/SKILL.md` (Plan 27-09, commit `51ae40e`). Single-command discoverability markdown table with peer × installed? × allowlisted? × claimed roles × posterior delta vs local.
1490
- - **`peer-cli-customize` + `peer-cli-add` skills** `skills/peer-cli-customize/SKILL.md` + `skills/peer-cli-add/SKILL.md` (Plan 27-10, commit `4f07daf`). Customize rewires per-agent `delegate_to:` mappings; add walks the verification ladder for adding a brand-new peer (Apache 2.0 attribution comment in each see NOTICE).
1491
- - **`peerBinary?` field on runtimes + detection helpers** `scripts/lib/install/runtimes.cjs` (Plan 27-11, commit `0e2fb92`). 5 peer-capable runtimes (codex, gemini, cursor, copilot, qwen) gain platform-aware `peerBinary` paths. `listPeerCapableRuntimes()` and `detectInstalledPeers()` exported for `/gdd:peers` and the install-time nudge. 8 tests pass.
1569
+ - **ACP client** - `scripts/lib/peer-cli/acp-client.cjs` (Plan 27-01, commit `4a2d201`). Line-delimited JSON-RPC over stdio for Gemini/Cursor/Copilot/Qwen. `initialize` handshake, `prompt` method, notification stream, 16 MiB line-buffer overflow guard. 7 tests pass.
1570
+ - **ASP client** - `scripts/lib/peer-cli/asp-client.cjs` (Plan 27-02, commit `06fcdf6`). Codex App Server Protocol. `threadStart` + `threadResume` + `turn` lifecycle. `service_name = "gdd_peer_delegation"`. Error path resolves with `{status:"error"}` rather than throwing. 12 tests pass.
1571
+ - **spawn-cmd Windows fix + broker-lifecycle** - `scripts/lib/peer-cli/spawn-cmd.cjs` + `broker-lifecycle.cjs` (Plan 27-03, commit `f9228cf`). `.cmd` EINVAL workaround per cc-multi-cli `transport-decisions.md` (D-04). Long-lived broker per `(peer, workspace)` over Unix socket on POSIX, named pipe on Windows (D-03). 18 tests pass.
1572
+ - **Per-peer adapters** - `scripts/lib/peer-cli/adapters/{codex,gemini,cursor,copilot,qwen}.cjs` (Plan 27-04, commit `d58ab4f`). 5 thin wrappers with role→prompt-prefix maps + slash-command translation. 39 tests pass.
1573
+ - **Registry + capability matrix** - `scripts/lib/peer-cli/registry.cjs` + `reference/peer-cli-capabilities.md` (Plan 27-05, commit `6ef4d27`). `findPeerFor(role, tier)` central dispatch, per-peer health probe, deterministic alphabetical tie-break. Per-peer capability matrix (D-05): codex→execute, gemini→research/exploration, cursor→debug/plan, copilot→review/research, qwen→write. 32 tests pass.
1574
+ - **Agent `delegate_to:` frontmatter + session-runner peer-first dispatch** - `scripts/validate-frontmatter.ts` + `scripts/lib/session-runner/index.ts` (Plan 27-06, commit `4644d8e`). Optional additive frontmatter field; values are `<peer>-<role>` per capability matrix or `none` (explicit opt-out). Session-runner tries delegate first; transparent fallback on peer-absent OR peer-error per D-07. 8 tests pass.
1575
+ - **Bandit posterior `delegate?` context dimension** - `scripts/lib/bandit-router.cjs` (Plan 27-07, commit `824bcf5`). Arm space expands from `(agent_type, touches_size_bin)` to `(agent_type, touches_size_bin, delegate)` where `delegate ∈ {none, gemini, codex, cursor, copilot, qwen}`. Bootstrap: existing priors carry forward as the `none` arm; 5 delegation arms start neutral. Reward signal unchanged (two-stage lexicographic). 12 tests pass.
1576
+ - **Event chain `runtime_role` + `peer_id` + `peer_call_*` event types** - `scripts/lib/event-stream/types.ts` + `index.ts` + `scripts/lib/budget-enforcer.cjs` (Plan 27-08, commit `fd561ed`). Additive Phase 22 extension - every event optionally tags `runtime_role: "host" | "peer"` (defaults `"host"` for back-compat) and `peer_id`. 3 new event types: `peer_call_started`, `peer_call_complete`, `peer_call_failed`. costs.jsonl cost rows tag the same fields so Phase 26's reflector cost-arbitrage extends naturally. 8 tests pass.
1577
+ - **`/gdd:peers` capability matrix command** - `skills/peers/SKILL.md` (Plan 27-09, commit `51ae40e`). Single-command discoverability - markdown table with peer × installed? × allowlisted? × claimed roles × posterior delta vs local.
1578
+ - **`peer-cli-customize` + `peer-cli-add` skills** - `skills/peer-cli-customize/SKILL.md` + `skills/peer-cli-add/SKILL.md` (Plan 27-10, commit `4f07daf`). Customize rewires per-agent `delegate_to:` mappings; add walks the verification ladder for adding a brand-new peer (Apache 2.0 attribution comment in each - see NOTICE).
1579
+ - **`peerBinary?` field on runtimes + detection helpers** - `scripts/lib/install/runtimes.cjs` (Plan 27-11, commit `0e2fb92`). 5 peer-capable runtimes (codex, gemini, cursor, copilot, qwen) gain platform-aware `peerBinary` paths. `listPeerCapableRuntimes()` and `detectInstalledPeers()` exported for `/gdd:peers` and the install-time nudge. 8 tests pass.
1492
1580
 
1493
1581
  ### Tests
1494
1582
 
1495
1583
  - 11 new test files (148 total new test cases) covering protocol clients, registry, adapters, frontmatter delegation, bandit dimension, event tagging, peer detection, end-to-end peer-call flow, and the phase-27 baseline.
1496
- - Phase 24/25/26 baseline tests refactored to be **version-agnostic** (D-12) they read `package.json#version` dynamically and assert all 4 manifests align. No more literal-version hardcodes that break every closeout (Phase 26 lesson applied).
1584
+ - Phase 24/25/26 baseline tests refactored to be **version-agnostic** (D-12) - they read `package.json#version` dynamically and assert all 4 manifests align. No more literal-version hardcodes that break every closeout (Phase 26 lesson applied).
1497
1585
 
1498
1586
  ### Decisions
1499
1587
 
1500
- D-01 through D-14 see `.planning/phases/27-peer-cli-delegation/CONTEXT.md` for the full decision register. Highlights:
1588
+ D-01 through D-14 - see `.planning/phases/27-peer-cli-delegation/CONTEXT.md` for the full decision register. Highlights:
1501
1589
 
1502
- - **D-01 / D-02** ACP for 4 peers, ASP for Codex. Port shapes from cc-multi-cli (Apache 2.0) with `NOTICE` attribution; do NOT vendor their hub (Claude-as-host assumption is incompatible with our any-runtime-as-host model).
1503
- - **D-03 / D-04** Long-lived broker per `(peer, workspace)`. Windows `.cmd` EINVAL workaround documented in `spawn-cmd.cjs` so future maintainers don't "clean it up".
1504
- - **D-05** Per-peer capability matrix is the dispatch source-of-truth. Roles a peer doesn't claim → registry refuses dispatch.
1505
- - **D-06 / D-07** `delegate_to:` is additive optional; `none` is explicit opt-out; fallback on peer-absent OR peer-error is transparent to the calling skill.
1506
- - **D-08** Bandit posterior gains `delegate?` dimension. 6× context expansion (~78 → ~468 contexts). Bootstrap discipline: existing priors carry forward as `delegate=none`; 5 delegation arms start neutral.
1507
- - **D-09** Event chain extension is additive; `runtime_role` defaults `"host"` for back-compat; only the new `peer_call_*` events MUST carry `"peer"`.
1508
- - **D-10 / D-11** `/gdd:peers` is single-command discoverability; install-time nudge is OPT-IN (default empty `enabled_peers`); `--no-peer-prompt` flag suppresses for CI.
1509
- - **D-12** Version-agnostic baseline tests (Phase 26 closeout lesson). `phase-NN-baseline.test.cjs` no longer hardcodes literal versions.
1510
- - **D-14** `NOTICE` Apache 2.0 attribution for cc-multi-cli ships with v1.27.0 (mandatory per Apache 2.0 §4 for derivative-shape code).
1590
+ - **D-01 / D-02** - ACP for 4 peers, ASP for Codex. Port shapes from cc-multi-cli (Apache 2.0) with `NOTICE` attribution; do NOT vendor their hub (Claude-as-host assumption is incompatible with our any-runtime-as-host model).
1591
+ - **D-03 / D-04** - Long-lived broker per `(peer, workspace)`. Windows `.cmd` EINVAL workaround documented in `spawn-cmd.cjs` so future maintainers don't "clean it up".
1592
+ - **D-05** - Per-peer capability matrix is the dispatch source-of-truth. Roles a peer doesn't claim → registry refuses dispatch.
1593
+ - **D-06 / D-07** - `delegate_to:` is additive optional; `none` is explicit opt-out; fallback on peer-absent OR peer-error is transparent to the calling skill.
1594
+ - **D-08** - Bandit posterior gains `delegate?` dimension. 6× context expansion (~78 → ~468 contexts). Bootstrap discipline: existing priors carry forward as `delegate=none`; 5 delegation arms start neutral.
1595
+ - **D-09** - Event chain extension is additive; `runtime_role` defaults `"host"` for back-compat; only the new `peer_call_*` events MUST carry `"peer"`.
1596
+ - **D-10 / D-11** - `/gdd:peers` is single-command discoverability; install-time nudge is OPT-IN (default empty `enabled_peers`); `--no-peer-prompt` flag suppresses for CI.
1597
+ - **D-12** - Version-agnostic baseline tests (Phase 26 closeout lesson). `phase-NN-baseline.test.cjs` no longer hardcodes literal versions.
1598
+ - **D-14** - `NOTICE` Apache 2.0 attribution for cc-multi-cli ships with v1.27.0 (mandatory per Apache 2.0 §4 for derivative-shape code).
1511
1599
 
1512
1600
  ### Documentation
1513
1601
 
1514
- - `docs/PEER-DELEGATION.md` (new) ops guide covering when delegation fires, how to disable per-peer, fallback diagnostics, broker lifecycle troubleshooting, and Windows `.cmd` quirks.
1515
- - `reference/peer-protocols.md` (new) ACP + ASP protocol cheat sheet for protocol authors and skill writers.
1516
- - `agents/README.md` new `Peer-CLI delegation (delegate_to)` section documenting the field, valid values, opt-in gating, telemetry hookup, and cross-references.
1517
- - `NOTICE` (new) Apache 2.0 attribution for cc-multi-cli's `acp-client.mjs`, `asp-client.mjs`, `transport-decisions.md`, and `customize` / `multi-cli-anything` skill patterns.
1602
+ - `docs/PEER-DELEGATION.md` (new) - ops guide covering when delegation fires, how to disable per-peer, fallback diagnostics, broker lifecycle troubleshooting, and Windows `.cmd` quirks.
1603
+ - `reference/peer-protocols.md` (new) - ACP + ASP protocol cheat sheet for protocol authors and skill writers.
1604
+ - `agents/README.md` - new `Peer-CLI delegation (delegate_to)` section documenting the field, valid values, opt-in gating, telemetry hookup, and cross-references.
1605
+ - `NOTICE` (new) - Apache 2.0 attribution for cc-multi-cli's `acp-client.mjs`, `asp-client.mjs`, `transport-decisions.md`, and `customize` / `multi-cli-anything` skill patterns.
1518
1606
 
1519
1607
  ### Known gaps
1520
1608
 
1521
- - Plan 27-11's interactive post-install peer-detection prompt (the `npx get-design-done` UX nudge: "I see you have Codex + Gemini installed wire them as peers? [y/N]") is documented in CONTEXT.md D-11 but not yet wired into `scripts/install.cjs`. The detection helper (`detectInstalledPeers()`) IS shipped what's missing is the `@clack/prompts` interactive integration. Users can manually populate `.design/config.json#peer_cli.enabled_peers` for now; `/gdd:peers` shows the current state. Tracked for Phase 28 hygiene or a 1.27.x patch if demand warrants.
1609
+ - Plan 27-11's interactive post-install peer-detection prompt (the `npx get-design-done` UX nudge: "I see you have Codex + Gemini installed - wire them as peers? [y/N]") is documented in CONTEXT.md D-11 but not yet wired into `scripts/install.cjs`. The detection helper (`detectInstalledPeers()`) IS shipped - what's missing is the `@clack/prompts` interactive integration. Users can manually populate `.design/config.json#peer_cli.enabled_peers` for now; `/gdd:peers` shows the current state. Tracked for Phase 28 hygiene or a 1.27.x patch if demand warrants.
1522
1610
 
1523
1611
  ---
1524
1612
 
1525
- ## [1.26.0] 2026-04-29
1613
+ ## [1.26.0] - 2026-04-29
1526
1614
 
1527
- Phase 26 Headless Model Resolver milestone closes the model-selection gap left by Phase 24's distribution headlessness. `default-tier: opus|sonnet|haiku` frontmatter now actually does something on the 13 non-Claude runtimes the multi-runtime installer ships to. Three layers gain runtime-awareness without a breaking change: the agent frontmatter (additive `reasoning-class` alias), the router output (additive `resolved_models` field), and the cost telemetry (per-runtime price tables + runtime-tagged events.jsonl rows). The phase ships **structure** adapter layer, resolvers, schemas, contracts not editorial picks for which model each runtime treats as opus/sonnet/haiku; those come from runtime adapter authors with provenance citations baked into `reference/runtime-models.md`.
1615
+ Phase 26 Headless Model Resolver milestone - closes the model-selection gap left by Phase 24's distribution headlessness. `default-tier: opus|sonnet|haiku` frontmatter now actually does something on the 13 non-Claude runtimes the multi-runtime installer ships to. Three layers gain runtime-awareness without a breaking change: the agent frontmatter (additive `reasoning-class` alias), the router output (additive `resolved_models` field), and the cost telemetry (per-runtime price tables + runtime-tagged events.jsonl rows). The phase ships **structure** - adapter layer, resolvers, schemas, contracts - not editorial picks for which model each runtime treats as opus/sonnet/haiku; those come from runtime adapter authors with provenance citations baked into `reference/runtime-models.md`.
1528
1616
 
1529
1617
  ### Added
1530
1618
 
1531
- - **Per-runtime tier→model adapter source-of-truth** `reference/runtime-models.md` ships the canonical map for all 14 runtimes (claude, codex, gemini, qwen, kilo, copilot, cursor, windsurf, antigravity, augment, trae, codebuddy, cline, opencode). Each row carries `tier_to_model` (`opus`/`sonnet`/`haiku`), `reasoning_class_to_model` (`high`/`medium`/`low`), and a `provenance` array (source URL + retrieval timestamp + last-validated cycle) per D-01. Schema lives at `reference/schemas/runtime-models.schema.json` with `$schema_version: 1` for forward-compatible bumps (D-03). Pure-JS strict validator at `scripts/lib/install/parse-runtime-models.cjs` no `ajv` dependency at the parser layer; install-time validation catches typos before runtime. Canonical seed picks per D-02: `claude → claude-opus-4-7 / claude-sonnet-4-7 / claude-haiku-4-5`, `codex → gpt-5 / gpt-5-mini / gpt-5-nano`, `gemini → gemini-2.5-pro / gemini-2.5-flash / gemini-2.5-flash-lite`, `qwen → qwen3-max / qwen3-plus / qwen3-flash`. (Plan 26-01, commit `5541086`)
1619
+ - **Per-runtime tier→model adapter source-of-truth** - `reference/runtime-models.md` ships the canonical map for all 14 runtimes (claude, codex, gemini, qwen, kilo, copilot, cursor, windsurf, antigravity, augment, trae, codebuddy, cline, opencode). Each row carries `tier_to_model` (`opus`/`sonnet`/`haiku`), `reasoning_class_to_model` (`high`/`medium`/`low`), and a `provenance` array (source URL + retrieval timestamp + last-validated cycle) per D-01. Schema lives at `reference/schemas/runtime-models.schema.json` with `$schema_version: 1` for forward-compatible bumps (D-03). Pure-JS strict validator at `scripts/lib/install/parse-runtime-models.cjs` - no `ajv` dependency at the parser layer; install-time validation catches typos before runtime. Canonical seed picks per D-02: `claude → claude-opus-4-7 / claude-sonnet-4-7 / claude-haiku-4-5`, `codex → gpt-5 / gpt-5-mini / gpt-5-nano`, `gemini → gemini-2.5-pro / gemini-2.5-flash / gemini-2.5-flash-lite`, `qwen → qwen3-max / qwen3-plus / qwen3-flash`. (Plan 26-01, commit `5541086`)
1532
1620
 
1533
- - **`tier-resolver.cjs` + `runtime-detect.cjs`** `scripts/lib/tier-resolver.cjs` exports `resolve(runtime, tier, opts?) → model-string | null` translating frontmatter tier vocabulary into the concrete model name a specific runtime understands. Fallback chain per D-04: (1) runtime-specific entry → use; (2) claude row → use with `tier_resolution_fallback` event; (3) null + `tier_resolution_failed` event. Never throws null is a valid output the consumer must handle. `scripts/lib/runtime-detect.cjs` exports `detect()` which reads the same `*_CONFIG_DIR` / `*_HOME` env-var chain Phase 24's installer uses (D-05); the env-var → runtime-ID mapping is owned by `scripts/lib/install/runtimes.cjs` and re-derived here so adding a runtime in one place automatically extends detection. Returns null when no recognized env-var is set (e.g. CI matrix, bare Node script). (Plan 26-02, commits `4bf7dea`, `c0bbae3`)
1621
+ - **`tier-resolver.cjs` + `runtime-detect.cjs`** - `scripts/lib/tier-resolver.cjs` exports `resolve(runtime, tier, opts?) → model-string | null` translating frontmatter tier vocabulary into the concrete model name a specific runtime understands. Fallback chain per D-04: (1) runtime-specific entry → use; (2) claude row → use with `tier_resolution_fallback` event; (3) null + `tier_resolution_failed` event. Never throws - null is a valid output the consumer must handle. `scripts/lib/runtime-detect.cjs` exports `detect()` which reads the same `*_CONFIG_DIR` / `*_HOME` env-var chain Phase 24's installer uses (D-05); the env-var → runtime-ID mapping is owned by `scripts/lib/install/runtimes.cjs` and re-derived here so adding a runtime in one place automatically extends detection. Returns null when no recognized env-var is set (e.g. CI matrix, bare Node script). (Plan 26-02, commits `4bf7dea`, `c0bbae3`)
1534
1622
 
1535
- - **Installer emits `models.json` per runtime config-dir** `scripts/lib/install/runtimes.cjs` gains a `tier_to_model` field; `installer.cjs` writes a `models.json` payload at install time per runtime config-dir per D-06: `{ tier_to_model, reasoning_class_to_model, runtime, schema_version: 1, generated_at: <ISO>, source: "reference/runtime-models.md" }`. `--dry-run` shows the same set without writing; `uninstall` removes the file (clean uninstall guarantee from Phase 24 carries forward). One file per config-dir means runtime harnesses can read it at session start without parsing markdown. (Plan 26-03, commit `2ab47cf`)
1623
+ - **Installer emits `models.json` per runtime config-dir** - `scripts/lib/install/runtimes.cjs` gains a `tier_to_model` field; `installer.cjs` writes a `models.json` payload at install time per runtime config-dir per D-06: `{ tier_to_model, reasoning_class_to_model, runtime, schema_version: 1, generated_at: <ISO>, source: "reference/runtime-models.md" }`. `--dry-run` shows the same set without writing; `uninstall` removes the file (clean uninstall guarantee from Phase 24 carries forward). One file per config-dir means runtime harnesses can read it at session start without parsing markdown. (Plan 26-03, commit `2ab47cf`)
1536
1624
 
1537
- - **Router emits `resolved_models` field** `skills/router/SKILL.md` JSON output gains `resolved_models: { "agent_name": "concrete-model-id", … }` next to the existing `model_tier_overrides` per D-07. Strict superset over v1.25.0: existing consumers reading `model_tier_overrides` keep working unchanged (enum stays `opus|sonnet|haiku` for back-compat across all 14 runtimes); new consumers (budget-enforcer cost computation, Phase 22 cost telemetry, Phase 23.5 bandit posterior store) read `resolved_models` for runtime-correct cost. Output schema versioning table bumped: `resolved_models` lands at v1.26.0 (26-04), `complexity_class` (Phase 25) and `model_tier_overrides` (legacy) preserved unchanged. (Plan 26-04, commit `eb38d4e`)
1625
+ - **Router emits `resolved_models` field** - `skills/router/SKILL.md` JSON output gains `resolved_models: { "agent_name": "concrete-model-id", … }` next to the existing `model_tier_overrides` per D-07. Strict superset over v1.25.0: existing consumers reading `model_tier_overrides` keep working unchanged (enum stays `opus|sonnet|haiku` for back-compat across all 14 runtimes); new consumers (budget-enforcer cost computation, Phase 22 cost telemetry, Phase 23.5 bandit posterior store) read `resolved_models` for runtime-correct cost. Output schema versioning table bumped: `resolved_models` lands at v1.26.0 (26-04), `complexity_class` (Phase 25) and `model_tier_overrides` (legacy) preserved unchanged. (Plan 26-04, commit `eb38d4e`)
1538
1626
 
1539
- - **Per-runtime price tables + budget-enforcer shared backend** `reference/model-prices.md` becomes a router that links to per-runtime sub-tables under `reference/prices/`: `claude.md` (Anthropic), `codex.md` (OpenAI Codex gpt-5 family), `gemini.md` (Google Gemini 2.5 family), `qwen.md` (Alibaba Qwen 3 family) carry confirmed prices; the remaining 10 runtimes ship as stubs with provenance citation TODOs per D-08. `scripts/lib/budget-enforcer.cjs` exports `computeCost({ model_id?, tier?, runtime, tokens_in, tokens_out, cache_hit? })` with the four-step lookup order (runtime price-table by model_id → runtime by tier → claude fallback by model_id → claude by tier → null + diagnostic reason). `hooks/budget-enforcer.ts` reaches into the shared backend via `createRequire` same scheme as `rate-guard.cjs`. Cost telemetry events.jsonl rows tag `runtime` (Phase 22 event chain), so the cost-aggregator rolls up per-runtime AND per-tier for apples-to-apples comparison. (Plan 26-05, commit `57bf43e`)
1627
+ - **Per-runtime price tables + budget-enforcer shared backend** - `reference/model-prices.md` becomes a router that links to per-runtime sub-tables under `reference/prices/`: `claude.md` (Anthropic), `codex.md` (OpenAI Codex gpt-5 family), `gemini.md` (Google Gemini 2.5 family), `qwen.md` (Alibaba Qwen 3 family) carry confirmed prices; the remaining 10 runtimes ship as stubs with provenance citation TODOs per D-08. `scripts/lib/budget-enforcer.cjs` exports `computeCost({ model_id?, tier?, runtime, tokens_in, tokens_out, cache_hit? })` with the four-step lookup order (runtime price-table by model_id → runtime by tier → claude fallback by model_id → claude by tier → null + diagnostic reason). `hooks/budget-enforcer.ts` reaches into the shared backend via `createRequire` - same scheme as `rate-guard.cjs`. Cost telemetry events.jsonl rows tag `runtime` (Phase 22 event chain), so the cost-aggregator rolls up per-runtime AND per-tier for apples-to-apples comparison. (Plan 26-05, commit `57bf43e`)
1540
1628
 
1541
- - **Reflector cross-runtime cost-arbitrage** `scripts/lib/cost-arbitrage.cjs` and reflector wiring surface a structured proposal when one runtime's spend exceeds another's by >50% on the same `(agent, tier)` per D-09. Mixed-runtime cycle history (some agent spawns ran in CC, others in Codex within the same cycle) is handled without crash or per-runtime double-count. Reflector emits `runtime_arbitrage_signal` events with both runtime IDs, the agent/tier pair, the observed spread, and the recommended cheaper-runtime tag. The 50% threshold is a starting heuristic bandit-style learning over arbitrage outcomes is Phase 23.5+ territory. (Plan 26-06, commit `5de824c`)
1629
+ - **Reflector cross-runtime cost-arbitrage** - `scripts/lib/cost-arbitrage.cjs` and reflector wiring surface a structured proposal when one runtime's spend exceeds another's by >50% on the same `(agent, tier)` per D-09. Mixed-runtime cycle history (some agent spawns ran in CC, others in Codex within the same cycle) is handled without crash or per-runtime double-count. Reflector emits `runtime_arbitrage_signal` events with both runtime IDs, the agent/tier pair, the observed spread, and the recommended cheaper-runtime tag. The 50% threshold is a starting heuristic - bandit-style learning over arbitrage outcomes is Phase 23.5+ territory. (Plan 26-06, commit `5de824c`)
1542
1630
 
1543
- - **`reasoning-class` runtime-neutral frontmatter alias** `agents/README.md` documents `reasoning-class: high|medium|low` as an additive alias for `default-tier` per D-10. v1.26 ships the alias with full equivalence semantics (`high ↔ opus`, `medium ↔ sonnet`, `low ↔ haiku`) but does not deprecate `default-tier`. Both fields may coexist on the same agent; mismatched dual annotations are a validation error (D-11). Long-term winner is data-gated: alias adoption signal measured by `gdd-intel-updater` on `agents/*.md` changes; if alias share stays below 50% by Phase 28, `default-tier` is canonical and alias is deprecated; if alias wins majority, the reverse. Same evidence-gating discipline as Phase 23.5's deferred items. (Plan 26-07, commit `be3e590`)
1631
+ - **`reasoning-class` runtime-neutral frontmatter alias** - `agents/README.md` documents `reasoning-class: high|medium|low` as an additive alias for `default-tier` per D-10. v1.26 ships the alias with full equivalence semantics (`high ↔ opus`, `medium ↔ sonnet`, `low ↔ haiku`) but does not deprecate `default-tier`. Both fields may coexist on the same agent; mismatched dual annotations are a validation error (D-11). Long-term winner is data-gated: alias adoption signal measured by `gdd-intel-updater` on `agents/*.md` changes; if alias share stays below 50% by Phase 28, `default-tier` is canonical and alias is deprecated; if alias wins majority, the reverse. Same evidence-gating discipline as Phase 23.5's deferred items. (Plan 26-07, commit `be3e590`)
1544
1632
 
1545
- - **Frontmatter validator + intel-updater integration** `scripts/validate-frontmatter.ts` accepts optional `reasoning-class` enum; if both `default-tier` and `reasoning-class` are present, equivalence is enforced (`high+opus` / `medium+sonnet` / `low+haiku` mismatch is a validation error per D-11). `gdd-intel-updater` re-runs on changes under `agents/*.md` to keep `.design/intel/agent-tiers.json` current with **both** fields populated for downstream tooling. Tests assert tier↔class equivalence across all 26 agents. (Plan 26-08, commit `14afa72`)
1633
+ - **Frontmatter validator + intel-updater integration** - `scripts/validate-frontmatter.ts` accepts optional `reasoning-class` enum; if both `default-tier` and `reasoning-class` are present, equivalence is enforced (`high+opus` / `medium+sonnet` / `low+haiku` - mismatch is a validation error per D-11). `gdd-intel-updater` re-runs on changes under `agents/*.md` to keep `.design/intel/agent-tiers.json` current with **both** fields populated for downstream tooling. Tests assert tier↔class equivalence across all 26 agents. (Plan 26-08, commit `14afa72`)
1546
1634
 
1547
- - **`docs/MULTI-RUNTIME-MODELS.md`** Plan 26-09 ships an ops guide covering: how to add a new runtime tier-map (edit `reference/runtime-models.md`, follow schema, run the parser test), the `reasoning-class ↔ default-tier` equivalence table, the `tier-resolver.cjs` fallback chain (runtime entry → claude row + warn event → null + fail event), how cost telemetry rolls up (per-runtime + per-tier), and the future `budget.json#runtime_overrides.<runtime>.tier_to_model` per-runtime override hook.
1635
+ - **`docs/MULTI-RUNTIME-MODELS.md`** - Plan 26-09 ships an ops guide covering: how to add a new runtime tier-map (edit `reference/runtime-models.md`, follow schema, run the parser test), the `reasoning-class ↔ default-tier` equivalence table, the `tier-resolver.cjs` fallback chain (runtime entry → claude row + warn event → null + fail event), how cost telemetry rolls up (per-runtime + per-tier), and the future `budget.json#runtime_overrides.<runtime>.tier_to_model` per-runtime override hook.
1548
1636
 
1549
1637
  ### Tests
1550
1638
 
1551
- - `tests/runtime-models-schema.test.cjs` (new) calls `parseRuntimeModels()` from the dependency-free pure-JS parser at `scripts/lib/install/parse-runtime-models.cjs` (no `ajv` pulled in the parser does strict validation natively), asserts `$schema_version === 1`, all 14 runtime IDs from `runtimes.cjs` present, canonical seed picks correct (claude→claude-opus-4-7, codex→gpt-5, gemini→gemini-2.5-pro, qwen→qwen3-max), and provenance fields present per row.
1552
- - `tests/router-resolved-models.test.cjs` (new) content-level assertions on `skills/router/SKILL.md`: `resolved_models` mentioned in the JSON example, in the field docstring, and at v1.26.0 in the Output schema versioning table; `complexity_class` (Phase 25) still mentioned (no regression); `model_tier_overrides` still mentioned (back-compat).
1553
- - `tests/budget-enforcer-runtime-aware.test.cjs` (new) pure-function tests of `scripts/lib/budget-enforcer.cjs#computeCost()`: codex/gpt-5-mini path returns cost from `reference/prices/codex.md`; claude/opus path returns cost from `reference/prices/claude.md`; missing-runtime / missing-tier falls back to claude with the `fallback: true` flag; cache-hit path swaps `cached_input_per_1m` for `input_per_1m`.
1554
- - `tests/phase-26-baseline.test.cjs` (new) same shape as `phase-25-baseline.test.cjs`. Asserts all 9 plans landed (runtime-models source + tier-resolver + runtime-detect + installer models.json + router resolved_models + budget-enforcer + cost-arbitrage + reasoning-class alias + frontmatter validator extension) plus all 4 manifests align at 1.26.0 + CHANGELOG `## [1.26.0]` block exists.
1639
+ - `tests/runtime-models-schema.test.cjs` (new) - calls `parseRuntimeModels()` from the dependency-free pure-JS parser at `scripts/lib/install/parse-runtime-models.cjs` (no `ajv` pulled in - the parser does strict validation natively), asserts `$schema_version === 1`, all 14 runtime IDs from `runtimes.cjs` present, canonical seed picks correct (claude→claude-opus-4-7, codex→gpt-5, gemini→gemini-2.5-pro, qwen→qwen3-max), and provenance fields present per row.
1640
+ - `tests/router-resolved-models.test.cjs` (new) - content-level assertions on `skills/router/SKILL.md`: `resolved_models` mentioned in the JSON example, in the field docstring, and at v1.26.0 in the Output schema versioning table; `complexity_class` (Phase 25) still mentioned (no regression); `model_tier_overrides` still mentioned (back-compat).
1641
+ - `tests/budget-enforcer-runtime-aware.test.cjs` (new) - pure-function tests of `scripts/lib/budget-enforcer.cjs#computeCost()`: codex/gpt-5-mini path returns cost from `reference/prices/codex.md`; claude/opus path returns cost from `reference/prices/claude.md`; missing-runtime / missing-tier falls back to claude with the `fallback: true` flag; cache-hit path swaps `cached_input_per_1m` for `input_per_1m`.
1642
+ - `tests/phase-26-baseline.test.cjs` (new) - same shape as `phase-25-baseline.test.cjs`. Asserts all 9 plans landed (runtime-models source + tier-resolver + runtime-detect + installer models.json + router resolved_models + budget-enforcer + cost-arbitrage + reasoning-class alias + frontmatter validator extension) plus all 4 manifests align at 1.26.0 + CHANGELOG `## [1.26.0]` block exists.
1555
1643
  - `tests/semver-compare.test.cjs` `OFF_CADENCE_VERSIONS` gains `1.26.0` with the milestone summary.
1556
1644
 
1557
1645
  ### Decisions
1558
1646
 
1559
- D-01 through D-13 see `.planning/phases/26-headless-model-resolver/CONTEXT.md` for the full register. Highlights:
1560
- - **D-01** `reference/runtime-models.md` is the single source of truth for all 14 runtimes; each row carries provenance (URL + retrieval timestamp + last-validated cycle) so the future authority-watcher can flag drift.
1561
- - **D-04** `tier-resolver.cjs` fallback chain is non-blocking: runtime entry → claude row + warning event → null + fail event. Never throws; null is a valid output the consumer must handle.
1562
- - **D-05** `runtime-detect.cjs` reuses Phase 24's env-var → runtime-ID mapping verbatim; single source of truth lives in `runtimes.cjs`. Adding a new runtime extends both detection and installation.
1563
- - **D-07** `resolved_models` is additive to `model_tier_overrides` strict superset, same back-compat discipline as Phase 25's `complexity_class` next to `path`.
1564
- - **D-08** Cost telemetry split: `reference/model-prices.md` becomes a router; per-runtime sub-tables under `reference/prices/<runtime>.md`. events.jsonl rows tag `runtime`. Aggregation rolls up per-runtime AND per-tier.
1565
- - **D-10** `reasoning-class` is additive, NOT a replacement for `default-tier`. Both may coexist; equivalence is enforced. Deprecation is data-gated (Phase 28 measurement).
1566
- - **D-12** All 9 plans land together with one CHANGELOG block. 4 manifests bump in lockstep (`package.json` + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` × 2 slots + `tests/semver-compare.test.cjs` `OFF_CADENCE_VERSIONS`).
1567
- - **D-13** Plan boundary discipline: Wave A (26-01..26-03) builds the adapter; Wave B (26-04..26-06) wires the existing pipeline; Wave C (26-07..26-08) lands the runtime-neutral alias additively; Wave D (26-09) closes out.
1647
+ D-01 through D-13 - see `.planning/phases/26-headless-model-resolver/CONTEXT.md` for the full register. Highlights:
1648
+ - **D-01** - `reference/runtime-models.md` is the single source of truth for all 14 runtimes; each row carries provenance (URL + retrieval timestamp + last-validated cycle) so the future authority-watcher can flag drift.
1649
+ - **D-04** - `tier-resolver.cjs` fallback chain is non-blocking: runtime entry → claude row + warning event → null + fail event. Never throws; null is a valid output the consumer must handle.
1650
+ - **D-05** - `runtime-detect.cjs` reuses Phase 24's env-var → runtime-ID mapping verbatim; single source of truth lives in `runtimes.cjs`. Adding a new runtime extends both detection and installation.
1651
+ - **D-07** - `resolved_models` is additive to `model_tier_overrides` - strict superset, same back-compat discipline as Phase 25's `complexity_class` next to `path`.
1652
+ - **D-08** - Cost telemetry split: `reference/model-prices.md` becomes a router; per-runtime sub-tables under `reference/prices/<runtime>.md`. events.jsonl rows tag `runtime`. Aggregation rolls up per-runtime AND per-tier.
1653
+ - **D-10** - `reasoning-class` is additive, NOT a replacement for `default-tier`. Both may coexist; equivalence is enforced. Deprecation is data-gated (Phase 28 measurement).
1654
+ - **D-12** - All 9 plans land together with one CHANGELOG block. 4 manifests bump in lockstep (`package.json` + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` × 2 slots + `tests/semver-compare.test.cjs` `OFF_CADENCE_VERSIONS`).
1655
+ - **D-13** - Plan boundary discipline: Wave A (26-01..26-03) builds the adapter; Wave B (26-04..26-06) wires the existing pipeline; Wave C (26-07..26-08) lands the runtime-neutral alias additively; Wave D (26-09) closes out.
1568
1656
 
1569
1657
  ---
1570
1658
 
1571
- ## [1.25.0] 2026-04-29
1659
+ ## [1.25.0] - 2026-04-29
1572
1660
 
1573
- Phase 25 Pipeline Hardening milestone converts four pipeline gaps surfaced in the post-Phase-24 retrospective from side roads into first-class pipeline citizens: a prototype gate that makes sketches/spikes a read/write member of the decision graph, an S/M/L/XL complexity refinement to the router that distinguishes trivial from full-pipeline work, a Stage 4.5 quality gate that runs lint/typecheck/test between Design and Verify, and a Stop-hook turn closeout that closes the events.jsonl gap at turn-end. All four sub-features are additive no state-machine break (5 stages stay 5 stages), no breaking router contract (`path: fast|quick|full` is preserved alongside the new `complexity_class`), and the existing budget-enforcer / verify-entry / decision-injector consumers gain the new fields without a code change to their existing call sites.
1661
+ Phase 25 Pipeline Hardening milestone - converts four pipeline gaps surfaced in the post-Phase-24 retrospective from side roads into first-class pipeline citizens: a prototype gate that makes sketches/spikes a read/write member of the decision graph, an S/M/L/XL complexity refinement to the router that distinguishes trivial from full-pipeline work, a Stage 4.5 quality gate that runs lint/typecheck/test between Design and Verify, and a Stop-hook turn closeout that closes the events.jsonl gap at turn-end. All four sub-features are additive - no state-machine break (5 stages stay 5 stages), no breaking router contract (`path: fast|quick|full` is preserved alongside the new `complexity_class`), and the existing budget-enforcer / verify-entry / decision-injector consumers gain the new fields without a code change to their existing call sites.
1574
1662
 
1575
1663
  ### Added
1576
1664
 
1577
- - **Prototype gate** `agents/prototype-gate.md` (new Haiku-tier signal-scoring agent emitting `{recommend: 'sketch'|'spike'|'none', confidence, reasons}`) + STATE.md `<prototyping>` block schema with three child element types (`<sketch slug=… cycle=… decision=D-XX status=resolved/>`, `<spike slug=… cycle=… decision=D-XX verdict=yes|no|partial status=resolved/>`, `<skipped at=… cycle=… reason=…/>`) parsed/serialized through `scripts/lib/gdd-state/{types,parser,mutator}.ts`. Round-trips byte-identically; the block is omitted when null (no spurious empty-tag pairs). (Plan 25-01, commit `92e93bf`)
1665
+ - **Prototype gate** - `agents/prototype-gate.md` (new Haiku-tier signal-scoring agent emitting `{recommend: 'sketch'|'spike'|'none', confidence, reasons}`) + STATE.md `<prototyping>` block schema with three child element types (`<sketch slug=… cycle=… decision=D-XX status=resolved/>`, `<spike slug=… cycle=… decision=D-XX verdict=yes|no|partial status=resolved/>`, `<skipped at=… cycle=… reason=…/>`) parsed/serialized through `scripts/lib/gdd-state/{types,parser,mutator}.ts`. Round-trips byte-identically; the block is omitted when null (no spurious empty-tag pairs). (Plan 25-01, commit `92e93bf`)
1578
1666
 
1579
- - **Router S/M/L/XL complexity_class** `skills/router/SKILL.md` heuristic table extended from 3 to 4 buckets (S = `/gdd:help`/`/gdd:stats`/single-Haiku skills; M = `/gdd:scan`/`/gdd:brief`/`/gdd:sketch`; L = `/gdd:explore`/`/gdd:discover`/standalone `/gdd:plan`/`/gdd:verify`; XL = `/gdd:next`/`/gdd:do`/autonomous flows). Router JSON output gains a `complexity_class` field next to the existing `path`; the canonical mapping is S→fast (short-circuited), M→fast, L→quick, XL→full. `hooks/budget-enforcer.ts` reads `complexity_class` when present and applies `.design/budget.json#class_caps_usd[<class>]` per-spawn cap; falls through to legacy cap behavior when the field is absent (strict superset). `reference/config-schema.md` documents the new optional `class_caps_usd: { S?, M?, L?, XL? }` field. (Plan 25-02, commit `a239171`)
1667
+ - **Router S/M/L/XL complexity_class** - `skills/router/SKILL.md` heuristic table extended from 3 to 4 buckets (S = `/gdd:help`/`/gdd:stats`/single-Haiku skills; M = `/gdd:scan`/`/gdd:brief`/`/gdd:sketch`; L = `/gdd:explore`/`/gdd:discover`/standalone `/gdd:plan`/`/gdd:verify`; XL = `/gdd:next`/`/gdd:do`/autonomous flows). Router JSON output gains a `complexity_class` field next to the existing `path`; the canonical mapping is S→fast (short-circuited), M→fast, L→quick, XL→full. `hooks/budget-enforcer.ts` reads `complexity_class` when present and applies `.design/budget.json#class_caps_usd[<class>]` per-spawn cap; falls through to legacy cap behavior when the field is absent (strict superset). `reference/config-schema.md` documents the new optional `class_caps_usd: { S?, M?, L?, XL? }` field. (Plan 25-02, commit `a239171`)
1580
1668
 
1581
- - **Quality gate (Stage 4.5)** `skills/quality-gate/SKILL.md` (new) runs the project's own `lint`/`typecheck`/`test`/visual-regression scripts in parallel between `/gdd:design` and `/gdd:verify`. Three-tier detection chain (D-06): authoritative `.design/config.json#quality_gate.commands` > auto-detect from `package.json#scripts` > skip-with-notice. `agents/quality-gate-runner.md` (new Haiku-tier classifier) parses tool output and routes the fix-vs-block decision; `design-fixer` is reused for the bounded fix loop (D-08, default `max_iters: 3`). Timeout warns and proceeds (D-07 non-blocking on slow suites); fail at `max_iters` marks STATE `<quality_gate>` block status="fail" and verify entry refuses (D-08). Six lifecycle events emitted to `events.jsonl` via the existing `appendEvent()` surface: `quality_gate_started`, `quality_gate_iteration`, `quality_gate_pass`, `quality_gate_fail`, `quality_gate_timeout`, `quality_gate_skipped` (D-09). STATE.md `<quality_gate>` block is a single-element schema (`<run started_at=… completed_at=… status=… iteration=N commands_run="lint,typecheck,test"/>`) most-recent run only. (Plan 25-03, commit `037b25f`; Plan 25-07 wiring, commit `b64250c`)
1669
+ - **Quality gate (Stage 4.5)** - `skills/quality-gate/SKILL.md` (new) runs the project's own `lint`/`typecheck`/`test`/visual-regression scripts in parallel between `/gdd:design` and `/gdd:verify`. Three-tier detection chain (D-06): authoritative `.design/config.json#quality_gate.commands` > auto-detect from `package.json#scripts` > skip-with-notice. `agents/quality-gate-runner.md` (new Haiku-tier classifier) parses tool output and routes the fix-vs-block decision; `design-fixer` is reused for the bounded fix loop (D-08, default `max_iters: 3`). Timeout warns and proceeds (D-07 - non-blocking on slow suites); fail at `max_iters` marks STATE `<quality_gate>` block status="fail" and verify entry refuses (D-08). Six lifecycle events emitted to `events.jsonl` via the existing `appendEvent()` surface: `quality_gate_started`, `quality_gate_iteration`, `quality_gate_pass`, `quality_gate_fail`, `quality_gate_timeout`, `quality_gate_skipped` (D-09). STATE.md `<quality_gate>` block is a single-element schema (`<run started_at=… completed_at=… status=… iteration=N commands_run="lint,typecheck,test"/>`) - most-recent run only. (Plan 25-03, commit `037b25f`; Plan 25-07 wiring, commit `b64250c`)
1582
1670
 
1583
- - **Turn closeout Stop hook** `hooks/gdd-turn-closeout.js` (new) fires when the assistant turn ends. Reads STATE.md (1 file) + tails the last line of events.jsonl; if `position.status==in_progress` AND last event >60s ago, appends a `turn_end` event and surfaces a stage-completion or paused-mid-task nudge as `additionalContext`. ≤10ms typical latency budget per D-10; idempotent on the `(stage, task_progress)` tuple. `skills/turn-closeout/SKILL.md` (new) is the portable mirror for the 13 non-Claude runtimes that lack a Stop-hook surface same logic, called from orchestrator skills (`/gdd:next`, `/gdd:design`, `/gdd:verify`) at exit per D-11. `hooks/hooks.json` Stop entry wires the JS hook into Claude Code's harness. (Plan 25-04, commit `675e879`; Plan 25-08 wiring, commit `f52a471`)
1671
+ - **Turn closeout Stop hook** - `hooks/gdd-turn-closeout.js` (new) fires when the assistant turn ends. Reads STATE.md (1 file) + tails the last line of events.jsonl; if `position.status==in_progress` AND last event >60s ago, appends a `turn_end` event and surfaces a stage-completion or paused-mid-task nudge as `additionalContext`. ≤10ms typical latency budget per D-10; idempotent on the `(stage, task_progress)` tuple. `skills/turn-closeout/SKILL.md` (new) is the portable mirror for the 13 non-Claude runtimes that lack a Stop-hook surface - same logic, called from orchestrator skills (`/gdd:next`, `/gdd:design`, `/gdd:verify`) at exit per D-11. `hooks/hooks.json` Stop entry wires the JS hook into Claude Code's harness. (Plan 25-04, commit `675e879`; Plan 25-08 wiring, commit `f52a471`)
1584
1672
 
1585
- - **sketch-wrap-up + spike-wrap-up dual writes** `skills/sketch-wrap-up/SKILL.md` and `skills/spike-wrap-up/SKILL.md` now perform a coupled two-write on resolution: append the chosen-variant or verdict as a `D-XX` entry under `<decisions>` AND append a corresponding `<sketch …/>` or `<spike …/>` line under `<prototyping>`. The two entries reference each other via `decision="D-XX"` so the `decision-injector` retrieval path works through both `<decisions>` (read by all downstream stages) and `<prototyping>` (read by planner-specific context). (Plan 25-05, commit `953605e`)
1673
+ - **sketch-wrap-up + spike-wrap-up dual writes** - `skills/sketch-wrap-up/SKILL.md` and `skills/spike-wrap-up/SKILL.md` now perform a coupled two-write on resolution: append the chosen-variant or verdict as a `D-XX` entry under `<decisions>` AND append a corresponding `<sketch …/>` or `<spike …/>` line under `<prototyping>`. The two entries reference each other via `decision="D-XX"` so the `decision-injector` retrieval path works through both `<decisions>` (read by all downstream stages) and `<prototyping>` (read by planner-specific context). (Plan 25-05, commit `953605e`)
1586
1674
 
1587
- - **Decision injector surfaces prior prototyping outcomes** `hooks/gdd-decision-injector.js` parses STATE.md `<prototyping>` entries (regex-based the hook stays self-contained JS) and surfaces the top-N relevant entries when an agent reads any `.design/**.md` or `.planning/**.md` file ≥1500 bytes. Outcomes appear under a "### Prior prototyping outcomes" heading alongside the existing D-XX matches. Empty / missing block is a no-op. (Plan 25-06, commit `da1961c`)
1675
+ - **Decision injector surfaces prior prototyping outcomes** - `hooks/gdd-decision-injector.js` parses STATE.md `<prototyping>` entries (regex-based - the hook stays self-contained JS) and surfaces the top-N relevant entries when an agent reads any `.design/**.md` or `.planning/**.md` file ≥1500 bytes. Outcomes appear under a "### Prior prototyping outcomes" heading alongside the existing D-XX matches. Empty / missing block is a no-op. (Plan 25-06, commit `da1961c`)
1588
1676
 
1589
- - **`scripts/lib/quality-gate-detect.cjs`** Plan 25-09 promotes the doc-only auto-detection logic from `skills/quality-gate/SKILL.md` Step 1 (D-06) into a small testable JS module. Pure function, no I/O. Exports `detect({configCommands, scripts}) → {commands, tier, reason?}` plus the `ALLOWLIST` and `ALWAYS_EXCLUDED` arrays so downstream consumers and tests can pin to the canonical detection contract.
1677
+ - **`scripts/lib/quality-gate-detect.cjs`** - Plan 25-09 promotes the doc-only auto-detection logic from `skills/quality-gate/SKILL.md` Step 1 (D-06) into a small testable JS module. Pure function, no I/O. Exports `detect({configCommands, scripts}) → {commands, tier, reason?}` plus the `ALLOWLIST` and `ALWAYS_EXCLUDED` arrays so downstream consumers and tests can pin to the canonical detection contract.
1590
1678
 
1591
1679
  ### Tests
1592
1680
 
1593
- - `tests/prototype-gate-state-block.test.cjs` (new, 6 tests) `<prototyping>` block round-trips through parse → serialize byte-identically, parser populates `state.prototyping.{sketches,spikes,skipped}` correctly, and serializer omits the block when null (no spurious empty-tag pair).
1594
- - `tests/router-complexity-class.test.cjs` (new, 10 tests) JSON example contains `complexity_class` next to `path`; heuristic table contains S/M/L/XL bucket labels; canonical mapping rows present; `/gdd:help`→S, `/gdd:scan`→M, standalone `/gdd:plan`→L, `/gdd:next`→XL bucket assignments documented; S-class short-circuit semantics captured.
1595
- - `tests/quality-gate-detection.test.cjs` (new, 12 tests) Tier 1 (config override) / Tier 2 (auto-detect with `tsc` substitution + `test:e2e` exclusion) / Tier 3 (skip-with-notice) of the detection chain; SKILL.md timeout-and-failure semantics asserted at the content level.
1596
- - `tests/turn-closeout-hook.test.cjs` (new, 8 tests) spawns the Stop hook with 4 synthesized cwd states (no STATE.md, status=completed, fresh event, stale event with N/N) and asserts `{continue: true}` shape, `additionalContext` nudge, idempotence on the `(stage, task_progress)` tuple, and end-to-end latency.
1597
- - `tests/phase-25-baseline.test.cjs` (new, 18 tests) same shape as `phase-24-baseline.test.cjs`. Asserts all four sub-features land (prototype-gate agent + state block + wrap-up dual-writes + decision-injector wiring; router complexity_class + 4 buckets; quality-gate skill + agent + detection module + verify Step 2.5 + 6 lifecycle events; turn-closeout hook + portable mirror + hooks.json Stop wiring) plus all 4 manifests align at 1.25.0 + CHANGELOG `## [1.25.0]` block exists.
1681
+ - `tests/prototype-gate-state-block.test.cjs` (new, 6 tests) - `<prototyping>` block round-trips through parse → serialize byte-identically, parser populates `state.prototyping.{sketches,spikes,skipped}` correctly, and serializer omits the block when null (no spurious empty-tag pair).
1682
+ - `tests/router-complexity-class.test.cjs` (new, 10 tests) - JSON example contains `complexity_class` next to `path`; heuristic table contains S/M/L/XL bucket labels; canonical mapping rows present; `/gdd:help`→S, `/gdd:scan`→M, standalone `/gdd:plan`→L, `/gdd:next`→XL bucket assignments documented; S-class short-circuit semantics captured.
1683
+ - `tests/quality-gate-detection.test.cjs` (new, 12 tests) - Tier 1 (config override) / Tier 2 (auto-detect with `tsc` substitution + `test:e2e` exclusion) / Tier 3 (skip-with-notice) of the detection chain; SKILL.md timeout-and-failure semantics asserted at the content level.
1684
+ - `tests/turn-closeout-hook.test.cjs` (new, 8 tests) - spawns the Stop hook with 4 synthesized cwd states (no STATE.md, status=completed, fresh event, stale event with N/N) and asserts `{continue: true}` shape, `additionalContext` nudge, idempotence on the `(stage, task_progress)` tuple, and end-to-end latency.
1685
+ - `tests/phase-25-baseline.test.cjs` (new, 18 tests) - same shape as `phase-24-baseline.test.cjs`. Asserts all four sub-features land (prototype-gate agent + state block + wrap-up dual-writes + decision-injector wiring; router complexity_class + 4 buckets; quality-gate skill + agent + detection module + verify Step 2.5 + 6 lifecycle events; turn-closeout hook + portable mirror + hooks.json Stop wiring) plus all 4 manifests align at 1.25.0 + CHANGELOG `## [1.25.0]` block exists.
1598
1686
  - `tests/semver-compare.test.cjs` `OFF_CADENCE_VERSIONS` gains `1.25.0` with the milestone summary.
1599
1687
 
1600
1688
  ### Decisions
1601
1689
 
1602
- D-01 through D-13 see `.planning/phases/25-pipeline-hardening/CONTEXT.md` for the full decision register. Highlights:
1603
- - **D-01** `<prototyping>` is a STATE.md block, not a stage. Keeps the 5-stage state machine intact (anti-renumber rule); sketches/spikes are checkpoints that fire mid-pipeline.
1604
- - **D-04 / D-05** `complexity_class` is additive to `path`. `path` enum stays `fast|quick|full` for back-compat; `complexity_class` enum is `S|M|L|XL` with canonical mapping S→fast (short-circuited), M→fast, L→quick, XL→full.
1605
- - **D-06** Quality-gate detection is a 3-tier chain: authoritative config > auto-detect from `package.json#scripts` > skip-with-notice. Never blocks if no commands resolve.
1606
- - **D-07** Quality-gate timeout warns and proceeds (does not block). Failures still block at the verify entry; slow runs surface a warning.
1607
- - **D-10** Stop-hook latency budget ≤10ms typical, idempotent on the `(stage, task_progress)` tuple, never blocks the user's next turn.
1608
- - **D-12** All 9 plans land together with one CHANGELOG block. 4 manifests bump in lockstep (`package.json` + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` × 2 slots + `tests/semver-compare.test.cjs` `OFF_CADENCE_VERSIONS`).
1690
+ D-01 through D-13 - see `.planning/phases/25-pipeline-hardening/CONTEXT.md` for the full decision register. Highlights:
1691
+ - **D-01** - `<prototyping>` is a STATE.md block, not a stage. Keeps the 5-stage state machine intact (anti-renumber rule); sketches/spikes are checkpoints that fire mid-pipeline.
1692
+ - **D-04 / D-05** - `complexity_class` is additive to `path`. `path` enum stays `fast|quick|full` for back-compat; `complexity_class` enum is `S|M|L|XL` with canonical mapping S→fast (short-circuited), M→fast, L→quick, XL→full.
1693
+ - **D-06** - Quality-gate detection is a 3-tier chain: authoritative config > auto-detect from `package.json#scripts` > skip-with-notice. Never blocks if no commands resolve.
1694
+ - **D-07** - Quality-gate timeout warns and proceeds (does not block). Failures still block at the verify entry; slow runs surface a warning.
1695
+ - **D-10** - Stop-hook latency budget ≤10ms typical, idempotent on the `(stage, task_progress)` tuple, never blocks the user's next turn.
1696
+ - **D-12** - All 9 plans land together with one CHANGELOG block. 4 manifests bump in lockstep (`package.json` + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` × 2 slots + `tests/semver-compare.test.cjs` `OFF_CADENCE_VERSIONS`).
1609
1697
 
1610
1698
  ---
1611
1699
 
1612
- ## [1.24.2] 2026-04-25
1700
+ ## [1.24.2] - 2026-04-25
1613
1701
 
1614
- Dependabot cleanup patches the one real transitive vulnerability flagged on `main` and configures Dependabot to stop scanning inert framework-detection test fixtures. No behavior change for end users; security/quality patch on top of v1.24.1.
1702
+ Dependabot cleanup - patches the one real transitive vulnerability flagged on `main` and configures Dependabot to stop scanning inert framework-detection test fixtures. No behavior change for end users; security/quality patch on top of v1.24.1.
1615
1703
 
1616
1704
  ### Fixed
1617
1705
 
1618
- - **`fast-json-patch` < 3.1.1 prototype pollution (high)** pulled in transitively via `ajv-cli@5.0.0` (dev-only, used by `npm run validate:schemas`). `ajv-cli@5` declares `fast-json-patch: ^2.0.0` and there is no newer `ajv-cli` release that drops the dep, so we add an `npm overrides` entry forcing `fast-json-patch` to `^3.1.1` for all transitive resolutions. `validate:schemas` continues to pass; the fast-json-patch v2→v3 API change only affects ajv-cli's `migrate` subcommand which we do not invoke (we run the `ajv` validator binary directly via `npx -p ajv-cli -p ajv-formats ajv`).
1706
+ - **`fast-json-patch` < 3.1.1 prototype pollution (high)** - pulled in transitively via `ajv-cli@5.0.0` (dev-only, used by `npm run validate:schemas`). `ajv-cli@5` declares `fast-json-patch: ^2.0.0` and there is no newer `ajv-cli` release that drops the dep, so we add an `npm overrides` entry forcing `fast-json-patch` to `^3.1.1` for all transitive resolutions. `validate:schemas` continues to pass; the fast-json-patch v2→v3 API change only affects ajv-cli's `migrate` subcommand which we do not invoke (we run the `ajv` validator binary directly via `npx -p ajv-cli -p ajv-formats ajv`).
1619
1707
 
1620
1708
  ### Added
1621
1709
 
1622
- - **`.github/dependabot.yml`** explicit Dependabot scope. By default Dependabot walks every `package.json` in the repo, which includes the inert manifests under `test-fixture/src/ui-detection/*/`. Those exist solely so `tests/detect-ui-root.test.cjs` and `tests/start-findings-engine.test.cjs` can read dependency *names* out of them to verify framework-detection heuristics they are never `npm install`-ed and the pinned vulnerable versions of vite / next / react-router / fastify never execute in CI or production. The new config opts in only the root npm tree and the GitHub Actions ecosystem, leaving the fixture tree alone.
1710
+ - **`.github/dependabot.yml`** - explicit Dependabot scope. By default Dependabot walks every `package.json` in the repo, which includes the inert manifests under `test-fixture/src/ui-detection/*/`. Those exist solely so `tests/detect-ui-root.test.cjs` and `tests/start-findings-engine.test.cjs` can read dependency *names* out of them to verify framework-detection heuristics - they are never `npm install`-ed and the pinned vulnerable versions of vite / next / react-router / fastify never execute in CI or production. The new config opts in only the root npm tree and the GitHub Actions ecosystem, leaving the fixture tree alone.
1623
1711
 
1624
1712
  ### Tests
1625
1713
 
1626
- - `tests/phase-24-baseline.test.cjs` manifest-alignment assertions bumped to `1.24.2`.
1714
+ - `tests/phase-24-baseline.test.cjs` - manifest-alignment assertions bumped to `1.24.2`.
1627
1715
  - `tests/semver-compare.test.cjs` `OFF_CADENCE_VERSIONS` gains `1.24.2`.
1628
1716
 
1629
1717
  ---
1630
1718
 
1631
- ## [1.24.1] 2026-04-25
1719
+ ## [1.24.1] - 2026-04-25
1632
1720
 
1633
- CodeQL code-scanning cleanup closes all 10 open alerts on `main` (1 error, 9 warnings). No behavior change for end users; security/quality patch on top of v1.24.0.
1721
+ CodeQL code-scanning cleanup - closes all 10 open alerts on `main` (1 error, 9 warnings). No behavior change for end users; security/quality patch on top of v1.24.0.
1634
1722
 
1635
1723
  ### Fixed
1636
1724
 
1637
- - **`scripts/extract-changelog-section.cjs:31`** `js/regex-injection` (error) + `js/incomplete-sanitization`. The CLI version arg was only escaping `.` before being interpolated into `new RegExp(...)`. Now escapes the full regex meta-char set `[.*+?^${}()|[\]\\]` via the same helper used elsewhere in the test suite.
1638
- - **`tests/mapper-schema.test.cjs:15`** `js/incomplete-sanitization`. `extractSchemaKeys()` now uses the full meta-char escape on the slice-name input before constructing the heading regex.
1639
- - **`tests/skill-brief-mcp-migration.test.cjs:118`** `js/identity-replacement`. The MCP-tool-presence check used `tool.replace(/_/g, '_')` (a no-op) inside `new RegExp(...)`. Replaced with a literal substring check (`assert.ok(fm.includes(tool))`) MCP tool names are alphanumeric+underscore, so no regex is needed.
1640
- - **`.github/workflows/ci.yml`** `actions/missing-workflow-permissions` (×6 jobs). Added a top-level `permissions: contents: read` block. Inherited by all 6 jobs (lint / validate / test / security / size-budget / e2e-headless). Gitleaks runs with `GITLEAKS_ENABLE_COMMENTS: false` so it does not require `pull-requests: write`.
1725
+ - **`scripts/extract-changelog-section.cjs:31`** - `js/regex-injection` (error) + `js/incomplete-sanitization`. The CLI version arg was only escaping `.` before being interpolated into `new RegExp(...)`. Now escapes the full regex meta-char set `[.*+?^${}()|[\]\\]` via the same helper used elsewhere in the test suite.
1726
+ - **`tests/mapper-schema.test.cjs:15`** - `js/incomplete-sanitization`. `extractSchemaKeys()` now uses the full meta-char escape on the slice-name input before constructing the heading regex.
1727
+ - **`tests/skill-brief-mcp-migration.test.cjs:118`** - `js/identity-replacement`. The MCP-tool-presence check used `tool.replace(/_/g, '_')` (a no-op) inside `new RegExp(...)`. Replaced with a literal substring check (`assert.ok(fm.includes(tool))`) - MCP tool names are alphanumeric+highlight, so no regex is needed.
1728
+ - **`.github/workflows/ci.yml`** - `actions/missing-workflow-permissions` (×6 jobs). Added a top-level `permissions: contents: read` block. Inherited by all 6 jobs (lint / validate / test / security / size-budget / e2e-headless). Gitleaks runs with `GITLEAKS_ENABLE_COMMENTS: false` so it does not require `pull-requests: write`.
1641
1729
 
1642
1730
  ### Tests
1643
1731
 
1644
- - `tests/phase-24-baseline.test.cjs` manifest-alignment assertions bumped to `1.24.1`.
1732
+ - `tests/phase-24-baseline.test.cjs` - manifest-alignment assertions bumped to `1.24.1`.
1645
1733
  - `tests/semver-compare.test.cjs` `OFF_CADENCE_VERSIONS` gains `1.24.1`.
1646
1734
 
1647
1735
  ---
1648
1736
 
1649
- ## [1.24.0] 2026-04-25
1737
+ ## [1.24.0] - 2026-04-25
1650
1738
 
1651
- Phase 24 Multi-Runtime Installer milestone `npx @hegemonart/get-design-done` with no flags now launches a polished interactive install session (`@clack/prompts`) that walks the user through a multi-select of all 14 supported AI coding runtimes plus a Global/Local radio. Scripted / CI installs continue to work via the existing flag surface unchanged. Strict superset over v1.23.5: any non-zero invocation still works exactly as before.
1739
+ Phase 24 Multi-Runtime Installer milestone - `npx @hegemonart/get-design-done` with no flags now launches a polished interactive install session (`@clack/prompts`) that walks the user through a multi-select of all 14 supported AI coding runtimes plus a Global/Local radio. Scripted / CI installs continue to work via the existing flag surface unchanged. Strict superset over v1.23.5: any non-zero invocation still works exactly as before.
1652
1740
 
1653
1741
  ### Added
1654
1742
 
1655
- - **Per-runtime install matrix** `scripts/lib/install/runtimes.cjs` exports a 14-entry frozen list. Each entry: `{id, displayName, configDirEnv, configDirFallback, kind, files, marketplaceEntry?}`. Two install kinds are supported: `claude-marketplace` (registers an `extraKnownMarketplaces` entry + flips `enabledPlugins[<plugin>@<marketplace>]`, today only Claude Code) and `agents-md` (drops a runtime-specific instructions file in the runtime's config dir, used by the other 13). Adding a new runtime is one append to this file + one append to `test-fixture/baselines/phase-24/runtimes.txt`. (Plan 24-01)
1743
+ - **Per-runtime install matrix** - `scripts/lib/install/runtimes.cjs` exports a 14-entry frozen list. Each entry: `{id, displayName, configDirEnv, configDirFallback, kind, files, marketplaceEntry?}`. Two install kinds are supported: `claude-marketplace` (registers an `extraKnownMarketplaces` entry + flips `enabledPlugins[<plugin>@<marketplace>]`, today only Claude Code) and `agents-md` (drops a runtime-specific instructions file in the runtime's config dir, used by the other 13). Adding a new runtime is one append to this file + one append to `test-fixture/baselines/phase-24/runtimes.txt`. (Plan 24-01)
1656
1744
 
1657
- - **14 runtimes scoped** Claude Code, OpenCode, Gemini CLI, Kilo Code, OpenAI Codex CLI, GitHub Copilot CLI, Cursor, Windsurf, Antigravity, Augment, Trae, Qwen Code, CodeBuddy, Cline. Gemini drops `GEMINI.md`; the other 12 `agents-md` runtimes drop `AGENTS.md`. (Plan 24-01)
1745
+ - **14 runtimes scoped** - Claude Code, OpenCode, Gemini CLI, Kilo Code, OpenAI Codex CLI, GitHub Copilot CLI, Cursor, Windsurf, Antigravity, Augment, Trae, Qwen Code, CodeBuddy, Cline. Gemini drops `GEMINI.md`; the other 12 `agents-md` runtimes drop `AGENTS.md`. (Plan 24-01)
1658
1746
 
1659
- - **Config-dir lookup chain** `scripts/lib/install/config-dir.cjs` exposes `resolveConfigDir(runtimeId, opts)` and `resolveAllConfigDirs(opts)`. Precedence: explicit `--config-dir` flag > per-runtime env var (`CLAUDE_CONFIG_DIR`, `OPENCODE_CONFIG_DIR`, `GEMINI_CONFIG_DIR`, `CODEX_HOME`, `CURSOR_CONFIG_DIR`, …) > POSIX/Windows fallback at `$HOME/$USERPROFILE` joined with the runtime's `configDirFallback`. Mirrors GSD `install.js`'s lookup pattern. (Plan 24-01)
1747
+ - **Config-dir lookup chain** - `scripts/lib/install/config-dir.cjs` exposes `resolveConfigDir(runtimeId, opts)` and `resolveAllConfigDirs(opts)`. Precedence: explicit `--config-dir` flag > per-runtime env var (`CLAUDE_CONFIG_DIR`, `OPENCODE_CONFIG_DIR`, `GEMINI_CONFIG_DIR`, `CODEX_HOME`, `CURSOR_CONFIG_DIR`, …) > POSIX/Windows fallback at `$HOME/$USERPROFILE` joined with the runtime's `configDirFallback`. Mirrors GSD `install.js`'s lookup pattern. (Plan 24-01)
1660
1748
 
1661
- - **Settings merge / unmerge primitives** `scripts/lib/install/merge.cjs` exports pure `mergeClaudeSettings(existing, marketplaceEntry) → {next, changed}` and `removeClaudeSettings(existing, marketplaceEntry) → {next, changed}`. Both are idempotent and preserve unrelated user keys. `buildAgentsFileContent(runtime)` produces the runtime-tagged AGENTS.md/GEMINI.md payload with a `<!-- get-design-done plugin instructions -->` fingerprint. `isPluginOwned(content)` is the inverse used by uninstall + foreign-file detection. (Plan 24-02)
1749
+ - **Settings merge / unmerge primitives** - `scripts/lib/install/merge.cjs` exports pure `mergeClaudeSettings(existing, marketplaceEntry) → {next, changed}` and `removeClaudeSettings(existing, marketplaceEntry) → {next, changed}`. Both are idempotent and preserve unrelated user keys. `buildAgentsFileContent(runtime)` produces the runtime-tagged AGENTS.md/GEMINI.md payload with a `<!-- get-design-done plugin instructions -->` fingerprint. `isPluginOwned(content)` is the inverse used by uninstall + foreign-file detection. (Plan 24-02)
1662
1750
 
1663
- - **Per-runtime install/uninstall orchestrator** `scripts/lib/install/installer.cjs` exports `installRuntime(runtimeId, opts)` and `uninstallRuntime(runtimeId, opts)`, both returning a structured `Result = {runtime, path, action: 'created'|'updated'|'unchanged'|'removed'|'skipped-foreign', dryRun, reason?}`. Atomic writes (`.tmp-<pid>` + rename) throughout. Foreign AGENTS.md/GEMINI.md files (no plugin fingerprint) are never clobbered install reports `skipped-foreign` with a remediation hint. `detectInstalled(opts)` scans every runtime's config dir and returns the IDs that have a plugin-owned install. (Plan 24-02)
1751
+ - **Per-runtime install/uninstall orchestrator** - `scripts/lib/install/installer.cjs` exports `installRuntime(runtimeId, opts)` and `uninstallRuntime(runtimeId, opts)`, both returning a structured `Result = {runtime, path, action: 'created'|'updated'|'unchanged'|'removed'|'skipped-foreign', dryRun, reason?}`. Atomic writes (`.tmp-<pid>` + rename) throughout. Foreign AGENTS.md/GEMINI.md files (no plugin fingerprint) are never clobbered - install reports `skipped-foreign` with a remediation hint. `detectInstalled(opts)` scans every runtime's config dir and returns the IDs that have a plugin-owned install. (Plan 24-02)
1664
1752
 
1665
- - **`@clack/prompts` interactive session** `scripts/lib/install/interactive.cjs` exports `runInteractiveInstall()` (3 steps: multi-select runtimes → Global/Local radio → confirmation) and `runInteractiveUninstall(opts)` (2 steps: multi-select detected-installed → confirmation). ESC at any step returns `null` so the entrypoint exits 0 with a "cancelled" message no partial writes. `@clack/prompts ^0.7.0` added as a runtime dependency (~8KB). (Plan 24-03)
1753
+ - **`@clack/prompts` interactive session** - `scripts/lib/install/interactive.cjs` exports `runInteractiveInstall()` (3 steps: multi-select runtimes → Global/Local radio → confirmation) and `runInteractiveUninstall(opts)` (2 steps: multi-select detected-installed → confirmation). ESC at any step returns `null` so the entrypoint exits 0 with a "cancelled" message - no partial writes. `@clack/prompts ^0.7.0` added as a runtime dependency (~8KB). (Plan 24-03)
1666
1754
 
1667
- - **Multi-runtime entrypoint** `scripts/install.cjs` rewritten as a router. Decision tree: zero flags + TTY → interactive multi-select; zero flags + non-TTY (CI, pipes) → defaults to `--claude --global` for backwards compatibility with v1.23.5; any explicit per-runtime flag (or `--all`) → scripted, no prompts. `--uninstall` with no runtime list also enters interactive mode and only shows runtimes detected as installed. Per-runtime summary printed at the end with per-runtime path + action. (Plan 24-04)
1755
+ - **Multi-runtime entrypoint** - `scripts/install.cjs` rewritten as a router. Decision tree: zero flags + TTY → interactive multi-select; zero flags + non-TTY (CI, pipes) → defaults to `--claude --global` for backwards compatibility with v1.23.5; any explicit per-runtime flag (or `--all`) → scripted, no prompts. `--uninstall` with no runtime list also enters interactive mode and only shows runtimes detected as installed. Per-runtime summary printed at the end with per-runtime path + action. (Plan 24-04)
1668
1756
 
1669
- - **Existing flag surface preserved 1:1** `--claude`, `--opencode`, `--gemini`, `--kilo`, `--codex`, `--copilot`, `--cursor`, `--windsurf`, `--antigravity`, `--augment`, `--trae`, `--qwen`, `--codebuddy`, `--cline`, `--all`, `--global`, `--local`, `--uninstall`, `--config-dir <path>`, `--dry-run`, `--help`, `-h`. Existing CI installs (`CLAUDE_CONFIG_DIR=/tmp npx @hegemonart/get-design-done`) continue to work with no source changes. (Plan 24-04)
1757
+ - **Existing flag surface preserved 1:1** - `--claude`, `--opencode`, `--gemini`, `--kilo`, `--codex`, `--copilot`, `--cursor`, `--windsurf`, `--antigravity`, `--augment`, `--trae`, `--qwen`, `--codebuddy`, `--cline`, `--all`, `--global`, `--local`, `--uninstall`, `--config-dir <path>`, `--dry-run`, `--help`, `-h`. Existing CI installs (`CLAUDE_CONFIG_DIR=/tmp npx @hegemonart/get-design-done`) continue to work with no source changes. (Plan 24-04)
1670
1758
 
1671
- - **Idempotent + foreign-safe install** re-running install over an already-installed runtime emits `unchanged` with the v1.23.5 "already registered" message preserved. AGENTS.md / GEMINI.md files NOT authored by this plugin are detected via missing fingerprint and never overwritten or deleted by uninstall. (Plan 24-02)
1759
+ - **Idempotent + foreign-safe install** - re-running install over an already-installed runtime emits `unchanged` with the v1.23.5 "already registered" message preserved. AGENTS.md / GEMINI.md files NOT authored by this plugin are detected via missing fingerprint and never overwritten or deleted by uninstall. (Plan 24-02)
1672
1760
 
1673
1761
  ### Changed
1674
1762
 
1675
1763
  - `tests/semver-compare.test.cjs` `OFF_CADENCE_VERSIONS` gains `1.24.0`.
1676
- - `scripts/install.cjs` full rewrite. The original v1.23.5 single-runtime marketplace registration logic is now extracted into `scripts/lib/install/merge.cjs` (`mergeClaudeSettings` / `removeClaudeSettings`) and reused by the new orchestrator.
1764
+ - `scripts/install.cjs` - full rewrite. The original v1.23.5 single-runtime marketplace registration logic is now extracted into `scripts/lib/install/merge.cjs` (`mergeClaudeSettings` / `removeClaudeSettings`) and reused by the new orchestrator.
1677
1765
 
1678
1766
  ### Tests
1679
1767
 
1680
- - `tests/install-runtimes.test.cjs` 14-entry shape, kind/file mapping per runtime, baseline-file alignment, ID uniqueness, unknown-runtime throws (10 tests).
1681
- - `tests/install-config-dir.test.cjs` env override, explicit override, fallback resolution, empty env-var fallthrough, all-runtimes resolution (8).
1682
- - `tests/install-merge.test.cjs` merge/remove idempotency + key preservation, fingerprint helpers, full install→idempotent→uninstall round-trips for both kinds, foreign-file refusal + missing-target uninstall (15).
1683
- - `tests/phase-24-baseline.test.cjs` 3-manifest version alignment at 1.24.0, `@clack/prompts` registration, surface-export contract per module, runtimes.txt baseline match, install.cjs rewrite anchor (8).
1768
+ - `tests/install-runtimes.test.cjs` - 14-entry shape, kind/file mapping per runtime, baseline-file alignment, ID uniqueness, unknown-runtime throws (10 tests).
1769
+ - `tests/install-config-dir.test.cjs` - env override, explicit override, fallback resolution, empty env-var fallthrough, all-runtimes resolution (8).
1770
+ - `tests/install-merge.test.cjs` - merge/remove idempotency + key preservation, fingerprint helpers, full install→idempotent→uninstall round-trips for both kinds, foreign-file refusal + missing-target uninstall (15).
1771
+ - `tests/phase-24-baseline.test.cjs` - 3-manifest version alignment at 1.24.0, `@clack/prompts` registration, surface-export contract per module, runtimes.txt baseline match, install.cjs rewrite anchor (8).
1684
1772
  - All 7 existing `tests/install-script.test.cjs` end-to-end spawn tests pass against the rewritten entrypoint.
1685
1773
 
1686
1774
  Total: 41 new tests. All Phase 20/21/22/23/23.5 tests still green.
@@ -1689,26 +1777,26 @@ Total: 41 new tests. All Phase 20/21/22/23/23.5 tests still green.
1689
1777
 
1690
1778
  - Stdin-simulation integration tests for the interactive flow itself (requires a PTY shim; manual smoke-test on Windows CMD / PowerShell / Windows Terminal covers v1).
1691
1779
  - Auto-detection of installed runtimes during the install flow (multi-select with all 14 visible is sufficient for v1; uninstall flow already filters to detected-installed via `detectInstalled`).
1692
- - Per-runtime MCP server registration writes each runtime's MCP entry format differs and the install matrix records the format but does not generate the entries.
1780
+ - Per-runtime MCP server registration writes - each runtime's MCP entry format differs and the install matrix records the format but does not generate the entries.
1693
1781
 
1694
1782
  ---
1695
1783
 
1696
- ## [1.23.5] 2026-04-25
1784
+ ## [1.23.5] - 2026-04-25
1697
1785
 
1698
- Phase 23.5 No-Regret Adaptive Layer milestone turns the passive Phase 22–23 observability + validation infrastructure into a closed self-tuning loop. Three tightly-scoped no-regret algorithms sharing one feature-flag ladder. Single-user viable via informed Beta-prior bootstrap (no shared telemetry required). Ships as a decimal patch on the v1.23 minor does NOT shift Phase 24 → v1.24.0.
1786
+ Phase 23.5 No-Regret Adaptive Layer milestone - turns the passive Phase 22–23 observability + validation infrastructure into a closed self-tuning loop. Three tightly-scoped no-regret algorithms sharing one feature-flag ladder. Single-user viable via informed Beta-prior bootstrap (no shared telemetry required). Ships as a decimal patch on the v1.23 minor - does NOT shift Phase 24 → v1.24.0.
1699
1787
 
1700
1788
  ### Added
1701
1789
 
1702
- - **Bandit router** `scripts/lib/bandit-router.cjs` implements contextual Thompson sampling over `(agent_type, touches_size_bin) → {haiku, sonnet, opus}`. Per-arm `Beta(α, β)` posterior at `.design/telemetry/posterior.json` (atomic .tmp + rename). Discounted Thompson via per-arm time-decay factor `ρ^days_since_last_use` applied at sample time (default ρ=0.988 → 60-day half-life). Informed bootstrap: each arm starts at `Beta(α, β)` with α weighted toward the historical tier success rate (haiku=0.6, sonnet=0.8, opus=0.85) and `α + β ≈ 10` so 5–10 local samples shift the posterior. Two-stage lexicographic reward: `if !solidify_pass: 0; elif user_undo_in_session: 0; else: 1 − λ · normalize(cost + ε · wall_time)`. API: `pull / update / reset / loadPosterior / savePosterior / computeReward`. Touches-size bins: `tiny <5`, `small 5–15`, `medium 16–50`, `large >50` globs. (Plan 23.5-01)
1790
+ - **Bandit router** - `scripts/lib/bandit-router.cjs` implements contextual Thompson sampling over `(agent_type, touches_size_bin) → {haiku, sonnet, opus}`. Per-arm `Beta(α, β)` posterior at `.design/telemetry/posterior.json` (atomic .tmp + rename). Discounted Thompson via per-arm time-decay factor `ρ^days_since_last_use` applied at sample time (default ρ=0.988 → 60-day half-life). Informed bootstrap: each arm starts at `Beta(α, β)` with α weighted toward the historical tier success rate (haiku=0.6, sonnet=0.8, opus=0.85) and `α + β ≈ 10` so 5–10 local samples shift the posterior. Two-stage lexicographic reward: `if !solidify_pass: 0; elif user_undo_in_session: 0; else: 1 − λ · normalize(cost + ε · wall_time)`. API: `pull / update / reset / loadPosterior / savePosterior / computeReward`. Touches-size bins: `tiny <5`, `small 5–15`, `medium 16–50`, `large >50` globs. (Plan 23.5-01)
1703
1791
 
1704
- - **Hedge ensemble** `scripts/lib/hedge-ensemble.cjs` implements parameter-free AdaNormalHedge weighted-majority over verifier + checker agents. Weights persist at `.design/telemetry/hedge-weights.json`. Update rule: `η_i = sqrt(ln(N) / max(1, cumLoss2_i))` per-agent learning rate; `w_i *= exp(-η_i * loss_i)`; renormalise. Vote semantics: weighted sum normalised by the SUM of voting agents' weights agents in the pool that didn't vote this round don't dilute the verdict. API: `loss / vote / weights / loadWeights / saveWeights`. Default vote threshold 0.5. (Plan 23.5-02)
1792
+ - **Hedge ensemble** - `scripts/lib/hedge-ensemble.cjs` implements parameter-free AdaNormalHedge weighted-majority over verifier + checker agents. Weights persist at `.design/telemetry/hedge-weights.json`. Update rule: `η_i = sqrt(ln(N) / max(1, cumLoss2_i))` per-agent learning rate; `w_i *= exp(-η_i * loss_i)`; renormalise. Vote semantics: weighted sum normalised by the SUM of voting agents' weights - agents in the pool that didn't vote this round don't dilute the verdict. API: `loss / vote / weights / loadWeights / saveWeights`. Default vote threshold 0.5. (Plan 23.5-02)
1705
1793
 
1706
- - **MMR re-rank** `scripts/lib/mmr-rerank.cjs` implements Maximal Marginal Relevance over scored items. Solves the "all 5 surfaced learnings are about the same thing" failure mode in the Phase 14.5 decision-injector. Greedy criterion: `next = argmax_{i ∉ selected} λ * relevance(i) − (1 − λ) * max_sim(i, selected)`. Similarity = Jaccard on word n-grams (default n=2). λ default 0.7. No external deps, no embedding API. API: `rerank / similarity / tokenize / ngrams / jaccard`. (Plan 23.5-03)
1794
+ - **MMR re-rank** - `scripts/lib/mmr-rerank.cjs` implements Maximal Marginal Relevance over scored items. Solves the "all 5 surfaced learnings are about the same thing" failure mode in the Phase 14.5 decision-injector. Greedy criterion: `next = argmax_{i ∉ selected} λ * relevance(i) − (1 − λ) * max_sim(i, selected)`. Similarity = Jaccard on word n-grams (default n=2). λ default 0.7. No external deps, no embedding API. API: `rerank / similarity / tokenize / ngrams / jaccard`. (Plan 23.5-03)
1707
1795
 
1708
- - **Adaptive-mode feature flag ladder** `scripts/lib/adaptive-mode.cjs` is the single source of truth for which Phase 23.5 components are active. Three modes:
1709
- - `static` (DEFAULT) Phase 10.1 behaviour. Static `tier_overrides` applies. No posterior writes / no hedge updates / no MMR.
1710
- - `hedge` Adds AdaNormalHedge consensus + MMR re-rank. Routing still static (bandit OFF). Safest intro level.
1711
- - `full` Adds bandit Thompson-sampling routing + reflector confidence-interval proposals. Both posterior + hedge persist.
1796
+ - **Adaptive-mode feature flag ladder** - `scripts/lib/adaptive-mode.cjs` is the single source of truth for which Phase 23.5 components are active. Three modes:
1797
+ - `static` (DEFAULT) - Phase 10.1 behaviour. Static `tier_overrides` applies. No posterior writes / no hedge updates / no MMR.
1798
+ - `hedge` - Adds AdaNormalHedge consensus + MMR re-rank. Routing still static (bandit OFF). Safest intro level.
1799
+ - `full` - Adds bandit Thompson-sampling routing + reflector confidence-interval proposals. Both posterior + hedge persist.
1712
1800
  Read from `.design/budget.json.adaptive_mode` with safe fallback to `static` on missing/malformed/unknown values. API: `getMode / setMode / caps / isBanditEnabled / isHedgeEnabled / isMmrEnabled / isReflectorProposalsEnabled`. (Plan 23.5-04)
1713
1801
 
1714
1802
  ### Changed
@@ -1718,11 +1806,11 @@ Phase 23.5 No-Regret Adaptive Layer milestone — turns the passive Phase 22–2
1718
1806
 
1719
1807
  ### Tests
1720
1808
 
1721
- - `tests/bandit-router.test.cjs` bin partitioning, prior elevation per tier, beta sampling, pull persistence, missing-input throws, update/reward/clamp, reset, decay-toward-prior, all reward branches, load+save, 60-round convergence smoke test (18 tests)
1722
- - `tests/hedge-ensemble.test.cjs` init uniform, high-loss penalty, normalisation, simple vs weighted vote, boolean=numeric equivalence, custom threshold, empty votes, loss clamp, NaN throw, round-trip (14)
1723
- - `tests/mmr-rerank.test.cjs` tokenize edges, ngram size+fallback, similarity properties, λ=1 pure relevance, λ=0 pure diversity, textOf/relevanceOf overrides, empty input, non-array throw, k>length truncation, defaults, jaccard guards, canonical "5 D-13 hits" scenario (18)
1724
- - `tests/adaptive-mode.test.cjs` missing-file fallback, malformed-JSON fallback, unknown-mode quiet fallback, all 3 capability matrices, all 4 predicates, setMode preserves other fields, parent-dir creation, mode rejection, exports, absolute-path support (13)
1725
- - `tests/phase-23.5-baseline.test.cjs` Phase 23.5 regression baseline (8)
1809
+ - `tests/bandit-router.test.cjs` - bin partitioning, prior elevation per tier, beta sampling, pull persistence, missing-input throws, update/reward/clamp, reset, decay-toward-prior, all reward branches, load+save, 60-round convergence smoke test (18 tests)
1810
+ - `tests/hedge-ensemble.test.cjs` - init uniform, high-loss penalty, normalisation, simple vs weighted vote, boolean=numeric equivalence, custom threshold, empty votes, loss clamp, NaN throw, round-trip (14)
1811
+ - `tests/mmr-rerank.test.cjs` - tokenize edges, ngram size+fallback, similarity properties, λ=1 pure relevance, λ=0 pure diversity, textOf/relevanceOf overrides, empty input, non-array throw, k>length truncation, defaults, jaccard guards, canonical "5 D-13 hits" scenario (18)
1812
+ - `tests/adaptive-mode.test.cjs` - missing-file fallback, malformed-JSON fallback, unknown-mode quiet fallback, all 3 capability matrices, all 4 predicates, setMode preserves other fields, parent-dir creation, mode rejection, exports, absolute-path support (13)
1813
+ - `tests/phase-23.5-baseline.test.cjs` - Phase 23.5 regression baseline (8)
1726
1814
 
1727
1815
  Total: 71 new tests. All Phase 20/21/22/23 tests still green.
1728
1816
 
@@ -1739,42 +1827,42 @@ The Phase 22 code-level reflector reads `posterior.json` + hedge weights at run
1739
1827
 
1740
1828
  ### Explicitly out of scope
1741
1829
 
1742
- - HDBSCAN auto-crystallization, BOCPD changepoint detection, Personalized PageRank, MinHash/LSH dedup, Borda/Kemeny rank aggregation, submodular greedy each rejected with rationale in ROADMAP.md.
1830
+ - HDBSCAN auto-crystallization, BOCPD changepoint detection, Personalized PageRank, MinHash/LSH dedup, Borda/Kemeny rank aggregation, submodular greedy - each rejected with rationale in ROADMAP.md.
1743
1831
 
1744
1832
  ---
1745
1833
 
1746
- ## [1.23.0] 2026-04-25
1834
+ ## [1.23.0] - 2026-04-25
1747
1835
 
1748
- Phase 23 GDD SDK Domain Primitives milestone lands the highest-leverage code primitives from the ROADMAP "GDD SDK Domain Primitives" entry as typed Node modules with tests. 10 atomic plans (23-01 through 23-10), additive every Phase 20/21/22 consumer keeps working unchanged. Distribution as separate `@hegemonart/gdd-sdk` npm package and screenshot-capture orchestration are explicitly deferred to follow-up phases.
1836
+ Phase 23 GDD SDK Domain Primitives milestone - lands the highest-impact code primitives from the ROADMAP "GDD SDK Domain Primitives" entry as typed Node modules with tests. 10 atomic plans (23-01 through 23-10), additive - every Phase 20/21/22 consumer keeps working unchanged. Distribution as separate `@hegemonart/gdd-sdk` npm package and screenshot-capture orchestration are explicitly deferred to follow-up phases.
1749
1837
 
1750
1838
  ### Added
1751
1839
 
1752
- - **JSON output contracts** `reference/output-contracts/planner-decision.schema.json` + `verifier-decision.schema.json` (Draft-07). `scripts/lib/parse-contract.cjs` gains `parsePlannerDecision()` and `parseVerifierDecision()` riding the same extract→parse→validate pipeline as the existing `parseMotionMap`. Lets `/gdd:synthesize` consume planner output without regex-parsing markdown headings, and lets executor↔verifier ping-pong on a typed envelope. (Plan 23-01)
1840
+ - **JSON output contracts** - `reference/output-contracts/planner-decision.schema.json` + `verifier-decision.schema.json` (Draft-07). `scripts/lib/parse-contract.cjs` gains `parsePlannerDecision()` and `parseVerifierDecision()` riding the same extract→parse→validate pipeline as the existing `parseMotionMap`. Lets `/gdd:synthesize` consume planner output without regex-parsing markdown headings, and lets executor↔verifier ping-pong on a typed envelope. (Plan 23-01)
1753
1841
 
1754
- - **Solidify-with-rollback gate** `scripts/lib/design-solidify.mjs` runs the typecheck/build/targeted-test triplet for a task and, on any failure, rolls the working tree back via `git stash` (configurable: `stash` | `hard` | `none`) and emits a `solidify.rollback` event onto the Phase 22 causal chain. Optional `emit()` callback for event-stream telemetry sink. Authored as `.mjs` to sidestep the Phase 22 Node 24 + Windows + .mjs↔.ts loader bug. (Plan 23-02)
1842
+ - **Solidify-with-rollback gate** - `scripts/lib/design-solidify.mjs` runs the typecheck/build/targeted-test triplet for a task and, on any failure, rolls the working tree back via `git stash` (configurable: `stash` | `hard` | `none`) and emits a `solidify.rollback` event onto the Phase 22 causal chain. Optional `emit()` callback for event-stream telemetry sink. Authored as `.mjs` to sidestep the Phase 22 Node 24 + Windows + .mjs↔.ts loader bug. (Plan 23-02)
1755
1843
 
1756
- - **Touches: analyzer + parallelism decision engine** `scripts/lib/touches-analyzer/index.cjs` parses `Touches:` lines from task markdown into glob lists and produces a pairwise verdict (`parallel` | `sequential`) for any two tasks. Encodes today's prompt-only heuristic into auditable code. Verdict rules (first match wins): empty → unknown-touches; literal equality → shared-glob; shared component dir → shared-component-dir; resolved-file overlap → shared-file; otherwise → disjoint. (Plan 23-03)
1844
+ - **Touches: analyzer + parallelism decision engine** - `scripts/lib/touches-analyzer/index.cjs` parses `Touches:` lines from task markdown into glob lists and produces a pairwise verdict (`parallel` | `sequential`) for any two tasks. Encodes today's prompt-only heuristic into auditable code. Verdict rules (first match wins): empty → unknown-touches; literal equality → shared-glob; shared component dir → shared-component-dir; resolved-file overlap → shared-file; otherwise → disjoint. (Plan 23-03)
1757
1845
 
1758
- - **Audit aggregator** `scripts/lib/audit-aggregator/index.cjs` takes `Array<Finding>` from N audit-agents, dedups by `{file, line, rule_id}`, scores via severity-weighted formula (P0:8/P1:4/P2:2/P3:1), and returns sorted top-N + tally summary. Default merge picks higher-confidence → higher-severity → lex-earliest agent → first-seen. Confidence outside `[0, 1]` clamped with one `process.emitWarning` per call. Cross-platform path normalization. (Plan 23-04)
1846
+ - **Audit aggregator** - `scripts/lib/audit-aggregator/index.cjs` takes `Array<Finding>` from N audit-agents, dedups by `{file, line, rule_id}`, scores via severity-weighted formula (P0:8/P1:4/P2:2/P3:1), and returns sorted top-N + tally summary. Default merge picks higher-confidence → higher-severity → lex-earliest agent → first-seen. Confidence outside `[0, 1]` clamped with one `process.emitWarning` per call. Cross-platform path normalization. (Plan 23-04)
1759
1847
 
1760
- - **Reference resolver** `scripts/lib/reference-resolver.cjs` adds the resolution direction on top of the Phase 14.5 reference-registry. `resolve('forms')` / `resolve('type:forms')` → `{name, path, type, excerpt}` with a 200-char excerpt suitable for inlining into agent prompts. Lookup order: exact name → slug match → singularize fuzzy → type-only-when-unique. Ambiguous match throws `RangeError` with candidates. `resolveAll(keys, {ignoreMissing})` for bulk. `excerptOf(path, {maxChars})` strips frontmatter / fenced code / HTML comments / markdown headers. (Plan 23-05)
1848
+ - **Reference resolver** - `scripts/lib/reference-resolver.cjs` adds the resolution direction on top of the Phase 14.5 reference-registry. `resolve('forms')` / `resolve('type:forms')` → `{name, path, type, excerpt}` with a 200-char excerpt suitable for inlining into agent prompts. Lookup order: exact name → slug match → singularize fuzzy → type-only-when-unique. Ambiguous match throws `RangeError` with candidates. `resolveAll(keys, {ignoreMissing})` for bulk. `excerptOf(path, {maxChars})` strips frontmatter / fenced code / HTML comments / markdown headers. (Plan 23-05)
1761
1849
 
1762
- - **Touches pattern miner** `scripts/lib/touches-pattern-miner.cjs` scans `.design/archive/cycle-*/tasks/*.md` after `/gdd:complete-cycle`, canonicalizes signatures (lowercase + backslash-normalize + cycle-slug strip + dedup + sort), and proposes crystallization candidates when a signature recurs in ≥3 tasks across ≥2 cycles. Writes `.design/learnings/touches-patterns.json` atomically (`.tmp` + rename). **NEVER auto-applies** `/gdd:apply-reflections` is the materialization gate. (Plan 23-06)
1850
+ - **Touches pattern miner** - `scripts/lib/touches-pattern-miner.cjs` scans `.design/archive/cycle-*/tasks/*.md` after `/gdd:complete-cycle`, canonicalizes signatures (lowercase + backslash-normalize + cycle-slug strip + dedup + sort), and proposes crystallization candidates when a signature recurs in ≥3 tasks across ≥2 cycles. Writes `.design/learnings/touches-patterns.json` atomically (`.tmp` + rename). **NEVER auto-applies** - `/gdd:apply-reflections` is the materialization gate. (Plan 23-06)
1763
1851
 
1764
- - **Image diff + visual baseline manager** `scripts/lib/visual-baseline/diff.cjs` compares two PNG buffers. With `pngjs` installed (probeOptional), decodes both and counts pixels whose R/G/B/A channels differ beyond the tolerance (default 4). Without `pngjs`, falls back to bytewise SHA-256 equality. `scripts/lib/visual-baseline/index.cjs` exposes `compareToBaseline(key, pngBuffer)` and `applyBaseline(key, pngBuffer)`; reads/writes `.design/baselines/<key>.png`; rejects path-traversal keys. `pngjs@7` declared as optional dep. Defers Playwright/Preview MCP screenshot capture orchestration to a later phase. (Plan 23-07)
1852
+ - **Image diff + visual baseline manager** - `scripts/lib/visual-baseline/diff.cjs` compares two PNG buffers. With `pngjs` installed (probeOptional), decodes both and counts pixels whose R/G/B/A channels differ beyond the tolerance (default 4). Without `pngjs`, falls back to bytewise SHA-256 equality. `scripts/lib/visual-baseline/index.cjs` exposes `compareToBaseline(key, pngBuffer)` and `applyBaseline(key, pngBuffer)`; reads/writes `.design/baselines/<key>.png`; rejects path-traversal keys. `pngjs@7` declared as optional dep. Defers Playwright/Preview MCP screenshot capture orchestration to a later phase. (Plan 23-07)
1765
1853
 
1766
- - **Design-token reader (multi-source)** `scripts/lib/design-tokens/index.cjs` facades over four pure-JS readers producing the uniform `{tokens, source, format, warnings}` shape:
1767
- - `css-vars.cjs` extracts `--token: value;` from CSS/SCSS, last-write-wins, strips block comments, warns on `$scss-vars`
1768
- - `js-const.cjs` spawn-node harness evaluates CJS/ESM exports, recognises `{tokens: …}` / default / direct bag, flattens nested with `.` separator
1769
- - `tailwind.cjs` same harness, walks `theme` + `theme.extend` per scale (extend overrides base)
1770
- - `figma.cjs` parses `{variableCollections}` shape OR already-flattened bag; emits `rgb(R, G, B)` for color values, per-mode tokens for multi-mode variables
1854
+ - **Design-token reader (multi-source)** - `scripts/lib/design-tokens/index.cjs` facades over four pure-JS readers producing the uniform `{tokens, source, format, warnings}` shape:
1855
+ - `css-vars.cjs` - extracts `--token: value;` from CSS/SCSS, last-write-wins, strips block comments, warns on `$scss-vars`
1856
+ - `js-const.cjs` - spawn-node harness evaluates CJS/ESM exports, recognises `{tokens: …}` / default / direct bag, flattens nested with `.` separator
1857
+ - `tailwind.cjs` - same harness, walks `theme` + `theme.extend` per scale (extend overrides base)
1858
+ - `figma.cjs` - parses `{variableCollections}` shape OR already-flattened bag; emits `rgb(R, G, B)` for color values, per-mode tokens for multi-mode variables
1771
1859
  Auto-detection by extension + content sniff. (Plan 23-08)
1772
1860
 
1773
- - **Domain primitives bundle** three checkers sharing a single hit shape (`{rule_id, severity P0-P3, summary, evidence?, line?, file}`):
1774
- - `domain-primitives/nng.cjs` runs grep-style heuristic rules loaded from `reference/heuristics.md` fenced yaml blocks; caller may inject `opts.rules` to bypass file-load
1775
- - `domain-primitives/anti-patterns.cjs` same yaml extractor against `reference/anti-patterns.md`
1776
- - `domain-primitives/wcag.cjs` (no axe-core dep) `contrastRatio()` (WCAG 1.4.3 luminance), `checkContrast({fg, bg, level: AA|AAA})`, `checkTapTarget({width, height, level})` (AA 24×24, AAA 44×44), `checkAriaLabels({content})` (interactive elements without text + aria-label)
1777
- Both NNG + anti-pattern files allow no parseable yaml today (treated as empty registry); robust to gradual rule population. (Plan 23-09)
1861
+ - **Domain primitives bundle** - three checkers sharing a single hit shape (`{rule_id, severity P0-P3, summary, evidence?, line?, file}`):
1862
+ - `domain-primitives/nng.cjs` - runs grep-style heuristic rules loaded from `reference/heuristics.md` fenced yaml blocks; caller may inject `opts.rules` to bypass file-load
1863
+ - `domain-primitives/anti-patterns.cjs` - same yaml extractor against `reference/anti-patterns.md`
1864
+ - `domain-primitives/wcag.cjs` (no axe-core dep) - `contrastRatio()` (WCAG 1.4.3 luminance), `checkContrast({fg, bg, level: AA|AAA})`, `checkTapTarget({width, height, level})` (AA 24×24, AAA 44×44), `checkAriaLabels({content})` (interactive elements without text + aria-label)
1865
+ Both NNG + anti-pattern files allow no parseable yaml today (treated as empty registry); solid to gradual rule population. (Plan 23-09)
1778
1866
 
1779
1867
  ### Changed
1780
1868
 
@@ -1783,35 +1871,35 @@ Phase 23 GDD SDK Domain Primitives milestone — lands the highest-leverage code
1783
1871
 
1784
1872
  ### Tests
1785
1873
 
1786
- - `tests/output-contracts-23-01.test.cjs` planner + verifier contracts (14 tests)
1787
- - `tests/design-solidify.test.cjs` solidify gate, all rollback modes (6)
1788
- - `tests/touches-analyzer.test.cjs` parser + verdict + matrix (17)
1789
- - `tests/audit-aggregator.test.cjs` dedup + score + tallies (15)
1790
- - `tests/reference-resolver.test.cjs` resolution rules + excerpts (12)
1791
- - `tests/touches-pattern-miner.test.cjs` canonicalize + thresholds + atomic write (10)
1792
- - `tests/visual-baseline.test.cjs` diff modes + baseline round-trip (14, pngjs-optional path skipped when absent)
1793
- - `tests/design-tokens.test.cjs` 4 readers + facade auto-detect (15)
1794
- - `tests/domain-primitives.test.cjs` NNG + anti-pattern + WCAG checkers (18)
1795
- - `tests/phase-23-baseline.test.cjs` Phase 23 regression baseline (12)
1874
+ - `tests/output-contracts-23-01.test.cjs` - planner + verifier contracts (14 tests)
1875
+ - `tests/design-solidify.test.cjs` - solidify gate, all rollback modes (6)
1876
+ - `tests/touches-analyzer.test.cjs` - parser + verdict + matrix (17)
1877
+ - `tests/audit-aggregator.test.cjs` - dedup + score + tallies (15)
1878
+ - `tests/reference-resolver.test.cjs` - resolution rules + excerpts (12)
1879
+ - `tests/touches-pattern-miner.test.cjs` - canonicalize + thresholds + atomic write (10)
1880
+ - `tests/visual-baseline.test.cjs` - diff modes + baseline round-trip (14, pngjs-optional path skipped when absent)
1881
+ - `tests/design-tokens.test.cjs` - 4 readers + facade auto-detect (15)
1882
+ - `tests/domain-primitives.test.cjs` - NNG + anti-pattern + WCAG checkers (18)
1883
+ - `tests/phase-23-baseline.test.cjs` - Phase 23 regression baseline (12)
1796
1884
 
1797
1885
  Total: 133 new tests. All Phase 20/21/22 tests still green.
1798
1886
 
1799
1887
  ### Deferred
1800
1888
 
1801
- - **`@hegemonart/gdd-sdk` separate npm package** out of scope; build/packaging project of its own.
1802
- - **Screenshot capture orchestration** (Playwright + Claude Preview MCP wrapper) needs live MCP infra to validate.
1803
- - **Spec↔code↔visual triangulation verifier** depends on Phase 16/17 component specs being fleshed out.
1804
- - **Knowledge-graph typed query layer** + cycle/workstream model SDK + pause/resume context serializer SDK + per-stage budget allocator SDK + git operations primitive + handoff bundle parser + intel store typed reader/writer each is roadmap-text-sized and warrants its own phase scope.
1889
+ - **`@hegemonart/gdd-sdk` separate npm package** - out of scope; build/packaging project of its own.
1890
+ - **Screenshot capture orchestration** (Playwright + Claude Preview MCP wrapper) - needs live MCP infra to validate.
1891
+ - **Spec↔code↔visual triangulation verifier** - depends on Phase 16/17 component specs being fleshed out.
1892
+ - **Knowledge-graph typed query layer** + cycle/workstream model SDK + pause/resume context serializer SDK + per-stage budget allocator SDK + git operations primitive + handoff bundle parser + intel store typed reader/writer - each is roadmap-text-sized and warrants its own phase scope.
1805
1893
 
1806
1894
  ---
1807
1895
 
1808
- ## [1.22.0] 2026-04-25
1896
+ ## [1.22.0] - 2026-04-25
1809
1897
 
1810
- Phase 22 GDD SDK Observability milestone the single-typed `BaseEvent` envelope from Phase 20 grows into a queryable, redacted, transport-able observability layer with tail/grep/WebSocket consumers and a causal event chain. 10 plans (22-01 through 22-10), additive every Phase 20 + Phase 21 consumer keeps working unchanged.
1898
+ Phase 22 GDD SDK Observability milestone - the single-typed `BaseEvent` envelope from Phase 20 grows into a queryable, redacted, transport-able observability layer with tail/grep/WebSocket consumers and a causal event chain. 10 plans (22-01 through 22-10), additive - every Phase 20 + Phase 21 consumer keeps working unchanged.
1811
1899
 
1812
1900
  ### Added
1813
1901
 
1814
- - **Expanded event-type registry** 17 new pre-registered subtypes alongside
1902
+ - **Expanded event-type registry** - 17 new pre-registered subtypes alongside
1815
1903
  the 6 from Phase 20: `wave.started`, `wave.completed`, `blocker.added`,
1816
1904
  `decision.added`, `must_have.added`, `parallelism.verdict`, `cost.update`,
1817
1905
  `rate_limit`, `api.retry`, `compact.boundary`, `mcp.probe`,
@@ -1821,23 +1909,23 @@ Phase 22 GDD SDK Observability milestone — the single-typed `BaseEvent` envelo
1821
1909
  overlay for typed `switch` consumers. Runtime `KNOWN_EVENT_TYPES` list
1822
1910
  exported for the CLI's `list-types` subcommand. (Plan 22-01)
1823
1911
 
1824
- - **Secret scrubber** `scripts/lib/redact.cjs` deep-walks every event
1912
+ - **Secret scrubber** - `scripts/lib/redact.cjs` deep-walks every event
1825
1913
  payload and replaces secret-shaped strings with `[REDACTED:<type>]`
1826
1914
  placeholders. Patterns: `sk-ant-…` (anthropic), `sk_live_…` (stripe),
1827
1915
  `xox[baprs]-…` (slack), `ghp_…` (github_pat), `AKIA…` (aws), generic
1828
1916
  `sk-…`, `eyJ…` JWTs, and full `-----BEGIN/END-----` PEM blocks.
1829
1917
  Wired into `EventWriter.serialize()` so every event hitting disk and
1830
- every bus subscriber sees the scrubbed form single rule everywhere,
1918
+ every bus subscriber sees the scrubbed form - single rule everywhere,
1831
1919
  no escape hatch. (Plan 22-02)
1832
1920
 
1833
- - **Per-tool-call trajectory stream** `.design/telemetry/trajectories/<cycle>.jsonl`
1921
+ - **Per-tool-call trajectory stream** - `.design/telemetry/trajectories/<cycle>.jsonl`
1834
1922
  receives one line per agent tool-use:
1835
1923
  `{ts, agent, tool, args_hash, result_hash, latency_ms, status}`.
1836
- Args + result are sha256-prefix-hashed (16 chars) line size stays
1924
+ Args + result are sha256-prefix-hashed (16 chars) - line size stays
1837
1925
  bounded; prompt content stays de-identified. Captured by the new
1838
1926
  PostToolUse:Agent hook `hooks/gdd-trajectory-capture.js`. (Plan 22-03)
1839
1927
 
1840
- - **Append-only event chain** `.design/gep/events.jsonl` (gep =
1928
+ - **Append-only event chain** - `.design/gep/events.jsonl` (gep =
1841
1929
  "GDD Event Provenance"). One line per causal hop: `{event_id,
1842
1930
  parent_event_id, ts, agent, decision_refs, outcome, rollback_reason?}`.
1843
1931
  `appendChainEvent()` auto-generates UUIDs; `walkParents()` traces a
@@ -1845,47 +1933,47 @@ Phase 22 GDD SDK Observability milestone — the single-typed `BaseEvent` envelo
1845
1933
  invalid lines; lives separately from the firehose so audits don't
1846
1934
  scan unrelated rows. (Plan 22-04)
1847
1935
 
1848
- - **Typed event reader + aggregator** `readEvents({path, type,
1936
+ - **Typed event reader + aggregator** - `readEvents({path, type,
1849
1937
  predicate, since, until})` returns an async streaming iterator over
1850
- `events.jsonl` (readline + createReadStream no full-file load,
1938
+ `events.jsonl` (readline + createReadStream - no full-file load,
1851
1939
  GB-scale logs OK). `aggregate()` rolls events up by type, stage,
1852
1940
  cycle, agent + totals (count, error_count, truncated_count). Exposed
1853
1941
  from the public event-stream API. (Plan 22-05)
1854
1942
 
1855
- - **CLI transport** `gdd-events` bin entry, subcommands:
1943
+ - **CLI transport** - `gdd-events` bin entry, subcommands:
1856
1944
  `tail [--follow]` (250ms-poll follow mode, no native inotify dep);
1857
1945
  `grep <terms…>` with hand-rolled filter language
1858
1946
  (`type=foo`, `payload.x.y=bar`, `!type=baz`, multiple = AND);
1859
1947
  `cat` pretty-print with timestamp+type prefix; `list-types` runtime
1860
1948
  registry dump; `serve` for the WebSocket transport. (Plan 22-06)
1861
1949
 
1862
- - **WebSocket transport** `scripts/lib/transports/ws.cjs` exposes
1950
+ - **WebSocket transport** - `scripts/lib/transports/ws.cjs` exposes
1863
1951
  `startServer({port, token, tailFrom?, subscribe?})`. Loaded via
1864
- `probeOptional('ws')` clear install hint when absent. Auth:
1952
+ `probeOptional('ws')` - clear install hint when absent. Auth:
1865
1953
  `Authorization: Bearer <token>` on the upgrade; mismatched →
1866
1954
  HTTP 401 close. Tail replay sends `tailFrom`'s contents to new
1867
1955
  clients before subscribing them to the live bus. Fire-and-forget
1868
1956
  delivery; closed sockets dropped silently. `ws@8` declared as
1869
1957
  optional dep. (Plan 22-07)
1870
1958
 
1871
- - **Connection probe primitive** `scripts/lib/connection-probe/`
1959
+ - **Connection probe primitive** - `scripts/lib/connection-probe/`
1872
1960
  exposes `probe({name, cmd, timeout, retries, fallback})` →
1873
1961
  `{status: 'ok'|'degraded'|'down', latency_ms, attempts,
1874
1962
  fallback_used, error?}`. Backoff between retries via
1875
1963
  `jittered-backoff.cjs`. State persisted at
1876
1964
  `.design/telemetry/connection-state.json` (atomic .tmp+rename).
1877
1965
  Status transitions emit `connection.status_change` events through a
1878
- caller-supplied `emit` callback transitions only, not every probe.
1966
+ caller-supplied `emit` callback - transitions only, not every probe.
1879
1967
  Replaces ad-hoc bash probe snippets in `connections/`. (Plan 22-08)
1880
1968
 
1881
- - **Hook → event-stream wire-in** new `hooks/_hook-emit.js` shared
1969
+ - **Hook → event-stream wire-in** - new `hooks/_hook-emit.js` shared
1882
1970
  helper wraps `appendEvent()` in try/catch (hooks must NEVER throw on
1883
1971
  telemetry failure). Wired hooks emit `hook.fired` events on every
1884
1972
  decision: `gdd-bash-guard` (allow/block + severity + pattern),
1885
1973
  `gdd-protected-paths` (allow/block + matched glob),
1886
1974
  `gdd-decision-injector` (inject/no-hits + backend label).
1887
1975
  Trajectory-capture (Plan 22-03) already emits via its own path.
1888
- Additive zero behavior change to existing hook contracts. (Plan 22-09)
1976
+ Additive - zero behavior change to existing hook contracts. (Plan 22-09)
1889
1977
 
1890
1978
  ### Changed
1891
1979
 
@@ -1899,17 +1987,17 @@ Phase 22 GDD SDK Observability milestone — the single-typed `BaseEvent` envelo
1899
1987
 
1900
1988
  ### Tests
1901
1989
 
1902
- - `tests/event-types-registry.test.ts` registry expansion (4 tests)
1903
- - `tests/redact.test.cjs` secret scrubber (12 tests)
1904
- - `tests/event-stream-redact-integration.test.ts` write-time wire-in (2 tests)
1905
- - `tests/trajectory-capture.test.cjs` module + hook subprocess (7 tests)
1906
- - `tests/event-chain.test.cjs` chain + walk + cycle defense (10 tests)
1907
- - `tests/event-reader.test.ts` reader + aggregator (8 tests)
1908
- - `tests/cli-events.test.cjs` CLI subcommands + filter language (10 tests)
1909
- - `tests/ws-transport.test.cjs` WebSocket auth + replay + live (5 + 1 skip)
1910
- - `tests/connection-probe-primitive.test.cjs` retry + fallback + emit (9 tests)
1911
- - `tests/hook-emit-wire.test.cjs` bash-guard + protected-paths emission (4 tests)
1912
- - `tests/phase-22-baseline.test.cjs` Phase 22 regression baseline (12 tests)
1990
+ - `tests/event-types-registry.test.ts` - registry expansion (4 tests)
1991
+ - `tests/redact.test.cjs` - secret scrubber (12 tests)
1992
+ - `tests/event-stream-redact-integration.test.ts` - write-time wire-in (2 tests)
1993
+ - `tests/trajectory-capture.test.cjs` - module + hook subprocess (7 tests)
1994
+ - `tests/event-chain.test.cjs` - chain + walk + cycle defense (10 tests)
1995
+ - `tests/event-reader.test.ts` - reader + aggregator (8 tests)
1996
+ - `tests/cli-events.test.cjs` - CLI subcommands + filter language (10 tests)
1997
+ - `tests/ws-transport.test.cjs` - WebSocket auth + replay + live (5 + 1 skip)
1998
+ - `tests/connection-probe-primitive.test.cjs` - retry + fallback + emit (9 tests)
1999
+ - `tests/hook-emit-wire.test.cjs` - bash-guard + protected-paths emission (4 tests)
2000
+ - `tests/phase-22-baseline.test.cjs` - Phase 22 regression baseline (12 tests)
1913
2001
 
1914
2002
  Total: 84 new tests. All Phase 20/21 tests still green.
1915
2003
 
@@ -1922,63 +2010,63 @@ Total: 84 new tests. All Phase 20/21 tests still green.
1922
2010
  - Replay-on-subscribe semantics (bus stays live-only; transports that
1923
2011
  want replay read `events.jsonl` directly, then subscribe live).
1924
2012
  - Wire-in for `gdd-mcp-circuit-breaker.js`, `budget-enforcer.ts`,
1925
- `context-exhaustion.ts`, `gdd-read-injection-scanner.ts` flow is
2013
+ `context-exhaustion.ts`, `gdd-read-injection-scanner.ts` - flow is
1926
2014
  more intricate; follow-up phase.
1927
2015
 
1928
2016
  ---
1929
2017
 
1930
- ## [1.21.0] 2026-04-24
2018
+ ## [1.21.0] - 2026-04-24
1931
2019
 
1932
- Phase 21 GDD SDK Headless milestone the plugin now runs unchanged on Claude Code, OpenAI Codex CLI, and Gemini CLI, and ships a full `gdd-sdk` CLI that executes the design pipeline without a harness. 12 plans (21-01 through 21-12), 50+ commits, 936 tests.
2020
+ Phase 21 GDD SDK Headless milestone - the plugin now runs unchanged on Claude Code, OpenAI Codex CLI, and Gemini CLI, and ships a full `gdd-sdk` CLI that executes the design pipeline without a harness. 12 plans (21-01 through 21-12), 50+ commits, 936 tests.
1933
2021
 
1934
2022
  ### Added
1935
2023
 
1936
- - **Headless SDK** new `bin/gdd-sdk` CLI that runs the full design pipeline
2024
+ - **Headless SDK** - new `bin/gdd-sdk` CLI that runs the full design pipeline
1937
2025
  without Claude Code. Subcommands: `run`, `stage <name>`, `query <op>`,
1938
2026
  `audit`, `init`. Publishes as `gdd-sdk` in `package.json` `bin`. See
1939
2027
  `docs/HEADLESS.md` (Phase 23 deliverable) for CI integration guidance.
1940
- - **Session runner** (`scripts/lib/session-runner/`) typed wrapper around
2028
+ - **Session runner** (`scripts/lib/session-runner/`) - typed wrapper around
1941
2029
  `@anthropic-ai/claude-agent-sdk` with USD/token budget caps, turn caps,
1942
2030
  transcript capture, structured error mapping via `gdd-errors` taxonomy.
1943
2031
  Emits `session.started`, `session.completed`, `session.budget_exceeded`
1944
2032
  events on the shared event stream.
1945
- - **Context engine** (`scripts/lib/context-engine/`) per-stage file
2033
+ - **Context engine** (`scripts/lib/context-engine/`) - per-stage file
1946
2034
  manifest + markdown-aware truncation that preserves frontmatter, every
1947
2035
  heading, and the first paragraph of each section for files larger than
1948
- 8 KiB. Keeps session prompts within budget without dropping load-bearing
2036
+ 8 KiB. Keeps session prompts within budget without dropping essential
1949
2037
  context.
1950
- - **Tool scoping** (`scripts/lib/tool-scoping/`) per-stage allowed-tools
2038
+ - **Tool scoping** (`scripts/lib/tool-scoping/`) - per-stage allowed-tools
1951
2039
  enforcement at session creation. Verify is read-only; Explore adds web;
1952
2040
  Design permits shell mutations. Per-agent frontmatter overrides via
1953
2041
  `parseAgentTools()` for agent-level deviations.
1954
- - **Structured logger** (`scripts/lib/logger/`) leveled (debug/info/warn/
2042
+ - **Structured logger** (`scripts/lib/logger/`) - leveled (debug/info/warn/
1955
2043
  error) with JSONL output in headless mode, ANSI-colored stderr in
1956
2044
  interactive mode. `warn`/`error` also emit `ErrorEvent` on the event
1957
2045
  stream for CI consumers.
1958
- - **Pipeline runner** (`scripts/lib/pipeline-runner/`) brief → explore →
2046
+ - **Pipeline runner** (`scripts/lib/pipeline-runner/`) - brief → explore →
1959
2047
  plan → design → verify state machine with retry-once, halt logic,
1960
2048
  human-gate callbacks, config-driven step skipping. Emits
1961
2049
  `pipeline.started`, `pipeline.completed`, `pipeline.halted`.
1962
- - **Explore parallel runner** (`scripts/lib/explore-parallel-runner/`)
2050
+ - **Explore parallel runner** (`scripts/lib/explore-parallel-runner/`) -
1963
2051
  4 mappers (token, component-taxonomy, a11y, visual-hierarchy) concurrent
1964
2052
  with streaming synthesizer. Honors `parallelism_safe` agent frontmatter
1965
2053
  for opt-in isolation.
1966
- - **Discuss parallel runner** (`scripts/lib/discuss-parallel-runner/`)
2054
+ - **Discuss parallel runner** (`scripts/lib/discuss-parallel-runner/`) -
1967
2055
  N discussant variants (user-journey, technical-constraint, brand-fit,
1968
2056
  accessibility) concurrent, aggregator dedupes and clusters questions.
1969
- - **`gdd-sdk init`** (`scripts/lib/init-runner/`) new-project bootstrap
2057
+ - **`gdd-sdk init`** (`scripts/lib/init-runner/`) - new-project bootstrap
1970
2058
  spawning 4 parallel researchers (design-system-audit, brand-context,
1971
2059
  accessibility-baseline, competitive-references) + synthesizer producing
1972
2060
  `.design/DESIGN-CONTEXT.md` draft.
1973
- - **Cross-harness portability** (`scripts/lib/harness/`) the plugin now
2061
+ - **Cross-harness portability** (`scripts/lib/harness/`) - the plugin now
1974
2062
  runs unchanged on Claude Code, OpenAI Codex CLI, and Gemini CLI. Ships
1975
2063
  `reference/codex-tools.md`, `reference/gemini-tools.md`, `AGENTS.md`
1976
2064
  (Codex), `GEMINI.md` (Gemini). The `gdd-state` MCP server works on all
1977
2065
  three harnesses; harness detection is runtime-driven.
1978
- - **E2E headless integration test** `tests/e2e-headless.test.ts` with a
2066
+ - **E2E headless integration test** - `tests/e2e-headless.test.ts` with a
1979
2067
  dry-run variant (always runs) and a live variant (gated on
1980
2068
  `ANTHROPIC_API_KEY`). CI workflow gains an `e2e-headless` job.
1981
- - **Phase 21 regression baseline** at `test-fixture/baselines/phase-21/`
2069
+ - **Phase 21 regression baseline** at `test-fixture/baselines/phase-21/` -
1982
2070
  directory list, module list, agent list, connections list, CLI
1983
2071
  subcommand list, event-type list. Enforced by
1984
2072
  `tests/phase-21-baseline.test.cjs`.
@@ -2005,29 +2093,29 @@ Phase 21 GDD SDK Headless milestone — the plugin now runs unchanged on Claude
2005
2093
 
2006
2094
  ---
2007
2095
 
2008
- ## [1.20.0] 2026-04-24
2096
+ ## [1.20.0] - 2026-04-24
2009
2097
 
2010
- Phase 20 SDK foundation milestone the shift from "design pipeline" to "typed SDK + MCP server + resilience primitives + event stream". 16 plans (20-00 through 20-15), 50+ commits, 645+ tests.
2098
+ Phase 20 SDK foundation milestone - the shift from "design pipeline" to "typed SDK + MCP server + resilience primitives + event stream". 16 plans (20-00 through 20-15), 50+ commits, 645+ tests.
2011
2099
 
2012
2100
  ### Added
2013
2101
 
2014
- - **Resilience primitives** (headline upgrade) pipeline now survives Anthropic API rate limits, 429 responses, and context-overflow errors without manual restart. New modules:
2015
- - `scripts/lib/jittered-backoff.cjs` decorrelated-jitter exponential backoff with a pluggable clock for testability.
2016
- - `scripts/lib/rate-guard.cjs` token-bucket rate limiter with `RateLimitSchema`-driven config.
2017
- - `scripts/lib/error-classifier.cjs` three-class taxonomy (transient / retryable-after / fatal) mapping real Anthropic error codes.
2018
- - `scripts/lib/iteration-budget.cjs` bounded-iteration guard for recovery loops with `IterationBudgetSchema`.
2102
+ - **Resilience primitives** (headline upgrade) - pipeline now survives Anthropic API rate limits, 429 responses, and context-overflow errors without manual restart. New modules:
2103
+ - `scripts/lib/jittered-backoff.cjs` - decorrelated-jitter exponential backoff with a pluggable clock for testability.
2104
+ - `scripts/lib/rate-guard.cjs` - token-bucket rate limiter with `RateLimitSchema`-driven config.
2105
+ - `scripts/lib/error-classifier.cjs` - three-class taxonomy (transient / retryable-after / fatal) mapping real Anthropic error codes.
2106
+ - `scripts/lib/iteration-budget.cjs` - bounded-iteration guard for recovery loops with `IterationBudgetSchema`.
2019
2107
  - See [`reference/error-recovery.md`](reference/error-recovery.md) for the recovery protocol.
2020
- - **`gdd-state` MCP server** at `scripts/mcp-servers/gdd-state/` 11 typed tools replace ad-hoc `Read + regex + Write` patterns for STATE.md:
2108
+ - **`gdd-state` MCP server** at `scripts/mcp-servers/gdd-state/` - 11 typed tools replace ad-hoc `Read + regex + Write` patterns for STATE.md:
2021
2109
  - `gdd_state__get`, `__update_progress`, `__transition_stage`, `__add_blocker`, `__resolve_blocker`, `__add_decision`, `__add_must_have`, `__set_status`, `__checkpoint`, `__probe_connections`, `__frontmatter_update`.
2022
2110
  - Every tool has a JSON Schema at `scripts/mcp-servers/gdd-state/schemas/`; inputs and outputs are strict-validated.
2023
2111
  - Every mutation emits a typed event to `.design/telemetry/events.jsonl`.
2024
- - **Typed state core** (`scripts/lib/gdd-state/`) `parse()`, `serialize()`, `mutate()`, `transition()`, `read()`. Lockfile-safe concurrent writes validated by a 4-way race-condition test (`tests/race-condition-state-mutation.test.ts`) 2000 concurrent ops, zero lost writes, <60s.
2025
- - **Event stream foundation** `.design/telemetry/events.jsonl` append-only with a typed `EventBus`. Parallel stream to the existing `costs.jsonl` cost telemetry.
2026
- - **Prompt sanitizer** (`scripts/lib/prompt-sanitizer/`) strips interactive-only constructs (AskUserQuestion, STOP, `/gdd:` slash commands) from skill bodies for future headless-runner support.
2027
- - **TypeScript toolchain** strict `tsconfig.json`, schema codegen to `reference/schemas/generated.d.ts`, Node 22 `--experimental-strip-types` direct execution (no bundler step).
2112
+ - **Typed state core** (`scripts/lib/gdd-state/`) - `parse()`, `serialize()`, `mutate()`, `transition()`, `read()`. Lockfile-safe concurrent writes validated by a 4-way race-condition test (`tests/race-condition-state-mutation.test.ts`) - 2000 concurrent ops, zero lost writes, <60s.
2113
+ - **Event stream foundation** - `.design/telemetry/events.jsonl` append-only with a typed `EventBus`. Parallel stream to the existing `costs.jsonl` cost telemetry.
2114
+ - **Prompt sanitizer** (`scripts/lib/prompt-sanitizer/`) - strips interactive-only constructs (AskUserQuestion, STOP, `/gdd:` slash commands) from skill bodies for future headless-runner support.
2115
+ - **TypeScript toolchain** - strict `tsconfig.json`, schema codegen to `reference/schemas/generated.d.ts`, Node 22 `--experimental-strip-types` direct execution (no bundler step).
2028
2116
  - **Transition gates** as pure functions (`briefToExplore`, `exploreToPlan`, `planToDesign`, `designToVerify`) with fixture-based tests.
2029
2117
  - **`GDDError` 3-class taxonomy** (`ValidationError`, `StateConflictError`, `OperationFailedError`) at `scripts/lib/gdd-errors/`.
2030
- - **Phase 20 regression baseline** at `test-fixture/baselines/phase-20/` agent list, skill list, frontmatter snapshot, MCP tools manifest (schema sha256), events schema hash, hook list, resilience primitives list. Enforced by `tests/regression-baseline-phase-20.test.cjs`.
2118
+ - **Phase 20 regression baseline** at `test-fixture/baselines/phase-20/` - agent list, skill list, frontmatter snapshot, MCP tools manifest (schema sha256), events schema hash, hook list, resilience primitives list. Enforced by `tests/regression-baseline-phase-20.test.cjs`.
2031
2119
 
2032
2120
  ### Changed
2033
2121
 
@@ -2042,7 +2130,7 @@ Phase 20 SDK foundation milestone — the shift from "design pipeline" to "typed
2042
2130
  ### Security
2043
2131
 
2044
2132
  - Lockfile-safe STATE.md mutations validated by 4-way concurrent race-condition test. Each mutation acquires `${path}.lock` (PID + timestamp), performs read-modify-write under the lock, writes to `${path}.tmp`, and atomic-renames. Windows EPERM/EBUSY from AV scanners is retried transparently.
2045
- - Prompt sanitizer strips untrusted interactive constructs before headless execution paths reduces prompt-injection surface for future runner work.
2133
+ - Prompt sanitizer strips untrusted interactive constructs before headless execution paths - reduces prompt-injection surface for future runner work.
2046
2134
 
2047
2135
  ### Fixed
2048
2136
 
@@ -2050,12 +2138,12 @@ Phase 20 SDK foundation milestone — the shift from "design pipeline" to "typed
2050
2138
 
2051
2139
  ### Deprecated
2052
2140
 
2053
- - `.js` hooks under `hooks/` replaced by `.ts` equivalents running via `--experimental-strip-types`.
2054
- - Direct `Read → regex → Write` patterns against STATE.md replaced by the 11 `gdd_state__*` MCP tools. Skills that still use the direct pattern will be migrated in a future phase.
2141
+ - `.js` hooks under `hooks/` - replaced by `.ts` equivalents running via `--experimental-strip-types`.
2142
+ - Direct `Read → regex → Write` patterns against STATE.md - replaced by the 11 `gdd_state__*` MCP tools. Skills that still use the direct pattern will be migrated in a future phase.
2055
2143
 
2056
2144
  ### Migration notes
2057
2145
 
2058
- - Consumers of STATE.md should prefer the `gdd_state__*` MCP tools over direct file reads/writes the typed tools emit events, enforce schemas, and are lockfile-safe. Direct reads for non-mutation cases remain supported.
2146
+ - Consumers of STATE.md should prefer the `gdd_state__*` MCP tools over direct file reads/writes - the typed tools emit events, enforce schemas, and are lockfile-safe. Direct reads for non-mutation cases remain supported.
2059
2147
  - Node 22+ is required for `--experimental-strip-types` execution of `.ts` scripts. The CI matrix already pins Node 22 & 24.
2060
2148
  - No breaking API changes. All legacy skills and agents continue to work unchanged; the MCP server is additive.
2061
2149
 
@@ -2065,25 +2153,25 @@ Phase 20 SDK foundation milestone — the shift from "design pipeline" to "typed
2065
2153
  - 50+ per-task commits on the Phase 20 branch.
2066
2154
  - 645+ tests across CJS + TS suites, 0 failures, 1 skipped.
2067
2155
  - `tsc --noEmit` green; `validate:schemas` 11/11 green; `validate:frontmatter` 0 violations.
2068
- ## [1.19.6] 2026-04-24
2156
+ ## [1.19.6] - 2026-04-24
2069
2157
 
2070
- ### Added Design Philosophy Layer
2158
+ ### Added - Design Philosophy Layer
2071
2159
 
2072
- Adds a generative reasoning spine on top of the defensive (anti-patterns) and descriptive (heuristics) layers. Purely additive knowledge + lens integration no new agents, skills, or commands.
2160
+ Adds a generative reasoning spine on top of the defensive (anti-patterns) and descriptive (heuristics) layers. Purely additive knowledge + lens integration - no new agents, skills, or commands.
2073
2161
 
2074
- **New `reference/first-principles.md`:** 3-invariant framework (body / attention / memory) with grep-able principle→code pairs and a reducibility test for every design element. Wired into `design-discussant` as Step 0.5 three invariant questions prepended to the brief-stage interview; answers recorded as `[Invariant]` D-XX decisions in STATE.md.
2162
+ **New `reference/first-principles.md`:** 3-invariant framework (body / attention / memory) with grep-able principle→code pairs and a reducibility test for every design element. Wired into `design-discussant` as Step 0.5 - three invariant questions prepended to the brief-stage interview; answers recorded as `[Invariant]` D-XX decisions in STATE.md.
2075
2163
 
2076
2164
  **New `reference/emotional-design.md`:** Don Norman's visceral / behavioral / reflective three-level framework as a cross-cutting scoring lens. Per-level scoring rubrics (1–4) and a cross-level conflict table. Wired into `design-auditor` (Step 4.5 Emotional Design Overlay appended to DESIGN-AUDIT.md) and `design-reflector` (visceral/behavioral divergence check in Section 1).
2077
2165
 
2078
- **New `reference/component-authoring.md`:** Emil Kowalski / Sonner 6-principle component quality standard P-01 Minimal API, P-02 Composability, P-03 Defaults, P-04 Animation as State, P-05 Accessibility First, P-06 Edge Honesty with grep-able audit signals and an ARIA contract table by component type. Wired into design-auditor (Pillar 7 sub-check), design-discussant (`--spec` mode question), and design-verifier must-have checklist.
2166
+ **New `reference/component-authoring.md`:** Emil Kowalski / Sonner 6-principle component quality standard - P-01 Minimal API, P-02 Composability, P-03 Defaults, P-04 Animation as State, P-05 Accessibility First, P-06 Edge Honesty - with grep-able audit signals and an ARIA contract table by component type. Wired into design-auditor (Pillar 7 sub-check), design-discussant (`--spec` mode question), and design-verifier must-have checklist.
2079
2167
 
2080
- **`reference/heuristics.md` extended:** Added Peak-End Rule, Loss Aversion, Cognitive Load Theory (intrinsic / extraneous / germane), Aesthetic-Usability Effect, Doherty Threshold (400ms), and Flow (Csikszentmihalyi) completing the psychology foundations layer.
2168
+ **`reference/heuristics.md` extended:** Added Peak-End Rule, Loss Aversion, Cognitive Load Theory (intrinsic / extraneous / germane), Aesthetic-Usability Effect, Doherty Threshold (400ms), and Flow (Csikszentmihalyi) - completing the psychology foundations layer.
2081
2169
 
2082
- **`reference/motion-advanced.md`:** Disney's 12 Principles UX mapping stub replaced with full authoring all 12 principles translated to interface motion with code examples (Squash and Stretch, Anticipation, Staging, Straight Ahead vs Pose to Pose, Follow Through, Slow In/Slow Out, Arcs, Secondary Action, Timing, Exaggeration, Solid Drawing, Appeal).
2170
+ **`reference/motion-advanced.md`:** Disney's 12 Principles UX mapping stub replaced with full authoring - all 12 principles translated to interface motion with code examples (Squash and Stretch, Anticipation, Staging, Straight Ahead vs Pose to Pose, Follow Through, Slow In/Slow Out, Arcs, Secondary Action, Timing, Exaggeration, Solid Drawing, Appeal).
2083
2171
 
2084
2172
  **`reference/checklists.md`:** Added Rams Lens (10 questions mapping Dieter Rams's principles) and Sonner / Component-Authoring Lens (6 P-0N questions) as post-audit self-checks.
2085
2173
 
2086
- **`reference/shared-preamble.md`:** Added Design Philosophy Layer block pointing to the three new reference files ensures all agents are aware of the philosophy spine.
2174
+ **`reference/shared-preamble.md`:** Added Design Philosophy Layer block pointing to the three new reference files - ensures all agents are aware of the philosophy spine.
2087
2175
 
2088
2176
  **`reference/authority-feeds.md`:** Added `jnd.org` (Don Norman) and `vitsoe.com` (Dieter Rams / Vitsœ) as named-practitioner feeds. Feed count: 26 → 28.
2089
2177
 
@@ -2095,182 +2183,182 @@ Adds a generative reasoning spine on top of the defensive (anti-patterns) and de
2095
2183
 
2096
2184
  ---
2097
2185
 
2098
- ## [1.19.5] 2026-04-24
2186
+ ## [1.19.5] - 2026-04-24
2099
2187
 
2100
- ### Added Cross-Cycle Memory: Recall, Checkpoints, Experience Archive
2188
+ ### Added - Cross-Cycle Memory: Recall, Checkpoints, Experience Archive
2101
2189
 
2102
2190
  Turns write-only learnings and reflections into a queryable, ranked, self-pruning memory layer.
2103
2191
 
2104
- **Search backend (`scripts/lib/design-search.cjs`):** Priority chain FTS5 via `better-sqlite3` (optional dep, runtime-probed) → ripgrep → Node fs scan. `/gdd:recall --reindex` rebuilds the index. `scripts/lib/probe-optional.cjs` wraps optional native deps for future reuse.
2192
+ **Search backend (`scripts/lib/design-search.cjs`):** Priority chain - FTS5 via `better-sqlite3` (optional dep, runtime-probed) → ripgrep → Node fs scan. `/gdd:recall --reindex` rebuilds the index. `scripts/lib/probe-optional.cjs` wraps optional native deps for future reuse.
2105
2193
 
2106
- **Cross-cycle recall (`/gdd:recall <query>`):** `skills/recall/SKILL.md` searches `.design/archive/`, `.design/learnings/LEARNINGS.md`, `.design/CYCLES.md`, and STATE.md decision blocks; signals `surfaced` for matched L-NN IDs via `relevance-counter.cjs`.
2194
+ **Cross-cycle recall (`/gdd:recall <query>`):** `skills/recall/SKILL.md` - searches `.design/archive/`, `.design/learnings/LEARNINGS.md`, `.design/CYCLES.md`, and STATE.md decision blocks; signals `surfaced` for matched L-NN IDs via `relevance-counter.cjs`.
2107
2195
 
2108
- **Numbered checkpoints (pause/resume rewrite):** `skills/pause/SKILL.md` atomic-appends to `.design/checkpoints/NN-<stage>-<ISO-date>.md` instead of clobbering `HANDOFF.md`; `HANDOFF.md` becomes a pointer to the latest checkpoint. `skills/resume/SKILL.md` gains listing mode with `AskUserQuestion` picker when no arg; `/gdd:resume N` restores checkpoint N. `skills/continue/SKILL.md` alias for `/gdd:resume` (discoverability).
2196
+ **Numbered checkpoints (pause/resume rewrite):** `skills/pause/SKILL.md` atomic-appends to `.design/checkpoints/NN-<stage>-<ISO-date>.md` instead of clobbering `HANDOFF.md`; `HANDOFF.md` becomes a pointer to the latest checkpoint. `skills/resume/SKILL.md` gains listing mode with `AskUserQuestion` picker when no arg; `/gdd:resume N` restores checkpoint N. `skills/continue/SKILL.md` - alias for `/gdd:resume` (discoverability).
2109
2197
 
2110
- **Per-cycle EXPERIENCE.md:** `skills/complete-cycle/SKILL.md` extended Haiku-tier writer reads cycle STATE + DESIGN-VERIFICATION + reflections, emits `.design/archive/cycle-N/EXPERIENCE.md` (~100–200 lines, declarative-fact framing: Goal / Decisions made / Learnings graduated / What died / Surprises / Handoff to next cycle). Highest-priority source for decision-injector.
2198
+ **Per-cycle EXPERIENCE.md:** `skills/complete-cycle/SKILL.md` extended - Haiku-tier writer reads cycle STATE + DESIGN-VERIFICATION + reflections, emits `.design/archive/cycle-N/EXPERIENCE.md` (~100–200 lines, declarative-fact framing: Goal / Decisions made / Learnings graduated / What died / Surprises / Handoff to next cycle). Highest-priority source for decision-injector.
2111
2199
 
2112
- **Timeline retrospective (`/gdd:timeline`):** `skills/timeline/SKILL.md` narrative view across EXPERIENCE.md files + git log; sections Opened with / Key decisions / Surprises / What we'd do differently.
2200
+ **Timeline retrospective (`/gdd:timeline`):** `skills/timeline/SKILL.md` - narrative view across EXPERIENCE.md files + git log; sections Opened with / Key decisions / Surprises / What we'd do differently.
2113
2201
 
2114
2202
  **Relevance counter (`scripts/lib/relevance-counter.cjs`):** `record(id, signal, designDir)` under atomic-write + `.lock`; signals: `cited`, `surfaced`, `dismissed`. `shouldPromote` at 8+ cites; `shouldPrune` at 0 cites + 4 cycles.
2115
2203
 
2116
- **Decision-injector FTS5 upgrade:** `hooks/gdd-decision-injector.js` backend-swaps to FTS5 transparently when `design-search.cjs` is available zero surface-level output change, backend label shown in footer.
2204
+ **Decision-injector FTS5 upgrade:** `hooks/gdd-decision-injector.js` backend-swaps to FTS5 transparently when `design-search.cjs` is available - zero surface-level output change, backend label shown in footer.
2117
2205
 
2118
- **Record contract (mandatory for all agents):** `agents/README.md` authoring template gains mandatory `## Record` step every agent appends one JSONL line to `.design/intel/insights.jsonl`. `reference/schemas/insight-line.schema.json` schema with 6 required fields (`ts`, `agent`, `cycle`, `stage`, `one_line_insight`, `artifacts_written`). `tests/record-contract.test.cjs` enforces presence of `## Record` section in every `agents/*.md`. All 36 existing agents updated with stub Record sections.
2206
+ **Record contract (mandatory for all agents):** `agents/README.md` authoring template gains mandatory `## Record` step - every agent appends one JSONL line to `.design/intel/insights.jsonl`. `reference/schemas/insight-line.schema.json` - schema with 6 required fields (`ts`, `agent`, `cycle`, `stage`, `one_line_insight`, `artifacts_written`). `tests/record-contract.test.cjs` enforces presence of `## Record` section in every `agents/*.md`. All 36 existing agents updated with stub Record sections.
2119
2207
 
2120
2208
  ---
2121
2209
 
2122
- ## [1.19.0] 2026-04-24
2210
+ ## [1.19.0] - 2026-04-24
2123
2211
 
2124
- ### Added Platform, Inclusive Design & UX Research References (knowledge-layer complete)
2212
+ ### Added - Platform, Inclusive Design & UX Research References (knowledge-layer complete)
2125
2213
 
2126
2214
  This release closes the final reference gaps identified in the 2026-04-18 knowledge audit. The plugin now ships 18 reference files covering every major design-knowledge domain.
2127
2215
 
2128
2216
  #### 7 new reference files
2129
2217
 
2130
- - **`reference/platforms.md`** iOS/Android/web/visionOS/watchOS conventions: nav patterns, safe areas, gesture vocabularies, native typography, haptic feedback. Wired into `design-context-builder` + `design-phase-researcher`.
2131
- - **`reference/rtl-cjk-cultural.md`** RTL logical CSS properties, CJK typography (line-height 1.5–1.8, font-fallback stacks), Arabic/Hebrew, Devanagari/Tamil/Thai, cultural color meanings table, `Intl.*` formatting. Wired into `design-context-builder` + `design-auditor`.
2132
- - **`reference/onboarding-progressive-disclosure.md`** First-run pattern matrix, feature discovery, Aha-moment mapping, activation vs. habituation metrics, anti-patterns. Wired into `design-executor` + `design-auditor`.
2133
- - **`reference/user-research.md`** Research method matrix, card sort/tree test/A/B benchmarks, synthesis techniques, research ethics. Wired into `design-phase-researcher`.
2134
- - **`reference/information-architecture.md`** Nav pattern catalog (hub-and-spoke/nested/faceted/flat/mega-menu), tree-test benchmarks, wayfinding ARIA conventions. Wired into `design-context-builder` + `design-pattern-mapper`.
2135
- - **`reference/form-patterns.md`** Label position (Wroblewski research), on-blur validation default, full `autocomplete` taxonomy, `inputmode`/`enterkeyhint`, password UX (paste-allowed), CAPTCHA ethics. Wired into `design-auditor` (forms pillar) + `design-executor` (new `type:forms`).
2136
- - **`reference/data-visualization.md`** Chart-choice matrix, 25 chart types (decision-tree prose, UUPM `charts.csv` MIT), Okabe-Ito/viridis/cividis palettes, axis conventions, dashboard patterns. Wired into `design-auditor` + `design-executor`.
2218
+ - **`reference/platforms.md`** - iOS/Android/web/visionOS/watchOS conventions: nav patterns, safe areas, gesture vocabularies, native typography, haptic feedback. Wired into `design-context-builder` + `design-phase-researcher`.
2219
+ - **`reference/rtl-cjk-cultural.md`** - RTL logical CSS properties, CJK typography (line-height 1.5–1.8, font-fallback stacks), Arabic/Hebrew, Devanagari/Tamil/Thai, cultural color meanings table, `Intl.*` formatting. Wired into `design-context-builder` + `design-auditor`.
2220
+ - **`reference/onboarding-progressive-disclosure.md`** - First-run pattern matrix, feature discovery, Aha-moment mapping, activation vs. habituation metrics, anti-patterns. Wired into `design-executor` + `design-auditor`.
2221
+ - **`reference/user-research.md`** - Research method matrix, card sort/tree test/A/B benchmarks, synthesis techniques, research ethics. Wired into `design-phase-researcher`.
2222
+ - **`reference/information-architecture.md`** - Nav pattern catalog (hub-and-spoke/nested/faceted/flat/mega-menu), tree-test benchmarks, wayfinding ARIA conventions. Wired into `design-context-builder` + `design-pattern-mapper`.
2223
+ - **`reference/form-patterns.md`** - Label position (Wroblewski research), on-blur validation default, full `autocomplete` taxonomy, `inputmode`/`enterkeyhint`, password UX (paste-allowed), CAPTCHA ethics. Wired into `design-auditor` (forms pillar) + `design-executor` (new `type:forms`).
2224
+ - **`reference/data-visualization.md`** - Chart-choice matrix, 25 chart types (decision-tree prose, UUPM `charts.csv` MIT), Okabe-Ito/viridis/cividis palettes, axis conventions, dashboard patterns. Wired into `design-auditor` + `design-executor`.
2137
2225
 
2138
2226
  #### Agent wiring
2139
- - `design-context-builder` Area 2 locale detection; Area 6 platform note; `canonical_refs` extended with 3 conditional references.
2140
- - `design-auditor` Required reading extended: form-patterns, onboarding, data-visualization, rtl-cjk-cultural, information-architecture.
2141
- - `design-executor` New `type:forms` task type (7-step checklist); `type:layout` reads data-viz for dashboards; `type:copy` reads onboarding for first-run flows.
2142
- - `design-phase-researcher` reads user-research.md + platforms.md.
2143
- - `design-pattern-mapper` reads information-architecture.md for nav classification.
2227
+ - `design-context-builder` - Area 2 locale detection; Area 6 platform note; `canonical_refs` extended with 3 conditional references.
2228
+ - `design-auditor` - Required reading extended: form-patterns, onboarding, data-visualization, rtl-cjk-cultural, information-architecture.
2229
+ - `design-executor` - New `type:forms` task type (7-step checklist); `type:layout` reads data-viz for dashboards; `type:copy` reads onboarding for first-run flows.
2230
+ - `design-phase-researcher` - reads user-research.md + platforms.md.
2231
+ - `design-pattern-mapper` - reads information-architecture.md for nav classification.
2144
2232
 
2145
2233
  All 7 files registered in `reference/registry.json`. Regression baseline at `test-fixture/baselines/phase-19/`.
2146
2234
 
2147
2235
  ---
2148
2236
 
2149
- ## [1.18.0] 2026-04-24
2237
+ ## [1.18.0] - 2026-04-24
2150
2238
 
2151
- ### Added Advanced Craft References + Motion Vocabulary
2239
+ ### Added - Advanced Craft References + Motion Vocabulary
2152
2240
 
2153
- **Wave A Craft references (4 new files):**
2241
+ **Wave A - Craft references (4 new files):**
2154
2242
 
2155
- - `reference/variable-fonts-loading.md` Variable font axes (wght/ital/opsz/slnt/GRAD/custom), `@font-face` range declarations, `font-display` trade-offs (swap/fallback/optional), WOFF2 subsetting with `unicode-range`, FOIT vs FOUT, fallback metric overrides (`size-adjust`, `ascent-override`, `descent-override`, `line-gap-override`), GRAD axis for dark-mode weight compensation without layout reflow, system font stacks per platform (REF-14)
2156
- - `reference/image-optimization.md` WebP/AVIF/JPEG XL choice matrix, `srcset`+`sizes` math by breakpoint, responsive art direction with `<picture>`, LQIP/BlurHash/ThumbHash placeholder strategies, lazy-loading + `decoding="async"` + `fetchpriority="high"`, CDN transform patterns (Cloudinary/imgix/Vercel Image), image budget enforcement (REF-15)
2157
- - `reference/css-grid-layout.md` CSS Grid template patterns (holy grail, bento, masonry), `subgrid`, container queries (`@container` + `container-type`), fluid typography with `clamp()` (utopia.fyi math), intrinsic sizing, logical properties, safe-area insets, `aspect-ratio`/`object-fit`, anchor positioning progressive enhancement (REF-16)
2158
- - `reference/motion-advanced.md` Spring physics, stagger patterns, scroll-driven animation (`animation-timeline`), FLIP, View Transitions API, route orchestration, gesture/drag mechanics (velocity threshold ≈0.11, boundary damping, pointer capture, multi-touch protection), clip-path animation patterns (hold-to-delete, scroll reveals, tab masks, comparison sliders), blur-to-mask crossfades (<20px Safari cap), CSS transitions vs keyframes for interruptible UI, WAAPI, Framer Motion hardware-accel gotcha (`x`/`y` shorthand vs GPU `transform` string), motion cohesion & personality, next-day slow-motion review process; Disney's 12 Principles UX mapping stub (fills at Phase 19.6 closeout) (REF-17)
2243
+ - `reference/variable-fonts-loading.md` - Variable font axes (wght/ital/opsz/slnt/GRAD/custom), `@font-face` range declarations, `font-display` trade-offs (swap/fallback/optional), WOFF2 subsetting with `unicode-range`, FOIT vs FOUT, fallback metric overrides (`size-adjust`, `ascent-override`, `descent-override`, `line-gap-override`), GRAD axis for dark-mode weight compensation without layout reflow, system font stacks per platform (REF-14)
2244
+ - `reference/image-optimization.md` - WebP/AVIF/JPEG XL choice matrix, `srcset`+`sizes` math by breakpoint, responsive art direction with `<picture>`, LQIP/BlurHash/ThumbHash placeholder strategies, lazy-loading + `decoding="async"` + `fetchpriority="high"`, CDN transform patterns (Cloudinary/imgix/Vercel Image), image budget enforcement (REF-15)
2245
+ - `reference/css-grid-layout.md` - CSS Grid template patterns (holy grail, bento, masonry), `subgrid`, container queries (`@container` + `container-type`), fluid typography with `clamp()` (utopia.fyi math), intrinsic sizing, logical properties, safe-area insets, `aspect-ratio`/`object-fit`, anchor positioning progressive enhancement (REF-16)
2246
+ - `reference/motion-advanced.md` - Spring physics, stagger patterns, scroll-driven animation (`animation-timeline`), FLIP, View Transitions API, route orchestration, gesture/drag mechanics (velocity threshold ≈0.11, boundary damping, pointer capture, multi-touch protection), clip-path animation patterns (hold-to-delete, scroll reveals, tab masks, comparison sliders), blur-to-mask crossfades (<20px Safari cap), CSS transitions vs keyframes for interruptible UI, WAAPI, Framer Motion hardware-accel gotcha (`x`/`y` shorthand vs GPU `transform` string), motion cohesion & personality, next-day slow-motion review process; Disney's 12 Principles UX mapping stub (fills at Phase 19.6 closeout) (REF-17)
2159
2247
 
2160
- **Wave B Motion vocabulary (RN MIT + hyperframes Apache-2.0):**
2248
+ **Wave B - Motion vocabulary (RN MIT + hyperframes Apache-2.0):**
2161
2249
 
2162
- - `reference/motion-easings.md` 12 canonical curve presets (linear/quad/cubic/poly/sin/circle/exp/elastic/back/bounce/bezier + in/out/inOut wrappers) from React Native MIT upstream; `--ease-*` CSS custom property token catalog; 60fps settle-times for spring/bounce/elastic variants (MOT-01)
2163
- - `reference/motion-interpolate.md` Input→output range model + 4 extrapolation modes (extend/identity/clamp/wrap) from RN MIT; taxonomy of progress-linked/scroll-linked/gesture-linked/time-linked animations (MOT-02)
2164
- - `reference/motion-spring.md` Stiffness/damping/mass triad + 4 canonical presets (gentle/wobbly/stiff/slow) with 60fps settle-times; Framer Motion + React Spring syntax; CSS `linear()` approximation pattern (MOT-05)
2165
- - `reference/motion-transition-taxonomy.md` 8 controlled transition families from hyperframes Apache-2.0: 3d, blur, cover, destruction, dissolve, distortion, grid, light each with definition, canonical examples, when-to-use heuristics (MOT-03)
2166
- - `reference/external/NOTICE.hyperframes` Apache-2.0 attribution for hyperframes transition taxonomy
2250
+ - `reference/motion-easings.md` - 12 canonical curve presets (linear/quad/cubic/poly/sin/circle/exp/elastic/back/bounce/bezier + in/out/inOut wrappers) from React Native MIT upstream; `--ease-*` CSS custom property token catalog; 60fps settle-times for spring/bounce/elastic variants (MOT-01)
2251
+ - `reference/motion-interpolate.md` - Input→output range model + 4 extrapolation modes (extend/identity/clamp/wrap) from RN MIT; taxonomy of progress-linked/scroll-linked/gesture-linked/time-linked animations (MOT-02)
2252
+ - `reference/motion-spring.md` - Stiffness/damping/mass triad + 4 canonical presets (gentle/wobbly/stiff/slow) with 60fps settle-times; Framer Motion + React Spring syntax; CSS `linear()` approximation pattern (MOT-05)
2253
+ - `reference/motion-transition-taxonomy.md` - 8 controlled transition families from hyperframes Apache-2.0: 3d, blur, cover, destruction, dissolve, distortion, grid, light - each with definition, canonical examples, when-to-use heuristics (MOT-03)
2254
+ - `reference/external/NOTICE.hyperframes` - Apache-2.0 attribution for hyperframes transition taxonomy
2167
2255
 
2168
- **Wave B Output contract + tooling:**
2256
+ **Wave B - Output contract + tooling:**
2169
2257
 
2170
- - `reference/output-contracts/motion-map.schema.json` JSON schema requiring each animation binding to declare easing (canonical or custom+justification), transition family (optional), duration class (instant/quick/standard/slow/narrative), and trigger type (user-gesture/state-change/scroll-progress/time/loop) (MOT-04)
2171
- - `scripts/lib/parse-contract.cjs` Shared validation helper: extracts JSON block from agent markdown output, validates against motion-map contract, returns structured data or actionable error
2172
- - `scripts/lib/easings.cjs` Closed-form easing math helper (RN MIT): all 12 presets + in/out/inOut HOFs, cubic-bezier Newton-Raphson solver
2173
- - `scripts/lib/spring.cjs` Spring simulation helper (RN MIT): PRESETS, criticalDamping(), settleTime(), step()
2174
- - `scripts/tests/test-motion-provenance.sh` Provenance test: asserts RN-MIT attribution in all motion-vocabulary files; asserts no Remotion/ path citations
2258
+ - `reference/output-contracts/motion-map.schema.json` - JSON schema requiring each animation binding to declare easing (canonical or custom+justification), transition family (optional), duration class (instant/quick/standard/slow/narrative), and trigger type (user-gesture/state-change/scroll-progress/time/loop) (MOT-04)
2259
+ - `scripts/lib/parse-contract.cjs` - Shared validation helper: extracts JSON block from agent markdown output, validates against motion-map contract, returns structured data or actionable error
2260
+ - `scripts/lib/easings.cjs` - Closed-form easing math helper (RN MIT): all 12 presets + in/out/inOut HOFs, cubic-bezier Newton-Raphson solver
2261
+ - `scripts/lib/spring.cjs` - Spring simulation helper (RN MIT): PRESETS, criticalDamping(), settleTime(), step()
2262
+ - `scripts/tests/test-motion-provenance.sh` - Provenance test: asserts RN-MIT attribution in all motion-vocabulary files; asserts no Remotion/ path citations
2175
2263
 
2176
2264
  **Agent integrations:**
2177
2265
 
2178
- - `agents/motion-mapper.md` Reads motion-advanced + easings + interpolate + transition-taxonomy + spring; emits structured JSON block (conforming to motion-map schema) before prose; advanced scan patterns for gesture/drag, clip-path, FLIP, View Transitions, scroll-driven, WAAPI
2179
- - `agents/design-executor.md` type:typography reads `variable-fonts-loading.md`; type:layout reads `css-grid-layout.md` + `image-optimization.md`; type:motion reads `motion-advanced.md` + `motion-easings.md` + `motion-spring.md`
2180
- - `agents/design-auditor.md` Required Reading extended with 4 Phase 18 references; gesture/clip-path/blur-crossfade patterns scored as "advanced craft" signal (positive) in Pillar 7
2181
- - `agents/token-mapper.md` Micro-polish finding #5: easing token consolidation (raw `cubic-bezier()` → `--ease-*` canonical tokens)
2182
- - `reference/motion.md` Cross-links added pointing to all 4 Phase 18 motion references
2183
- - `reference/registry.json` 9 new entries: REF-14 through REF-17 + MOT-01 through MOT-05
2266
+ - `agents/motion-mapper.md` - Reads motion-advanced + easings + interpolate + transition-taxonomy + spring; emits structured JSON block (conforming to motion-map schema) before prose; advanced scan patterns for gesture/drag, clip-path, FLIP, View Transitions, scroll-driven, WAAPI
2267
+ - `agents/design-executor.md` - type:typography reads `variable-fonts-loading.md`; type:layout reads `css-grid-layout.md` + `image-optimization.md`; type:motion reads `motion-advanced.md` + `motion-easings.md` + `motion-spring.md`
2268
+ - `agents/design-auditor.md` - Required Reading extended with 4 Phase 18 references; gesture/clip-path/blur-crossfade patterns scored as "advanced craft" signal (positive) in Pillar 7
2269
+ - `agents/token-mapper.md` - Micro-polish finding #5: easing token consolidation (raw `cubic-bezier()` → `--ease-*` canonical tokens)
2270
+ - `reference/motion.md` - Cross-links added pointing to all 4 Phase 18 motion references
2271
+ - `reference/registry.json` - 9 new entries: REF-14 through REF-17 + MOT-01 through MOT-05
2184
2272
 
2185
2273
  **Phase 18 keywords added to package.json:** `variable-fonts`, `container-queries`, `view-transitions`, `motion-vocabulary`, `motion-easings`, `transition-taxonomy`, `gesture-mechanics`, `clip-path-animation`
2186
2274
 
2187
2275
  ---
2188
2276
 
2189
- ## [1.17.0] 2026-04-24
2277
+ ## [1.17.0] - 2026-04-24
2190
2278
 
2191
- ### Added Component Benchmark Corpus: Waves 3–5 (20 specs) + Pipeline Integration
2279
+ ### Added - Component Benchmark Corpus: Waves 3–5 (20 specs) + Pipeline Integration
2192
2280
 
2193
2281
  Completes the 35-spec component benchmark corpus and wires it into the design pipeline so agents actively consume per-component benchmarks during audit, execution, documentation, and pattern analysis.
2194
2282
 
2195
- #### Wave 3 Feedback (6 specs)
2283
+ #### Wave 3 - Feedback (6 specs)
2196
2284
 
2197
- - **`reference/components/toast.md`** transient notification (4–8s auto-dismiss, configurable); `role="status"` (info/success) vs `role="alert"` (warning/error); entry/exit slide+fade animation; optional action; stacking with 8px gap (max 3 visible); UUPM app-interface dashboard/settings-save context (MIT attribution).
2198
- - **`reference/components/alert.md`** inline persistent message; info/success/warning/error variants; `role="alert"` (assertive) vs `role="status"` (polite); icon reinforces variant never color as sole differentiator (WCAG 1.4.1).
2199
- - **`reference/components/progress.md`** linear + circular variants; determinate (`aria-valuenow`) vs indeterminate (`aria-valuetext`); `role="progressbar"`; `aria-label` required; 4px minimum track height.
2200
- - **`reference/components/skeleton.md`** content-layout mirror; shimmer (left-to-right gradient, 1.5s loop); `aria-hidden="true"` on skeleton elements; `aria-busy="true"` + `aria-label` on container; 60–90% width variation.
2201
- - **`reference/components/badge.md`** count/dot/icon variants; `99+` overflow pattern; decorative (no keyboard interaction); count surfaced via `aria-label` on parent element.
2202
- - **`reference/components/chip.md`** filter/input/suggestion/display variants; independent `aria-label` on remove button; `aria-pressed` on toggle; `role="option"` in listbox context; UUPM app-interface filter/tag-input context (MIT attribution).
2285
+ - **`reference/components/toast.md`** - transient notification (4–8s auto-dismiss, configurable); `role="status"` (info/success) vs `role="alert"` (warning/error); entry/exit slide+fade animation; optional action; stacking with 8px gap (max 3 visible); UUPM app-interface dashboard/settings-save context (MIT attribution).
2286
+ - **`reference/components/alert.md`** - inline persistent message; info/success/warning/error variants; `role="alert"` (assertive) vs `role="status"` (polite); icon reinforces variant - never color as sole differentiator (WCAG 1.4.1).
2287
+ - **`reference/components/progress.md`** - linear + circular variants; determinate (`aria-valuenow`) vs indeterminate (`aria-valuetext`); `role="progressbar"`; `aria-label` required; 4px minimum track height.
2288
+ - **`reference/components/skeleton.md`** - content-layout mirror; shimmer (left-to-right gradient, 1.5s loop); `aria-hidden="true"` on skeleton elements; `aria-busy="true"` + `aria-label` on container; 60–90% width variation.
2289
+ - **`reference/components/badge.md`** - count/dot/icon variants; `99+` overflow pattern; decorative (no keyboard interaction); count surfaced via `aria-label` on parent element.
2290
+ - **`reference/components/chip.md`** - filter/input/suggestion/display variants; independent `aria-label` on remove button; `aria-pressed` on toggle; `role="option"` in listbox context; UUPM app-interface filter/tag-input context (MIT attribution).
2203
2291
 
2204
- #### Wave 4 Navigation & Data (9 specs)
2292
+ #### Wave 4 - Navigation & Data (9 specs)
2205
2293
 
2206
- - **`reference/components/menu.md`** `role="menu"` + `role="menuitem"`; arrow-key navigation; click-only open (no hover trigger); sub-menus on ArrowRight; focus returns to trigger on close.
2207
- - **`reference/components/navbar.md`** `role="banner"` + `role="navigation"` + `aria-label="Primary"`; skip-to-main link; `aria-current="page"`; hamburger `aria-expanded`; UUPM dashboard/settings/profile context (MIT attribution).
2208
- - **`reference/components/sidebar.md`** `aria-label="Secondary"`; icon+label vs icon-only collapsed; `aria-expanded` on collapsible sections; UUPM settings-nav + dashboard-nav variants (MIT attribution).
2209
- - **`reference/components/breadcrumbs.md`** `role="navigation"` + `aria-label="Breadcrumb"`; `aria-current="page"` on last item; `aria-hidden` on separators; truncate middle not ends.
2210
- - **`reference/components/pagination.md`** `aria-label="Pagination"`; `aria-current="page"` on active page; per-page `<select>` with visible label; UUPM list-view context (MIT attribution).
2211
- - **`reference/components/table.md`** `scope="col"` on all `<th>`; `aria-sort` on sortable headers; `aria-selected` on rows; `role="grid"` vs `role="table"`; virtualise >200 rows; UUPM list/detail + master-detail + dashboard context (MIT attribution).
2212
- - **`reference/components/list.md`** display (`<ul>/<li>`) vs interactive (`role="listbox"` + `role="option"`); `aria-multiselectable`; virtualise >100 items; UUPM list/detail left-panel context (MIT attribution).
2213
- - **`reference/components/tree.md`** `role="tree"` + `role="treeitem"` + `role="group"`; `aria-expanded`; `aria-level`; `aria-busy` on lazy-load nodes; full WAI-ARIA APG keyboard contract.
2214
- - **`reference/components/command-palette.md`** `role="dialog"` + `aria-modal`; focus trap; `role="combobox"` + `aria-controls` → `role="listbox"`; Cmd/Ctrl+K trigger; UUPM global-search context (MIT attribution).
2294
+ - **`reference/components/menu.md`** - `role="menu"` + `role="menuitem"`; arrow-key navigation; click-only open (no hover trigger); sub-menus on ArrowRight; focus returns to trigger on close.
2295
+ - **`reference/components/navbar.md`** - `role="banner"` + `role="navigation"` + `aria-label="Primary"`; skip-to-main link; `aria-current="page"`; hamburger `aria-expanded`; UUPM dashboard/settings/profile context (MIT attribution).
2296
+ - **`reference/components/sidebar.md`** - `aria-label="Secondary"`; icon+label vs icon-only collapsed; `aria-expanded` on collapsible sections; UUPM settings-nav + dashboard-nav variants (MIT attribution).
2297
+ - **`reference/components/breadcrumbs.md`** - `role="navigation"` + `aria-label="Breadcrumb"`; `aria-current="page"` on last item; `aria-hidden` on separators; truncate middle not ends.
2298
+ - **`reference/components/pagination.md`** - `aria-label="Pagination"`; `aria-current="page"` on active page; per-page `<select>` with visible label; UUPM list-view context (MIT attribution).
2299
+ - **`reference/components/table.md`** - `scope="col"` on all `<th>`; `aria-sort` on sortable headers; `aria-selected` on rows; `role="grid"` vs `role="table"`; virtualise >200 rows; UUPM list/detail + master-detail + dashboard context (MIT attribution).
2300
+ - **`reference/components/list.md`** - display (`<ul>/<li>`) vs interactive (`role="listbox"` + `role="option"`); `aria-multiselectable`; virtualise >100 items; UUPM list/detail left-panel context (MIT attribution).
2301
+ - **`reference/components/tree.md`** - `role="tree"` + `role="treeitem"` + `role="group"`; `aria-expanded`; `aria-level`; `aria-busy` on lazy-load nodes; full WAI-ARIA APG keyboard contract.
2302
+ - **`reference/components/command-palette.md`** - `role="dialog"` + `aria-modal`; focus trap; `role="combobox"` + `aria-controls` → `role="listbox"`; Cmd/Ctrl+K trigger; UUPM global-search context (MIT attribution).
2215
2303
 
2216
- #### Wave 5 Advanced (5 specs)
2304
+ #### Wave 5 - Advanced (5 specs)
2217
2305
 
2218
- - **`reference/components/date-picker.md`** input + range variants; calendar `role="dialog"`; day cells `role="gridcell"` + `role="button"`; full arrow-key navigation; native `<input type="date">` mobile fallback.
2219
- - **`reference/components/slider.md`** single + range; `role="slider"` + `aria-valuenow/min/max/valuetext`; 44px thumb touch target via `::before` trick; Page Up/Down ±10%.
2220
- - **`reference/components/file-upload.md`** drop-zone + picker; `<input type="file">` never `display:none` (keyboard/AT fallback); `aria-label="Remove [filename]"` on remove buttons; upload errors via `aria-live="assertive"`.
2221
- - **`reference/components/rich-text-editor.md`** `contenteditable` + `role="textbox"` + `aria-multiline="true"`; toolbar `role="toolbar"`; toggle buttons `aria-pressed`; placeholder via CSS `::before`; mention trigger pattern.
2222
- - **`reference/components/stepper.md`** `role="list"` (not `role="tablist"`); `aria-current="step"` on active step; UUPM wizard/onboarding/checkout flow context (MIT attribution).
2306
+ - **`reference/components/date-picker.md`** - input + range variants; calendar `role="dialog"`; day cells `role="gridcell"` + `role="button"`; full arrow-key navigation; native `<input type="date">` mobile fallback.
2307
+ - **`reference/components/slider.md`** - single + range; `role="slider"` + `aria-valuenow/min/max/valuetext`; 44px thumb touch target via `::before` trick; Page Up/Down ±10%.
2308
+ - **`reference/components/file-upload.md`** - drop-zone + picker; `<input type="file">` never `display:none` (keyboard/AT fallback); `aria-label="Remove [filename]"` on remove buttons; upload errors via `aria-live="assertive"`.
2309
+ - **`reference/components/rich-text-editor.md`** - `contenteditable` + `role="textbox"` + `aria-multiline="true"`; toolbar `role="toolbar"`; toggle buttons `aria-pressed`; placeholder via CSS `::before`; mention trigger pattern.
2310
+ - **`reference/components/stepper.md`** - `role="list"` (not `role="tablist"`); `aria-current="step"` on active step; UUPM wizard/onboarding/checkout flow context (MIT attribution).
2223
2311
 
2224
2312
  #### Pipeline Integration
2225
2313
 
2226
- - **`agents/design-auditor.md`** new **Component Conformance** addendum: discovers specs, runs grep signatures against codebase, scores state/variant/a11y coverage per component, emits conformance table as informational addendum (does not change /28 pillar score).
2227
- - **`agents/design-executor.md`** **Benchmark Spec Pre-Flight** for `type:components` tasks: reads matching `reference/components/<name>.md`, applies anatomy/states/a11y contract before building no re-discovering ARIA roles or keyboard patterns already benchmarked.
2228
- - **`agents/design-doc-writer.md`** **Component Spec Scaffold**: pre-fills DESIGN-STYLE doc structure from benchmark spec's Purpose/Anatomy/Variants/States when a spec exists; includes "Benchmarked against" citation; falls back to from-scratch generation gracefully.
2229
- - **`agents/design-pattern-mapper.md`** **Component Convergence Detector**: writes `.design/map/component-convergence.md` with matched/absent component table and per-component convergence %; runs after pattern extraction.
2314
+ - **`agents/design-auditor.md`** - new **Component Conformance** addendum: discovers specs, runs grep signatures against codebase, scores state/variant/a11y coverage per component, emits conformance table as informational addendum (does not change /28 pillar score).
2315
+ - **`agents/design-executor.md`** - **Benchmark Spec Pre-Flight** for `type:components` tasks: reads matching `reference/components/<name>.md`, applies anatomy/states/a11y contract before building - no re-discovering ARIA roles or keyboard patterns already benchmarked.
2316
+ - **`agents/design-doc-writer.md`** - **Component Spec Scaffold**: pre-fills DESIGN-STYLE doc structure from benchmark spec's Purpose/Anatomy/Variants/States when a spec exists; includes "Benchmarked against" citation; falls back to from-scratch generation gracefully.
2317
+ - **`agents/design-pattern-mapper.md`** - **Component Convergence Detector**: writes `.design/map/component-convergence.md` with matched/absent component table and per-component convergence %; runs after pattern extraction.
2230
2318
 
2231
2319
  ---
2232
2320
 
2233
- ## [1.16.0] 2026-04-24
2321
+ ## [1.16.0] - 2026-04-24
2234
2322
 
2235
- ### Added Component Benchmark Corpus: Tooling + Waves 1–2 (15 specs)
2323
+ ### Added - Component Benchmark Corpus: Tooling + Waves 1–2 (15 specs)
2236
2324
 
2237
- This release builds the infrastructure to harvest per-component design knowledge from 18 design systems and ships 15 canonical component specs at `reference/components/`. Every spec follows a locked shape Purpose · Anatomy · Variants · States · Sizing · Typography · Keyboard & a11y · Motion · Do/Don't · Anti-patterns · Citations · Grep signatures making the corpus greppable, diffable, and agent-consumable.
2325
+ This release builds the infrastructure to harvest per-component design knowledge from 18 design systems and ships 15 canonical component specs at `reference/components/`. Every spec follows a locked shape - Purpose · Anatomy · Variants · States · Sizing · Typography · Keyboard & a11y · Motion · Do/Don't · Anti-patterns · Citations · Grep signatures - making the corpus greppable, diffable, and agent-consumable.
2238
2326
 
2239
2327
  #### Tooling
2240
2328
 
2241
- - **`agents/component-benchmark-harvester.md`** given a component name, harvests per-source excerpts from 18 design systems (see `connections/design-corpora.md`), consumes Phase 15 impeccable salvage, emits raw harvest to `.planning/benchmarks/raw/<component>.md` with source-attributed excerpts and convergence pre-analysis.
2242
- - **`agents/component-benchmark-synthesizer.md`** reads the raw harvest and emits a canonical `reference/components/<name>.md` using the locked TEMPLATE.md shape. Convergence analysis is explicit: NORM (≥4 systems agree) vs. DIVERGE (systems disagree with rationale).
2243
- - **`skills/benchmark/SKILL.md`** new `/gdd:benchmark` command with 4 modes: `<component>` (single), `--wave <N>` (full wave), `--list` (coverage table), `--refresh <component>` (re-harvest on design-system version bump).
2244
- - **`connections/design-corpora.md`** 18-system catalog with canonical URLs, licensing/attribution notes, and fallback chain (canonical → archive.org → Refero MCP → Pinterest MCP).
2245
- - **`reference/components/TEMPLATE.md`** locked 12-section spec shape. All future component specs must conform.
2246
- - **`reference/components/README.md`** corpus index with category tables (Wave 1–5) and coverage summary.
2329
+ - **`agents/component-benchmark-harvester.md`** - given a component name, harvests per-source excerpts from 18 design systems (see `connections/design-corpora.md`), consumes Phase 15 impeccable salvage, emits raw harvest to `.planning/benchmarks/raw/<component>.md` with source-attributed excerpts and convergence pre-analysis.
2330
+ - **`agents/component-benchmark-synthesizer.md`** - reads the raw harvest and emits a canonical `reference/components/<name>.md` using the locked TEMPLATE.md shape. Convergence analysis is explicit: NORM (≥4 systems agree) vs. DIVERGE (systems disagree with rationale).
2331
+ - **`skills/benchmark/SKILL.md`** - new `/gdd:benchmark` command with 4 modes: `<component>` (single), `--wave <N>` (full wave), `--list` (coverage table), `--refresh <component>` (re-harvest on design-system version bump).
2332
+ - **`connections/design-corpora.md`** - 18-system catalog with canonical URLs, licensing/attribution notes, and fallback chain (canonical → archive.org → Refero MCP → Pinterest MCP).
2333
+ - **`reference/components/TEMPLATE.md`** - locked 12-section spec shape. All future component specs must conform.
2334
+ - **`reference/components/README.md`** - corpus index with category tables (Wave 1–5) and coverage summary.
2247
2335
 
2248
- #### Wave 1 Inputs (8 specs)
2336
+ #### Wave 1 - Inputs (8 specs)
2249
2337
 
2250
- - **`reference/components/button.md`** primary/secondary/ghost/destructive/icon-only variants, 96% press scale norm, WAI-ARIA button keyboard contract, `transition:all` BAN, non-descriptive-label anti-pattern.
2251
- - **`reference/components/input.md`** text/search/password/number, placeholder-as-label anti-pattern, floating vs. static label trade-off (static preferred), `aria-describedby` error linking, WAI-ARIA textbox contract.
2252
- - **`reference/components/select-combobox.md`** native vs. custom decision tree, WAI-ARIA listbox + combobox contracts (verbatim), `aria-activedescendant` pattern, multi-select approaches, virtualised list note, async empty state.
2253
- - **`reference/components/checkbox.md`** binary/indeterminate states, `fieldset`+`legend` group requirement, `.indeterminate` JS property, WAI-ARIA checkbox contract.
2254
- - **`reference/components/radio.md`** arrow-key auto-advance behavior, Tab-as-group-unit pattern, single-radio anti-pattern, WAI-ARIA radiogroup contract.
2255
- - **`reference/components/switch.md`** switch vs. checkbox semantic distinction (`role="switch"` not `role="checkbox"`), spring thumb animation, pill track (`border-radius: 9999px`), immediate-action rule.
2256
- - **`reference/components/link.md`** link vs. button semantic boundary, underline requirement for inline links (WCAG 1.4.1), external-link disclosure, `rel="noopener noreferrer"`, non-descriptive link text anti-pattern.
2257
- - **`reference/components/label.md`** four association methods ranked (`<label for>` → `aria-labelledby` → `aria-label` → `<legend>`), `.sr-only` CSS pattern, legend-for-groups rule, placeholder failure analysis.
2338
+ - **`reference/components/button.md`** - primary/secondary/ghost/destructive/icon-only variants, 96% press scale norm, WAI-ARIA button keyboard contract, `transition:all` BAN, non-descriptive-label anti-pattern.
2339
+ - **`reference/components/input.md`** - text/search/password/number, placeholder-as-label anti-pattern, floating vs. static label trade-off (static preferred), `aria-describedby` error linking, WAI-ARIA textbox contract.
2340
+ - **`reference/components/select-combobox.md`** - native vs. custom decision tree, WAI-ARIA listbox + combobox contracts (verbatim), `aria-activedescendant` pattern, multi-select approaches, virtualised list note, async empty state.
2341
+ - **`reference/components/checkbox.md`** - binary/indeterminate states, `fieldset`+`legend` group requirement, `.indeterminate` JS property, WAI-ARIA checkbox contract.
2342
+ - **`reference/components/radio.md`** - arrow-key auto-advance behavior, Tab-as-group-unit pattern, single-radio anti-pattern, WAI-ARIA radiogroup contract.
2343
+ - **`reference/components/switch.md`** - switch vs. checkbox semantic distinction (`role="switch"` not `role="checkbox"`), spring thumb animation, pill track (`border-radius: 9999px`), immediate-action rule.
2344
+ - **`reference/components/link.md`** - link vs. button semantic boundary, underline requirement for inline links (WCAG 1.4.1), external-link disclosure, `rel="noopener noreferrer"`, non-descriptive link text anti-pattern.
2345
+ - **`reference/components/label.md`** - four association methods ranked (`<label for>` → `aria-labelledby` → `aria-label` → `<legend>`), `.sr-only` CSS pattern, legend-for-groups rule, placeholder failure analysis.
2258
2346
 
2259
- #### Wave 2 Containers (7 specs)
2347
+ #### Wave 2 - Containers (7 specs)
2260
2348
 
2261
- - **`reference/components/card.md`** stretched-link pattern for nested interactivity, `<article>` vs `<div>` semantics, elevated/outlined/clickable variants, `aria-busy` skeleton state.
2262
- - **`reference/components/modal-dialog.md`** focus trap, Escape contract, portal rendering, `aria-modal`+`aria-labelledby` requirement, `role="alertdialog"` for confirmations, scroll-lock, focus return on close.
2263
- - **`reference/components/drawer.md`** focus trap (same as modal), swipe-to-close for bottom sheet, side direction routing, nav drawer vs. content drawer role distinction, slide-in motion.
2264
- - **`reference/components/popover.md`** Floating UI positioning (flip+shift+arrow middlewares), non-modal vs. modal distinction, `aria-expanded`+`aria-controls` trigger contract, `role="tooltip"` on interactive content anti-pattern.
2265
- - **`reference/components/tooltip.md`** no-interactive-content rule, hover+focus trigger (not hover-only), Escape dismiss, 300ms delay, `aria-describedby` contract, tooltip vs. popover boundary.
2266
- - **`reference/components/accordion.md`** `h2`–`h6` header requirement, `aria-expanded`-on-trigger rule, `grid-template-rows` CSS height animation trick, `role="region"` landmark note (skip if >6 items).
2267
- - **`reference/components/tabs.md`** roving tabindex pattern, arrow-key navigation (not Tab), automatic vs. manual activation modes, tablist label requirement, `hidden` on inactive panels.
2349
+ - **`reference/components/card.md`** - stretched-link pattern for nested interactivity, `<article>` vs `<div>` semantics, elevated/outlined/clickable variants, `aria-busy` skeleton state.
2350
+ - **`reference/components/modal-dialog.md`** - focus trap, Escape contract, portal rendering, `aria-modal`+`aria-labelledby` requirement, `role="alertdialog"` for confirmations, scroll-lock, focus return on close.
2351
+ - **`reference/components/drawer.md`** - focus trap (same as modal), swipe-to-close for bottom sheet, side direction routing, nav drawer vs. content drawer role distinction, slide-in motion.
2352
+ - **`reference/components/popover.md`** - Floating UI positioning (flip+shift+arrow middlewares), non-modal vs. modal distinction, `aria-expanded`+`aria-controls` trigger contract, `role="tooltip"` on interactive content anti-pattern.
2353
+ - **`reference/components/tooltip.md`** - no-interactive-content rule, hover+focus trigger (not hover-only), Escape dismiss, 300ms delay, `aria-describedby` contract, tooltip vs. popover boundary.
2354
+ - **`reference/components/accordion.md`** - `h2`–`h6` header requirement, `aria-expanded`-on-trigger rule, `grid-template-rows` CSS height animation trick, `role="region"` landmark note (skip if >6 items).
2355
+ - **`reference/components/tabs.md`** - roving tabindex pattern, arrow-key navigation (not Tab), automatic vs. manual activation modes, tablist label requirement, `hidden` on inactive panels.
2268
2356
 
2269
2357
  ---
2270
2358
 
2271
- ## [1.15.0] 2026-04-24
2359
+ ## [1.15.0] - 2026-04-24
2272
2360
 
2273
- ### Added Design Knowledge Expansion: 10 foundational references + MIFB micro-polish + UUPM ingest
2361
+ ### Added - Design Knowledge Expansion: 10 foundational references + MIFB micro-polish + UUPM ingest
2274
2362
 
2275
2363
  This release closes the plugin's shallow-coverage gaps across iconography, performance, brand voice, visual hierarchy, Gestalt principles, design-system governance, and adds two new UUPM-sourced knowledge bases (palette catalog + style vocabulary). It also lands the complete MIT-licensed MIFB (make-interfaces-feel-better) micro-polish track.
2276
2364
 
@@ -2280,28 +2368,28 @@ All `impeccable-*` skill coupling removed from the plugin. References in `refere
2280
2368
 
2281
2369
  #### 10 new foundational reference files
2282
2370
 
2283
- - **`reference/iconography.md`** Optical sizing, stroke-weight rules, metaphor taxonomy (functional/status/nav/brand), dark-mode variants, icon animation guidelines, semantic vs. decorative labeling, touch-target pairing, catalog of 9 public icon libraries (Lucide, Phosphor, Heroicons, Radix Icons, Tabler, Iconoir, Remix, SF Symbols, Feather). Metaphor taxonomy absorbs UUPM `icons.csv` (MIT).
2284
- - **`reference/performance.md`** Core Web Vitals targets by project type (SaaS/marketing/e-commerce/docs/dashboards), LCP/INP/CLS/TTFB budgets, critical CSS, image budgets, animation frame budget (16.67ms), JS bundle budgets (<170KB gzipped), font budgets, Lighthouse CI hookup. React runtime section absorbs UUPM `react-performance.csv` (MIT).
2285
- - **`reference/design-systems-catalog.md`** Quick-reference index of 18 major design systems: Material 3, Apple HIG, Radix+WAI-ARIA, shadcn/ui, Polaris, Carbon, Fluent 2, Primer, Atlassian, Ant Design, Mantine, Chakra, Base Web, Nord, Spectrum, Lightning, Evergreen, Gestalt (Pinterest).
2286
- - **`reference/brand-voice.md`** 5 voice axes (Formal↔Casual, Serious↔Playful, Expert↔Approachable, Reverent↔Irreverent, Authoritative↔Collaborative), 12 Jungian archetypes + 6 design-register variants, tone-by-context table (8 contexts), 20+ industry-vertical context table. Industry-context absorbs UUPM `products.csv` + `ui-reasoning.csv` (MIT).
2287
- - **`reference/visual-hierarchy-layout.md`** Z-order/depth cues, whitespace principles, asymmetry/rhythm, compositional grids (4/8/12/16-col), figure-ground, reading-order patterns (F/Z/inverted-triangle), progressive disclosure. Landing-archetypes subsection absorbs UUPM `landing.csv` (24 patterns, MIT).
2288
- - **`reference/gestalt.md`** All 8 Gestalt principles (Proximity, Similarity, Continuity, Closure, Figure-Ground, Common Fate, Common Region, Prägnanz), each with definition, design application, scoring rubric, and CSS grep signatures. UUPM `ux-guidelines.csv` deduped across gestalt/heuristics/anti-patterns/priority-matrix (MIT).
2289
- - **`reference/design-system-guidance.md`** Token versioning/deprecation, multi-brand token architecture (base/semantic/component layers), platform translation (Style Dictionary/Tokens Studio/Terrazzo), governance/RFC model, documentation standard, maturity rubric levels 0–5.
2290
- - **`reference/framer-motion-patterns.md`** Spring vs. tween config, AnimatePresence (including `initial={false}` rule), layout animations, variants+staggering, gesture motion (`whileHover`, `whileTap` canonical 0.96), scroll-linked animations, `prefers-reduced-motion` compliance, 60fps GPU-safe property rules, MotionConfig, common pitfalls. UUPM `stacks/react.csv` framer rows absorbed (MIT).
2291
- - **`reference/palette-catalog.md`** 40+ industry-vertical color palettes with 12 semantic token roles each, all WCAG 4.5:1 body / 3:1 UI verified. Data sibling at `reference/data/palettes.csv`. UUPM `colors.csv` absorbed (MIT).
2292
- - **`reference/style-vocabulary.md`** 38+ named UI aesthetics (Glassmorphism, Brutalism, Neumorphism, Bento, Claymorphism, Aurora, AI-Native, Swiss Modernism 2.0, Vaporwave, Editorial Grid, HUD/Sci-Fi FUI, and more) with keywords, signature effects, best-for, avoid-for, era. Data sibling at `reference/data/styles.csv`. UUPM `styles.csv` absorbed (MIT).
2371
+ - **`reference/iconography.md`** - Optical sizing, stroke-weight rules, metaphor taxonomy (functional/status/nav/brand), dark-mode variants, icon animation guidelines, semantic vs. decorative labeling, touch-target pairing, catalog of 9 public icon libraries (Lucide, Phosphor, Heroicons, Radix Icons, Tabler, Iconoir, Remix, SF Symbols, Feather). Metaphor taxonomy absorbs UUPM `icons.csv` (MIT).
2372
+ - **`reference/performance.md`** - Core Web Vitals targets by project type (SaaS/marketing/e-commerce/docs/dashboards), LCP/INP/CLS/TTFB budgets, critical CSS, image budgets, animation frame budget (16.67ms), JS bundle budgets (<170KB gzipped), font budgets, Lighthouse CI hookup. React runtime section absorbs UUPM `react-performance.csv` (MIT).
2373
+ - **`reference/design-systems-catalog.md`** - Quick-reference index of 18 major design systems: Material 3, Apple HIG, Radix+WAI-ARIA, shadcn/ui, Polaris, Carbon, Fluent 2, Primer, Atlassian, Ant Design, Mantine, Chakra, Base Web, Nord, Spectrum, Lightning, Evergreen, Gestalt (Pinterest).
2374
+ - **`reference/brand-voice.md`** - 5 voice axes (Formal↔Casual, Serious↔Playful, Expert↔Approachable, Reverent↔Irreverent, Authoritative↔Collaborative), 12 Jungian archetypes + 6 design-register variants, tone-by-context table (8 contexts), 20+ industry-vertical context table. Industry-context absorbs UUPM `products.csv` + `ui-reasoning.csv` (MIT).
2375
+ - **`reference/visual-hierarchy-layout.md`** - Z-order/depth cues, whitespace principles, asymmetry/rhythm, compositional grids (4/8/12/16-col), figure-ground, reading-order patterns (F/Z/inverted-triangle), progressive disclosure. Landing-archetypes subsection absorbs UUPM `landing.csv` (24 patterns, MIT).
2376
+ - **`reference/gestalt.md`** - All 8 Gestalt principles (Proximity, Similarity, Continuity, Closure, Figure-Ground, Common Fate, Common Region, Prägnanz), each with definition, design application, scoring rubric, and CSS grep signatures. UUPM `ux-guidelines.csv` deduped across gestalt/heuristics/anti-patterns/priority-matrix (MIT).
2377
+ - **`reference/design-system-guidance.md`** - Token versioning/deprecation, multi-brand token architecture (base/semantic/component layers), platform translation (Style Dictionary/Tokens Studio/Terrazzo), governance/RFC model, documentation standard, maturity rubric levels 0–5.
2378
+ - **`reference/framer-motion-patterns.md`** - Spring vs. tween config, AnimatePresence (including `initial={false}` rule), layout animations, variants+staggering, gesture motion (`whileHover`, `whileTap` canonical 0.96), scroll-linked animations, `prefers-reduced-motion` compliance, 60fps GPU-safe property rules, MotionConfig, common pitfalls. UUPM `stacks/react.csv` framer rows absorbed (MIT).
2379
+ - **`reference/palette-catalog.md`** - 40+ industry-vertical color palettes with 12 semantic token roles each, all WCAG 4.5:1 body / 3:1 UI verified. Data sibling at `reference/data/palettes.csv`. UUPM `colors.csv` absorbed (MIT).
2380
+ - **`reference/style-vocabulary.md`** - 38+ named UI aesthetics (Glassmorphism, Brutalism, Neumorphism, Bento, Claymorphism, Aurora, AI-Native, Swiss Modernism 2.0, Vaporwave, Editorial Grid, HUD/Sci-Fi FUI, and more) with keywords, signature effects, best-for, avoid-for, era. Data sibling at `reference/data/styles.csv`. UUPM `styles.csv` absorbed (MIT).
2293
2381
 
2294
2382
  #### MIFB micro-polish track
2295
2383
 
2296
2384
  Source: [jakub.kr/writing/details-that-make-interfaces-feel-better](https://jakub.kr/writing/details-that-make-interfaces-feel-better) (MIT, Jakub Krehel)
2297
2385
 
2298
- - **`reference/surfaces.md`** (new) Concentric radius formula (`outerRadius = innerRadius + padding`), optical alignment offsets, 3-layer shadow system (exact `rgba` values), image outline rule (pure black/white opacity only), hit-area `::after` pseudo-element pattern.
2299
- - **`reference/typography.md`** extended `text-wrap: balance` (headings, ≤6 lines Chromium), `text-wrap: pretty` (body/captions), `-webkit-font-smoothing: antialiased` at `:root` only, `font-variant-numeric: tabular-nums` for dynamic numerals. UUPM `typography.csv` (57 pairings) absorbed into expanded pairings catalog (MIT). `reference/data/google-fonts.csv` registered as data sibling.
2300
- - **`reference/motion.md`** extended 6 new subsections: interruptible animations (transitions vs. keyframes decision table), split-and-stagger enter/exit pattern, contextual icon cross-fade (canonical `scale 0.25→1`, `opacity 0→1`, `blur 4→0`, `bounce: 0`), scale-on-press canonical `0.96`, `<AnimatePresence initial={false}>` rule, `will-change` GPU-compositable property table.
2301
- - **`reference/anti-patterns.md`** 4 new BAN entries: BAN-10 same-radius-nested, BAN-11 tinted image outline, BAN-12 `transition: all`, BAN-13 `will-change: all`. Each with grep signature and fix pointer.
2302
- - **`reference/checklists.md`** New "Micro-polish check" gate (14 items across typography/surfaces/motion). `scale(0.97)` mention reconciled to canonical `0.96`.
2386
+ - **`reference/surfaces.md`** (new) - Concentric radius formula (`outerRadius = innerRadius + padding`), optical alignment offsets, 3-layer shadow system (exact `rgba` values), image outline rule (pure black/white opacity only), hit-area `::after` pseudo-element pattern.
2387
+ - **`reference/typography.md`** extended - `text-wrap: balance` (headings, ≤6 lines Chromium), `text-wrap: pretty` (body/captions), `-webkit-font-smoothing: antialiased` at `:root` only, `font-variant-numeric: tabular-nums` for dynamic numerals. UUPM `typography.csv` (57 pairings) absorbed into expanded pairings catalog (MIT). `reference/data/google-fonts.csv` registered as data sibling.
2388
+ - **`reference/motion.md`** extended - 6 new subsections: interruptible animations (transitions vs. keyframes decision table), split-and-stagger enter/exit pattern, contextual icon cross-fade (canonical `scale 0.25→1`, `opacity 0→1`, `blur 4→0`, `bounce: 0`), scale-on-press canonical `0.96`, `<AnimatePresence initial={false}>` rule, `will-change` GPU-compositable property table.
2389
+ - **`reference/anti-patterns.md`** - 4 new BAN entries: BAN-10 same-radius-nested, BAN-11 tinted image outline, BAN-12 `transition: all`, BAN-13 `will-change: all`. Each with grep signature and fix pointer.
2390
+ - **`reference/checklists.md`** - New "Micro-polish check" gate (14 items across typography/surfaces/motion). `scale(0.97)` mention reconciled to canonical `0.96`.
2303
2391
 
2304
- #### ⚠️ BREAKING 7th audit pillar: Micro-polish (weight redistribution)
2392
+ #### ⚠️ BREAKING - 7th audit pillar: Micro-polish (weight redistribution)
2305
2393
 
2306
2394
  A new **Micro-polish** pillar (5%) has been added to `reference/audit-scoring.md`. Weight was redistributed from the Anti-Pattern Compliance pillar (10% → 5%). **Total remains 100%, but per-pillar weights changed.** Cross-cycle score comparisons that mix v1.14.x and v1.15.0 audit reports should account for this weight shift.
2307
2395
 
@@ -2311,33 +2399,33 @@ All four mapper agents (`motion-mapper`, `token-mapper`, `visual-hierarchy-mappe
2311
2399
 
2312
2400
  #### Agent integrations
2313
2401
 
2314
- - `design-context-builder` reads `brand-voice.md` for archetype resolution, `palette-catalog.md` for palette proposal, `style-vocabulary.md` for style-direction picker.
2315
- - `design-auditor` reads `iconography.md`, `performance.md`, `gestalt.md`, `framer-motion-patterns.md`, `surfaces.md`; includes 7th pillar micro_polish in output schema.
2316
- - `design-executor` reads `brand-voice.md` (type:copy), `design-system-guidance.md` (type:tokens), `framer-motion-patterns.md` (type:motion), `performance.md` (type:layout).
2317
- - `design-pattern-mapper` extended with `iconography-system` and `brand-voice` categories.
2318
- - `design-verifier` micro_polish added as supplemental dimension.
2402
+ - `design-context-builder` - reads `brand-voice.md` for archetype resolution, `palette-catalog.md` for palette proposal, `style-vocabulary.md` for style-direction picker.
2403
+ - `design-auditor` - reads `iconography.md`, `performance.md`, `gestalt.md`, `framer-motion-patterns.md`, `surfaces.md`; includes 7th pillar micro_polish in output schema.
2404
+ - `design-executor` - reads `brand-voice.md` (type:copy), `design-system-guidance.md` (type:tokens), `framer-motion-patterns.md` (type:motion), `performance.md` (type:layout).
2405
+ - `design-pattern-mapper` - extended with `iconography-system` and `brand-voice` categories.
2406
+ - `design-verifier` - micro_polish added as supplemental dimension.
2319
2407
 
2320
2408
  #### Attribution
2321
2409
 
2322
- - Jakub Krehel (MIT) micro-polish rules in typography.md, surfaces.md, motion.md, anti-patterns.md BAN-10/11/12/13, checklists.md Micro-polish gate.
2323
- - nextlevelbuilder/ui-ux-pro-max-skill v2.5.0 (MIT) data snapshot ingested into iconography, performance, brand-voice, visual-hierarchy-layout, typography, framer-motion-patterns, palette-catalog, style-vocabulary, gestalt/heuristics/anti-patterns/priority-matrix dedup. **One-shot snapshot no live re-sync contract.**
2410
+ - Jakub Krehel (MIT) - micro-polish rules in typography.md, surfaces.md, motion.md, anti-patterns.md BAN-10/11/12/13, checklists.md Micro-polish gate.
2411
+ - nextlevelbuilder/ui-ux-pro-max-skill v2.5.0 (MIT) - data snapshot ingested into iconography, performance, brand-voice, visual-hierarchy-layout, typography, framer-motion-patterns, palette-catalog, style-vocabulary, gestalt/heuristics/anti-patterns/priority-matrix dedup. **One-shot snapshot - no live re-sync contract.**
2324
2412
 
2325
2413
  #### UUPM deferrals (explicitly routed, not discarded)
2326
2414
 
2327
2415
  - `charts.csv` → Phase 19 `reference/data-visualization.md`
2328
2416
  - `app-interface.csv` → Phase 17 component-corpus authoring
2329
2417
  - `stacks/*.csv` (14 non-React) → future stack-playbook phase
2330
- ## [1.14.8] 2026-04-24
2418
+ ## [1.14.8] - 2026-04-24
2331
2419
 
2332
- ### Added Phase 14.7 First-Run Proof Path
2420
+ ### Added - Phase 14.7 First-Run Proof Path
2333
2421
 
2334
- A new user can now install the plugin, run one command, and see GDD inspect their own UI code in under five minutes with a concrete "first fix" pointer on the way out.
2422
+ A new user can now install the plugin, run one command, and see GDD inspect their own UI code in under five minutes - with a concrete "first fix" pointer on the way out.
2335
2423
 
2336
- - **`/gdd:start` skill** (`skills/start/SKILL.md`) leaf command with a locked 5-question interview (`reference/start-interview.md`) that collects pain hint, target-area confirmation, budget preference, framework/design-system confirmation, and visual-workflow selection. Writes only `.design/START-REPORT.md` and a temporary `.design/.start-context.json`; never mutates `STATE.md`, `config.json`, or source files.
2337
- - **`detect-ui-root` helper** (`scripts/lib/detect-ui-root.cjs`) deterministic priority-ordered detector that identifies the user's UI surface across `packages/ui/src/`, `apps/*/components/`, Next.js app-router `app/components/`, Vite `src/components/`, CRA `src/components/`, root `components/`, and Svelte/Remix `src/routes/`. Backend-only repos get a clean diagnostic and exit with zero `.design/` footprint.
2338
- - **`start-findings-engine` helper** (`scripts/lib/start-findings-engine.cjs`) read-only scanner with seven regex-based detectors (transition-all, will-change-all, tinted-image-outline, scale-on-press-drift, same-radius-nested, missing-reduced-motion-guard, non-root-font-smoothing), budget-bounded walk (fast / balanced / thorough), and a deterministic **safe-fix rubric** that picks exactly one `best_first_proof` per report.
2339
- - **`design-start-writer` agent** (`agents/design-start-writer.md`) Haiku-tier writer with `allowed-write-paths: [.design/START-REPORT.md]`. Output contract locks seven H2 sections (`What I inspected`, `Three findings`, `Best first proof`, `Suggested next command`, `Visual Proof Readiness`, `Full pipeline path`, `Connections / writeback optional`) plus one trailing machine-readable JSON block that future `/gdd:fast` / `/gdd:do` invocations can consume.
2340
- - **First-run nudge** (`hooks/first-run-nudge.sh`) SessionStart hook that surfaces one restrained line pointing at `/gdd:start` only when `.design/config.json` is absent, no dismissal flag exists, and no active pipeline stage is in progress. Per-install dismissal lives at `~/.claude/gdd-nudge-dismissed`. Silent-on-failure posture inherited from Phase 13.3.
2424
+ - **`/gdd:start` skill** (`skills/start/SKILL.md`) - leaf command with a locked 5-question interview (`reference/start-interview.md`) that collects pain hint, target-area confirmation, budget preference, framework/design-system confirmation, and visual-workflow selection. Writes only `.design/START-REPORT.md` and a temporary `.design/.start-context.json`; never mutates `STATE.md`, `config.json`, or source files.
2425
+ - **`detect-ui-root` helper** (`scripts/lib/detect-ui-root.cjs`) - deterministic priority-ordered detector that identifies the user's UI surface across `packages/ui/src/`, `apps/*/components/`, Next.js app-router `app/components/`, Vite `src/components/`, CRA `src/components/`, root `components/`, and Svelte/Remix `src/routes/`. Backend-only repos get a clean diagnostic and exit with zero `.design/` footprint.
2426
+ - **`start-findings-engine` helper** (`scripts/lib/start-findings-engine.cjs`) - read-only scanner with seven regex-based detectors (transition-all, will-change-all, tinted-image-outline, scale-on-press-drift, same-radius-nested, missing-reduced-motion-guard, non-root-font-smoothing), budget-bounded walk (fast / balanced / thorough), and a deterministic **safe-fix rubric** that picks exactly one `best_first_proof` per report.
2427
+ - **`design-start-writer` agent** (`agents/design-start-writer.md`) - Haiku-tier writer with `allowed-write-paths: [.design/START-REPORT.md]`. Output contract locks seven H2 sections (`What I inspected`, `Three findings`, `Best first proof`, `Suggested next command`, `Visual Proof Readiness`, `Full pipeline path`, `Connections / writeback optional`) plus one trailing machine-readable JSON block that future `/gdd:fast` / `/gdd:do` invocations can consume.
2428
+ - **First-run nudge** (`hooks/first-run-nudge.sh`) - SessionStart hook that surfaces one restrained line pointing at `/gdd:start` only when `.design/config.json` is absent, no dismissal flag exists, and no active pipeline stage is in progress. Per-install dismissal lives at `~/.claude/gdd-nudge-dismissed`. Silent-on-failure posture inherited from Phase 13.3.
2341
2429
  - **Regression fixtures** at `test-fixture/baselines/phase-14.7/` (context-input.json, expected-report-shape.md) and `test-fixture/src/ui-detection/` covering Next.js, Vite, CRA, Remix, two monorepo shapes, backend-only, and empty-repo paths.
2342
2430
  - **Plugin keywords** extended with `onboarding`, `first-run`, `demo`, `proof-path`.
2343
2431
 
@@ -2352,15 +2440,15 @@ Phase 15 target version unchanged (`v1.15.0`). `v1.14.6` remains reserved for Ph
2352
2440
 
2353
2441
  ---
2354
2442
 
2355
- ## [1.14.7] 2026-04-24
2443
+ ## [1.14.7] - 2026-04-24
2356
2444
 
2357
- ### Phase 14.6 Test Coverage Completion (Phase 12 Wave C closeout)
2445
+ ### Phase 14.6 - Test Coverage Completion (Phase 12 Wave C closeout)
2358
2446
 
2359
2447
  Closes the Phase 12 test-coverage slate that had Waves A + B shipped but Wave C (plans `12-05` / `12-06` / `12-07`) never executed. The plans were migrated to **Phase 14.6** (`.planning/phases/14.6-test-coverage-completion/`) and the gdd-unique test files those plans targeted are now validated end-to-end alongside the pre-existing suite.
2360
2448
 
2361
- ### Verified gdd-unique test coverage (no code diff vs 1.14.6)
2449
+ ### Verified - gdd-unique test coverage (no code diff vs 1.14.6)
2362
2450
 
2363
- Inspection during Phase 14.6 execution confirmed that all 13 gdd-unique test files from the Wave-C migration are present in `tests/` and pass under `npm test`. No net-new test source ships with this release Phase 14.6's substantive deliverable is the validation, documentation, and closeout bump.
2451
+ Inspection during Phase 14.6 execution confirmed that all 13 gdd-unique test files from the Wave-C migration are present in `tests/` and pass under `npm test`. No net-new test source ships with this release - Phase 14.6's substantive deliverable is the validation, documentation, and closeout bump.
2364
2452
 
2365
2453
  | Area | Test files covered |
2366
2454
  |---|---|
@@ -2371,8 +2459,8 @@ Full suite: **343 tests, 342 pass, 1 skipped, 0 fail**.
2371
2459
 
2372
2460
  ### Changed
2373
2461
 
2374
- - `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json` (outer + `plugins[0]`), `package.json` version `1.14.6` → `1.14.7`.
2375
- - `tests/semver-compare.test.cjs` `1.14.7` registered in `OFF_CADENCE_VERSIONS`.
2462
+ - `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json` (outer + `plugins[0]`), `package.json` - version `1.14.6` → `1.14.7`.
2463
+ - `tests/semver-compare.test.cjs` - `1.14.7` registered in `OFF_CADENCE_VERSIONS`.
2376
2464
 
2377
2465
  ### Notes
2378
2466
 
@@ -2381,37 +2469,37 @@ Full suite: **343 tests, 342 pass, 1 skipped, 0 fail**.
2381
2469
 
2382
2470
  ---
2383
2471
 
2384
- ## [1.14.6] 2026-04-24
2472
+ ## [1.14.6] - 2026-04-24
2385
2473
 
2386
- ### Phase 14.5 Safety + Recall Floor
2474
+ ### Phase 14.5 - Safety + Recall Floor
2387
2475
 
2388
2476
  Closes two unrelated risks before the Phase 15–19 reference-library expansion and the Phase 20+ autonomy ramp: (a) agents had no typed reference index and no cache-stable L0 preamble; (b) no defense-in-depth around prompt-injected bash, protected-paths violations, runaway blast radius, or the Figma plugin-sandbox hill-climb failure mode. Ships the minimum-viable version of both tracks as one cohesive release.
2389
2477
 
2390
2478
  ### Added
2391
2479
 
2392
2480
  **Safety hooks**
2393
- - `hooks/gdd-bash-guard.js` PreToolUse:Bash guard. 45 dangerous-pattern regexes across 10 families (filesystem destruction, permission escalation, pipe-to-shell, git destruction, system mutation, process nuking, credential exfil, shell obfuscation, path traversal, npm/docker/firewall abuse). `scripts/lib/dangerous-patterns.cjs` normalizes Unicode NFKC + strips ANSI escapes + strips zero-width / bidi overrides before matching so obfuscated attacks (`rm\u200B -rf /`, bidi overrides, hex-encoded `\x72\x6d\x20\x2d\x72\x66`) fail closed.
2394
- - `hooks/gdd-protected-paths.js` + `reference/protected-paths.default.json` PreToolUse:Edit|Write|Bash guard blocking mutation of `reference/**`, `skills/**`, `commands/**`, `hooks/**`, `.design/archive/**`, `.design/config.json`, `.design/telemetry/**`, `.git/**`, both plugin manifests. User additions in `.design/config.json.protected_paths` MERGE into the default list users cannot reduce the default-protected set. `scripts/lib/glob-match.cjs` ships a dependency-free `**` glob matcher.
2395
- - `scripts/lib/blast-radius.cjs` `estimate({touchedPaths, diffStats})` + `estimateMCPCalls({toolCalls})` preflight called by `design-executor` before the first Edit/Write of each task. Defaults: `max_files_per_task: 10`, `max_lines_per_task: 400`, `max_mcp_calls_per_task: 30`. Zero-value limits disable that ceiling. `design-executor` gains a new `## Preflight — Blast-Radius Check` section.
2481
+ - `hooks/gdd-bash-guard.js` - PreToolUse:Bash guard. 45 dangerous-pattern regexes across 10 families (filesystem destruction, permission escalation, pipe-to-shell, git destruction, system mutation, process nuking, credential exfil, shell obfuscation, path traversal, npm/docker/firewall abuse). `scripts/lib/dangerous-patterns.cjs` normalizes Unicode NFKC + strips ANSI escapes + strips zero-width / bidi overrides before matching so obfuscated attacks (`rm\u200B -rf /`, bidi overrides, hex-encoded `\x72\x6d\x20\x2d\x72\x66`) fail closed.
2482
+ - `hooks/gdd-protected-paths.js` + `reference/protected-paths.default.json` - PreToolUse:Edit|Write|Bash guard blocking mutation of `reference/**`, `skills/**`, `commands/**`, `hooks/**`, `.design/archive/**`, `.design/config.json`, `.design/telemetry/**`, `.git/**`, both plugin manifests. User additions in `.design/config.json.protected_paths` MERGE into the default list - users cannot reduce the default-protected set. `scripts/lib/glob-match.cjs` ships a dependency-free `**` glob matcher.
2483
+ - `scripts/lib/blast-radius.cjs` - `estimate({touchedPaths, diffStats})` + `estimateMCPCalls({toolCalls})` preflight called by `design-executor` before the first Edit/Write of each task. Defaults: `max_files_per_task: 10`, `max_lines_per_task: 400`, `max_mcp_calls_per_task: 30`. Zero-value limits disable that ceiling. `design-executor` gains a new `## Preflight — Blast-Radius Check` section.
2396
2484
 
2397
2485
  **Injection-scanner extension**
2398
2486
  - `scripts/injection-patterns.cjs` extended from 7 to 22 patterns: classic prompt-injection verbs (incl. `forget previous`), **invisible-Unicode** (zero-width, BOM, bidi overrides), **HTML-comment instruction hijacks** (`<!-- system: …`, hidden divs/spans, zero-font-size tricks), **secret-exfil triggers** (`curl $OPENAI_API_KEY`, `cat .env`, `tar ~ | nc`, `process.env._KEY fetch`, SSH private-key reads). Single source of truth consumed by `hooks/gdd-read-injection-scanner.js`.
2399
2487
 
2400
2488
  **Decision-injector hook (first cross-cycle recall primitive)**
2401
- - `hooks/gdd-decision-injector.js` PreToolUse:Read on any `.design/**.md | reference/**.md | .planning/**.md` ≥ 1500 bytes. Surfaces the top-15 matching D-XX decisions, L-NN learnings, and cycle-N summary excerpts that reference the opened file's basename or path. Grep backend (ripgrep when available, Node fs fallback); Phase 19.5 will swap in FTS5 transparently.
2489
+ - `hooks/gdd-decision-injector.js` - PreToolUse:Read on any `.design/**.md | reference/**.md | .planning/**.md` ≥ 1500 bytes. Surfaces the top-15 matching D-XX decisions, L-NN learnings, and cycle-N summary excerpts that reference the opened file's basename or path. Grep backend (ripgrep when available, Node fs fallback); Phase 19.5 will swap in FTS5 transparently.
2402
2490
 
2403
2491
  **Reference registry + L0/L2 cache split**
2404
- - `reference/registry.schema.json` + `reference/registry.json` typed index of every `reference/*.md` and `.default.json` file (18 entry types: `preamble | meta-rules | heuristic | output-contract | defaults | schema | data | motion | surfaces | authority-feed | influences | easing | taxonomy | principles | emotional-design | experience | palette | style-vocabulary`). Round-trip enforced by `scripts/lib/reference-registry.cjs.validateRegistry()`.
2492
+ - `reference/registry.schema.json` + `reference/registry.json` - typed index of every `reference/*.md` and `.default.json` file (18 entry types: `preamble | meta-rules | heuristic | output-contract | defaults | schema | data | motion | surfaces | authority-feed | influences | easing | taxonomy | principles | emotional-design | experience | palette | style-vocabulary`). Round-trip enforced by `scripts/lib/reference-registry.cjs.validateRegistry()`.
2405
2493
  - `scripts/build-intel.cjs` re-runs `validateRegistry()` on any `reference/**` change.
2406
- - `reference/meta-rules.md` (tier L0) 5 framework-invariant subsections extracted verbatim from `reference/shared-preamble.md`. `shared-preamble.md` becomes an L0 aggregator (imports `meta-rules.md` first), shrunk from ~6.5KB to <4KB. Stabilizes the Anthropic 5-min prompt-cache prefix.
2407
- - `reference/cycle-handoff-preamble.md` "reference, not current requests" framing prose imported by `/gdd:pause` and `/gdd:resume`.
2408
- - `reference/retrieval-contract.md` 3-layer `search → metadata → full-doc` protocol with per-row token-cost labels. Imported by `/gdd:progress`, `/gdd:resume`, `/gdd:reflect`, `/gdd:pause`.
2494
+ - `reference/meta-rules.md` (tier L0) - 5 framework-invariant subsections extracted verbatim from `reference/shared-preamble.md`. `shared-preamble.md` becomes an L0 aggregator (imports `meta-rules.md` first), shrunk from ~6.5KB to <4KB. Stabilizes the Anthropic 5-min prompt-cache prefix.
2495
+ - `reference/cycle-handoff-preamble.md` - "reference, not current requests" framing prose imported by `/gdd:pause` and `/gdd:resume`.
2496
+ - `reference/retrieval-contract.md` - 3-layer `search → metadata → full-doc` protocol with per-row token-cost labels. Imported by `/gdd:progress`, `/gdd:resume`, `/gdd:reflect`, `/gdd:pause`.
2409
2497
 
2410
2498
  **Figma authoring-intent guard + MCP circuit-breaker**
2411
- - `reference/figma-sandbox.md` 4 Figma plugin-sandbox pitfalls encoded as hard rules (`loadFontAsync` no-cache, `findOne` O(N), `appendChild` AutoLayout recomputation, per-call ~5–10s timeout).
2412
- - `reference/mcp-budget.default.json` + `reference/schemas/mcp-budget.schema.json` defaults: `max_calls_per_task: 30`, `max_consecutive_timeouts: 3`, `reset_on_success: true`, tracked tools `mcp__*use_figma | use_paper | use_pencil`.
2413
- - `agents/design-figma-writer` Step 0.5 **Authoring-Intent Guard** bilingual EN/RU pattern set classifies invocations as author-intent vs decision-intent. Author-intent STOPs with a redirect to `figma:figma-generate-design` and cites the 4 pitfalls. Decision-intent proceeds. Bumped `size_budget` LARGE → XL.
2414
- - `hooks/gdd-mcp-circuit-breaker.js` PostToolUse on `mcp__*use_figma | use_paper | use_pencil`. Appends `{ts, tool, outcome, consecutive_timeouts, total_calls}` rows to `.design/telemetry/mcp-budget.jsonl`. Breaks with `{continue:false}` at threshold + appends a STATE.md blocker.
2499
+ - `reference/figma-sandbox.md` - 4 Figma plugin-sandbox pitfalls encoded as hard rules (`loadFontAsync` no-cache, `findOne` O(N), `appendChild` AutoLayout recomputation, per-call ~5–10s timeout).
2500
+ - `reference/mcp-budget.default.json` + `reference/schemas/mcp-budget.schema.json` - defaults: `max_calls_per_task: 30`, `max_consecutive_timeouts: 3`, `reset_on_success: true`, tracked tools `mcp__*use_figma | use_paper | use_pencil`.
2501
+ - `agents/design-figma-writer` Step 0.5 **Authoring-Intent Guard** - bilingual EN/RU pattern set classifies invocations as author-intent vs decision-intent. Author-intent STOPs with a redirect to `figma:figma-generate-design` and cites the 4 pitfalls. Decision-intent proceeds. Bumped `size_budget` LARGE → XL.
2502
+ - `hooks/gdd-mcp-circuit-breaker.js` - PostToolUse on `mcp__*use_figma | use_paper | use_pencil`. Appends `{ts, tool, outcome, consecutive_timeouts, total_calls}` rows to `.design/telemetry/mcp-budget.jsonl`. Breaks with `{continue:false}` at threshold + appends a STATE.md blocker.
2415
2503
  - README.md + `connections/figma.md` gain the authoring-redirect callout + 4-pitfalls summary.
2416
2504
 
2417
2505
  **Tests** (8 new files, ~60 new assertions):
@@ -2419,36 +2507,36 @@ Closes two unrelated risks before the Phase 15–19 reference-library expansion
2419
2507
 
2420
2508
  ### Changed
2421
2509
 
2422
- - `agents/design-executor.md` new Preflight Blast-Radius Check + MCP Budget sections.
2423
- - `agents/design-figma-writer.md` Step 0.5 Authoring-Intent Guard; `size_budget: XL`.
2424
- - `reference/shared-preamble.md` rewritten as L0 aggregator.
2425
- - `scripts/build-intel.cjs` registry round-trip on `reference/**` changes.
2426
- - `skills/{progress,resume,reflect,pause}/SKILL.md` import `reference/retrieval-contract.md` (+ `cycle-handoff-preamble.md` for pause + resume).
2427
- - `hooks/hooks.json` registers bash-guard, protected-paths, decision-injector, MCP circuit-breaker.
2428
- - Plugin manifests add `safety-hardening`, `protected-paths`, `decision-injector`, `reference-registry`, `mcp-circuit-breaker` keywords.
2429
- - `tests/semver-compare.test.cjs` `1.14.6` added to `OFF_CADENCE_VERSIONS`.
2510
+ - `agents/design-executor.md` - new Preflight Blast-Radius Check + MCP Budget sections.
2511
+ - `agents/design-figma-writer.md` - Step 0.5 Authoring-Intent Guard; `size_budget: XL`.
2512
+ - `reference/shared-preamble.md` - rewritten as L0 aggregator.
2513
+ - `scripts/build-intel.cjs` - registry round-trip on `reference/**` changes.
2514
+ - `skills/{progress,resume,reflect,pause}/SKILL.md` - import `reference/retrieval-contract.md` (+ `cycle-handoff-preamble.md` for pause + resume).
2515
+ - `hooks/hooks.json` - registers bash-guard, protected-paths, decision-injector, MCP circuit-breaker.
2516
+ - Plugin manifests - add `safety-hardening`, `protected-paths`, `decision-injector`, `reference-registry`, `mcp-circuit-breaker` keywords.
2517
+ - `tests/semver-compare.test.cjs` - `1.14.6` added to `OFF_CADENCE_VERSIONS`.
2430
2518
 
2431
2519
  ### Security
2432
2520
 
2433
- - Bash guard normalizes Unicode (NFKC + strip zero-width + bidi) and ANSI escapes before pattern match blocks bidi-override obfuscation, zero-width-injected verbs, and ANSI-colored reformulations.
2521
+ - Bash guard normalizes Unicode (NFKC + strip zero-width + bidi) and ANSI escapes before pattern match - blocks bidi-override obfuscation, zero-width-injected verbs, and ANSI-colored reformulations.
2434
2522
  - Read-injection scanner flags invisible-Unicode sequences, HTML-comment hijacks, and secret-exfil triggers (7 → 22 patterns).
2435
- - Protected-paths enforces a merge-only glob list user configs cannot reduce the default-protected set.
2523
+ - Protected-paths enforces a merge-only glob list - user configs cannot reduce the default-protected set.
2436
2524
 
2437
2525
  ---
2438
2526
 
2439
- ## [1.14.5] 2026-04-23
2527
+ ## [1.14.5] - 2026-04-23
2440
2528
 
2441
- ### Fixed Preview MCP silently skipped in verify even when available ([#19](https://github.com/hegemonart/get-design-done/issues/19))
2529
+ ### Fixed - Preview MCP silently skipped in verify even when available ([#19](https://github.com/hegemonart/get-design-done/issues/19))
2442
2530
 
2443
2531
  `design-verifier` was spawned with `tools: Read, Write, Bash, Grep, Glob` only. The verify skill's orchestrator-level probe correctly classified the session as `preview: available` and wrote it to `STATE.md`, but the subagent's tool allowlist blocked every `mcp__Claude_Preview__*` call, causing Phase 4B to silently skip screenshot capture and leave all `? VISUAL` heuristic flags unresolved.
2444
2532
 
2445
- **Fix:** Added six Preview MCP tools to `design-verifier`'s `tools:` frontmatter `preview_list`, `preview_navigate`, `preview_screenshot`, `preview_eval`, `preview_snapshot`, `preview_inspect` so Phase 4B runs in the same permission context as the probe.
2533
+ **Fix:** Added six Preview MCP tools to `design-verifier`'s `tools:` frontmatter - `preview_list`, `preview_navigate`, `preview_screenshot`, `preview_eval`, `preview_snapshot`, `preview_inspect` - so Phase 4B runs in the same permission context as the probe.
2446
2534
 
2447
2535
  **Probe hardening:** The availability probe in `connections/preview.md` and `skills/verify/SKILL.md` now distinguishes three failure modes instead of collapsing them to `not_configured`/`unavailable`:
2448
2536
 
2449
2537
  | New status | Meaning |
2450
2538
  |---|---|
2451
- | `not_loaded` | ToolSearch empty MCP not registered in this session |
2539
+ | `not_loaded` | ToolSearch empty - MCP not registered in this session |
2452
2540
  | `permission_denied` | ToolSearch found the tool but the live call was rejected by the tool permission layer |
2453
2541
  | `unreachable` | Tool loaded but live call errored for a non-permission reason (no dev server, timeout) |
2454
2542
 
@@ -2458,46 +2546,46 @@ The Phase 4B gate in `design-verifier` skips on all non-`available` statuses and
2458
2546
 
2459
2547
  ---
2460
2548
 
2461
- ## [1.14.4] 2026-04-20
2549
+ ## [1.14.4] - 2026-04-20
2462
2550
 
2463
- ### Fixed Figma MCP install URL was stale
2551
+ ### Fixed - Figma MCP install URL was stale
2464
2552
 
2465
2553
  The docs everywhere referenced the legacy `https://mcp.figma.com/v1/sse` endpoint. Users following the current Claude Code Figma MCP flow hit "Failed to connect" because Figma has since moved the server to `https://mcp.figma.com/mcp` (Streamable HTTP). Every skill, agent, and reference doc that prints Figma install steps now uses the current URL, and the migration note tells existing users how to remove a stale registration.
2466
2554
 
2467
- ### Changed Variant-agnostic Figma MCP probe
2555
+ ### Changed - Variant-agnostic Figma MCP probe
2468
2556
 
2469
- - The `mcp__figma__` prefix is no longer hardcoded. The probe matches any server whose name fits `/figma/i` remote `figma`, `Figma`, local `figma-desktop`, UUID-prefixed instances via keyword `ToolSearch`, applies a tiebreaker (both-sets > reads-only > canonical `figma` > alphabetical), and writes the resolved `prefix=` and `writes=` capability flags to `.design/STATE.md <connections>`. Consumer skills and agents read the resolved prefix from `STATE.md` instead of hardcoding it.
2557
+ - The `mcp__figma__` prefix is no longer hardcoded. The probe matches any server whose name fits `/figma/i` - remote `figma`, `Figma`, local `figma-desktop`, UUID-prefixed instances - via keyword `ToolSearch`, applies a tiebreaker (both-sets > reads-only > canonical `figma` > alphabetical), and writes the resolved `prefix=` and `writes=` capability flags to `.design/STATE.md <connections>`. Consumer skills and agents read the resolved prefix from `STATE.md` instead of hardcoding it.
2470
2558
  - Added preferred install path: `claude plugin install figma@claude-plugins-official` (bundles the MCP + Figma's agent skills). Manual `claude mcp add` remains supported.
2471
- - Tool table extended with `generate_figma_design`, `search_design_system`, `create_new_file`, `whoami`, `generate_diagram`, `get_figjam`, `get_code_connect_suggestions`, `send_code_connect_mappings` split by reads (remote + desktop) vs writes (remote-only).
2559
+ - Tool table extended with `generate_figma_design`, `search_design_system`, `create_new_file`, `whoami`, `generate_diagram`, `get_figjam`, `get_code_connect_suggestions`, `send_code_connect_mappings` - split by reads (remote + desktop) vs writes (remote-only).
2472
2560
  - `design-figma-writer` now STOPs early with a clear install message when only a reads-only variant (e.g. `figma-desktop`) is detected.
2473
- - `tests/semver-compare.test.cjs` registered `1.14.4` as a recognized off-cadence version.
2561
+ - `tests/semver-compare.test.cjs` - registered `1.14.4` as a recognized off-cadence version.
2474
2562
 
2475
- Cherry-picked from `c11cd7b` on `claude/upbeat-fermi-199627` the Figma MCP fix that was authored before v1.14.2 but never merged to main, so every install doc was printing the outdated URL until this release.
2563
+ Cherry-picked from `c11cd7b` on `claude/upbeat-fermi-199627` - the Figma MCP fix that was authored before v1.14.2 but never merged to main, so every install doc was printing the outdated URL until this release.
2476
2564
 
2477
2565
  ---
2478
2566
 
2479
- ## [1.14.3] 2026-04-20
2567
+ ## [1.14.3] - 2026-04-20
2480
2568
 
2481
- ### Added `npx @hegemonart/get-design-done` installer
2569
+ ### Added - `npx @hegemonart/get-design-done` installer
2482
2570
 
2483
- - **`scripts/install.cjs`** new npm-bin entrypoint (the bin slot referenced from `package.json` since v1.0.7 but never shipped). Running `npx @hegemonart/get-design-done` now atomically merges an `extraKnownMarketplaces["get-design-done"]` entry (source: `github:hegemonart/get-design-done`) and an `enabledPlugins["get-design-done@get-design-done"] = true` flag into `$CLAUDE_CONFIG_DIR/settings.json` (default `~/.claude/settings.json`). Flags: `--dry-run`, `--help`. Idempotent; preserves unrelated keys; rejects malformed settings JSON with a clear error.
2571
+ - **`scripts/install.cjs`** - new npm-bin entrypoint (the bin slot referenced from `package.json` since v1.0.7 but never shipped). Running `npx @hegemonart/get-design-done` now atomically merges an `extraKnownMarketplaces["get-design-done"]` entry (source: `github:hegemonart/get-design-done`) and an `enabledPlugins["get-design-done@get-design-done"] = true` flag into `$CLAUDE_CONFIG_DIR/settings.json` (default `~/.claude/settings.json`). Flags: `--dry-run`, `--help`. Idempotent; preserves unrelated keys; rejects malformed settings JSON with a clear error.
2484
2572
 
2485
- ### Fixed Plugin manifest bugs blocking v1.14.2 install
2573
+ ### Fixed - Plugin manifest bugs blocking v1.14.2 install
2486
2574
 
2487
- - **`.claude-plugin/plugin.json`** dropped `"./"` from the `skills` array. The Claude Code plugin loader rejects it as `Path escapes plugin directory: ./` even though the spec describes it as legal. Manifest now declares `"skills": ["./skills/"]` only; the plugin loads cleanly from the marketplace.
2488
- - **`.claude-plugin/plugin.json`** removed the explicit `"hooks": "./hooks/hooks.json"` pointer. Claude Code auto-detects `hooks/hooks.json` at the standard location, so the manifest pointer triggered `Duplicate hooks file`. Hooks still register the same PreToolUse/SessionStart/PostToolUse commands only the redundant pointer is gone.
2489
- - **`reference/schemas/plugin.schema.json`** `hooks` is no longer a required field (still permitted for plugins that keep the file elsewhere).
2490
- - **`skills/explore/SKILL.md`** design interview now runs inline inside `/gdd:explore` instead of being delegated to a `design-discussant` subagent via `Task()`. Subagent spawns in Claude Desktop collapse `AskUserQuestion` to plain markdown; inlining restores the native-picker widget so the interview renders as interactive UI instead of chat text. `/gdd:discuss` and the handoff confirmation flow still use the subagent only the explore-stage interview moved inline.
2491
- - **`tests/semver-compare.test.cjs`** registered `1.14.2` and `1.14.3` as recognized off-cadence versions.
2492
- - **`tests/install-script.test.cjs`** new suite (7 tests) covering the installer: bin wiring, `--help`, fresh install, idempotency, key preservation, `--dry-run` no-write, malformed-JSON exit code.
2575
+ - **`.claude-plugin/plugin.json`** - dropped `"./"` from the `skills` array. The Claude Code plugin loader rejects it as `Path escapes plugin directory: ./` even though the spec describes it as legal. Manifest now declares `"skills": ["./skills/"]` only; the plugin loads cleanly from the marketplace.
2576
+ - **`.claude-plugin/plugin.json`** - removed the explicit `"hooks": "./hooks/hooks.json"` pointer. Claude Code auto-detects `hooks/hooks.json` at the standard location, so the manifest pointer triggered `Duplicate hooks file`. Hooks still register the same PreToolUse/SessionStart/PostToolUse commands - only the redundant pointer is gone.
2577
+ - **`reference/schemas/plugin.schema.json`** - `hooks` is no longer a required field (still permitted for plugins that keep the file elsewhere).
2578
+ - **`skills/explore/SKILL.md`** - design interview now runs inline inside `/gdd:explore` instead of being delegated to a `design-discussant` subagent via `Task()`. Subagent spawns in Claude Desktop collapse `AskUserQuestion` to plain markdown; inlining restores the native-picker widget so the interview renders as interactive UI instead of chat text. `/gdd:discuss` and the handoff confirmation flow still use the subagent - only the explore-stage interview moved inline.
2579
+ - **`tests/semver-compare.test.cjs`** - registered `1.14.2` and `1.14.3` as recognized off-cadence versions.
2580
+ - **`tests/install-script.test.cjs`** - new suite (7 tests) covering the installer: bin wiring, `--help`, fresh install, idempotency, key preservation, `--dry-run` no-write, malformed-JSON exit code.
2493
2581
 
2494
2582
  ---
2495
2583
 
2496
- ## [1.14.2] 2026-04-20
2584
+ ## [1.14.2] - 2026-04-20
2497
2585
 
2498
- ### Added Multi-format Claude Design handoff ingestion
2586
+ ### Added - Multi-format Claude Design handoff ingestion
2499
2587
 
2500
- - **URL entry point**: detect `https://api.anthropic.com/v1/design/h/<hash>` in agent prompt (native "Send to local coding agent" flow); `WebFetch` with `Content-Type` routing HTML parsed directly, ZIP downloaded and extracted
2588
+ - **URL entry point**: detect `https://api.anthropic.com/v1/design/h/<hash>` in agent prompt (native "Send to local coding agent" flow); `WebFetch` with `Content-Type` routing - HTML parsed directly, ZIP downloaded and extracted
2501
2589
  - **ZIP bundle**: extract to `.design/handoff/`, find primary HTML + readme, parse normally, clean up after
2502
2590
  - **PDF format**: `pdftotext` text extraction; grep for token values; all decisions tagged `(tentative — text-only)` since no CSS is present
2503
2591
  - **PPTX format**: slide XML text extraction (`ppt/slides/*.xml`); same tentative-only tagging as PDF
@@ -2507,114 +2595,114 @@ Cherry-picked from `c11cd7b` on `claude/upbeat-fermi-199627` — the Figma MCP f
2507
2595
 
2508
2596
  ---
2509
2597
 
2510
- ## [1.14.1] 2026-04-19
2598
+ ## [1.14.1] - 2026-04-19
2511
2599
 
2512
- ### Fixed Security hardening (full codebase review)
2600
+ ### Fixed - Security hardening (full codebase review)
2513
2601
 
2514
- - **CR-01** `scripts/build-intel.cjs` replaced `execSync` template literal with `spawnSync` argv array; eliminates command injection via crafted filenames in the project tree. Added 5 s timeout to all git calls.
2515
- - **CR-02** `hooks/update-check.sh` validate `LATEST_TAG` against a semver pattern before writing to cache; strip double-quotes from `BODY_EXCERPT` to prevent injection via adversarial release body.
2516
- - **CR-03** `.github/workflows/ci.yml` pin `ludeeus/action-shellcheck` from `@master` (mutable) to `@2.0.0` (supply-chain hardening).
2517
- - **WR-01** `scripts/injection-patterns.cjs` new shared source of truth for prompt-injection patterns; both the runtime hook and CI scanner now require from it, eliminating silent pattern drift.
2518
- - **WR-02** `hooks/budget-enforcer.js` phase spend now read from the lightweight `phase-totals.json` written by the aggregator instead of replaying the full `costs.jsonl` on every agent spawn (O(1) vs O(n)).
2519
- - **WR-04** `hooks/update-check.sh` allowlist-gate `C_DELTA` after cache read (`major|minor|patch|off-cadence|none`) before it reaches any shell context.
2520
- - **WR-05** `scripts/tests/test-authority-watcher-diff.sh` replace `find | wc -l` with null-delimited loop; handles filenames with newlines.
2521
- - **WR-06** `tests/regression-baseline.test.cjs` replace `execSync` template literal with `spawnSync` in git helpers.
2522
- - **WR-07** `tests/optimization-layer.test.cjs` fix budget schema test to match the actual `loadBudget()` format (`per_task_cap_usd`, `per_phase_cap_usd`, `enforcement_mode`, …); previous test validated a dead schema shape.
2523
- - **IN-02** `hooks/budget-enforcer.js` detached aggregator child now inherits only `PATH`, not full `process.env`.
2602
+ - **CR-01** `scripts/build-intel.cjs` - replaced `execSync` template literal with `spawnSync` argv array; eliminates command injection via crafted filenames in the project tree. Added 5 s timeout to all git calls.
2603
+ - **CR-02** `hooks/update-check.sh` - validate `LATEST_TAG` against a semver pattern before writing to cache; strip double-quotes from `BODY_EXCERPT` to prevent injection via adversarial release body.
2604
+ - **CR-03** `.github/workflows/ci.yml` - pin `ludeeus/action-shellcheck` from `@master` (mutable) to `@2.0.0` (supply-chain hardening).
2605
+ - **WR-01** `scripts/injection-patterns.cjs` - new shared source of truth for prompt-injection patterns; both the runtime hook and CI scanner now require from it, eliminating silent pattern drift.
2606
+ - **WR-02** `hooks/budget-enforcer.js` - phase spend now read from the lightweight `phase-totals.json` written by the aggregator instead of replaying the full `costs.jsonl` on every agent spawn (O(1) vs O(n)).
2607
+ - **WR-04** `hooks/update-check.sh` - allowlist-gate `C_DELTA` after cache read (`major|minor|patch|off-cadence|none`) before it reaches any shell context.
2608
+ - **WR-05** `scripts/tests/test-authority-watcher-diff.sh` - replace `find | wc -l` with null-delimited loop; handles filenames with newlines.
2609
+ - **WR-06** `tests/regression-baseline.test.cjs` - replace `execSync` template literal with `spawnSync` in git helpers.
2610
+ - **WR-07** `tests/optimization-layer.test.cjs` - fix budget schema test to match the actual `loadBudget()` format (`per_task_cap_usd`, `per_phase_cap_usd`, `enforcement_mode`, …); previous test validated a dead schema shape.
2611
+ - **IN-02** `hooks/budget-enforcer.js` - detached aggregator child now inherits only `PATH`, not full `process.env`.
2524
2612
 
2525
2613
  ---
2526
2614
 
2527
- ## [1.14.0] 2026-04-19
2615
+ ## [1.14.0] - 2026-04-19
2528
2616
 
2529
- ### Added Phase 14: AI-Native Design Tool Connections
2617
+ ### Added - Phase 14: AI-Native Design Tool Connections
2530
2618
 
2531
- - `connections/paper-design.md` paper.design MCP integration (canvas read/write, budget tracking, 100 calls/week free tier)
2532
- - `connections/pencil-dev.md` pencil.dev .pen file integration (git-tracked design specs, pre-merge spec-vs-impl diff)
2533
- - `connections/21st-dev.md` 21st.dev Magic MCP (prior-art gate, component scaffolding, SVGL brand logo lookup)
2534
- - `connections/magic-patterns.md` Magic Patterns component generator (Claude connector + API key fallback, DS-aware, preview_url)
2535
- - `agents/design-paper-writer.md` annotate / tokenize / roundtrip modes for paper.design canvas; proposal→confirm, dry-run, budget-aware
2536
- - `agents/design-pencil-writer.md` annotate / roundtrip modes for .pen files with atomic git commits
2537
- - `agents/design-component-generator.md` shared component generator (21st.dev + Magic Patterns impl sections); proposal→confirm, DS-aware
2538
- - `reference/ai-native-tool-interface.md` capability-based contract for canvas + component-generator sub-categories; extension guide for future tools
2539
- - Explore stage: 21st.dev prior-art gate marketplace search before any greenfield component build; ≥80% fit → adopt recommendation
2619
+ - `connections/paper-design.md` - paper.design MCP integration (canvas read/write, budget tracking, 100 calls/week free tier)
2620
+ - `connections/pencil-dev.md` - pencil.dev .pen file integration (git-tracked design specs, pre-merge spec-vs-impl diff)
2621
+ - `connections/21st-dev.md` - 21st.dev Magic MCP (prior-art gate, component scaffolding, SVGL brand logo lookup)
2622
+ - `connections/magic-patterns.md` - Magic Patterns component generator (Claude connector + API key fallback, DS-aware, preview_url)
2623
+ - `agents/design-paper-writer.md` - annotate / tokenize / roundtrip modes for paper.design canvas; proposal→confirm, dry-run, budget-aware
2624
+ - `agents/design-pencil-writer.md` - annotate / roundtrip modes for .pen files with atomic git commits
2625
+ - `agents/design-component-generator.md` - shared component generator (21st.dev + Magic Patterns impl sections); proposal→confirm, DS-aware
2626
+ - `reference/ai-native-tool-interface.md` - capability-based contract for canvas + component-generator sub-categories; extension guide for future tools
2627
+ - Explore stage: 21st.dev prior-art gate - marketplace search before any greenfield component build; ≥80% fit → adopt recommendation
2540
2628
  - Explore stage: design-system auto-detection (shadcn / tailwind / mantine / chakra) written to STATE.md for generator targeting
2541
2629
  - Verify stage: paper.design component screenshots via `get_screenshot` for `? VISUAL` checks (Phase 4C)
2542
- - Verify stage: pencil.dev spec-vs-implementation diff compares .pen design-token declarations against actual code values
2630
+ - Verify stage: pencil.dev spec-vs-implementation diff - compares .pen design-token declarations against actual code values
2543
2631
 
2544
2632
  ### Changed
2545
2633
 
2546
- - `connections/connections.md` added `canvas` and `generator` columns to capability matrix; 4 new rows; backlog of 8 candidate future tools
2547
- - `agents/design-context-builder.md` Step 0A (paper.design canvas read), Step 0B (pencil.dev .pen discovery), Step 0C (DS detection)
2548
- - `agents/design-verifier.md` Phase 4C (paper.design screenshots), pencil.dev spec-vs-impl diff block
2549
- - `agents/design-research-synthesizer.md` .pen file merge into synthesis output
2550
- - `skills/explore/SKILL.md` probes C/D/E/F (21st.dev, Magic Patterns, paper.design, pencil.dev) + Step 1.5 prior-art gate
2634
+ - `connections/connections.md` - added `canvas` and `generator` columns to capability matrix; 4 new rows; backlog of 8 candidate future tools
2635
+ - `agents/design-context-builder.md` - Step 0A (paper.design canvas read), Step 0B (pencil.dev .pen discovery), Step 0C (DS detection)
2636
+ - `agents/design-verifier.md` - Phase 4C (paper.design screenshots), pencil.dev spec-vs-impl diff block
2637
+ - `agents/design-research-synthesizer.md` - .pen file merge into synthesis output
2638
+ - `skills/explore/SKILL.md` - probes C/D/E/F (21st.dev, Magic Patterns, paper.design, pencil.dev) + Step 1.5 prior-art gate
2551
2639
  - Version bump to 1.14.0 (milestone.phase.patch scheme: 1.MM.P)
2552
2640
 
2553
2641
  ---
2554
2642
 
2555
- ## [1.13.3] 2026-04-19
2643
+ ## [1.13.3] - 2026-04-19
2556
2644
 
2557
- ### Added Phase 13.3: Plugin Update Checker
2645
+ ### Added - Phase 13.3: Plugin Update Checker
2558
2646
 
2559
- - `hooks/update-check.sh` SessionStart Bash hook; 24h-cached unauthenticated `GET /repos/hegemonart/get-design-done/releases/latest`; classifies semver delta (major / minor / patch / off-cadence); respects `.design/STATE.md` stage guard (suppresses nudge during `plan`, `design`, `verify`); respects per-version dismissal from `.design/config.json`; silent-on-failure by policy (exit 0 on every error path); BASH_SOURCE guard makes the script source-safe for self-test.
2560
- - `hooks/hooks.json` registers `update-check.sh` as a second SessionStart command alongside `bootstrap.sh` (run order: bootstrap → update-check).
2561
- - `agents/design-update-checker.md` Haiku-tier enrichment agent (Phase 10.1 cost governance). Invoked only by `/gdd:check-update --prompt` to produce a 3–5-line "what this release changes for you" summary from the cached release body. Reads-only, inline-text-only output, ends with `## UPDATE-CHECKER COMPLETE`.
2562
- - `skills/check-update/SKILL.md` `/gdd:check-update` manual slash command. Flags: `--refresh` (bypass 24h TTL, re-fetch now), `--dismiss` (write `update_dismissed: "<tag>"` atomically to `.design/config.json` via env-prefix python3 heredoc, preserves all pre-existing keys), `--prompt` (spawn the enrichment agent). Default (no flag) prints cached state.
2563
- - `.design/update-cache.json` per-user-project runtime cache (written by the hook). Shape: `{checked_at, current_tag, latest_tag, delta, is_newer, changelog_excerpt}`; 500-char excerpt from release body.
2564
- - `.design/update-available.md` per-user-project runtime rendered banner. Written only when all four gates pass (cache is_newer=true AND stage ∉ {plan,design,verify} AND not dismissed AND latest_tag parsed successfully). Consumed by safe-window skills via `[ -f .design/update-available.md ] && cat .design/update-available.md`.
2565
- - `reference/schemas/config.schema.json` adds optional `update_dismissed: string` property.
2566
- - Safe-window surfaces: `/gdd:progress`, `/gdd:health`, `/gdd:help`, post-closeout of `/gdd:ship`, `/gdd:complete-cycle`, `/gdd:audit` each appends the one-line banner-cat tail before its completion marker. Mid-pipeline skills (`brief`, `explore`, `plan`, `design`, `verify`) explicitly NOT modified.
2567
- - `skills/audit/SKILL.md` `tools:` list extended with `Bash` to enable the banner-cat tail (previously: `Read, Write, Task, Glob`).
2568
- - Root `SKILL.md` `check-update` registered in argument-hint alternation.
2569
- - `test-fixture/baselines/phase-13.3/` regression baseline lock for v1.13.3.
2570
- - `test-fixture/baselines/current/agent-list.txt` appended `design-update-checker.md` in sorted position.
2571
- - `test-fixture/baselines/current/skill-list.txt` appended `check-update` in sorted position.
2647
+ - `hooks/update-check.sh` - SessionStart Bash hook; 24h-cached unauthenticated `GET /repos/hegemonart/get-design-done/releases/latest`; classifies semver delta (major / minor / patch / off-cadence); respects `.design/STATE.md` stage guard (suppresses nudge during `plan`, `design`, `verify`); respects per-version dismissal from `.design/config.json`; silent-on-failure by policy (exit 0 on every error path); BASH_SOURCE guard makes the script source-safe for self-test.
2648
+ - `hooks/hooks.json` - registers `update-check.sh` as a second SessionStart command alongside `bootstrap.sh` (run order: bootstrap → update-check).
2649
+ - `agents/design-update-checker.md` - Haiku-tier enrichment agent (Phase 10.1 cost governance). Invoked only by `/gdd:check-update --prompt` to produce a 3–5-line "what this release changes for you" summary from the cached release body. Reads-only, inline-text-only output, ends with `## UPDATE-CHECKER COMPLETE`.
2650
+ - `skills/check-update/SKILL.md` - `/gdd:check-update` manual slash command. Flags: `--refresh` (bypass 24h TTL, re-fetch now), `--dismiss` (write `update_dismissed: "<tag>"` atomically to `.design/config.json` via env-prefix python3 heredoc, preserves all pre-existing keys), `--prompt` (spawn the enrichment agent). Default (no flag) prints cached state.
2651
+ - `.design/update-cache.json` - per-user-project runtime cache (written by the hook). Shape: `{checked_at, current_tag, latest_tag, delta, is_newer, changelog_excerpt}`; 500-char excerpt from release body.
2652
+ - `.design/update-available.md` - per-user-project runtime rendered banner. Written only when all four gates pass (cache is_newer=true AND stage ∉ {plan,design,verify} AND not dismissed AND latest_tag parsed successfully). Consumed by safe-window skills via `[ -f .design/update-available.md ] && cat .design/update-available.md`.
2653
+ - `reference/schemas/config.schema.json` - adds optional `update_dismissed: string` property.
2654
+ - Safe-window surfaces: `/gdd:progress`, `/gdd:health`, `/gdd:help`, post-closeout of `/gdd:ship`, `/gdd:complete-cycle`, `/gdd:audit` - each appends the one-line banner-cat tail before its completion marker. Mid-pipeline skills (`brief`, `explore`, `plan`, `design`, `verify`) explicitly NOT modified.
2655
+ - `skills/audit/SKILL.md` - `tools:` list extended with `Bash` to enable the banner-cat tail (previously: `Read, Write, Task, Glob`).
2656
+ - Root `SKILL.md` - `check-update` registered in argument-hint alternation.
2657
+ - `test-fixture/baselines/phase-13.3/` - regression baseline lock for v1.13.3.
2658
+ - `test-fixture/baselines/current/agent-list.txt` - appended `design-update-checker.md` in sorted position.
2659
+ - `test-fixture/baselines/current/skill-list.txt` - appended `check-update` in sorted position.
2572
2660
 
2573
2661
  ### Changed
2574
2662
 
2575
- - Plugin version: 1.0.7.2 → 1.13.3 (per the new milestone.phase.sub-phase versioning scheme MAJOR=milestone, MINOR=phase, PATCH=sub-phase). Phase 13.3 lands as a valid semver; release workflow auto-tags and `npm publish` succeeds.
2663
+ - Plugin version: 1.0.7.2 → 1.13.3 (per the new milestone.phase.sub-phase versioning scheme - MAJOR=milestone, MINOR=phase, PATCH=sub-phase). Phase 13.3 lands as a valid semver; release workflow auto-tags and `npm publish` succeeds.
2576
2664
 
2577
2665
  ### Design principles (Phase 13.3)
2578
2666
 
2579
2667
  - **Never auto-updates.** The checker only surfaces a nudge; `/gdd:update` remains the explicit user action.
2580
2668
  - **Never interrupts critical work.** State-machine guard suppresses the nudge during mid-pipeline stages (`plan`, `design`, `verify`); banner renders only in the 6 documented safe windows.
2581
- - **Silent-on-failure.** Network timeout, malformed JSON, missing plugin.json, unwritable `.design/` every path exits 0 without printing to stderr during normal SessionStart.
2669
+ - **Silent-on-failure.** Network timeout, malformed JSON, missing plugin.json, unwritable `.design/` - every path exits 0 without printing to stderr during normal SessionStart.
2582
2670
  - **No telemetry.** Unauthenticated GitHub Releases fetch; no phone-home, no tracking, no tokens in code.
2583
2671
 
2584
2672
  ---
2585
2673
 
2586
- ## [1.13.2] 2026-04-19
2674
+ ## [1.13.2] - 2026-04-19
2587
2675
 
2588
- ### Added Phase 13.2: External Authority Watcher
2676
+ ### Added - Phase 13.2: External Authority Watcher
2589
2677
 
2590
- - `reference/authority-feeds.md` curated whitelist of 26 design-authority feeds grouped by kind (5 spec sources, 8 component systems, 3 research institutions, 10 named practitioners, user-extensible Are.na channels) with an explicit `## Rejected kinds` assertion block covering Dribbble, Behance, LinkedIn, generic Medium topic feeds, and trending aggregators.
2591
- - `reference/schemas/authority-snapshot.schema.json` Draft-07 JSON Schema validating `.design/authority-snapshot.json` shape (version const 1, feeds keyed by id, 64-hex sha256 hash pattern, `maxItems: 200` per-feed entry cap enforcing D-14 retention at validation time).
2592
- - `agents/design-authority-watcher.md` Sonnet-tier, parallel-safe watcher agent. Fetches feeds via WebFetch, diffs against snapshot, classifies new entries into five buckets (`spec-change`, `heuristic-update`, `pattern-guidance`, `craft-tip`, `skip`) with a one-sentence rationale per entry. First run seeds the snapshot silently; `--since <date>` is the escape hatch for surfacing a backlog.
2593
- - `skills/watch-authorities/SKILL.md` `/gdd:watch-authorities` command with `--refresh`, `--since <date>`, `--feed <name>`, `--schedule <weekly|daily|monthly>` flags. Mutual-exclusion rules between `--refresh` and `--since`; `--schedule` registers a cron via the `scheduled-tasks` MCP when connected (weekly=`0 9 * * 1`, daily=`0 9 * * *`, monthly=`0 9 1 * *`) with graceful exit-0 fallback on MCP absence.
2594
- - `scripts/tests/test-authority-rejected-kinds.sh` CI test enforcing the anti-slop thesis structurally. Splits `reference/authority-feeds.md` at the `## Rejected kinds` heading and greps the active section for `dribbble.com` / `behance.net` / `linkedin.com` / `medium.com/topic` / trending-aggregator hostnames; exits non-zero on any match.
2595
- - `scripts/tests/test-authority-watcher-diff.sh` structural-only v1 of the watcher-diff test. Asserts fixture presence, baseline existence, D-21 classification-heading vocabulary, and exact count consistency between the header's "N entries surfaced" figure and the number of bulleted entries across classification sections. Full end-to-end byte diff against a live watcher run is deferred until the Claude Code agent runtime is available in CI.
2596
- - `test-fixture/authority-feeds/` four frozen mock feeds (WAI-ARIA APG Atom, Radix Primitives release Atom, NN/g articles RSS, Are.na channel JSON) with deterministic timestamps for byte-stable CI diff testing. Exercises all four non-practitioner source kinds against every branch of the D-17 classification decision table.
2597
- - `test-fixture/baselines/phase-13.2/authority-report.expected.md` frozen regression baseline for the watcher-diff test (9 entries across 4 feeds: spec-change=2, heuristic-update=1, pattern-guidance=4, craft-tip=2, skip=0).
2678
+ - `reference/authority-feeds.md` - curated whitelist of 26 design-authority feeds grouped by kind (5 spec sources, 8 component systems, 3 research institutions, 10 named practitioners, user-extensible Are.na channels) with an explicit `## Rejected kinds` assertion block covering Dribbble, Behance, LinkedIn, generic Medium topic feeds, and trending aggregators.
2679
+ - `reference/schemas/authority-snapshot.schema.json` - Draft-07 JSON Schema validating `.design/authority-snapshot.json` shape (version const 1, feeds keyed by id, 64-hex sha256 hash pattern, `maxItems: 200` per-feed entry cap enforcing D-14 retention at validation time).
2680
+ - `agents/design-authority-watcher.md` - Sonnet-tier, parallel-safe watcher agent. Fetches feeds via WebFetch, diffs against snapshot, classifies new entries into five buckets (`spec-change`, `heuristic-update`, `pattern-guidance`, `craft-tip`, `skip`) with a one-sentence rationale per entry. First run seeds the snapshot silently; `--since <date>` is the escape hatch for surfacing a backlog.
2681
+ - `skills/watch-authorities/SKILL.md` - `/gdd:watch-authorities` command with `--refresh`, `--since <date>`, `--feed <name>`, `--schedule <weekly|daily|monthly>` flags. Mutual-exclusion rules between `--refresh` and `--since`; `--schedule` registers a cron via the `scheduled-tasks` MCP when connected (weekly=`0 9 * * 1`, daily=`0 9 * * *`, monthly=`0 9 1 * *`) with graceful exit-0 fallback on MCP absence.
2682
+ - `scripts/tests/test-authority-rejected-kinds.sh` - CI test enforcing the anti-slop thesis structurally. Splits `reference/authority-feeds.md` at the `## Rejected kinds` heading and greps the active section for `dribbble.com` / `behance.net` / `linkedin.com` / `medium.com/topic` / trending-aggregator hostnames; exits non-zero on any match.
2683
+ - `scripts/tests/test-authority-watcher-diff.sh` - structural-only v1 of the watcher-diff test. Asserts fixture presence, baseline existence, D-21 classification-heading vocabulary, and exact count consistency between the header's "N entries surfaced" figure and the number of bulleted entries across classification sections. Full end-to-end byte diff against a live watcher run is deferred until the Claude Code agent runtime is available in CI.
2684
+ - `test-fixture/authority-feeds/` - four frozen mock feeds (WAI-ARIA APG Atom, Radix Primitives release Atom, NN/g articles RSS, Are.na channel JSON) with deterministic timestamps for byte-stable CI diff testing. Exercises all four non-practitioner source kinds against every branch of the D-17 classification decision table.
2685
+ - `test-fixture/baselines/phase-13.2/authority-report.expected.md` - frozen regression baseline for the watcher-diff test (9 entries across 4 feeds: spec-change=2, heuristic-update=1, pattern-guidance=4, craft-tip=2, skip=0).
2598
2686
 
2599
2687
  ### Changed
2600
2688
 
2601
- - `skills/reflect/SKILL.md` step 3 "Build required-reading list" appended `.design/authority-report.md`. Single-line addition; `agents/design-reflector.md` itself is byte-identical since phase start (D-25 reflector-non-modification invariant preserved).
2602
- - Root `SKILL.md` `watch-authorities` registered in argument-hint alternation, the maintenance Command Reference table, and the Jump Mode routing block alongside `/gdd:reflect` and `/gdd:apply-reflections`.
2603
- - `scripts/validate-schemas.cjs` wired `authority-snapshot` into the `PAIRS` array and invoked `ajv-cli` with `-c ajv-formats` so `format: "date-time"` declarations are enforced rather than rejected under ajv strict mode. No-op for existing schemas (none declared formats).
2604
- - `tests/agent-size-budget.test.cjs` added `M: 300` tier to `TIER_LIMITS` for Worker-tier agents (between `S: 150` and `LARGE: 350`); accommodates CONTEXT D-05's "body ≈ 200–300 lines" target with modest headroom.
2605
- - `test-fixture/baselines/phase-6/agent-list.txt` appended `design-authority-watcher.md` in sorted position.
2606
- - `test-fixture/baselines/phase-6/skill-list.txt` appended `watch-authorities` in sorted position.
2689
+ - `skills/reflect/SKILL.md` step 3 "Build required-reading list" - appended `.design/authority-report.md`. Single-line addition; `agents/design-reflector.md` itself is byte-identical since phase start (D-25 reflector-non-modification invariant preserved).
2690
+ - Root `SKILL.md` - `watch-authorities` registered in argument-hint alternation, the maintenance Command Reference table, and the Jump Mode routing block alongside `/gdd:reflect` and `/gdd:apply-reflections`.
2691
+ - `scripts/validate-schemas.cjs` - wired `authority-snapshot` into the `PAIRS` array and invoked `ajv-cli` with `-c ajv-formats` so `format: "date-time"` declarations are enforced rather than rejected under ajv strict mode. No-op for existing schemas (none declared formats).
2692
+ - `tests/agent-size-budget.test.cjs` - added `M: 300` tier to `TIER_LIMITS` for Worker-tier agents (between `S: 150` and `LARGE: 350`); accommodates CONTEXT D-05's "body ≈ 200–300 lines" target with modest headroom.
2693
+ - `test-fixture/baselines/phase-6/agent-list.txt` - appended `design-authority-watcher.md` in sorted position.
2694
+ - `test-fixture/baselines/phase-6/skill-list.txt` - appended `watch-authorities` in sorted position.
2607
2695
  - Plugin version: 1.0.7 → 1.13.2 (decimal sub-phase = PATCH bump per new versioning scheme: MAJOR=milestone, MINOR=phase, PATCH=sub-phase). Does not shift the Phase 14 → v1.14.0 cadence.
2608
2696
 
2609
2697
  ---
2610
2698
 
2611
- ## [1.13.1] 2026-04-19
2699
+ ## [1.13.1] - 2026-04-19
2612
2700
 
2613
- ### Changed Phase 13.1: Figma MCP Consolidation
2701
+ ### Changed - Phase 13.1: Figma MCP Consolidation
2614
2702
  - Collapsed the dual Figma MCP setup (local `figma-desktop` for reads + remote `figma` for writes) into the single remote `figma` MCP, which exposes full read parity (`get_metadata`, `get_design_context`, `get_variable_defs`, `get_screenshot`) alongside `use_figma` for writes.
2615
2703
  - Rewrote `connections/figma.md` to cover both reads and writes; deleted `connections/figma-writer.md` (folded into the unified spec).
2616
2704
  - Migrated every `mcp__figma-desktop__*` tool reference to `mcp__figma__*` across skills (`scan`, `discover`, `explore`, `design`), agents (`design-figma-writer`, `design-context-builder`, `design-discussant`, `token-mapper`), and `connections/connections.md` capability matrix + probe block.
2617
- - Collapsed STATE.md `<connections>` schema from `figma: … / figma_writer: …` to a single `figma:` key. The remote MCP is one server one probe, one status.
2705
+ - Collapsed STATE.md `<connections>` schema from `figma: … / figma_writer: …` to a single `figma:` key. The remote MCP is one server - one probe, one status.
2618
2706
  - Updated capability matrix in `connections/connections.md`: a single `Figma` row now declares write-back under the `design` column (FWR-01..04).
2619
2707
  - Regenerated `test-fixture/baselines/phase-6/connection-list.txt` to drop the deleted `figma-writer.md` entry.
2620
2708
 
@@ -2634,52 +2722,52 @@ Cherry-picked from `c11cd7b` on `claude/upbeat-fermi-199627` — the Figma MCP f
2634
2722
 
2635
2723
  ---
2636
2724
 
2637
- ## [1.0.7] 2026-04-18
2725
+ ## [1.0.7] - 2026-04-18
2638
2726
 
2639
- ### Added Phase 13: CI/CD
2727
+ ### Added - Phase 13: CI/CD
2640
2728
  - `.github/workflows/ci.yml` expanded from single-job test runner to five-job pipeline: `lint` → `validate` → `test` (matrix) → `security` + `size-budget`
2641
2729
  - Markdown lint via `markdownlint-cli2@0.13.0` (pinned); link checker via `lycheeverse/lychee-action@v2` (blocking)
2642
2730
  - JSON schemas at `reference/schemas/`: `plugin.schema.json`, `marketplace.schema.json`, `hooks.schema.json`, `config.schema.json`, `intel.schema.json`
2643
- - `scripts/validate-schemas.cjs` ajv-cli wrapper with structural-parse fallback for all schemas
2644
- - `scripts/validate-frontmatter.cjs` CLI-friendly agent-frontmatter validator reusing `tests/helpers.cjs`
2645
- - `scripts/detect-stale-refs.cjs` fails on any `/design:*` legacy namespace or deprecated agent/stage names; authoritative list in `reference/DEPRECATIONS.md`
2731
+ - `scripts/validate-schemas.cjs` - ajv-cli wrapper with structural-parse fallback for all schemas
2732
+ - `scripts/validate-frontmatter.cjs` - CLI-friendly agent-frontmatter validator reusing `tests/helpers.cjs`
2733
+ - `scripts/detect-stale-refs.cjs` - fails on any `/design:*` legacy namespace or deprecated agent/stage names; authoritative list in `reference/DEPRECATIONS.md`
2646
2734
  - `claude plugin validate .` in CI with schema-only fallback (per D-09)
2647
2735
  - `ludeeus/action-shellcheck@master` at severity=error on `scripts/`
2648
2736
  - Hardcoded-absolute-path grep across `scripts/`, `reference/`, `agents/`, `skills/` (flags `/Users/`, `/home/<user>/`, `C:\`)
2649
2737
  - `gitleaks/gitleaks-action@v2` secrets scan with `.gitleaks.toml` allowlist
2650
- - `scripts/run-injection-scanner-ci.cjs` CI-mode scanner over Phase 7 injection patterns against all shipped `reference/`, `skills/**/SKILL.md`, `agents/*.md`
2738
+ - `scripts/run-injection-scanner-ci.cjs` - CI-mode scanner over Phase 7 injection patterns against all shipped `reference/`, `skills/**/SKILL.md`, `agents/*.md`
2651
2739
  - `tests/agent-size-budget.test.cjs` wired as its own blocking `size-budget` CI job with actionable override guidance
2652
- - `.github/pull_request_template.md` phase / version-bump / CHANGELOG / baseline / tests checklist
2653
- - `.github/CODEOWNERS` solo-maintainer default (`* @hegemonart`)
2654
- - `reference/BRANCH-PROTECTION.md` + `scripts/apply-branch-protection.sh` two-phase rollout (advisory → enforcing)
2655
- - `.github/workflows/release.yml` auto-tag + GitHub Release on `.claude-plugin/plugin.json` version change; softprops/action-gh-release@v2
2656
- - `scripts/extract-changelog-section.cjs` parses CHANGELOG for release body
2657
- - `scripts/rollback-release.sh` documented manual rollback (not CI-automated, per D-22)
2658
- - `scripts/release-smoke-test.cjs` fresh-checkout deterministic smoke test against `test-fixture/src/`, diffs against `test-fixture/baselines/phase-13/`
2659
- - `CONTRIBUTING.md` branch strategy, PR checklist, required checks list, version-bump workflow, baseline relock how-to
2740
+ - `.github/pull_request_template.md` - phase / version-bump / CHANGELOG / baseline / tests checklist
2741
+ - `.github/CODEOWNERS` - solo-maintainer default (`* @hegemonart`)
2742
+ - `reference/BRANCH-PROTECTION.md` + `scripts/apply-branch-protection.sh` - two-phase rollout (advisory → enforcing)
2743
+ - `.github/workflows/release.yml` - auto-tag + GitHub Release on `.claude-plugin/plugin.json` version change; softprops/action-gh-release@v2
2744
+ - `scripts/extract-changelog-section.cjs` - parses CHANGELOG for release body
2745
+ - `scripts/rollback-release.sh` - documented manual rollback (not CI-automated, per D-22)
2746
+ - `scripts/release-smoke-test.cjs` - fresh-checkout deterministic smoke test against `test-fixture/src/`, diffs against `test-fixture/baselines/phase-13/`
2747
+ - `CONTRIBUTING.md` - branch strategy, PR checklist, required checks list, version-bump workflow, baseline relock how-to
2660
2748
  - README badges: CI build status, Node versions (22, 24), plugin version, license (MIT)
2661
- - `test-fixture/baselines/phase-13/` regression baseline locked at v1.0.7
2749
+ - `test-fixture/baselines/phase-13/` - regression baseline locked at v1.0.7
2662
2750
 
2663
2751
  ### Changed
2664
- - Plugin version: 1.0.5 → 1.0.7 (skipping 1.0.6 Phase 12 did not ship a manifest bump in this worktree)
2752
+ - Plugin version: 1.0.5 → 1.0.7 (skipping 1.0.6 - Phase 12 did not ship a manifest bump in this worktree)
2665
2753
  - `package.json` gains CI-focused scripts: `lint:md`, `lint:links`, `validate:schemas`, `validate:frontmatter`, `detect:stale-refs`, `scan:injection`, `test:size-budget`, `release:extract-changelog`
2666
2754
  - `ci.yml` matrix preserved exactly: Node 22/24 × ubuntu/macos/windows
2667
2755
 
2668
2756
  ---
2669
2757
 
2670
- ## [1.0.6] 2026-04-18
2758
+ ## [1.0.6] - 2026-04-18
2671
2759
 
2672
- ### Added Phase 12: Test Coverage
2673
- - Test runner wired (`node --test "tests/**/*.cjs"` via `npm test`) zero third-party test dependencies
2674
- - `tests/helpers.cjs` shared fixtures: `scaffoldDesignDir`, `readFrontmatter`, `countLines`, `mockMCP`
2760
+ ### Added - Phase 12: Test Coverage
2761
+ - Test runner wired (`node --test "tests/**/*.cjs"` via `npm test`) - zero third-party test dependencies
2762
+ - `tests/helpers.cjs` - shared fixtures: `scaffoldDesignDir`, `readFrontmatter`, `countLines`, `mockMCP`
2675
2763
  - GitHub Actions CI matrix: Node 22/24 × Linux/macOS/Windows, fail-fast disabled
2676
2764
  - Regression baseline harness: `test-fixture/baselines/phase-<N>/` snapshots of agent/skill/connection manifests and agent frontmatter snapshots; drift detector per phase
2677
- - **Agent hygiene tests** `tests/agent-frontmatter.test.cjs`, `tests/agent-size-budget.test.cjs`, `tests/agent-required-reading-consistency.test.cjs`, `tests/stale-colon-refs.test.cjs`
2678
- - **System contract tests** `tests/config.test.cjs`, `tests/commands.test.cjs`, `tests/command-count-sync.test.cjs`, `tests/hook-validation.test.cjs`, `tests/atomic-write.test.cjs`, `tests/frontmatter.test.cjs`, `tests/model-profiles.test.cjs`, `tests/verify-health.test.cjs`, `tests/worktree-safety.test.cjs`, `tests/semver-compare.test.cjs`, `tests/schema-drift.test.cjs`
2679
- - **Pipeline + data tests** `tests/pipeline-smoke.test.cjs`, `tests/mapper-schema.test.cjs`, `tests/parallelism-engine.test.cjs`, `tests/touches-analysis.test.cjs`, `tests/cycle-lifecycle.test.cjs`, `tests/intel-consistency.test.cjs`, `tests/regression-baseline-drift.test.cjs`
2680
- - **Feature correctness tests** `tests/sketch-determinism.test.cjs`, `tests/connection-probe.test.cjs`, `tests/figma-writer-dry-run.test.cjs`, `tests/reflection-proposal.test.cjs`, `tests/deprecation-redirect.test.cjs`, `tests/nng-coverage.test.cjs`, `tests/read-injection-scanner.test.cjs`, `tests/optimization-layer.test.cjs`
2681
- - `reference/DEPRECATIONS.md` registry of renamed/split/removed concepts (seeded by deprecation-redirect test)
2682
- - `test-fixture/mapper-outputs/*.json` locked schema-shape fixtures for the 5 domain mappers
2765
+ - **Agent hygiene tests** - `tests/agent-frontmatter.test.cjs`, `tests/agent-size-budget.test.cjs`, `tests/agent-required-reading-consistency.test.cjs`, `tests/stale-colon-refs.test.cjs`
2766
+ - **System contract tests** - `tests/config.test.cjs`, `tests/commands.test.cjs`, `tests/command-count-sync.test.cjs`, `tests/hook-validation.test.cjs`, `tests/atomic-write.test.cjs`, `tests/frontmatter.test.cjs`, `tests/model-profiles.test.cjs`, `tests/verify-health.test.cjs`, `tests/worktree-safety.test.cjs`, `tests/semver-compare.test.cjs`, `tests/schema-drift.test.cjs`
2767
+ - **Pipeline + data tests** - `tests/pipeline-smoke.test.cjs`, `tests/mapper-schema.test.cjs`, `tests/parallelism-engine.test.cjs`, `tests/touches-analysis.test.cjs`, `tests/cycle-lifecycle.test.cjs`, `tests/intel-consistency.test.cjs`, `tests/regression-baseline-drift.test.cjs`
2768
+ - **Feature correctness tests** - `tests/sketch-determinism.test.cjs`, `tests/connection-probe.test.cjs`, `tests/figma-writer-dry-run.test.cjs`, `tests/reflection-proposal.test.cjs`, `tests/deprecation-redirect.test.cjs`, `tests/nng-coverage.test.cjs`, `tests/read-injection-scanner.test.cjs`, `tests/optimization-layer.test.cjs`
2769
+ - `reference/DEPRECATIONS.md` - registry of renamed/split/removed concepts (seeded by deprecation-redirect test)
2770
+ - `test-fixture/mapper-outputs/*.json` - locked schema-shape fixtures for the 5 domain mappers
2683
2771
  - Added `XXL` tier (700 lines) to `agent-size-budget.test.cjs` for legitimately long agents (`design-verifier`, `design-context-builder`)
2684
2772
 
2685
2773
  ### Changed
@@ -2692,18 +2780,18 @@ Cherry-picked from `c11cd7b` on `claude/upbeat-fermi-199627` — the Figma MCP f
2692
2780
  ### Policy change
2693
2781
  - **From v1.0.6 forward, every PR MUST pass `npm test` before merging to `main`.** See `CONTRIBUTING.md` for the testing contract.
2694
2782
 
2695
- ## [1.0.5] 2026-04-18
2696
-
2697
- ### Added Phase 11: Self-Improvement
2698
- - `design-reflector` agent post-cycle reflection from learnings + telemetry + agent-metrics
2699
- - `/gdd:reflect` command on-demand reflection with `--dry-run` and `--cycle` flags
2700
- - `/gdd:apply-reflections` command user-review + selective apply for all proposal types
2701
- - Frontmatter feedback loop reflector proposes `typical-duration-seconds`, `default-tier`, `parallel-safe`, `reads-only` updates from measured data
2702
- - Budget-config feedback loop reflector proposes `.design/budget.json` cap adjustments from telemetry
2703
- - Reference-update proposer N≥3 pattern detection across learnings files → `reference/` additions
2704
- - Discussant question-quality logging answer quality recorded to `.design/learnings/question-quality.jsonl`
2705
- - Discussant question-quality analysis low-value questions flagged and pruning proposed after ≥3 cycles
2706
- - Global skills layer `~/.claude/gdd/global-skills/` for cross-project conventions
2783
+ ## [1.0.5] - 2026-04-18
2784
+
2785
+ ### Added - Phase 11: Self-Improvement
2786
+ - `design-reflector` agent - post-cycle reflection from learnings + telemetry + agent-metrics
2787
+ - `/gdd:reflect` command - on-demand reflection with `--dry-run` and `--cycle` flags
2788
+ - `/gdd:apply-reflections` command - user-review + selective apply for all proposal types
2789
+ - Frontmatter feedback loop - reflector proposes `typical-duration-seconds`, `default-tier`, `parallel-safe`, `reads-only` updates from measured data
2790
+ - Budget-config feedback loop - reflector proposes `.design/budget.json` cap adjustments from telemetry
2791
+ - Reference-update proposer - N≥3 pattern detection across learnings files → `reference/` additions
2792
+ - Discussant question-quality logging - answer quality recorded to `.design/learnings/question-quality.jsonl`
2793
+ - Discussant question-quality analysis - low-value questions flagged and pruning proposed after ≥3 cycles
2794
+ - Global skills layer - `~/.claude/gdd/global-skills/` for cross-project conventions
2707
2795
  - Global skills auto-loading in explore, plan, design stages
2708
2796
  - Phase 11 regression baseline locked in `test-fixture/baselines/phase-11/`
2709
2797
 
@@ -2712,36 +2800,36 @@ Cherry-picked from `c11cd7b` on `claude/upbeat-fermi-199627` — the Figma MCP f
2712
2800
  - `agents/design-discussant.md` logs answer quality after each Q&A exchange
2713
2801
  - Plugin version: 1.0.4.1 → 1.0.5
2714
2802
 
2715
- ## [1.10.1] 2026-04-18
2803
+ ## [1.10.1] - 2026-04-18
2716
2804
 
2717
2805
  **Phase 10.1: Optimization Layer + Cost Governance.** Decimal sub-phase = PATCH bump per versioning scheme (MAJOR=milestone, MINOR=phase, PATCH=sub-phase). v1.10.1 follows v1.10.0 (Phase 10) and precedes v1.11.0 (Phase 11).
2718
2806
 
2719
2807
  ### Added
2720
- - `gdd-router` skill intent → `{path: fast|quick|full, model_tier_overrides, estimated_cost_usd, cache_hits}`. First step of every `/gdd:*` command.
2721
- - `gdd-cache-manager` skill + `/gdd:warm-cache` command maintains `.design/cache-manifest.json`, pre-warms common agent prompts for Anthropic's 5-min prompt cache.
2722
- - `skills/synthesize/` streaming-synthesizer skill Haiku-collapses N parallel-agent outputs for map / discover / plan orchestrators.
2723
- - `/gdd:optimize` advisory command reads telemetry + metrics, emits `.design/OPTIMIZE-RECOMMENDATIONS.md`. No auto-apply.
2724
- - `hooks/budget-enforcer.js` PreToolUse hook on `Agent` spawns. Hard-blocks on cap breach, auto-downgrades at 80% soft-threshold, short-circuits on cache hit. Writes telemetry on every decision.
2725
- - `.design/budget.json` config `per_task_cap_usd`, `per_phase_cap_usd`, `tier_overrides`, `auto_downgrade_on_cap`, `cache_ttl_seconds`, `enforcement_mode`.
2726
- - `.design/cache-manifest.json` SHA-256-keyed answer store with TTL.
2727
- - `.design/telemetry/costs.jsonl` append-only ledger per spawn decision: `{ts, agent, tier, tokens_in, tokens_out, cache_hit, est_cost_usd, cycle, phase}`.
2728
- - `.design/agent-metrics.json` incremental per-agent aggregator (total_spawns, total_cost_usd, cache_hit_rate, etc). Consumed by Phase 11 reflector.
2729
- - `reference/model-prices.md` static Anthropic pricing table + `size_budget` → token-range mapping.
2730
- - `reference/model-tiers.md` tier-selection guide, per-agent tier map, override precedence rules.
2731
- - `reference/shared-preamble.md` extracted common agent framework preamble. Every agent imports it first.
2808
+ - `gdd-router` skill - intent → `{path: fast|quick|full, model_tier_overrides, estimated_cost_usd, cache_hits}`. First step of every `/gdd:*` command.
2809
+ - `gdd-cache-manager` skill + `/gdd:warm-cache` command - maintains `.design/cache-manifest.json`, pre-warms common agent prompts for Anthropic's 5-min prompt cache.
2810
+ - `skills/synthesize/` streaming-synthesizer skill - Haiku-collapses N parallel-agent outputs for map / discover / plan orchestrators.
2811
+ - `/gdd:optimize` advisory command - reads telemetry + metrics, emits `.design/OPTIMIZE-RECOMMENDATIONS.md`. No auto-apply.
2812
+ - `hooks/budget-enforcer.js` - PreToolUse hook on `Agent` spawns. Hard-blocks on cap breach, auto-downgrades at 80% soft-threshold, short-circuits on cache hit. Writes telemetry on every decision.
2813
+ - `.design/budget.json` config - `per_task_cap_usd`, `per_phase_cap_usd`, `tier_overrides`, `auto_downgrade_on_cap`, `cache_ttl_seconds`, `enforcement_mode`.
2814
+ - `.design/cache-manifest.json` - SHA-256-keyed answer store with TTL.
2815
+ - `.design/telemetry/costs.jsonl` - append-only ledger per spawn decision: `{ts, agent, tier, tokens_in, tokens_out, cache_hit, est_cost_usd, cycle, phase}`.
2816
+ - `.design/agent-metrics.json` - incremental per-agent aggregator (total_spawns, total_cost_usd, cache_hit_rate, etc). Consumed by Phase 11 reflector.
2817
+ - `reference/model-prices.md` - static Anthropic pricing table + `size_budget` → token-range mapping.
2818
+ - `reference/model-tiers.md` - tier-selection guide, per-agent tier map, override precedence rules.
2819
+ - `reference/shared-preamble.md` - extracted common agent framework preamble. Every agent imports it first.
2732
2820
  - Three lazy gate agents: `design-verifier-gate`, `design-integration-checker-gate`, `design-context-checker-gate`. Cheap Haiku heuristic decides whether to spawn the full expensive checker.
2733
- - `scripts/aggregate-agent-metrics.js` incremental telemetry aggregator invoked by the hook.
2734
- - Regression baseline at `test-fixture/baselines/phase-10.1/` methodology README + `pre-baseline-cost-report.md` + `cost-report.md`.
2821
+ - `scripts/aggregate-agent-metrics.js` - incremental telemetry aggregator invoked by the hook.
2822
+ - Regression baseline at `test-fixture/baselines/phase-10.1/` - methodology README + `pre-baseline-cost-report.md` + `cost-report.md`.
2735
2823
 
2736
2824
  ### Changed
2737
2825
  - All 26 agents in `agents/` now carry `default-tier: haiku|sonnet|opus` + `tier-rationale` frontmatter.
2738
2826
  - All 26 agents now open with `@reference/shared-preamble.md` import (cache-aligned ordering per agents/README.md convention).
2739
2827
  - `scripts/bootstrap.sh` writes `.design/budget.json` defaults on first run if missing.
2740
2828
  - `hooks/hooks.json` adds `PreToolUse` matcher `Agent` → `hooks/budget-enforcer.js`.
2741
- - `skills/map/`, `skills/discover/`, `skills/plan/` parallel-agent outputs now funnel through `skills/synthesize/` before main-context merge.
2742
- - `skills/verify/` spawns `design-*-gate` agents before their full checker counterparts; skips the full spawn when the gate returns `spawn: false`.
2743
- - `agents/README.md` documents the `default-tier` + `tier-rationale` frontmatter fields and the cache-aligned agent-prompt ordering convention.
2744
- - `reference/config-schema.md` new sections for `.design/budget.json`, `.design/cache-manifest.json`, `.design/telemetry/costs.jsonl`, `.design/agent-metrics.json`.
2829
+ - `skills/map/`, `skills/discover/`, `skills/plan/` - parallel-agent outputs now funnel through `skills/synthesize/` before main-context merge.
2830
+ - `skills/verify/` - spawns `design-*-gate` agents before their full checker counterparts; skips the full spawn when the gate returns `spawn: false`.
2831
+ - `agents/README.md` - documents the `default-tier` + `tier-rationale` frontmatter fields and the cache-aligned agent-prompt ordering convention.
2832
+ - `reference/config-schema.md` - new sections for `.design/budget.json`, `.design/cache-manifest.json`, `.design/telemetry/costs.jsonl`, `.design/agent-metrics.json`.
2745
2833
 
2746
2834
  ### Performance
2747
2835
  - Target: 50–70% per-task token-cost reduction vs the pre-10.1 baseline on `test-fixture/`.
@@ -2754,21 +2842,21 @@ Cherry-picked from `c11cd7b` on `claude/upbeat-fermi-199627` — the Figma MCP f
2754
2842
 
2755
2843
  ---
2756
2844
 
2757
- ## [1.0.4] 2026-04-18
2845
+ ## [1.0.4] - 2026-04-18
2758
2846
 
2759
- ### Added Phase 10: Knowledge Layer
2847
+ ### Added - Phase 10: Knowledge Layer
2760
2848
 
2761
2849
  - **Intel store** (`.design/intel/`): queryable JSON slices indexing all files, exports, symbols, tokens, components, patterns, dependencies, decisions, debt, and a cross-reference graph
2762
- - `scripts/build-intel.cjs` full initial index builder with mtime + git-hash incremental updates
2763
- - `agents/gdd-intel-updater` incremental intel store updater agent
2764
- - `/gdd:analyze-dependencies` token fan-out, component call-graph, decision traceability, circular dependency detection (all O(1) from intel store)
2765
- - `/gdd:skill-manifest` browse all skills and agents from intel store; fallback to directory scan
2766
- - `/gdd:extract-learnings` extract project-specific patterns from `.design/` artifacts; propose reference/ additions with user review flow
2767
- - `agents/gdd-learnings-extractor` structured learning entry extractor; writes `.design/learnings/LEARNINGS.md`
2768
- - `agents/gdd-graphify-sync` feeds Graphify knowledge graph from intel store `graph.json`
2769
- - `hooks/context-exhaustion.js` PostToolUse hook: auto-records `<paused>` STATE.md block at 85% context
2770
- - `reference/intel-schema.md` authoritative schema reference for all ten intel slices
2771
- - `design-phase-researcher` now produces `## Architectural Responsibility Map` and `## Flow Diagram` (Mermaid) in every DESIGN-CONTEXT.md
2850
+ - `scripts/build-intel.cjs` - full initial index builder with mtime + git-hash incremental updates
2851
+ - `agents/gdd-intel-updater` - incremental intel store updater agent
2852
+ - `/gdd:analyze-dependencies` - token fan-out, component call-graph, decision traceability, circular dependency detection (all O(1) from intel store)
2853
+ - `/gdd:skill-manifest` - browse all skills and agents from intel store; fallback to directory scan
2854
+ - `/gdd:extract-learnings` - extract project-specific patterns from `.design/` artifacts; propose reference/ additions with user review flow
2855
+ - `agents/gdd-learnings-extractor` - structured learning entry extractor; writes `.design/learnings/LEARNINGS.md`
2856
+ - `agents/gdd-graphify-sync` - feeds Graphify knowledge graph from intel store `graph.json`
2857
+ - `hooks/context-exhaustion.js` - PostToolUse hook: auto-records `<paused>` STATE.md block at 85% context
2858
+ - `reference/intel-schema.md` - authoritative schema reference for all ten intel slices
2859
+ - `design-phase-researcher` - now produces `## Architectural Responsibility Map` and `## Flow Diagram` (Mermaid) in every DESIGN-CONTEXT.md
2772
2860
  - Five core agents (design-context-builder, design-executor, design-verifier, design-phase-researcher, design-planner) now include conditional `@.design/intel/` required-reading blocks
2773
2861
 
2774
2862
  ### Changed
@@ -2778,19 +2866,19 @@ Cherry-picked from `c11cd7b` on `claude/upbeat-fermi-199627` — the Figma MCP f
2778
2866
 
2779
2867
  ---
2780
2868
 
2781
- ## [1.0.3] 2026-04-18
2869
+ ## [1.0.3] - 2026-04-18
2782
2870
 
2783
- ### Added Phase 9: Claude Design Integration + Pinterest Connection
2871
+ ### Added - Phase 9: Claude Design Integration + Pinterest Connection
2784
2872
  - Claude Design handoff bundle adapter: HTML export → D-XX decisions in STATE.md (`connections/claude-design.md`)
2785
- - `/gdd:handoff <path>` standalone command skips Scan→Discover→Plan, routes direct to verify with Handoff Faithfulness scoring
2873
+ - `/gdd:handoff <path>` standalone command - skips Scan→Discover→Plan, routes direct to verify with Handoff Faithfulness scoring
2786
2874
  - Handoff Faithfulness Phase in design-verifier: color, typography, spacing, component structure scoring with PASS/WARN/FAIL thresholds
2787
- - `--post-handoff` flag for `verify` stage relaxes DESIGN-PLAN.md prerequisite, activates HF section
2788
- - `--from-handoff` mode for design-discussant confirms tentative D-XX decisions, fills gaps only
2789
- - Handoff mode for design-research-synthesizer parses bundle HTML, writes `<handoff_context>` to DESIGN-CONTEXT.md
2875
+ - `--post-handoff` flag for `verify` stage - relaxes DESIGN-PLAN.md prerequisite, activates HF section
2876
+ - `--from-handoff` mode for design-discussant - confirms tentative D-XX decisions, fills gaps only
2877
+ - Handoff mode for design-research-synthesizer - parses bundle HTML, writes `<handoff_context>` to DESIGN-CONTEXT.md
2790
2878
  - Pinterest MCP connection spec (`connections/pinterest.md`): ToolSearch-only probe, `mcp__mcp-pinterest__pinterest_search`, fallback chain Pinterest → Refero → awesome-design-md
2791
2879
  - Pinterest as visual reference source in design-research-synthesizer (up to 2–3 queries per synthesis)
2792
2880
  - Pinterest probe (block C) in `discover` stage
2793
- - `implementation-status` mode for design-figma-writer annotates Figma frames with build status + registers Code Connect mappings from Handoff Faithfulness results
2881
+ - `implementation-status` mode for design-figma-writer - annotates Figma frames with build status + registers Code Connect mappings from Handoff Faithfulness results
2794
2882
  - `pinterest:` and `claude_design:` fields in STATE-TEMPLATE.md `<connections>` block
2795
2883
  - `handoff_source`, `handoff_path`, `skipped_stages` fields in STATE-TEMPLATE.md `<position>` block
2796
2884
 
@@ -2801,40 +2889,40 @@ Cherry-picked from `c11cd7b` on `claude/upbeat-fermi-199627` — the Figma MCP f
2801
2889
 
2802
2890
  ---
2803
2891
 
2804
- ## [1.0.2] Phase 8: Visual + Design-Side Connections + Knowledge Graph
2892
+ ## [1.0.2] - Phase 8: Visual + Design-Side Connections + Knowledge Graph
2805
2893
 
2806
2894
  ### Added
2807
2895
 
2808
- - **Preview (Playwright) connection** `connections/preview.md`; live page screenshots for `? VISUAL` verification gaps via `mcp__Claude_Preview__*` tools
2809
- - **Storybook connection** `connections/storybook.md`; HTTP probe for component inventory, a11y per story, `.stories.tsx` stub generation during design stage
2810
- - **Chromatic connection** `connections/chromatic.md`; CLI-based visual regression delta narration and change-risk scoping using `--trace-changed=expanded`
2811
- - **Figma Writer agent** `agents/design-figma-writer.md`; write design decisions back to Figma (annotate, tokenize, Code Connect mappings) via remote MCP `use_figma`; proposal→confirm UX with `--dry-run` and `--confirm-shared` guards
2812
- - **Graphify knowledge graph connection** `connections/graphify.md`; queryable component↔token↔decision graph via `gsd-tools graphify`
2813
- - **`/gdd:figma-write` command** `skills/figma-write/SKILL.md`; standalone Figma write command
2814
- - **`/gdd:graphify` command** `skills/graphify/SKILL.md`; build/query/status/diff subcommands
2815
- - **Connections capability matrix expanded** `connections/connections.md` updated to 7 active connections
2816
- - **Agent pre-search consultation** `design-integration-checker` and `design-planner` consult the knowledge graph before grep searches when Graphify is available
2896
+ - **Preview (Playwright) connection** - `connections/preview.md`; live page screenshots for `? VISUAL` verification gaps via `mcp__Claude_Preview__*` tools
2897
+ - **Storybook connection** - `connections/storybook.md`; HTTP probe for component inventory, a11y per story, `.stories.tsx` stub generation during design stage
2898
+ - **Chromatic connection** - `connections/chromatic.md`; CLI-based visual regression delta narration and change-risk scoping using `--trace-changed=expanded`
2899
+ - **Figma Writer agent** - `agents/design-figma-writer.md`; write design decisions back to Figma (annotate, tokenize, Code Connect mappings) via remote MCP `use_figma`; proposal→confirm UX with `--dry-run` and `--confirm-shared` guards
2900
+ - **Graphify knowledge graph connection** - `connections/graphify.md`; queryable component↔token↔decision graph via `gsd-tools graphify`
2901
+ - **`/gdd:figma-write` command** - `skills/figma-write/SKILL.md`; standalone Figma write command
2902
+ - **`/gdd:graphify` command** - `skills/graphify/SKILL.md`; build/query/status/diff subcommands
2903
+ - **Connections capability matrix expanded** - `connections/connections.md` updated to 7 active connections
2904
+ - **Agent pre-search consultation** - `design-integration-checker` and `design-planner` consult the knowledge graph before grep searches when Graphify is available
2817
2905
 
2818
2906
  ### Changed
2819
2907
 
2820
- - `connections/connections.md` Active Connections table expanded from 2 to 7; Capability Matrix updated; placeholder rows removed
2821
- - `agents/design-verifier.md` Phase 4B visual evidence block added; Chromatic delta narration block added
2822
- - `agents/design-planner.md` Chromatic change-risk scoping block added; Graphify component-count annotation block added
2823
- - `agents/design-context-builder.md` Storybook component inventory block added
2824
- - `SKILL.md` argument-hint and Command Reference updated with `figma-write` and `graphify`
2825
- - Root `SKILL.md` `figma-write` and `graphify` entries added
2908
+ - `connections/connections.md` - Active Connections table expanded from 2 to 7; Capability Matrix updated; placeholder rows removed
2909
+ - `agents/design-verifier.md` - Phase 4B visual evidence block added; Chromatic delta narration block added
2910
+ - `agents/design-planner.md` - Chromatic change-risk scoping block added; Graphify component-count annotation block added
2911
+ - `agents/design-context-builder.md` - Storybook component inventory block added
2912
+ - `SKILL.md` - argument-hint and Command Reference updated with `figma-write` and `graphify`
2913
+ - Root `SKILL.md` - `figma-write` and `graphify` entries added
2826
2914
 
2827
2915
  ---
2828
2916
 
2829
- ## [1.0.1] 2026-04-18
2917
+ ## [1.0.1] - 2026-04-18
2830
2918
 
2831
- ### Added Phase 7: GSD Parity + Exploration
2919
+ ### Added - Phase 7: GSD Parity + Exploration
2832
2920
  - Reshaped pipeline to 5-stage canonical shape (brief → explore → plan → design → verify)
2833
2921
  - `/gdd:` namespace for all commands
2834
2922
  - design-discussant agent + `/gdd:discuss` + `/gdd:list-assumptions`
2835
2923
  - 5 specialist mapper agents (token, component-taxonomy, visual-hierarchy, a11y, motion)
2836
2924
  - Wave-native parallelism decision engine
2837
- - Sketch (multi-variant HTML) and Spike (feasibility) explorations `/gdd:sketch`, `/gdd:sketch-wrap-up`, `/gdd:spike`, `/gdd:spike-wrap-up`
2925
+ - Sketch (multi-variant HTML) and Spike (feasibility) explorations - `/gdd:sketch`, `/gdd:sketch-wrap-up`, `/gdd:spike`, `/gdd:spike-wrap-up`
2838
2926
  - Project-local skills layer (`./.claude/skills/design-*-conventions.md`) auto-loaded by explore/plan/design
2839
2927
  - Lifecycle commands: `new-project`, `new-cycle`, `complete-cycle`
2840
2928
  - Ergonomics: `progress`, `health`, `todo`, `stats`, `next`, `help`
@@ -2847,5 +2935,5 @@ Cherry-picked from `c11cd7b` on `claude/upbeat-fermi-199627` — the Figma MCP f
2847
2935
  ### Changed
2848
2936
  - Plugin version: 1.0.0 → 1.0.1
2849
2937
 
2850
- ## [1.0.0] 2026-04-17
2938
+ ## [1.0.0] - 2026-04-17
2851
2939
  - Initial release as `get-design-done`.