godpowers 0.15.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/AGENTS.md +37 -0
- package/CHANGELOG.md +639 -0
- package/INSPIRATION.md +52 -0
- package/LICENSE +21 -0
- package/README.md +232 -0
- package/SKILL.md +500 -0
- package/agents/god-archaeologist.md +139 -0
- package/agents/god-architect.md +92 -0
- package/agents/god-auditor.md +150 -0
- package/agents/god-browser-tester.md +144 -0
- package/agents/god-context-writer.md +137 -0
- package/agents/god-coordinator.md +138 -0
- package/agents/god-debt-assessor.md +132 -0
- package/agents/god-debugger.md +77 -0
- package/agents/god-deploy-engineer.md +87 -0
- package/agents/god-deps-auditor.md +111 -0
- package/agents/god-design-reviewer.md +137 -0
- package/agents/god-designer.md +171 -0
- package/agents/god-docs-writer.md +102 -0
- package/agents/god-executor.md +76 -0
- package/agents/god-explorer.md +110 -0
- package/agents/god-harden-auditor.md +163 -0
- package/agents/god-incident-investigator.md +144 -0
- package/agents/god-launch-strategist.md +103 -0
- package/agents/god-migration-strategist.md +126 -0
- package/agents/god-observability-engineer.md +76 -0
- package/agents/god-orchestrator.md +728 -0
- package/agents/god-org-context-loader.md +124 -0
- package/agents/god-planner.md +73 -0
- package/agents/god-pm.md +105 -0
- package/agents/god-quality-reviewer.md +74 -0
- package/agents/god-reconciler.md +230 -0
- package/agents/god-reconstructor.md +124 -0
- package/agents/god-repo-scaffolder.md +60 -0
- package/agents/god-retrospective.md +109 -0
- package/agents/god-roadmap-reconciler.md +123 -0
- package/agents/god-roadmap-updater.md +89 -0
- package/agents/god-roadmapper.md +82 -0
- package/agents/god-spec-reviewer.md +70 -0
- package/agents/god-spike-runner.md +119 -0
- package/agents/god-stack-selector.md +93 -0
- package/agents/god-standards-check.md +132 -0
- package/agents/god-storyteller.md +116 -0
- package/agents/god-updater.md +174 -0
- package/bin/install.js +514 -0
- package/extensions/data-pack/README.md +33 -0
- package/extensions/data-pack/agents/god-dashboard-builder.md +66 -0
- package/extensions/data-pack/agents/god-etl-engineer.md +64 -0
- package/extensions/data-pack/agents/god-ml-feature-engineer.md +66 -0
- package/extensions/data-pack/manifest.yaml +39 -0
- package/extensions/data-pack/package.json +42 -0
- package/extensions/data-pack/skills/god-dashboard.md +28 -0
- package/extensions/data-pack/skills/god-etl.md +28 -0
- package/extensions/data-pack/skills/god-ml-feature.md +28 -0
- package/extensions/data-pack/workflows/dashboard-arc.yaml +13 -0
- package/extensions/data-pack/workflows/etl-arc.yaml +13 -0
- package/extensions/data-pack/workflows/ml-feature-arc.yaml +13 -0
- package/extensions/launch-pack/README.md +36 -0
- package/extensions/launch-pack/agents/god-indie-hackers-strategist.md +128 -0
- package/extensions/launch-pack/agents/god-oss-release-strategist.md +125 -0
- package/extensions/launch-pack/agents/god-product-hunt-strategist.md +118 -0
- package/extensions/launch-pack/agents/god-show-hn-strategist.md +113 -0
- package/extensions/launch-pack/manifest.yaml +45 -0
- package/extensions/launch-pack/package.json +41 -0
- package/extensions/launch-pack/skills/god-indie-hackers.md +39 -0
- package/extensions/launch-pack/skills/god-oss-release.md +43 -0
- package/extensions/launch-pack/skills/god-product-hunt.md +41 -0
- package/extensions/launch-pack/skills/god-show-hn.md +40 -0
- package/extensions/launch-pack/workflows/indie-hackers.yaml +13 -0
- package/extensions/launch-pack/workflows/oss-release.yaml +13 -0
- package/extensions/launch-pack/workflows/product-hunt.yaml +13 -0
- package/extensions/launch-pack/workflows/show-hn.yaml +13 -0
- package/extensions/security-pack/README.md +48 -0
- package/extensions/security-pack/agents/god-hipaa-auditor.md +117 -0
- package/extensions/security-pack/agents/god-pci-auditor.md +100 -0
- package/extensions/security-pack/agents/god-soc2-auditor.md +107 -0
- package/extensions/security-pack/manifest.yaml +39 -0
- package/extensions/security-pack/package.json +42 -0
- package/extensions/security-pack/skills/god-hipaa-audit.md +41 -0
- package/extensions/security-pack/skills/god-pci-audit.md +40 -0
- package/extensions/security-pack/skills/god-soc2-audit.md +42 -0
- package/extensions/security-pack/workflows/hipaa-arc.yaml +15 -0
- package/extensions/security-pack/workflows/pci-arc.yaml +15 -0
- package/extensions/security-pack/workflows/soc2-arc.yaml +15 -0
- package/hooks/pre-tool-use.sh +40 -0
- package/hooks/session-start.sh +74 -0
- package/lib/README.md +28 -0
- package/lib/agent-browser-driver.js +215 -0
- package/lib/agent-cache.js +194 -0
- package/lib/agent-validator.js +275 -0
- package/lib/artifact-diff.js +168 -0
- package/lib/artifact-linter.js +142 -0
- package/lib/awesome-design.js +312 -0
- package/lib/browser-bridge.js +209 -0
- package/lib/budget.js +215 -0
- package/lib/checkpoint.js +390 -0
- package/lib/code-scanner.js +262 -0
- package/lib/context-budget.js +170 -0
- package/lib/context-writer.js +348 -0
- package/lib/cost-tracker.js +325 -0
- package/lib/cross-artifact-impact.js +162 -0
- package/lib/cross-repo-linkage.js +150 -0
- package/lib/design-detector.js +167 -0
- package/lib/design-spec.js +348 -0
- package/lib/drift-detector.js +212 -0
- package/lib/event-reader.js +174 -0
- package/lib/events.js +183 -0
- package/lib/extensions.js +257 -0
- package/lib/have-nots-validator.js +647 -0
- package/lib/impact.js +314 -0
- package/lib/impeccable-bridge.js +139 -0
- package/lib/intent.js +177 -0
- package/lib/linkage.js +232 -0
- package/lib/meta-linter.js +263 -0
- package/lib/multi-repo-detector.js +182 -0
- package/lib/otel-exporter.js +308 -0
- package/lib/recipes.js +186 -0
- package/lib/reverse-sync.js +332 -0
- package/lib/review-required.js +224 -0
- package/lib/router.js +278 -0
- package/lib/runtime-audit.js +455 -0
- package/lib/runtime-test.js +309 -0
- package/lib/skillui-bridge.js +216 -0
- package/lib/state-lock.js +201 -0
- package/lib/state.js +142 -0
- package/lib/story-validator.js +301 -0
- package/lib/suite-state.js +220 -0
- package/lib/workflow-parser.js +109 -0
- package/lib/workflow-runner.js +221 -0
- package/package.json +63 -0
- package/references/HAVE-NOTS.md +573 -0
- package/references/building/BUILD-ANTIPATTERNS.md +102 -0
- package/references/building/BUILD-VERTICAL-SLICES.md +75 -0
- package/references/building/BUILD-WAVES.md +61 -0
- package/references/building/README.md +17 -0
- package/references/design/COLOR.md +122 -0
- package/references/design/DESIGN-ANATOMY.md +121 -0
- package/references/design/DESIGN-ANTIPATTERNS.md +108 -0
- package/references/design/INTERACTION.md +148 -0
- package/references/design/MOTION.md +120 -0
- package/references/design/RESPONSIVE.md +157 -0
- package/references/design/SPATIAL.md +109 -0
- package/references/design/TYPOGRAPHY.md +121 -0
- package/references/design/UX-WRITING.md +135 -0
- package/references/orchestration/MODE-DETECTION.md +74 -0
- package/references/orchestration/README.md +18 -0
- package/references/orchestration/SCALE-DETECTION.md +81 -0
- package/references/planning/ARCH-ANATOMY.md +143 -0
- package/references/planning/ARCH-ANTIPATTERNS.md +52 -0
- package/references/planning/PRD-ANATOMY.md +117 -0
- package/references/planning/PRD-ANTIPATTERNS.md +138 -0
- package/references/planning/README.md +16 -0
- package/references/planning/ROADMAP-ANATOMY.md +43 -0
- package/references/planning/ROADMAP-ANTIPATTERNS.md +94 -0
- package/references/planning/STACK-ANATOMY.md +60 -0
- package/references/planning/STACK-ANTIPATTERNS.md +95 -0
- package/references/shared/GLOSSARY.md +80 -0
- package/references/shared/ORCHESTRATORS.md +76 -0
- package/references/shared/README.md +14 -0
- package/references/shipping/DEPLOY-ANTIPATTERNS.md +64 -0
- package/references/shipping/DEPLOY-PATTERNS.md +110 -0
- package/references/shipping/HARDEN-ANTIPATTERNS.md +66 -0
- package/references/shipping/HARDEN-OWASP-WORKSHEETS.md +89 -0
- package/references/shipping/LAUNCH-ANTIPATTERNS.md +68 -0
- package/references/shipping/OBSERVE-ANTIPATTERNS.md +62 -0
- package/references/shipping/OBSERVE-SLO-EXAMPLES.md +107 -0
- package/references/shipping/README.md +18 -0
- package/routing/god-add-backlog.yaml +24 -0
- package/routing/god-add-tests.yaml +27 -0
- package/routing/god-add-todo.yaml +24 -0
- package/routing/god-agent-audit.yaml +24 -0
- package/routing/god-arch.yaml +46 -0
- package/routing/god-archaeology.yaml +28 -0
- package/routing/god-audit.yaml +32 -0
- package/routing/god-budget.yaml +24 -0
- package/routing/god-build-agent.yaml +24 -0
- package/routing/god-build.yaml +46 -0
- package/routing/god-cache-clear.yaml +24 -0
- package/routing/god-check-todos.yaml +24 -0
- package/routing/god-context-scan.yaml +24 -0
- package/routing/god-context.yaml +44 -0
- package/routing/god-cost.yaml +24 -0
- package/routing/god-debug.yaml +28 -0
- package/routing/god-deploy.yaml +34 -0
- package/routing/god-design-impact.yaml +25 -0
- package/routing/god-design.yaml +67 -0
- package/routing/god-discuss.yaml +27 -0
- package/routing/god-docs.yaml +33 -0
- package/routing/god-doctor.yaml +27 -0
- package/routing/god-explore.yaml +27 -0
- package/routing/god-extension-add.yaml +24 -0
- package/routing/god-extension-info.yaml +24 -0
- package/routing/god-extension-list.yaml +24 -0
- package/routing/god-extension-remove.yaml +24 -0
- package/routing/god-extract-learnings.yaml +24 -0
- package/routing/god-fast.yaml +27 -0
- package/routing/god-feature.yaml +34 -0
- package/routing/god-graph.yaml +24 -0
- package/routing/god-harden.yaml +41 -0
- package/routing/god-help.yaml +27 -0
- package/routing/god-hotfix.yaml +34 -0
- package/routing/god-hygiene.yaml +28 -0
- package/routing/god-init.yaml +37 -0
- package/routing/god-intel.yaml +24 -0
- package/routing/god-launch.yaml +41 -0
- package/routing/god-lifecycle.yaml +27 -0
- package/routing/god-link.yaml +24 -0
- package/routing/god-lint.yaml +24 -0
- package/routing/god-list-assumptions.yaml +27 -0
- package/routing/god-locate.yaml +24 -0
- package/routing/god-logs.yaml +24 -0
- package/routing/god-map-codebase.yaml +24 -0
- package/routing/god-metrics.yaml +24 -0
- package/routing/god-mode.yaml +31 -0
- package/routing/god-next.yaml +27 -0
- package/routing/god-note.yaml +24 -0
- package/routing/god-observe.yaml +34 -0
- package/routing/god-org-context.yaml +28 -0
- package/routing/god-party.yaml +24 -0
- package/routing/god-pause-work.yaml +27 -0
- package/routing/god-plant-seed.yaml +24 -0
- package/routing/god-postmortem.yaml +34 -0
- package/routing/god-pr-branch.yaml +25 -0
- package/routing/god-prd.yaml +49 -0
- package/routing/god-quick.yaml +28 -0
- package/routing/god-reconcile.yaml +48 -0
- package/routing/god-reconstruct.yaml +36 -0
- package/routing/god-redo.yaml +27 -0
- package/routing/god-refactor.yaml +36 -0
- package/routing/god-repair.yaml +27 -0
- package/routing/god-repo.yaml +35 -0
- package/routing/god-restore.yaml +27 -0
- package/routing/god-resume-work.yaml +27 -0
- package/routing/god-review-changes.yaml +25 -0
- package/routing/god-review.yaml +28 -0
- package/routing/god-roadmap-check.yaml +39 -0
- package/routing/god-roadmap-update.yaml +37 -0
- package/routing/god-roadmap.yaml +42 -0
- package/routing/god-rollback.yaml +27 -0
- package/routing/god-scan.yaml +24 -0
- package/routing/god-set-profile.yaml +24 -0
- package/routing/god-settings.yaml +24 -0
- package/routing/god-skip.yaml +27 -0
- package/routing/god-smite.yaml +29 -0
- package/routing/god-spike.yaml +35 -0
- package/routing/god-sprint.yaml +25 -0
- package/routing/god-stack.yaml +41 -0
- package/routing/god-standards.yaml +24 -0
- package/routing/god-status.yaml +27 -0
- package/routing/god-stories.yaml +24 -0
- package/routing/god-story-build.yaml +25 -0
- package/routing/god-story-close.yaml +25 -0
- package/routing/god-story-verify.yaml +25 -0
- package/routing/god-story.yaml +24 -0
- package/routing/god-suite-init.yaml +24 -0
- package/routing/god-suite-patch.yaml +25 -0
- package/routing/god-suite-release.yaml +25 -0
- package/routing/god-suite-status.yaml +25 -0
- package/routing/god-suite-sync.yaml +25 -0
- package/routing/god-sync.yaml +33 -0
- package/routing/god-tech-debt.yaml +32 -0
- package/routing/god-test-extension.yaml +24 -0
- package/routing/god-test-runtime.yaml +25 -0
- package/routing/god-thread.yaml +24 -0
- package/routing/god-trace.yaml +24 -0
- package/routing/god-undo.yaml +27 -0
- package/routing/god-update-deps.yaml +39 -0
- package/routing/god-upgrade.yaml +33 -0
- package/routing/god-version.yaml +24 -0
- package/routing/god-workstream.yaml +24 -0
- package/routing/god.yaml +24 -0
- package/routing/recipes/add-feature-defer-current-milestone.yaml +21 -0
- package/routing/recipes/add-feature-future-conditional.yaml +21 -0
- package/routing/recipes/add-feature-mid-arc-pause.yaml +33 -0
- package/routing/recipes/add-feature-next-milestone.yaml +23 -0
- package/routing/recipes/add-feature-parallel.yaml +29 -0
- package/routing/recipes/add-feature-prd-update.yaml +21 -0
- package/routing/recipes/add-feature-small.yaml +24 -0
- package/routing/recipes/add-feature-tiny.yaml +24 -0
- package/routing/recipes/bluefield-org-aware.yaml +27 -0
- package/routing/recipes/broken-install.yaml +22 -0
- package/routing/recipes/brownfield-onboarding.yaml +32 -0
- package/routing/recipes/bug-no-urgency.yaml +21 -0
- package/routing/recipes/capture-idea.yaml +22 -0
- package/routing/recipes/capture-todo.yaml +21 -0
- package/routing/recipes/clean-pr.yaml +21 -0
- package/routing/recipes/code-cleanup.yaml +23 -0
- package/routing/recipes/docs-drift.yaml +21 -0
- package/routing/recipes/existing-codebase-onboarding.yaml +32 -0
- package/routing/recipes/extract-learnings.yaml +22 -0
- package/routing/recipes/greenfield-fast.yaml +25 -0
- package/routing/recipes/greenfield-manual.yaml +32 -0
- package/routing/recipes/greenfield-with-ideation.yaml +29 -0
- package/routing/recipes/incident-postmortem.yaml +24 -0
- package/routing/recipes/major-framework-upgrade.yaml +23 -0
- package/routing/recipes/monthly-deps.yaml +22 -0
- package/routing/recipes/multi-repo-suite.yaml +56 -0
- package/routing/recipes/parallel-engineers.yaml +26 -0
- package/routing/recipes/pause-handoff.yaml +21 -0
- package/routing/recipes/production-broken.yaml +26 -0
- package/routing/recipes/rerun-tier.yaml +21 -0
- package/routing/recipes/returning-after-break.yaml +31 -0
- package/routing/recipes/state-drift.yaml +21 -0
- package/routing/recipes/undo-last.yaml +21 -0
- package/routing/recipes/weekly-health-check.yaml +24 -0
- package/routing/recipes/whats-next.yaml +22 -0
- package/routing/recipes/where-am-i.yaml +21 -0
- package/schema/events.v1.json +63 -0
- package/schema/extension-manifest.v1.json +84 -0
- package/schema/intent.v1.yaml.json +116 -0
- package/schema/recipe.v1.json +120 -0
- package/schema/routing.v1.json +163 -0
- package/schema/state.v1.json +146 -0
- package/schema/workflow.v1.json +96 -0
- package/skills/god-add-backlog.md +40 -0
- package/skills/god-add-tests.md +53 -0
- package/skills/god-add-todo.md +32 -0
- package/skills/god-agent-audit.md +87 -0
- package/skills/god-arch.md +81 -0
- package/skills/god-archaeology.md +48 -0
- package/skills/god-audit.md +65 -0
- package/skills/god-budget.md +103 -0
- package/skills/god-build-agent.md +91 -0
- package/skills/god-build.md +90 -0
- package/skills/god-cache-clear.md +75 -0
- package/skills/god-check-todos.md +42 -0
- package/skills/god-context-scan.md +125 -0
- package/skills/god-context.md +147 -0
- package/skills/god-cost.md +118 -0
- package/skills/god-debug.md +30 -0
- package/skills/god-deploy.md +76 -0
- package/skills/god-design-impact.md +86 -0
- package/skills/god-design.md +275 -0
- package/skills/god-discuss.md +46 -0
- package/skills/god-docs.md +81 -0
- package/skills/god-doctor.md +94 -0
- package/skills/god-explore.md +50 -0
- package/skills/god-export-otel.md +87 -0
- package/skills/god-extension-add.md +79 -0
- package/skills/god-extension-info.md +75 -0
- package/skills/god-extension-list.md +55 -0
- package/skills/god-extension-remove.md +66 -0
- package/skills/god-extract-learnings.md +60 -0
- package/skills/god-fast.md +47 -0
- package/skills/god-feature.md +114 -0
- package/skills/god-graph.md +56 -0
- package/skills/god-harden.md +106 -0
- package/skills/god-help.md +66 -0
- package/skills/god-hotfix.md +139 -0
- package/skills/god-hygiene.md +104 -0
- package/skills/god-init.md +161 -0
- package/skills/god-intel.md +36 -0
- package/skills/god-launch.md +86 -0
- package/skills/god-lifecycle.md +119 -0
- package/skills/god-link.md +90 -0
- package/skills/god-lint.md +128 -0
- package/skills/god-list-assumptions.md +56 -0
- package/skills/god-locate.md +97 -0
- package/skills/god-logs.md +57 -0
- package/skills/god-map-codebase.md +45 -0
- package/skills/god-metrics.md +51 -0
- package/skills/god-mode.md +159 -0
- package/skills/god-next.md +257 -0
- package/skills/god-note.md +39 -0
- package/skills/god-observe.md +76 -0
- package/skills/god-org-context.md +81 -0
- package/skills/god-party.md +87 -0
- package/skills/god-pause-work.md +64 -0
- package/skills/god-plant-seed.md +59 -0
- package/skills/god-postmortem.md +103 -0
- package/skills/god-pr-branch.md +50 -0
- package/skills/god-prd.md +90 -0
- package/skills/god-quick.md +50 -0
- package/skills/god-reconcile.md +90 -0
- package/skills/god-reconstruct.md +72 -0
- package/skills/god-redo.md +73 -0
- package/skills/god-refactor.md +137 -0
- package/skills/god-repair.md +82 -0
- package/skills/god-repo.md +49 -0
- package/skills/god-restore.md +91 -0
- package/skills/god-resume-work.md +42 -0
- package/skills/god-review-changes.md +93 -0
- package/skills/god-review.md +52 -0
- package/skills/god-roadmap-check.md +66 -0
- package/skills/god-roadmap-update.md +64 -0
- package/skills/god-roadmap.md +77 -0
- package/skills/god-rollback.md +88 -0
- package/skills/god-scan.md +106 -0
- package/skills/god-set-profile.md +58 -0
- package/skills/god-settings.md +44 -0
- package/skills/god-skip.md +78 -0
- package/skills/god-smite.md +86 -0
- package/skills/god-spike.md +120 -0
- package/skills/god-sprint.md +77 -0
- package/skills/god-stack.md +74 -0
- package/skills/god-standards.md +62 -0
- package/skills/god-status.md +99 -0
- package/skills/god-stories.md +60 -0
- package/skills/god-story-build.md +76 -0
- package/skills/god-story-close.md +82 -0
- package/skills/god-story-verify.md +71 -0
- package/skills/god-story.md +55 -0
- package/skills/god-suite-init.md +75 -0
- package/skills/god-suite-patch.md +64 -0
- package/skills/god-suite-release.md +58 -0
- package/skills/god-suite-status.md +63 -0
- package/skills/god-suite-sync.md +49 -0
- package/skills/god-sync.md +102 -0
- package/skills/god-tech-debt.md +56 -0
- package/skills/god-test-extension.md +87 -0
- package/skills/god-test-runtime.md +144 -0
- package/skills/god-thread.md +39 -0
- package/skills/god-trace.md +50 -0
- package/skills/god-undo.md +68 -0
- package/skills/god-update-deps.md +134 -0
- package/skills/god-upgrade.md +139 -0
- package/skills/god-version.md +37 -0
- package/skills/god-workstream.md +61 -0
- package/skills/god.md +207 -0
- package/templates/ARCH.md +99 -0
- package/templates/DEPS-AUDIT.md +66 -0
- package/templates/DESIGN.md +71 -0
- package/templates/DOCS-UPDATE-LOG.md +64 -0
- package/templates/HARDEN-FINDINGS.md +69 -0
- package/templates/MIGRATION.md +86 -0
- package/templates/POSTMORTEM.md +88 -0
- package/templates/PRD.md +80 -0
- package/templates/PROGRESS.md +49 -0
- package/templates/ROADMAP.md +47 -0
- package/templates/SPIKE.md +72 -0
- package/templates/STACK-DECISION.md +61 -0
- package/workflows/audit-only.yaml +22 -0
- package/workflows/bluefield-arc.yaml +87 -0
- package/workflows/brownfield-arc.yaml +44 -0
- package/workflows/deps-audit.yaml +56 -0
- package/workflows/docs-arc.yaml +22 -0
- package/workflows/feature-arc.yaml +59 -0
- package/workflows/full-arc.yaml +84 -0
- package/workflows/hotfix-arc.yaml +59 -0
- package/workflows/hygiene.yaml +43 -0
- package/workflows/migration-arc.yaml +73 -0
- package/workflows/postmortem.yaml +31 -0
- package/workflows/refactor-arc.yaml +59 -0
- package/workflows/spike.yaml +23 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Vertical Slices
|
|
2
|
+
|
|
3
|
+
> A slice delivers ONE user-visible behavior end-to-end. Not "set up the
|
|
4
|
+
> database." That's horizontal.
|
|
5
|
+
|
|
6
|
+
## Vertical vs horizontal
|
|
7
|
+
|
|
8
|
+
### Horizontal (rejected)
|
|
9
|
+
- "Set up the database"
|
|
10
|
+
- "Build the API layer"
|
|
11
|
+
- "Create the UI components"
|
|
12
|
+
|
|
13
|
+
User can't do anything until ALL three ship. High WIP, late integration.
|
|
14
|
+
|
|
15
|
+
### Vertical (accepted)
|
|
16
|
+
- "User can sign up with email and password"
|
|
17
|
+
- "User can connect their Stripe account"
|
|
18
|
+
- "User sees current MRR on the dashboard"
|
|
19
|
+
|
|
20
|
+
Each one ships independently. User sees value progressively.
|
|
21
|
+
|
|
22
|
+
## Anatomy of a slice
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Slice 1.3: User can connect Stripe account
|
|
26
|
+
|
|
27
|
+
Files:
|
|
28
|
+
- src/auth/stripe-oauth-init.ts
|
|
29
|
+
- src/auth/stripe-oauth-init.test.ts
|
|
30
|
+
- src/auth/stripe-oauth-callback.ts
|
|
31
|
+
- src/auth/stripe-oauth-callback.test.ts
|
|
32
|
+
- src/db/migrations/003_stripe_accounts.sql
|
|
33
|
+
- src/components/StripeConnectButton.tsx
|
|
34
|
+
- src/components/StripeConnectButton.test.tsx
|
|
35
|
+
|
|
36
|
+
Tests first (in order, RED -> GREEN -> REFACTOR):
|
|
37
|
+
1. test: oauth_init_returns_authorize_url
|
|
38
|
+
2. test: oauth_init_includes_csrf_state
|
|
39
|
+
3. test: oauth_callback_validates_state
|
|
40
|
+
4. test: oauth_callback_stores_encrypted_token
|
|
41
|
+
5. test: oauth_callback_redirects_to_dashboard
|
|
42
|
+
|
|
43
|
+
Implementation steps:
|
|
44
|
+
1. RED: write all 5 tests above; run; all fail
|
|
45
|
+
2. GREEN: implement init -> callback flow until tests pass
|
|
46
|
+
3. REFACTOR: extract common state validation; clean up
|
|
47
|
+
|
|
48
|
+
Verification:
|
|
49
|
+
- All 5 tests green
|
|
50
|
+
- Manual: complete OAuth flow in dev environment
|
|
51
|
+
- Token visible in stripe_accounts table (encrypted)
|
|
52
|
+
- User redirected to dashboard
|
|
53
|
+
|
|
54
|
+
Dependencies: Slice 1.1 (signup), Slice 1.2 (login)
|
|
55
|
+
Wave: 2
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Common mistakes
|
|
59
|
+
|
|
60
|
+
### Slice too big
|
|
61
|
+
"User can use the entire dashboard" is not a slice. It's a milestone.
|
|
62
|
+
|
|
63
|
+
Break it: "User can see MRR card", "User can see growth chart", etc.
|
|
64
|
+
|
|
65
|
+
### Slice not user-visible
|
|
66
|
+
"Refactor the auth middleware" is not a slice (no user behavior changes).
|
|
67
|
+
That's a refactor; route to /god-refactor.
|
|
68
|
+
|
|
69
|
+
### Slice has hidden dependencies
|
|
70
|
+
"User can export CSV" depends on data-fetch slice, which depends on auth
|
|
71
|
+
slice. Make dependencies explicit.
|
|
72
|
+
|
|
73
|
+
### Slice spans multiple commits
|
|
74
|
+
A slice is one atomic commit. If it takes 5 commits to land safely, it's
|
|
75
|
+
too big.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Build Waves
|
|
2
|
+
|
|
3
|
+
> Independent slices run in parallel within a wave. Waves run sequentially.
|
|
4
|
+
> Maximizes throughput; minimizes context rot.
|
|
5
|
+
|
|
6
|
+
## Detection
|
|
7
|
+
|
|
8
|
+
Two slices can be in the same wave if:
|
|
9
|
+
- They modify different files (no merge conflicts)
|
|
10
|
+
- They don't depend on each other's output
|
|
11
|
+
- Neither needs the other's data
|
|
12
|
+
|
|
13
|
+
## Worked example
|
|
14
|
+
|
|
15
|
+
Milestone: User can see MRR breakdown.
|
|
16
|
+
|
|
17
|
+
### Slice plan
|
|
18
|
+
|
|
19
|
+
| Slice | Files | Depends on |
|
|
20
|
+
|-------|-------|------------|
|
|
21
|
+
| 1.1 Signup | src/auth/signup.ts | none |
|
|
22
|
+
| 1.2 Login | src/auth/login.ts | 1.1 |
|
|
23
|
+
| 1.3 Stripe OAuth | src/auth/stripe-*.ts, src/db/stripe_accounts | 1.1, 1.2 |
|
|
24
|
+
| 1.4 Stripe sync worker | src/worker/stripe-sync.ts | 1.3 |
|
|
25
|
+
| 1.5 MRR query API | src/api/mrr.ts | 1.3, 1.4 |
|
|
26
|
+
| 1.6 Dashboard UI | src/components/Dashboard.tsx | 1.5 |
|
|
27
|
+
|
|
28
|
+
### Wave grouping
|
|
29
|
+
|
|
30
|
+
- Wave 1: Slice 1.1 (no dependencies)
|
|
31
|
+
- Wave 2: Slice 1.2 (depends on 1.1)
|
|
32
|
+
- Wave 3: Slice 1.3 (depends on 1.1, 1.2)
|
|
33
|
+
- Wave 4: Slice 1.4 + Slice 1.5 (parallel; 1.4 worker writes, 1.5 API reads, but different files)
|
|
34
|
+
- Wave 5: Slice 1.6 (depends on 1.5)
|
|
35
|
+
|
|
36
|
+
In Wave 4, two agents work in parallel on different files. Each gets fresh
|
|
37
|
+
context. Each enforces TDD. Each goes through two-stage review independently.
|
|
38
|
+
|
|
39
|
+
## Anti-patterns
|
|
40
|
+
|
|
41
|
+
### Wave too wide
|
|
42
|
+
Putting 10 parallel slices in one wave. Even if technically independent,
|
|
43
|
+
review and integration become coordination heavy.
|
|
44
|
+
|
|
45
|
+
**Rule of thumb**: max 3-4 parallel slices per wave.
|
|
46
|
+
|
|
47
|
+
### Hidden cross-wave dependency
|
|
48
|
+
Slice 4.1 thinks it's independent but actually reads a config file that
|
|
49
|
+
Slice 4.2 modifies. Race condition.
|
|
50
|
+
|
|
51
|
+
**Fix**: spell out READ dependencies, not just WRITE dependencies.
|
|
52
|
+
|
|
53
|
+
### Sequential when parallel-safe
|
|
54
|
+
Putting Slice X and Slice Y in different waves when they're actually
|
|
55
|
+
independent.
|
|
56
|
+
|
|
57
|
+
**Cost**: wasted wall-clock time. Each agent runs serially when they could
|
|
58
|
+
run in parallel.
|
|
59
|
+
|
|
60
|
+
**Fix**: at planning time, look hard for shared file modifications. If none,
|
|
61
|
+
parallelize.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Building References
|
|
2
|
+
|
|
3
|
+
Per-tier reference content for Tier 2 (Building: Repo, Build).
|
|
4
|
+
|
|
5
|
+
## Files
|
|
6
|
+
|
|
7
|
+
- (placeholder)
|
|
8
|
+
|
|
9
|
+
## Planned content
|
|
10
|
+
|
|
11
|
+
- TDD violation examples with how-to-fix
|
|
12
|
+
- Two-stage review checklists with worked findings
|
|
13
|
+
- Vertical slice anatomy with anti-examples (horizontal "set up the database")
|
|
14
|
+
- Atomic commit examples
|
|
15
|
+
- Wave parallelism dependency analysis worked examples
|
|
16
|
+
|
|
17
|
+
See [HAVE-NOTS.md](../HAVE-NOTS.md) for the canonical failure-mode catalog.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Color
|
|
2
|
+
|
|
3
|
+
> Godpowers' baseline guidance for color. Shallower than
|
|
4
|
+
> [Impeccable's color-and-contrast reference](https://github.com/pbakaus/impeccable/blob/main/skill/reference/color-and-contrast.md);
|
|
5
|
+
> use this when Impeccable isn't installed.
|
|
6
|
+
|
|
7
|
+
## Use OKLCH
|
|
8
|
+
|
|
9
|
+
Modern displays support wide gamuts. OKLCH gives you:
|
|
10
|
+
|
|
11
|
+
- Perceptually uniform lightness (a 60% L color reads as the same
|
|
12
|
+
brightness regardless of hue)
|
|
13
|
+
- Predictable contrast adjustments (drop L by 10 to darken, period)
|
|
14
|
+
- Wide-gamut accuracy for modern displays
|
|
15
|
+
- A graceful fallback through CSS Color 4
|
|
16
|
+
|
|
17
|
+
```yaml
|
|
18
|
+
colors:
|
|
19
|
+
ink: "oklch(20% 0.01 250)" # near-black, slight blue cast
|
|
20
|
+
paper: "oklch(98% 0.005 80)" # warm white
|
|
21
|
+
accent: "oklch(60% 0.18 250)" # blue accent
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
If your linter requires hex (e.g., Google Stitch): use hex for tokens,
|
|
25
|
+
add OKLCH equivalents in CSS variables, document both.
|
|
26
|
+
|
|
27
|
+
## The 5-color rule
|
|
28
|
+
|
|
29
|
+
A small palette ships faster and looks more confident than a large one.
|
|
30
|
+
Aim for:
|
|
31
|
+
|
|
32
|
+
1. **ink** - body text and headlines
|
|
33
|
+
2. **paper** - canvas / background
|
|
34
|
+
3. **rule** - borders, dividers, hairlines
|
|
35
|
+
4. **accent** - the one chromatic color used for action and emphasis
|
|
36
|
+
5. **muted** - secondary text, disabled states
|
|
37
|
+
|
|
38
|
+
Add growth/shrink (positive/negative) only if the product has
|
|
39
|
+
directional data (charts, dashboards). Add success/warning/danger only
|
|
40
|
+
if the product has stateful UI (forms, alerts). Otherwise stop at 5.
|
|
41
|
+
|
|
42
|
+
## Anti-patterns
|
|
43
|
+
|
|
44
|
+
- **Purple-to-blue gradients on CTAs.** The default of every AI-built
|
|
45
|
+
SaaS in 2024-2025. Tells.
|
|
46
|
+
- **Pure black (#000) on pure white (#fff).** Too much contrast at
|
|
47
|
+
large sizes; eye-tiring on long reads. Use near-black (10-15% L).
|
|
48
|
+
- **Gray text on colored backgrounds.** Gray on cream looks like CSS
|
|
49
|
+
rendering broke. Use a colored variant matched to the background.
|
|
50
|
+
- **Rainbow palettes.** Six chromatic colors competing. Pick one.
|
|
51
|
+
- **Bright Material-style red for errors.** Reserved for genuine
|
|
52
|
+
destructive actions, not validation messages.
|
|
53
|
+
|
|
54
|
+
## Contrast (WCAG)
|
|
55
|
+
|
|
56
|
+
| Ratio | Level | Use |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| 3:1 | AA Large (>=18pt or 14pt bold) | Display headlines |
|
|
59
|
+
| 4.5:1 | AA Normal | Body text, labels, links |
|
|
60
|
+
| 7:1 | AAA Normal | High-bar accessibility |
|
|
61
|
+
| 4.5:1 | AA non-text | Icons, focus rings, borders |
|
|
62
|
+
|
|
63
|
+
The runtime audit (Phase 11) checks 4.5:1 on text-on-background
|
|
64
|
+
components. Below that, BLOCK.
|
|
65
|
+
|
|
66
|
+
### Common pairings that work
|
|
67
|
+
|
|
68
|
+
| Background | Text | Ratio |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| `#1a1c1e` (near-black) | `#f7f8f8` (paper) | 18.4 (AAA) |
|
|
71
|
+
| `#fafafa` (paper) | `#0f1011` (deep) | 19.7 (AAA) |
|
|
72
|
+
| `#f4ebdc` (cream) | `#1f1a15` (ink) | 13.5 (AAA) |
|
|
73
|
+
|
|
74
|
+
### Common pairings that fail
|
|
75
|
+
|
|
76
|
+
| Background | Text | Ratio | Status |
|
|
77
|
+
|---|---|---|---|
|
|
78
|
+
| `#fda4af` (pink) | `#ffffff` | 1.8 | Fail |
|
|
79
|
+
| `#a3a3a3` (gray) | `#ffffff` | 2.6 | Fail |
|
|
80
|
+
| `#1f1a15` (dark) | `#5b4f44` (taupe) | 5.9 | Pass AA |
|
|
81
|
+
|
|
82
|
+
## Dark mode
|
|
83
|
+
|
|
84
|
+
If you support dark mode, design it as its own surface, not an
|
|
85
|
+
inversion. Tokens needed:
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
colors:
|
|
89
|
+
canvas-light: "oklch(98% 0.005 80)"
|
|
90
|
+
canvas-dark: "oklch(15% 0.01 250)"
|
|
91
|
+
ink-light: "oklch(20% 0.01 250)" # on light canvas
|
|
92
|
+
ink-dark: "oklch(95% 0.01 250)" # on dark canvas
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Mapping rule: dark mode lowers contrast slightly (16:1 -> 12:1) to
|
|
96
|
+
reduce eye strain. Don't simply invert; that produces glaring
|
|
97
|
+
reverse-contrast surfaces.
|
|
98
|
+
|
|
99
|
+
## Tinted neutrals
|
|
100
|
+
|
|
101
|
+
Pure grays look industrial and cold. Tint your neutrals toward the
|
|
102
|
+
accent's hue family:
|
|
103
|
+
|
|
104
|
+
```yaml
|
|
105
|
+
colors:
|
|
106
|
+
# accent is blue (250 hue); tint neutrals toward 250
|
|
107
|
+
ink: "oklch(20% 0.01 250)" # subtly blue-cast
|
|
108
|
+
rule: "oklch(88% 0.005 250)" # subtly blue-cast border
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Even 0.005 chroma at the same hue makes neutrals feel intentional.
|
|
112
|
+
|
|
113
|
+
## Have-Nots
|
|
114
|
+
|
|
115
|
+
You fail color if:
|
|
116
|
+
|
|
117
|
+
- Pure #000000 or #ffffff in regular text use
|
|
118
|
+
- Purple-blue gradient on primary CTA
|
|
119
|
+
- Gray text on colored background
|
|
120
|
+
- More than 5 base colors before semantic additions
|
|
121
|
+
- WCAG AA fail on any text-on-background component
|
|
122
|
+
- More than 3 chromatic colors in the palette
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# DESIGN.md Anatomy
|
|
2
|
+
|
|
3
|
+
> What a good DESIGN.md looks like. Format follows the
|
|
4
|
+
> [Google Labs design.md spec](https://github.com/google-labs-code/design.md);
|
|
5
|
+
> tone and discipline follow the
|
|
6
|
+
> [Impeccable skill](https://github.com/pbakaus/impeccable).
|
|
7
|
+
|
|
8
|
+
## Structure
|
|
9
|
+
|
|
10
|
+
A DESIGN.md has two layers:
|
|
11
|
+
|
|
12
|
+
1. **YAML frontmatter** (machine-readable design tokens, delimited by `---`)
|
|
13
|
+
2. **Markdown body** (human-readable rationale organized into `##` sections)
|
|
14
|
+
|
|
15
|
+
The tokens are normative. The prose explains how to apply them.
|
|
16
|
+
|
|
17
|
+
## Required frontmatter fields
|
|
18
|
+
|
|
19
|
+
| Field | Required | Format |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| `name` | yes | string (e.g., "Heritage", "MRR Tracker") |
|
|
22
|
+
| `description` | yes | one-line summary of the visual register |
|
|
23
|
+
| `colors` | yes if visual surface | map of token-name -> color value |
|
|
24
|
+
| `typography` | yes if visual surface | map of style-name -> typography object |
|
|
25
|
+
| `rounded` | optional | map of scale-level -> dimension |
|
|
26
|
+
| `spacing` | yes if visual surface | map of scale-level -> dimension |
|
|
27
|
+
| `components` | optional | map of component-name -> sub-token map |
|
|
28
|
+
|
|
29
|
+
## Section order
|
|
30
|
+
|
|
31
|
+
Use `##` headings. Sections can be omitted; those present must appear in this order:
|
|
32
|
+
|
|
33
|
+
| # | Section | Aliases |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| 1 | Overview | Brand & Style |
|
|
36
|
+
| 2 | Colors | |
|
|
37
|
+
| 3 | Typography | |
|
|
38
|
+
| 4 | Layout | Layout & Spacing |
|
|
39
|
+
| 5 | Elevation & Depth | Elevation |
|
|
40
|
+
| 6 | Shapes | |
|
|
41
|
+
| 7 | Components | |
|
|
42
|
+
| 8 | Do's and Don'ts | |
|
|
43
|
+
|
|
44
|
+
Duplicate `##` headings are an error.
|
|
45
|
+
|
|
46
|
+
## Token references
|
|
47
|
+
|
|
48
|
+
Components can reference tokens via curly-brace syntax: `{colors.primary}`,
|
|
49
|
+
`{rounded.sm}`. Token references must resolve to a defined token.
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
components:
|
|
53
|
+
button-primary:
|
|
54
|
+
backgroundColor: "{colors.tertiary}"
|
|
55
|
+
textColor: "{colors.on-tertiary}"
|
|
56
|
+
rounded: "{rounded.sm}"
|
|
57
|
+
padding: 12px
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## What "good" looks like
|
|
61
|
+
|
|
62
|
+
A good DESIGN.md:
|
|
63
|
+
|
|
64
|
+
- [DECISION] Names a register: brand or product. Brand surfaces (marketing,
|
|
65
|
+
landing) are ornamental. Product surfaces (app shell, dashboards) serve
|
|
66
|
+
the data.
|
|
67
|
+
- [DECISION] Uses OKLCH for colors when wide-gamut accuracy matters.
|
|
68
|
+
Falls back to hex sRGB for compatibility with linters that don't yet
|
|
69
|
+
parse OKLCH.
|
|
70
|
+
- [DECISION] Sets typography for one or two type families maximum. The
|
|
71
|
+
display family may differ from the body family if the register calls
|
|
72
|
+
for it.
|
|
73
|
+
- [DECISION] Names every component used in the UI. Variants (hover,
|
|
74
|
+
active, disabled) are separate component entries with related keys.
|
|
75
|
+
- [DECISION] Includes a Do's and Don'ts section with explicit
|
|
76
|
+
anti-patterns: what NOT to do for this design.
|
|
77
|
+
- [DECISION] Stays under 300 lines. Heavy detail (component variations,
|
|
78
|
+
edge cases) lives in code documentation, not DESIGN.md.
|
|
79
|
+
|
|
80
|
+
## What "bad" looks like
|
|
81
|
+
|
|
82
|
+
See [DESIGN-ANTIPATTERNS.md](./DESIGN-ANTIPATTERNS.md).
|
|
83
|
+
|
|
84
|
+
## Validation
|
|
85
|
+
|
|
86
|
+
Every DESIGN.md should pass:
|
|
87
|
+
|
|
88
|
+
- `npx @google/design.md lint DESIGN.md` (Google Labs spec linter)
|
|
89
|
+
- `npx impeccable detect DESIGN.md` (Impeccable anti-patterns)
|
|
90
|
+
|
|
91
|
+
Godpowers' god-design-reviewer agent runs both as part of the two-stage
|
|
92
|
+
review gate.
|
|
93
|
+
|
|
94
|
+
## Worked example
|
|
95
|
+
|
|
96
|
+
See `examples/saas-mrr-tracker/DESIGN.md` for a complete, lint-clean example.
|
|
97
|
+
|
|
98
|
+
## Domain-specific references
|
|
99
|
+
|
|
100
|
+
These shorter, focused references cover the 7 design domains at
|
|
101
|
+
shallower depth than Impeccable's full skill set. Used by god-designer
|
|
102
|
+
when Impeccable is not installed; useful as a baseline regardless:
|
|
103
|
+
|
|
104
|
+
- [TYPOGRAPHY.md](./TYPOGRAPHY.md) - type families, scales, line-height,
|
|
105
|
+
tabular numerals
|
|
106
|
+
- [COLOR.md](./COLOR.md) - OKLCH, 5-color rule, WCAG contrast,
|
|
107
|
+
dark mode, tinted neutrals
|
|
108
|
+
- [SPATIAL.md](./SPATIAL.md) - spacing scales, grids, touch targets,
|
|
109
|
+
vertical rhythm
|
|
110
|
+
- [MOTION.md](./MOTION.md) - durations, easings, prefers-reduced-motion,
|
|
111
|
+
staggering
|
|
112
|
+
- [INTERACTION.md](./INTERACTION.md) - forms, focus states, buttons,
|
|
113
|
+
loading patterns, empty states
|
|
114
|
+
- [RESPONSIVE.md](./RESPONSIVE.md) - breakpoints, mobile-first, touch
|
|
115
|
+
targets, container queries
|
|
116
|
+
- [UX-WRITING.md](./UX-WRITING.md) - button labels, error messages,
|
|
117
|
+
empty states, tone calibration
|
|
118
|
+
|
|
119
|
+
For deeper guidance on any domain, install
|
|
120
|
+
[Impeccable](https://github.com/pbakaus/impeccable) and use its 7
|
|
121
|
+
domain-specific skills.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# DESIGN.md Antipatterns
|
|
2
|
+
|
|
3
|
+
> Common ways DESIGN.md fails. Each has a sample, why it fails, and the fix.
|
|
4
|
+
|
|
5
|
+
## 1. The Tellable Token Set
|
|
6
|
+
|
|
7
|
+
**Sample**: `colors.primary: "#4f46e5"` (purple-blue), `colors.gradient:
|
|
8
|
+
"linear-gradient(...)"`, every heading uses Inter, every CTA uses an
|
|
9
|
+
indigo-to-purple gradient.
|
|
10
|
+
|
|
11
|
+
**Why it fails**: Every AI-generated SaaS in 2024-2025 uses this palette.
|
|
12
|
+
The tokens betray that the design system was generated, not chosen.
|
|
13
|
+
|
|
14
|
+
**Fix**: Pick a register first (brand vs product) and a reference (a real
|
|
15
|
+
brand whose voice resembles yours). Avoid the 5 tells: Inter everywhere,
|
|
16
|
+
purple-blue gradients, cards-in-cards, gray text on colored backgrounds,
|
|
17
|
+
rounded-square icon tiles above every heading.
|
|
18
|
+
|
|
19
|
+
## 2. The Reference That Doesn't Resolve
|
|
20
|
+
|
|
21
|
+
**Sample**:
|
|
22
|
+
```yaml
|
|
23
|
+
components:
|
|
24
|
+
button-primary:
|
|
25
|
+
backgroundColor: "{colors.tertiary}"
|
|
26
|
+
textColor: "{colors.on-tertiary}"
|
|
27
|
+
```
|
|
28
|
+
But `colors.tertiary` is not defined in the colors block.
|
|
29
|
+
|
|
30
|
+
**Why it fails**: Token references break silently. The UI renders with
|
|
31
|
+
fallback colors that don't match the design intent.
|
|
32
|
+
|
|
33
|
+
**Fix**: Run the Google Labs linter; it catches unresolved references
|
|
34
|
+
mechanically. The god-design-reviewer agent gates on this.
|
|
35
|
+
|
|
36
|
+
## 3. The Theme Without a Reason
|
|
37
|
+
|
|
38
|
+
**Sample**: DESIGN.md exists but has no Overview section explaining the
|
|
39
|
+
visual register or rationale.
|
|
40
|
+
|
|
41
|
+
**Why it fails**: Future agents (and team members) don't know what the
|
|
42
|
+
design is meant to feel like. The first refactor or new component drifts
|
|
43
|
+
toward whatever the current contributor's defaults are.
|
|
44
|
+
|
|
45
|
+
**Fix**: Overview section answers two questions: "what register is this?"
|
|
46
|
+
(brand vs product) and "what does it feel like?" (one-paragraph mood
|
|
47
|
+
description grounded in named references).
|
|
48
|
+
|
|
49
|
+
## 4. The Component Sprawl
|
|
50
|
+
|
|
51
|
+
**Sample**: `components` block has 50 entries: every shade of every
|
|
52
|
+
button variant, every modal type, every input state.
|
|
53
|
+
|
|
54
|
+
**Why it fails**: 50 components means 50 places drift can hide. Each is
|
|
55
|
+
usually slightly inconsistent. The system becomes its own anti-system.
|
|
56
|
+
|
|
57
|
+
**Fix**: Name only the canonical components. Variants (hover, active,
|
|
58
|
+
disabled) are systematic, not bespoke. If you have 50 components, you
|
|
59
|
+
have a redundancy problem.
|
|
60
|
+
|
|
61
|
+
## 5. The Contrast Failure
|
|
62
|
+
|
|
63
|
+
**Sample**: `colors.cta-bg: "#fda4af"` (light pink), `colors.cta-text:
|
|
64
|
+
"#ffffff"` (white). Contrast ratio: 1.8:1. WCAG AA fails.
|
|
65
|
+
|
|
66
|
+
**Why it fails**: The button is unreadable for users with low vision,
|
|
67
|
+
in bright sunlight, or on calibrated-low-contrast displays. Often
|
|
68
|
+
unreadable for everyone.
|
|
69
|
+
|
|
70
|
+
**Fix**: Linter computes WCAG contrast ratio for every text-on-background
|
|
71
|
+
component pair. Anything below 4.5:1 (AA) is BLOCKED by the design
|
|
72
|
+
reviewer. AAA requires 7:1.
|
|
73
|
+
|
|
74
|
+
## 6. The Stale Tokens
|
|
75
|
+
|
|
76
|
+
**Sample**: DESIGN.md says `colors.primary: "#1A1C1E"`. The actual app
|
|
77
|
+
uses `#000000` because someone "fixed it" in the CSS without updating
|
|
78
|
+
the spec.
|
|
79
|
+
|
|
80
|
+
**Why it fails**: DESIGN.md becomes aspirational. Code is the source of
|
|
81
|
+
truth; nobody trusts the spec.
|
|
82
|
+
|
|
83
|
+
**Fix**: Reverse-sync (Phase 6) detects drift between DESIGN.md tokens
|
|
84
|
+
and actual usage in CSS/styled-components. Drift findings flow into
|
|
85
|
+
REVIEW-REQUIRED.md.
|
|
86
|
+
|
|
87
|
+
## 7. The Missing Anti-References
|
|
88
|
+
|
|
89
|
+
**Sample**: PRODUCT.md says "we want a calm, editorial feel." DESIGN.md
|
|
90
|
+
implements the colors and typography but doesn't list what to avoid.
|
|
91
|
+
|
|
92
|
+
**Why it fails**: AI agents and developers look for cues. Without explicit
|
|
93
|
+
anti-references, they import patterns from popular component libraries
|
|
94
|
+
(shadcn defaults, Material Design) that may not match the intended feel.
|
|
95
|
+
|
|
96
|
+
**Fix**: Do's and Don'ts section names specific patterns to avoid:
|
|
97
|
+
"don't use bright primary blue (would feel category-AI)", "don't nest
|
|
98
|
+
cards inside cards", "don't use gradients."
|
|
99
|
+
|
|
100
|
+
## 8. The Token Without a Use
|
|
101
|
+
|
|
102
|
+
**Sample**: 30 colors defined; only 8 referenced in components.
|
|
103
|
+
|
|
104
|
+
**Why it fails**: Unused tokens are dead weight. They suggest options
|
|
105
|
+
that aren't actually offered. Future contributors apply them
|
|
106
|
+
incorrectly because they exist.
|
|
107
|
+
|
|
108
|
+
**Fix**: Linter reports unused tokens. Remove or use them.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Interaction Design
|
|
2
|
+
|
|
3
|
+
> Godpowers' baseline guidance for forms, focus, and feedback.
|
|
4
|
+
> Shallower than
|
|
5
|
+
> [Impeccable's interaction-design reference](https://github.com/pbakaus/impeccable/blob/main/skill/reference/interaction-design.md).
|
|
6
|
+
|
|
7
|
+
## Focus states are not optional
|
|
8
|
+
|
|
9
|
+
Every interactive element gets a visible focus state:
|
|
10
|
+
|
|
11
|
+
```css
|
|
12
|
+
:focus-visible {
|
|
13
|
+
outline: 2px solid var(--colors-accent);
|
|
14
|
+
outline-offset: 2px;
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Use `:focus-visible` (not `:focus`) so mouse clicks don't show focus
|
|
19
|
+
rings while keyboard navigation does.
|
|
20
|
+
|
|
21
|
+
The ring color must pass 3:1 contrast against both surface AND its
|
|
22
|
+
adjacent surface. Yellow rings on green surfaces fail that.
|
|
23
|
+
|
|
24
|
+
## Forms
|
|
25
|
+
|
|
26
|
+
### Labels above, errors below
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
[Email]
|
|
30
|
+
+----------------+
|
|
31
|
+
| user@example.. |
|
|
32
|
+
+----------------+
|
|
33
|
+
Please use a valid work email.
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Inline labels (placeholder-only) lose context once typing starts. Use
|
|
37
|
+
real labels.
|
|
38
|
+
|
|
39
|
+
### Error messaging
|
|
40
|
+
|
|
41
|
+
Three rules:
|
|
42
|
+
|
|
43
|
+
1. **Specific.** "Invalid email" is bad. "Email must include @ and a
|
|
44
|
+
domain" is better. "alice@example is missing the .com" is best.
|
|
45
|
+
2. **Forward-looking.** Tell the user what to do, not what they did
|
|
46
|
+
wrong. "Please use a work email address" beats "Personal addresses
|
|
47
|
+
are not allowed."
|
|
48
|
+
3. **Inline, not modal.** Modal alerts for form errors are aggressive.
|
|
49
|
+
Place the message under the field that errored.
|
|
50
|
+
|
|
51
|
+
### When to validate
|
|
52
|
+
|
|
53
|
+
- **On submit**: always
|
|
54
|
+
- **On blur**: yes for required fields and format-specific (email,
|
|
55
|
+
date, phone)
|
|
56
|
+
- **On input**: only for soft hints (password strength, character count,
|
|
57
|
+
username availability). Not for "this is wrong" messages until blur.
|
|
58
|
+
|
|
59
|
+
### Required fields
|
|
60
|
+
|
|
61
|
+
Mark with a visible indicator (asterisk + colored to accent) AND
|
|
62
|
+
include a short note: "Fields marked with * are required." Don't rely
|
|
63
|
+
on color alone.
|
|
64
|
+
|
|
65
|
+
## Buttons
|
|
66
|
+
|
|
67
|
+
### Hierarchy
|
|
68
|
+
|
|
69
|
+
| Type | When | Visual |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| Primary | The one main action of the screen | Filled accent color |
|
|
72
|
+
| Secondary | Important but not primary | Outlined or tinted |
|
|
73
|
+
| Tertiary / link | Low-priority or destructive | Text-style, possibly underlined |
|
|
74
|
+
| Destructive | Delete, cancel-with-loss | Filled red OR confirmation modal |
|
|
75
|
+
|
|
76
|
+
One primary per screen. More than one creates ambiguity.
|
|
77
|
+
|
|
78
|
+
### Anti-patterns
|
|
79
|
+
|
|
80
|
+
- **All buttons the same weight.** No visual hierarchy.
|
|
81
|
+
- **Disabled buttons with no explanation.** If a button is disabled,
|
|
82
|
+
tell the user why (in a tooltip or below).
|
|
83
|
+
- **Icon-only buttons without aria-label.** Screen readers say nothing.
|
|
84
|
+
- **Two-line button labels.** Wrap is fine, but if your CTA reads on
|
|
85
|
+
multiple lines you've buried the action.
|
|
86
|
+
|
|
87
|
+
## Loading and feedback
|
|
88
|
+
|
|
89
|
+
| Action | Feedback |
|
|
90
|
+
|---|---|
|
|
91
|
+
| < 200ms | Nothing |
|
|
92
|
+
| 200ms-1s | Spinner inside the button |
|
|
93
|
+
| 1-3s | Skeleton in the affected region |
|
|
94
|
+
| 3-10s | Progress bar with percentage if known |
|
|
95
|
+
| > 10s | Background-task pattern: dismissible toast, "we'll notify you" |
|
|
96
|
+
|
|
97
|
+
Always disable the trigger while the action is in flight. Re-enable on
|
|
98
|
+
success / failure with appropriate state.
|
|
99
|
+
|
|
100
|
+
## Confirmations
|
|
101
|
+
|
|
102
|
+
Three patterns:
|
|
103
|
+
|
|
104
|
+
1. **Inline confirmation** (default for reversible actions): "Item
|
|
105
|
+
deleted. Undo." with a 5-10s window.
|
|
106
|
+
2. **Modal confirmation** (destructive, irreversible): "Delete account?
|
|
107
|
+
This cannot be undone." with explicit Yes/No.
|
|
108
|
+
3. **Type to confirm** (catastrophic): "Type 'delete-production' to
|
|
109
|
+
confirm." for destructive cluster-wide operations.
|
|
110
|
+
|
|
111
|
+
Modal everything is interruption theater.
|
|
112
|
+
|
|
113
|
+
## Empty states
|
|
114
|
+
|
|
115
|
+
A blank screen is a missed opportunity. Every empty state should:
|
|
116
|
+
|
|
117
|
+
1. Explain what would normally be here
|
|
118
|
+
2. Show how to populate it (the action that creates the first item)
|
|
119
|
+
3. Optionally: a link to docs or a sample dataset
|
|
120
|
+
|
|
121
|
+
Bad: "No data."
|
|
122
|
+
Good: "No invoices yet. Connect Stripe to start tracking MRR."
|
|
123
|
+
|
|
124
|
+
## Hover states
|
|
125
|
+
|
|
126
|
+
For desktop:
|
|
127
|
+
|
|
128
|
+
- Color shift: 10-15% lighter or darker
|
|
129
|
+
- Cursor change for clickables (`cursor: pointer` only on actual
|
|
130
|
+
clickables)
|
|
131
|
+
- Underline on text links (always; underline-on-hover only is bad
|
|
132
|
+
practice)
|
|
133
|
+
|
|
134
|
+
For touch devices: hover is unavailable; design for tap-only.
|
|
135
|
+
|
|
136
|
+
## Have-Nots
|
|
137
|
+
|
|
138
|
+
You fail interaction if:
|
|
139
|
+
|
|
140
|
+
- No `:focus-visible` outline
|
|
141
|
+
- Focus ring contrast < 3:1 against both surfaces
|
|
142
|
+
- Required fields marked with color alone
|
|
143
|
+
- Error messages in modals (instead of inline)
|
|
144
|
+
- Disabled buttons with no explanation
|
|
145
|
+
- Icon-only buttons without aria-label
|
|
146
|
+
- Empty states with no path forward
|
|
147
|
+
- Clicks on non-buttons styled with `cursor: pointer`
|
|
148
|
+
- Trigger not disabled during async action
|