Zum Hauptinhalt springen

Which performance concerns v10r covers, with which pattern record, and what is still open. Audited 2026-10-10 against the ten pattern families of the 2026-10 performance pass. All evidence is from code reading or the lab (production builds, headless Chrome, Slow 4G + 4× CPU for mobile). No row is confirmed by field data yet: /admin/perf has the last word.

Status Meaning
Implemented the mechanism exists and is applied where v10r needs it
Incomplete the mechanism exists, but adoption, proof or a known case is missing
Missing a real cost for v10r with no mechanism yet
Unnecessary does not pay for itself here today; the reason is stated
Not audited outside what this pass inspected; no claim either way

The Record column names pattern-library/registry.json ids, and every Velocity record appears at least once. src/lib/server/patterns/links.gate.test.ts fails if either stops being true. Maturity (proven/implemented) lives in the registry, not here.

A. Critical rendering path

Concern Status Record Evidence / gap
LCP element discovered early Implemented critical-rendering-path home hero logo inlined in the server HTML; mobile lab LCP 4,276 → 1,624 ms
First viewport visible without JavaScript Implemented critical-rendering-path CSS-only hero entrance; fadeIn hides only below-the-fold cards
Fonts and text rendering Implemented velocity-asset-delivery metric-matched fallbacks for the sans and mono families cut swap shift 34–62%; preloading rejected (FCP +60–120 ms)
Render-blocking CSS Incomplete velocity-asset-delivery 255 Lucide icons in the root CSS (~13 KB gz); the theme script waits for every stylesheet
Rendering mode per route Incomplete — SSR everywhere; ssr = false justified on /3d and /showcases/desk, unexplained on /showcases/ui, whose prerendered primitives page bakes a signed-out shell
Anonymous HTML at the edge Missing — a per-visitor random style and analytics confirm token make every public page unique, so none can be CDN-cached or prerendered; product decision
Redirects and server work before first byte Implemented — no landing redirect; an anonymous request makes no network call before load
Streaming non-critical server data Incomplete critical-path-deferred-tail the signed-in root layout awaits announcements; a streamed promise would take it off the path

B. JavaScript and dependency isolation

Concern Status Record Evidence / gap
Shared baseline guarded Implemented heavy-dependency-quarantine baseline_js_kb 82.9 against an 85 KB ceiling
Route budget measures what a visitor downloads Implemented performance-budget-ratchet baseline + every layout + page; the old metric under-reported the median by 81 KB
Barrels tree-shake Implemented side-effect-free-components median route 296.7 → 241.9 KB gz from one declaration
Heavy libraries behind dynamic imports Implemented heavy-dependency-quarantine Threlte, MapLibre, Chart.js, xyflow, the chatbot and the AI SDK are lazy; Shiki is server-only
Closed shell surfaces Implemented heavy-dependency-quarantine, velocity-idle-work command palette and better-auth client load on intent; median 241.9 → 231.1 KB gz
Navigation data in every page's JavaScript Missing — the showcase catalog and admin nav (13.2 KB gz) ship to anonymous visitors
Chunk count Incomplete — home went from 102 to 134 requests; the lab is HTTP/1.1, so measure on Vercel before acting
Duplicate libraries Not audited —

C. Svelte rendering efficiency

Concern Status Record Evidence / gap
Effect and timer lifecycle Implemented — the 1 Hz session timer leaked per layout-group switch; now destroyed with its shell
Expensive re-renders while streaming Implemented — chat markdown renders at most once per frame instead of per chunk
Large lists Unnecessary virtualized-rendering no app list passes ~200 rows (admin pages paginate, the IO log caps at 200); the desk explorer is the first candidate
Fine-grained selection state Missing — one spreadsheet selection change re-runs ~2,600 deriveds (50×26 grid); measurable on low-end Android
$effect copying props Missing — several prop-to-local copies should be writable $derived; navigation progress animates width

D. Server and data loading

