name: perf-chris-dry-masterclass
description: >-
Trage loads en KPI’s (bv. 2,5s) aanpakken via Chris-protocol, DRY en
masterclass-niveau: SSOT eerst (server één waarheid → client geen
tweede fetch), daarna pas client dedupe/abort als veiligheidsnet;
oorzaak-taxonomie, meetdefinitie-SSOT, geen timer-tuning als hoofdoplossing.
Gebruik bij performance, duplicate bootstrap, home/agency-laden,
nav/config-fetches, Voiceglot-scan’s, pool/TTFB/LCP, hub + glossarium (371, doc 33), flight-budget (342),
of wanneer de owner “waarom duurt het” / Chris+DRY vraagt. Persona-eigenaar
meeten/baseline/close-the-loop: .cursor/agents/voices-goldie.md (Goldie). World-upgrade flow
(één world_id end-to-end: canon → pad → meten → gates) staat hieronder.
Alle Worlds: .cursor/rules/349-WORLDS-GOLDEN-PATH.mdc; Agency-detail:
.cursor/rules/348-AGENCY-GOLDEN-PATH.mdc.
disable-model-invocation: true
Performance: Chris · DRY · masterclass
Wanneer dit lezen
- Verplicht wanneer de diff golden-path-raakvlakken raakt — zie
.cursor/rules/349-WORLDS-GOLDEN-PATH.mdc§6 (layout, nav/locale, RSC-seeds, mount-fetches, world-grenzen,342-payload); dan gelden checklist 349 §2,028, en onderstaande SSOT-volgorde. - Owner of taak vraagt om sneller laden, timeouts, 2,5s-KPI, dubbele werk, of expliciet Chris + DRY + masterclass bij performance.
- Na full-check / Playwright-timeouts: eerst oorzaken, niet alleen timers verhogen.
- Wijzigingen aan nav, layout → client nav, home-bootstrap, ConfigBridge, RSC-flight / 342.
- Owner wil één World in één doorlopende flow naar golden-path-niveau brengen (niet alleen één component).
- Goldie full autopilot:
npm run goldie:autopilot=gate:fast+ build + metrics op alle critical inventory-routes; bij regressie zelf pad traceren (scan/lezen), doc 40 § G, hertest — geen takenlijst voor de owner (014). Sneller:golden-path:close-the-loop(18 routes). - Herhaalbare meet-fix-hertest zonder
gate:fastin elke ronde: slash/fast→.cursor/skills/fast/SKILL.md(voices-fast); complement aan deze skill en aan Goldie, geen vervanging.
World-upgrade flow (één World end-to-end)
Gebruik deze vaste volgorde wanneer je een hele World wilt upgraden (golden path + performance-discipline), zonder halverwege andere Worlds mee te slepen.
0) Scope vastzetten
- Eén
world_id+ naam — uit.cursor/rules/004-WORLD-MATRIX.mdc(geen mix van Studio-tabellen met Agency-flows enz.). - Publieke routes / journey die bij die World horen — uit code,
slug_registry, endocs/01-FOUNDATION/WORLDS-AND-MARKETS-CANON.mdwaar relevant. - Lokale host voor die World —
.cursor/rules/328-LOCAL-DEV-WORLD-HOSTS-MASTERCLASS.mdcenapps/web/src/lib/system/localhost-world-dev-aliases.ts(geen willekeurige*.localhost).
1) Canon lezen (vóór je typt)
.cursor/rules/349-WORLDS-GOLDEN-PATH.mdc— universele checklist §2 + SSOT-pointer voor jouw World in §3..cursor/rules/028-GOLDEN-PATH-ENGINEERING.mdc— hoofdpad eerst, fallbacks niet als norm.- World 1 (Agency) — extra:
.cursor/rules/348-AGENCY-GOLDEN-PATH.mdc. - Flight / eerste payload waar van toepassing —
.cursor/rules/342-SSR-BOOTSTRAP-RSC-FLIGHT-BUDGET.mdc+docs/02-ARCHITECTURE/31-SSR-BOOTSTRAP-EN-RSC-FLIGHT-BUDGET-SSOT.md.
2) Diagnose (kort, gericht)
- Meetdefinitie afstemmen (zie § KPI-SSOT hieronder) — één primaire lat voor deze World-upgrade.
- Netwerk/trace op de kernroutes van die World: zelfde URL + locale dubbel? mount-burst na RSC?
- Taxonomie § “Volledige oorzaak-taxonomie” — alleen de regels die voor deze routes relevant zijn (geen 11-punten-fishing-expeditie).
3) Bouwen (masterclass-volgorde = § “SSOT eerst”)
- Server / RSC: seeds en props die de client anders opnieuw zou halen — layout of page blijft de bron.
- Locale: één resolution-string end-to-end (
304-LOCALE-BOUNDARY.mdcwaar van toepassing). - Contract: waar mogelijk één bundel i.p.v. micro-storm van dezelfde data.
- Client dedupe / abort alleen als net na bovenstaande — niet als eerste “oplossing”.
Templates / CMS / [...slug]: bij die scope ook .cursor/agents/voices-goldie.md § Goldie-flow — templates, CMS en smart router (modulair smart router, ATF dichter bij server, routes per patroon meten).
4) Meten (binnen dezelfde flow)
- DevTools Network (of vergelijkbaar) op de gekozen host — vóór/na op dezelfde route en viewport.
- Optioneel: Playwright alleen op de routes van deze World (
tests/e2e/console-audit.spec.tsmet-g/ env zoals.cursor/rules/325-FULL-CHECK-BROWSER-ROUTE-AUDIT.mdc);PLAYWRIGHT_BASE_URLop de juiste world-host uit stap 0. - Geen nieuwe KPI’s halfweg invoeren — anders is “beter” niet vergelijkbaar.
- Veld-RUM (Voicejar Web Vitals): hub doc 33 §3b–§3c — dim
web_vitals_latest; operatorsnpm run report:voicejar-web-vitals:field. Met repo-secretDATABASE_URLdraaitgate:fastookverify:voicejar-web-vitals-field:when-db(JSON-aggregaat; strikte exit alleen metVOICEJAR_WEB_VITALS_REPORT_STRICT=1).
5) Gates (in één keer afronden)
Eén commando (meten + gates + mini-hermeting + baseline-diff): root npm run golden-path:close-the-loop — scripts/golden-path-close-the-loop.sh: type-check → routes:inventory:ci (één Next-build) → npm run lint → verify:cms-instrument-renderer → verify:cms-page-editor-instrument → Playwright tests/e2e/golden-path-metrics.spec.ts (schrijft apps/web/reports-golden-path/last.json; GOLDEN_PATH_METRICS_ROUTES leeg = scripts/resolve-golden-path-metrics-routes.ts uit route-inventory.json, default 12 routes, env GOLDEN_PATH_METRICS_MAX_ROUTES / GOLDEN_PATH_METRICS_SCOPE; print met npm run golden-path:routes:print). Als baseline.json bestaat: compare-golden-path-metrics.ts. Eerste referentie: npm run golden-path:baseline. Strenger: GOLDEN_PATH_FULL_PREVERCEL=1. Volledige checklist: docs/02-ARCHITECTURE/40-GOLDIE-OPERATIONAL-CHECKLIST.md. Andere gates naar taak:
npm run type-check(inbegrepen in het commando hierboven).npm run check:pre-vercel/check:pre-vercel:ci—.cursor/skills/pre-vercel-check/SKILL.md(of viaGOLDEN_PATH_FULL_PREVERCEL=1in de close-the-loop-run).- Runtime: minstens gerichte console/route-check —
.cursor/rules/338-AGENT-DEV-CONSOLE-SELF-VERIFY.mdc; voor brede World-dekking lokaal:npm run superfix:local-world-consoles(.cursor/skills/superfixer/SKILL.md, 026). - Grotere regressie-sweep wanneer de owner dat wil:
npm run full-check:fastoffull-check:prod:voices:extended(325) — niet verplicht voor elke kleine diff, wél na brede layout/shell-wijzigingen.
6) Gericht verbeteren (lus — plan volledig)
Als meting of baseline-diff regressie toont: één hoofdoorzaak (taxonomie § “Volledige oorzaak-taxonomie”), SSOT-eerst-fix, hertest met dezelfde golden-path:*-routes tot groen of tot KPI uit doc 39 gehaald is. Vaste tekst: docs/02-ARCHITECTURE/40-GOLDIE-OPERATIONAL-CHECKLIST.md § G.
7) Afronding (bewijs voor de volgende agent)
In dezelfde taak/PR kort vastleggen: welke world_id, welke routes/paden, welke KPI of netwerkobservatie, welke gates gedraaid, en bij snelheidswerk oorzaak → fix → meting (§ G). Meerdere Worlds: herhaal deze flow per World — geen enkele mega-PR die vijf werelden door elkaar hert.
Chris-protocol (discipline, geen pleister)
- Eén waarheid per datapad: wat de server al resolveert (nav, locale, config), hoeft de client niet opnieuw te halen tenzij er een harde reden is (stale, mutatie, expliciete invalidatie).
- Radar / telemetrie: Mat + Voicejar + link-visitor —
docs/02-ARCHITECTURE/55-TELEMETRY-AND-NON-BLOCKING-SERVER-WORK-SSOT.md(after(), staff-gate); geen parallelle strategie-tekst in andere docs. - Zelfde sleutels: server en client gebruiken dezelfde resolution-locale / cache-key (bijv.
resolvePublicUiLocale-uitkomst end-to-end).nl≠nl-beals de servernl-begebruikt → twee paden, dubbel werk (niet-DRY). - Expliciete reads: database/SDK: geen bredere
selectdan nodig (bijv. nav: alleen wat de UI nodig heeft). Sluit aan bij integriteitsdenken (200-CODE-INTEGRITY.mdc) en flight-budget (342-SSR-BOOTSTRAP-RSC-FLIGHT-BUDGET.mdc). - ID-first waar van toepassing: interne logica op stabiele id’s; URL/slug is presentatie (
001-ATOMIC-TRINITY.mdc). - Geen “timeout omhoog” als strategie: dat maskeert symptomen en kan pool en parallelle druk verergeren. Timers alleen nadat het echte pad bewezen sneller is of een harde upper bound nodig is.
DRY (masterclass: minder ruis, minder dubbel)
| Foutpatroon | Masterclass-reactie |
|---|---|
| RSC/layout laadt nav/config; client mount fetcht hetzelfde | Props doorgeven of gedeelde bron; fetch overslaan als SSR-data voldoende is. |
| Twee componenten roepen dezelfde API zonder coördinatie | Eén laag (layout/provider) of bundel-endpoint. |
Verschillende lang-query voor hetzelfde config-pad |
Eén canonieke locale-string voor dat pad (zoals server). |
select * / volledige rij waar één JSONB-kolom volstaat |
Smalle projectie in Drizzle/SDK. |
Concrete patronen in repo (indicatief, niet exhaustief): ConfigBridge.getNavConfig, GlobalNavInstrument, AdemingNav, LayoutClientInstruments, layout.tsx, home-client orchestratie (home-page-client e.d.).
SSOT eerst — dedupe / abort zijn geen hoofdstrategie
Masterclass-volgorde (van sterk naar ondersteunend):
- SSOT op de server / RSC: wat de layout of page al resolveert (nav, filtercatalogus, home-config-subset, locale), één keer laten ontstaan en doorgeven naar de client (props, seed, bundel-endpoint). Dan hoeft de client diezelfde bron niet opnieuw te
fetchen → geen tweede waarheid, geen dubbele pool-hit voor identieke data. Dat is de echte DRY-win. - Één contract per scherm: waar meerdere micro-calls hetzelfde doen als één route (
GET /api/home/filter-catalog/i.p.v. zes×admin/config?type=…), bundelen — nog steeds SSOT-denken, niet “slimmer client-trommelen”. - Client dedupe (
fetch*Deduped, gedeelde in-flight per URL/type) en listener-abort (attachListenerAbortToSharedPromise): veiligheidsnet voor randgevallen (StrictMode dubbele mount, korte overlap tussen twee client-subtrees, gedeelde fetch terwijl één caller unmount of deadline krijgt). Niet de vervanging van stap 1–2: als alleen dedupe nodig is, meestal ontbreekt nog server-SSOT of props-doorzet.
Vuistregel voor agents: eerst vragen “kan dit zonder tweede GET?” (overslaan / RSC / bundel); pas daarna “moeten we coalesceren?” (dedupe + abort). Zie ook .cursor/rules/028-GOLDEN-PATH-ENGINEERING.mdc (“maak het golden path”).
KPI-SSOT: waar meet je “2,5s”?
Kies één primaire meting per traject; anders optimaliseer je tegenstrijdige doelen. Canonieke tabel (per route-type, serverlaag, dekking, CMS-parity): docs/02-ARCHITECTURE/39-PERFORMANCE-USABLE-UNDER-2-5S-KPI-SSOT.md.
| Metriek | Wat het meet | Geschikt voor |
|---|---|---|
| TTFB (document) | Server + eerste byte HTML | “Voelt de pagina direct aan?” / layout-kosten. |
| LCP | Grootste zichtbare content (vaak hero) | Marketing, Core Web Vitals, SEO. |
| Product (bv. grid zichtbaar) | Eerste moment dat de stemmen-grid (of skeleton → echte kaarten) bruikbaar is | Agency/home-product-KPI — vaak relevanter dan LCP als de hero niet het hoofddoel is. |
Afspraak vastleggen in taak: bijv. “2,5s = eerste frame met ≥ N actor-kaarten met echte labels” plus optioneel LCP als secundaire guardrail.
Volledige oorzaak-taxonomie (checklist)
Gebruik als systematische zoektocht; niet alles is elke keer van toepassing.
- Dubbel werk (client naast server) — zelfde data tweemaal; verschillende cache-keys (locale).
- DB en pool — koude pool, te veel parallel op één request, zware queries, ontbrekende index, RLS/trigger-kosten.
- API-routes — grote JSON, zware berekening in request, N+1.
- RSC / flight — te grote serialisatie, laat zichtbare streaming (
342+ doc31-SSR-BOOTSTRAP-EN-RSC-FLIGHT-BUDGET-SSOT.md). - Client-waterfall — keten A → B → C i.p.v. parallel of één slanke bundel.
- Voiceglot / vertalingen / content — grote scans; meer laden dan het scherm nodig heeft.
- Assets / LCP — zware hero,
sizes/priority, fonts. - JS / hydratatie — grote bundle, veel mount-work.
- Netwerk / omgeving — latency, dev ≠ prod.
- Externe diensten — retries, timeouts downstream.
- Foutpaden — stille retries → dubbele wachttijd.
Werkvolgorde voor de agent
- Meetdefinitie met owner afstemmen (primair + eventueel secundair).
- Netwerk/trace: dubbele requests naar dezelfde resource? Zelfde querystring/locale?
- Server: layout parallel shell,
getNavConfig, home SSR-kolommen (342). - DB: explain/size van responses waar twijfel.
- Pas code aan op de kleinste diff die het pad dedupliceert of versnelt — geen drive-by refactor (
002). - Bewijs: gerichte gate (
type-check, relevante Playwright/MCP-console per026/338), geen push zonder owner (804).
Canonieke documenten (naast deze skill)
docs/02-ARCHITECTURE/33-PERFORMANCE-PROGRESSIVE-LOADING-AND-BOOTSTRAP-CANON.mddocs/02-ARCHITECTURE/39-PERFORMANCE-USABLE-UNDER-2-5S-KPI-SSOT.md— “bruikbaar ≤ 2,5 s” per context + meet-/gate-pointersdocs/02-ARCHITECTURE/31-SSR-BOOTSTRAP-EN-RSC-FLIGHT-BUDGET-SSOT.md- Rule
342-SSR-BOOTSTRAP-RSC-FLIGHT-BUDGET.mdc
“Eén waarheid, één pad, één meetlat — masterclass.”