design-family-coherence
The portfolio-level lens. Treats each ColourFamily as a system whose members should READ as related without being identical.
Triggers
design-approvecalls automatically after a new brand is added to a family.- User says "audit the safety family", "are DR and NRPG visually coherent?", "check family drift".
- Standing monthly task (per the orchestrator).
Inputs
family—restoration | safety | industrial | consumer | trainingstrict(default false) — strict mode requires unanimous shared signature; lax mode allows justified divergence
Method
List members: read every brand
.tswhosecolour.familymatches the input. (Map currently maintained atPi-Dev-Ops/preview-canvas/app/family/[familyName]/page.tsx:FAMILY_OF.)Load each brand's three specs:
loadDesign,tryLoadMotion,tryLoadScene.Run coherence checks:
Check What it tests Pass criterion Signature motion All .motion.mdsignature.nameagreestrict: all equal ·lax: ≥2/3 majorityDisplay typeface All .design.mdtypography.display-*.fontFamilyshare familyAll equal Spacing rhythm All .design.mdspacing.mdvalues share base ratio (e.g. all 16, all 4 / 8 / 16 / 32 / 64 doubling)All match base Saturation curve All colors.primaryOKLch chroma within ±0.02Within band Easing inheritance All motion.easingsshare at least theexpo-out(or family default) curveShared default curve present Component recipe parity All brands define the same baseline components (cta-primary, card) All present Motion budget All motion.durations.basewithin ±20%Within band Reduced-motion policy All motion.performance.prefersReducedMotionagreeAll equal Emit a report:
.research/design/coherence/{family}-{YYYY-MM-DD}.mdEach check gets a one-liner with ✓ / ⚠ / ✗ and citation:
# safety family coherence — 2026-05-07 Members: dr, nrpg ✓ signature motion: both `rise` ✓ display typeface: both Inter ✗ spacing rhythm: dr uses 16/24/48 (3-step); nrpg uses 16/24/32/48 (4-step) — drift ⚠ saturation curve: dr.primary chroma 0.18; nrpg.primary chroma 0.12 — borderline ✓ easing inheritance: both define expo-out ✓ component recipe parity: both define cta-primary + card ✓ motion budget: dr base 22f, nrpg base 22f ✓ reduced-motion policy: both `respect` Verdict: PASS WITH NOTES. Resolve spacing drift before next brand joins.If verdict is BLOCK (any ✗ check), open a Linear ticket
pi:design-coherence-{family}-{date}with the report attached and assign to the founder.Surface in the canvas: write a JSON sidecar
coherence-{family}.jsonthat the/family/[familyName]route can render inline.
Output
Markdown report + optional Linear ticket. The canvas /family/[familyName] route picks up the JSON sidecar and shows ✓/⚠/✗ inline.
Boundaries
- Never auto-fix drift. This skill audits only. Fixing requires a fresh
design-iteratefor the offending brand. - Never block on
consumerortrainingfamily today — they have <2 members so coherence is moot. - Never enforce strict mode without user opt-in. Lax is the default; strict only on request.
Reused
Pi-Dev-Ops/remotion-studio/src/brands/loadDesign.ts/loadMotion.ts/loadScene.tsSynthex/packages/brand-config/src/types.ts—ColourFamilyenum +BrandConfig.colour.familyPi-Dev-Ops/preview-canvas/app/family/[familyName]/page.tsx— visual surface
Hands off to
The user (with the report) and Linear (with the ticket if BLOCK).