@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
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Step 3 — Content: the believable book
|
|
2
|
+
|
|
3
|
+
Author the demo data **before composing surfaces**. Data credibility is the single largest scoring dimension in blind judging; this step is where builds are won.
|
|
4
|
+
|
|
5
|
+
## From the corpus
|
|
6
|
+
|
|
7
|
+
Load the chosen domain's corpus (`data/corpora/<domain>/`): `corpus.md` (vocabulary, number-shape recipes, the invariants block) plus `people.csv` and `companies.csv`.
|
|
8
|
+
|
|
9
|
+
- Names come from the corpus roster; emails derive from names; roles are domain-correct.
|
|
10
|
+
- Activity strings use the corpus vocabulary — a CRM logs "Intro call with Elena — pricing discussion", never webhook noise.
|
|
11
|
+
- Numbers follow the corpus's shape recipes (log-normal deal values, plausible deltas); dates vary around the corpus's **fixed reference instant**, never around "now".
|
|
12
|
+
- **Acceptance is rendered plausibility against the declared invariants**: aggregates reconcile with their rows; legal ranges hold; forbidden repetition (same surname clusters, identical amounts) never shows. The ship gate checks these mechanically — author to them now.
|
|
13
|
+
- **Edge-case rows (nulls, zeros, outliers) go only into dedicated state fixtures** (`empty*`, `degraded*`), never into the primary dataset.
|
|
14
|
+
|
|
15
|
+
## Voice
|
|
16
|
+
|
|
17
|
+
Load the package-bound voice pack (`data/voices/<id>.md` — the package's §9 names it). All authored strings — buttons, empty states, errors, tooltips, confirmations — speak in that voice, with tone varying by situation per the pack's tone map.
|
|
18
|
+
|
|
19
|
+
## Chart choice
|
|
20
|
+
|
|
21
|
+
Every data-bearing surface consults the chart-selection engine — **one graph question per consult**:
|
|
22
|
+
|
|
23
|
+
1. Author the data signature (the judgment half): the question, measures, dimensions, semantic flags (temporal, parts-form-whole, target-exists, …), constraints. Decompose multi-question asks first.
|
|
24
|
+
2. Run `node scripts/select-chart.mjs <signature.json>` and read the typed output: admissible set, eliminations with reason codes, ranking, recommendation, or a refusal code.
|
|
25
|
+
3. **Honor refusals** — a refusal means the question isn't chartable as posed (often: it's a table). Never invent a measure to force a chart.
|
|
26
|
+
4. Record the pick in one line in `decisions.md`. Taking a non-recommended admissible option needs a reason on that line; taking an eliminated option is out of contract.
|
|
27
|
+
|
|
28
|
+
Chart *styling* is not this step's concern — the package's §8 and the chart-styling axis own it at composition.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Package emission — design.md → token artifact
|
|
2
|
+
|
|
3
|
+
One source, one derivation: the project's `design.md` is canonical; the token artifact is compiled from it and **never hand-edited**. Emit with `node scripts/validate-design-md.mjs <project design.md> --emit > design.tokens.css` (the artifact lives beside `design.md` at the repo base; the app's global stylesheet imports it). Re-emit on every design.md change; the ship gate's drift check byte-compares a fresh emission against the committed artifact.
|
|
4
|
+
|
|
5
|
+
## Coverage
|
|
6
|
+
|
|
7
|
+
The artifact is complete by construction — the validator fails the design.md before emission otherwise: every one of the 36 color roles in **both** themes, the full type ramp, the elevation system, the motion base, layout dimensions. Composition consumes tokens and never invents values; switching packages re-skins the whole app.
|
|
8
|
+
|
|
9
|
+
## Emission constraints
|
|
10
|
+
|
|
11
|
+
Each prevents a known silent-failure class:
|
|
12
|
+
|
|
13
|
+
- **Specificity armor.** Theme blocks are `:root, :root[data-theme="light"]` and `:root[data-theme="dark"]` — both specificity (0,2,0) — so a component library's later bare `:root` block cannot silently defeat a theme.
|
|
14
|
+
- **Font binding by derivation.** Font stacks bind to installed packages under **registered family names** (`"Inter Variable"`, not `"Inter"`), each with its declared fallback stack — otherwise the flagship font silently never renders. Install the font packages the design.md declares (e.g. Fontsource) and verify the name matches what the package registers.
|
|
15
|
+
- **Every authored token group reaches a named consumer.** An authored ramp with no emitter vanishes without a trace — wire each group (colors → theme classes/utilities, ramp → text styles, elevation → radius/shadow utilities, motion → duration/easing vars) and let the ship gate's reach check prove it.
|
|
16
|
+
- **Compile the emitted CSS once per change** — a stray utility string inside a CSS comment can defeat a fully green byte-level check.
|
|
17
|
+
- **One linear precedence, later wins:** package defaults → brief bindings → recorded deviations. Values resolve at emission; the runtime cascade carries only contexts (theme, density).
|
|
18
|
+
|
|
19
|
+
## Stack neutrality
|
|
20
|
+
|
|
21
|
+
The artifact is plain CSS custom properties — every stack consumes it. Under `primitives: nurix`, Tailwind maps the properties through the theme config; under `native`, the incumbent styling layer reads the same variables. No emission step is React-specific.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Improve, judge, and extract on existing apps
|
|
2
|
+
|
|
3
|
+
The same machinery runs on existing UIs, under a preservation contract.
|
|
4
|
+
|
|
5
|
+
## Judge — a user-invoked service
|
|
6
|
+
|
|
7
|
+
A critique of an existing UI against the brief, the project's `design.md`, the archetype checklists, and `taste.md`, producing a **severity-ranked (never scored) report**. Judge is a service the user asks for — never a self-check the skill runs on its own output. Read the actual rendered state (screenshots the user provides, or captures the user asks for); refuse to critique from source alone when the ask is "does it look right", and never imagine what unrendered code looks like. Each finding: severity, the on-screen element, what's wrong, the exact fix.
|
|
8
|
+
|
|
9
|
+
## Improve — judge + the fix pass
|
|
10
|
+
|
|
11
|
+
Whole-canvas authority holds, under the **preservation contract**:
|
|
12
|
+
|
|
13
|
+
1. **Pre-flight findings block** — record the incumbent system with file citations: tokens, fonts, framework, component conventions. When the product already lives on an official design system, that system is respected, never replaced. The primitives switch reads `native` on these runs unless the incumbent already uses `@nurix/components`.
|
|
14
|
+
2. **Preserve/introduce declaration** precedes any change: what stays, what enters, in one block.
|
|
15
|
+
3. **The never-silently-change list** holds regardless of authority: routes and slugs, nav labels, form field names and IDs, brand marks, legal copy. The no-jails law is about *our* generated files; a user's existing brand and IA are theirs. Changing anything on this list requires the user's explicit ask.
|
|
16
|
+
|
|
17
|
+
Improve runs then proceed through the standard steps as scoped: intake (against the incumbent — the package choice may be "extract", below), structure only where surfaces change, content only where data is fake, compose with the finishing pass, and the ship gate on what was touched.
|
|
18
|
+
|
|
19
|
+
## Extract — reading an identity package out of a foreign UI
|
|
20
|
+
|
|
21
|
+
A supported entry path, under **attestation and provenance**:
|
|
22
|
+
|
|
23
|
+
- Record what the source is and whose it is: own product / public reference / third party.
|
|
24
|
+
- Extract **structure and system, never pixels or assets**: roles, ramps, spacing, elevation, motion posture — into a `tier: project` design.md in the package schema, validator-checked.
|
|
25
|
+
- Write a provenance block into the extracted file (`source-package: extracted@<date>` plus the attestation lines).
|
|
26
|
+
- Record what **is**, never what should be — extraction is documentation, not improvement; the improve pass comes after, separately, if asked.
|
|
27
|
+
- Admission of an extracted package into the shared roster later requires the provenance check to pass; third-party extractions stay project-local.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Step 1 — Intake: brief → recorded choices
|
|
2
|
+
|
|
3
|
+
Read the brief and choose from the menus: one identity package (the design.md system), any axis overrides the brief demands, layout blueprints per surface, and the product domain for content. Every choice is one recorded line.
|
|
4
|
+
|
|
5
|
+
## Rules
|
|
6
|
+
|
|
7
|
+
- **The brief's own words outrank any database default.** "Beautiful" means the ceiling, not the safe row.
|
|
8
|
+
- **Adjectives become referents.** When the brief speaks in adjectives ("premium", "editorial"), name the 2–3 real products the brief is pointing at and pick the package whose recorded identity sits in that class — unnamed ambition becomes beige.
|
|
9
|
+
- **The index is a retrieval aid, never a router.** Load `design-md/index.csv` whole (it is small), shortlist 2–3 rows by segment/keyword resemblance, read only the shortlisted files' §1 Visual Theme, then choose reading the brief. After the choice, the chosen package's **full design.md enters context and stays in view through step 4**; unchosen candidates are dropped.
|
|
10
|
+
- **The escape hatch fires mechanically.** No index hit, plus a recorded one-line reason why the closest package fails → author a one-off project design.md in the package schema (`design-md/SCHEMA.md`), `tier: project`, validator-checked like any library entry. This path is expected to be common; flag the file as a curation candidate for the roster.
|
|
11
|
+
- **Set the primitives switch** — write one `primitives: nurix | native` line into the project's `design.md`. Default by the probe: the project resolves `@nurix/components` (check package.json / lockfile / node_modules) → `nurix`; otherwise — existing apps, foreign stacks, no library access — → `native`. Set once here; nothing downstream re-asks. Also write `source-package: <id>@<date>` (or `authored` for escape-hatch one-offs).
|
|
12
|
+
- **Write or update `product.md`**: users and their jobs, roles/permissions, action frequency, risk level, accessibility commitments, brand anti-references. Package choice, UX decisions, motion intensity, and demo data all cite it.
|
|
13
|
+
- **Consult `taste.md`** — its feel/avoid lines bias every choice; user reactions to shipped output update it in place. Missing file = no bias, never a block.
|
|
14
|
+
- **Stated-choice awareness:** if prior package picks are visible in the workspace, name them and say in one line why this pick repeats or differs — awareness, never forced rotation.
|
|
15
|
+
- **Questions go to the user only when the answer changes the design** (theme, audience, density); everything else is inferred and marked inferred.
|
|
16
|
+
|
|
17
|
+
## The preview block
|
|
18
|
+
|
|
19
|
+
Step 1 ends with a preview block:
|
|
20
|
+
|
|
21
|
+
- chosen package + one-line reason
|
|
22
|
+
- the primitives switch position
|
|
23
|
+
- axis overrides (each: axis → entry id → one-line reason)
|
|
24
|
+
- blueprints per surface
|
|
25
|
+
- domain corpus
|
|
26
|
+
- surface map with archetypes
|
|
27
|
+
- planned deviations
|
|
28
|
+
|
|
29
|
+
When a user is present, pause here **once** for confirm-or-redirect — a wrong pick costs one message now instead of a full build. Autonomous runs proceed. Either way the block becomes the durable header of this run's dated section in `decisions.md`.
|
|
30
|
+
|
|
31
|
+
## Outputs
|
|
32
|
+
|
|
33
|
+
- `design.md` (project fork: chosen package + switch line + provenance + brief bindings; deviations accrue as they are recorded)
|
|
34
|
+
- `product.md` written/updated; `taste.md` consulted
|
|
35
|
+
- the preview block, appended to `decisions.md`
|
|
36
|
+
- the chosen package's full design.md held in context
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Step 2 — Structure: the object pass
|
|
2
|
+
|
|
3
|
+
Derive the object model and surface map using the UX-pattern decision layer (`references/ux-patterns/`). Load **one pass file at a time**, in this order, consulting only the passes the brief makes material:
|
|
4
|
+
|
|
5
|
+
1. `object-model` — the domain objects and their relationships
|
|
6
|
+
2. `attributes-lifecycle` — attributes, lifecycle states, history requirements
|
|
7
|
+
3. `verbs` — actions per object × state × role
|
|
8
|
+
4. `viewer-context` — how rendering changes by viewer
|
|
9
|
+
5. `modes` — modal contexts the product runs in
|
|
10
|
+
6. `promotion-demotion` — surface prominence by frequency × criticality
|
|
11
|
+
7. `page-archetype` — each surface's archetype from the pinned roster: **browse, queue, grid, record-detail, dashboard, creation-flow, settings**. View-types (table, board, cards, calendar) are projections of an archetype, never archetypes.
|
|
12
|
+
8. `container-choice` — container by workflow (duration, interruption, comparison need), never by size
|
|
13
|
+
9. `creation-paths` — form, import, conversion, clone, recurrence
|
|
14
|
+
10. `table-mechanics` — where tables project a surface
|
|
15
|
+
11. `state-matrix` — loading, the three empties (first-use, no-results, cleared), degraded, stale — per surface
|
|
16
|
+
12. `standard-pages` / `ai-layer` / `dashboards` / `settings` — when the brief has them
|
|
17
|
+
|
|
18
|
+
Each pass file carries its rule as prose plus a machine-readable decision table; **follow the table's answer**. Disagreement is legitimate craft only when recorded — one line in `decisions.md` naming the pass, the table's answer, yours, and why. An unrecorded divergence is the violation.
|
|
19
|
+
|
|
20
|
+
When a pass fires a clarification code (an input the table needs that the brief doesn't give), resolve it: infer-and-mark when the answer doesn't change the design, ask when it does.
|
|
21
|
+
|
|
22
|
+
## Output: the structure document
|
|
23
|
+
|
|
24
|
+
A single document — entities, surfaces, archetype per surface, projections, container choices, creation paths, and the state matrix per surface. It is an **input** to composition, never a jail: no file it implies is ever marked do-not-edit, and step 4 may revise it with a one-line record.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Step 5 — The ship gate
|
|
2
|
+
|
|
3
|
+
The project ships with its four project-local artifacts — `design.md` (the resolved fork, with provenance line, brief bindings, recorded deviations), `product.md`, `taste.md`, and `decisions.md`. The gate has two tiers, both objective: this is the only runtime check the skill performs, permitted precisely because it is automated and needs no judgment. Nothing here grades taste — anything that needs grading was the build-time harness's burden, not the run's.
|
|
4
|
+
|
|
5
|
+
## Tier 1 — fails closed
|
|
6
|
+
|
|
7
|
+
Every check a binary predicate. Run the validator (`node scripts/validate-design-md.mjs <project design.md> --mode ship`) plus the build itself; all of these must hold:
|
|
8
|
+
|
|
9
|
+
- **No placeholder text or scaffold stubs** anywhere (lorem, TODO, "Coming soon", empty `href="#"` walls).
|
|
10
|
+
- **Data plausibility** against the corpus's declared invariants: aggregates reconcile with their visible rows; legal ranges hold; no degenerate repetition in visible rows (surname clusters, identical amounts).
|
|
11
|
+
- **Accessibility floor, mechanical**: contrast computed on the emitted token pairs in *both* themes; focus visible on every interactive element; `prefers-reduced-motion` respected.
|
|
12
|
+
- **Every declared surface reachable** — each surface in the structure doc has a live route/nav path.
|
|
13
|
+
- **`design.md` present at the repo base** and the token artifact recompiles from it to a byte-match (the validator's drift check).
|
|
14
|
+
- **The pipe checks**:
|
|
15
|
+
- the token artifact carries 100% coverage and components consume tokens — no raw color/size literals in component code;
|
|
16
|
+
- fonts bound to installed packages under registered family names (a family that never resolves is a fail);
|
|
17
|
+
- every authored token group reaches a named consumer — an emitted ramp nobody consumes is a fail;
|
|
18
|
+
- the emitted CSS actually compiles;
|
|
19
|
+
- charts and status surfaces consume the package's tokens (a dark dashboard with hardcoded light charts fails here).
|
|
20
|
+
|
|
21
|
+
A Tier-1 failure blocks the ship; fix and re-run. Binary phrasing is the contract — anything that would need "use sparingly" grading does not belong in this tier.
|
|
22
|
+
|
|
23
|
+
## Tier 2 — flags, never gates
|
|
24
|
+
|
|
25
|
+
Sweep `data/tells.csv` (the operator tell list) plus the motion tells (`transition: all`; `ease-in` on an entrance; animation attached to a keyboard-triggered action). Flags cannot fail the build and trigger no in-run judging: each is **fixed or dismissed with one recorded line** in `decisions.md`, and every flag appears in the ship report for the human's eyes — numbers point eyes; they do not replace them. The validator may run this sweep warn-only after compose-step edits; nothing new ever fails the build mid-composition.
|
|
26
|
+
|
|
27
|
+
## The ship report
|
|
28
|
+
|
|
29
|
+
Close the run with a compact report: surfaces shipped, the recorded choices (from the run's `decisions.md` section), Tier-1 results, every Tier-2 flag with its disposition, and the validator's warn list. No scores, no self-grades.
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ux-patterns-index
|
|
3
|
+
class: b2
|
|
4
|
+
sourced: 2026-07-12
|
|
5
|
+
source: "b2b-ux-patterns playbook (16 chapters) — distilled"
|
|
6
|
+
license: open
|
|
7
|
+
---
|
|
8
|
+
# B2 — the B2B UX-pattern decision layer
|
|
9
|
+
|
|
10
|
+
What-to-use-when for every structural UI decision, distilled from the ratified 16-chapter B2B UX playbook. **One decision file per pass**, each carrying its rule twice in one body: prose for the model, then an embedded machine-readable `json decision-table` that is the executable core — the contract runner ([`../../../../evals/design/run-decision-contracts.mjs`](../../../../evals/design/run-decision-contracts.mjs)) parses and evaluates these tables directly, so the tested rule and the followed rule are the same bytes.
|
|
11
|
+
|
|
12
|
+
The pinned **seven-archetype roster** every pass conforms to: `browse`, `queue`, `grid`, `record-detail`, `dashboard`, `creation-flow`, `settings`. View-types (table, board, cards, calendar, timeline, map) are **projections** of an archetype, never archetypes themselves.
|
|
13
|
+
|
|
14
|
+
## The 15 passes
|
|
15
|
+
|
|
16
|
+
Run each at the step of the method that needs it — the order below is the method's order.
|
|
17
|
+
|
|
18
|
+
| # | Pass | Source | Owns |
|
|
19
|
+
| --- | --- | --- | --- |
|
|
20
|
+
| 1 | [object-model](object-model.md) | ch.1 | `requiredMechanics`, `clarifications` |
|
|
21
|
+
| 2 | [attributes-lifecycle](attributes-lifecycle.md) | ch.2 | `requiredMechanics`, `requiredStates`, `clarifications` |
|
|
22
|
+
| 3 | [verbs](verbs.md) | ch.3 | `requiredMechanics`, `requiredStates`, `containers`, `clarifications` |
|
|
23
|
+
| 4 | [viewer-context](viewer-context.md) | ch.4 | `requiredMechanics`, `clarifications` |
|
|
24
|
+
| 5 | [modes](modes.md) | ch.5 | `archetypes`, `requiredMechanics` |
|
|
25
|
+
| 6 | [promotion-demotion](promotion-demotion.md) | ch.6 | `requiredMechanics`, `clarifications` |
|
|
26
|
+
| 7 | [page-archetype](page-archetype.md) | ch.7 | `archetypes`, `requiredMechanics`, `requiredStates`, `clarifications` |
|
|
27
|
+
| 8 | [container-choice](container-choice.md) | ch.8 | `containers`, `requiredMechanics`, `clarifications` |
|
|
28
|
+
| 9 | [creation-paths](creation-paths.md) | ch.9 | `creationPaths`, `requiredMechanics`, `clarifications` |
|
|
29
|
+
| 10 | [table-mechanics](table-mechanics.md) | ch.10 | `requiredMechanics`, `clarifications` |
|
|
30
|
+
| 11 | [state-matrix](state-matrix.md) | ch.11 | `requiredStates`, `requiredMechanics`, `clarifications` |
|
|
31
|
+
| 12 | [standard-pages](standard-pages.md) | ch.12 | `archetypes`, `requiredMechanics`, `clarifications` |
|
|
32
|
+
| 13 | [ai-layer](ai-layer.md) | ch.13 | `archetypes`, `requiredStates`, `requiredMechanics`, `clarifications` |
|
|
33
|
+
| 14 | [dashboards](dashboards.md) | ch.15 | `archetypes`, `requiredStates`, `requiredMechanics`, `clarifications` |
|
|
34
|
+
| 15 | [settings](settings.md) | ch.16 | `archetypes`, `requiredStates`, `requiredMechanics`, `clarifications` |
|
|
35
|
+
|
|
36
|
+
(Playbook chapter 14 — the agentic pattern catalog — is consideration material behind pass 13, not a pass of its own.)
|
|
37
|
+
|
|
38
|
+
## The decision-table contract
|
|
39
|
+
|
|
40
|
+
Every pass file ends with one fenced `json decision-table` block: `{"pass": "<id>", "rows": [{"when": {...}, "then": {...}, "reason": "<kebab-code>"}]}`.
|
|
41
|
+
|
|
42
|
+
**Matching semantics (canonical).** A row matches when **every** key in its `when` matches the input: a literal value matches by equality, an array value matches by membership (input ∈ array), and `"__absent__"` matches when the key is missing or null. The engine unions the `then` of every matched row.
|
|
43
|
+
|
|
44
|
+
**`then` fields.** `archetypes` / `containers` / `creationPaths` / `requiredStates` / `requiredMechanics` each take `{"mustInclude": [...], "mustNotInclude": [...]}` (`containers` may use `"acceptable"` / `"forbidden"`); `clarifications` takes a flat list of missing-input codes.
|
|
45
|
+
|
|
46
|
+
## Shared input vocabulary
|
|
47
|
+
|
|
48
|
+
Every `when` key used across the 15 passes, with its legal values. **Any key may also be `"__absent__"`** (the input omits it) — that is how clarification rows fire. Boolean keys take `true` / `false`.
|
|
49
|
+
|
|
50
|
+
| Key | Legal values | Used by |
|
|
51
|
+
| --- | --- | --- |
|
|
52
|
+
| `relationshipCardinality` | one-to-one · one-to-few · one-to-many · many-to-many | object-model |
|
|
53
|
+
| `childHasOwnLifecycle` | boolean | object-model |
|
|
54
|
+
| `childMeaningfulAlone` | boolean | object-model |
|
|
55
|
+
| `editedAtomicallyWithParent` | boolean | object-model |
|
|
56
|
+
| `associationHasPayload` | boolean | object-model |
|
|
57
|
+
| `glanceContextNeeded` | boolean | object-model |
|
|
58
|
+
| `collaboration` | concurrent · single-writer | object-model, viewer-context, page-archetype |
|
|
59
|
+
| `historySignal` | none · trajectory · compliance · derived-high-frequency | attributes-lifecycle |
|
|
60
|
+
| `disputeLikely` | boolean | attributes-lifecycle |
|
|
61
|
+
| `fieldOrigin` | manual · computed · synced · imported · ai-generated | attributes-lifecycle |
|
|
62
|
+
| `objectHasLifecycle` | boolean | attributes-lifecycle |
|
|
63
|
+
| `transitionRequirements` | boolean | attributes-lifecycle |
|
|
64
|
+
| `timeProperty` | sla · due-escalation · recurrence · snooze · none | attributes-lifecycle |
|
|
65
|
+
| `endOfLife` | reference-after-completion · user-data-deletion · compliance-erasure | attributes-lifecycle |
|
|
66
|
+
| `multipleEntryPoints` | boolean | attributes-lifecycle |
|
|
67
|
+
| `verbKind` | transition · edit · association · collaboration · communication · conversion · break-glass · approval-gated | verbs |
|
|
68
|
+
| `reversible` | boolean | verbs, ai-layer |
|
|
69
|
+
| `outwardFacing` | boolean | verbs, ai-layer |
|
|
70
|
+
| `bulk` | boolean | verbs |
|
|
71
|
+
| `thresholdVariant` | boolean | verbs |
|
|
72
|
+
| `denialKind` | role · plan | viewer-context |
|
|
73
|
+
| `entitlementKind` | boolean · metered | viewer-context |
|
|
74
|
+
| `fieldLevelSecurity` | boolean | viewer-context |
|
|
75
|
+
| `requiredFieldHidden` | boolean | viewer-context |
|
|
76
|
+
| `existenceLeakRisk` | boolean | viewer-context |
|
|
77
|
+
| `viewerKind` | human · agent | viewer-context |
|
|
78
|
+
| `concurrentViewers` | boolean | viewer-context |
|
|
79
|
+
| `environmentSeparation` | boolean | viewer-context |
|
|
80
|
+
| `mode` | monitoring · triage · procedural · exception · approval · investigation · exploration · authoring · reconciliation · comparison · batch-mutation · configuration · collaboration · reporting · learning · supervision | modes |
|
|
81
|
+
| `sameDataMultipleModes` | boolean | modes |
|
|
82
|
+
| `frequency` | high · medium · low | promotion-demotion |
|
|
83
|
+
| `isParent` | boolean | promotion-demotion |
|
|
84
|
+
| `demotionContractMet` | boolean | promotion-demotion |
|
|
85
|
+
| `perRoleVariance` | boolean | promotion-demotion |
|
|
86
|
+
| `primaryJob` | lookup · triage · process · edit-bulk · monitor · narrate-period · route-work · author · configure · approve · investigate · explore · reconcile | page-archetype |
|
|
87
|
+
| `ordering` | priority · sla · age · user-controlled · none | page-archetype |
|
|
88
|
+
| `ownership` | claimable · assigned · individual · shared | page-archetype |
|
|
89
|
+
| `viewTypeRequested` | table · board · cards · calendar · timeline · map | page-archetype |
|
|
90
|
+
| `hasStatusField` | boolean | page-archetype, table-mechanics |
|
|
91
|
+
| `hasDateField` | boolean | page-archetype |
|
|
92
|
+
| `unitOfWork` | record · machine-proposal · thread | page-archetype |
|
|
93
|
+
| `structuralChangeAllowed` | boolean | page-archetype |
|
|
94
|
+
| `existingArchetype` | browse · queue · grid · record-detail · dashboard · creation-flow · settings | page-archetype |
|
|
95
|
+
| `opensRecord` | boolean | container-choice |
|
|
96
|
+
| `contextRetentionNeeded` | boolean | container-choice |
|
|
97
|
+
| `interactionDepth` | quick-read · deep-edit | container-choice |
|
|
98
|
+
| `sharing` | stable-url · sent-outward · none | container-choice |
|
|
99
|
+
| `traversal` | boolean | container-choice |
|
|
100
|
+
| `interruption` | interrupt · continue | container-choice |
|
|
101
|
+
| `contentSize` | small · large | container-choice |
|
|
102
|
+
| `recordReference` | boolean | container-choice |
|
|
103
|
+
| `opensInOverlay` | boolean | container-choice |
|
|
104
|
+
| `isDetailSurface` | boolean | container-choice |
|
|
105
|
+
| `detailBody` | large-independent · modest-cross-skim | container-choice |
|
|
106
|
+
| `longSessionStream` | boolean | container-choice |
|
|
107
|
+
| `customerFacingComposer` | boolean | container-choice |
|
|
108
|
+
| `manualCreate` | boolean | creation-paths |
|
|
109
|
+
| `bulkOnboarding` | boolean | creation-paths |
|
|
110
|
+
| `bornFromTransformation` | boolean | creation-paths |
|
|
111
|
+
| `bornFromTemplate` | boolean | creation-paths |
|
|
112
|
+
| `recurs` | boolean | creation-paths |
|
|
113
|
+
| `externalSourceOfTruth` | boolean | creation-paths |
|
|
114
|
+
| `creationFrequency` | high · low | creation-paths |
|
|
115
|
+
| `fieldCount` | few · many | creation-paths |
|
|
116
|
+
| `interdependentFields` | boolean | creation-paths |
|
|
117
|
+
| `bornComplete` | boolean | creation-paths |
|
|
118
|
+
| `sequentialDependencies` | boolean | creation-paths |
|
|
119
|
+
| `isGridPrimaryWrite` | boolean | creation-paths |
|
|
120
|
+
| `requiredRelationMayBeMissing` | boolean | creation-paths |
|
|
121
|
+
| `duplicateProneCreate` | boolean | creation-paths |
|
|
122
|
+
| `serverTruthValidation` | boolean | creation-paths |
|
|
123
|
+
| `editRegime` | inline · explicit-mode · canvas | creation-paths |
|
|
124
|
+
| `concurrentEditors` | boolean | creation-paths |
|
|
125
|
+
| `isConfigObject` | boolean | creation-paths |
|
|
126
|
+
| `revisitedWithIntent` | boolean | table-mechanics |
|
|
127
|
+
| `sharedViewScope` | personal · team | table-mechanics |
|
|
128
|
+
| `wideObject` | boolean | table-mechanics |
|
|
129
|
+
| `heavyDailyUse` | boolean | table-mechanics |
|
|
130
|
+
| `groupBySegment` | boolean | table-mechanics |
|
|
131
|
+
| `crossCuttingHealthNumbers` | boolean | table-mechanics |
|
|
132
|
+
| `gridEditable` | boolean | table-mechanics |
|
|
133
|
+
| `bulkVerbs` | boolean | table-mechanics |
|
|
134
|
+
| `rowActions` | boolean | table-mechanics |
|
|
135
|
+
| `viewerRelationships` | boolean | table-mechanics |
|
|
136
|
+
| `largeDataset` | boolean | table-mechanics |
|
|
137
|
+
| `listLength` | paginated · infinite · virtualized | table-mechanics |
|
|
138
|
+
| `financialRecordKeeping` | boolean | table-mechanics |
|
|
139
|
+
| `sharedMutableList` | boolean | table-mechanics |
|
|
140
|
+
| `exportNeeded` | boolean | table-mechanics |
|
|
141
|
+
| `isListSurface` | boolean | state-matrix |
|
|
142
|
+
| `dataFetch` | boolean | state-matrix |
|
|
143
|
+
| `fetchLatency` | boolean | state-matrix |
|
|
144
|
+
| `compositePage` | boolean | state-matrix |
|
|
145
|
+
| `consumesCachedData` | boolean | state-matrix |
|
|
146
|
+
| `streamingView` | boolean | state-matrix |
|
|
147
|
+
| `optimisticMutation` | boolean | state-matrix |
|
|
148
|
+
| `queueSuccessIsEmpty` | boolean | state-matrix |
|
|
149
|
+
| `firstRunSurface` | boolean | state-matrix |
|
|
150
|
+
| `onboardingTechnique` | boolean | state-matrix |
|
|
151
|
+
| `onboardingScope` | application-level · empty-state | state-matrix |
|
|
152
|
+
| `standardPage` | settings · profile · notifications · audit-object · audit-global · user-management · roles-permissions · seats-licenses · billing · integrations | standard-pages |
|
|
153
|
+
| `notificationDelivery` | boolean | standard-pages |
|
|
154
|
+
| `ssoScimProvisioning` | boolean | standard-pages |
|
|
155
|
+
| `complianceBuyer` | boolean | standard-pages |
|
|
156
|
+
| `recordLevelAccess` | boolean | standard-pages |
|
|
157
|
+
| `externalSystemMapping` | boolean | standard-pages |
|
|
158
|
+
| `intelligenceTime` | build-time · run-time | ai-layer |
|
|
159
|
+
| `aiWrites` | boolean | ai-layer |
|
|
160
|
+
| `blastRadius` | single-record · many-records · external-fanout | ai-layer |
|
|
161
|
+
| `initiative` | invoked · suggested · initiated | ai-layer |
|
|
162
|
+
| `latency` | live · just-in-time · per-row · scheduled · ambient | ai-layer |
|
|
163
|
+
| `confidenceGateable` | boolean | ai-layer |
|
|
164
|
+
| `correctsHumanOrThirdParty` | boolean | ai-layer |
|
|
165
|
+
| `autonomousAgent` | boolean | ai-layer |
|
|
166
|
+
| `agentPrincipal` | boolean | ai-layer |
|
|
167
|
+
| `durableWait` | boolean | ai-layer |
|
|
168
|
+
| `copilotOutput` | inspectable-reversible · externally-committing | ai-layer |
|
|
169
|
+
| `accumulatedMemory` | boolean | ai-layer |
|
|
170
|
+
| `inputBoundaryTransduction` | boolean | ai-layer |
|
|
171
|
+
| `dashboardJob` | monitoring · narrative · work-router | dashboards |
|
|
172
|
+
| `multiJobCanvas` | boolean | dashboards |
|
|
173
|
+
| `cachedDecisionData` | boolean | dashboards |
|
|
174
|
+
| `viewerScopedMetrics` | boolean | dashboards |
|
|
175
|
+
| `promotionRole` | manager · operator | dashboards |
|
|
176
|
+
| `pushDigest` | boolean | dashboards |
|
|
177
|
+
| `tile` | boolean | dashboards |
|
|
178
|
+
| `monitoringTile` | boolean | dashboards |
|
|
179
|
+
| `thresholdDeclared` | boolean | dashboards |
|
|
180
|
+
| `trendTileRequested` | boolean | dashboards |
|
|
181
|
+
| `sourceHistoryClass` | overwrite · sampled · logged | dashboards |
|
|
182
|
+
| `isSettingsPage` | boolean | settings |
|
|
183
|
+
| `scope` | personal · workspace · org | settings |
|
|
184
|
+
| `settingKind` | leaf-preference · config-object | settings |
|
|
185
|
+
| `riskClass` | preference · behavior-config · structural-destructive | settings |
|
|
186
|
+
| `subject` | identity-access · data-model · automation · notifications · integrations · branding · billing · compliance-audit · ai-agent-policy | settings |
|
|
187
|
+
| `multiScopeSetting` | boolean | settings |
|
|
188
|
+
| `nodeCount` | under-30 · over-30 | settings |
|
|
189
|
+
| `governedSurfaceLink` | boolean | settings |
|
|
190
|
+
| `buildTimeGeneration` | boolean | settings |
|
|
191
|
+
| `productSurfaceInTree` | boolean | settings |
|
|
192
|
+
|
|
193
|
+
## The load rule
|
|
194
|
+
|
|
195
|
+
**One pass file per step, never all at once.** The load contract ([09 §Load contracts](../../../../docs/features/design-skill/09-database-structures.md)) is explicit: B2 enters context as *the one pass file the current step needs*; loading all passes at once is forbidden. Consult this Readme to route to the right file, then load only that file at the step that needs it. Clarification codes are surfaced, never guessed around — a `then.clarifications` firing means an input the pass needs is missing, and the step pauses to obtain it rather than proceeding on a default.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ai-layer
|
|
3
|
+
class: b2
|
|
4
|
+
sourced: 2026-07-12
|
|
5
|
+
source: "b2b-ux-patterns ch.13"
|
|
6
|
+
license: open
|
|
7
|
+
---
|
|
8
|
+
# Pass: the AI layer
|
|
9
|
+
|
|
10
|
+
**Inputs:** per intelligent capability — `intelligenceTime` (build-time | run-time), `aiWrites`, `blastRadius` (single-record | many-records | external-fanout), `reversible`, `outwardFacing`, `initiative` (invoked | suggested | initiated), `latency` (live | just-in-time | per-row | scheduled | ambient), `confidenceGateable`, `correctsHumanOrThirdParty`, `autonomousAgent`, `agentPrincipal`, `durableWait`, `copilotOutput` (inspectable-reversible | externally-committing), `accumulatedMemory`, `inputBoundaryTransduction`.
|
|
11
|
+
**Owns:** `archetypes`, `requiredStates`, `requiredMechanics`, `clarifications`.
|
|
12
|
+
**Output artifact:** for every AI capability, its decision-rights stance (who holds the write), the guardrail envelope (prevention + recovery + glass box), and the write-path bindings that connect it to the lifecycle, verbs, and access passes. Every AI pattern is a transfer of a slice of cognition from human to system; this pass governs the transfer.
|
|
13
|
+
|
|
14
|
+
## The rule
|
|
15
|
+
|
|
16
|
+
**Divide first by when the intelligence runs.** *Run-time* intelligence operates within a built system (fills fields, routes rows, drafts text, resolves) and transfers the operator's cognition. *Build-time* intelligence constructs the system itself (NL → tables, views, automations) and transfers the builder's cognition — its guardrail shape is **preview-the-generated-artifact and edit-before-commit**, never per-row confidence, and its compilation target must be inspectable (a node graph, a field list), never an opaque box.
|
|
17
|
+
|
|
18
|
+
**The three-actor write model is the spine, and the stance is set by blast radius and reversibility — not by model confidence alone.** *System proposes, human disposes* — output lands in a *proposed* state and waits for accept/edit/reject; the default for external, irreversible, or fan-out writes (a customer email, a bulk send). *System acts, human audits after* — the write commits, with the audit trail, rollback, and exception queue as the control; correct for internal, reversible, single-record writes. *System acts silently* — auto-classification, continuous re-enrichment; governance lives in configuration, sampling, and dashboards. The clean formulation: *AI proposes the signal, deterministic rules dispose the record.* Two axes cross the spine: **initiative** (invoked → suggested → initiated) separates next-best-action from anticipation; the **latency ladder** (live → just-in-time → per-row → scheduled → ambient) dictates the affordance — live cue cards streamed mid-call can never be a modal; scheduled jobs surface as a review queue on completion.
|
|
19
|
+
|
|
20
|
+
**Non-deterministic in, deterministic out.** Free-form material (dictated text, an email thread, a PDF, a receipt) is matched to the declared object model and lands as typed fields — the input-boundary transducer, "parse, don't type," applied at every scope (field, record, row-stream, table, ambient stream). Output generation is grounded in declared assets and post-filtered by deterministic rulebooks. Every AI write carries **origin = ai-generated** with provenance, rides the standard *proposed* state and approval verbs, and is **Logged with dual attribution** (the agent, and the human who accepted or the policy that authorized).
|
|
21
|
+
|
|
22
|
+
**Guardrails are one orthogonal layer, factored once.** *Prevention*: confidence gating with a numeric threshold where the domain is mature (high-confidence posts through, sub-threshold queues for review); **statistical-significance gating** where the system corrects a human or third-party claim (never assert on a small sample — the reputation guardrail, and the home of the house-knowledge corrective); simulation/eval gating before an agent version deploys. *Recovery*: the undo/rollback backstop under every agent action; the **escalation floor** — no serious autonomous agent ships without a mandatory hand-to-human boundary, and the handoff carries what was already tried so the human resumes mid-stream. *Glass box*: citations, the source anchor stored beside every transduced value, and the **AI-action audit log as a surface distinct from record edit history** (actor = AI, what changed, and what data informed it).
|
|
23
|
+
|
|
24
|
+
**The agent is a governed actor and the checkpoint is how the flow waits.** An agent principal gets its own identity in the directory, scoped least-privilege permissions, a human sponsor, and a lifecycle — never a borrowed human credential; its effective access is the intersection of its grants and its delegating subject's (see viewer-context). The **durable checkpoint** (axiom 21) — pause, persist, notify, resume — is the portable guardrail node: decision rights choose *when* the human enters; the checkpoint is *how* the flow waits, with state persisting across days and the notification carrying the evidence pack. Design against this primitive, not against inline blocking prompts. Chat is the **home surface** when its output is inspectable and reversible (conversational BI — expose the compiled query as the escape to determinism) and the **escape hatch** when output is externally committing (the human ratifies). Accumulated memory (system-auto-written, cross-session) is audited after and demands its own management surface and memory-provenance show-which. When an AI capability writes but its blast radius is undeclared, the decision-rights stance cannot be set: clarify.
|
|
25
|
+
|
|
26
|
+
```json decision-table
|
|
27
|
+
{"pass": "ai-layer", "rows": [
|
|
28
|
+
{"when": {"intelligenceTime": "build-time"}, "then": {"requiredMechanics": {"mustInclude": ["preview-generated-artifact", "edit-before-commit", "inspectable-compilation-target"], "mustNotInclude": ["opaque-black-box", "per-row-confidence-on-build"]}}, "reason": "build-time-previews-the-artifact"},
|
|
29
|
+
{"when": {"aiWrites": true, "blastRadius": "single-record", "reversible": true, "outwardFacing": false}, "then": {"requiredMechanics": {"mustInclude": ["ai-acts-human-audits-after", "audit-trail", "rollback-backstop", "exception-queue"]}}, "reason": "internal-reversible-single-record-acts"},
|
|
30
|
+
{"when": {"outwardFacing": true}, "then": {"requiredMechanics": {"mustInclude": ["ai-proposes-human-disposes", "approval-verbs"], "mustNotInclude": ["ai-acts-silently"]}, "requiredStates": {"mustInclude": ["proposed"]}}, "reason": "external-facing-writes-propose"},
|
|
31
|
+
{"when": {"blastRadius": "external-fanout"}, "then": {"requiredMechanics": {"mustInclude": ["ai-proposes-human-disposes", "approval-verbs"], "mustNotInclude": ["ai-acts-silently"]}, "requiredStates": {"mustInclude": ["proposed"]}}, "reason": "fan-out-writes-propose"},
|
|
32
|
+
{"when": {"aiWrites": true, "reversible": false}, "then": {"requiredMechanics": {"mustInclude": ["ai-proposes-human-disposes"], "mustNotInclude": ["ai-acts-silently"]}, "requiredStates": {"mustInclude": ["proposed"]}}, "reason": "irreversible-writes-propose"},
|
|
33
|
+
{"when": {"initiative": "initiated"}, "then": {"requiredMechanics": {"mustInclude": ["anticipation-system-initiated", "statistical-significance-gate"]}}, "reason": "system-initiated-needs-the-significance-gate-most"},
|
|
34
|
+
{"when": {"initiative": "suggested"}, "then": {"requiredMechanics": {"mustInclude": ["next-best-action-same-recommendation-multi-surface"]}}, "reason": "suggested-is-next-best-action"},
|
|
35
|
+
{"when": {"latency": "live"}, "then": {"requiredMechanics": {"mustInclude": ["streamed-cue-cards"], "mustNotInclude": ["live-output-in-a-modal"]}}, "reason": "sub-second-cannot-be-a-modal"},
|
|
36
|
+
{"when": {"latency": "scheduled"}, "then": {"archetypes": {"mustInclude": ["queue"]}, "requiredMechanics": {"mustInclude": ["review-queue-on-completion", "evidence-pack"]}}, "reason": "scheduled-jobs-surface-a-review-queue"},
|
|
37
|
+
{"when": {"confidenceGateable": true}, "then": {"requiredMechanics": {"mustInclude": ["confidence-threshold-gate", "sub-threshold-review-queue"]}}, "reason": "mature-domain-gates-on-confidence"},
|
|
38
|
+
{"when": {"correctsHumanOrThirdParty": true}, "then": {"requiredMechanics": {"mustInclude": ["statistical-significance-gate", "house-knowledge-corrective"], "mustNotInclude": ["assert-on-small-sample"]}}, "reason": "reputation-guardrail-never-asserts-on-a-small-sample"},
|
|
39
|
+
{"when": {"inputBoundaryTransduction": true}, "then": {"requiredMechanics": {"mustInclude": ["parse-dont-type-transducer", "source-anchor-per-value", "typed-fields-out"]}}, "reason": "non-deterministic-in-deterministic-out"},
|
|
40
|
+
{"when": {"aiWrites": true}, "then": {"requiredMechanics": {"mustInclude": ["origin-ai-generated-provenance", "dual-attribution-logged", "ai-action-audit-log-distinct"]}}, "reason": "ai-writes-carry-provenance-and-dual-attribution"},
|
|
41
|
+
{"when": {"autonomousAgent": true}, "then": {"requiredMechanics": {"mustInclude": ["escalation-floor-hand-to-human", "handoff-carries-context", "supervisor-layer", "undo-rollback-backstop"], "mustNotInclude": ["no-escalation-boundary"]}}, "reason": "no-autonomous-agent-without-an-escalation-floor"},
|
|
42
|
+
{"when": {"agentPrincipal": true}, "then": {"requiredMechanics": {"mustInclude": ["agent-own-directory-identity", "scoped-least-privilege", "human-sponsor", "delegated-subject-intersection"], "mustNotInclude": ["borrowed-human-credential"]}}, "reason": "agent-is-a-governed-principal"},
|
|
43
|
+
{"when": {"durableWait": true}, "then": {"requiredMechanics": {"mustInclude": ["durable-checkpoint-pause-persist-notify-resume", "notification-carries-evidence-pack"], "mustNotInclude": ["inline-blocking-prompt"]}}, "reason": "design-against-the-checkpoint-primitive"},
|
|
44
|
+
{"when": {"copilotOutput": "inspectable-reversible"}, "then": {"requiredMechanics": {"mustInclude": ["chat-as-home-surface", "expose-compiled-query", "promote-answer-to-artifact"]}}, "reason": "inspectable-reversible-output-lives-in-chat"},
|
|
45
|
+
{"when": {"copilotOutput": "externally-committing"}, "then": {"requiredMechanics": {"mustInclude": ["chat-as-escape-hatch", "human-ratifies-before-commit", "propose-then-confirm"], "mustNotInclude": ["chat-commits-externally-unratified"]}}, "reason": "externally-committing-output-is-ratified"},
|
|
46
|
+
{"when": {"accumulatedMemory": true}, "then": {"requiredMechanics": {"mustInclude": ["memory-management-surface", "memory-provenance-show-which", "identity-scoped-memory"]}}, "reason": "auto-written-memory-is-audited-after"},
|
|
47
|
+
{"when": {"aiWrites": true, "blastRadius": "__absent__"}, "then": {"clarifications": ["ai-write-blast-radius-unspecified"]}, "reason": "decision-rights-stance-needs-blast-radius"}
|
|
48
|
+
]}
|
|
49
|
+
```
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: attributes-lifecycle
|
|
3
|
+
class: b2
|
|
4
|
+
sourced: 2026-07-12
|
|
5
|
+
source: "b2b-ux-patterns ch.2"
|
|
6
|
+
license: open
|
|
7
|
+
---
|
|
8
|
+
# Pass: attributes, lifecycle & history
|
|
9
|
+
|
|
10
|
+
**Inputs:** per field — `historySignal` (none | trajectory | compliance | derived-high-frequency), `fieldOrigin` (manual | computed | synced | imported | ai-generated), `disputeLikely`; per object — `objectHasLifecycle`, `transitionRequirements`, `timeProperty` (sla | due-escalation | recurrence | snooze | none), `endOfLife` (reference-after-completion | user-data-deletion | compliance-erasure), `multipleEntryPoints`.
|
|
11
|
+
**Owns:** `requiredMechanics`, `requiredStates`, `clarifications`.
|
|
12
|
+
**Output artifact:** per-field declarations (type, history class, origin) and per-object declarations (state machine, time properties, end-of-life tier) that every later pass derives from mechanically — chips, timelines, trends, boards, gated buttons, countdowns, trash, and merge are renders of these declarations, never inventions.
|
|
13
|
+
|
|
14
|
+
## The rule
|
|
15
|
+
|
|
16
|
+
**Every field declares one of three history classes.** *Overwrite* (the default — update in place, no history; paying history cost on every descriptive field is how products drown their own timelines). *Logged* (every change attributed: old value, new value, actor, timestamp) for fields where the trajectory is the meaning — stage, status, owner, amount — and anything with compliance weight or dispute risk; Logged fields are what make a detail page's history tab worth opening. *Sampled* (sparse snapshots or rollups) for high-frequency derived values — scores, metrics, queue depths; a Sampled field renders as a number with a trace (sparkline, as-of view), never as a change log. An empty timeline is a history-class declaration failure, not a UI failure.
|
|
17
|
+
|
|
18
|
+
**Origin decides editability and provenance.** Computed fields are never directly editable. Synced fields render their source and last-sync ("Enriched by Clearbit, 3 days ago") and need a conflict resolution when the sync wants to overwrite a human edit. Field types drive four renders at once — cell, input, filter, sort — declared once, derived everywhere; enums declare semantic color and icon here, never color alone.
|
|
19
|
+
|
|
20
|
+
**The state machine is data:** a status enum, legal transitions, terminal states. The UI derives gated verbs (Refund exists only on succeeded payments), status chips rendered identically everywhere, spatial board projection (a drag is a transition), and per-transition requirements (required fields, approvals, permissions) declared on the transition, not in form code. The status field itself is almost always Logged.
|
|
21
|
+
|
|
22
|
+
**Time properties mutate records with no user action** — SLA countdowns that re-sort queues, escalation on due-date breach, recurrence materializing instances, snooze as a time-scoped visibility state. Lists holding such objects are not stable; queues sort on the clock.
|
|
23
|
+
|
|
24
|
+
**Every object declares how it dies**, in order of preference: archive (restorable, filter-exposed) for completed referenceable work; soft-delete with a trash retention window — the data property that permits undo-toast instead of a confirm dialog; hard delete reserved for compliance erasure. Any object with multiple entry points will accumulate duplicates and needs a merge flow whose survivor keeps the Logged history — a merge that discards a Logged trail breaks the audit chain.
|
|
25
|
+
|
|
26
|
+
```json decision-table
|
|
27
|
+
{"pass": "attributes-lifecycle", "rows": [
|
|
28
|
+
{"when": {"historySignal": "none"}, "then": {"requiredMechanics": {"mustInclude": ["overwrite-in-place"], "mustNotInclude": ["activity-timeline-entries"]}}, "reason": "descriptive-fields-overwrite"},
|
|
29
|
+
{"when": {"historySignal": ["trajectory", "compliance"]}, "then": {"requiredMechanics": {"mustInclude": ["logged-field-history", "activity-timeline-entries", "changed-by-attribution"]}}, "reason": "trajectory-is-the-meaning"},
|
|
30
|
+
{"when": {"historySignal": "derived-high-frequency"}, "then": {"requiredMechanics": {"mustInclude": ["sampled-snapshots", "sparkline-trend"], "mustNotInclude": ["activity-timeline-entries"]}}, "reason": "high-frequency-sampled-not-logged"},
|
|
31
|
+
{"when": {"disputeLikely": true, "historySignal": "__absent__"}, "then": {"clarifications": ["history-class-unspecified"]}, "reason": "disputes-need-declared-history"},
|
|
32
|
+
{"when": {"fieldOrigin": "computed"}, "then": {"requiredMechanics": {"mustInclude": ["read-only-derived-render"], "mustNotInclude": ["editable-input"]}}, "reason": "computed-never-editable"},
|
|
33
|
+
{"when": {"fieldOrigin": "synced"}, "then": {"requiredMechanics": {"mustInclude": ["provenance-render", "sync-conflict-resolution"]}}, "reason": "synced-origin-carries-provenance"},
|
|
34
|
+
{"when": {"objectHasLifecycle": true}, "then": {"requiredMechanics": {"mustInclude": ["status-enum-semantic-colors", "transition-graph-legal-only", "state-gated-verbs"]}}, "reason": "state-machine-is-data"},
|
|
35
|
+
{"when": {"transitionRequirements": true}, "then": {"requiredMechanics": {"mustInclude": ["transition-required-fields"]}}, "reason": "requirements-on-transition-not-form"},
|
|
36
|
+
{"when": {"timeProperty": ["sla", "due-escalation"]}, "then": {"requiredMechanics": {"mustInclude": ["sla-countdown-render", "breach-state-resort"]}, "requiredStates": {"mustInclude": ["stale"]}}, "reason": "clock-mutates-the-record"},
|
|
37
|
+
{"when": {"timeProperty": "snooze"}, "then": {"requiredMechanics": {"mustInclude": ["snooze-until-resurface"]}}, "reason": "snooze-is-visibility-not-deletion"},
|
|
38
|
+
{"when": {"endOfLife": "reference-after-completion"}, "then": {"requiredMechanics": {"mustInclude": ["archive-restorable"], "mustNotInclude": ["hard-delete"]}}, "reason": "archive-completed-work"},
|
|
39
|
+
{"when": {"endOfLife": "user-data-deletion"}, "then": {"requiredMechanics": {"mustInclude": ["soft-delete-trash-retention"], "mustNotInclude": ["hard-delete"]}}, "reason": "soft-delete-enables-undo"},
|
|
40
|
+
{"when": {"endOfLife": "compliance-erasure"}, "then": {"requiredMechanics": {"mustInclude": ["hard-delete-typed-confirmation"]}}, "reason": "hard-delete-compliance-only"},
|
|
41
|
+
{"when": {"multipleEntryPoints": true}, "then": {"requiredMechanics": {"mustInclude": ["merge-duplicates-flow", "survivor-history-preserved"]}}, "reason": "multiple-entry-points-guarantee-duplicates"}
|
|
42
|
+
]}
|
|
43
|
+
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: container-choice
|
|
3
|
+
class: b2
|
|
4
|
+
sourced: 2026-07-12
|
|
5
|
+
source: "b2b-ux-patterns ch.8"
|
|
6
|
+
license: open
|
|
7
|
+
---
|
|
8
|
+
# Pass: detail surface & container choice
|
|
9
|
+
|
|
10
|
+
**Inputs:** per record-opening — `opensRecord`, `contextRetentionNeeded`, `interactionDepth` (quick-read | deep-edit), `sharing` (stable-url | sent-outward | none), `traversal`, `interruption` (interrupt | continue), `contentSize` (small | large), `recordReference`, `opensInOverlay`; per detail surface — `isDetailSurface`, `detailBody` (large-independent | modest-cross-skim), `longSessionStream`, `customerFacingComposer`.
|
|
11
|
+
**Owns:** `containers`, `requiredMechanics`, `clarifications`.
|
|
12
|
+
**Output artifact:** the record-detail anatomy (sticky header, body organization, related lists, timeline, composer, context rail) and, for every place a record opens, the container rung it opens at — chosen by workflow, never by information size.
|
|
13
|
+
|
|
14
|
+
## The rule
|
|
15
|
+
|
|
16
|
+
**A detail page is a workstation, not a read-only profile.** Every detail surface carries a *sticky record header* — identity, state chip, and the 1–3 highest-frequency legal verbs for the record's current state and this viewer (from the verbs pass), the rest in overflow — pinned so identity never scrolls away. Fields *edit in place* by default (optimistic save with saving/saved/failed feedback); an explicit whole-record edit mode is reserved for interdependent fields that must commit atomically. Related lists are *action surfaces* — inline create, inline edit, row verbs, and a "view all" escape — and they are how demoted objects honor the reachability half of the demotion contract. The activity timeline is *derived*, never designed: Logged fields contribute attributed change entries, Sampled fields contribute trends, comments and notes are ordinary child objects; you declare history classes and the feed renders. A customer-facing composer carries **audience safety** — an internal note and a customer-facing send are different verbs with distinct affordance and color, never a toggle buried in one composer; sending to the wrong audience is a severity-1 failure.
|
|
17
|
+
|
|
18
|
+
**Body organization forks two ways.** *Tabs* (lazy-loaded, per-section linkable) when sections are large, independently loaded, and rarely needed together — the record is "several pages sharing a header." *Single-scroll with a sticky anchor rail* when the job needs cross-section skimming in one pass and sections are modest. Objects worked in long sessions over a streaming main column (conversation, timeline) earn a persistent **360 / context rail** — the parent summary and key attributes stay put while the narrative moves; the rail is denormalization-for-display doing its job.
|
|
19
|
+
|
|
20
|
+
**The container ladder — `hovercard → inline-popover → center-modal → side-peek → full-page`.** Information size does not pick the rung; five workflow axes do, size only breaks ties. (1) **Context retention** — if the originating list must stay live behind the opened record (open, close, open the next, compare), it is a **side peek**, however small the record; a modal dims and blocks the hub, a peek keeps it alive. (2) **Read-vs-edit depth** — a quick read wants a peek; deep, multi-field, interdependent editing wants center focus or a full page, because accidental dismissal becomes expensive. (3) **Shareability** — a record that needs a stable, shareable URL can now live in a URL-addressable peek or split pane; a record **sent outward** (an invoice) still defaults to a **full page** despite tiny size. (4) **Traversal** — processing or comparing many records in a row needs next/prev through the *exact filtered, sorted set*, which means a peek or split pane, never a modal and never a full-page round-trip per record. (5) **Interruption** — a center modal *blocks* (correct for confirmations and irreversible commits); a peek *continues* (work proceeds around it). Size is the tiebreaker only when the axes are indifferent: a leaf datum in a popover, a modest record in a peek.
|
|
21
|
+
|
|
22
|
+
**Container requirements.** Every peek and modal carries an **"open as full page"** escape hatch — users promote up the ladder themselves, so picking the lighter rung costs one click. Closing a peek or modal honors the **return contract**: the originating surface restores *exactly as left* — same scroll, filters, selection. The same object opens at the same rung from the same kind of origin, product-wide — container choice is per-object-per-origin, not per-screen improvisation. When a record must open but no workflow axis is declared, the rung cannot be chosen from size alone: clarify.
|
|
23
|
+
|
|
24
|
+
```json decision-table
|
|
25
|
+
{"pass": "container-choice", "rows": [
|
|
26
|
+
{"when": {"contextRetentionNeeded": true}, "then": {"containers": {"acceptable": ["side-peek", "split-pane"], "forbidden": ["center-modal"]}}, "reason": "hub-stays-live-is-a-peek"},
|
|
27
|
+
{"when": {"interactionDepth": "deep-edit"}, "then": {"containers": {"acceptable": ["full-page", "center-modal"], "forbidden": ["side-peek"]}}, "reason": "deep-edit-wants-committed-focus"},
|
|
28
|
+
{"when": {"interactionDepth": "quick-read", "contextRetentionNeeded": false, "traversal": false}, "then": {"containers": {"acceptable": ["side-peek", "inline-popover"]}}, "reason": "quick-read-is-a-peek"},
|
|
29
|
+
{"when": {"sharing": "sent-outward"}, "then": {"containers": {"acceptable": ["full-page"], "forbidden": ["center-modal", "side-peek"]}}, "reason": "sent-records-get-a-page"},
|
|
30
|
+
{"when": {"sharing": "stable-url"}, "then": {"requiredMechanics": {"mustInclude": ["stable-shareable-url"]}}, "reason": "url-addressable-rungs-are-fine"},
|
|
31
|
+
{"when": {"traversal": true}, "then": {"containers": {"acceptable": ["side-peek", "split-pane"], "forbidden": ["center-modal", "full-page"]}, "requiredMechanics": {"mustInclude": ["next-prev-through-filtered-set"]}}, "reason": "traverse-the-filtered-set-needs-a-peek"},
|
|
32
|
+
{"when": {"interruption": "interrupt"}, "then": {"containers": {"acceptable": ["center-modal"]}}, "reason": "blocking-is-the-point"},
|
|
33
|
+
{"when": {"interruption": "continue"}, "then": {"containers": {"forbidden": ["center-modal"]}}, "reason": "work-continues-around-a-peek"},
|
|
34
|
+
{"when": {"recordReference": true}, "then": {"containers": {"acceptable": ["hovercard"]}, "requiredMechanics": {"mustInclude": ["hovercard-read-only-no-actions"]}}, "reason": "fk-resolution-is-a-hovercard"},
|
|
35
|
+
{"when": {"contentSize": "small", "interactionDepth": "quick-read"}, "then": {"containers": {"acceptable": ["inline-popover", "hovercard", "side-peek"]}}, "reason": "smaller-content-sits-lower"},
|
|
36
|
+
{"when": {"opensInOverlay": true}, "then": {"requiredMechanics": {"mustInclude": ["escape-hatch-open-as-full-page", "return-contract-restore-state", "consistent-rungs-per-object"]}}, "reason": "peek-and-modal-carry-escape-and-return"},
|
|
37
|
+
{"when": {"isDetailSurface": true}, "then": {"requiredMechanics": {"mustInclude": ["sticky-record-header", "inline-edit-in-place-default", "related-lists-action-surface", "activity-timeline-derived"]}}, "reason": "detail-is-a-workstation"},
|
|
38
|
+
{"when": {"detailBody": "large-independent"}, "then": {"requiredMechanics": {"mustInclude": ["tabs-lazy-panels"], "mustNotInclude": ["single-scroll-anchor-rail"]}}, "reason": "independent-sections-tab"},
|
|
39
|
+
{"when": {"detailBody": "modest-cross-skim"}, "then": {"requiredMechanics": {"mustInclude": ["single-scroll-anchor-rail"], "mustNotInclude": ["tabs-lazy-panels"]}}, "reason": "cross-skim-single-scroll"},
|
|
40
|
+
{"when": {"longSessionStream": true}, "then": {"requiredMechanics": {"mustInclude": ["context-rail-360", "denormalized-parent-summary"]}}, "reason": "durable-context-beside-a-moving-stream"},
|
|
41
|
+
{"when": {"customerFacingComposer": true}, "then": {"requiredMechanics": {"mustInclude": ["activity-composer-audience-safety"], "mustNotInclude": ["audience-toggle-single-composer"]}}, "reason": "internal-note-and-send-are-different-verbs"},
|
|
42
|
+
{"when": {"opensRecord": true, "interactionDepth": "__absent__", "contextRetentionNeeded": "__absent__", "sharing": "__absent__", "traversal": "__absent__", "interruption": "__absent__"}, "then": {"clarifications": ["container-workflow-unspecified"]}, "reason": "container-picked-by-workflow-not-size"}
|
|
43
|
+
]}
|
|
44
|
+
```
|