Concern Status Record Evidence / gap
Independent reads in parallel Incomplete no-waterfall-loading blog post 3 → 2 round trips; blog tag page still 4 serial waves, admin AI and two showcases serial
Session lookup Implemented — the cookie-cache refresh is forwarded, so signed-in requests stop reading the session from Postgres
Work only where it is read Implemented — grants load on /api/blog/* only
Round trips per operation Incomplete query-budget blog post read registered (budget 2); the session lookup and the desk layout (7 queries + 1 UPDATE) are not
Screen read models Incomplete velocity-screen-read-model analytics aggregates use them; the observability showcase scans 30 days of raw events per anonymous view
Compute next to data Implemented velocity-compute-locality Vercel fra1 next to Neon; Upstash region unknown
ssr = false routes Incomplete — /showcases/desk runs the whole hook chain twice (document, then __data.json)
Neo4j on critical paths, cold start Not audited — the single server function bundles three.js; measure its size before splitting

E. Caching and freshness

Concern Status Record Evidence / gap
Key identity and scope Implemented hierarchical-cache cacheKey refuses both scope mistakes
Explicit invalidation Incomplete hierarchical-cache no invalidate(); a stale local hit is served without checking Redis for a fresher value
Stale serving and stampede protection Implemented stale-while-revalidate, singleflight production use is name-check only
CDN tier Incomplete hierarchical-cache crawler endpoints and blog image redirects fixed; the feed sends max-age only; /api/search is public while the locale cookie is written on /api/*
Process-local caches Incomplete — palette cache is LRU and validates ids before the DB; announcements are per-instance and unbounded
Service worker Implemented pwa-service-worker precaches the offline shell only (710 → 37 entries); HTML and data never cached
Cache keys cover every input Implemented — name-check sources declare searchInputs — exactly what each search reads, plus the endpoint it calls; code constants (e.g. the TLD list) are not in the key

F. Interaction responsiveness

Concern Status Record Evidence / gap
Optimistic mutation with exact rollback Implemented optimistic-mutation the velocity showcase, and the desk explorer's moves and AI pins (a tree variant of the fold; the old capture-and-restore rollback lost a later successful move)
Navigation Incomplete intent-preloading hover preload app-wide; the desk layout load no longer writes, but the /account layout still consumes its one-time welcome marker on hover, and the admin feedback detail marks an item read
Idle preparation Implemented velocity-idle-work command palette warmed at idle; preloadOnIdle used by the showcase only
Dragging and resizing Implemented — desk split resize coalesced to one update per frame; snapshot inside the debounce
Search and filtering Incomplete — palette search debounced; knowledge-graph search restarts the force simulation per keystroke
Editor input Implemented — the editor publishes through its own debounce, not per keystroke

G. Media and asset delivery

Concern Status Record Evidence / gap
R2 delivery Implemented velocity-asset-delivery redirect carries s-maxage; presigned in 15-minute windows so the URL is stable
SVG weight Incomplete velocity-asset-delivery logos −37%; the favicon is 121 KB gz and needs a simpler mark
Dimensions and lazy loading Missing velocity-asset-delivery blog body images have neither
Responsive formats (srcset, AVIF/WebP) Missing — no enhanced-img; blog images ship as uploaded
Static asset cache headers Missing — unhashed /logo, /favicon.svg, /models/*.glb (7.2 MB) and /images/parts revalidate every visit
Video Not audited —

H. Heavy computation and visualization

Concern Status Record Evidence / gap
Workers and WASM Implemented main-thread-budget image analysis in a worker; WASM kernel benchmarked including transfer cost
Visibility-aware 3D Implemented — the 3D index renders on demand and pauses offscreen, hidden and behind the viewer
Resource cleanup Implemented — charts, d3-force and 3D layers dispose on destroy
Texture and geometry budgets Missing — no budget; GLB files are unhashed (see G)

I. Deferred work and resilience

Concern Status Record Evidence / gap
Critical / deferred / background Implemented critical-path-deferred-tail one wrapper owns the platform rules
Durable background work Implemented — the jobs scheduler and durable step execution
Breakers, bulkheads, shedding, retry Implemented resilience-policy
Deadlines Incomplete deadline-propagation a background refresh inherits the finished request's deadline and can abort at once
Deferred cost Incomplete critical-path-deferred-tail anonymous page views write to Postgres after the response; the bot lane already buffers in Redis

J. Observability and contracts

Concern Status Record Evidence / gap
Field, lab and development kept apart Implemented performance-budget-ratchet
Server timing Implemented latency-tracing admin-only span detail on a public-cached response is unconfirmed
Adverse-condition scenarios Implemented scenario-harness the grid's empty rows are listed in measurement.md
HTML, CSS and font budgets Incomplete performance-budget-ratchet doc_html_kb sees prerendered documents only; no CSS or font budget
Rendering lab in the repo Missing — the LCP/CLS/TBT harness of this pass lived outside the repository
Contract fields per pattern Incomplete — purpose, preconditions, use / avoid, invariants and proof are record fields; bundle impact, server cost, caching semantics and failure behaviour are prose in these docs
← Back to Blueprint

Geht dieses Pattern noch besser? Sag uns, wie.

Feedback geben