@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
package/reference/heuristics.md
CHANGED
|
@@ -4,7 +4,7 @@ Use this during Discover (identifying real problems), Plan (determining what to
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
## Nielsen Norman Group
|
|
7
|
+
## Nielsen Norman Group - 10 Usability Heuristics
|
|
8
8
|
|
|
9
9
|
The baseline evaluation framework. Score each 0–4 (0=violation, 4=excellent). Include in audit output.
|
|
10
10
|
|
|
@@ -56,7 +56,7 @@ Minimize the user's memory load by making objects, actions, and options visible.
|
|
|
56
56
|
- **Fail cases**: Users must remember previous step's data, keyboard shortcuts only without visual hints
|
|
57
57
|
|
|
58
58
|
### H-07: Flexibility and Efficiency of Use
|
|
59
|
-
Accelerators
|
|
59
|
+
Accelerators - unseen by the novice user - allow experts to speed up interaction.
|
|
60
60
|
- Keyboard shortcuts for power users
|
|
61
61
|
- Bulk actions for lists
|
|
62
62
|
- Saved searches/filters
|
|
@@ -93,19 +93,19 @@ Even though it is better if the system can be used without documentation, it may
|
|
|
93
93
|
|
|
94
94
|
Use during layout and visual hierarchy decisions.
|
|
95
95
|
|
|
96
|
-
**Proximity**
|
|
96
|
+
**Proximity** - Elements close together are perceived as related. Use: group related controls (8–16px between group members, 32–64px between groups).
|
|
97
97
|
|
|
98
|
-
**Similarity**
|
|
98
|
+
**Similarity** - Elements looking alike are perceived as the same type. Use: consistent styling for all links, all CTAs, all destructive actions.
|
|
99
99
|
|
|
100
|
-
**Continuity**
|
|
100
|
+
**Continuity** - The eye follows lines and curves. Use: align elements to create reading flow (left-to-right, top-to-bottom).
|
|
101
101
|
|
|
102
|
-
**Closure**
|
|
102
|
+
**Closure** - The mind fills in incomplete shapes. Use: card borders can be implied by spacing and background difference alone.
|
|
103
103
|
|
|
104
|
-
**Figure/Ground**
|
|
104
|
+
**Figure/Ground** - Foreground vs background differentiation. Use: modals and overlays need clear depth separation (shadow, blur, dimming).
|
|
105
105
|
|
|
106
|
-
**Common Fate**
|
|
106
|
+
**Common Fate** - Elements moving together are perceived as a group. Use: animation groups related elements together - stagger within groups, not across.
|
|
107
107
|
|
|
108
|
-
**Prägnanz (Simplicity)**
|
|
108
|
+
**Prägnanz (Simplicity)** - The mind perceives the simplest possible interpretation. Use: reduce visual complexity. If 2 elements can do the job of 5, use 2.
|
|
109
109
|
|
|
110
110
|
---
|
|
111
111
|
|
|
@@ -115,8 +115,8 @@ Use during layout and visual hierarchy decisions.
|
|
|
115
115
|
|
|
116
116
|
Time to click = function of distance / target size. Implications:
|
|
117
117
|
- Minimum touch target: **44×44pt** (iOS), **48×48dp** (Android). Never smaller.
|
|
118
|
-
- Destructive actions (Delete, Cancel) must be **physically far** from primary actions OR significantly smaller
|
|
119
|
-
- Screen edges and corners are fast (infinite size in that direction)
|
|
118
|
+
- Destructive actions (Delete, Cancel) must be **physically far** from primary actions OR significantly smaller - not adjacent at the same size.
|
|
119
|
+
- Screen edges and corners are fast (infinite size in that direction) - use for primary navigation (iOS bottom bar, macOS menu bar).
|
|
120
120
|
- Dense interfaces that require clicking small targets = high error rate + user frustration.
|
|
121
121
|
|
|
122
122
|
---
|
|
@@ -148,7 +148,7 @@ Working memory holds approximately **5–9 items**. Implications:
|
|
|
148
148
|
Users remember the **first** and **last** items in a list best (primacy and recency). Implications:
|
|
149
149
|
- Put most important actions first and last in navigation.
|
|
150
150
|
- In long forms, critical fields go near the top or after a clear section break.
|
|
151
|
-
- CTAs at the bottom of long pages work (recency)
|
|
151
|
+
- CTAs at the bottom of long pages work (recency) - but add one above the fold too (primacy).
|
|
152
152
|
|
|
153
153
|
---
|
|
154
154
|
|
|
@@ -156,8 +156,8 @@ Users remember the **first** and **last** items in a list best (primacy and rece
|
|
|
156
156
|
|
|
157
157
|
The item that **differs** from its group is most memorable. Implications:
|
|
158
158
|
- One primary CTA per screen (contrast makes it memorable).
|
|
159
|
-
- Don't use "primary" styling on 3 different buttons
|
|
160
|
-
- Highlight key data points in tables (bold, color accent)
|
|
159
|
+
- Don't use "primary" styling on 3 different buttons - only one stands out.
|
|
160
|
+
- Highlight key data points in tables (bold, color accent) - but only the truly key ones.
|
|
161
161
|
- Overuse of emphasis = no emphasis. Use it for 1–2 items per view maximum.
|
|
162
162
|
|
|
163
163
|
---
|
|
@@ -183,10 +183,10 @@ People **remember incomplete tasks** better than completed ones. Implications:
|
|
|
183
183
|
|
|
184
184
|
## Peak-End Rule
|
|
185
185
|
|
|
186
|
-
Users judge an experience primarily by how it felt at its most intense moment (the **peak**) and how it ended
|
|
186
|
+
Users judge an experience primarily by how it felt at its most intense moment (the **peak**) and how it ended - not by the average across the whole session. Implications:
|
|
187
187
|
- Design a deliberate positive peak in every primary flow (e.g., a celebratory completion screen, an instant result, a delightful empty state).
|
|
188
188
|
- The **end state** of a flow matters disproportionately: the last screen the user sees shapes their memory of the whole interaction.
|
|
189
|
-
- Reduce negative peaks first (error states, loading hangs)
|
|
189
|
+
- Reduce negative peaks first (error states, loading hangs) - they weigh heavier than neutral moments.
|
|
190
190
|
- A long frustrating form followed by a satisfying completion screen is remembered more positively than a mildly annoying end to an otherwise smooth flow.
|
|
191
191
|
|
|
192
192
|
---
|
|
@@ -195,7 +195,7 @@ Users judge an experience primarily by how it felt at its most intense moment (t
|
|
|
195
195
|
|
|
196
196
|
Users feel the pain of loss approximately **twice as strongly** as the pleasure of an equivalent gain (Kahneman & Tversky). Implications:
|
|
197
197
|
- Frame CTAs around what users keep/save, not what they gain: "Don't lose your progress" over "Save your work."
|
|
198
|
-
- Subscription cancellation flows that show what the user will lose (features, data, streak)
|
|
198
|
+
- Subscription cancellation flows that show what the user will lose (features, data, streak) use loss aversion ethically to reduce churn - but only if the stated losses are real.
|
|
199
199
|
- Free trial countdowns ("3 days left") trigger loss aversion more effectively than benefit reminders.
|
|
200
200
|
- Destructive action confirmations should name what is lost: "Delete this project and all 47 files?" not just "Are you sure?"
|
|
201
201
|
|
|
@@ -212,7 +212,7 @@ Working memory is limited to approximately **7 ± 2 chunks** simultaneously (Mil
|
|
|
212
212
|
| **Germane** | Load that builds understanding (learning, pattern recognition) | Preserve and support |
|
|
213
213
|
|
|
214
214
|
Practical rules:
|
|
215
|
-
- Every element of visual noise is extraneous load
|
|
215
|
+
- Every element of visual noise is extraneous load - remove it.
|
|
216
216
|
- New UI patterns create extraneous load (Jakob's Law); use platform conventions.
|
|
217
217
|
- Chunk complex tasks into steps of ≤3 decisions each.
|
|
218
218
|
- Error messages that require decoding ("Error 422") create extraneous load; plain language removes it.
|
|
@@ -221,11 +221,11 @@ Practical rules:
|
|
|
221
221
|
|
|
222
222
|
## Aesthetic-Usability Effect
|
|
223
223
|
|
|
224
|
-
Users perceive **aesthetically pleasing designs as more usable**, even when functionality is identical
|
|
224
|
+
Users perceive **aesthetically pleasing designs as more usable**, even when functionality is identical - and this perception persists through initial usability problems. Implications:
|
|
225
225
|
- A polished visual appearance buys tolerance for minor UX rough edges in early releases.
|
|
226
226
|
- This effect is strongest on first impression; it degrades over time as behavioral friction compounds.
|
|
227
227
|
- The effect can mask genuine usability problems in user testing if participants rate overall satisfaction rather than task completion.
|
|
228
|
-
- Do NOT use the aesthetic-usability effect as a reason to defer fixing usability problems
|
|
228
|
+
- Do NOT use the aesthetic-usability effect as a reason to defer fixing usability problems - it explains tolerance, not satisfaction.
|
|
229
229
|
|
|
230
230
|
---
|
|
231
231
|
|
|
@@ -242,7 +242,7 @@ A system that responds within **400ms** keeps users in a state of flow. Response
|
|
|
242
242
|
|
|
243
243
|
## Flow (Csikszentmihalyi)
|
|
244
244
|
|
|
245
|
-
Users enter a **flow state** when task difficulty matches their skill level exactly
|
|
245
|
+
Users enter a **flow state** when task difficulty matches their skill level exactly - high enough to engage, low enough to feel achievable. Flow is characterized by complete absorption, loss of time awareness, and intrinsic motivation. Implications:
|
|
246
246
|
- Progressive difficulty: onboarding tasks should be trivially easy; expert tasks should provide just enough challenge.
|
|
247
247
|
- Interruptions break flow permanently for that session; avoid modal interruptions in high-focus workflows.
|
|
248
248
|
- Clear goals + immediate feedback are the two design levers for inducing flow (H-01, H-05).
|
|
@@ -257,11 +257,11 @@ For each NNG heuristic (H-01 through H-10), rate 0–4:
|
|
|
257
257
|
|
|
258
258
|
| Score | Meaning |
|
|
259
259
|
|---|---|
|
|
260
|
-
| 4 | Excellent
|
|
261
|
-
| 3 | Passes
|
|
262
|
-
| 2 | Minor violation
|
|
263
|
-
| 1 | Major violation
|
|
264
|
-
| 0 | Critical violation
|
|
260
|
+
| 4 | Excellent - actively exemplifies the heuristic |
|
|
261
|
+
| 3 | Passes - meets the heuristic requirement |
|
|
262
|
+
| 2 | Minor violation - notable issue but not blocking |
|
|
263
|
+
| 1 | Major violation - users will notice and be impacted |
|
|
264
|
+
| 0 | Critical violation - breaks the interface |
|
|
265
265
|
|
|
266
266
|
**Overall Heuristic Score** = (sum / 40) × 100
|
|
267
267
|
|
|
@@ -297,7 +297,7 @@ function dfs(node):
|
|
|
297
297
|
**Bias notes:** the DFS visits each node at most once per traversal, so duplicate cycles
|
|
298
298
|
across multiple entry points are deduped by the `visited` guard. The `path.index(node)`
|
|
299
299
|
slice captures only the cycle suffix; nodes before the entry point are not part of the
|
|
300
|
-
cycle. Pre-existing acyclic chains stay invisible
|
|
300
|
+
cycle. Pre-existing acyclic chains stay invisible - only back-edges surface.
|
|
301
301
|
|
|
302
302
|
---
|
|
303
303
|
|
|
@@ -321,7 +321,7 @@ minor bumps. They register via `OFF_CADENCE_VERSIONS.add('<version>')` in
|
|
|
321
321
|
`tests/semver-compare.test.cjs`. The semver-compare test treats them as if they had a
|
|
322
322
|
canonical predecessor (`v1.28.5` after `v1.28.0`, not `v1.28.4`).
|
|
323
323
|
|
|
324
|
-
**Preview-suffix trap:** model IDs with `-preview` (`gpt-5-preview` vs `gpt-5`) drift
|
|
324
|
+
**Preview-suffix trap:** model IDs with `-preview` (`gpt-5-preview` vs `gpt-5`) drift - today's
|
|
325
325
|
preview is tomorrow's GA. Tooling MUST store the parent name in `provider_model_id` and treat
|
|
326
326
|
the suffix as decorative. See `./peer-cli-protocol.md` for the peer-CLI-side context.
|
|
327
327
|
|
|
@@ -333,22 +333,22 @@ Reference catalog for `skills/optimize/SKILL.md`. Four deterministic rules; rule
|
|
|
333
333
|
analysis applied in order. Each rule inspects per-agent aggregates from
|
|
334
334
|
`.design/agent-metrics.json` and emits zero or more rows to the recommendations table.
|
|
335
335
|
|
|
336
|
-
**R1
|
|
336
|
+
**R1 - Low cache hit rate.**
|
|
337
337
|
- *Condition:* `total_spawns >= --min-spawns` AND `cache_hit_rate < 0.20`.
|
|
338
338
|
- *Emit:* `"Consider batching tasks for agent {agent} — cache hit rate is {rate*100}%. Investigate cache-aligned ordering (see reference/shared-preamble.md) and whether input paths can be normalized."`
|
|
339
339
|
- *Proposed action:* Batch similar tasks; confirm shared-preamble import ordering.
|
|
340
340
|
|
|
341
|
-
**R2
|
|
341
|
+
**R2 - Expensive and rarely lazy-skipped.**
|
|
342
342
|
- *Condition:* `total_cost_usd > 0.50` AND `lazy_skip_rate < 0.10`.
|
|
343
343
|
- *Emit:* `"Agent {agent} is expensive (${cost}) and rarely skipped ({rate*100}% lazy-skip). Consider adding a lazy gate heuristic at agents/{agent}-gate.md (see plan 10.1-04 pattern)."`
|
|
344
344
|
- *Proposed action:* Add lazy-gate agent.
|
|
345
345
|
|
|
346
|
-
**R3
|
|
346
|
+
**R3 - Tier override churn.**
|
|
347
347
|
- *Condition:* Multiple telemetry rows show recorded `tier` differing from frontmatter `default-tier` (e.g., frontmatter `opus` but measured rows consistently `haiku` from budget.json override or soft-threshold downgrade).
|
|
348
348
|
- *Emit:* `"Tier override churn detected for {agent}: frontmatter says {frontmatter-tier} but measured tier is {measured-tier} in {N} of last {M} rows. Consider updating frontmatter default-tier or removing the budget.json override."`
|
|
349
349
|
- *Proposed action:* Update frontmatter default-tier OR prune budget.json `tier_overrides` entry.
|
|
350
350
|
|
|
351
|
-
**R4
|
|
351
|
+
**R4 - Typical duration drift.**
|
|
352
352
|
- *Condition:* Measured `typical_duration_seconds` (computed as avg wall-clock between paired spawn/complete rows; fall back to frontmatter when pairing unavailable) differs from frontmatter `typical-duration-seconds` by more than 50%.
|
|
353
353
|
- *Emit:* `"Typical duration for {agent} has drifted: frontmatter {old}s vs measured {new}s ({delta_pct}% drift). Update frontmatter typical-duration-seconds: {new}."`
|
|
354
354
|
- *Proposed action:* Edit `agents/{agent}.md` frontmatter.
|
package/reference/i18n.md
CHANGED
|
@@ -7,15 +7,15 @@ tags: [i18n, intl, icu, unicode, rtl, multi-script, wcag-i18n]
|
|
|
7
7
|
last_updated: 2026-05-18
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
# i18n
|
|
10
|
+
# i18n - Internationalization Engineering Primitives
|
|
11
11
|
|
|
12
|
-
This file closes a gap: the existing references touch internationalization in fragments
|
|
12
|
+
This file closes a gap: the existing references touch internationalization in fragments - [rtl-cjk-cultural.md](./rtl-cjk-cultural.md) covers cultural context (greeting forms, color symbolism, CJK family-name order), [typography.md](./typography.md) covers font-family stacks, [accessibility.md](./accessibility.md) cites WCAG 3.1.1, [form-patterns.md](./form-patterns.md) cites locale-aware autofill - but none stitch the engineering primitives together. This is the file an agent should consult any time it is writing code that will render a localized string, format a number or date, mirror a layout, truncate user text, or audit a UI for i18n readiness.
|
|
13
13
|
|
|
14
|
-
The boundary is strict and additive. `rtl-cjk-cultural.md` owns the *cultural* layer
|
|
14
|
+
The boundary is strict and additive. `rtl-cjk-cultural.md` owns the *cultural* layer - what gestures and color associations mean in a region, when a name field should accept both family-name-first and given-name-first orders, why a thumbs-up icon is unsafe in parts of the Middle East. This file owns the *code* layer - which CSS property to author, which `Intl.*` API to call, which Unicode normalization form to apply on input, which regex catches a hardcoded English string in a JSX file. Both files are needed; neither replaces the other.
|
|
15
15
|
|
|
16
16
|
## Text Expansion
|
|
17
17
|
|
|
18
|
-
Localized strings expand or contract depending on the target language. A button label that fits in a 96px container in English will overflow at +30% in German, +40% in Russian, and clip cleanly in Japanese. Design must absorb this variation
|
|
18
|
+
Localized strings expand or contract depending on the target language. A button label that fits in a 96px container in English will overflow at +30% in German, +40% in Russian, and clip cleanly in Japanese. Design must absorb this variation - either by sizing containers for the worst-case expansion, by allowing wrapping, or by truncating with grapheme-aware logic. The factors below are conservative aggregates suitable for layout-budget planning and for the verifier overflow-simulation probe documented further down this file.
|
|
19
19
|
|
|
20
20
|
| Locale family | Expansion | Notes |
|
|
21
21
|
| ------------------- | --------- | ------------------------------ |
|
|
@@ -31,7 +31,7 @@ These factors drive width constraints in component design and the verifier overf
|
|
|
31
31
|
|
|
32
32
|
## RTL Mirroring
|
|
33
33
|
|
|
34
|
-
Right-to-left scripts
|
|
34
|
+
Right-to-left scripts - Arabic, Hebrew, Persian, Urdu - do not merely reverse text direction; they reverse the entire spatial logic of the interface. The reading eye enters from the right, "start" becomes the right edge, "end" becomes the left, and every directional affordance must be reconsidered. The engineering rule is to author all spatial CSS in *logical* properties so a single `dir="rtl"` flip on the document root produces a fully mirrored UI with zero per-element overrides.
|
|
35
35
|
|
|
36
36
|
### CSS logical properties
|
|
37
37
|
|
|
@@ -69,7 +69,7 @@ A concrete card component authored entirely in logical props:
|
|
|
69
69
|
}
|
|
70
70
|
```
|
|
71
71
|
|
|
72
|
-
Under `dir="ltr"` the accent border lands on the left edge and the badge floats top-right. Under `dir="rtl"` the same CSS produces an accent border on the right edge and a badge that floats top-left
|
|
72
|
+
Under `dir="ltr"` the accent border lands on the left edge and the badge floats top-right. Under `dir="rtl"` the same CSS produces an accent border on the right edge and a badge that floats top-left - no media query, no override, no separate stylesheet.
|
|
73
73
|
|
|
74
74
|
### `dir="rtl"` cascade rules
|
|
75
75
|
|
|
@@ -89,7 +89,7 @@ Per-element `dir` is reserved for genuinely mixed-direction content (a username
|
|
|
89
89
|
|
|
90
90
|
### Directional-icon flip catalog
|
|
91
91
|
|
|
92
|
-
Not every icon should mirror under RTL. The rule is intent: if the icon means "next in reading order" or "back in reading order", it mirrors; if it means "play this video" or "this is a brand mark" or "this is the digit four", it does not. The catalog below is the working contract
|
|
92
|
+
Not every icon should mirror under RTL. The rule is intent: if the icon means "next in reading order" or "back in reading order", it mirrors; if it means "play this video" or "this is a brand mark" or "this is the digit four", it does not. The catalog below is the working contract - apply `transform: scaleX(-1)` (via a `[dir="rtl"] .icon-directional { ... }` rule) for the flip-yes rows; leave the rest untouched.
|
|
93
93
|
|
|
94
94
|
| Icon | Flip in RTL? | Rationale |
|
|
95
95
|
| ----------------------------- | ------------ | -------------------------------------------------- |
|
|
@@ -98,7 +98,7 @@ Not every icon should mirror under RTL. The rule is intent: if the icon means "n
|
|
|
98
98
|
| Breadcrumb separator chevrons | yes | reading-order directional |
|
|
99
99
|
| Progress-bar fill direction | yes | progression in reading order |
|
|
100
100
|
| Send / reply arrow | yes | implies outbound direction in reading order |
|
|
101
|
-
| Search (magnifier glass) | no | universal
|
|
101
|
+
| Search (magnifier glass) | no | universal - handle angle is convention not flow |
|
|
102
102
|
| Brand logos, wordmarks | no | brand asset is fixed |
|
|
103
103
|
| Numerals (0–9) | no | digits render LTR even inside Arabic text |
|
|
104
104
|
| Media controls play / pause | no | bound to a physical timeline, not reading order |
|
|
@@ -108,11 +108,11 @@ Not every icon should mirror under RTL. The rule is intent: if the icon means "n
|
|
|
108
108
|
|
|
109
109
|
### Bidi isolation
|
|
110
110
|
|
|
111
|
-
When a string mixes scripts of different directions
|
|
111
|
+
When a string mixes scripts of different directions - an Arabic UI showing an English username, a French sentence quoting a Hebrew title - the Unicode Bidirectional Algorithm needs a hint to keep punctuation and adjacent content from leaking direction across the embed. Three tools handle this:
|
|
112
112
|
|
|
113
|
-
- `<bdi>`
|
|
114
|
-
- `dir="auto"`
|
|
115
|
-
- `unicode-bidi: isolate`
|
|
113
|
+
- `<bdi>` - bidi isolate; wraps user-provided runs whose direction is unknown.
|
|
114
|
+
- `dir="auto"` - first-strong heuristic; useful on user-input fields whose locale is unknown until typed.
|
|
115
|
+
- `unicode-bidi: isolate` - CSS equivalent of `<bdi>`; isolates a span without a semantic element.
|
|
116
116
|
|
|
117
117
|
A mixed-direction example: a comment list rendering an Arabic sentence that quotes an English handle:
|
|
118
118
|
|
|
@@ -132,15 +132,15 @@ A mixed-direction example: a comment list rendering an Arabic sentence that quot
|
|
|
132
132
|
</style>
|
|
133
133
|
```
|
|
134
134
|
|
|
135
|
-
Without `<bdi>` the trailing `42` digit pair can adopt the surrounding RTL direction and render reversed
|
|
135
|
+
Without `<bdi>` the trailing `42` digit pair can adopt the surrounding RTL direction and render reversed - a class of bug that is almost invisible in QA but jarring to native readers. Wrap any user-controlled identifier in `<bdi>` by default.
|
|
136
136
|
|
|
137
137
|
## Locale Formatting
|
|
138
138
|
|
|
139
|
-
Hand-rolled string concatenation for dates, numbers, lists, and plurals breaks at the locale boundary. The `Intl.*` family is the canonical replacement
|
|
139
|
+
Hand-rolled string concatenation for dates, numbers, lists, and plurals breaks at the locale boundary. The `Intl.*` family is the canonical replacement - every modern engine ships it, every example below is one call away from being correct in 150+ locales. The rule is unambiguous: never build a localized string by interpolation; always pass through an `Intl.*` formatter parameterized on the user's BCP 47 locale tag.
|
|
140
140
|
|
|
141
141
|
### Intl.DateTimeFormat
|
|
142
142
|
|
|
143
|
-
`Intl.DateTimeFormat` replaces `Date.toLocaleString` patterns and hand-formatted `YYYY-MM-DD` templates. It composes a date and time according to locale conventions
|
|
143
|
+
`Intl.DateTimeFormat` replaces `Date.toLocaleString` patterns and hand-formatted `YYYY-MM-DD` templates. It composes a date and time according to locale conventions - day/month ordering, separator characters, 12- vs 24-hour clocks, calendar systems, and time-zone naming.
|
|
144
144
|
|
|
145
145
|
```js
|
|
146
146
|
const event = new Date('2026-05-18T14:30:00Z');
|
|
@@ -188,7 +188,7 @@ new Intl.NumberFormat('ja-JP', { style: 'unit', unit: 'kilometer-per-hour' }).fo
|
|
|
188
188
|
|
|
189
189
|
### Intl.PluralRules
|
|
190
190
|
|
|
191
|
-
Pluralization is not "1 vs many". Arabic has six categories (`zero`, `one`, `two`, `few`, `many`, `other`); Russian has four; Welsh has six. A ternary `count === 1 ? 'item' : 'items'` is wrong in nearly every non-English locale. `Intl.PluralRules` resolves the count to a category which is then looked up in a translation table
|
|
191
|
+
Pluralization is not "1 vs many". Arabic has six categories (`zero`, `one`, `two`, `few`, `many`, `other`); Russian has four; Welsh has six. A ternary `count === 1 ? 'item' : 'items'` is wrong in nearly every non-English locale. `Intl.PluralRules` resolves the count to a category which is then looked up in a translation table - usually via an ICU MessageFormat string (next section), but available standalone.
|
|
192
192
|
|
|
193
193
|
```js
|
|
194
194
|
const ruPlural = new Intl.PluralRules('ru');
|
|
@@ -205,7 +205,7 @@ enPlural.select(2); // → "other"
|
|
|
205
205
|
|
|
206
206
|
### Intl.RelativeTimeFormat
|
|
207
207
|
|
|
208
|
-
`"3 days ago"`, `"in 2 hours"`, `"yesterday"`
|
|
208
|
+
`"3 days ago"`, `"in 2 hours"`, `"yesterday"` - relative-time phrases are wildly different across locales and tense systems. `Intl.RelativeTimeFormat` returns the locale-correct phrase given a number and a unit.
|
|
209
209
|
|
|
210
210
|
```js
|
|
211
211
|
const enRel = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });
|
|
@@ -220,7 +220,7 @@ jaRel.format(-3, 'day'); // → "3 日前"
|
|
|
220
220
|
|
|
221
221
|
### Intl.ListFormat
|
|
222
222
|
|
|
223
|
-
Joining a list of items into a sentence
|
|
223
|
+
Joining a list of items into a sentence - `"A, B, and C"` - has locale-specific rules: serial comma usage, conjunction word, segment separator. `Intl.ListFormat` covers both conjunction (`and`) and disjunction (`or`) modes.
|
|
224
224
|
|
|
225
225
|
```js
|
|
226
226
|
const tags = ['React', 'Vue', 'Svelte'];
|
|
@@ -235,7 +235,7 @@ new Intl.ListFormat('de', { style: 'long', type: 'conjunction' }).format(tags);
|
|
|
235
235
|
|
|
236
236
|
### Intl.Collator
|
|
237
237
|
|
|
238
|
-
`Array.prototype.sort` on strings uses Unicode code-point order
|
|
238
|
+
`Array.prototype.sort` on strings uses Unicode code-point order - which produces wrong results outside ASCII (`'Ö'` sorts after `'Z'` instead of with `'O'` in Swedish; `'é'` sorts after `'z'` in French). `Intl.Collator` provides locale-aware sorting and is the only correct choice for any user-facing sorted list.
|
|
239
239
|
|
|
240
240
|
```js
|
|
241
241
|
const names = ['Zebra', 'Élan', 'Ödipus', 'Apple'];
|
|
@@ -254,7 +254,7 @@ names.slice().sort(deCollator.compare);
|
|
|
254
254
|
|
|
255
255
|
### Intl.Segmenter
|
|
256
256
|
|
|
257
|
-
`Intl.Segmenter` produces grapheme-cluster, word, or sentence segments according to the Unicode segmentation algorithm. The grapheme-cluster mode is the *only* correct way to count or truncate user text. JavaScript `string.length` counts UTF-16 code units, not graphemes
|
|
257
|
+
`Intl.Segmenter` produces grapheme-cluster, word, or sentence segments according to the Unicode segmentation algorithm. The grapheme-cluster mode is the *only* correct way to count or truncate user text. JavaScript `string.length` counts UTF-16 code units, not graphemes - a family-style ZWJ sequence such as `U+1F468 U+200D U+1F469 U+200D U+1F467` (Man + ZWJ + Woman + ZWJ + Girl) reports as length 5 or 7 depending on the engine, and `string.slice(0, 10)` will split an emoji or combining character mid-sequence, producing a string that renders as a broken-glyph diamond.
|
|
258
258
|
|
|
259
259
|
```js
|
|
260
260
|
// HARD RULE: never `string.slice(0, n)` for unknown text
|
|
@@ -275,7 +275,7 @@ truncateGraphemes('café 🇫🇷👨👩👧 résumé', 6); // → "café
|
|
|
275
275
|
|
|
276
276
|
## ICU MessageFormat
|
|
277
277
|
|
|
278
|
-
ICU MessageFormat is the canonical input format for the dominant i18n library matrix
|
|
278
|
+
ICU MessageFormat is the canonical input format for the dominant i18n library matrix - `react-intl`, `formatjs`, `lingui`, `next-intl`, `i18next` all parse it natively. It is a small DSL with three constructs that matter - `plural`, `select`, `selectordinal` - each of which encodes a branch that string concatenation cannot.
|
|
279
279
|
|
|
280
280
|
```txt
|
|
281
281
|
{count, plural,
|
|
@@ -304,17 +304,17 @@ ICU MessageFormat is the canonical input format for the dominant i18n library ma
|
|
|
304
304
|
}
|
|
305
305
|
```
|
|
306
306
|
|
|
307
|
-
Why ICU beats string concatenation: pluralization rules vary by locale (Russian has four categories
|
|
307
|
+
Why ICU beats string concatenation: pluralization rules vary by locale (Russian has four categories - `one`, `few`, `many`, `other`; Welsh has six - `zero`, `one`, `two`, `few`, `many`, `other`), gendered forms vary (Slavic and Semitic languages branch verb forms on subject gender), and ordinal suffixes differ (English `1st 2nd 3rd 4th`; many languages use a single suffix). Concatenation hardcodes English assumptions; ICU encodes the branch as data, and the runtime picks the correct branch per locale.
|
|
308
308
|
|
|
309
309
|
The library bridge is direct: `react-intl` consumes ICU via `<FormattedMessage>` props, `formatjs` provides the underlying formatter, `lingui` ships its own ICU-compatible parser, `next-intl` accepts ICU strings as namespace values, and `i18next` supports ICU via the `i18next-icu` plugin. Pick the framework's idiom; the input syntax is the same.
|
|
310
310
|
|
|
311
311
|
## Unicode Hygiene
|
|
312
312
|
|
|
313
|
-
Five rules below are non-negotiable for any code path that touches user text
|
|
313
|
+
Five rules below are non-negotiable for any code path that touches user text - input, storage, comparison, display, or truncation. Skipping them produces bugs that surface in production months after the code ships, when a user with a non-ASCII name discovers their record cannot be found or their display name renders as boxes.
|
|
314
314
|
|
|
315
315
|
### NFC normalization on input
|
|
316
316
|
|
|
317
|
-
The same visible character can be encoded as a single precomposed code point (`é` = `U+00E9`) or as a base character plus a combining mark (`e` + `U+0301`). Two strings that look identical may compare as not-equal, hash to different keys, and fail length comparisons. Normalize all input to NFC at the boundary
|
|
317
|
+
The same visible character can be encoded as a single precomposed code point (`é` = `U+00E9`) or as a base character plus a combining mark (`e` + `U+0301`). Two strings that look identical may compare as not-equal, hash to different keys, and fail length comparisons. Normalize all input to NFC at the boundary - the moment text enters the application, before storage, before comparison.
|
|
318
318
|
|
|
319
319
|
```js
|
|
320
320
|
const a = 'é'; // U+00E9
|
|
@@ -334,7 +334,7 @@ Restating from §Intl.Segmenter as a hard rule: **never `string.slice(0, n)` for
|
|
|
334
334
|
|
|
335
335
|
### BCP 47 language tag structure
|
|
336
336
|
|
|
337
|
-
Locale identifiers in code are BCP 47 tags. The structure is `language[-Script][-Region][-Variant]` with case rules: language lowercase, script title-case, region uppercase. `pt-BR` is correct; `pt_br`, `PT-br`, and `pt_BR` are all wrong and will produce silent failures in `Intl.*` (or worse, partial matches that miss region-specific formatting). Use hyphens, never
|
|
337
|
+
Locale identifiers in code are BCP 47 tags. The structure is `language[-Script][-Region][-Variant]` with case rules: language lowercase, script title-case, region uppercase. `pt-BR` is correct; `pt_br`, `PT-br`, and `pt_BR` are all wrong and will produce silent failures in `Intl.*` (or worse, partial matches that miss region-specific formatting). Use hyphens, never highlights. Normalize on input via `new Intl.Locale(tag).toString()`.
|
|
338
338
|
|
|
339
339
|
```js
|
|
340
340
|
new Intl.Locale('pt-br').toString(); // → "pt-BR" (canonicalized)
|
|
@@ -357,11 +357,11 @@ document.documentElement.dir = new Intl.Locale(userLocale).textInfo.direction;
|
|
|
357
357
|
|
|
358
358
|
### Browser-support drift
|
|
359
359
|
|
|
360
|
-
`Intl.Segmenter` shipped late on Safari (March 2023, version 16.4). Projects targeting older Safari, embedded WebViews on older iOS, or pre-2023 Node versions need a polyfill
|
|
360
|
+
`Intl.Segmenter` shipped late on Safari (March 2023, version 16.4). Projects targeting older Safari, embedded WebViews on older iOS, or pre-2023 Node versions need a polyfill - `intl-segmenter-polyfill` or the underlying ICU library exposed via WebAssembly. Check current support at [caniuse.com/?search=Intl.Segmenter](https://caniuse.com/?search=Intl.Segmenter) before relying on grapheme-aware truncation in a hot path; for the rest of `Intl.*` the support has been universal since 2020.
|
|
361
361
|
|
|
362
362
|
## Multi-Script Font Stacks
|
|
363
363
|
|
|
364
|
-
A multi-script product (any product shipping outside a single Latin-script locale) cannot rely on one font family. Latin-only fonts are missing CJK ideographs, Arabic shapes, Devanagari conjuncts, and Cyrillic accents. The browser falls back to a system font when a glyph is missing, and the result is a visible style mismatch
|
|
364
|
+
A multi-script product (any product shipping outside a single Latin-script locale) cannot rely on one font family. Latin-only fonts are missing CJK ideographs, Arabic shapes, Devanagari conjuncts, and Cyrillic accents. The browser falls back to a system font when a glyph is missing, and the result is a visible style mismatch - a paragraph that switches typeface mid-sentence. The fix is an explicit per-script fallback stack, chosen so each script has a high-quality font available before the system fallback fires.
|
|
365
365
|
|
|
366
366
|
### CJK fallbacks
|
|
367
367
|
|
|
@@ -405,7 +405,7 @@ Devanagari (Hindi, Marathi, Sanskrit) requires conjunct shaping and proper combi
|
|
|
405
405
|
|
|
406
406
|
### `font-display: swap` and FOUC across scripts
|
|
407
407
|
|
|
408
|
-
`font-display: swap` shows the fallback immediately and swaps to the web font once loaded
|
|
408
|
+
`font-display: swap` shows the fallback immediately and swaps to the web font once loaded - the trade is a Flash of Unstyled Text (FOUT) instead of a Flash of Invisible Text (FOIT). Across scripts the FOUT problem is more severe: the system fallback for a CJK glyph may have radically different proportions from the loaded web font, so the swap moment causes a noticeable layout shift. Mitigations: preload the most-likely script subset for the user's locale, set `size-adjust` on the `@font-face` to match the fallback metrics, and accept FOIT (`font-display: block`) on the smallest critical-text subset where shift is unacceptable. See [variable-fonts-loading.md](./variable-fonts-loading.md) §font-display Values for the complete tradeoff.
|
|
409
409
|
|
|
410
410
|
### Subset strategy via `unicode-range`
|
|
411
411
|
|
|
@@ -431,13 +431,13 @@ Shipping the full Noto Sans CJK is a 5–15MB asset. Browsers will only fetch a
|
|
|
431
431
|
|
|
432
432
|
### Variable-font interaction
|
|
433
433
|
|
|
434
|
-
For a single-script product, one variable font with `wght`, `ital`, and `opsz` axes is the byte-budget win
|
|
434
|
+
For a single-script product, one variable font with `wght`, `ital`, and `opsz` axes is the byte-budget win - one file, all weights, all styles. For a multi-script product the calculus reverses: shipping `script-count × axis-count` axes in a single variable file balloons the asset, and very few variable fonts cover CJK or Arabic at all (the glyph count multiplies the axis storage). For multi-script products, prefer multiple weighted-static fonts per script, each subset via `unicode-range`, over one mega-variable file. The full tradeoff is in [variable-fonts-loading.md](./variable-fonts-loading.md) §Variable Font Axes; this is the cross-link that downstream agents should follow when the project's `package.json` shows both CJK and Latin scripts in active use.
|
|
435
435
|
|
|
436
436
|
## WCAG i18n
|
|
437
437
|
|
|
438
438
|
Two WCAG success criteria are the i18n contract a designer-engineer agent must enforce. Both are Level A (the lowest threshold) and both are commonly missed by codebases that otherwise pass contrast and target-size audits.
|
|
439
439
|
|
|
440
|
-
### 3.1.1
|
|
440
|
+
### 3.1.1 - `lang` attribute on root
|
|
441
441
|
|
|
442
442
|
Every page must declare its primary language on `<html>`. Screen readers select the correct phoneme inventory and prosody rules from this attribute; without it the reader falls back to its default voice (often US English), producing accented mispronunciation of every word.
|
|
443
443
|
|
|
@@ -449,9 +449,9 @@ Every page must declare its primary language on `<html>`. Screen readers select
|
|
|
449
449
|
</html>
|
|
450
450
|
```
|
|
451
451
|
|
|
452
|
-
### 3.1.2
|
|
452
|
+
### 3.1.2 - Language-of-parts
|
|
453
453
|
|
|
454
|
-
When the page's primary language is set on `<html>` but a span of text is in a different language
|
|
454
|
+
When the page's primary language is set on `<html>` but a span of text is in a different language - a French quote inside an English article, an Arabic title rendered inside an English page - the foreign span needs its own `lang` attribute. The screen reader switches voice for that span and switches back at its close.
|
|
455
455
|
|
|
456
456
|
```html
|
|
457
457
|
<p>
|
|
@@ -461,15 +461,15 @@ When the page's primary language is set on `<html>` but a span of text is in a d
|
|
|
461
461
|
</p>
|
|
462
462
|
```
|
|
463
463
|
|
|
464
|
-
The auditor catches a missed 3.1.2 by scanning for untranslated quotes, proper nouns in a non-root script, and any code-switching pattern in body copy. Common failure: a marketing page in English embeds a customer-quote in Japanese with no `lang="ja"` wrapper, producing US-English phonemes applied to Japanese romaji
|
|
464
|
+
The auditor catches a missed 3.1.2 by scanning for untranslated quotes, proper nouns in a non-root script, and any code-switching pattern in body copy. Common failure: a marketing page in English embeds a customer-quote in Japanese with no `lang="ja"` wrapper, producing US-English phonemes applied to Japanese romaji - an outcome unintelligible to a screen-reader user. The fix is one attribute per foreign span.
|
|
465
465
|
|
|
466
466
|
## Verifier Integration Spec
|
|
467
467
|
|
|
468
|
-
This section specifies two probes for [agents/design-verifier.md](../agents/design-verifier.md). 28-06 implements; this file owns the spec. Both probes attach to a new `### i18n probes` subsection at the end of Phase 1
|
|
468
|
+
This section specifies two probes for [agents/design-verifier.md](../agents/design-verifier.md). 28-06 implements; this file owns the spec. Both probes attach to a new `### i18n probes` subsection at the end of Phase 1 - Re-Audit + Category Scoring (after the existing `### Category Scores` subsection), and both classify findings under the orthogonal lens-tag `i18n_readiness` (per D-03 / D-07 - no new pillar, no audit-format change).
|
|
469
469
|
|
|
470
470
|
### Probe 1: Hardcoded-string scan
|
|
471
471
|
|
|
472
|
-
The probe scans component source files for hardcoded user-facing strings that bypass the i18n framework. The regex catalog matches the four library patterns from D-10
|
|
472
|
+
The probe scans component source files for hardcoded user-facing strings that bypass the i18n framework. The regex catalog matches the four library patterns from D-10 - these are the *expected* call shapes; anything that *resembles* a user-facing string but does *not* match one of these patterns is a candidate finding.
|
|
473
473
|
|
|
474
474
|
```txt
|
|
475
475
|
react-intl: <FormattedMessage\s+id="[^"]+"
|
|
@@ -490,11 +490,11 @@ import\s+.*\s+from\s+['"][^'"]+['"] — import paths
|
|
|
490
490
|
|
|
491
491
|
Finding classification: tagged `i18n_readiness`. Default severity `MINOR`; raised to `MAJOR` if the file count of unique violating files exceeds 10 (the codebase has a systemic problem, not a one-off oversight). Output line in the verifier report: `i18n_readiness: <N> hardcoded strings in <M> files — see ./i18n.md §ICU MessageFormat`.
|
|
492
492
|
|
|
493
|
-
Reflector hook (D-10): the probe records false-positive count over the first N audit runs. If the false-positive rate exceeds the threshold defined in the Phase 11 self-improvement loop, the reflector proposes a tightened regex or an extended allow-list
|
|
493
|
+
Reflector hook (D-10): the probe records false-positive count over the first N audit runs. If the false-positive rate exceeds the threshold defined in the Phase 11 self-improvement loop, the reflector proposes a tightened regex or an extended allow-list - the same pattern Phase 11 uses for self-improvement of other heuristics.
|
|
494
494
|
|
|
495
495
|
### Probe 2: +40% Text-overflow simulation
|
|
496
496
|
|
|
497
|
-
The probe simulates the worst-case row of the §Text Expansion table
|
|
497
|
+
The probe simulates the worst-case row of the §Text Expansion table - RU/FI/PL at +40% - by inflating every text node in the rendered DOM and measuring whether containers overflow. The pseudo-code spec below is the integration contract; 28-06 may implement via either DOM measurement or Preview-MCP screenshot diff, whichever is available in the run context.
|
|
498
498
|
|
|
499
499
|
```txt
|
|
500
500
|
FOR every text node T in rendered DOM:
|
|
@@ -512,7 +512,7 @@ Output line in the verifier report: `i18n_readiness: <N> components overflow at
|
|
|
512
512
|
|
|
513
513
|
## Explore Integration Spec
|
|
514
514
|
|
|
515
|
-
This section specifies one probe for [skills/explore/SKILL.md](../skills/explore/SKILL.md). 28-06 implements; this file owns the spec. The probe attaches as a sub-step "**i18n readiness probe**" inside Step 2
|
|
515
|
+
This section specifies one probe for [skills/explore/SKILL.md](../skills/explore/SKILL.md). 28-06 implements; this file owns the spec. The probe attaches as a sub-step "**i18n readiness probe**" inside Step 2 - Inventory scan (before the close of Step 2), and produces one informational line in the standard explore report.
|
|
516
516
|
|
|
517
517
|
### Probe: i18n-readiness (3-state, informational)
|
|
518
518
|
|
|
@@ -541,14 +541,14 @@ Output line in explore report (single informational line, per D-04):
|
|
|
541
541
|
Localization readiness: framework-managed | partial | none
|
|
542
542
|
```
|
|
543
543
|
|
|
544
|
-
The probe is **informational only**. No gate, no blocking, no required-action
|
|
544
|
+
The probe is **informational only**. No gate, no blocking, no required-action - explore's job is to describe the project's current state, not prescribe change. A consumer downstream (a planning agent, a roadmap reviewer, the user) can act on the signal if a gap is meaningful for the project, but the probe itself never forces a step. This matches the orthogonal-lens discipline of D-07 - surface signal, do not bolt on a new pillar.
|
|
545
545
|
|
|
546
546
|
## Cross-References
|
|
547
547
|
|
|
548
|
-
- [typography.md](./typography.md) §Variable Fonts
|
|
549
|
-
- [rtl-cjk-cultural.md](./rtl-cjk-cultural.md)
|
|
550
|
-
- [accessibility.md](./accessibility.md) §WCAG 2.1 / 2.2
|
|
551
|
-
- [form-patterns.md](./form-patterns.md)
|
|
552
|
-
- [variable-fonts-loading.md](./variable-fonts-loading.md)
|
|
548
|
+
- [typography.md](./typography.md) §Variable Fonts - variable-font axes the multi-script subset strategy interacts with.
|
|
549
|
+
- [rtl-cjk-cultural.md](./rtl-cjk-cultural.md) - cultural context (greeting forms, color symbolism, CJK family-name order); this file deepens the engineering side without overlap.
|
|
550
|
+
- [accessibility.md](./accessibility.md) §WCAG 2.1 / 2.2 - the §WCAG i18n section above is the language-specific cross-reference to the broader WCAG corpus.
|
|
551
|
+
- [form-patterns.md](./form-patterns.md) - locale-aware input formatting, `autocomplete` taxonomy, BCP 47 tag use in form locale negotiation.
|
|
552
|
+
- [variable-fonts-loading.md](./variable-fonts-loading.md) - multi-script subset strategy interaction; when shipping multiple weighted-static fonts beats one mega-variable font.
|
|
553
553
|
|
|
554
554
|
Reciprocal inbound cross-links into this file land in Phase 28-06 (additive-only, D-06).
|