@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
@@ -1,9 +1,9 @@
1
- # Windsurf Price Table (stub)
1
+ # Windsurf - Price Table (stub)
2
2
 
3
3
  **Runtime:** `windsurf` (Windsurf / Codeium)
4
- **Phase 26 D-08 sub-table STUB.** Placeholder so the price-table router (`reference/model-prices.md`) has a complete link list for all 14 runtimes. Runtime adapter authors fill this in with provenance citations in a later cycle.
4
+ **Phase 26 D-08 sub-table - STUB.** Placeholder so the price-table router (`reference/model-prices.md`) has a complete link list for all 14 runtimes. Runtime adapter authors fill this in with provenance citations in a later cycle.
5
5
 
6
- **Provenance:** `<TODO: confirm at https://docs.windsurf.com/windsurf/plans>` pending.
6
+ **Provenance:** `<TODO: confirm at https://docs.windsurf.com/windsurf/plans>` - pending.
7
7
 
8
8
  ## Pricing (USD per 1M tokens)
9
9
 
@@ -1,6 +1,6 @@
1
- # OpenRouter Catalog-Derived Price Snapshot
1
+ # OpenRouter - Catalog-Derived Price Snapshot
2
2
 
3
- **Phase 33.6 (v1.33.6).** This file is a **catalog-derived snapshot** of OpenRouter per-model prices it is **generated from** `.design/cache/openrouter-models.json` (the dynamic catalog fetched by `scripts/lib/openrouter/catalog-fetcher.cjs`), **not** a hand-maintained authority. The **live source of truth is the dynamic catalog**; this table is a derived, illustrative view that can go stale between catalog fetches.
3
+ **Phase 33.6 (v1.33.6).** This file is a **catalog-derived snapshot** of OpenRouter per-model prices - it is **generated from** `.design/cache/openrouter-models.json` (the dynamic catalog fetched by `scripts/lib/openrouter/catalog-fetcher.cjs`), **not** a hand-maintained authority. The **live source of truth is the dynamic catalog**; this table is a derived, illustrative view that can go stale between catalog fetches.
4
4
 
5
5
  Unlike the per-runtime tables under `reference/prices/` (Phase 26 D-08, hand-curated authority with provenance), OpenRouter's prices live in the upstream `/models` response and are refreshed on the 24h TTL. To inspect the current resolved prices, run `/gdd:openrouter-status` or read the cache directly. For the tier→model resolution heuristic see `reference/openrouter-tier-mapping.md`.
6
6
 
