@nurix/etna 0.19.10 → 0.19.12
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/data/harness-index.json +1 -1
- package/data/harnesses/code/harness.json +1 -1
- package/data/harnesses/code/rules/frontend.md +5 -5
- package/data/harnesses/code/skills/design/SKILL.md +70 -50
- package/data/harnesses/code/skills/design/components/charts.md +76 -0
- package/data/harnesses/code/skills/design/components/collections.md +132 -0
- package/data/harnesses/code/skills/design/components/feedback.md +47 -0
- package/data/harnesses/code/skills/design/components/hooks.md +35 -0
- package/data/harnesses/code/skills/design/components/index.md +143 -0
- package/data/harnesses/code/skills/design/components/inputs.md +327 -0
- package/data/harnesses/code/skills/design/components/layout.md +52 -0
- package/data/harnesses/code/skills/design/components/media.md +66 -0
- package/data/harnesses/code/skills/design/components/motion.md +82 -0
- package/data/harnesses/code/skills/design/components/navigation.md +29 -0
- package/data/harnesses/code/skills/design/components/overlays.md +72 -0
- package/data/harnesses/code/skills/design/components/setup.md +40 -0
- package/data/harnesses/code/skills/design/components/typography.md +46 -0
- package/data/harnesses/code/skills/design/components/utils.md +37 -0
- package/data/harnesses/code/skills/design/data/blueprints/browse.md +38 -0
- package/data/harnesses/code/skills/design/data/blueprints/creation-flow.md +38 -0
- package/data/harnesses/code/skills/design/data/blueprints/dashboard.md +38 -0
- package/data/harnesses/code/skills/design/data/blueprints/grid.md +38 -0
- package/data/harnesses/code/skills/design/data/blueprints/queue.md +38 -0
- package/data/harnesses/code/skills/design/data/blueprints/record-detail.md +38 -0
- package/data/harnesses/code/skills/design/data/blueprints/settings.md +38 -0
- package/data/harnesses/code/skills/design/data/chart-styling/Readme.md +33 -0
- package/data/harnesses/code/skills/design/data/chart-styling/carbon-accessible-alert-semantic.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/carbon-monochrome-sequential-trend.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/datadog-classic-six-aligned.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/datawrapper-tiered-gray-hierarchy.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/econ-red-rule-horizontal.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/financial-diverging-threshold-overlay.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/ft-vocabulary-ranked-muted.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/grafana-dark-threshold-bands.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/material-rounded-explicit-label.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/nyt-ghost-grid-direct-label.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/plot-currentcolor-inherit.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/saas-gradient-glow-area.md +19 -0
- package/data/harnesses/code/skills/design/data/chart-styling/shadcn-composable-css-vars.md +19 -0
- package/data/harnesses/code/skills/design/data/charts/census.csv +58 -0
- package/data/harnesses/code/skills/design/data/checklists/browse.md +21 -0
- package/data/harnesses/code/skills/design/data/checklists/creation-flow.md +20 -0
- package/data/harnesses/code/skills/design/data/checklists/dashboard.md +21 -0
- package/data/harnesses/code/skills/design/data/checklists/grid.md +21 -0
- package/data/harnesses/code/skills/design/data/checklists/queue.md +21 -0
- package/data/harnesses/code/skills/design/data/checklists/record-detail.md +21 -0
- package/data/harnesses/code/skills/design/data/checklists/settings.md +21 -0
- package/data/harnesses/code/skills/design/data/chrome/board-column.md +68 -0
- package/data/harnesses/code/skills/design/data/chrome/data-table.md +63 -0
- package/data/harnesses/code/skills/design/data/chrome/side-panel.md +60 -0
- package/data/harnesses/code/skills/design/data/chrome/sidebar.md +78 -0
- package/data/harnesses/code/skills/design/data/chrome/stat-cards.md +62 -0
- package/data/harnesses/code/skills/design/data/chrome/topbar.md +65 -0
- package/data/harnesses/code/skills/design/data/color/accent-presets.md +90 -0
- package/data/harnesses/code/skills/design/data/color/aesop-earth-mute.md +91 -0
- package/data/harnesses/code/skills/design/data/color/arc-peach-play.md +90 -0
- package/data/harnesses/code/skills/design/data/color/attio-hunter-teal.md +90 -0
- package/data/harnesses/code/skills/design/data/color/carbon-cyan-signal.md +90 -0
- package/data/harnesses/code/skills/design/data/color/clay-parchment.md +90 -0
- package/data/harnesses/code/skills/design/data/color/duolingo-feather.md +90 -0
- package/data/harnesses/code/skills/design/data/color/geist-mono-signal.md +90 -0
- package/data/harnesses/code/skills/design/data/color/linear-graphite-violet.md +90 -0
- package/data/harnesses/code/skills/design/data/color/mercury-onyx-cobalt.md +90 -0
- package/data/harnesses/code/skills/design/data/color/notion-paper-ink.md +90 -0
- package/data/harnesses/code/skills/design/data/color/radix-slate-iris.md +90 -0
- package/data/harnesses/code/skills/design/data/color/raycast-void-spectrum.md +90 -0
- package/data/harnesses/code/skills/design/data/color/spectrum-celery-fuchsia.md +90 -0
- package/data/harnesses/code/skills/design/data/color/stripe-blurple-ruby.md +90 -0
- package/data/harnesses/code/skills/design/data/color/superhuman-cod-picton.md +89 -0
- package/data/harnesses/code/skills/design/data/corpora/operations-review/companies.csv +15 -0
- package/data/harnesses/code/skills/design/data/corpora/operations-review/corpus.md +87 -0
- package/data/harnesses/code/skills/design/data/corpora/operations-review/people.csv +25 -0
- package/data/harnesses/code/skills/design/data/corpora/procurement-approvals/companies.csv +15 -0
- package/data/harnesses/code/skills/design/data/corpora/procurement-approvals/corpus.md +83 -0
- package/data/harnesses/code/skills/design/data/corpora/procurement-approvals/people.csv +25 -0
- package/data/harnesses/code/skills/design/data/corpora/revenue-analytics/companies.csv +15 -0
- package/data/harnesses/code/skills/design/data/corpora/revenue-analytics/corpus.md +89 -0
- package/data/harnesses/code/skills/design/data/corpora/revenue-analytics/people.csv +25 -0
- package/data/harnesses/code/skills/design/data/elevation/ant-design-directional-shadow.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/apple-liquid-glass-material.md +18 -0
- package/data/harnesses/code/skills/design/data/elevation/atlassian-surface-shadow-pairing.md +20 -0
- package/data/harnesses/code/skills/design/data/elevation/fluent-2-key-ambient-ramp.md +20 -0
- package/data/harnesses/code/skills/design/data/elevation/github-primer-sparing-shadow.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/ibm-carbon-layer-and-border.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/linear-dark-surface-ladder.md +17 -0
- package/data/harnesses/code/skills/design/data/elevation/material-2-key-ambient-dp-ramp.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/material-3-tonal-elevation.md +21 -0
- package/data/harnesses/code/skills/design/data/elevation/neobrutalist-hard-offset.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/neumorphic-soft-dual-shadow.md +18 -0
- package/data/harnesses/code/skills/design/data/elevation/notion-warm-minimal-hairline.md +17 -0
- package/data/harnesses/code/skills/design/data/elevation/polaris-elevation-inset-bevel.md +21 -0
- package/data/harnesses/code/skills/design/data/elevation/radix-themes-alpha-ring-scale.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/shadcn-neutral-derived-radius.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/stripe-brand-tinted-dual-shadow.md +18 -0
- package/data/harnesses/code/skills/design/data/elevation/tailwind-default-utility-scale.md +19 -0
- package/data/harnesses/code/skills/design/data/elevation/vercel-geist-shadow-as-border.md +20 -0
- package/data/harnesses/code/skills/design/data/gradients/amber-attention-fill.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/cloud-shadow-wash.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/confident-lavender-wash.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/ember-ship-flare.md +18 -0
- package/data/harnesses/code/skills/design/data/gradients/full-metal-wash.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/indigo-ruby-cta-band.md +18 -0
- package/data/harnesses/code/skills/design/data/gradients/linear-graphite-wash.md +18 -0
- package/data/harnesses/code/skills/design/data/gradients/marble-quartz-wash.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/midnight-aurora-panel.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/neutral-volume-fill.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/revenue-uptrend-fill.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/risk-decline-fill.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/signal-blue-develop.md +18 -0
- package/data/harnesses/code/skills/design/data/gradients/slate-mist-wash.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/stripe-atmosphere-mesh.md +18 -0
- package/data/harnesses/code/skills/design/data/gradients/teal-signal-accent.md +16 -0
- package/data/harnesses/code/skills/design/data/gradients/violet-magenta-promo.md +16 -0
- package/data/harnesses/code/skills/design/data/iconography.md +199 -0
- package/data/harnesses/code/skills/design/data/motion/accordion-expand.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/destructive-hold-confirm.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/drag-dismiss-momentum.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/empty-state-arrive.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/hover-lift.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/modal-center-arrive.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/number-ticker-roll.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/onboarding-bounce.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/panel-slide.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/press-feedback.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/progress-linear-loop.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/route-crossfade.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/rubber-band-overscroll.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/skeleton-shimmer.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/stagger-arrive.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/toast-enter-stack.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/tooltip-chain-instant.md +18 -0
- package/data/harnesses/code/skills/design/data/motion/trigger-anchored-reveal.md +18 -0
- package/data/harnesses/code/skills/design/data/tells.csv +34 -0
- package/data/harnesses/code/skills/design/data/typography/anton-work-sans.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/archivo-black-archivo.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/bitter-karla.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/dm-serif-dm-sans.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/fraunces-inter.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/geist-geist-mono.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/hubot-sans-mona-sans.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/ibm-plex-sans-operator-single-family.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/instrument-serif-instrument-sans.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/inter-operator-single-family.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/libre-baskerville-libre-franklin.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/newsreader-inter.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/playfair-display-source-sans.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/public-sans-operator-single-family.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/sohne-inter-fintech.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/source-serif-source-sans.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/space-grotesk-work-sans-space-mono.md +17 -0
- package/data/harnesses/code/skills/design/data/typography/spectral-manrope.md +17 -0
- package/data/harnesses/code/skills/design/data/voices/bright-collaborator.md +29 -0
- package/data/harnesses/code/skills/design/data/voices/direct-operator.md +29 -0
- package/data/harnesses/code/skills/design/data/voices/earnest-helper.md +29 -0
- package/data/harnesses/code/skills/design/data/voices/editorial-composed.md +29 -0
- package/data/harnesses/code/skills/design/data/voices/quiet-concierge.md +29 -0
- package/data/harnesses/code/skills/design/data/voices/warm-guide.md +29 -0
- package/data/harnesses/code/skills/design/design-md/SCHEMA.md +179 -0
- package/data/harnesses/code/skills/design/design-md/index.csv +67 -0
- package/data/harnesses/code/skills/design/design-md/library/airbnb.md +207 -0
- package/data/harnesses/code/skills/design/design-md/library/airtable.md +205 -0
- package/data/harnesses/code/skills/design/design-md/library/anthropic-claude.md +203 -0
- package/data/harnesses/code/skills/design/design-md/library/apple.md +206 -0
- package/data/harnesses/code/skills/design/design-md/library/binance.md +210 -0
- package/data/harnesses/code/skills/design/design-md/library/bmw.md +210 -0
- package/data/harnesses/code/skills/design/design-md/library/cal.md +209 -0
- package/data/harnesses/code/skills/design/design-md/library/clay.md +204 -0
- package/data/harnesses/code/skills/design/design-md/library/clickhouse.md +205 -0
- package/data/harnesses/code/skills/design/design-md/library/cohere.md +205 -0
- package/data/harnesses/code/skills/design/design-md/library/coinbase.md +198 -0
- package/data/harnesses/code/skills/design/design-md/library/composio.md +198 -0
- package/data/harnesses/code/skills/design/design-md/library/cursor.md +197 -0
- package/data/harnesses/code/skills/design/design-md/library/elevenlabs.md +199 -0
- package/data/harnesses/code/skills/design/design-md/library/expo.md +200 -0
- package/data/harnesses/code/skills/design/design-md/library/figma.md +199 -0
- package/data/harnesses/code/skills/design/design-md/library/framer.md +202 -0
- package/data/harnesses/code/skills/design/design-md/library/hashicorp.md +205 -0
- package/data/harnesses/code/skills/design/design-md/library/ibm.md +205 -0
- package/data/harnesses/code/skills/design/design-md/library/intercom.md +204 -0
- package/data/harnesses/code/skills/design/design-md/library/kraken.md +200 -0
- package/data/harnesses/code/skills/design/design-md/library/linear-app.md +198 -0
- package/data/harnesses/code/skills/design/design-md/library/lovable.md +199 -0
- package/data/harnesses/code/skills/design/design-md/library/meta.md +204 -0
- package/data/harnesses/code/skills/design/design-md/library/minimax.md +204 -0
- package/data/harnesses/code/skills/design/design-md/library/mintlify.md +210 -0
- package/data/harnesses/code/skills/design/design-md/library/miro.md +209 -0
- package/data/harnesses/code/skills/design/design-md/library/mistral-ai.md +201 -0
- package/data/harnesses/code/skills/design/design-md/library/mongodb.md +201 -0
- package/data/harnesses/code/skills/design/design-md/library/notion.md +204 -0
- package/data/harnesses/code/skills/design/design-md/library/nvidia.md +215 -0
- package/data/harnesses/code/skills/design/design-md/library/ollama.md +213 -0
- package/data/harnesses/code/skills/design/design-md/library/opencode-ai.md +216 -0
- package/data/harnesses/code/skills/design/design-md/library/posthog.md +218 -0
- package/data/harnesses/code/skills/design/design-md/library/raycast.md +214 -0
- package/data/harnesses/code/skills/design/design-md/library/replicate.md +202 -0
- package/data/harnesses/code/skills/design/design-md/library/resend.md +203 -0
- package/data/harnesses/code/skills/design/design-md/library/revolut.md +203 -0
- package/data/harnesses/code/skills/design/design-md/library/runwayml.md +203 -0
- package/data/harnesses/code/skills/design/design-md/library/sanity.md +200 -0
- package/data/harnesses/code/skills/design/design-md/library/sentry.md +201 -0
- package/data/harnesses/code/skills/design/design-md/library/shopify.md +202 -0
- package/data/harnesses/code/skills/design/design-md/library/slack.md +202 -0
- package/data/harnesses/code/skills/design/design-md/library/spacex.md +206 -0
- package/data/harnesses/code/skills/design/design-md/library/spotify.md +206 -0
- package/data/harnesses/code/skills/design/design-md/library/stripe.md +196 -0
- package/data/harnesses/code/skills/design/design-md/library/supabase.md +196 -0
- package/data/harnesses/code/skills/design/design-md/library/superhuman.md +194 -0
- package/data/harnesses/code/skills/design/design-md/library/tesla.md +198 -0
- package/data/harnesses/code/skills/design/design-md/library/theverge.md +199 -0
- package/data/harnesses/code/skills/design/design-md/library/together-ai.md +193 -0
- package/data/harnesses/code/skills/design/design-md/library/uber.md +195 -0
- package/data/harnesses/code/skills/design/design-md/library/vercel.md +195 -0
- package/data/harnesses/code/skills/design/design-md/library/voltagent.md +197 -0
- package/data/harnesses/code/skills/design/design-md/library/warp.md +196 -0
- package/data/harnesses/code/skills/design/design-md/library/webflow.md +197 -0
- package/data/harnesses/code/skills/design/design-md/library/wired.md +197 -0
- package/data/harnesses/code/skills/design/design-md/library/wise.md +198 -0
- package/data/harnesses/code/skills/design/design-md/library/x-ai.md +199 -0
- package/data/harnesses/code/skills/design/design-md/library/zapier.md +198 -0
- package/data/harnesses/code/skills/design/design-md/nurix.md +214 -0
- package/data/harnesses/code/skills/design/design-md/variants/editorial-luxury.md +184 -0
- package/data/harnesses/code/skills/design/design-md/variants/expressive-saas.md +216 -0
- package/data/harnesses/code/skills/design/design-md/variants/quiet-premium.md +211 -0
- package/data/harnesses/code/skills/design/design-md/variants/terse-dense-operator.md +212 -0
- package/data/harnesses/code/skills/design/design-md/variants/warm-approachable.md +216 -0
- package/data/harnesses/code/skills/design/references/compose.md +23 -0
- package/data/harnesses/code/skills/design/references/content.md +28 -0
- package/data/harnesses/code/skills/design/references/emission.md +21 -0
- package/data/harnesses/code/skills/design/references/existing-apps.md +27 -0
- package/data/harnesses/code/skills/design/references/intake.md +36 -0
- package/data/harnesses/code/skills/design/references/object-pass.md +24 -0
- package/data/harnesses/code/skills/design/references/ship-gate.md +29 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/Readme.md +195 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/ai-layer.md +49 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/attributes-lifecycle.md +43 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/container-choice.md +44 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/creation-paths.md +46 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/dashboards.md +42 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/modes.md +42 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/object-model.md +46 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/page-archetype.md +48 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/promotion-demotion.md +37 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/settings.md +42 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/standard-pages.md +46 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/state-matrix.md +41 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/table-mechanics.md +48 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/verbs.md +45 -0
- package/data/harnesses/code/skills/design/references/ux-patterns/viewer-context.md +40 -0
- package/data/harnesses/code/skills/design/scripts/README-validator.md +27 -0
- package/data/harnesses/code/skills/design/scripts/select-chart.mjs +596 -0
- package/data/harnesses/code/skills/design/scripts/validate-design-md.mjs +1198 -0
- package/data/harnesses/discussion/CLAUDE.md +1 -1
- package/data/harnesses/discussion/agents/discussion-baseline.md +27 -2
- package/data/harnesses/discussion/harness.json +2 -2
- package/data/harnesses/discussion/rules/artifacts.md +2 -0
- package/data/harnesses/discussion/rules/method.md +5 -1
- package/package.json +1 -1
- package/data/harnesses/code/skills/design/data/catalog/rules.csv +0 -137
- package/data/harnesses/code/skills/design/data/combinations/Readme.md +0 -33
- package/data/harnesses/code/skills/design/data/combinations/accent-presets.md +0 -113
- package/data/harnesses/code/skills/design/data/combinations/charts.csv +0 -33
- package/data/harnesses/code/skills/design/data/combinations/fonts-known.json +0 -448
- package/data/harnesses/code/skills/design/data/combinations/icons.csv +0 -157
- package/data/harnesses/code/skills/design/data/combinations/landing.csv +0 -38
- package/data/harnesses/code/skills/design/data/combinations/lucide-names.json +0 -2001
- package/data/harnesses/code/skills/design/data/combinations/manifest.json +0 -330
- package/data/harnesses/code/skills/design/data/combinations/motion.csv +0 -10
- package/data/harnesses/code/skills/design/data/combinations/palettes.csv +0 -92
- package/data/harnesses/code/skills/design/data/combinations/product-router.csv +0 -80
- package/data/harnesses/code/skills/design/data/combinations/styles.csv +0 -67
- package/data/harnesses/code/skills/design/data/combinations/typography.csv +0 -64
- package/data/harnesses/code/skills/design/data/design-md/SCHEMA.md +0 -106
- package/data/harnesses/code/skills/design/data/design-md/library/airbnb.md +0 -154
- package/data/harnesses/code/skills/design/data/design-md/library/airtable.md +0 -151
- package/data/harnesses/code/skills/design/data/design-md/library/anthropic-claude.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/apple.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/binance.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/bmw.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/cal.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/clay.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/clickhouse.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/cohere.md +0 -147
- package/data/harnesses/code/skills/design/data/design-md/library/coinbase.md +0 -156
- package/data/harnesses/code/skills/design/data/design-md/library/composio.md +0 -138
- package/data/harnesses/code/skills/design/data/design-md/library/cursor.md +0 -138
- package/data/harnesses/code/skills/design/data/design-md/library/elevenlabs.md +0 -137
- package/data/harnesses/code/skills/design/data/design-md/library/expo.md +0 -148
- package/data/harnesses/code/skills/design/data/design-md/library/figma.md +0 -141
- package/data/harnesses/code/skills/design/data/design-md/library/framer.md +0 -156
- package/data/harnesses/code/skills/design/data/design-md/library/hashicorp.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/ibm.md +0 -153
- package/data/harnesses/code/skills/design/data/design-md/library/intercom.md +0 -158
- package/data/harnesses/code/skills/design/data/design-md/library/kraken.md +0 -156
- package/data/harnesses/code/skills/design/data/design-md/library/linear-app.md +0 -122
- package/data/harnesses/code/skills/design/data/design-md/library/lovable.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/meta.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/minimax.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/mintlify.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/miro.md +0 -153
- package/data/harnesses/code/skills/design/data/design-md/library/mistral-ai.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/mongodb.md +0 -155
- package/data/harnesses/code/skills/design/data/design-md/library/notion.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/nvidia.md +0 -141
- package/data/harnesses/code/skills/design/data/design-md/library/ollama.md +0 -145
- package/data/harnesses/code/skills/design/data/design-md/library/opencode-ai.md +0 -142
- package/data/harnesses/code/skills/design/data/design-md/library/posthog.md +0 -152
- package/data/harnesses/code/skills/design/data/design-md/library/raycast.md +0 -137
- package/data/harnesses/code/skills/design/data/design-md/library/replicate.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/resend.md +0 -170
- package/data/harnesses/code/skills/design/data/design-md/library/revolut.md +0 -145
- package/data/harnesses/code/skills/design/data/design-md/library/runwayml.md +0 -137
- package/data/harnesses/code/skills/design/data/design-md/library/sanity.md +0 -168
- package/data/harnesses/code/skills/design/data/design-md/library/sentry.md +0 -163
- package/data/harnesses/code/skills/design/data/design-md/library/shopify.md +0 -147
- package/data/harnesses/code/skills/design/data/design-md/library/slack.md +0 -158
- package/data/harnesses/code/skills/design/data/design-md/library/spacex.md +0 -171
- package/data/harnesses/code/skills/design/data/design-md/library/spotify.md +0 -166
- package/data/harnesses/code/skills/design/data/design-md/library/stripe.md +0 -160
- package/data/harnesses/code/skills/design/data/design-md/library/supabase.md +0 -173
- package/data/harnesses/code/skills/design/data/design-md/library/superhuman.md +0 -145
- package/data/harnesses/code/skills/design/data/design-md/library/tesla.md +0 -153
- package/data/harnesses/code/skills/design/data/design-md/library/theverge.md +0 -167
- package/data/harnesses/code/skills/design/data/design-md/library/together-ai.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/uber.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/vercel.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/voltagent.md +0 -130
- package/data/harnesses/code/skills/design/data/design-md/library/warp.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/webflow.md +0 -140
- package/data/harnesses/code/skills/design/data/design-md/library/wired.md +0 -139
- package/data/harnesses/code/skills/design/data/design-md/library/wise.md +0 -137
- package/data/harnesses/code/skills/design/data/design-md/library/x-ai.md +0 -138
- package/data/harnesses/code/skills/design/data/design-md/library/zapier.md +0 -158
- package/data/harnesses/code/skills/design/data/design-md/nurix.md +0 -138
- package/data/harnesses/code/skills/design/data/design-tokens/SCHEMA.md +0 -695
- package/data/harnesses/code/skills/design/data/design-tokens/airbnb/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/airbnb/design.tokens.json +0 -1272
- package/data/harnesses/code/skills/design/data/design-tokens/airtable/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/airtable/design.tokens.json +0 -1268
- package/data/harnesses/code/skills/design/data/design-tokens/anthropic-claude/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/anthropic-claude/design.tokens.json +0 -1273
- package/data/harnesses/code/skills/design/data/design-tokens/apple/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/apple/design.tokens.json +0 -1262
- package/data/harnesses/code/skills/design/data/design-tokens/binance/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/binance/design.tokens.json +0 -1257
- package/data/harnesses/code/skills/design/data/design-tokens/bmw/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/bmw/design.tokens.json +0 -1270
- package/data/harnesses/code/skills/design/data/design-tokens/cal/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/cal/design.tokens.json +0 -1270
- package/data/harnesses/code/skills/design/data/design-tokens/clay/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/clay/design.tokens.json +0 -1261
- package/data/harnesses/code/skills/design/data/design-tokens/clickhouse/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/clickhouse/design.tokens.json +0 -1268
- package/data/harnesses/code/skills/design/data/design-tokens/cohere/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/cohere/design.tokens.json +0 -1281
- package/data/harnesses/code/skills/design/data/design-tokens/coinbase/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/coinbase/design.tokens.json +0 -1262
- package/data/harnesses/code/skills/design/data/design-tokens/composio/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/composio/design.tokens.json +0 -1271
- package/data/harnesses/code/skills/design/data/design-tokens/cursor/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/cursor/design.tokens.json +0 -1276
- package/data/harnesses/code/skills/design/data/design-tokens/elevenlabs/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/elevenlabs/design.tokens.json +0 -1293
- package/data/harnesses/code/skills/design/data/design-tokens/expo/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/expo/design.tokens.json +0 -1270
- package/data/harnesses/code/skills/design/data/design-tokens/figma/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/figma/design.tokens.json +0 -1276
- package/data/harnesses/code/skills/design/data/design-tokens/framer/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/framer/design.tokens.json +0 -1267
- package/data/harnesses/code/skills/design/data/design-tokens/goldens.json +0 -251
- package/data/harnesses/code/skills/design/data/design-tokens/hashicorp/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/hashicorp/design.tokens.json +0 -1273
- package/data/harnesses/code/skills/design/data/design-tokens/ibm/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/ibm/design.tokens.json +0 -1286
- package/data/harnesses/code/skills/design/data/design-tokens/intercom/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/intercom/design.tokens.json +0 -1290
- package/data/harnesses/code/skills/design/data/design-tokens/kraken/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/kraken/design.tokens.json +0 -1270
- package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.resolver.json +0 -23
- package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.tokens.dark.json +0 -599
- package/data/harnesses/code/skills/design/data/design-tokens/linear-app/design.tokens.json +0 -1272
- package/data/harnesses/code/skills/design/data/design-tokens/lovable/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/lovable/design.tokens.json +0 -1267
- package/data/harnesses/code/skills/design/data/design-tokens/meta/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/meta/design.tokens.json +0 -1289
- package/data/harnesses/code/skills/design/data/design-tokens/minimax/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/minimax/design.tokens.json +0 -1258
- package/data/harnesses/code/skills/design/data/design-tokens/mintlify/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/mintlify/design.tokens.json +0 -1284
- package/data/harnesses/code/skills/design/data/design-tokens/miro/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/miro/design.tokens.json +0 -1291
- package/data/harnesses/code/skills/design/data/design-tokens/mistral-ai/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/mistral-ai/design.tokens.json +0 -1263
- package/data/harnesses/code/skills/design/data/design-tokens/mongodb/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/mongodb/design.tokens.json +0 -1270
- package/data/harnesses/code/skills/design/data/design-tokens/notion/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/notion/design.tokens.json +0 -1261
- package/data/harnesses/code/skills/design/data/design-tokens/nurix/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/nurix/design.tokens.json +0 -1209
- package/data/harnesses/code/skills/design/data/design-tokens/nvidia/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/nvidia/design.tokens.json +0 -1265
- package/data/harnesses/code/skills/design/data/design-tokens/ollama/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/ollama/design.tokens.json +0 -1253
- package/data/harnesses/code/skills/design/data/design-tokens/opencode-ai/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/opencode-ai/design.tokens.json +0 -1268
- package/data/harnesses/code/skills/design/data/design-tokens/posthog/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/posthog/design.tokens.json +0 -1261
- package/data/harnesses/code/skills/design/data/design-tokens/raycast/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/raycast/design.tokens.json +0 -1263
- package/data/harnesses/code/skills/design/data/design-tokens/replicate/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/replicate/design.tokens.json +0 -1266
- package/data/harnesses/code/skills/design/data/design-tokens/resend/design.resolver.json +0 -23
- package/data/harnesses/code/skills/design/data/design-tokens/resend/design.tokens.dark.json +0 -623
- package/data/harnesses/code/skills/design/data/design-tokens/resend/design.tokens.json +0 -1276
- package/data/harnesses/code/skills/design/data/design-tokens/revolut/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/revolut/design.tokens.json +0 -1264
- package/data/harnesses/code/skills/design/data/design-tokens/runwayml/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/runwayml/design.tokens.json +0 -1268
- package/data/harnesses/code/skills/design/data/design-tokens/sanity/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/sanity/design.tokens.json +0 -1270
- package/data/harnesses/code/skills/design/data/design-tokens/sentry/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/sentry/design.tokens.json +0 -1288
- package/data/harnesses/code/skills/design/data/design-tokens/shopify/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/shopify/design.tokens.json +0 -1272
- package/data/harnesses/code/skills/design/data/design-tokens/slack/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/slack/design.tokens.json +0 -1265
- package/data/harnesses/code/skills/design/data/design-tokens/spacex/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/spacex/design.tokens.json +0 -1287
- package/data/harnesses/code/skills/design/data/design-tokens/spotify/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/spotify/design.tokens.json +0 -1286
- package/data/harnesses/code/skills/design/data/design-tokens/stripe/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/stripe/design.tokens.json +0 -1285
- package/data/harnesses/code/skills/design/data/design-tokens/supabase/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/supabase/design.tokens.json +0 -1287
- package/data/harnesses/code/skills/design/data/design-tokens/superhuman/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/superhuman/design.tokens.json +0 -1278
- package/data/harnesses/code/skills/design/data/design-tokens/tesla/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/tesla/design.tokens.json +0 -1269
- package/data/harnesses/code/skills/design/data/design-tokens/theverge/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/theverge/design.tokens.json +0 -1285
- package/data/harnesses/code/skills/design/data/design-tokens/together-ai/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/together-ai/design.tokens.json +0 -1303
- package/data/harnesses/code/skills/design/data/design-tokens/uber/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/uber/design.tokens.json +0 -1274
- package/data/harnesses/code/skills/design/data/design-tokens/vercel/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/vercel/design.tokens.json +0 -1296
- package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.resolver.json +0 -23
- package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.tokens.dark.json +0 -612
- package/data/harnesses/code/skills/design/data/design-tokens/voltagent/design.tokens.json +0 -1282
- package/data/harnesses/code/skills/design/data/design-tokens/warp/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/warp/design.tokens.json +0 -1287
- package/data/harnesses/code/skills/design/data/design-tokens/webflow/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/webflow/design.tokens.json +0 -1268
- package/data/harnesses/code/skills/design/data/design-tokens/wired/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/wired/design.tokens.json +0 -1276
- package/data/harnesses/code/skills/design/data/design-tokens/wise/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/wise/design.tokens.json +0 -1273
- package/data/harnesses/code/skills/design/data/design-tokens/x-ai/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/x-ai/design.tokens.json +0 -1296
- package/data/harnesses/code/skills/design/data/design-tokens/zapier/design.resolver.json +0 -20
- package/data/harnesses/code/skills/design/data/design-tokens/zapier/design.tokens.json +0 -1286
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/command-center.tsx +0 -249
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/create-edit.tsx +0 -249
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/dashboard.tsx +0 -225
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/entity-detail.tsx +0 -249
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/list-detail.tsx +0 -224
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/log-stream.tsx +0 -249
- package/data/harnesses/code/skills/design/data/operator-pack/fixtures.md +0 -88
- package/data/harnesses/code/skills/design/data/operator-pack/surface-catalog.md +0 -132
- package/data/harnesses/code/skills/design/data/operator-pack/trust-rubric.md +0 -76
- package/data/harnesses/code/skills/design/references/create.md +0 -173
- package/data/harnesses/code/skills/design/references/diagnosis.md +0 -108
- package/data/harnesses/code/skills/design/references/hard-rules.md +0 -177
- package/data/harnesses/code/skills/design/references/improve.md +0 -116
- package/data/harnesses/code/skills/design/references/interaction.md +0 -77
- package/data/harnesses/code/skills/design/references/introspect.md +0 -100
- package/data/harnesses/code/skills/design/references/lifecycle.md +0 -73
- package/data/harnesses/code/skills/design/references/personality.md +0 -575
- package/data/harnesses/code/skills/design/references/structure.md +0 -159
- package/data/harnesses/code/skills/design/scripts/convert-design-md.mjs +0 -1312
- package/data/harnesses/code/skills/design/scripts/derive-personality.mjs +0 -1498
- package/data/harnesses/code/skills/design/scripts/generate-fixtures.mjs +0 -551
- package/data/harnesses/code/skills/design/scripts/lib/checks.mjs +0 -1092
- package/data/harnesses/code/skills/design/scripts/lib/golden.mjs +0 -26
- package/data/harnesses/code/skills/design/scripts/lib/vocabulary.mjs +0 -65
- package/data/harnesses/code/skills/design/scripts/phase-gate.mjs +0 -538
- package/data/harnesses/code/skills/design/scripts/preship-sweep.mjs +0 -312
- package/data/harnesses/code/skills/design/scripts/render-rung.mjs +0 -890
- package/data/harnesses/code/skills/design/scripts/scaffold.mjs +0 -769
- package/data/harnesses/code/skills/design/scripts/self-integrity.mjs +0 -675
- package/data/harnesses/code/skills/design/scripts/snapshot-goldens.mjs +0 -164
- package/data/harnesses/code/skills/design/scripts/validate-combinations.mjs +0 -439
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
# Hard rules — the boot-loaded floor
|
|
2
|
-
|
|
3
|
-
The hard-prose channel: every machine ban, deterministic threshold, and mandatory procedure the skill enforces, one imperative line each. This file loads into context before any design output.
|
|
4
|
-
|
|
5
|
-
The backticked anchor id is the shared key: the same id names the `rules.csv` row, the check-engine rule key, the fixture pair, and a finding's provenance. Machine rules are absolute — a violation is fixed now, or classified as inapplicable in `docs/memory/design-decay.md`; never ignored silently. No waivers, no inline suppressions. Lines tagged `· render` are decided on the rendered surface at the render rung (pixels or DOM), not from source at edit time. Judged dimensions are diagnosed, not gated — the index at the foot points at where their judgment lives.
|
|
6
|
-
|
|
7
|
-
## Doctrine floor
|
|
8
|
-
|
|
9
|
-
The twelve fixed principles the rule families below serve — the canonical in-skill enumeration. Nothing overrides them: expressiveness is granted by the per-surface delight budget *inside* the floor, never as an exception to it. Cite a principle by its id.
|
|
10
|
-
|
|
11
|
-
- Throughput vs delight is weighed per surface (`f01`).
|
|
12
|
-
- Empty states are text-first (`f02`).
|
|
13
|
-
- Side panels over modals (`f03`).
|
|
14
|
-
- Numbers are tabular (`f04`).
|
|
15
|
-
- One accent is the default (`f05`).
|
|
16
|
-
- Keyboard-first (`f06`).
|
|
17
|
-
- Semantic token classes only (`f07`).
|
|
18
|
-
- State persists in emitted code (`f08`).
|
|
19
|
-
- Wrong-fit briefs are refused cleanly (`f09`).
|
|
20
|
-
- The substrate is Tailwind + shadcn-flavor only (`f10`).
|
|
21
|
-
- A modular SKILL.md router with lazy references (`f11`).
|
|
22
|
-
- Vocabulary is a business call (`f12`).
|
|
23
|
-
|
|
24
|
-
## Typography
|
|
25
|
-
|
|
26
|
-
- `typ-01` Body text contrast ≥ 4.5:1; large text ≥ 3:1. · render
|
|
27
|
-
- `typ-02` Body ≥ 14px on operator surfaces; never below 11px anywhere.
|
|
28
|
-
- `typ-03` Form inputs ≥ 16px on touch/mobile surfaces; desktop operator inputs exempt.
|
|
29
|
-
- `typ-05` Prose measure 45–75ch; tables exempt.
|
|
30
|
-
- `typ-06` ≤ 3 font families per app, each with a distinct job (display / body / numeric-mono); a fourth family is banned. Type scale holds the declared ramp's steps (≤ 7).
|
|
31
|
-
- `typ-07` Tabular lining numerals (`font-variant-numeric`) on every numeric column, KPI, timer, ID.
|
|
32
|
-
- `typ-08` All-caps micro-labels: letter-spacing ≥ 0.02em (caps band 0.05–0.12em); tracking never below −0.04em.
|
|
33
|
-
- `typ-09` Font sizes from a fixed rem scale (step ratio 1.125–1.2) — the fixed scale is the declared ramp's emitted utilities (`text-h1` … `text-display`), not merely *a* scale; ban `vw`/`vh`/`clamp` on font-size; operator surfaces.
|
|
34
|
-
- `typ-10` Adjacent type-scale steps ≥ 25% apart.
|
|
35
|
-
- `typ-11` No UI font weight below 400.
|
|
36
|
-
- `typ-12` Never size type in `em`; px or rem only.
|
|
37
|
-
- `typ-14` Typographic characters: curly quotes/apostrophes, en-dash for ranges, real ellipsis/×/© glyphs, one space after punctuation; never underline non-links; bold XOR italic, never both.
|
|
38
|
-
- `typ-15` Zero em-dashes in UI copy.
|
|
39
|
-
- `typ-16` Ban serif faces in dashboards and software UIs.
|
|
40
|
-
- `typ-18` Uppercase-tracking (eyebrow/micro-label) instances ≤ ceil(sectionCount/3).
|
|
41
|
-
- `typ-19` Code/mono type fixed at 16px; long lines scroll horizontally, never wrap.
|
|
42
|
-
- `typ-20` The `display` ramp step appears only on surfaces stamped `brand-forward`; ≤ 1 display-step element per surface.
|
|
43
|
-
|
|
44
|
-
## Color
|
|
45
|
-
|
|
46
|
-
- `col-01` Non-text UI contrast ≥ 3:1 (input borders, icons, focus rings). · render
|
|
47
|
-
- `col-02` One accent, reserved for primary action / selection / state; accent saturation < 80%. Status palettes are additional, not accent violations.
|
|
48
|
-
- `col-03` Color never the only signal; status pairs with an icon or text. · render
|
|
49
|
-
- `col-04` Status colors only via semantic tokens: `--success`, `--warning`, `--destructive`.
|
|
50
|
-
- `col-05` Ban literal palette classes, hex/rgb/oklch literals, and `dark:` prefixes in JSX.
|
|
51
|
-
- `col-06` No pure `#000000` text or canvas, no pure `#ffffff` surfaces; start near `#111827`/`#1F2937`. Fires only when no brand token declares pure black.
|
|
52
|
-
- `col-07` No opacity- or `rgba()`-fabricated shades; every shade is an explicit hex or token.
|
|
53
|
-
- `col-08` Greys 8–10 shades; each accent family 5–10.
|
|
54
|
-
- `col-09` Disabled-state opacity 0.38–0.5.
|
|
55
|
-
- `col-10` Modal scrim 40–60% black.
|
|
56
|
-
- `col-13` Semantic price/status colors are text-only, never fills; never repurposed for generic success or error.
|
|
57
|
-
- `col-14` Data-viz: lines/bars ≥ 3:1 vs background; data labels ≥ 4.5:1. · render
|
|
58
|
-
- `col-16` A wash token (`--wash-*`) is consumed only on `brand-forward`-stamped surfaces; wash stops obey the slop ban (`col-12` vocabulary).
|
|
59
|
-
|
|
60
|
-
## Spatial
|
|
61
|
-
|
|
62
|
-
- `spc-01` Every spacing value on the declared 4/8 scale (standard 4/8/12/16/24/32/48/64/96px; dense 2/4/8/12/16/24/32px). The monotony sub-check (≥ 10 identical) excludes operator surfaces.
|
|
63
|
-
- `spc-02` Adjacent spacing values ≥ 25% apart.
|
|
64
|
-
- `spc-03` Tap/click targets ≥ 24×24px (SC 2.5.8); ≥ 44px touch-primary; dense data rows 28px; undersized only via the ≥ 8px spacing exception (`int-11`). · render
|
|
65
|
-
- `spc-04` Numeric columns right-align, text left-aligns; ban center-aligned data columns.
|
|
66
|
-
- `spc-06` Corners on a fixed radius scale (0/2/4/6/8/12/16/24/9999 — 0 = flat archetypes, 9999 = full/pill; a project's token artifact may declare a narrower scale, enforced by the drift check), one scale per page.
|
|
67
|
-
- `spc-07` Dense table rows: 12px vertical cell padding + hairline dividers; buttons compact to 28px; mono numbers on every figure.
|
|
68
|
-
- `spc-08` Full-viewport height uses `min-h-[100dvh]`; never `h-screen` or `100vh`.
|
|
69
|
-
- `spc-09` Ban calc-percentage layout arithmetic (`calc(33% - 1rem)`); CSS Grid instead.
|
|
70
|
-
- `spc-10` No horizontal scroll at any viewport (375/768/1024/1440); any overflow means broken. · render
|
|
71
|
-
- `spc-15` Grid/bento integrity: N items fill exactly N cells; no orphan corners; spans interlock. · render
|
|
72
|
-
- `spc-16` In fixed-width table/grid cells, rendered text fits the cell — no overlap or clip without a `truncate`/scroll affordance. · render
|
|
73
|
-
|
|
74
|
-
## Depth & hierarchy
|
|
75
|
-
|
|
76
|
-
- `dep-01` z-index only from the declared scale (0/10/20/40/100/1000); ban 999 and 9999.
|
|
77
|
-
- `dep-02` One h1 per view; heading levels never skip.
|
|
78
|
-
- `dep-04` Ban border and shadow doing the same separation job on one element.
|
|
79
|
-
|
|
80
|
-
## Interaction
|
|
81
|
-
|
|
82
|
-
- `int-01` Every interactive element ships a `:focus-visible` ring: ≥ 3:1 contrast, ≥ 2px (2–4px), with offset. · render (contrast)
|
|
83
|
-
- `int-02` Ban `outline: none` without a replacement focus style.
|
|
84
|
-
- `int-03` No pointer-only affordances; every hover-revealed control has a keyboard/focus path.
|
|
85
|
-
- `int-04` Modals use native `<dialog>` + `inert` focus containment; ban nested modals; side panel before modal.
|
|
86
|
-
- `int-08` Labels visible above the input; errors inline below the field (gap 4–8px); ban placeholder-as-label. Form fields only; a bare search input is exempt.
|
|
87
|
-
- `int-09` `aria-sort` on sortable headers; sticky header/first column beyond one viewport; 5–7 default visible columns with a picker; bounded pagination ("1–25 of 150"), never infinite scroll on work queues.
|
|
88
|
-
- `int-10` An `aria-live` region present wherever async status renders.
|
|
89
|
-
- `int-11` Target-to-target spacing ≥ 8px.
|
|
90
|
-
- `int-12` `cursor: pointer` on every clickable element (web).
|
|
91
|
-
- `int-14` All five button states present: default, hover, active, focus, disabled.
|
|
92
|
-
- `int-17` Discernible accessible name on every interactive element and image (`button-name`/`select-name`/`image-alt` Critical, `link-name` Serious). · render
|
|
93
|
-
- `int-18` ARIA spec-valid: `aria-allowed-attr`, `aria-required-attr`, `aria-required-children`, `aria-valid-attr-value`. · render
|
|
94
|
-
|
|
95
|
-
## Motion
|
|
96
|
-
|
|
97
|
-
- `mot-01` UI transitions 150–250ms default (micro 100–150, state 200–300, larger 300–500); hard ceiling 500ms.
|
|
98
|
-
- `mot-03` Every animation gated on `prefers-reduced-motion` (0.01ms reset).
|
|
99
|
-
- `mot-04` Ban spring/bounce easing on operator surfaces; ban linear everywhere; easing strings from the token set (ease-out `cubic-bezier(0,0,0.2,1)`); no orchestrated page-load sequences.
|
|
100
|
-
- `mot-05` Animate only `transform` and `opacity`; never top, left, width, height, or margin.
|
|
101
|
-
- `mot-06` `will-change` only on an in-progress `transform`/`opacity` animation; never blanket, never left dangling.
|
|
102
|
-
- `mot-07` Loading indicators skeleton the content shape; delay 150–300ms; nothing < 500ms, spinner/skeleton 500ms–2s, progress bar > 2s.
|
|
103
|
-
- `mot-08` Stagger rides the `stagger-unit` token: 0–60ms per item, ≤ 8 children, total sequence < 1s (child count and total confirmed on the DOM at the render rung). Baseline-stamped surfaces skip arrival cascades; brand-forward surfaces may run `motion-stagger`.
|
|
104
|
-
- `mot-09` Ban scroll-event listeners for animation (`window.addEventListener('scroll')`); observers or scrubbing only.
|
|
105
|
-
- `mot-10` Ban `useState` for continuous scroll/pointer values; motion values instead. React-scoped.
|
|
106
|
-
|
|
107
|
-
## States
|
|
108
|
-
|
|
109
|
-
- `sta-01` Every data surface ships loading, empty, error, and partial/degraded states; plus post-action, cancel, disconnection/timeout, and concurrent-edit where they exist.
|
|
110
|
-
- `sta-02` Empty states text-first, at most one action; never a dead-end on actionable surfaces, never a literal no-data message; copy 1–2 sentences.
|
|
111
|
-
- `sta-03` Error states never dead-end: what happened / why / how to recover; an error render must carry a recovery affordance (the machine shell), the three-part copy quality is judged.
|
|
112
|
-
- `sta-05` Toasts auto-dismiss 3–5s, `aria-live="polite"`, never steal focus.
|
|
113
|
-
|
|
114
|
-
## Code & tokens
|
|
115
|
-
|
|
116
|
-
- `cod-01` Emitted CSS defines every token the substrate consumes.
|
|
117
|
-
- `cod-02` On improve runs, every value stays inside the lever manifest's vocabulary.
|
|
118
|
-
- `cod-03` Every color, spacing, radius, and duration in a diff resolves to an emitted token.
|
|
119
|
-
- `cod-04` Ban elision comments (`// rest of code`, `// ...`, `// TODO`, "for brevity"); files compile before done.
|
|
120
|
-
- `cod-05` Anti-fabrication: no invented metrics, no fake round numbers (99.99%, 50%), no "BY THE NUMBERS" sections, no John Doe/Acme/Nexus names; fake-precise mock numbers carry a mock marker; unknowable values use a `[bracket]` placeholder.
|
|
121
|
-
- `cod-06` No emoji anywhere, no emoji-as-icons; inline SVG only, one icon family per app, strokeWidth 1.5 or 2; never hand-rolled icon paths.
|
|
122
|
-
- `cod-07` Check dependencies before importing; fonts self-hosted or `next/font` with `font-display: swap`; never a Google Fonts `<link>` in prod.
|
|
123
|
-
- `cod-08` Image placeholders deterministic (`picsum.photos/seed/{seed}/{w}/{h}`); images declare dimensions; `loading="lazy"` below the fold.
|
|
124
|
-
- `cod-09` Component line ceilings: < 120 ln table, < 80 ln section; never modify files outside scope.
|
|
125
|
-
- `cod-11` Every emitted component exports a typed Props interface; no HTML tags in React Native output.
|
|
126
|
-
- `cod-12` Runtime budgets: LCP < 2.5s, INP < 200ms, CLS < 0.1, 16ms frame. · render
|
|
127
|
-
- `cod-15` Per-theme rendered token drift: under each theme context the resolver declares, rendered `--background`/`--foreground`/`--primary` equal that context's authored values. · render
|
|
128
|
-
- `cod-16` Every family name in an emitted font stack binds to an installed package's registered family or a system generic (fail-closed at `--emit`).
|
|
129
|
-
|
|
130
|
-
## Mandatory procedures (never skip)
|
|
131
|
-
|
|
132
|
-
- `proc-01` Extract levers into a design-tokens artifact before any improve run on a foreign UI.
|
|
133
|
-
- `proc-02` Ask the reader question before any introspect run — one question, every run, never a stored default.
|
|
134
|
-
- `proc-03` Run the object pass (six-archetype catalog) before screens; a small brief earns a small pass, never a skipped one.
|
|
135
|
-
- `proc-04` Declare the density tier per surface archetype before emission (global tier + per-archetype modifiers).
|
|
136
|
-
- `proc-05` Name the taste anchor before look decisions: project artifact > library entry > Nurix default.
|
|
137
|
-
- `proc-06` Run the self-critique pass against the brief and the ban list before declaring a create run done.
|
|
138
|
-
- `proc-07` Resolve the design system and persist it (`personality.css`) before any UI code.
|
|
139
|
-
- `proc-08` Token-lock at emission: after resolution, no value lands outside the emitted token file.
|
|
140
|
-
- `proc-09` Run the mechanical pre-flight self-count: count rule instances against thresholds; the output fails if over.
|
|
141
|
-
- `proc-10` Run the numeric-anchored self-audit passes, each with an exact-value criterion (canvas, corners-on-scale, shadows, link hover).
|
|
142
|
-
- `proc-11` Follow the fixed audit ordering — hierarchy → typography → palette → spacing → buttons → clutter → empty states → shadows → contrast → grouping — then consolidate, dedupe, severity-rank, report before → after.
|
|
143
|
-
- `proc-12` Run the copy self-audit: re-read every visible string, rewrite every flagged one.
|
|
144
|
-
- `proc-13` Sweep viewports (375/768/1024/1440) before done; any horizontal scroll means broken — fix, don't ship.
|
|
145
|
-
- `proc-14` Cross-check scope: compare deliverable count against scope count; add anything missing before responding.
|
|
146
|
-
|
|
147
|
-
## Judged dimensions
|
|
148
|
-
|
|
149
|
-
Not gated — diagnosed. Each names what the judgment covers; the mechanics live in [diagnosis.md](diagnosis.md).
|
|
150
|
-
|
|
151
|
-
- `typ-04` Line-height inverse to size (body 1.4–1.6, headings 1.1–1.3); prose only, dense tables run tighter.
|
|
152
|
-
- `typ-13` Dense-app type ladder is advisory; the declared scale wins.
|
|
153
|
-
- `typ-17` AI-default fonts (Inter-as-reflex, Roboto/Arial/system, Space Grotesk) are house-taste flags.
|
|
154
|
-
- `col-11` Hover darkens the base shade 10–15%; nearest token-ramp step wins.
|
|
155
|
-
- `col-12` AI-slop palette: purple/blue neon glows and gradients, purple-on-white, reflex `#3B82F6`.
|
|
156
|
-
- `col-15` One grey family per app; a deliberate warm/cool split is a brand decision.
|
|
157
|
-
- `spc-05` Group spacing > within-group spacing (within 4–16px, between 24–64px); what reads as a group is judged.
|
|
158
|
-
- `spc-11` Container max-width ~1400px / `max-w-7xl`; operator surfaces may be full-bleed.
|
|
159
|
-
- `spc-12` Section rhythm 80px dense vs 96px marketing; advisory.
|
|
160
|
-
- `spc-13` Cockpit rule above density 7: no card boxes, hairline dividers, tight padding, mono numbers.
|
|
161
|
-
- `spc-14` Content-overload ceilings (> 7 action areas, 15+ elements, 12+ required fields, nav 5–9); dense surfaces may exceed.
|
|
162
|
-
- `dep-03` Dashboard ≤ ~4 primary metrics above the fold; command centers may exceed.
|
|
163
|
-
- `int-05` Undo over confirm for reversible actions; irreversible without confirm + undo is auto-critical.
|
|
164
|
-
- `int-06` Optimistic updates only for low-stakes actions, always with rollback.
|
|
165
|
-
- `int-07` Validate on blur, not per keystroke; strength meters and counters are exempt.
|
|
166
|
-
- `int-13` One primary CTA per screen/region; one per pane on multi-pane surfaces.
|
|
167
|
-
- `int-15` Virtualize lists ≥ 50 items; bounded/paginated lists exempt.
|
|
168
|
-
- `int-16` Tactile press feedback (−1px translateY / scale 0.98, < 100–150ms); suppressed under reduced-motion.
|
|
169
|
-
- `mot-02` Per-interaction reference durations (button 100 / hover 150 / tooltip 200 / tab 250 / modal 300 / page 400ms) — reference, not a ban.
|
|
170
|
-
- `mot-11` Exit 60–70% of enter; press scale 0.95–1.05; ≤ 1–2 animated elements per view.
|
|
171
|
-
- `sta-04` Errors render inline near the field, not banner-only; system-wide failures may banner.
|
|
172
|
-
- `sta-06` Empty-state taxonomy: first-time / user-cleared / no-results / no-access / error, distinct copy each.
|
|
173
|
-
- `cod-10` No div-built fake product screenshots.
|
|
174
|
-
- `cod-13` Audit output carries a numeric before → after per finding; no vague "feels".
|
|
175
|
-
- `cod-14` One name per concept, one concept per name across UI copy, help text, and API names.
|
|
176
|
-
- `inst-01`–`inst-11` Render instruments (edge density, feature congestion, subband entropy, grid quality, white-space ratio, symmetry, figure-ground contrast, contour congestion, colorfulness, distinct-RGB count, KLM operator-cost) — evidence inside judged findings, never gates; see [diagnosis.md](diagnosis.md).
|
|
177
|
-
- `trust-01`–`trust-04` AI-surface trust rubric (disclosure, human override, consent-gated irreversible actions, auditability); the first three grade auto-critical when absent; see [../data/operator-pack/trust-rubric.md](../data/operator-pack/trust-rubric.md).
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
# Improve — the engine
|
|
2
|
-
|
|
3
|
-
> Loaded when the front gate routes to improve. Pairs with [diagnosis.md](diagnosis.md) (the finding source and format) and closes at the same machine-check wall create's gates enforce. Improve is every change to a UI that **already exists**; [create.md](create.md) owns the case where nothing does.
|
|
4
|
-
|
|
5
|
-
Improve is one engine, not a set of commands. Every improvement — a review, a polish, a full redesign, a typography-only pass, a rendered judgment — is the same engine run at a different point on three axes. The familiar verbs are parameter bindings, not sibling workflows: there is no `review.md`, no `redesign.md`, no `judge.md`.
|
|
6
|
-
|
|
7
|
-
## The three axes
|
|
8
|
-
|
|
9
|
-
- **Scope** — what the run touches: one taxonomy dimension (e.g. `P1 Typography`), one surface, or the whole app. Scope is the diagnosis pass filter and the diff boundary at once.
|
|
10
|
-
- **Depth** — `diagnose-only ↔ apply`. Diagnose-only emits ranked findings and stops. Apply edits the files the findings name.
|
|
11
|
-
- **Authority** — `lever-jailed ↔ lever-consent`. Jailed (the default): emit only values inside the lever manifest's vocabulary. Lever-consent: the manifest itself may change — but only the changes the user has consented to.
|
|
12
|
-
|
|
13
|
-
Any point in the cube is reachable directly. The presets below are the common ones.
|
|
14
|
-
|
|
15
|
-
## Preset verbs
|
|
16
|
-
|
|
17
|
-
Bindings over the engine, in one table. Never restated as separate files.
|
|
18
|
-
|
|
19
|
-
| Verb | Scope | Depth | Authority | Run |
|
|
20
|
-
| --- | --- | --- | --- | --- |
|
|
21
|
-
| `review` | whole app | diagnose-only | jailed | Rank findings across the app; change nothing. |
|
|
22
|
-
| `polish` | whole app | apply | jailed | Fix everything reachable inside the current levers. |
|
|
23
|
-
| `redesign` | whole app | apply | lever-consent | Apply the consented lever changes, then polish within the new manifest. |
|
|
24
|
-
| `typeset` | `P1 Typography` | apply | jailed | Apply, scoped to the Typography dimension only. |
|
|
25
|
-
| `judge` | whole app (narrowable to a surface) | diagnose-only | jailed | Rank findings from **rendered evidence** — screenshots captured, read back, critiqued (the protocol below); change nothing. |
|
|
26
|
-
|
|
27
|
-
A narrower or wider pass — one surface, one other dimension — is the same table with the scope cell moved. Bind the parameters; do not author a verb. `judge --fix` is sugar, not a fifth row: a `judge` run followed by an apply-depth run over its findings — still jailed to the lever manifest, closing at the same verify sweep as any apply run.
|
|
28
|
-
|
|
29
|
-
## The golden rule: jailed to the lever manifest
|
|
30
|
-
|
|
31
|
-
A design skill improves a UI **using the levers already in it**. Emitting design disjoint from the surrounding UI is a failure, not a style choice.
|
|
32
|
-
|
|
33
|
-
The project's design-tokens artifact carries the **lever manifest** — the `lever-manifest` in its `$extensions["com.nurix.design"]` payload (spacing scale, radius scale, shadow levels, motion durations/easings, icon family, accent count) plus the token-carried allowlists (the 36 color roles, the font stacks). Read it **first**, before any diagnosis or edit.
|
|
34
|
-
|
|
35
|
-
### When the UI wasn't built by this skill: extract first
|
|
36
|
-
|
|
37
|
-
No token artifact (`design.tokens.json`) at project root ⇒ recover one from the code before touching anything.
|
|
38
|
-
|
|
39
|
-
1. **Scan the source for what IS** — the fonts actually in use, the literal color values that recur, the spacing steps, the radii, the durations, the icon family and stroke.
|
|
40
|
-
2. **Write them into a design-tokens artifact** at project root — `design.tokens.json` + `design.resolver.json` per [SCHEMA.md](../data/design-tokens/SCHEMA.md), payload `provenance: extracted`, `sourced: <date>`, populated lever manifest and primitives.
|
|
41
|
-
3. **Extraction records what IS, never what should be.** A UI running five fonts extracts five fonts. The reduction to two is a tier-two finding (below) — not an extraction edit.
|
|
42
|
-
4. Run the coverage gate over it (`derive-personality.mjs <project-dir> --check`) exactly as over any other artifact.
|
|
43
|
-
|
|
44
|
-
### The jail is mechanical
|
|
45
|
-
|
|
46
|
-
An improve run may emit only values inside the manifest's vocabulary — on-scale spacings, manifest fonts, manifest colors, manifest radii and durations. This is not advice. The verify sweep's drift check reads the manifest (`preship-sweep.mjs --files <touched...> --manifest design.tokens.json`) and fails any run that emitted a value outside it, with the same fix-or-classify wall create's gates run into. There is no waiver.
|
|
47
|
-
|
|
48
|
-
## Tier-two escalation: when the levers themselves are wrong
|
|
49
|
-
|
|
50
|
-
Diagnosis may find the fundamentals wrong — five fonts where two would do, three competing accents, an off-scale spacing habit. Those are `tier: lever-change` findings (the diagnosis format's tier field). Fixing them means changing the manifest, which the jail forbids. The protocol:
|
|
51
|
-
|
|
52
|
-
1. **Finish the within-levers work first.** Polish everything reachable inside the current jail.
|
|
53
|
-
2. **Report the fundamentals as tier-two findings** — same canonical format, `tier: lever-change` — phrased as the change and its whole-UI payoff: *"these three changes would make the whole UI consistent."*
|
|
54
|
-
3. **Offer** a follow-up run with lever authority. Never change fundamentals unbidden.
|
|
55
|
-
|
|
56
|
-
Authority defaults to jailed; lever changes are consent-gated. The skill does not escalate itself — the user triggers the follow-up.
|
|
57
|
-
|
|
58
|
-
A lever-consent run (redesign-shaped) does **not** unjail emission. It rewrites the manifest first — the consented changes only — then proceeds jailed to the **new** vocabulary. The drift check reads the updated manifest, so there is never an unjailed emit; the jail moves, it never opens.
|
|
59
|
-
|
|
60
|
-
[introspect.md](introspect.md) runs this handshake in reverse: an introspect report's tier-two findings can seed a consented improve run.
|
|
61
|
-
|
|
62
|
-
## Findings come from the diagnosis engine
|
|
63
|
-
|
|
64
|
-
Improve does not diagnose on its own. It runs the shared diagnosis engine ([diagnosis.md](diagnosis.md)) scoped to the run's scope axis, causes-first (Structure → Behavior → Perception).
|
|
65
|
-
|
|
66
|
-
Findings use the canonical format verbatim — dimension · cause layer · evidence (file:line / token / value) · before→after (numeric where machine-backed) · consequence · tier · severity · provenance. The list is severity-ranked (auto-critical → critical → major → minor). No numeric scores, ever.
|
|
67
|
-
|
|
68
|
-
Diagnose-only depth stops here: the ranked list is the deliverable. Rendering it per reader register is [introspect.md](introspect.md)'s job, not improve's.
|
|
69
|
-
|
|
70
|
-
## Apply depth: the same wall as create
|
|
71
|
-
|
|
72
|
-
Every apply-depth run closes at the **same machine-check wall create's gates enforce**: after the last edit, run the scoped verify sweep over every file the run touched (`preship-sweep.mjs --files <touched...> --manifest design.tokens.json`), resolve every fix-or-classify finding it reports, and don't present results until it comes back clean. The wall is script-shaped — no hook fires it for you, and no run is exempt. An apply run is create's emission discipline pointed at files that already exist.
|
|
73
|
-
|
|
74
|
-
When a finding names a chart, load `data/combinations/charts.csv` before fixing it; when a finding names an icon, `icons.csv` — the table is the floor for the replacement pick, and an off-table pick states its reason in the finding body. Contract: [combinations/Readme.md](../data/combinations/Readme.md). (The look tables never load here — emission is jailed to the lever manifest.)
|
|
75
|
-
|
|
76
|
-
## Diff-scope discipline
|
|
77
|
-
|
|
78
|
-
An improve run edits **only the files its findings name**. A run that writes a file outside its findings fails the pre-ship scope cross-check (`preship-sweep.mjs`).
|
|
79
|
-
|
|
80
|
-
The universal preservation list holds regardless of scope or depth — never silently changed: route slugs, navigation labels, form-field names and order, analytics/event identifiers, API and data-contract shapes, and generated files. Per-project additions to this list, if ever needed, are entries in the project's token artifact payload — data, not run configuration.
|
|
81
|
-
|
|
82
|
-
## Run shape
|
|
83
|
-
|
|
84
|
-
1. **Read the lever manifest.** Extract one from the code first if absent.
|
|
85
|
-
2. **Diagnose** scoped to the run's scope, causes-first; rank; split `within-levers` from `lever-change`.
|
|
86
|
-
3. **Diagnose-only** → deliver the ranked findings and stop.
|
|
87
|
-
4. **Apply** → edit only the files the findings name, then close at the verify sweep over the touched files, jailed to the manifest.
|
|
88
|
-
5. **Escalate** → report the tier-two findings and offer the consented lever-authority follow-up.
|
|
89
|
-
|
|
90
|
-
## `judge` — the rendered-evidence preset
|
|
91
|
-
|
|
92
|
-
The invocable eye. `judge` is the preset row above run over **rendered pixels**: same engine, same jail, same finding format — plus screenshots captured, read back, and critiqued. It ships behind an explicit verb, never as a mandatory create phase; create's pipeline keeps zero model-judged rungs.
|
|
93
|
-
|
|
94
|
-
The protocol, five steps, in order:
|
|
95
|
-
|
|
96
|
-
1. **Render.** Reuse the render rung's browser plumbing: `render-rung.mjs --screenshot <outdir>` captures the app's key surfaces at **375 / 768 / 1440** (the rung's sweep also lands 1024 — a captured screenshot is read like any other) — the boot theme, *and* the second theme when the resolver declares a dark context (flip `data-theme`, as the rung's per-theme drift check does). Deterministic waits are the rung's existing settle logic; the PNGs land in a run-scoped temp dir.
|
|
97
|
-
2. **Read back.** Read every captured image into context. **A screenshot you didn't read doesn't count** — describe each surface before critiquing it.
|
|
98
|
-
3. **Critique against the four fixed referents** — never free-floating taste:
|
|
99
|
-
- **the brief** — does the rendered app serve the stated intent;
|
|
100
|
-
- **the artifact's `anchors`** — does the gestalt read in the named products' class: would this screenshot sit plausibly in Linear's or Stripe's product family;
|
|
101
|
-
- **the resolved style row's `checklist`** ([`styles.csv`](../data/combinations/styles.csv)) — the did-the-look-land walk, item by item, always including the standing harmony item: palette, type, and treatment read as one hand;
|
|
102
|
-
- **the project taste profile** (`docs/design/taste.yml`) — does the rendered app respect the recorded taste items; missing or malformed degrades to no-profile behavior with a one-line notice, as at intake.
|
|
103
|
-
|
|
104
|
-
Plus the standing judged dimensions — [diagnosis.md](diagnosis.md)'s taxonomy pass, Perception especially — with the screenshots as the evidence.
|
|
105
|
-
4. **Findings** in the canonical format, verbatim — dimension · cause layer · evidence (now admitting screenshot path + region) · before→after · consequence · tier · severity · provenance — severity-ranked, unscored; fix-or-classify applies. Structure findings still precede Perception: causes-first holds even when the evidence is a pixel.
|
|
106
|
-
5. **File the report.** A judge run always writes a dated findings report — `docs/design/judge-YYYY-MM-DD.md` in the consumer project — so the eye leaves a record even when nothing is applied.
|
|
107
|
-
|
|
108
|
-
### Boundaries — what judge is not
|
|
109
|
-
|
|
110
|
-
- **Not a rung.** The verification ladder is unchanged; no machine verdict rests on the model's read of a screenshot; a create run completes without judge ever running. Pixel instruments stay evidence-inside-findings — judge is a *workflow*, subject to the same rule.
|
|
111
|
-
- **Not autonomous escalation.** judge recommends; the user triggers any follow-up — `judge --fix`, a lever-consent run. No regenerate-until-passing.
|
|
112
|
-
- **Not a score.** No numeric grades in findings, ever — run-time scores are false precision; severity ranks plus the mandatory measurable before→after per finding give comparability without pretending decimals. Scores exist only outside the skill: the eval harness computes them from its own panel; the skill never self-scores.
|
|
113
|
-
- **Instruments are evidence, never verdicts — on recorded empirical grounds.** "Lower visual complexity ⇒ higher quality" is refuted for this domain: surfaces that are dense on purpose invert the sign of "good". Computational clutter/aesthetics metrics validate correlationally and modestly — ≤ 49% of human ratings on webpages, ≤ 32% on apps, zero validation on dashboards and CRMs — and a subset are pretrained neural nets, excluded outright as model judgment. So a pixel instrument may be *cited inside* a judged finding and is structurally barred from gating. The two vetted instruments a judge finding reaches for first: **Edge Density** (`inst-01` — Canny edge pixels ÷ total pixels; r≈0.83 with visual-search times, the cheapest proxy for how fast an operator finds a target) and the **Keystroke-Level Model** (`inst-11` — P 1.10s · H 0.40s · M 1.35s · K 0.20–0.28s, summed over the core loop; countable operator-cost evidence for the throughput-vs-delight floor principle, `f01`). The interaction *path* is judgment, so KLM is evidence too, never ground truth.
|
|
114
|
-
- **Degradation.** No headless browser → judge **refuses**, printing the rung's install command (`npm install -D playwright && npx playwright install chromium`) — an eye that cannot see does not judge from memory. It never falls back to source-only critique; source-only is `review`.
|
|
115
|
-
|
|
116
|
-
Prior art for a future live-variant mode (consent-gated, human present — never a rung): impeccable's identity lock — extract the surface's existing identity into one non-aspirational sentence, then a mandatory squint test that every variant reads as the same brand — with 0–4 tunable `--p-*` parameter knobs per variant; the corpus's only closed taste loop with real eyes on it.
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
# Interaction — keyboard-first control
|
|
2
|
-
|
|
3
|
-
The operator keeps both hands on the keyboard and all attention on the task. This file is the interaction floor that preserves both: the state contract, focus discipline, overlay policy, consequence design, and the keyboard-first operator patterns.
|
|
4
|
-
|
|
5
|
-
**Seams.** Element-level states (a button, a field, a row) live here. Surface-level lifecycle states — a data surface's loading / empty / error / degraded — and the error and empty-state copy formulas live in [lifecycle.md](lifecycle.md). Do not conflate a button's inline spinner with a surface's skeleton. Thresholds (ring contrast and width, target geometry, dialog mechanics) live in the catalog; this file names the contracts and cites the rule family by anchor prefix (`int-*` interaction, `sta-*` states, `mot-*` motion, `trust-*` AI trust) — it never restates the numbers. The boot-loaded imperative lines are in [hard-rules.md](hard-rules.md); the render-only checks run at the render rung (D32, [diagnosis.md](diagnosis.md)).
|
|
6
|
-
|
|
7
|
-
## The state contract
|
|
8
|
-
|
|
9
|
-
Every interactive element ships all its states, designed, never left to the substrate's defaults. Each state communicates one fact to the operator:
|
|
10
|
-
|
|
11
|
-
| State | Must communicate |
|
|
12
|
-
| --- | --- |
|
|
13
|
-
| default | the element is here and actionable |
|
|
14
|
-
| hover | the pointer is over an actionable target |
|
|
15
|
-
| focus | the keyboard is on this element right now |
|
|
16
|
-
| active | the press registered (tactile feedback) |
|
|
17
|
-
| disabled | present but not actionable, and legibly why-context |
|
|
18
|
-
| loading | the action is in flight; the element is busy, not broken |
|
|
19
|
-
| error | this element's input or action failed, stated inline |
|
|
20
|
-
| success | the action landed |
|
|
21
|
-
|
|
22
|
-
Hover and focus are **different states for different users** — a pointer user reads hover, a keyboard user reads focus. Designing hover without a focus state strands every keyboard operator; it is the characteristic failure this contract exists to stop. Button-tier states (default / hover / active / focus / disabled) are presence-checked machine rules (`int-*`); distinct button tiers hold, one primary per region.
|
|
23
|
-
|
|
24
|
-
The **error** state surfaces on blur, never per keystroke (`int-*`), and renders inline below the offending field — never banner-only for a field error. The error *copy* follows lifecycle.md's error formula. The **active** state's tactile press feedback rides the motion rules (`mot-*`, suppressed under reduced-motion); its timing tokens live in [personality.md](personality.md).
|
|
25
|
-
|
|
26
|
-
## Focus discipline
|
|
27
|
-
|
|
28
|
-
- **Visible focus, always.** Every focusable element carries a `:focus-visible` ring driven by the `--ring` token so it follows the look. `outline: none` without a replacement is banned (`int-*`). The ring meets the catalog's contrast and width floor — do not restate it, satisfy it.
|
|
29
|
-
- **Focus order follows task order.** Tab order is the sequence the operator works, not a DOM accident. Composite widgets — tables, listboxes, menus, toolbars — use roving tabindex: the widget is one tab-stop, arrow keys traverse inside it.
|
|
30
|
-
- **Focus is returned on overlay close.** Opening an overlay moves focus into it; closing returns focus to the element that opened it. Focus never drops to the top of the document.
|
|
31
|
-
- **Keyboard path parity.** Every pointer affordance has a keyboard equivalent — nothing is reachable by hover or click alone (floor f06). Hover-revealed row actions carry a focus path (`int-*`). `cursor: pointer` marks every clickable element on the web (`int-*`).
|
|
32
|
-
- **Skip links** jump to the primary work region on any surface with substantial navigation.
|
|
33
|
-
|
|
34
|
-
## Overlay policy
|
|
35
|
-
|
|
36
|
-
Escalate only as far as the interaction demands, cheapest rung first (floor f03):
|
|
37
|
-
|
|
38
|
-
1. **Inline expansion** — reveal detail in place; no overlay at all.
|
|
39
|
-
2. **Side panel** — detail and edit open *beside* the work, not on top of it (`--side-panel-width` / `--side-panel-width-rich`). This is the default for viewing and editing an entity.
|
|
40
|
-
3. **Modal** — last, and only when earned.
|
|
41
|
-
|
|
42
|
-
A modal is earned by exactly two cases: a **destructive or irreversible confirmation**, or a **self-contained one-to-two-field action** that must block the surface until answered. Anything larger — a full form, a multi-field edit, a record's detail — is a side panel or its own route, never a modal.
|
|
43
|
-
|
|
44
|
-
Modal mechanics are structural: a native `<dialog>` with the background marked `inert`, so focus containment comes from the platform, not a scripted trap (`int-*`). One modal at a time — **nested modals are banned** (`int-*`); a second decision is either a step inside the first or a side panel. `--modal-width-max` caps width; a modal that needs its own scroll is really a side panel or a page.
|
|
45
|
-
|
|
46
|
-
## Consequence design
|
|
47
|
-
|
|
48
|
-
Match the affordance to the action's reversibility:
|
|
49
|
-
|
|
50
|
-
- **Reversible action → undo, not confirm.** Perform it immediately; offer an undo affordance (`int-*`). A confirmation dialog on a reversible action is friction the operator pays on every repetition.
|
|
51
|
-
- **Destructive irreversible action → confirm, with the consequence stated**, plus undo wherever the substrate allows a window. An irreversible action with neither confirmation nor undo is graded **auto-critical** in diagnosis (`int-*`; severity per D22).
|
|
52
|
-
- **Consequence visible before commit.** Irreversible actions preview-then-commit: the operator sees what will happen — rows affected, records deleted, the exact scope — before the commit control.
|
|
53
|
-
- **Optimistic updates only for low-stakes actions, always with rollback** and a visible reconcile on failure (`int-*`). High-stakes writes await server confirmation; they do not fake success.
|
|
54
|
-
|
|
55
|
-
## Keyboard-first operator patterns
|
|
56
|
-
|
|
57
|
-
- **Command palette** (`cmdk`) is the power-user's front door — global verbs, entity jump, reachable by a single chord. Expected on any multi-surface operator tool.
|
|
58
|
-
- **Row-level keyboard actions in queues.** A queue row is focusable; the frequent verbs (open, assign, resolve, advance) bind to keys; the kebab overflow is keyboard-reachable, not pointer-only. Roving tabindex moves between rows, and the row's keyboard action set mirrors its pointer menu exactly — no verb is pointer-only.
|
|
59
|
-
- **Tab-stop economics on the core loop.** The operator's core loop ([structure.md](structure.md)) must complete in few keystrokes and homings. Every tab-stop on the hot path is a cost paid per item, per shift — prune stops that do not earn their place, and keep the primary verb one key away.
|
|
60
|
-
- **KLM is the diagnosis lens, not a gate.** Counting the keystrokes, pointer homings, and mental operators of a fixed core-loop path (the Keystroke-Level Model) turns "this feels slow" into a number. It rides [diagnosis.md](diagnosis.md) as a judged instrument against floor f01's throughput metric — evidence inside a finding, never a machine verdict.
|
|
61
|
-
|
|
62
|
-
## Assistive floors beyond keyboard
|
|
63
|
-
|
|
64
|
-
Presence-shaped, machine-checked wherever the rule holds universally (D26b; catalog plus render rung):
|
|
65
|
-
|
|
66
|
-
- `aria-live` region wherever async status renders (`int-*`); toasts announce politely and never steal focus.
|
|
67
|
-
- `aria-sort` on sortable headers (`int-*`).
|
|
68
|
-
- `<dialog>` / `inert` containment on every modal (`int-*`).
|
|
69
|
-
- The visible `:focus-visible` ring meeting the contrast and width floor (`int-*`).
|
|
70
|
-
- Labels visible and above the input; placeholder-as-label is banned on form fields (`int-*`).
|
|
71
|
-
- Accessible-name on every interactive element and image (axe `button-name` / `select-name` / `image-alt` / `link-name`); ARIA validity (`aria-allowed-attr` and family); minimum target geometry — all resolved at the render rung (`int-*`, D32).
|
|
72
|
-
|
|
73
|
-
**Judged, not machine:** reading order beyond raw DOM sequence, screen-reader narration quality, whether a live region's politeness matches the update's urgency, and cognitive load. These are diagnosis dimensions ([diagnosis.md](diagnosis.md)), not presence flags.
|
|
74
|
-
|
|
75
|
-
## AI surfaces
|
|
76
|
-
|
|
77
|
-
Interaction governance for embedded AI and copilot surfaces — presence disclosed, a human override path always visible, irreversible AI-initiated actions consent-gated with preview, actions auditable — defers wholesale to the trust rubric ([trust-rubric.md](../data/operator-pack/trust-rubric.md)); it is not restated here.
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
# Introspect
|
|
2
|
-
|
|
3
|
-
The workflow that explains **why** a UI isn't working. Loaded when the front gate routes to introspect. Diagnoses with the shared engine (`diagnosis.md`); hands findings to `improve.md` on consent. Reads code — never edits it.
|
|
4
|
-
|
|
5
|
-
## The deliverable is understanding
|
|
6
|
-
|
|
7
|
-
Introspect produces a causal explanation, not a fix. The badness a user reports is always felt in **Perception** — the table looks noisy, the page feels heavy, nothing tells you where to look. Its cause almost always lives one layer down, in **Structure** (how it's built) or **Behavior** (how it responds). The run's job is to walk that chain and name every link, so the reader finishes understanding not just *what* is wrong but *why the thing they felt is produced by the thing they didn't see*.
|
|
8
|
-
|
|
9
|
-
## The run
|
|
10
|
-
|
|
11
|
-
1. **Ask the reader.** One question, before anything else (below).
|
|
12
|
-
2. **Diagnose** with `diagnosis.md`: passes run causes-first — Structure → Behavior → Perception — producing severity-ranked canonical findings. Introspect invents no diagnosis of its own. When the audited UI renders charts, `data/combinations/charts.csv` loads into the pass — chart findings read against it, and an off-table judgment states its reason in the finding body.
|
|
13
|
-
3. **Explain** each finding as a causal chain narrated the other way: from where the badness is felt (Perception) down to where its cause lives (Structure or Behavior).
|
|
14
|
-
4. **Render** every finding in the reader's register.
|
|
15
|
-
5. **File** the dated report; **offer** the improve handoff.
|
|
16
|
-
|
|
17
|
-
## The reader question
|
|
18
|
-
|
|
19
|
-
Asked at invocation, every run, verbatim:
|
|
20
|
-
|
|
21
|
-
> Who is reading this — a designer, a developer, or a PM/general reader?
|
|
22
|
-
|
|
23
|
-
Never inferred from the brief. Never a stored default carried from a prior run — ask again every time. Asking costs a beat and is never wrong; a silent guess about the reader is how one diagnosis turns into the wrong three sentences.
|
|
24
|
-
|
|
25
|
-
The register is presentation only. It changes how a finding is *said*, never what the finding *is* — it is not an axis on the UI or on the diagnosis.
|
|
26
|
-
|
|
27
|
-
## The three registers
|
|
28
|
-
|
|
29
|
-
One diagnosis, three renderings. Same evidence, same fix, same severity — never three different opinions.
|
|
30
|
-
|
|
31
|
-
- **Designer** — the untranslated finding, in design language: dimensions, hierarchy, the causal chain as-is. No translation; the finding is already in their tongue.
|
|
32
|
-
- **Developer** — the finding compiled to code-speak: the token, the file, the line site, the exact edit, and whether it stays within existing levers.
|
|
33
|
-
- **PM / general reader** — the finding translated to outcomes: what the operator loses today, what changes after the fix, and roughly what it costs.
|
|
34
|
-
|
|
35
|
-
### Worked example — one finding, three ways
|
|
36
|
-
|
|
37
|
-
Canonical finding (fields owned by `diagnosis.md`):
|
|
38
|
-
|
|
39
|
-
- **dimension** · B1 Interactive States **cause layer** · Behavior **tier** · within-levers **severity** · major **provenance** · B1 Interactive States (states-presence)
|
|
40
|
-
- **felt symptom (Perception)** · on first load the queue renders as an empty, misaligned frame, then snaps into place when rows arrive
|
|
41
|
-
- **evidence** · `src/routes/queue/QueueRoute.tsx:28` — `<QueueTable rows={data}>` renders unconditionally while `data` is `[]` during the fetch
|
|
42
|
-
- **before → after** · no loading state → the lifecycle pattern's skeleton, column-geometry-matched, shown while `isLoading`
|
|
43
|
-
- **consequence** · every visit shows a flash of broken-looking UI and a layout shift; the queue reads as *failing* before it reads as *loading*
|
|
44
|
-
|
|
45
|
-
Rendered per register:
|
|
46
|
-
|
|
47
|
-
- **Designer** · "The queue has no loading state: it paints its empty frame before data arrives, so the first thing an operator sees is a broken, misaligned table that then jumps. Give it a skeleton matched to the column geometry, held until rows load. A surface that reads as broken before it reads as loading erodes trust on every visit. (Interactive states; cause in Behavior; major.)"
|
|
48
|
-
- **Developer** · "`src/routes/queue/QueueRoute.tsx:28` — `<QueueTable rows={data}>` renders while `data` is `[]` during the fetch. Branch on `isLoading` and render the lifecycle skeleton (column-width-matched rows) until the query resolves. Within existing levers; no token or manifest change. (B1, Behavior; major.)"
|
|
49
|
-
- **PM** · "The queue looks broken for a moment every time it opens, then jumps into place — it needs a real loading state so it reads as loading, not failing. Low effort; removes a daily 'is this thing working?' flinch for every agent. (Major.)"
|
|
50
|
-
|
|
51
|
-
The designer hears design, the developer gets the branch and the file, the PM gets the cost and the outcome — one diagnosis underneath all three.
|
|
52
|
-
|
|
53
|
-
## The findings report
|
|
54
|
-
|
|
55
|
-
Every run files a dated report — introspection doubles as documentation, so a run that produced understanding doesn't evaporate with the conversation. The path is shared with review reports:
|
|
56
|
-
|
|
57
|
-
```
|
|
58
|
-
docs/design/findings/YYYY-MM-DD-<slug>.md
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
`<slug>` names the target (the surface, or the app). The report carries the canonical findings so a consented improve run consumes it directly, topped with a two-line executive summary in the chosen register. It is a deliverable, not runtime state — never read back as design state (code is the cache, floor f08).
|
|
62
|
-
|
|
63
|
-
### Template
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
# Introspection — <target> · <YYYY-MM-DD>
|
|
67
|
-
|
|
68
|
-
Reader: <designer | developer | pm>
|
|
69
|
-
Scope: <surface / dimension / whole app examined>
|
|
70
|
-
|
|
71
|
-
## Summary
|
|
72
|
-
<two lines, in the chosen register — the shape of what's wrong and what it costs>
|
|
73
|
-
|
|
74
|
-
## Findings
|
|
75
|
-
<severity-ranked: auto-critical → critical → major → minor; canonical format per diagnosis.md>
|
|
76
|
-
|
|
77
|
-
### <n>. <one-line title> — <severity>
|
|
78
|
-
- dimension · cause layer · tier · provenance
|
|
79
|
-
- evidence: <file:line / token / value>
|
|
80
|
-
- before → after: <token-cited; numeric where machine-backed>
|
|
81
|
-
- consequence: <what it costs the operator>
|
|
82
|
-
- <the finding rendered in the chosen register>
|
|
83
|
-
|
|
84
|
-
## Handoff
|
|
85
|
-
Findings share the canonical format. To apply, run improve over this report:
|
|
86
|
-
within-levers findings apply jailed; lever-change findings need lever consent.
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Severity is a ranked scale, never a number — no scores, ever.
|
|
90
|
-
|
|
91
|
-
## The improve handshake
|
|
92
|
-
|
|
93
|
-
Introspect diagnoses; it never touches app code. When the user wants the findings applied, the same canonical findings feed an improve run (D10's escalation, run in reverse): the report *is* the input — improve reads it directly because both share the finding format. Scope covers what the findings name; depth is apply; authority follows each finding's tier — **within-levers** findings apply jailed to the lever manifest, **lever-change** findings are offered and need lever consent, never changed unbidden. The handoff is offered, never automatic.
|
|
94
|
-
|
|
95
|
-
## Never
|
|
96
|
-
|
|
97
|
-
- Never edit code — introspect reads, diagnoses, explains, and files the report; fixes happen only through a consented improve run.
|
|
98
|
-
- Never infer or store the reader — ask, every run.
|
|
99
|
-
- Never let a register become three opinions — it is presentation of one diagnosis.
|
|
100
|
-
- Never emit a numeric score — severity rank only.
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# Lifecycle & microcopy
|
|
2
|
-
|
|
3
|
-
The states a surface actually lives in, and the microcopy mechanisms that fill them. The brief describes the happy path; production is mostly everything else — loading at 9am, empty for a new tenant, degraded and half-stale at 3am. A surface designed only for the state the brief names is a broken surface.
|
|
4
|
-
|
|
5
|
-
**Loads** at the create **surfaces** phase (state-shells get filled here) and whenever improve/introspect diagnoses state or copy coverage. Reads the `temporal` facts from `docs/design/structure.md`; the state-presence and copy-shape rules (`sta-*`) are already in boot context via `hard-rules.md` — this file is the design content behind them, not a restatement. Dial defaults come from `personality.md`.
|
|
6
|
-
|
|
7
|
-
## The seam: mechanisms, not words
|
|
8
|
-
|
|
9
|
-
Everything here is a **mechanism** — a formula, a required shape, a consistency discipline. The actual words are the business's call (floor f12). The skill enforces that an error names what happened / why / how to fix; it never writes the error text. It enforces one term per concept; it never picks the term. Emit shells and shapes; leave the vocabulary to the domain.
|
|
10
|
-
|
|
11
|
-
## Required states per surface
|
|
12
|
-
|
|
13
|
-
Four states are **always** required on every data surface: **loading**, **empty**, **error**, **partial/degraded**. They are not afterthoughts — they are the surface. Beyond the four, these are required **only where the model says they exist**, and the model is `docs/design/structure.md`'s `temporal` block, not a guess:
|
|
14
|
-
|
|
15
|
-
- **post-action** — an action passes through pending/saving/processing before it resolves.
|
|
16
|
-
- **cancel path** — a long or reversible action can be abandoned mid-flight.
|
|
17
|
-
- **disconnection / timeout** — the surface can lose the backend.
|
|
18
|
-
- **concurrent edit** — two operators can touch one record at once.
|
|
19
|
-
|
|
20
|
-
The temporal probe (run inside the object pass — see `structure.md`) is what decides which conditional states a surface carries; read its facts, don't invent them.
|
|
21
|
-
|
|
22
|
-
**States are built into the shell, never bolted on.** The scaffold phase already stubbed every declared state per surface (the state-shell stubs). The surfaces phase composes real content into those stubs. A shell whose `error` or `empty` slot ships as a placeholder is an unfinished surface and fails the phase gate. You are never adding states to a finished surface — you are filling shells that already exist.
|
|
23
|
-
|
|
24
|
-
## Empty states
|
|
25
|
-
|
|
26
|
-
An empty state is not one state. Five are distinct, and each earns distinct copy — collapsing them into one generic "No data found" is the defect:
|
|
27
|
-
|
|
28
|
-
| Kind | It means | The copy teaches |
|
|
29
|
-
| --- | --- | --- |
|
|
30
|
-
| first-time | nothing created yet | what this surface is for, how to make the first thing |
|
|
31
|
-
| user-cleared | they emptied it | that the clear worked, how to undo or add again |
|
|
32
|
-
| no-results | filter/search matched nothing | that data exists, that the filter is the cause |
|
|
33
|
-
| no-access | forbidden, not empty | that it exists but is gated, who to ask |
|
|
34
|
-
| error | the fetch failed | routes to the error formula below, never to "empty" |
|
|
35
|
-
|
|
36
|
-
**The empty formula: acknowledge → state the value → at most one action.** Text-first (floor f02) — copy plus at most one action, never an illustration showcase. *At most* one, not exactly one: a read-only surface (an audit log) legitimately offers zero. Never a dead-end on an actionable surface. Copy runs one to two sentences.
|
|
37
|
-
|
|
38
|
-
## Errors
|
|
39
|
-
|
|
40
|
-
**The error formula: what happened / why / how to fix.** All three parts. "Something went wrong" fails all three — it diagnoses nothing, explains nothing, offers no recovery, and is a named defect.
|
|
41
|
-
|
|
42
|
-
**Dead ends and silent failures are banned.** Every error is visible and every error has an exit. A failure the operator can't see and a failure they can see but can't act on are the same bug.
|
|
43
|
-
|
|
44
|
-
**Errors render inline, next to the offending field** — not in a banner divorced from the cause. The exception is genuinely system-wide failure (the backend is down, not one field is invalid), which legitimately banners; that scope is why the inline rule grades warning-tier, not absolute.
|
|
45
|
-
|
|
46
|
-
## Temporal honesty
|
|
47
|
-
|
|
48
|
-
Render the read model's lag honestly. When a write isn't yet visible in the read model, show a **pending state** — never paint the optimistic result as settled truth. Pending is not a lie; a premature success is.
|
|
49
|
-
|
|
50
|
-
- **Skeletons mirror the content's shape**, not a centered spinner — the same columns, rows, and blocks the loaded surface will show. **Delay showing ~150–300ms** so a fast response never flashes a skeleton. The full loading-indicator bands (nothing under the short threshold, skeleton in the mid band, progress bar past the long one) are pinned by `mot-*`.
|
|
51
|
-
- **Optimistic updates only for low-stakes actions, always with a visible rollback surface** — the row reverts and says why when the write loses. High-stakes or irreversible actions wait for the server (pessimistic) and preview before commit.
|
|
52
|
-
- **Distinguish "no data" from "can't get data."** Empty means the query succeeded and found nothing; degraded means the query failed or the data is stale. **Mark staleness honestly** — a panel showing a cached value while its source is unreachable says so.
|
|
53
|
-
|
|
54
|
-
## Toasts
|
|
55
|
-
|
|
56
|
-
Toasts acknowledge transient, low-stakes success — nothing that needs action. **Auto-dismiss 3–5s, `aria-live="polite"`, never steal focus** (pinned in `sta-*`). An actionable error never lives only in a toast that vanishes; it goes inline where the operator can act on it. A toast is never the only signal for something the operator must do.
|
|
57
|
-
|
|
58
|
-
## Copy disciplines
|
|
59
|
-
|
|
60
|
-
Two disciplines govern every visible string, and they apply to UI copy, help text, and API names alike:
|
|
61
|
-
|
|
62
|
-
- **One term per concept, one concept per term.** If the thing is a "ticket," it is a ticket in the label, the tooltip, the empty state, the toast, and the endpoint. Two words for one concept, or one word for two, is the defect. Divergence is allowed only when deliberate — a legacy-locked internal name may lag a renamed label — never accidental.
|
|
63
|
-
- **Verb+object action labels.** "Create ticket," "Assign agent," "Archive job" — never bare "Submit," "OK," "Done." The label states the object it acts on.
|
|
64
|
-
|
|
65
|
-
Both ride **sentence case** (not Title Case, not ALL CAPS outside tracked micro-labels) and **front-loading** — put the information-bearing word first so a scanning eye catches meaning at the left edge. "Payment failed — card declined," not "There was a problem processing your payment." Front-load labels, headings, menu items, and column headers.
|
|
66
|
-
|
|
67
|
-
## The copy self-audit
|
|
68
|
-
|
|
69
|
-
A pre-ship mandatory procedure (`proc-*`, fires in the whole-app sweep): **re-read every visible string on every surface and rewrite every flagged one.** This is the pass that kills lorem-slop, fabricated metrics, generic "No data found" empties, and dead-end errors in one sweep — and the pass that verifies one-term-per-concept held across the whole app, not just per file. No surface ships un-audited.
|
|
70
|
-
|
|
71
|
-
## Dials modulate presentation
|
|
72
|
-
|
|
73
|
-
Lifecycle presentation is dial-controlled, never per-surface improvisation. `data-verbosity` scales how much status copy renders — `full` spells out pending and progress narration, `expert` compresses it. `data-feedback` scales feedback intensity — how often toasts fire, how much motion a state transition carries. The dials compose *with* density, never instead of it. Their levels, defaults, and wiring live in `personality.md`; this file governs the states, not the knobs.
|