@hegemonart/get-design-done 1.41.5 → 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 +1120 -1029
- package/README.md +158 -154
- 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 +48 -0
- package/dist/claude-code/.claude/skills/analyze-dependencies/SKILL.md +95 -0
- package/dist/claude-code/.claude/skills/apply-reflections/SKILL.md +92 -0
- package/dist/claude-code/.claude/skills/apply-reflections/apply-reflections-procedure.md +170 -0
- package/dist/claude-code/.claude/skills/audit/SKILL.md +79 -0
- package/dist/claude-code/.claude/skills/bandit-status/SKILL.md +94 -0
- package/dist/claude-code/.claude/skills/benchmark/SKILL.md +65 -0
- package/dist/claude-code/.claude/skills/bootstrap-ds/SKILL.md +43 -0
- package/dist/claude-code/.claude/skills/brief/SKILL.md +128 -0
- package/dist/claude-code/.claude/skills/budget/SKILL.md +45 -0
- package/dist/claude-code/.claude/skills/cache-manager/SKILL.md +66 -0
- package/dist/claude-code/.claude/skills/cache-manager/cache-policy.md +126 -0
- package/dist/claude-code/.claude/skills/check-update/SKILL.md +98 -0
- package/dist/claude-code/.claude/skills/compare/SKILL.md +82 -0
- package/dist/claude-code/.claude/skills/compare/compare-rubric.md +171 -0
- package/dist/claude-code/.claude/skills/complete-cycle/SKILL.md +81 -0
- package/dist/claude-code/.claude/skills/connections/SKILL.md +71 -0
- package/dist/claude-code/.claude/skills/connections/connections-onboarding.md +608 -0
- package/dist/claude-code/.claude/skills/continue/SKILL.md +24 -0
- package/dist/claude-code/.claude/skills/darkmode/SKILL.md +76 -0
- package/dist/claude-code/.claude/skills/darkmode/darkmode-audit-procedure.md +258 -0
- package/dist/claude-code/.claude/skills/debug/SKILL.md +41 -0
- package/dist/claude-code/.claude/skills/debug/debug-feedback-loops.md +119 -0
- package/dist/claude-code/.claude/skills/design/SKILL.md +99 -0
- package/dist/claude-code/.claude/skills/design/design-procedure.md +304 -0
- package/dist/claude-code/.claude/skills/discover/SKILL.md +72 -0
- package/dist/claude-code/.claude/skills/discover/discover-procedure.md +222 -0
- package/dist/claude-code/.claude/skills/discuss/SKILL.md +96 -0
- package/dist/claude-code/.claude/skills/do/SKILL.md +45 -0
- package/dist/claude-code/.claude/skills/explore/SKILL.md +105 -0
- package/dist/claude-code/.claude/skills/explore/explore-procedure.md +267 -0
- package/dist/claude-code/.claude/skills/export/SKILL.md +30 -0
- package/dist/claude-code/.claude/skills/extract-learnings/SKILL.md +98 -0
- package/dist/claude-code/.claude/skills/fast/SKILL.md +91 -0
- package/dist/claude-code/.claude/skills/figma-extract/SKILL.md +64 -0
- package/dist/claude-code/.claude/skills/figma-write/SKILL.md +39 -0
- package/dist/claude-code/.claude/skills/graphify/SKILL.md +49 -0
- package/dist/claude-code/.claude/skills/health/SKILL.md +99 -0
- package/dist/claude-code/.claude/skills/health/health-mcp-detection.md +44 -0
- package/dist/claude-code/.claude/skills/health/health-skill-length-report.md +69 -0
- package/dist/claude-code/.claude/skills/help/SKILL.md +87 -0
- package/dist/claude-code/.claude/skills/list-assumptions/SKILL.md +61 -0
- package/dist/claude-code/.claude/skills/locale/SKILL.md +51 -0
- package/dist/claude-code/.claude/skills/map/SKILL.md +89 -0
- package/dist/claude-code/.claude/skills/migrate/SKILL.md +70 -0
- package/dist/claude-code/.claude/skills/new-cycle/SKILL.md +37 -0
- package/dist/claude-code/.claude/skills/new-cycle/milestone-completeness-rubric.md +87 -0
- package/dist/claude-code/.claude/skills/new-project/SKILL.md +53 -0
- package/dist/claude-code/.claude/skills/next/SKILL.md +68 -0
- package/dist/claude-code/.claude/skills/note/SKILL.md +48 -0
- package/dist/claude-code/.claude/skills/openrouter-status/SKILL.md +86 -0
- package/dist/claude-code/.claude/skills/optimize/SKILL.md +97 -0
- package/dist/claude-code/.claude/skills/pause/SKILL.md +77 -0
- package/dist/claude-code/.claude/skills/peer-cli-add/SKILL.md +88 -0
- package/dist/claude-code/.claude/skills/peer-cli-add/peer-cli-protocol.md +161 -0
- package/dist/claude-code/.claude/skills/peer-cli-customize/SKILL.md +90 -0
- package/dist/claude-code/.claude/skills/peers/SKILL.md +96 -0
- package/dist/claude-code/.claude/skills/plan/SKILL.md +105 -0
- package/dist/claude-code/.claude/skills/plan/plan-procedure.md +278 -0
- package/dist/claude-code/.claude/skills/plant-seed/SKILL.md +48 -0
- package/dist/claude-code/.claude/skills/pr-branch/SKILL.md +32 -0
- package/dist/claude-code/.claude/skills/progress/SKILL.md +95 -0
- package/dist/claude-code/.claude/skills/quality-gate/SKILL.md +90 -0
- package/dist/claude-code/.claude/skills/quality-gate/threat-modeling.md +101 -0
- package/dist/claude-code/.claude/skills/quick/SKILL.md +44 -0
- package/dist/claude-code/.claude/skills/reapply-patches/SKILL.md +32 -0
- package/dist/claude-code/.claude/skills/recall/SKILL.md +75 -0
- package/dist/claude-code/.claude/skills/reflect/SKILL.md +85 -0
- package/dist/claude-code/.claude/skills/reflect/procedures/capability-gap-scan.md +120 -0
- package/dist/claude-code/.claude/skills/report-issue/SKILL.md +53 -0
- package/dist/claude-code/.claude/skills/report-issue/report-issue-procedure.md +120 -0
- package/dist/claude-code/.claude/skills/resume/SKILL.md +93 -0
- package/dist/claude-code/.claude/skills/review-backlog/SKILL.md +46 -0
- package/dist/claude-code/.claude/skills/review-decisions/SKILL.md +42 -0
- package/dist/claude-code/.claude/skills/roi/SKILL.md +54 -0
- package/dist/claude-code/.claude/skills/rollout-status/SKILL.md +35 -0
- package/dist/claude-code/.claude/skills/router/SKILL.md +89 -0
- package/dist/claude-code/.claude/skills/router/capability-gap-emitter.md +65 -0
- package/dist/claude-code/.claude/skills/router/router-pick-emitter.md +78 -0
- package/dist/claude-code/.claude/skills/router/router-rules.md +84 -0
- package/dist/claude-code/.claude/skills/scan/SKILL.md +92 -0
- package/dist/claude-code/.claude/skills/scan/scan-procedure.md +732 -0
- package/dist/claude-code/.claude/skills/settings/SKILL.md +87 -0
- package/dist/claude-code/.claude/skills/ship/SKILL.md +48 -0
- package/dist/claude-code/.claude/skills/sketch/SKILL.md +78 -0
- package/dist/claude-code/.claude/skills/sketch-wrap-up/SKILL.md +92 -0
- package/dist/claude-code/.claude/skills/skill-manifest/SKILL.md +79 -0
- package/dist/claude-code/.claude/skills/spike/SKILL.md +67 -0
- package/dist/claude-code/.claude/skills/spike-wrap-up/SKILL.md +86 -0
- package/dist/claude-code/.claude/skills/start/SKILL.md +67 -0
- package/dist/claude-code/.claude/skills/start/start-procedure.md +115 -0
- package/dist/claude-code/.claude/skills/stats/SKILL.md +51 -0
- package/dist/claude-code/.claude/skills/style/SKILL.md +71 -0
- package/dist/claude-code/.claude/skills/style/style-doc-procedure.md +150 -0
- package/dist/claude-code/.claude/skills/synthesize/SKILL.md +94 -0
- package/dist/claude-code/.claude/skills/timeline/SKILL.md +66 -0
- package/dist/claude-code/.claude/skills/todo/SKILL.md +64 -0
- package/dist/claude-code/.claude/skills/turn-closeout/SKILL.md +95 -0
- package/dist/claude-code/.claude/skills/undo/SKILL.md +31 -0
- package/dist/claude-code/.claude/skills/unlock-decision/SKILL.md +54 -0
- package/dist/claude-code/.claude/skills/update/SKILL.md +56 -0
- package/dist/claude-code/.claude/skills/using-gdd/SKILL.md +78 -0
- package/dist/claude-code/.claude/skills/verify/SKILL.md +113 -0
- package/dist/claude-code/.claude/skills/verify/verify-procedure.md +512 -0
- package/dist/claude-code/.claude/skills/warm-cache/SKILL.md +81 -0
- package/dist/claude-code/.claude/skills/watch-authorities/SKILL.md +82 -0
- package/dist/claude-code/.claude/skills/zoom-out/SKILL.md +26 -0
- package/package.json +8 -2
- package/reference/DEPRECATIONS.md +21 -7
- 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/registry.json +7 -0
- 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 +71 -0
- 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/build/factory.cjs +62 -0
- package/scripts/lib/build/harness-configs.cjs +64 -0
- package/scripts/lib/manifest/prose-denylist.json +1 -1
- package/sdk/cli/commands/build.ts +106 -0
- package/sdk/cli/index.js +84 -2
- package/sdk/cli/index.ts +7 -0
- 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,10 +1,10 @@
|
|
|
1
|
-
# Peer-CLI Protocols
|
|
1
|
+
# Peer-CLI Protocols - ACP + ASP Cheat Sheet
|
|
2
2
|
|
|
3
3
|
**Phase 27 (v1.27.0).** This file is the protocol-level reference for gdd's peer-CLI delegation layer. If you're authoring a new peer adapter or debugging a protocol-level issue, start here.
|
|
4
4
|
|
|
5
5
|
For ops-level guidance (when delegation fires, how to enable/disable, fallback diagnostics), see `docs/PEER-DELEGATION.md`.
|
|
6
6
|
|
|
7
|
-
Protocol shapes are adapted from [`greenpolo/cc-multi-cli-plugin`](https://github.com/greenpolo/cc-multi-cli-plugin) under Apache 2.0
|
|
7
|
+
Protocol shapes are adapted from [`greenpolo/cc-multi-cli-plugin`](https://github.com/greenpolo/cc-multi-cli-plugin) under Apache 2.0 - see `NOTICE` for full attribution.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -21,7 +21,7 @@ Line-buffer overflow guard: 16 MiB per line (both clients reject lines longer th
|
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
24
|
-
## ACP
|
|
24
|
+
## ACP - Agent Client Protocol
|
|
25
25
|
|
|
26
26
|
### Initialize handshake
|
|
27
27
|
|
|
@@ -99,7 +99,7 @@ Verify via the `peer-cli-add` skill's verification ladder (Step 1) before adding
|
|
|
99
99
|
|
|
100
100
|
---
|
|
101
101
|
|
|
102
|
-
## ASP
|
|
102
|
+
## ASP - App Server Protocol (Codex)
|
|
103
103
|
|
|
104
104
|
### Service identification
|
|
105
105
|
|
|
@@ -144,7 +144,7 @@ Server → client:
|
|
|
144
144
|
|
|
145
145
|
#### threadResume
|
|
146
146
|
|
|
147
|
-
Useful for cross-cycle conversation continuity (out of scope for v1.27.0
|
|
147
|
+
Useful for cross-cycle conversation continuity (out of scope for v1.27.0 - gdd always creates fresh threads per delegated call - but the API surface exists):
|
|
148
148
|
|
|
149
149
|
```json
|
|
150
150
|
{
|
|
@@ -191,7 +191,7 @@ Server streams turn-progress notifications, ends with a structured result:
|
|
|
191
191
|
}
|
|
192
192
|
```
|
|
193
193
|
|
|
194
|
-
**Error path** (does NOT throw on the client side
|
|
194
|
+
**Error path** (does NOT throw on the client side - resolves with the error structure):
|
|
195
195
|
|
|
196
196
|
```json
|
|
197
197
|
{
|
|
@@ -209,7 +209,7 @@ Server streams turn-progress notifications, ends with a structured result:
|
|
|
209
209
|
}
|
|
210
210
|
```
|
|
211
211
|
|
|
212
|
-
The caller decides retry vs fallback per session-runner contract
|
|
212
|
+
The caller decides retry vs fallback per session-runner contract - gdd's session-runner falls back to local Anthropic on `status: "error"` per D-07.
|
|
213
213
|
|
|
214
214
|
### Codex ASP entry point
|
|
215
215
|
|
|
@@ -230,12 +230,12 @@ The caller decides retry vs fallback per session-runner contract — gdd's sessi
|
|
|
230
230
|
|
|
231
231
|
- Requests carry `id` (monotonic integer per session).
|
|
232
232
|
- Responses carry the same `id` in `result` or `error`.
|
|
233
|
-
- Notifications have no `id` and no `result`
|
|
233
|
+
- Notifications have no `id` and no `result` - they are routed to the active request's `onNotification` callback (each protocol allows only one "active" request at a time per session - half-duplex).
|
|
234
234
|
|
|
235
235
|
### Process lifecycle
|
|
236
236
|
|
|
237
237
|
- The peer process is spawned via `scripts/lib/peer-cli/spawn-cmd.cjs` (handles Windows `.cmd` EINVAL workaround per D-04).
|
|
238
|
-
- The client connects directly OR through gdd's broker (`broker-lifecycle.cjs`)
|
|
238
|
+
- The client connects directly OR through gdd's broker (`broker-lifecycle.cjs`) - both surfaces present the same `{initialize, prompt, close}` (ACP) or `{threadStart, threadResume, turn, close}` (ASP) API.
|
|
239
239
|
- On process death mid-request, the client rejects the in-flight promise with a structured `{error_class: "process_exited"}` event for telemetry.
|
|
240
240
|
|
|
241
241
|
---
|
|
@@ -245,8 +245,8 @@ The caller decides retry vs fallback per session-runner contract — gdd's sessi
|
|
|
245
245
|
gdd v1.27.0 ships only ACP and ASP. If a new peer speaks neither (e.g., a future REST-only or HTTP/2-streaming protocol), the path forward is:
|
|
246
246
|
|
|
247
247
|
1. Document the gap in `.design/RESEARCH.md` for a future phase to scope a new protocol layer.
|
|
248
|
-
2. Do **not** stretch ACP/ASP to fit
|
|
249
|
-
3. The `peer-cli-add` skill (Step 1's verification ladder) refuses to scaffold a peer that doesn't speak ACP or ASP
|
|
248
|
+
2. Do **not** stretch ACP/ASP to fit - they're documented contracts, not generalist multiplexers.
|
|
249
|
+
3. The `peer-cli-add` skill (Step 1's verification ladder) refuses to scaffold a peer that doesn't speak ACP or ASP - by design.
|
|
250
250
|
|
|
251
251
|
A future phase may add a new `scripts/lib/peer-cli/<protocol>-client.cjs` mirror following the same shape (line-buffer + JSON-RPC framing if applicable, or whatever the new protocol natively uses).
|
|
252
252
|
|
|
@@ -254,13 +254,13 @@ A future phase may add a new `scripts/lib/peer-cli/<protocol>-client.cjs` mirror
|
|
|
254
254
|
|
|
255
255
|
## Cross-references
|
|
256
256
|
|
|
257
|
-
- `scripts/lib/peer-cli/acp-client.cjs`
|
|
258
|
-
- `scripts/lib/peer-cli/asp-client.cjs`
|
|
259
|
-
- `scripts/lib/peer-cli/spawn-cmd.cjs`
|
|
260
|
-
- `scripts/lib/peer-cli/broker-lifecycle.cjs`
|
|
261
|
-
- `scripts/lib/peer-cli/adapters/*.cjs`
|
|
262
|
-
- `scripts/lib/peer-cli/registry.cjs`
|
|
263
|
-
- `tests/peer-cli-{acp,asp,spawn,registry,adapters}.test.cjs`
|
|
264
|
-
- `docs/PEER-DELEGATION.md`
|
|
265
|
-
- `NOTICE`
|
|
266
|
-
- `.planning/phases/27-peer-cli-delegation/CONTEXT.md`
|
|
257
|
+
- `scripts/lib/peer-cli/acp-client.cjs` - ACP client implementation.
|
|
258
|
+
- `scripts/lib/peer-cli/asp-client.cjs` - ASP client implementation.
|
|
259
|
+
- `scripts/lib/peer-cli/spawn-cmd.cjs` - Windows `.cmd` EINVAL workaround.
|
|
260
|
+
- `scripts/lib/peer-cli/broker-lifecycle.cjs` - long-lived broker.
|
|
261
|
+
- `scripts/lib/peer-cli/adapters/*.cjs` - per-peer thin wrappers.
|
|
262
|
+
- `scripts/lib/peer-cli/registry.cjs` - central dispatch.
|
|
263
|
+
- `tests/peer-cli-{acp,asp,spawn,registry,adapters}.test.cjs` - protocol-level tests.
|
|
264
|
+
- `docs/PEER-DELEGATION.md` - ops guide.
|
|
265
|
+
- `NOTICE` - Apache 2.0 attribution for cc-multi-cli.
|
|
266
|
+
- `.planning/phases/27-peer-cli-delegation/CONTEXT.md` - decision lineage (D-01, D-02, D-03, D-04).
|
package/reference/perf-budget.md
CHANGED
|
@@ -6,12 +6,12 @@ type: meta-rules
|
|
|
6
6
|
description: Per-agent token-cost budget reference and CI regression-gate documentation. Budgets sourced from current p50 + 25% buffer (Phase 27.6 D-05); CI gate fails on >25% regression vs baseline across 3 cycles (D-01); thresholds configurable via .design/budget.json.
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Per-Agent Performance Budgets
|
|
9
|
+
# Per-Agent Performance Budgets - Phase 27.6
|
|
10
10
|
|
|
11
11
|
This reference documents the token-cost budgets that the pipeline measures itself against. Two surfaces consume this document:
|
|
12
12
|
|
|
13
|
-
1. `tests/perf-budget.test.cjs`
|
|
14
|
-
2. `agents/perf-analyzer.md`
|
|
13
|
+
1. `tests/perf-budget.test.cjs` - CI regression gate. Fails the build when any agent's p50 USD-cost has regressed > 25% vs baseline across the last 3 cycles.
|
|
14
|
+
2. `agents/perf-analyzer.md` - cross-cycle reflector. Reads the same budget + telemetry; surfaces top-3 regressions as `[REGRESSION]` proposals.
|
|
15
15
|
|
|
16
16
|
Phase 27.5 (v1.27.5, shipped 2026-05-17) made production telemetry real by wiring the bandit into routing. Phase 27.6 reads what 27.5 writes.
|
|
17
17
|
|
|
@@ -29,7 +29,7 @@ chore(27.6): recalibrate perf-budget against measured cycles
|
|
|
29
29
|
|
|
30
30
|
Per **D-01**, the regression-gate threshold is **25%**, configurable via `.design/budget.json#perf_regression_threshold`. A minimum of **3 distinct cycles** must be observed per agent before that agent is evaluated for regression. Agents with fewer than 3 cycles are silently skipped (cold-start tolerance).
|
|
31
31
|
|
|
32
|
-
This conservative-then-tighten discipline matches Phase 23.5 `PRIOR_STRENGTH` calibration
|
|
32
|
+
This conservative-then-tighten discipline matches Phase 23.5 `PRIOR_STRENGTH` calibration - start wide to avoid noise, tighten once enough samples accumulate to compute realistic p95 bounds.
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
@@ -47,7 +47,7 @@ This conservative-then-tighten discipline matches Phase 23.5 `PRIOR_STRENGTH` ca
|
|
|
47
47
|
|
|
48
48
|
These values are **seed numbers**, re-calibrated after 1-2 real production cycles. The authoritative numbers live in `test-fixture/baselines/phase-27-6/perf-baseline.json` (created at Phase 27.6 closeout in Plan 27.6-06). The CI gate reads that file at runtime, not this table.
|
|
49
49
|
|
|
50
|
-
When the baseline JSON is **absent** (first run after this plan lands but before 27.6-06), the gate passes silently with a stderr notice
|
|
50
|
+
When the baseline JSON is **absent** (first run after this plan lands but before 27.6-06), the gate passes silently with a stderr notice - it does NOT block Wave A from shipping.
|
|
51
51
|
|
|
52
52
|
---
|
|
53
53
|
|
|
@@ -55,10 +55,10 @@ When the baseline JSON is **absent** (first run after this plan lands but before
|
|
|
55
55
|
|
|
56
56
|
File: `tests/perf-budget.test.cjs`
|
|
57
57
|
|
|
58
|
-
Algorithm (single source of truth
|
|
58
|
+
Algorithm (single source of truth - re-uses `detectCostRegressions` from `scripts/lib/perf-analyzer/cost-regression.cjs`):
|
|
59
59
|
|
|
60
|
-
1. Load `test-fixture/baselines/phase-27-6/perf-baseline.json`. If absent, exit early
|
|
61
|
-
2. Load `.design/telemetry/costs.jsonl` via `loadCosts`. If absent or empty, exit early
|
|
60
|
+
1. Load `test-fixture/baselines/phase-27-6/perf-baseline.json`. If absent, exit early - gate passes with stderr notice. (Phase 27.6-06 creates this file at closeout.)
|
|
61
|
+
2. Load `.design/telemetry/costs.jsonl` via `loadCosts`. If absent or empty, exit early - no data to regress against.
|
|
62
62
|
3. Read `perf_regression_threshold` from `.design/budget.json` (default 25 per D-01).
|
|
63
63
|
4. Call `detectCostRegressions({rows, baseline: parsedBaseline.agents, thresholdPct, cyclesRequired: 3})`.
|
|
64
64
|
5. If `result.regressions.length === 0`, gate passes.
|
|
@@ -67,10 +67,10 @@ Algorithm (single source of truth — re-uses `detectCostRegressions` from `scri
|
|
|
67
67
|
The gate is intentionally **low-noise**:
|
|
68
68
|
|
|
69
69
|
- Skips agents with fewer than 3 distinct cycles of data (avoids false positives during cold-start).
|
|
70
|
-
- Only fires on the **regression rule**
|
|
71
|
-
- Top-3 cap on the regressions list
|
|
70
|
+
- Only fires on the **regression rule** - NOT on cache-hit-rate drops or p95 latency spikes; those surface as `agents/perf-analyzer.md` proposals only.
|
|
71
|
+
- Top-3 cap on the regressions list - a "noisy day" can flag at most three agents, never the entire roster.
|
|
72
72
|
|
|
73
|
-
The gate runs as a regular `node --test` entry under the `tests/**/*.test.cjs` glob
|
|
73
|
+
The gate runs as a regular `node --test` entry under the `tests/**/*.test.cjs` glob - no special CI wiring required. If you can run `npm test`, you run the gate.
|
|
74
74
|
|
|
75
75
|
---
|
|
76
76
|
|
|
@@ -97,7 +97,7 @@ Override the cache-warming false-positive tolerance (used by Phase 27.6-03):
|
|
|
97
97
|
- `perf_regression_threshold: 25`
|
|
98
98
|
- `cache_warming_falsepositive_threshold: 20`
|
|
99
99
|
|
|
100
|
-
After 5 measured cycles accumulate, re-tune based on observed natural variance. The 25%-default is conservative
|
|
100
|
+
After 5 measured cycles accumulate, re-tune based on observed natural variance. The 25%-default is conservative - likely too loose once real telemetry stabilizes. The first tightening pass belongs to a measurement-gated follow-up, not v1.27.6 itself.
|
|
101
101
|
|
|
102
102
|
---
|
|
103
103
|
|
|
@@ -116,19 +116,19 @@ That commit:
|
|
|
116
116
|
3. Bumps the budget numbers in this document to match.
|
|
117
117
|
4. Optionally tightens `perf_regression_threshold` from 25 toward 15-20 if measured variance permits.
|
|
118
118
|
|
|
119
|
-
The synthetic baseline is **not a hack**
|
|
119
|
+
The synthetic baseline is **not a hack** - it's the documented v1 path per spec Success Criterion #7. Real-cycle data simply doesn't exist yet at v1.27.6 cut, because Phase 27.5 only shipped 2026-05-17.
|
|
120
120
|
|
|
121
121
|
---
|
|
122
122
|
|
|
123
123
|
## Cross-references
|
|
124
124
|
|
|
125
|
-
- `agents/perf-analyzer.md`
|
|
126
|
-
- `scripts/lib/perf-analyzer/cost-regression.cjs`
|
|
127
|
-
- `scripts/lib/perf-analyzer/index.cjs`
|
|
128
|
-
- `tests/perf-budget.test.cjs`
|
|
129
|
-
- `reference/bandit-integration.md`
|
|
130
|
-
- `.design/budget.json`
|
|
131
|
-
- `test-fixture/baselines/phase-27-6/perf-baseline.json`
|
|
125
|
+
- `agents/perf-analyzer.md` - cross-cycle reflector that reads the same baseline. Surfaces top-3 cost regressions, hit-rate deltas, and p95 spikes as `[REGRESSION]` proposals per `/gdd:reflect`.
|
|
126
|
+
- `scripts/lib/perf-analyzer/cost-regression.cjs` - **single source of truth** for the regression rule. The CI gate re-uses `detectCostRegressions` from this module; it does NOT re-implement the rule.
|
|
127
|
+
- `scripts/lib/perf-analyzer/index.cjs` - telemetry loader (`loadCosts`, `loadTrajectories`). JSONL-tolerant; blank lines silently ignored, malformed lines counted in `skipped_count`.
|
|
128
|
+
- `tests/perf-budget.test.cjs` - the CI gate itself. Always-green when no baseline + no data; fails on >25% regression vs baseline once both exist.
|
|
129
|
+
- `reference/bandit-integration.md` - Phase 27.5 routing reference (precursor; the bandit picks tier **within** the budget - the gate evaluates whether the picked tier behaved within budget).
|
|
130
|
+
- `.design/budget.json` - operator-tunable thresholds. Optional file; absent file means defaults (`perf_regression_threshold: 25`, `cache_warming_falsepositive_threshold: 20`).
|
|
131
|
+
- `test-fixture/baselines/phase-27-6/perf-baseline.json` - authoritative per-agent p50 / hit_rate / p95_ms values. Created in Plan 27.6-06 closeout.
|
|
132
132
|
|
|
133
133
|
---
|
|
134
134
|
|
|
@@ -139,4 +139,4 @@ The synthetic baseline is **not a hack** — it's the documented v1 path per spe
|
|
|
139
139
|
- **base = 0 + current = 0** → NOT a regression (both `delta_pct = 0`).
|
|
140
140
|
- **Missing baseline entry** → agent silently skipped (no false positive on new agents that haven't been calibrated yet).
|
|
141
141
|
|
|
142
|
-
The gate's "fail loud, false-positive rare" character comes from these boundary choices plus the 3-cycle minimum
|
|
142
|
+
The gate's "fail loud, false-positive rare" character comes from these boundary choices plus the 3-cycle minimum - together they make the gate safe to wire into CI without flaking on first-run noise.
|
package/reference/performance.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Performance
|
|
1
|
+
# Performance - Reference Guide
|
|
2
2
|
|
|
3
3
|
Performance is a design constraint, not an engineering afterthought. Every millisecond of delay in LCP is a measurable reduction in conversion rate; every layout shift during page load erodes user trust. This reference establishes authoritative performance budgets, measurement targets, and implementation rules for all project types handled by the get-design-done framework.
|
|
4
4
|
|
|
@@ -19,17 +19,17 @@ Google's Core Web Vitals are the industry-standard performance metrics for user
|
|
|
19
19
|
|
|
20
20
|
### SaaS / Dashboard Applications
|
|
21
21
|
|
|
22
|
-
Authenticated dashboard applications carry more JavaScript, more real-time data subscriptions, and more complex component trees than public pages. LCP tolerance is relaxed to ≤3.0s because users have a high motivation to wait (they are trying to accomplish a work task) and the LCP element is often a data-heavy chart or table that legitimately takes time to render. However, INP must be held to ≤200ms strictly
|
|
22
|
+
Authenticated dashboard applications carry more JavaScript, more real-time data subscriptions, and more complex component trees than public pages. LCP tolerance is relaxed to ≤3.0s because users have a high motivation to wait (they are trying to accomplish a work task) and the LCP element is often a data-heavy chart or table that legitimately takes time to render. However, INP must be held to ≤200ms strictly - dashboards involve dense interaction patterns (filter, sort, paginate, drill down) and a sluggish response loop destroys the power-user experience.
|
|
23
23
|
|
|
24
24
|
### Marketing / Landing Pages
|
|
25
25
|
|
|
26
|
-
Conversion-critical pages have zero tolerance for perceived slowness. LCP must reach ≤2.0s because first impressions determine bounce rate, and bounce rate directly impacts conversion. CLS must be ≤0.05 (half the general threshold) because layout pop during hero section rendering
|
|
26
|
+
Conversion-critical pages have zero tolerance for perceived slowness. LCP must reach ≤2.0s because first impressions determine bounce rate, and bounce rate directly impacts conversion. CLS must be ≤0.05 (half the general threshold) because layout pop during hero section rendering - caused by web font loading, lazy image dimensions, or server-side-rendered content shifting - destroys the premium impression marketing pages are designed to create. Every 100ms of LCP improvement correlates with measurable conversion lift in e-commerce and SaaS trials.
|
|
27
27
|
|
|
28
28
|
### E-Commerce
|
|
29
29
|
|
|
30
30
|
| Metric | Target | Rationale |
|
|
31
31
|
|--------|--------|-----------|
|
|
32
|
-
| LCP | ≤2.5s | Product images are the LCP element
|
|
32
|
+
| LCP | ≤2.5s | Product images are the LCP element - optimize aggressively |
|
|
33
33
|
| CLS | ≤0.1 | Price and "Add to Cart" button must not jump as images load |
|
|
34
34
|
| INP | ≤200ms | Cart interactions, quantity updates, and variant selection must feel instant |
|
|
35
35
|
|
|
@@ -41,7 +41,7 @@ Cart and checkout flows are revenue-critical paths where a 500ms interaction del
|
|
|
41
41
|
|--------|--------|-----------|
|
|
42
42
|
| LCP | ≤3.0s | Docs users are high-intent; tolerate slightly longer loads |
|
|
43
43
|
| CLS | ≤0.1 | Code blocks and long-form content must not reflow after load |
|
|
44
|
-
| TTFB | ≤600ms | Docs are often statically generated
|
|
44
|
+
| TTFB | ≤600ms | Docs are often statically generated - TTFB should approach CDN speed |
|
|
45
45
|
|
|
46
46
|
Documentation sites benefit from aggressive static generation and CDN distribution. TTFB at ≤600ms is achievable with proper static export (Next.js, Astro, Docusaurus) and CDN edge caching.
|
|
47
47
|
|
|
@@ -51,7 +51,7 @@ Documentation sites benefit from aggressive static generation and CDN distributi
|
|
|
51
51
|
|
|
52
52
|
The browser must parse and execute CSS before it can paint pixels. CSS that blocks rendering is the most impactful optimization target after eliminating render-blocking JavaScript. The goal is to get the above-the-fold experience to paint within the first TCP round trip (≤14KB compressed).
|
|
53
53
|
|
|
54
|
-
**Inline above-the-fold styles:** Identify the CSS rules that affect visible content within the initial viewport
|
|
54
|
+
**Inline above-the-fold styles:** Identify the CSS rules that affect visible content within the initial viewport - typically layout grid, hero component, navigation bar, and typography declarations. Inline these rules in a `<style>` block in the `<head>`. Keep this block under 14KB compressed, which corresponds to approximately 40–60KB uncompressed depending on your gzip ratio.
|
|
55
55
|
|
|
56
56
|
**Defer non-critical CSS with preload:** Load the full stylesheet asynchronously to prevent it from blocking rendering:
|
|
57
57
|
|
|
@@ -68,11 +68,11 @@ This pattern preloads the stylesheet at high priority (ensuring it is fetched be
|
|
|
68
68
|
|
|
69
69
|
## 3. Image Budgets
|
|
70
70
|
|
|
71
|
-
Images are typically the single largest contributor to LCP and total page weight. Every image decision
|
|
71
|
+
Images are typically the single largest contributor to LCP and total page weight. Every image decision - format, dimensions, lazy-loading strategy, and priority - directly affects Core Web Vitals.
|
|
72
72
|
|
|
73
73
|
**Format requirements:**
|
|
74
74
|
- **Photos and complex rasters:** WebP as primary format, AVIF as progressive enhancement where browser support allows. Never ship JPEG or PNG for photos in new projects. AVIF achieves 20–50% smaller file sizes than WebP at equivalent visual quality; use it where CMS and CDN pipelines support it.
|
|
75
|
-
- **Icons and logos:** SVG only. Never rasterize icons for web delivery
|
|
75
|
+
- **Icons and logos:** SVG only. Never rasterize icons for web delivery - SVGs are resolution-independent, style-inheriting, and typically smaller than equivalent PNG at display sizes.
|
|
76
76
|
- **Illustrations:** SVG if illustration complexity allows; WebP for complex multi-color illustrations that would produce large SVG files.
|
|
77
77
|
|
|
78
78
|
**Responsive images with `srcset`:**
|
|
@@ -92,7 +92,7 @@ Always specify `width` and `height` attributes. These allow the browser to reser
|
|
|
92
92
|
|
|
93
93
|
**Lazy loading below-the-fold images:** Apply `loading="lazy"` to all images that are not visible in the initial viewport. This defers their network requests until the user scrolls toward them, reducing initial page weight significantly on image-heavy pages.
|
|
94
94
|
|
|
95
|
-
**The LCP image must never be lazy-loaded.** The LCP image
|
|
95
|
+
**The LCP image must never be lazy-loaded.** The LCP image - typically the hero image or first product image - must load as fast as possible. Apply `fetchpriority="high"` to signal the browser to deprioritize other resources in favor of this image:
|
|
96
96
|
|
|
97
97
|
```html
|
|
98
98
|
<img
|
|
@@ -121,7 +121,7 @@ Smooth animation requires a consistent 60 frames per second, which means each fr
|
|
|
121
121
|
|
|
122
122
|
**Never animate layout-triggering properties.** Properties like `width`, `height`, `margin`, `padding`, `top`, `left`, `right`, `bottom`, `border-width`, and `font-size` force the browser to recalculate layout for the entire affected subtree on every animation frame. This is guaranteed to exceed the 10ms JS budget on all but the simplest pages.
|
|
123
123
|
|
|
124
|
-
**Only animate `transform` and `opacity`.** These two properties are composited by the GPU independently of the browser's main thread layout system. An animation that only changes `transform` and `opacity` does not trigger layout or paint
|
|
124
|
+
**Only animate `transform` and `opacity`.** These two properties are composited by the GPU independently of the browser's main thread layout system. An animation that only changes `transform` and `opacity` does not trigger layout or paint - it executes entirely on the compositor thread, achieving smooth 60fps even when the main thread is busy:
|
|
125
125
|
|
|
126
126
|
```css
|
|
127
127
|
/* DO: GPU-composited, no layout cost */
|
|
@@ -140,7 +140,7 @@ Smooth animation requires a consistent 60 frames per second, which means each fr
|
|
|
140
140
|
}
|
|
141
141
|
```
|
|
142
142
|
|
|
143
|
-
Use `will-change: transform, opacity` on elements that will be animated to promote them to their own compositor layer before the animation begins. Use this property sparingly
|
|
143
|
+
Use `will-change: transform, opacity` on elements that will be animated to promote them to their own compositor layer before the animation begins. Use this property sparingly - each compositor layer consumes GPU memory, and overuse causes memory pressure on mobile devices.
|
|
144
144
|
|
|
145
145
|
---
|
|
146
146
|
|
|
@@ -148,7 +148,7 @@ Use `will-change: transform, opacity` on elements that will be animated to promo
|
|
|
148
148
|
|
|
149
149
|
Bundle size is a proxy for parse time and execution time, both of which block interactivity. Every kilobyte of JavaScript must be justified against its user-visible value.
|
|
150
150
|
|
|
151
|
-
**Initial load budget:** The JavaScript required to render the first meaningful page interaction must be ≤170KB gzipped. This budget includes the framework runtime, routing, and any above-the-fold component logic. At average mobile connection speeds (≈1.5 Mbps download), 170KB gzipped represents approximately 900ms of transfer time
|
|
151
|
+
**Initial load budget:** The JavaScript required to render the first meaningful page interaction must be ≤170KB gzipped. This budget includes the framework runtime, routing, and any above-the-fold component logic. At average mobile connection speeds (≈1.5 Mbps download), 170KB gzipped represents approximately 900ms of transfer time - already a significant portion of a 2.5s LCP budget before parse and execution time is counted.
|
|
152
152
|
|
|
153
153
|
**Code splitting strategy:**
|
|
154
154
|
- **Route-level splitting:** Each page/route is a separate async chunk. Users only download code for the pages they visit.
|
|
@@ -177,9 +177,9 @@ function Dashboard() {
|
|
|
177
177
|
|
|
178
178
|
Web fonts are blocking resources in the critical rendering path. Every additional font family, weight, and style file adds to the payload that must load before text can be rendered.
|
|
179
179
|
|
|
180
|
-
**Maximum two font families per product.** One for headings/display, one for body and UI. This constraint is both a performance budget and a typographic discipline
|
|
180
|
+
**Maximum two font families per product.** One for headings/display, one for body and UI. This constraint is both a performance budget and a typographic discipline - every additional font family increases visual complexity and requires justification against a clear aesthetic goal.
|
|
181
181
|
|
|
182
|
-
**`font-display: swap` is required.** This CSS property instructs the browser to use a system fallback font immediately and swap in the web font when it loads. Without `swap`, text is invisible during font loading (FOIT
|
|
182
|
+
**`font-display: swap` is required.** This CSS property instructs the browser to use a system fallback font immediately and swap in the web font when it loads. Without `swap`, text is invisible during font loading (FOIT - Flash of Invisible Text), which directly hurts LCP and user experience:
|
|
183
183
|
|
|
184
184
|
```css
|
|
185
185
|
@font-face {
|
|
@@ -215,7 +215,7 @@ Web fonts are blocking resources in the critical rendering path. Every additiona
|
|
|
215
215
|
|
|
216
216
|
## 7. Lighthouse CI Integration
|
|
217
217
|
|
|
218
|
-
Automated performance regression testing prevents gradual budget creep
|
|
218
|
+
Automated performance regression testing prevents gradual budget creep - small performance regressions accumulate unnoticed through routine development until the product is significantly slower than its target.
|
|
219
219
|
|
|
220
220
|
**GitHub Actions workflow:** Create `.github/workflows/lighthouse.yml` to run Lighthouse CI on every pull request against a staging deployment:
|
|
221
221
|
|
|
@@ -265,35 +265,35 @@ jobs:
|
|
|
265
265
|
|
|
266
266
|
## 8. React Runtime Performance
|
|
267
267
|
|
|
268
|
-
React's rendering model is optimized by default, but naive usage patterns
|
|
268
|
+
React's rendering model is optimized by default, but naive usage patterns - particularly around object identity, memoization, and context - can introduce significant re-render cascades that degrade INP and animation smoothness.
|
|
269
269
|
|
|
270
270
|
**Source: nextlevelbuilder/ui-ux-pro-max-skill (MIT)**
|
|
271
271
|
|
|
272
272
|
### `React.memo()`
|
|
273
273
|
|
|
274
|
-
Use `React.memo()` only when the React DevTools Profiler demonstrates that a component re-renders with identical props and the render takes ≥50ms. `React.memo()` adds overhead
|
|
274
|
+
Use `React.memo()` only when the React DevTools Profiler demonstrates that a component re-renders with identical props and the render takes ≥50ms. `React.memo()` adds overhead - a shallow prop comparison on every parent render - that only pays for itself when the avoided render cost exceeds the comparison cost. Never memoize components that receive primitive values (strings, numbers, booleans) as props; React's reconciler handles these efficiently without memoization.
|
|
275
275
|
|
|
276
276
|
### `useMemo()`
|
|
277
277
|
|
|
278
|
-
Use `useMemo()` for computationally expensive derivations
|
|
278
|
+
Use `useMemo()` for computationally expensive derivations - sorting or filtering large arrays, running statistical calculations, or building complex objects from raw data - where the computation takes more than 1ms and the dependencies are stable across most renders. Do not use `useMemo()` to memoize simple object creation for the purpose of maintaining reference identity; instead, move the object outside the component or into a `useRef` if it is genuinely static.
|
|
279
279
|
|
|
280
280
|
### `useCallback()`
|
|
281
281
|
|
|
282
|
-
Use `useCallback()` when a function is passed as a prop to a memoized child component and the function's creation would invalidate the child's memo on every parent render. `useCallback()` is not needed for event handlers attached directly to DOM elements (`onClick`, `onChange`)
|
|
282
|
+
Use `useCallback()` when a function is passed as a prop to a memoized child component and the function's creation would invalidate the child's memo on every parent render. `useCallback()` is not needed for event handlers attached directly to DOM elements (`onClick`, `onChange`) - the DOM does not compare function references. The cost of useCallback (closure creation + dependency comparison) is only justified when it prevents a measurable re-render cascade.
|
|
283
283
|
|
|
284
284
|
### Re-render Root Causes
|
|
285
285
|
|
|
286
|
-
The two most common causes of unnecessary re-renders are (1) new object and array references created inline in JSX, and (2) Context value changes propagating to all consumers. Avoid `value={{ key: value }}` inline in Context providers
|
|
286
|
+
The two most common causes of unnecessary re-renders are (1) new object and array references created inline in JSX, and (2) Context value changes propagating to all consumers. Avoid `value={{ key: value }}` inline in Context providers - this creates a new object reference on every parent render, re-rendering all consumers. Memoize the context value with `useMemo()` or split contexts so consumers only subscribe to the slice of state they need.
|
|
287
287
|
|
|
288
288
|
Avoid anonymous arrow functions as props to performance-critical components: `<List onItemClick={() => handleClick(id)} />` creates a new function reference on every render of the parent.
|
|
289
289
|
|
|
290
290
|
### Suspense Boundaries
|
|
291
291
|
|
|
292
|
-
Place Suspense boundaries at two levels: route-level (wrapping each page's lazy-loaded component tree) and per-expensive-async-boundary (wrapping individual data-fetching components that have independent loading states). The fallback UI must match the approximate layout dimensions of the loaded content
|
|
292
|
+
Place Suspense boundaries at two levels: route-level (wrapping each page's lazy-loaded component tree) and per-expensive-async-boundary (wrapping individual data-fetching components that have independent loading states). The fallback UI must match the approximate layout dimensions of the loaded content - a fallback that occupies significantly different space than the loaded component will cause CLS when the content arrives.
|
|
293
293
|
|
|
294
294
|
### React Server Components vs. Client Components
|
|
295
295
|
|
|
296
|
-
Use RSC (React Server Components) for data fetching, static markup generation, and components that do not require browser APIs or user interaction. RSC output is streamed as HTML
|
|
296
|
+
Use RSC (React Server Components) for data fetching, static markup generation, and components that do not require browser APIs or user interaction. RSC output is streamed as HTML - it adds zero JavaScript to the client bundle. Use client components (`'use client'`) only when browser APIs (localStorage, geolocation, IntersectionObserver) or event handlers (onClick, onChange) are required. Co-locate client components as deep in the component tree as possible so that only the interactive leaf nodes are included in the client bundle, not their entire parent subtrees.
|
|
297
297
|
|
|
298
298
|
### Virtualization
|
|
299
299
|
|