@@ -20,7 +20,7 @@ Derived from the fixture catalog at `test/fixtures/baselines/phase-33-6/openrout
20
20
 
21
21
  ## Notes
22
22
 
23
- - **Derived view, not authority.** Do not hand-edit prices here to "fix" cost math fix the catalog fetch instead. This file documents the *shape* and *source* of OpenRouter pricing for the registry round-trip and for human reference.
23
+ - **Derived view, not authority.** Do not hand-edit prices here to "fix" cost math - fix the catalog fetch instead. This file documents the *shape* and *source* of OpenRouter pricing for the registry round-trip and for human reference.
24
24
  - **Per-token vs per-1M.** The native runtime tables (`reference/prices/<runtime>.md`) quote `input_per_1m` / `output_per_1m`; OpenRouter's catalog quotes per-token. Multiply by 1,000,000 to compare (e.g. `anthropic/claude-opus-4-7` ≈ $15 input / $75 output per 1M tokens).
25
- - **Cost telemetry.** When a model is resolved via the OpenRouter adapter, the cost row tags `provider: openrouter` (Phase 33.6-03, SC#6) see `scripts/lib/budget-enforcer.cjs#buildCostEventPayload`.
26
- - **Drift.** The authority-watcher diffs the catalog weekly and surfaces `deprecated`/`withdrawn` models matching a configured `openrouter_tier_overrides` pin (SC#8) see `scripts/lib/authority-watcher/index.cjs#diffOpenRouterCatalog`.
25
+ - **Cost telemetry.** When a model is resolved via the OpenRouter adapter, the cost row tags `provider: openrouter` (Phase 33.6-03, SC#6) - see `scripts/lib/budget-enforcer.cjs#buildCostEventPayload`.
26
+ - **Drift.** The authority-watcher diffs the catalog weekly and surfaces `deprecated`/`withdrawn` models matching a configured `openrouter_tier_overrides` pin (SC#8) - see `scripts/lib/authority-watcher/index.cjs#diffOpenRouterCatalog`.
@@ -1,7 +1,7 @@
1
- # Print Design Constraint Catalogue
1
+ # Print Design - Constraint Catalogue
2
2
 
3
3
  This reference is the **print/PDF constraint catalogue**: the hard print-production rules a
4
- print-ready document MUST honor. Print is a *constrained* output surface the screen-RGB
4
+ print-ready document MUST honor. Print is a *constrained* output surface - the screen-RGB
5
5
  HTML/CSS the web executor emits has no `@page` box model, no bleed/crop marks, no CMYK
6
6
  color space, no font embedding, and no 300dpi raster guidance, so it cannot be sent to a
7
7
  press as-is. This file is the **authority** that the `pdf-executor` (Phase 34.3-02) generates
@@ -15,10 +15,10 @@ and must not be confused:
15
15
 
16
16
  | File | Job |
17
17
  | --- | --- |
18
- | `reference/platforms.md` (Phase 19) | Interaction **conventions** navigation, safe areas, gestures, native typography, haptics. *Behavioral* knowledge for native/web screens. |
19
- | `reference/native-platforms.md` (Phase 34.1) | The native **token bridge** maps canonical CSS tokens to SwiftUI / Jetpack Compose / Flutter with a precision contract. *Token-identity* knowledge for native generators. |
20
- | `reference/email-design.md` (Phase 34.2) | The email **constraint catalogue** table layout, inline styles, MSO comments, dark-mode `color-scheme`. *Structural* knowledge an email template implements. |
21
- | `reference/print-design.md` (Phase 34.3, this file) | The print **constraint catalogue** the `@page` box model, bleed + crop marks, CMYK awareness, font embedding, and 300dpi raster fallback. *Production* knowledge a print/PDF document implements. |
18
+ | `reference/platforms.md` (Phase 19) | Interaction **conventions** - navigation, safe areas, gestures, native typography, haptics. *Behavioral* knowledge for native/web screens. |
19
+ | `reference/native-platforms.md` (Phase 34.1) | The native **token bridge** - maps canonical CSS tokens to SwiftUI / Jetpack Compose / Flutter with a precision contract. *Token-identity* knowledge for native generators. |
20
+ | `reference/email-design.md` (Phase 34.2) | The email **constraint catalogue** - table layout, inline styles, MSO comments, dark-mode `color-scheme`. *Structural* knowledge an email template implements. |
21
+ | `reference/print-design.md` (Phase 34.3, this file) | The print **constraint catalogue** - the `@page` box model, bleed + crop marks, CMYK awareness, font embedding, and 300dpi raster fallback. *Production* knowledge a print/PDF document implements. |
22
22
 
23
23
  Per **D-02** there is **no bundled `pdfkit` / `paged` / `puppeteer` / `playwright`
24
24
  dependency**: the `pdf-executor` generates **Paged.js-compatible print HTML/CSS** as its
@@ -51,19 +51,19 @@ The catalogue is **prose + tables**, not an implementation. Illustrative snippet
51
51
 
52
52
  ---
53
53
 
54
- ## 2. The print box model `@page`
54
+ ## 2. The print box model - `@page`
55
55
 
56
56
  Print uses the CSS **`@page`** rule to define the page box: its `size` (a named page such as
57
57
  `A4` / `Letter`, or an explicit `WIDTH HEIGHT` with physical units), its `margin`, and its
58
- `marks` (`crop` / `cross`). Screen CSS has no page box at all content flows in one
59
- continuous viewport so a print stylesheet that omits `@page` has no defined page geometry
58
+ `marks` (`crop` / `cross`). Screen CSS has no page box at all - content flows in one
59
+ continuous viewport - so a print stylesheet that omits `@page` has no defined page geometry
60
60
  and cannot paginate predictably. Paged.js consumes the `@page` CSS to paginate in headless
61
61
  Chrome; PDFKit instead constructs the page box programmatically (`new PDFDocument({ size,
62
62
  margins })`).
63
63
 
64
64
  | Rule-id | Constraint |
65
65
  | --- | --- |
66
- | **PR-PAGE-01** | A print stylesheet MUST declare an `@page` rule the print box model. Its absence means no defined page geometry. *(Statically checkable: absence of an `@page` rule is flagged.)* |
66
+ | **PR-PAGE-01** | A print stylesheet MUST declare an `@page` rule - the print box model. Its absence means no defined page geometry. *(Statically checkable: absence of an `@page` rule is flagged.)* |
67
67
  | PR-PAGE-02 | The `@page` rule SHOULD set `size` (named `A4`/`Letter` or explicit physical `WIDTH HEIGHT`) and `margin`; use `@page :first` / `:left` / `:right` for cover/spread-specific geometry. |
68
68
  | PR-PAGE-03 | Control pagination with `break-before` / `break-after` / `break-inside: avoid` (and the legacy `page-break-*`) so headings, tables, and figures do not split badly across page boundaries. |
69
69
 
@@ -85,9 +85,9 @@ critical content sits in the cut-tolerance band.
85
85
 
86
86
  | Rule-id | Constraint |
87
87
  | --- | --- |
88
- | **PR-BLEED-01** | A print document targeting edge-to-edge output MUST signal a bleed box / crop marks a CSS `bleed:` declaration, a `marks: crop\|cross` declaration, or a documented bleed/crop-marks convention. *(Statically checkable: total absence of any bleed/marks signal is flagged.)* |
88
+ | **PR-BLEED-01** | A print document targeting edge-to-edge output MUST signal a bleed box / crop marks - a CSS `bleed:` declaration, a `marks: crop\|cross` declaration, or a documented bleed/crop-marks convention. *(Statically checkable: total absence of any bleed/marks signal is flagged.)* |
89
89
  | PR-BLEED-02 | Bleed is conventionally **3mm** (≈0.125in); registration marks sit in the trim waste outside the bleed box so they are removed when the sheet is cut. |
90
- | PR-BLEED-03 | Keep a **safe area** inside the trim (≈3–5mm) critical text and logos stay inside it so cut tolerance never clips them. |
90
+ | PR-BLEED-03 | Keep a **safe area** inside the trim (≈3–5mm) - critical text and logos stay inside it so cut tolerance never clips them. |
91
91
 
92
92
  ---
93
93
 
@@ -97,15 +97,15 @@ Print is **subtractive CMYK** (cyan/magenta/yellow/key-black ink on paper), not
97
97
  screen **RGB** the web executor emits. Pure-RGB output risks visible color shift on press:
98
98
  bright RGB blues/greens fall outside the CMYK gamut and reproduce duller, and an untagged
99
99
  document leaves the RIP to guess a conversion. A print artifact must therefore signal CMYK
100
- awareness a `cmyk()` color, a `color-profile` / `@color-profile` reference (an ICC/CMYK
100
+ awareness - a `cmyk()` color, a `color-profile` / `@color-profile` reference (an ICC/CMYK
101
101
  target profile), or an explicit documented CMYK-target note. Exact ICC-profile correctness
102
102
  and on-press gamut matching are **render-tested**, not statically assertable (see §8).
103
103
 
104
104
  | Rule-id | Constraint |
105
105
  | --- | --- |
106
- | **PR-CMYK-01** | A print document MUST show CMYK awareness a `cmyk()` color value, a `color-profile` / `@color-profile` reference, or a documented CMYK-target note. *(Statically checkable: total absence of any CMYK-awareness signal pure screen-RGB only is flagged.)* |
106
+ | **PR-CMYK-01** | A print document MUST show CMYK awareness - a `cmyk()` color value, a `color-profile` / `@color-profile` reference, or a documented CMYK-target note. *(Statically checkable: total absence of any CMYK-awareness signal - pure screen-RGB only - is flagged.)* |
107
107
  | PR-CMYK-02 | Prefer named spot/`cmyk()` values for brand colors that must match on press; flag wide-gamut RGB (`display-p3`, neon RGB) that will not survive CMYK conversion. |
108
- | PR-CMYK-03 | Rich black (e.g. `C30 M30 Y30 K100`) for large solid areas; pure `K100` for small text to avoid registration fringing. *(ICC correctness is render-tested §8.)* |
108
+ | PR-CMYK-03 | Rich black (e.g. `C30 M30 Y30 K100`) for large solid areas; pure `K100` for small text to avoid registration fringing. *(ICC correctness is render-tested - §8.)* |
109
109
 
110
110
  ```css
111
111
  :root { color-profile: url(./CoatedFOGRA39.icc); } /* CMYK target */
@@ -116,7 +116,7 @@ and on-press gamut matching are **render-tested**, not statically assertable (se
116
116
 
117
117
  ## 5. Font embedding
118
118
 
119
- Print **RIPs have no web fonts** and no system-font-stack fallback chain whatever font is
119
+ Print **RIPs have no web fonts** and no system-font-stack fallback chain - whatever font is
120
120
  referenced must be **embedded** in the document (`@font-face` with an embedded `src:`) or the
121
121
  text must be **outlined to vector**. A bare `font-family: Arial, sans-serif` system-font-stack
122
122
  assumption is a print bug: the RIP may substitute a metrically-different face (reflowing the
@@ -125,7 +125,7 @@ Paged.js relies on `@font-face` declarations resolved before pagination.
125
125
 
126
126
  | Rule-id | Constraint |
127
127
  | --- | --- |
128
- | **PR-FONT-01** | Fonts MUST be embedded or outlined an `@font-face` rule with an embedded `src:`, or a documented font-embed/outline note. A bare system-font-stack assumption (no embed) is a print bug. *(Statically checkable: absence of any font-embed signal is flagged.)* |
128
+ | **PR-FONT-01** | Fonts MUST be embedded or outlined - an `@font-face` rule with an embedded `src:`, or a documented font-embed/outline note. A bare system-font-stack assumption (no embed) is a print bug. *(Statically checkable: absence of any font-embed signal is flagged.)* |
129
129
  | PR-FONT-02 | Embed only the weights/styles actually used (subset where possible) to keep the PDF small; ensure the license permits embedding. |
130
130
  | PR-FONT-03 | Outline display/headline type to vector when exact rendering matters more than text selectability; keep body copy as embedded text for accessibility and reflow. |
131
131
 
@@ -137,7 +137,7 @@ Paged.js relies on `@font-face` declarations resolved before pagination.
137
137
 
138
138
  ## 6. 300dpi raster fallback
139
139
 
140
- Raster/image assets need **300dpi** at final print size or they pixelate screen assets are
140
+ Raster/image assets need **300dpi** at final print size or they pixelate - screen assets are
141
141
  authored at 72/96dpi, which is ~3–4× too coarse for press. **Vector is preferred** wherever
142
142
  possible (logos, icons, rules) because it is resolution-independent; where raster is
143
143
  unavoidable (photography), it must carry a 300dpi guarantee. The CSS signals are
@@ -146,7 +146,7 @@ unavoidable (photography), it must carry a 300dpi guarantee. The CSS signals are
146
146
 
147
147
  | Rule-id | Constraint |
148
148
  | --- | --- |
149
- | **PR-DPI-01** | Raster assets MUST carry a 300dpi raster-fallback signal an `image-resolution:` declaration (`300dpi` / `from-image`), a `min-resolution` query, or a documented 300dpi note. *(Statically checkable: absence of any 300dpi signal is flagged.)* |
149
+ | **PR-DPI-01** | Raster assets MUST carry a 300dpi raster-fallback signal - an `image-resolution:` declaration (`300dpi` / `from-image`), a `min-resolution` query, or a documented 300dpi note. *(Statically checkable: absence of any 300dpi signal is flagged.)* |
150
150
  | PR-DPI-02 | Prefer vector (SVG/PDF) for logos, icons, and line art so they stay crisp at any output size; reserve raster for continuous-tone photography. |
151
151
  | PR-DPI-03 | Size raster assets so their *effective* resolution at the placed dimensions is ≥300dpi; upscaling a 72dpi screen asset does not add real detail. |
152
152
 
@@ -155,16 +155,16 @@ unavoidable (photography), it must carry a 300dpi guarantee. The CSS signals are
155
155
  ## 7. Print color + units
156
156
 
157
157
  Print prefers **physical units** (`mm` / `cm` / `pt` / `in`) over screen `px`, because the
158
- page is a physical object `px` has no fixed physical size across RIPs. Print-safe color,
158
+ page is a physical object - `px` has no fixed physical size across RIPs. Print-safe color,
159
159
  overprint, and knockout are production concerns the executor should honor; most are
160
160
  **render-tested guidance** (see §8), not statically asserted by the validator.
161
161
 
162
162
  | Rule-id | Constraint |
163
163
  | --- | --- |
164
164
  | PR-UNIT-01 | Use physical units (`mm`/`cm`/`pt`/`in`) for page geometry, margins, and bleed; reserve `px` for screen. *(Guidance.)* |
165
- | PR-COLOR-01 | **Overprint vs knockout** small black text overprints (prints on top) to avoid registration gaps; light-on-dark knocks out. *(Render-tested §8.)* |
166
- | PR-COLOR-02 | **Trap/registration** adjacent CMYK separations are trapped (slightly overlapped) so misregistration on press shows no white gap. *(Render-tested §8.)* |
167
- | PR-COLOR-03 | **True vector tessellation** complex vector fills/gradients must tessellate without seams in the RIP. *(Render-tested §8.)* |
165
+ | PR-COLOR-01 | **Overprint vs knockout** - small black text overprints (prints on top) to avoid registration gaps; light-on-dark knocks out. *(Render-tested - §8.)* |
166
+ | PR-COLOR-02 | **Trap/registration** - adjacent CMYK separations are trapped (slightly overlapped) so misregistration on press shows no white gap. *(Render-tested - §8.)* |
167
+ | PR-COLOR-03 | **True vector tessellation** - complex vector fills/gradients must tessellate without seams in the RIP. *(Render-tested - §8.)* |
168
168
 
169
169
  ---
170
170
 
@@ -173,16 +173,16 @@ overprint, and knockout are production concerns the executor should honor; most
173
173
  This table is the **contract** the validator's `rule` ids map to. The five rule-ids below are
174
174
  the deterministic subset that `scripts/lib/print/validate-print-css.cjs` asserts via
175
175
  regex/string analysis of the supplied print CSS/HTML string. Every other rule-id in this
176
- catalogue is **render-tested guidance** verified by the optional Paged.js-headless-Chrome /
176
+ catalogue is **render-tested guidance** - verified by the optional Paged.js-headless-Chrome /
177
177
  PDFKit render-test connection (34.3-02), never asserted by the static validator.
178
178
 
179
179
  | Rule-id | Check | Statically checked by the validator? | How verified otherwise |
180
180
  | --- | --- | --- | --- |
181
- | **PR-PAGE-01** | An `@page` rule is present (the print box model) | **YES** absence flagged | |
182
- | **PR-BLEED-01** | A bleed box / crop-marks signal is present (`bleed:` / `marks:` / a documented bleed-marks note) | **YES** total absence flagged | |
183
- | **PR-CMYK-01** | A CMYK-awareness signal is present (`cmyk(` / `color-profile` / `@color-profile` / a CMYK note) | **YES** total absence (pure RGB) flagged | |
184
- | **PR-FONT-01** | A font-embed signal is present (`@font-face` with `src:` / a font-embed/outline note) | **YES** absence flagged | |
185
- | **PR-DPI-01** | A 300dpi raster-fallback signal is present (`image-resolution:` / `min-resolution` / a 300dpi note) | **YES** absence flagged | |
181
+ | **PR-PAGE-01** | An `@page` rule is present (the print box model) | **YES** - absence flagged | - |
182
+ | **PR-BLEED-01** | A bleed box / crop-marks signal is present (`bleed:` / `marks:` / a documented bleed-marks note) | **YES** - total absence flagged | - |
183
+ | **PR-CMYK-01** | A CMYK-awareness signal is present (`cmyk(` / `color-profile` / `@color-profile` / a CMYK note) | **YES** - total absence (pure RGB) flagged | - |
184
+ | **PR-FONT-01** | A font-embed signal is present (`@font-face` with `src:` / a font-embed/outline note) | **YES** - absence flagged | - |
185
+ | **PR-DPI-01** | A 300dpi raster-fallback signal is present (`image-resolution:` / `min-resolution` / a 300dpi note) | **YES** - absence flagged | - |
186
186
  | PR-PAGE-02..03 | `size`/`margin` set, sensible page breaks | No | Render test (paginated output) |
187
187
  | PR-BLEED-02..03 | 3mm bleed value, marks in trim waste, safe area | No | Render test (preflight) |
188
188
  | PR-CMYK-02..03 | In-gamut brand colors, rich-black vs K100, **ICC-profile correctness** | No | Render test (press proof / ICC) |
@@ -198,26 +198,26 @@ Notes on the five statically-checked rules:
198
198
  and trip exactly one.
199
199
  - **CMYK awareness is satisfied by any of three signals.** A `cmyk()` color, a
200
200
  `color-profile` / `@color-profile` reference, **or** a documented `/* CMYK … */` note each
201
- satisfy PR-CMYK-01 on their own a fully RGB document with an explicit CMYK-target note
201
+ satisfy PR-CMYK-01 on their own - a fully RGB document with an explicit CMYK-target note
202
202
  still passes (the note records the production intent the RIP needs).
203
203
  - **Render-tested rules are out of the static validator's scope by design.** Overprint
204
204
  behavior, ICC-profile correctness, trap/registration, and true vector tessellation require
205
- an actual PDF RIP / rendering engine they are catalogued here as executor guidance and
205
+ an actual PDF RIP / rendering engine - they are catalogued here as executor guidance and
206
206
  verified by the optional print-render connection, never asserted statically (D-03 / D-10).
207
207
 
208
208
  ---
209
209
 
210
210
  ## 9. Cross-references
211
211
 
212
- - [`reference/email-design.md`](./email-design.md) the email-constraint sibling
212
+ - [`reference/email-design.md`](./email-design.md) - the email-constraint sibling
213
213
  (table layout, inline styles, MSO comments, dark mode). The non-web siblings share the
214
214
  catalogue-plus-static-validator shape.
215
- - [`reference/native-platforms.md`](./native-platforms.md) the native token-bridge sibling
215
+ - [`reference/native-platforms.md`](./native-platforms.md) - the native token-bridge sibling
216
216
  (SwiftUI / Compose / Flutter). The other non-web output surface.
217
- - [`reference/platforms.md`](./platforms.md) the interaction-conventions sibling.
217
+ - [`reference/platforms.md`](./platforms.md) - the interaction-conventions sibling.
218
218
  - [`scripts/lib/print/validate-print-css.cjs`](../scripts/lib/print/validate-print-css.cjs)
219
- the deterministic static validator that asserts the §8 subset; its `rule` ids are the
219
+ - the deterministic static validator that asserts the §8 subset; its `rule` ids are the
220
220
  constraint-ids defined here.
221
- - [`reference/registry.json`](./registry.json) this catalogue is registered as the
221
+ - [`reference/registry.json`](./registry.json) - this catalogue is registered as the
222
222
  `print-design` entry (type `heuristic`, phase `34.3`) so the registry round-trip test
223
223
  (`test/suite/reference-registry.test.cjs`) stays green (D-05, the 34.1-01 / 34.2-01 lesson).
@@ -1,4 +1,4 @@
1
- # Priority Matrix 10 Categories, CRITICAL → LOW
1
+ # Priority Matrix - 10 Categories, CRITICAL → LOW
2
2
 
3
3
  Adapted from `ui-ux-pro-max`. Use this to rank findings when auditing, critiquing, or deciding fix order.
4
4
 
@@ -27,5 +27,5 @@ Adapted from `ui-ux-pro-max`. Use this to rank findings when auditing, critiquin
27
27
  1. Run the discover stage audit or a manual grep pass using `reference/anti-patterns.md` patterns.
28
28
  2. For each finding, assign a category (1–10) from above.
29
29
  3. Sort by severity descending.
30
- 4. Fix P0s before shipping never ship with one open.
30
+ 4. Fix P0s before shipping - never ship with one open.
31
31
  5. Map each P0/P1 to a task type in the Design stage: color findings → `color` task, typography → `typography` task, accessibility → `accessibility` task.
@@ -5,9 +5,9 @@ Project-local skills live at `./.claude/skills/` within the user's project (not
5
5
  ## Auto-loaded patterns
6
6
 
7
7
  Files matching `./.claude/skills/design-*-conventions.md` are read by:
8
- - `explore` included in DESIGN-CONTEXT.md synthesis under a `<project_conventions>` section
9
- - `plan` passed to design-planner as `<required_reading>`
10
- - `design` passed to the executor as `<required_reading>`
8
+ - `explore` - included in DESIGN-CONTEXT.md synthesis under a `<project_conventions>` section
9
+ - `plan` - passed to design-planner as `<required_reading>`
10
+ - `design` - passed to the executor as `<required_reading>`
11
11
 
12
12
  ## File format
13
13
 
@@ -7,21 +7,21 @@ tags: [proportion, spacing, baseline-grid, vertical-rhythm, modular-scale]
7
7
  last_updated: 2026-05-18
8
8
  ---
9
9
 
10
- # Proportion Systems Whole-UI Modular Relationships
10
+ # Proportion Systems - Whole-UI Modular Relationships
11
11
 
12
- The existing [typography reference](./typography.md) covers the modular type scale base 16px, a ratio (1.250 Major Third, 1.333 Perfect Fourth, 1.414 √2, 1.618 φ), and the geometric ladder of font sizes that scale produces. That ladder is one slice of a larger system. A proportion system is the rule that *every* dimension in the UI type, spacing between elements, sizing of icons and avatars, and corner radius on components derives from a single underlying unit and a small set of multipliers, so that values across the four systems land on the same grid and visibly belong to the same composition.
12
+ The existing [typography reference](./typography.md) covers the modular type scale - base 16px, a ratio (1.250 Major Third, 1.333 Perfect Fourth, 1.414 √2, 1.618 φ), and the geometric ladder of font sizes that scale produces. That ladder is one slice of a larger system. A proportion system is the rule that *every* dimension in the UI - type, spacing between elements, sizing of icons and avatars, and corner radius on components - derives from a single underlying unit and a small set of multipliers, so that values across the four systems land on the same grid and visibly belong to the same composition.
13
13
 
14
- This file exists because that whole-UI view is undocumented today: [design-system-guidance.md](./design-system-guidance.md) mentions 8pt spacing in passing, [style-vocabulary.md](./style-vocabulary.md) cites "8pt spacing grid" as a Flat Design 2.0 marker, and `typography.md` owns the type-scale slice but nothing ties them together. An agent that picks `padding: 12px` next to body text at `16/24` on an 8pt grid is breaking proportion silently, because the cross-system relationship was never stated. This is the file an agent should consult any time it is *constructing* the underlying grid of a UI choosing a baseline unit, deriving a spacing ladder, deciding whether icon-md should be 20px or 24px, or auditing why a layout "feels off" despite each token being internally consistent.
14
+ This file exists because that whole-UI view is undocumented today: [design-system-guidance.md](./design-system-guidance.md) mentions 8pt spacing in passing, [style-vocabulary.md](./style-vocabulary.md) cites "8pt spacing grid" as a Flat Design 2.0 marker, and `typography.md` owns the type-scale slice - but nothing ties them together. An agent that picks `padding: 12px` next to body text at `16/24` on an 8pt grid is breaking proportion silently, because the cross-system relationship was never stated. This is the file an agent should consult any time it is *constructing* the underlying grid of a UI - choosing a baseline unit, deriving a spacing ladder, deciding whether icon-md should be 20px or 24px, or auditing why a layout "feels off" despite each token being internally consistent.
15
15
 
16
- The jump this file closes is from *"we use a modular type scale"* to *"we use a coherent proportion system across type + spacing + sizing + radius the whole UI snaps to one grid."*
16
+ The jump this file closes is from *"we use a modular type scale"* to *"we use a coherent proportion system across type + spacing + sizing + radius - the whole UI snaps to one grid."*
17
17
 
18
18
  ## Baseline Grid Systems
19
19
 
20
- A baseline grid is the invisible underlying structure every dimension snaps to. It is one number `4`, `8`, or `1.414` and the rule that no value in the UI may be authored that is not a multiple of that number. The grid is not a layout grid (columns and gutters); it is the smallest atomic unit out of which both the column grid and every spacing / sizing / radius token are composed. Three baselines dominate: 4pt, 8pt, and √2. Pick one for the whole product; do not mix.
20
+ A baseline grid is the invisible underlying structure every dimension snaps to. It is one number - `4`, `8`, or `1.414` - and the rule that no value in the UI may be authored that is not a multiple of that number. The grid is not a layout grid (columns and gutters); it is the smallest atomic unit out of which both the column grid and every spacing / sizing / radius token are composed. Three baselines dominate: 4pt, 8pt, and √2. Pick one for the whole product; do not mix.
21
21
 
22
22
  ### 4pt Grid
23
23
 
24
- When it fits: dense data UIs where rows must be visually compact (trading terminals, observability dashboards, IDE-style tooling, spreadsheet-derived layouts). The 4pt unit lets you author 12px / 20px / 28px row heights that an 8pt grid forbids, which matters when 10–20 horizontal rows need to fit above the fold. The cost is that fine increments invite drift without strict review, a team will quickly have `13px`, `15px`, and `17px` in production.
24
+ When it fits: dense data UIs where rows must be visually compact (trading terminals, observability dashboards, IDE-style tooling, spreadsheet-derived layouts). The 4pt unit lets you author 12px / 20px / 28px row heights that an 8pt grid forbids, which matters when 10–20 horizontal rows need to fit above the fold. The cost is that fine increments invite drift - without strict review, a team will quickly have `13px`, `15px`, and `17px` in production.
25
25
 
26
26
  ```css
27
27
  /* 4pt grid — dense data UI */
@@ -46,7 +46,7 @@ When it fits: dense data UIs where rows must be visually compact (trading termin
46
46
 
47
47
  ### 8pt Grid
48
48
 
49
- When it fits: product UI, marketing surfaces, default for most consumer apps. Material Design, iOS Human Interface Guidelines, and the majority of modern design systems converge on 8pt because the unit is large enough to prevent drift (no one accidentally authors 9px) yet small enough to express every meaningful step. Half-units (4px) are permitted only at the smallest scale (icon padding, single-character chip insets) and are explicitly named never freehand.
49
+ When it fits: product UI, marketing surfaces, default for most consumer apps. Material Design, iOS Human Interface Guidelines, and the majority of modern design systems converge on 8pt because the unit is large enough to prevent drift (no one accidentally authors 9px) yet small enough to express every meaningful step. Half-units (4px) are permitted only at the smallest scale (icon padding, single-character chip insets) and are explicitly named - never freehand.
50
50
 
51
51
  ```css
52
52
  /* 8pt grid — product UI default */
@@ -71,7 +71,7 @@ When it fits: product UI, marketing surfaces, default for most consumer apps. Ma
71
71
 
72
72
  ### √2 Grid (root-2)
73
73
 
74
- When it fits: editorial layouts, print-adjacent surfaces, long-form article pages, document viewers. The √2 ratio (≈1.414) is the proportion that survives bisection fold an A4 page in half and you get an A5 page with the same proportion. UIs that mirror physical paper (PDF readers, marketing landing pages with magazine layouts, layouts that breathe like print) feel right on √2 because subdivisions cascade self-similarly. The underlying spacing unit is still an integer (typically 8px or 16px) but the column and section *ratios* are √2, and key dimensions are generated by repeated multiplication or division by 1.414. See `./composition.md` §Root Rectangles √2, √3, √5 for the geometry behind the ratio.
74
+ When it fits: editorial layouts, print-adjacent surfaces, long-form article pages, document viewers. The √2 ratio (≈1.414) is the proportion that survives bisection - fold an A4 page in half and you get an A5 page with the same proportion. UIs that mirror physical paper (PDF readers, marketing landing pages with magazine layouts, layouts that breathe like print) feel right on √2 because subdivisions cascade self-similarly. The underlying spacing unit is still an integer (typically 8px or 16px) but the column and section *ratios* are √2, and key dimensions are generated by repeated multiplication or division by 1.414. See `./composition.md` §Root Rectangles - √2, √3, √5 for the geometry behind the ratio.
75
75
 
76
76
  ```css
77
77
  /* √2 grid — editorial / print-adjacent */
@@ -92,11 +92,11 @@ When it fits: editorial layouts, print-adjacent surfaces, long-form article page
92
92
  }
93
93
  ```
94
94
 
95
- **Decision rule:** if the product is a dense data UI where row density is the dominant constraint, pick 4pt. If the product is editorial or print-adjacent and pages should feel like documents, pick √2 (over an integer pixel unit). For everything else and that is most product work pick 8pt. Document the decision once at the design-system level; do not let individual surfaces pick their own grid.
95
+ **Decision rule:** if the product is a dense data UI where row density is the dominant constraint, pick 4pt. If the product is editorial or print-adjacent and pages should feel like documents, pick √2 (over an integer pixel unit). For everything else - and that is most product work - pick 8pt. Document the decision once at the design-system level; do not let individual surfaces pick their own grid.
96
96
 
97
97
  ## Baseline-Grid Lock
98
98
 
99
- Baseline-grid lock is the discipline that every text baseline in the UI lands on a grid line typically the same 4pt or 8pt unit used for spacing. The mechanism is the `line-height` of every text style: set line-height so the resulting line box is a whole multiple of the grid unit. Body text at 16px font with line-height `24px` consumes exactly three 8pt units per line. Heading text at 32px with line-height `40px` consumes five. Caption at 14px with line-height `24px` consumes three. Every block of text regardless of size stacks on the same invisible horizontal rulings.
99
+ Baseline-grid lock is the discipline that every text baseline in the UI lands on a grid line - typically the same 4pt or 8pt unit used for spacing. The mechanism is the `line-height` of every text style: set line-height so the resulting line box is a whole multiple of the grid unit. Body text at 16px font with line-height `24px` consumes exactly three 8pt units per line. Heading text at 32px with line-height `40px` consumes five. Caption at 14px with line-height `24px` consumes three. Every block of text - regardless of size - stacks on the same invisible horizontal rulings.
100
100
 
101
101
  Lock matters because mixed-size text without it produces drift. A page that interleaves body, headings, and captions whose line-heights are *not* grid multiples will accumulate fractional-pixel errors block-by-block; by mid-page, the right column has slid out of alignment with the left. Visually the page looks "slightly wrong" without an obvious cause. Lock eliminates the symptom by construction.
102
102
 
@@ -120,7 +120,7 @@ h2 { font-size: 32px; line-height: var(--line-heading); }
120
120
 
121
121
  Vertical rhythm is the lived consequence of baseline-grid lock: because every text block consumes a whole number of grid units, block-level elements stack on the grid without ever needing manual margin tweaks. The page reads with a quiet, mechanical regularity that the eye registers as polish even when no one can articulate why. Vertical rhythm is what readers mean when they say a layout feels "professional" or "calm".
122
122
 
123
- The rule that produces it is: pick the baseline unit once, set every line-height in the type ramp as a multiple of that unit, and set every block-level margin (margin-top, margin-bottom, padding-block on cards and sections) as a multiple of the same unit. Once both type and spacing are on-grid, rhythm emerges automatically no per-element adjustment.
123
+ The rule that produces it is: pick the baseline unit once, set every line-height in the type ramp as a multiple of that unit, and set every block-level margin (margin-top, margin-bottom, padding-block on cards and sections) as a multiple of the same unit. Once both type and spacing are on-grid, rhythm emerges automatically - no per-element adjustment.
124
124
 
125
125
  ```css
126
126
  /* Vertical rhythm — body, heading, caption, all on the 8pt grid */
@@ -150,11 +150,11 @@ article > * + * {
150
150
  }
151
151
  ```
152
152
 
153
- **Exceptions are explicit, not freehand.** Display-scale type (font-size ≥ 56px) is often set with optical line-height a unitless ratio of 1.05–1.15 because mechanical 8pt multiples look too sparse at hero scale. Single-line callouts (status badges, single-character chips) may use `line-height: 1` with vertical padding rounded to the grid. Treat both as named utilities (`.display-line-height`, `.chip-vertical`) rather than ad-hoc overrides once the exception is a token, it remains visible to audit.
153
+ **Exceptions are explicit, not freehand.** Display-scale type (font-size ≥ 56px) is often set with optical line-height - a unitless ratio of 1.05–1.15 - because mechanical 8pt multiples look too sparse at hero scale. Single-line callouts (status badges, single-character chips) may use `line-height: 1` with vertical padding rounded to the grid. Treat both as named utilities (`.display-line-height`, `.chip-vertical`) rather than ad-hoc overrides - once the exception is a token, it remains visible to audit.
154
154
 
155
155
  ## Modular Relationships
156
156
 
157
- The point of the proportion system is that the four sub-systems type, spacing, sizing, radius are not authored independently. Each derives from the same baseline unit, and certain pairs of values across systems are intentionally identical. Body line-height equals the spacing token that separates two body paragraphs equals the height of a medium icon. The numerical equality is the visible signature of an authored composition.
157
+ The point of the proportion system is that the four sub-systems - type, spacing, sizing, radius - are not authored independently. Each derives from the same baseline unit, and certain pairs of values across systems are intentionally identical. Body line-height equals the spacing token that separates two body paragraphs equals the height of a medium icon. The numerical equality is the visible signature of an authored composition.
158
158
 
159
159
  | System | Token | Value | Grid relationship | Cross-system pairing |
160
160
  | ------- | ----------- | ----- | ------------------------------ | ------------------------------------- |
@@ -179,15 +179,15 @@ The point of the proportion system is that the four sub-systems — type, spacin
179
179
  | size | avatar-md | 48px | 6 × baseline | matches `space-6` |
180
180
  | size | avatar-lg | 64px | 8 × baseline | 8 grid units, matches hero spacing |
181
181
 
182
- The pairing column is the asset. An agent picking a value reads across the table: "I need padding around 16px text on an 8pt grid" → `space-2` (16px) or `space-3` (24px), never `padding: 12px` (1.5 units half-step, reserved for chips). "I need an icon next to body text" → `icon-md` (24px), because body line-height is 24px and the icon should occupy the same vertical band. The relationships make these decisions one-step.
182
+ The pairing column is the asset. An agent picking a value reads across the table: "I need padding around 16px text on an 8pt grid" → `space-2` (16px) or `space-3` (24px), never `padding: 12px` (1.5 units - half-step, reserved for chips). "I need an icon next to body text" → `icon-md` (24px), because body line-height is 24px and the icon should occupy the same vertical band. The relationships make these decisions one-step.
183
183
 
184
- **A concrete pairing example.** Body text is 16px on 24px line-height (8pt grid). A button next to body text should have vertical padding such that the total button height is a clean multiple of the grid. Padding 8px + line-height 24px + padding 8px = 40px (5 units on-grid). Padding 12px + line-height 24px + padding 12px = 48px (6 units on-grid). Padding 10px gives 44px (5.5 units off-grid, breaks rhythm); the only way to know that is to consult the matrix. Once a team internalizes the pairings, the choice between 8px and 12px stops being aesthetic both are correct, both produce on-grid heights, and the team picks based on density.
184
+ **A concrete pairing example.** Body text is 16px on 24px line-height (8pt grid). A button next to body text should have vertical padding such that the total button height is a clean multiple of the grid. Padding 8px + line-height 24px + padding 8px = 40px (5 units - on-grid). Padding 12px + line-height 24px + padding 12px = 48px (6 units - on-grid). Padding 10px gives 44px (5.5 units - off-grid, breaks rhythm); the only way to know that is to consult the matrix. Once a team internalizes the pairings, the choice between 8px and 12px stops being aesthetic - both are correct, both produce on-grid heights, and the team picks based on density.
185
185
 
186
186
  ## Radius Scale as Proportion
187
187
 
188
- Corner radius is the easiest token to author ad-hoc `border-radius: 6px` looks fine in isolation and the easiest to break the system with. The radius scale belongs to proportion because it must derive from component height, not be chosen freehand. The common rule is `radius-md ≈ 0.25 × component height`: a 40px-tall button gets 8px radius, a 32px-tall chip gets 8px radius, a 24px-tall tag gets 4px or 8px. The 0.25× ratio is visually balanced large enough to register as "rounded", small enough to keep the geometry of the rectangle dominant.
188
+ Corner radius is the easiest token to author ad-hoc - `border-radius: 6px` looks fine in isolation - and the easiest to break the system with. The radius scale belongs to proportion because it must derive from component height, not be chosen freehand. The common rule is `radius-md ≈ 0.25 × component height`: a 40px-tall button gets 8px radius, a 32px-tall chip gets 8px radius, a 24px-tall tag gets 4px or 8px. The 0.25× ratio is visually balanced - large enough to register as "rounded", small enough to keep the geometry of the rectangle dominant.
189
189
 
190
- Two exceptions matter and are named, not freehand. **Pill** sets `border-radius: 9999px` (or `border-radius: 50%` on a square) explicit "fully rounded", used for tags, status badges, and avatar wrappers. **Square** sets `border-radius: 0` explicit "no rounding", used inside data tables where rectangular cells must butt against each other, and on heavily geometric brand systems.
190
+ Two exceptions matter and are named, not freehand. **Pill** sets `border-radius: 9999px` (or `border-radius: 50%` on a square) - explicit "fully rounded", used for tags, status badges, and avatar wrappers. **Square** sets `border-radius: 0` - explicit "no rounding", used inside data tables where rectangular cells must butt against each other, and on heavily geometric brand systems.
191
191
 
192
192
  ```css
193
193
  /* Radius scale as proportion to component height */
@@ -219,7 +219,7 @@ Two exceptions matter and are named, not freehand. **Pill** sets `border-radius:
219
219
 
220
220
  ## Sizing Scale Derivation
221
221
 
222
- Sizing tokens icon dimensions, avatar dimensions, button heights, input heights are not a separate ladder. They are derived from the spacing scale by consistent multipliers, so that every size token equals some `space-N` token. This is the rule that prevents sizing drift: a new size token must reuse an existing spacing value; it may not introduce a new pixel value.
222
+ Sizing tokens - icon dimensions, avatar dimensions, button heights, input heights - are not a separate ladder. They are derived from the spacing scale by consistent multipliers, so that every size token equals some `space-N` token. This is the rule that prevents sizing drift: a new size token must reuse an existing spacing value; it may not introduce a new pixel value.
223
223
 
224
224
  The derivation table for an 8pt grid:
225
225
 
@@ -254,14 +254,14 @@ The derivation table for an 8pt grid:
254
254
  }
255
255
  ```
256
256
 
257
- The rule that makes this work: **a new sizing token must derive from spacing never freehand.** If a designer needs a 36px button, the answer is not `--button-custom: 36px`; the answer is either 32px (`--space-4`) or 40px (`--space-5`), and the designer picks one. The token system declines to express off-grid sizes, which is the point.
257
+ The rule that makes this work: **a new sizing token must derive from spacing - never freehand.** If a designer needs a 36px button, the answer is not `--button-custom: 36px`; the answer is either 32px (`--space-4`) or 40px (`--space-5`), and the designer picks one. The token system declines to express off-grid sizes, which is the point.
258
258
 
259
259
  ## Cross-References
260
260
 
261
- - [design-system-guidance.md](./design-system-guidance.md) general design-system authoring context that this file deepens for proportion. That file mentions 8pt grids in passing; this file is the formal treatment.
262
- - [typography.md](./typography.md) §Type Scale Systems the canonical modular-scale slice this file extends to the whole UI. Read that section first for the upstream type ladder.
263
- - [style-vocabulary.md](./style-vocabulary.md) style rows that cite "8pt spacing grid" (Flat Design 2.0) and other proportional vocabulary surfaces. This file is the underlying mechanism behind those style-row markers.
261
+ - [design-system-guidance.md](./design-system-guidance.md) - general design-system authoring context that this file deepens for proportion. That file mentions 8pt grids in passing; this file is the formal treatment.
262
+ - [typography.md](./typography.md) §Type Scale Systems - the canonical modular-scale slice this file extends to the whole UI. Read that section first for the upstream type ladder.
263
+ - [style-vocabulary.md](./style-vocabulary.md) - style rows that cite "8pt spacing grid" (Flat Design 2.0) and other proportional vocabulary surfaces. This file is the underlying mechanism behind those style-row markers.
264
264
 
265
- Forward reading: [composition.md](./composition.md) §Root Rectangles √2, √3, √5 for the geometry behind the √2 grid baseline option above.
265
+ Forward reading: [composition.md](./composition.md) §Root Rectangles - √2, √3, √5 for the geometry behind the √2 grid baseline option above.
266
266
 
267
267
  Note: reciprocal inbound cross-links from these files into `proportion-systems.md` land in Phase 28-06 (additive-only, decision D-06). This file declares its three outbound links now; the inverse direction is a separate, batched edit.
@@ -12,13 +12,13 @@ The 8 substitution rules applied by `scripts/lib/pseudonymize.cjs` to identity-c
12
12
 
13
13
  ## Pseudonymization, not anonymization
14
14
 
15
- These rules **reduce** identity correlation. They do not **eliminate** it. A determined adversary with side-channel data writing style, code-style patterns, repository fingerprints, timing may still re-identify a reporter. Phase 30 explicitly delivers pseudonymization-not-anonymization (CONTEXT D-01); over-promising would be misleading.
15
+ These rules **reduce** identity correlation. They do not **eliminate** it. A determined adversary with side-channel data - writing style, code-style patterns, repository fingerprints, timing - may still re-identify a reporter. Phase 30 explicitly delivers pseudonymization-not-anonymization (CONTEXT D-01); over-promising would be misleading.
16
16
 
17
17
  Pseudonymization here serves three concrete goals:
18
18
 
19
19
  - **(a) Prevent casual identification** by other users who later read the public GitHub issue.
20
20
  - **(b) Reduce corporate-DLP false-positives** at submission time on common identifier shapes (usernames in paths, hostnames in stack traces, email patterns in logs). The pseudonymized payload is less likely to be intercepted by enterprise DLP tools that scan for these exact patterns.
21
- - **(c) Give the user a structural opportunity** to inspect and edit the payload before it leaves their machine. The pseudonymization step makes the payload's identity-correlation surface visible the user can read it and decide.
21
+ - **(c) Give the user a structural opportunity** to inspect and edit the payload before it leaves their machine. The pseudonymization step makes the payload's identity-correlation surface visible - the user can read it and decide.
22
22
 
23
23
  Submission is always user-initiated and user-reviewed per Plan 30-04 (CONTEXT D-03). Phase 30 does **not** auto-submit, ever.
24
24
 
@@ -28,8 +28,8 @@ Pseudonymization runs **after** redaction (`scripts/lib/redact.cjs`, Phase 22) i
28
28
 
29
29
  | Layer | Module | What it scrubs |
30
30
  |---|---|---|
31
- | Secrets (high-stakes floor) | `scripts/lib/redact.cjs` | Tokens, API keys, JWTs, PEM blocks, AWS credentials, Slack/Stripe/GitHub tokens strings that must **never** escape |
32
- | Identity (privacy) | `scripts/lib/pseudonymize.cjs` | Names, paths, hostnames, repo origins, env-var values, emails, IPs strings that **may** be published but should not personally identify the reporter |
31
+ | Secrets (high-stakes floor) | `scripts/lib/redact.cjs` | Tokens, API keys, JWTs, PEM blocks, AWS credentials, Slack/Stripe/GitHub tokens - strings that must **never** escape |
32
+ | Identity (privacy) | `scripts/lib/pseudonymize.cjs` | Names, paths, hostnames, repo origins, env-var values, emails, IPs - strings that **may** be published but should not personally identify the reporter |
33
33
 
34
34
  Redaction handles "this string must never escape"; pseudonymization handles "this string is fine to publish but should not personally identify the reporter." The two modules do not import each other; composition lives at the caller (Plan 30-02 payload assembly). See CONTEXT D-01 for the framing rationale and CONTEXT references for the redaction prerequisite.
35
35
 
@@ -37,7 +37,7 @@ Redaction handles "this string must never escape"; pseudonymization handles "thi
37
37
 
38
38
  Eight rules. Each rule has a stable id (R1..R8) used by `/gdd:update --show-privacy-diff` (Plan 30-07) to enumerate active rules.
39
39
 
40
- ### R1 git-identity
40
+ ### R1 - git-identity
41
41
 
42
42
  **Replaces:** `user.name` and `user.email` from git config when they appear in payload strings (stack traces, log messages, commit-author lines).
43
43
 
@@ -51,7 +51,7 @@ Author: <user> <<user>@<domain>> committed at 12:34
51
51
 
52
52
  **Coverage notes:** Word-boundary regex (`\b<name>\b`) prevents stripping unrelated substrings. Email match is case-insensitive (`alice@example.com` and `Alice@Example.Com` both replaced). Name values shorter than 2 chars and email values shorter than 3 chars are skipped to avoid over-eager matching on common short sequences.
53
53
 
54
- ### R2 absolute-paths
54
+ ### R2 - absolute-paths
55
55
 
56
56
  **Replaces:** Home-directory absolute paths across all three OS conventions:
57
57
 
@@ -68,9 +68,9 @@ Author: <user> <<user>@<domain>> committed at 12:34
68
68
  C:\Users\alice\code\proj\file.ts:42 → <home>\code\proj\file.ts:42
69
69
  ```
70
70
 
71
- **Coverage notes:** Six regex sweeps three identity-aware (when the name is known) and three generic (matching `/Users/<any>/`, `/home/<any>/`, `<drive>:\Users\<any>\`). Identity-aware sweeps run first so the identity-aware substitution takes precedence; generic sweeps catch references to teammates or other users that may appear in stack traces.
71
+ **Coverage notes:** Six regex sweeps - three identity-aware (when the name is known) and three generic (matching `/Users/<any>/`, `/home/<any>/`, `<drive>:\Users\<any>\`). Identity-aware sweeps run first so the identity-aware substitution takes precedence; generic sweeps catch references to teammates or other users that may appear in stack traces.
72
72
 
73
- ### R3 hostname
73
+ ### R3 - hostname
74
74
 
75
75
  **Replaces:** `os.hostname()` value with `<host>`.
76
76
 
@@ -82,9 +82,9 @@ Connected to alices-macbook.local from alices-macbook
82
82
  Connected to <host>.local from <host>
83
83
  ```
84
84
 
85
- **Coverage notes:** Two sweeps one for `@hostname` (ssh-shape), one with standard word-boundary. Hostnames shorter than 2 chars are skipped.
85
+ **Coverage notes:** Two sweeps - one for `@hostname` (ssh-shape), one with standard word-boundary. Hostnames shorter than 2 chars are skipped.
86
86
 
87
- ### R4 repo-origin
87
+ ### R4 - repo-origin
88
88
 
89
89
  **Replaces:** Git origin URL with `<category>-hash:<sha8>` where:
90
90
 
@@ -100,9 +100,9 @@ Remote: git@github.com:acme-corp/internal-tools.git
100
100
  Remote: private-org-hash:a1b2c3d4
101
101
  ```
102
102
 
103
- **Coverage notes:** Caller resolves visibility via `gh repo view --json visibility` (or skips if `gh` is absent module then uses the conservative `private-org-hash` default). The module performs no network calls; visibility is an injected `opts.repoVisibility` value. Owner-is-user vs owner-is-org distinction is the caller's responsibility (the module cannot tell from a URL alone). Both the raw `repoOrigin` substring and the normalized form are substituted so multiple shapes of the same URL in a stack trace all collapse to one placeholder.
103
+ **Coverage notes:** Caller resolves visibility via `gh repo view --json visibility` (or skips if `gh` is absent - module then uses the conservative `private-org-hash` default). The module performs no network calls; visibility is an injected `opts.repoVisibility` value. Owner-is-user vs owner-is-org distinction is the caller's responsibility (the module cannot tell from a URL alone). Both the raw `repoOrigin` substring and the normalized form are substituted so multiple shapes of the same URL in a stack trace all collapse to one placeholder.
104
104
 
105
- ### R5 env-vars
105
+ ### R5 - env-vars
106
106
 
107
107
  **Replaces:** **VALUES** (not key names) of these environment variables wherever they appear in payload strings:
108
108
 
@@ -119,13 +119,13 @@ Error: GITHUB_TOKEN=ghp_abcDEFghi123 was rejected
119
119
  Error: GITHUB_TOKEN=<env:GITHUB_TOKEN> was rejected
120
120
  ```
121
121
 
122
- **Coverage notes:** Empty / 1-char / 2-char values are skipped (corruption guard short values would over-match unrelated content). Longer-value entries are processed first (descending by length) so a token that contains another's substring does not get half-replaced. R5 walks the entire payload tree (strings get value substitution, objects/arrays recurse, cycles detected via WeakSet) value substitution works regardless of nesting depth.
122
+ **Coverage notes:** Empty / 1-char / 2-char values are skipped (corruption guard - short values would over-match unrelated content). Longer-value entries are processed first (descending by length) so a token that contains another's substring does not get half-replaced. R5 walks the entire payload tree (strings get value substitution, objects/arrays recurse, cycles detected via WeakSet) - value substitution works regardless of nesting depth.
123
123
 
124
- ### R6 email-in-logs
124
+ ### R6 - email-in-logs
125
125
 
126
126
  **Replaces:** Email addresses that slipped past R1's identity-aware substitution (e.g., third-party emails mentioned in a stack trace or log line) with `<email>`.
127
127
 
128
- **Why:** R1 catches the user's own `user.email`. R6 is the generic catch-all for any other email addresses that may appear in a payload including teammates' emails in error messages, vendor support emails in stack traces, or addresses pulled from data being processed at the time of the error.
128
+ **Why:** R1 catches the user's own `user.email`. R6 is the generic catch-all for any other email addresses that may appear in a payload - including teammates' emails in error messages, vendor support emails in stack traces, or addresses pulled from data being processed at the time of the error.
129
129
 
130
130
  **Before/after example:**
131
131
  ```
@@ -135,7 +135,7 @@ Stack frame: at notify(<email>)
135
135
 
136
136
  **Coverage notes:** Standard RFC-5322-ish regex (`/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g`). R6 runs **after** R1 in the rule pipeline so identity-aware substitution takes precedence (the user's email becomes `<user>@<domain>`, not `<email>`).
137
137
 
138
- ### R7 ip-addresses
138
+ ### R7 - ip-addresses
139
139
 
140
140
  **Replaces:** IPv4 and IPv6 addresses, retaining only network class:
141
141
 
@@ -152,16 +152,16 @@ fe80::1ff:fe23:4567:890a → <ipv6:fe80::1ff:fe23:4567::>
152
152
 
153
153
  **Coverage notes:** Regex guards prevent false-positives on:
154
154
 
155
- - Semver strings (`v1.2.3.4`) leading `v` blocked by lookbehind
156
- - Email-adjacent strings (`@1.2.3.4`) `@` blocked by lookbehind
157
- - Date strings (`2026-05-20`) dashes don't match the dotted-octet pattern
158
- - Longer dotted strings (`1.2.3.4.5`) trailing `.` blocked by lookahead
155
+ - Semver strings (`v1.2.3.4`) - leading `v` blocked by lookbehind
156
+ - Email-adjacent strings (`@1.2.3.4`) - `@` blocked by lookbehind
157
+ - Date strings (`2026-05-20`) - dashes don't match the dotted-octet pattern
158
+ - Longer dotted strings (`1.2.3.4.5`) - trailing `.` blocked by lookahead
159
159
 
160
160
  IPv6 regex requires at least 5 segments to avoid false-positives on time strings (`12:34`, `12:34:56`).
161
161
 
162
- ### R8 stable-pseudonym
162
+ ### R8 - stable-pseudonym
163
163
 
164
- **Replaces:** Nothing in payload text R8 is a **separate utility export** (`stablePseudonym(userId, repoOrigin)`) the caller invokes when constructing payload metadata.
164
+ **Replaces:** Nothing in payload text - R8 is a **separate utility export** (`stablePseudonym(userId, repoOrigin)`) the caller invokes when constructing payload metadata.
165
165
 
166
166
  **Why:** Maintainers want to group reports from the same user-and-repo without ever seeing identity. A deterministic 8-char hex pseudonym = `sha256(userId + ':' + normalized_repo_origin)[:8]` gives them that grouping key. Same user + same repo always hashes to the same 8 chars; different inputs produce different outputs. The URL normalization (strip protocol prefix, strip `.git`, lowercase) makes the hash stable across `git@github.com:foo/bar.git` and `https://github.com/foo/bar` shapes of the same origin.
167
167
 
@@ -173,17 +173,17 @@ repoOrigin: 'git@github.com:foo/bar.git'
173
173
  pseudonym: 'a1b2c3d4'
174
174
  ```
175
175
 
176
- **Coverage notes:** Defensive sentinel if either input is falsy, returns `'00000000'` so call sites never crash on missing inputs. Caller may check for the sentinel if it matters. The `:` separator between userId and repoOrigin prevents collisions between `userId='a' + repoOrigin='bcd'` and `userId='abc' + repoOrigin='d'`.
176
+ **Coverage notes:** Defensive sentinel - if either input is falsy, returns `'00000000'` so call sites never crash on missing inputs. Caller may check for the sentinel if it matters. The `:` separator between userId and repoOrigin prevents collisions between `userId='a' + repoOrigin='bcd'` and `userId='abc' + repoOrigin='d'`.
177
177
 
178
178
  ## Consumed by
179
179
 
180
- - **`scripts/lib/pseudonymize.cjs`** implements R1..R8. The module's `RULES` manifest constant has a 1:1 correspondence with the sections above (R1..R8 ids match `RULES[i].id`).
181
- - **Plan 30-02 (payload assembly)** composes Phase 22 redaction + Phase 30 pseudonymization.
182
- - **Plan 30-04 (consent prompt)** uses the `replacements` log returned by `pseudonymize()` to display "X replacements made (R1: 3, R2: 5, ...)" summary before the user submits.
183
- - **Plan 30-07 (`/gdd:update --show-privacy-diff`)** diffs this document plus `pseudonymize.cjs` between installed and target versions of the plugin. Always-show on first run after upgrade that touched these files; opt-in afterward (CONTEXT D-09).
180
+ - **`scripts/lib/pseudonymize.cjs`** - implements R1..R8. The module's `RULES` manifest constant has a 1:1 correspondence with the sections above (R1..R8 ids match `RULES[i].id`).
181
+ - **Plan 30-02 (payload assembly)** - composes Phase 22 redaction + Phase 30 pseudonymization.
182
+ - **Plan 30-04 (consent prompt)** - uses the `replacements` log returned by `pseudonymize()` to display "X replacements made (R1: 3, R2: 5, ...)" summary before the user submits.
183
+ - **Plan 30-07 (`/gdd:update --show-privacy-diff`)** - diffs this document plus `pseudonymize.cjs` between installed and target versions of the plugin. Always-show on first run after upgrade that touched these files; opt-in afterward (CONTEXT D-09).
184
184
 
185
185
  ## See also
186
186
 
187
- - `scripts/lib/redact.cjs` (Phase 22) secrets-stripping prerequisite layer in the payload pipeline.
188
- - `.planning/phases/30-issue-reporter/CONTEXT.md` D-01 pseudonymization-not-anonymization framing; D-13 synthetic-fixtures-plus-tmpdir test contract.
189
- - `reference/registry.json` registry entry for this document (`name: 'pseudonymization-rules'`, `phase: 30`, `type: 'meta-rules'`).
187
+ - `scripts/lib/redact.cjs` (Phase 22) - secrets-stripping prerequisite layer in the payload pipeline.
188
+ - `.planning/phases/30-issue-reporter/CONTEXT.md` - D-01 pseudonymization-not-anonymization framing; D-13 synthetic-fixtures-plus-tmpdir test contract.
189
+ - `reference/registry.json` - registry entry for this document (`name: 'pseudonymization-rules'`, `phase: 30`, `type: 'meta-rules'`).