@hegemonart/get-design-done 1.42.0 → 1.43.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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +1080 -1038
- package/README.md +157 -155
- package/SKILL.md +42 -42
- package/agents/README.md +53 -53
- package/agents/a11y-mapper.md +3 -3
- package/agents/component-benchmark-harvester.md +8 -8
- package/agents/component-benchmark-synthesizer.md +11 -11
- package/agents/component-taxonomy-mapper.md +5 -5
- package/agents/compose-executor.md +25 -25
- package/agents/conflict-resolver.md +8 -8
- package/agents/cost-forecaster.md +12 -12
- package/agents/decision-journal-exporter.md +5 -5
- package/agents/design-advisor.md +19 -19
- package/agents/design-assumptions-analyzer.md +16 -16
- package/agents/design-auditor.md +39 -39
- package/agents/design-authority-watcher.md +28 -28
- package/agents/design-component-generator.md +27 -27
- package/agents/design-context-builder.md +66 -66
- package/agents/design-context-checker-gate.md +5 -5
- package/agents/design-context-checker.md +20 -20
- package/agents/design-discussant.md +23 -23
- package/agents/design-doc-writer.md +12 -12
- package/agents/design-executor.md +38 -38
- package/agents/design-figma-writer.md +31 -31
- package/agents/design-fixer.md +27 -27
- package/agents/design-integration-checker-gate.md +5 -5
- package/agents/design-integration-checker.md +29 -29
- package/agents/design-paper-writer.md +14 -14
- package/agents/design-pattern-mapper.md +9 -9
- package/agents/design-pencil-writer.md +12 -12
- package/agents/design-phase-researcher.md +14 -14
- package/agents/design-plan-checker.md +13 -13
- package/agents/design-planner.md +24 -24
- package/agents/design-reflector.md +48 -48
- package/agents/design-research-synthesizer.md +21 -21
- package/agents/design-start-writer.md +7 -7
- package/agents/design-update-checker.md +8 -8
- package/agents/design-verifier-gate.md +5 -5
- package/agents/design-verifier.md +80 -80
- package/agents/ds-generator.md +14 -14
- package/agents/ds-migration-planner.md +12 -12
- package/agents/email-executor.md +26 -26
- package/agents/experiment-result-ingester.md +10 -10
- package/agents/flutter-executor.md +28 -28
- package/agents/gdd-graph-refresh.md +10 -10
- package/agents/gdd-intel-updater.md +11 -11
- package/agents/gdd-learnings-extractor.md +2 -2
- package/agents/motion-mapper.md +8 -8
- package/agents/motion-verifier.md +16 -16
- package/agents/pdf-executor.md +27 -27
- package/agents/perf-analyzer.md +20 -20
- package/agents/pr-commenter.md +24 -24
- package/agents/prototype-gate.md +29 -29
- package/agents/quality-gate-runner.md +21 -21
- package/agents/rollout-coordinator.md +8 -8
- package/agents/swift-executor.md +41 -41
- package/agents/ticket-sync-agent.md +19 -19
- package/agents/token-mapper.md +6 -6
- package/agents/user-research-synthesizer.md +13 -13
- package/agents/visual-hierarchy-mapper.md +2 -2
- package/dist/claude-code/.claude/skills/add-backlog/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/analyze-dependencies/SKILL.md +10 -10
- package/dist/claude-code/.claude/skills/apply-reflections/SKILL.md +13 -13
- package/dist/claude-code/.claude/skills/apply-reflections/apply-reflections-procedure.md +20 -20
- package/dist/claude-code/.claude/skills/audit/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/bandit-status/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/benchmark/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/bootstrap-ds/SKILL.md +10 -10
- package/dist/claude-code/.claude/skills/brief/SKILL.md +20 -20
- package/dist/claude-code/.claude/skills/budget/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/cache-manager/SKILL.md +6 -6
- package/dist/claude-code/.claude/skills/cache-manager/cache-policy.md +5 -5
- package/dist/claude-code/.claude/skills/check-update/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/compare/SKILL.md +15 -15
- package/dist/claude-code/.claude/skills/compare/compare-rubric.md +17 -17
- package/dist/claude-code/.claude/skills/complete-cycle/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/connections/SKILL.md +11 -11
- package/dist/claude-code/.claude/skills/connections/connections-onboarding.md +76 -76
- package/dist/claude-code/.claude/skills/continue/SKILL.md +2 -2
- package/dist/claude-code/.claude/skills/darkmode/SKILL.md +17 -17
- package/dist/claude-code/.claude/skills/darkmode/darkmode-audit-procedure.md +7 -7
- package/dist/claude-code/.claude/skills/debug/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/debug/debug-feedback-loops.md +12 -12
- package/dist/claude-code/.claude/skills/design/SKILL.md +12 -12
- package/dist/claude-code/.claude/skills/design/design-procedure.md +23 -23
- package/dist/claude-code/.claude/skills/discover/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/discover/discover-procedure.md +18 -18
- package/dist/claude-code/.claude/skills/discuss/SKILL.md +12 -12
- package/dist/claude-code/.claude/skills/do/SKILL.md +1 -1
- package/dist/claude-code/.claude/skills/explore/SKILL.md +21 -21
- package/dist/claude-code/.claude/skills/explore/explore-procedure.md +48 -48
- package/dist/claude-code/.claude/skills/export/SKILL.md +9 -9
- package/dist/claude-code/.claude/skills/extract-learnings/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/fast/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/figma-extract/SKILL.md +11 -11
- package/dist/claude-code/.claude/skills/figma-write/SKILL.md +6 -6
- package/dist/claude-code/.claude/skills/graphify/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/health/SKILL.md +16 -16
- package/dist/claude-code/.claude/skills/health/health-mcp-detection.md +3 -3
- package/dist/claude-code/.claude/skills/health/health-skill-length-report.md +6 -6
- package/dist/claude-code/.claude/skills/help/SKILL.md +1 -1
- package/dist/claude-code/.claude/skills/list-assumptions/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/map/SKILL.md +12 -12
- package/dist/claude-code/.claude/skills/migrate/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/new-cycle/SKILL.md +2 -2
- package/dist/claude-code/.claude/skills/new-cycle/milestone-completeness-rubric.md +16 -16
- package/dist/claude-code/.claude/skills/new-project/SKILL.md +1 -1
- package/dist/claude-code/.claude/skills/next/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/note/SKILL.md +1 -1
- package/dist/claude-code/.claude/skills/openrouter-status/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/optimize/SKILL.md +15 -15
- package/dist/claude-code/.claude/skills/pause/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/peer-cli-add/SKILL.md +11 -11
- package/dist/claude-code/.claude/skills/peer-cli-add/peer-cli-protocol.md +39 -39
- package/dist/claude-code/.claude/skills/peer-cli-customize/SKILL.md +14 -14
- package/dist/claude-code/.claude/skills/peers/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/plan/SKILL.md +13 -13
- package/dist/claude-code/.claude/skills/plan/plan-procedure.md +24 -24
- package/dist/claude-code/.claude/skills/plant-seed/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/pr-branch/SKILL.md +2 -2
- package/dist/claude-code/.claude/skills/progress/SKILL.md +15 -15
- package/dist/claude-code/.claude/skills/quality-gate/SKILL.md +22 -22
- package/dist/claude-code/.claude/skills/quality-gate/threat-modeling.md +19 -19
- package/dist/claude-code/.claude/skills/quick/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/reapply-patches/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/reflect/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/reflect/procedures/capability-gap-scan.md +11 -11
- package/dist/claude-code/.claude/skills/report-issue/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/report-issue/report-issue-procedure.md +27 -27
- package/dist/claude-code/.claude/skills/resume/SKILL.md +9 -9
- package/dist/claude-code/.claude/skills/review-backlog/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/review-decisions/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/roi/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/rollout-status/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/router/SKILL.md +11 -11
- package/dist/claude-code/.claude/skills/router/capability-gap-emitter.md +6 -6
- package/dist/claude-code/.claude/skills/router/router-pick-emitter.md +9 -9
- package/dist/claude-code/.claude/skills/router/router-rules.md +7 -7
- package/dist/claude-code/.claude/skills/scan/SKILL.md +16 -16
- package/dist/claude-code/.claude/skills/scan/scan-procedure.md +42 -42
- package/dist/claude-code/.claude/skills/settings/SKILL.md +2 -2
- package/dist/claude-code/.claude/skills/ship/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/sketch/SKILL.md +10 -10
- package/dist/claude-code/.claude/skills/sketch-wrap-up/SKILL.md +12 -12
- package/dist/claude-code/.claude/skills/skill-manifest/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/spike/SKILL.md +7 -7
- package/dist/claude-code/.claude/skills/spike-wrap-up/SKILL.md +13 -13
- package/dist/claude-code/.claude/skills/start/SKILL.md +8 -8
- package/dist/claude-code/.claude/skills/start/start-procedure.md +9 -9
- package/dist/claude-code/.claude/skills/stats/SKILL.md +5 -5
- package/dist/claude-code/.claude/skills/style/SKILL.md +12 -12
- package/dist/claude-code/.claude/skills/style/style-doc-procedure.md +12 -12
- package/dist/claude-code/.claude/skills/synthesize/SKILL.md +10 -10
- package/dist/claude-code/.claude/skills/timeline/SKILL.md +4 -4
- package/dist/claude-code/.claude/skills/todo/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/turn-closeout/SKILL.md +10 -10
- package/dist/claude-code/.claude/skills/unlock-decision/SKILL.md +3 -3
- package/dist/claude-code/.claude/skills/update/SKILL.md +9 -9
- package/dist/claude-code/.claude/skills/using-gdd/SKILL.md +17 -17
- package/dist/claude-code/.claude/skills/verify/SKILL.md +13 -13
- package/dist/claude-code/.claude/skills/verify/verify-procedure.md +34 -34
- package/dist/claude-code/.claude/skills/warm-cache/SKILL.md +8 -8
- package/dist/claude-code/.claude/skills/watch-authorities/SKILL.md +9 -9
- package/dist/claude-code/.claude/skills/zoom-out/SKILL.md +4 -4
- package/package.json +5 -2
- package/reference/DEPRECATIONS.md +10 -10
- package/reference/STATE-TEMPLATE.md +26 -26
- package/reference/accessibility.md +13 -13
- package/reference/adr-format.md +13 -13
- package/reference/ai-native-tool-interface.md +5 -5
- package/reference/anti-patterns.md +9 -9
- package/reference/architecture-vocabulary.md +31 -31
- package/reference/audit-scoring.md +13 -13
- package/reference/authority-feeds.md +36 -36
- package/reference/bandit-integration.md +25 -25
- package/reference/brand-voice.md +36 -36
- package/reference/capability-gap-stage-gate.md +20 -20
- package/reference/checklists.md +26 -26
- package/reference/cli-localization.md +13 -13
- package/reference/codex-tools.md +2 -2
- package/reference/color-theory.md +28 -28
- package/reference/component-authoring.md +4 -4
- package/reference/components/README.md +13 -13
- package/reference/components/TEMPLATE.md +13 -13
- package/reference/components/accordion.md +15 -15
- package/reference/components/alert.md +25 -25
- package/reference/components/badge.md +18 -18
- package/reference/components/breadcrumbs.md +24 -24
- package/reference/components/button.md +21 -21
- package/reference/components/card.md +13 -13
- package/reference/components/checkbox.md +20 -20
- package/reference/components/chip.md +20 -20
- package/reference/components/command-palette.md +15 -15
- package/reference/components/date-picker.md +22 -22
- package/reference/components/drawer.md +13 -13
- package/reference/components/file-upload.md +22 -22
- package/reference/components/input.md +18 -18
- package/reference/components/label.md +25 -25
- package/reference/components/link.md +19 -19
- package/reference/components/list.md +17 -17
- package/reference/components/menu.md +19 -19
- package/reference/components/modal-dialog.md +16 -16
- package/reference/components/navbar.md +19 -19
- package/reference/components/pagination.md +18 -18
- package/reference/components/popover.md +12 -12
- package/reference/components/progress.md +18 -18
- package/reference/components/radio.md +17 -17
- package/reference/components/rich-text-editor.md +24 -24
- package/reference/components/select-combobox.md +16 -16
- package/reference/components/sidebar.md +15 -15
- package/reference/components/skeleton.md +20 -20
- package/reference/components/slider.md +20 -20
- package/reference/components/stepper.md +24 -24
- package/reference/components/switch.md +19 -19
- package/reference/components/table.md +21 -21
- package/reference/components/tabs.md +11 -11
- package/reference/components/toast.md +19 -19
- package/reference/components/tooltip.md +19 -19
- package/reference/components/tree.md +17 -17
- package/reference/composition.md +38 -38
- package/reference/config-schema.md +37 -37
- package/reference/context-md-format.md +9 -9
- package/reference/contrast-advanced.md +29 -29
- package/reference/conversational-ui.md +17 -17
- package/reference/cost-governance.md +14 -14
- package/reference/css-grid-layout.md +8 -8
- package/reference/cycle-handoff-preamble.md +3 -3
- package/reference/data-visualization.md +67 -67
- package/reference/debugger-philosophy.md +5 -5
- package/reference/design-system-guidance.md +21 -21
- package/reference/design-systems-catalog.md +20 -20
- package/reference/design-variants.md +11 -11
- package/reference/domains/civic-patterns.md +10 -10
- package/reference/domains/finance-patterns.md +9 -9
- package/reference/domains/gaming-patterns.md +9 -9
- package/reference/domains/healthcare-patterns.md +11 -11
- package/reference/ds-bootstrap-rubric.md +13 -13
- package/reference/email-design.md +22 -22
- package/reference/emotional-design.md +10 -10
- package/reference/error-recovery.md +11 -11
- package/reference/export-formats.md +7 -7
- package/reference/figma-sandbox.md +6 -6
- package/reference/first-principles.md +10 -10
- package/reference/form-patterns.md +26 -26
- package/reference/framer-motion-patterns.md +49 -49
- package/reference/gdd-runtime-audit.md +17 -17
- package/reference/gdd-threat-model.md +44 -44
- package/reference/gemini-tools.md +3 -3
- package/reference/gestalt.md +24 -24
- package/reference/heuristics.md +32 -32
- package/reference/i18n.md +44 -44
- package/reference/iconography.md +24 -24
- package/reference/image-optimization.md +14 -14
- package/reference/information-architecture.md +47 -47
- package/reference/intel-schema.md +1 -1
- package/reference/known-failure-modes.md +37 -37
- package/reference/meta-rules.md +5 -5
- package/reference/migrations/material-3-to-4.md +17 -17
- package/reference/migrations/mui-v6.md +16 -16
- package/reference/migrations/shadcn-v2.md +25 -25
- package/reference/migrations/tailwind-v4.md +21 -21
- package/reference/model-prices.md +3 -3
- package/reference/model-tiers.md +40 -40
- package/reference/motion-advanced.md +21 -21
- package/reference/motion-easings.md +29 -29
- package/reference/motion-interpolate.md +1 -1
- package/reference/motion-spring.md +13 -13
- package/reference/motion-transition-taxonomy.md +34 -34
- package/reference/motion.md +31 -31
- package/reference/multi-author-model.md +13 -13
- package/reference/native-platforms.md +28 -28
- package/reference/notification-routing.md +6 -6
- package/reference/onboarding-progressive-disclosure.md +32 -32
- package/reference/openrouter-tier-mapping.md +8 -8
- package/reference/palette-catalog.md +37 -37
- package/reference/parallelism-rules.md +20 -20
- package/reference/peer-cli-capabilities.md +14 -14
- package/reference/peer-protocols.md +21 -21
- package/reference/perf-budget.md +21 -21
- package/reference/performance.md +22 -22
- package/reference/platforms.md +51 -51
- package/reference/pr-review-integration.md +7 -7
- package/reference/prices/antigravity.md +3 -3
- package/reference/prices/augment.md +3 -3
- package/reference/prices/claude.md +2 -2
- package/reference/prices/cline.md +4 -4
- package/reference/prices/codebuddy.md +3 -3
- package/reference/prices/codex.md +2 -2
- package/reference/prices/copilot.md +3 -3
- package/reference/prices/cursor.md +3 -3
- package/reference/prices/gemini.md +2 -2
- package/reference/prices/kilo.md +3 -3
- package/reference/prices/opencode.md +4 -4
- package/reference/prices/qwen.md +2 -2
- package/reference/prices/trae.md +3 -3
- package/reference/prices/windsurf.md +3 -3
- package/reference/prices.openrouter.md +5 -5
- package/reference/print-design.md +36 -36
- package/reference/priority-matrix.md +2 -2
- package/reference/project-skills-guide.md +3 -3
- package/reference/proportion-systems.md +23 -23
- package/reference/pseudonymization-rules.md +30 -30
- package/reference/retrieval-contract.md +14 -14
- package/reference/review-format.md +7 -7
- package/reference/rollout-coordination.md +10 -10
- package/reference/rtl-cjk-cultural.md +39 -39
- package/reference/runtime-models.md +28 -28
- package/reference/shared-preamble.md +26 -26
- package/reference/skill-authoring-contract.md +16 -16
- package/reference/skill-placeholders.md +3 -3
- package/reference/start-interview.md +10 -10
- package/reference/style-vocabulary.md +25 -25
- package/reference/surfaces.md +4 -4
- package/reference/ticket-sync.md +9 -9
- package/reference/typography.md +64 -64
- package/reference/user-research.md +54 -54
- package/reference/variable-fonts-loading.md +15 -15
- package/reference/visual-hierarchy-layout.md +41 -41
- package/scripts/lib/manifest/prose-denylist.json +1 -1
- package/skills/add-backlog/SKILL.md +3 -3
- package/skills/analyze-dependencies/SKILL.md +10 -10
- package/skills/apply-reflections/SKILL.md +13 -13
- package/skills/apply-reflections/apply-reflections-procedure.md +20 -20
- package/skills/audit/SKILL.md +7 -7
- package/skills/bandit-status/SKILL.md +7 -7
- package/skills/benchmark/SKILL.md +7 -7
- package/skills/bootstrap-ds/SKILL.md +10 -10
- package/skills/brief/SKILL.md +20 -20
- package/skills/budget/SKILL.md +4 -4
- package/skills/cache-manager/SKILL.md +6 -6
- package/skills/cache-manager/cache-policy.md +5 -5
- package/skills/check-update/SKILL.md +5 -5
- package/skills/compare/SKILL.md +15 -15
- package/skills/compare/compare-rubric.md +17 -17
- package/skills/complete-cycle/SKILL.md +5 -5
- package/skills/connections/SKILL.md +11 -11
- package/skills/connections/connections-onboarding.md +76 -76
- package/skills/continue/SKILL.md +2 -2
- package/skills/darkmode/SKILL.md +17 -17
- package/skills/darkmode/darkmode-audit-procedure.md +7 -7
- package/skills/debug/SKILL.md +3 -3
- package/skills/debug/debug-feedback-loops.md +12 -12
- package/skills/design/SKILL.md +12 -12
- package/skills/design/design-procedure.md +23 -23
- package/skills/discover/SKILL.md +7 -7
- package/skills/discover/discover-procedure.md +18 -18
- package/skills/discuss/SKILL.md +12 -12
- package/skills/do/SKILL.md +1 -1
- package/skills/explore/SKILL.md +21 -21
- package/skills/explore/explore-procedure.md +48 -48
- package/skills/export/SKILL.md +9 -9
- package/skills/extract-learnings/SKILL.md +5 -5
- package/skills/fast/SKILL.md +7 -7
- package/skills/figma-extract/SKILL.md +11 -11
- package/skills/figma-write/SKILL.md +6 -6
- package/skills/graphify/SKILL.md +4 -4
- package/skills/health/SKILL.md +16 -16
- package/skills/health/health-mcp-detection.md +3 -3
- package/skills/health/health-skill-length-report.md +6 -6
- package/skills/help/SKILL.md +1 -1
- package/skills/list-assumptions/SKILL.md +4 -4
- package/skills/map/SKILL.md +12 -12
- package/skills/migrate/SKILL.md +5 -5
- package/skills/new-cycle/SKILL.md +2 -2
- package/skills/new-cycle/milestone-completeness-rubric.md +16 -16
- package/skills/new-project/SKILL.md +1 -1
- package/skills/next/SKILL.md +5 -5
- package/skills/note/SKILL.md +1 -1
- package/skills/openrouter-status/SKILL.md +4 -4
- package/skills/optimize/SKILL.md +15 -15
- package/skills/pause/SKILL.md +5 -5
- package/skills/peer-cli-add/SKILL.md +11 -11
- package/skills/peer-cli-add/peer-cli-protocol.md +39 -39
- package/skills/peer-cli-customize/SKILL.md +14 -14
- package/skills/peers/SKILL.md +4 -4
- package/skills/plan/SKILL.md +13 -13
- package/skills/plan/plan-procedure.md +24 -24
- package/skills/plant-seed/SKILL.md +4 -4
- package/skills/pr-branch/SKILL.md +2 -2
- package/skills/progress/SKILL.md +15 -15
- package/skills/quality-gate/SKILL.md +22 -22
- package/skills/quality-gate/threat-modeling.md +19 -19
- package/skills/quick/SKILL.md +5 -5
- package/skills/reapply-patches/SKILL.md +7 -7
- package/skills/reflect/SKILL.md +3 -3
- package/skills/reflect/procedures/capability-gap-scan.md +11 -11
- package/skills/report-issue/SKILL.md +5 -5
- package/skills/report-issue/report-issue-procedure.md +27 -27
- package/skills/resume/SKILL.md +9 -9
- package/skills/review-backlog/SKILL.md +3 -3
- package/skills/review-decisions/SKILL.md +3 -3
- package/skills/roi/SKILL.md +5 -5
- package/skills/rollout-status/SKILL.md +4 -4
- package/skills/router/SKILL.md +11 -11
- package/skills/router/capability-gap-emitter.md +6 -6
- package/skills/router/router-pick-emitter.md +9 -9
- package/skills/router/router-rules.md +7 -7
- package/skills/scan/SKILL.md +16 -16
- package/skills/scan/scan-procedure.md +42 -42
- package/skills/settings/SKILL.md +2 -2
- package/skills/ship/SKILL.md +7 -7
- package/skills/sketch/SKILL.md +10 -10
- package/skills/sketch-wrap-up/SKILL.md +12 -12
- package/skills/skill-manifest/SKILL.md +5 -5
- package/skills/spike/SKILL.md +7 -7
- package/skills/spike-wrap-up/SKILL.md +13 -13
- package/skills/start/SKILL.md +8 -8
- package/skills/start/start-procedure.md +9 -9
- package/skills/stats/SKILL.md +5 -5
- package/skills/style/SKILL.md +12 -12
- package/skills/style/style-doc-procedure.md +12 -12
- package/skills/synthesize/SKILL.md +10 -10
- package/skills/timeline/SKILL.md +4 -4
- package/skills/todo/SKILL.md +3 -3
- package/skills/turn-closeout/SKILL.md +10 -10
- package/skills/unlock-decision/SKILL.md +3 -3
- package/skills/update/SKILL.md +9 -9
- package/skills/using-gdd/SKILL.md +17 -17
- package/skills/verify/SKILL.md +13 -13
- package/skills/verify/verify-procedure.md +34 -34
- package/skills/warm-cache/SKILL.md +8 -8
- package/skills/watch-authorities/SKILL.md +9 -9
- package/skills/zoom-out/SKILL.md +4 -4
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Windsurf
|
|
1
|
+
# Windsurf - Price Table (stub)
|
|
2
2
|
|
|
3
3
|
**Runtime:** `windsurf` (Windsurf / Codeium)
|
|
4
|
-
**Phase 26 D-08 sub-table
|
|
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>`
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
26
|
-
- **Drift.** The authority-watcher diffs the catalog weekly and surfaces `deprecated`/`withdrawn` models matching a configured `openrouter_tier_overrides` pin (SC#8)
|
|
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
|
|
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
|
|
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**
|
|
19
|
-
| `reference/native-platforms.md` (Phase 34.1) | The native **token bridge**
|
|
20
|
-
| `reference/email-design.md` (Phase 34.2) | The email **constraint catalogue**
|
|
21
|
-
| `reference/print-design.md` (Phase 34.3, this file) | The print **constraint catalogue**
|
|
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
|
|
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
|
|
59
|
-
continuous viewport
|
|
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
|
|
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
|
|
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)
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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**
|
|
166
|
-
| PR-COLOR-02 | **Trap/registration**
|
|
167
|
-
| PR-COLOR-03 | **True vector tessellation**
|
|
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**
|
|
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**
|
|
182
|
-
| **PR-BLEED-01** | A bleed box / crop-marks signal is present (`bleed:` / `marks:` / a documented bleed-marks note) | **YES**
|
|
183
|
-
| **PR-CMYK-01** | A CMYK-awareness signal is present (`cmyk(` / `color-profile` / `@color-profile` / a CMYK note) | **YES**
|
|
184
|
-
| **PR-FONT-01** | A font-embed signal is present (`@font-face` with `src:` / a font-embed/outline note) | **YES**
|
|
185
|
-
| **PR-DPI-01** | A 300dpi raster-fallback signal is present (`image-resolution:` / `min-resolution` / a 300dpi note) | **YES**
|
|
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
|
|
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
|
|
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)
|
|
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)
|
|
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)
|
|
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
|
-
|
|
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)
|
|
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
|
|
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
|
|
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`
|
|
9
|
-
- `plan`
|
|
10
|
-
- `design`
|
|
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
|
|
10
|
+
# Proportion Systems - Whole-UI Modular Relationships
|
|
11
11
|
|
|
12
|
-
The existing [typography reference](./typography.md) covers the modular type scale
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
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
|
|
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
|
|
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)
|
|
262
|
-
- [typography.md](./typography.md) §Type Scale Systems
|
|
263
|
-
- [style-vocabulary.md](./style-vocabulary.md)
|
|
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
|
|
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
|
|
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
|
|
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
|
|
32
|
-
| Identity (privacy) | `scripts/lib/pseudonymize.cjs` | Names, paths, hostnames, repo origins, env-var values, emails, IPs
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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`)
|
|
156
|
-
- Email-adjacent strings (`@1.2.3.4`)
|
|
157
|
-
- Date strings (`2026-05-20`)
|
|
158
|
-
- Longer dotted strings (`1.2.3.4.5`)
|
|
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
|
|
162
|
+
### R8 - stable-pseudonym
|
|
163
163
|
|
|
164
|
-
**Replaces:** Nothing in payload text
|
|
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
|
|
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`**
|
|
181
|
-
- **Plan 30-02 (payload assembly)**
|
|
182
|
-
- **Plan 30-04 (consent prompt)**
|
|
183
|
-
- **Plan 30-07 (`/gdd:update --show-privacy-diff`)**
|
|
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)
|
|
188
|
-
- `.planning/phases/30-issue-reporter/CONTEXT.md`
|
|
189
|
-
- `reference/registry.json`
|
|
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'`).
|