Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Vixen compatibility target

This is the honest v1.0 target matrix. It is not a claim of full Firefox or full WPT compatibility. Vixen delegates focused parser, cascade, runtime, and native rendering primitives where that improves correctness and size. All measured rendered compatibility now uses Flutter-owned formatting, geometry, semantics, and scenes. R7 deleted the native/Rust renderer path. Every supported CSS semantic remains fixture/WPT-gated.


Current measured committed fixture baseline

As of 2026-07-16, fixtures/manifest.json contains 70 local fixtures plus 200 imported smoke fixtures:

CategoryFixtures
css17
css-cascade/css-values50
cssom-view1
dom25
dom-core50
events1
flexbox5
forms28
grid5
layout9
layout block/inline/position6
network2
paint4
paint/ref-equivalent8
security9
selectors50
Total270

Total manifest checks: 2027.

Current check mix:

Check typeCount
selector-count398
selectors-exact223
title269
js-eval597
computed-style173
element-attribute132
layout-box104
body-contains68
visual-hash25
no-critical-diagnostics22
ref-equivalent11
dom-nodes-range1
min-nodes1
selector-match3

This local fixture set is release-blocking and must remain 100 % green. R8 native-path reproduction on clean revision e224bf6 ran just compat-report: all 270 fixtures and all 1,868 native-safe BrowserCore checks passed. R8 release-host reproduction then ran just flutter-fixture-manifest's exact command against the clean post-R7/Yaru release bundle: all 270 fixtures and all 2,027 checks passed. The host summary reports 140 direct rendered checks (104 layout-box, 25 visual-hash, and 11 ref-equivalent); the remaining 19 flutter-js-eval checks also run only in that Flutter host. None is relabeled as native evidence. The layout category currently includes normal-flow, inline-flow, positioned, flex row/column, grid, overflow coordinate/paint, and fragment-backed text paint fixtures with Flutter-commit layout-box and visual assertions. The paint category includes 11 ref-equivalent checks against exact Flutter scene pixels. The harness now reports overall, per-category, and local/imported source×category pass rates. Its adapter now creates production BrowserCore contexts, so fixture snapshots/selectors/styles/evaluation/reference rendering/pixel capture share typed document/runtime generations and persistent per-context V8 realms rather than constructing harness-owned Pages or runtimes. Imported upstream WPT layout/paint coverage is still tracked separately below. Imported selector smoke has reached the 50-fixture target, including focused :has() child/descendant/adjacent-sibling/general-sibling and selector-list smoke plus attribute operators/flags, class/id matching, structural and typed structural pseudos, link/form/read-write/autofill/defined pseudos, negation/list pseudos, grouping de-duplication, and document-order coverage. Local CSS computed-style coverage now includes the Milestone 1 advanced cascade seam: @media, @supports, @layer, inherited custom properties, var() fallback, and CSS-wide keyword projection through Page. Imported css-cascade/css-values smoke has reached the 50-fixture target, including specificity/source order, important and inline precedence, combinator/attribute-operator matching, structural/link/form pseudo selectors in cascade, :is()/:where()/:not()/:has() selectors, selector-list splitting, custom properties, declaration recovery, comments, math/color/gradient/transform/shorthand values, and quoted/nested/function declaration values. Imported DOM-core smoke has reached the 50-fixture target, including query/getElementById/querySelectorAll, document/root/body access, tag/class/wildcard collections, attributes, reflected host properties, text aggregation, parent/child/sibling traversal, null relation checks, document URL, forms collection length, matches(), logical selectors, and :has()-backed matching. Imported forms smoke has reached the 25-fixture target across reflected/default form/control properties, labels, radio/checkbox/select states, textarea text, form tree traversal, repeated names, and :has() form selectors. Local Phase 6 fixtures now also assert runtime/Page-backed js-eval projections for getComputedStyle(), document/navigator state (documentURI/baseURI, focus, and active-element shape included), op-backed in-memory Web Storage mutation with key/value validation and quota errors, Event/CustomEvent/dispatchEvent() smoke, the pinned focusoutfocusinblurfocus transition with relatedTarget, Page-owned active-element restore, CSSOM CSS.supports() plus retained live document.styleSheets / CSSStyleRule / CSSStyleDeclaration read-only objects, viewport/window state, DOMRect geometry via getBoundingClientRect() / getClientRects(), client/offset/scroll metrics, getBoxQuads(), Range rectangles, Geometry Interfaces value constructors (DOMPoint/DOMRect/DOMQuad/DOMMatrix), DOM ancestry/core-node projections (closest(), nodeName/nodeType, ownerDocument), anchor URL decomposition/reflection, DOMParser, atob/btoa, classList/ relList/sandbox, dataset, ValidityState/checkValidity(), FormData entry-list and iterator projection plus runtime/CDP form submission by page node id with successful submitter overrides, runtime form reset/default-state restore, meta/content reflection, innerHTML/outerHTML, URL.canParse(), data: URL parsing, new URL()/URLSearchParams constructor and iterator seams, TextEncoder/TextDecoder (encodeInto and constructor options included), <img>.currentSrc plus image alt/dimension/loading/decode reflection, inert media element state (HTMLMediaElement/audio/video constants included), resource element reflection (link/style/script/source), single-range Range/Selection state with Page-owned element-boundary restore, direction, point queries, same-container clone/extract/delete/insert/surround operations, and selectionchange delivery, live history accessors/actions, details/dialog open-state reflection, miscellaneous HTML reflected attributes for lists, quotes, embedded content, and table cells, progress/meter numeric state, inert Canvas 2D context smoke, form-associated reflected attributes and editing helpers, read-only table collections/indexes, HTMLElement interaction/global reflected attributes, text track / track-element state, inert OffscreenCanvas/ImageData/ImageBitmap/Path2D APIs, minimal ShadowRoot/DocumentFragment smoke, template content and slot assignment shape, DOM construction/serialization helpers, structuredClone, CDP Runtime.awaitPromise over stored promise handles, MutationObserver lifecycle, TreeWalker/NodeIterator traversal, Headers iteration, Blob/File, read-only Request/Response state with forbidden header filtering, Response.error() / Response.redirect() / Response.json(), op-backed fetch() HTTP(S) status/header/body reads plus URL-policy/private-host rejection with CDP Network.loadingFailed diagnostics, credential-correct CORS, bounded origin/target/credentials-partitioned preflight caching (including effective CDP extra headers), strongest-algorithm Request SRI verification before exposure/cache insertion, AbortSignal, URLPattern, CDP lifecycle opt-in (init/commit/DOMContentLoaded/load), Performance timing shape, matchMedia(), Permissions API query state, Notification permission state, and StorageManager estimate/persisted state backed by profile/storage records before the remaining host-object swap; Encoding API constructors, Web Storage mutation, focused fetch() success/blocking checks, sequential global/storage persistence across Runtime.evaluate, focused document/Element snapshot host-object evals and read-only DOMTokenList property reads are also exercised directly through the persistent deno_core runtime seam. HTMLElement.dataset has since moved off that frozen projection: its stable live DOMStringMap reflects external attributes and routes assignment/deletion through the authoritative DOM mutation, Stylo, and renderer-source path. Element.classList now also retains a stable live DOMTokenList identity across external and list-driven class writes, with current token reflection and the same authoritative mutation/cascade path. HTMLAnchorElement.relList retains the same identity and behavior across rel writes, as does HTMLIFrameElement.sandbox across valid sandbox-token writes. These are all attribute-backed token-list families currently hosted by the runtime. HTMLElement.style now likewise retains one live inline CSSStyleDeclaration across external attribute replacement and declaration API writes, using the same authoritative mutation/cascade path. Element.attributes now retains a live NamedNodeMap, and attached Attr objects retain identity, reflect external writes, and write through Attr.value. Detached Attr values, Document.createAttribute, replacement, removal, reattachment, and in-use rejection now share that same authoritative path. Structural childNodes/children, document/form/select/table collections, and getElementsBy* results are retained live objects; querySelectorAll remains a static result by design.

Static parser-discovered PNG <img src> has one resource-to-pixel vertical. BrowserCore applies exact generations, URL/CSP/mixed-content/redirect policy, cookies/cache, response MIME/status, and compressed/dimension/decoded limits before exposing accepted bytes to Flutter. A 2×2 four-colour fixture proves exact Flutter scene pixels. This does not yet claim dynamic image loading, complete srcset/picture, animated PNG, JPEG/WebP/GIF, SVG image documents, broad intrinsic replaced-element sizing, or image events. Runtime platform smoke now additionally covers secure crypto.getRandomValues() / randomUUID(), async Clipboard text and ClipboardItem shape, MessageEvent, MessageChannel, BroadcastChannel, first-callback IntersectionObserver / ResizeObserver geometry, and a fail-closed WebSocket close path. Imported smoke fixtures now also seed block/inline/position layout, flexbox, grid, and Flutter-scene ref-equivalent paint; imported layout smoke covers auto margins, border-box sizing, inline flow, flex reverse/gaps, and grid minmax()/fractional row/gap cases. Imported paint smoke now covers currentcolor, overflow clipping, positioned boxes, flex/grid backgrounds, and nested background/text scene equivalence.


Current automation smoke baseline

The external Playwright smoke covers connect/target/page/runtime/DOM/input/ network/dialog/screenshot/history/content/script/style/binding paths plus browser-context permission grant/reset, bounded Chromium JSON tracing through CDP IO streams, idle stop-loading behavior, and stable protocol errors. CDP permission overrides are exact-origin or wildcard scoped and do not mutate persisted user decisions. Trace records contain method/timing/session/success metadata only, not expressions, request headers, form values, or page text. R8 reran the release/AOT Flutter-hosted smoke after cutover: two target viewports remained isolated, Flutter geometry/input and before/after scene pixels agreed, target switching preserved the first scene, and forced renderer reset recovered by full resync to byte-identical pixels. The first A1 extension now also writes a live dataset property, observes the attribute-selector-driven 140×32 box synchronously, matches later CDP DOM attributes/geometry, and pins renderer-specific before/after Flutter scene hashes. The second through sixth A1 extensions retain classList through the click mutation, a real anchor's relList through a visible rel-selector mutation, and a real iframe's sandbox through valid token writes, then retain inline style through external and API writes and attached attributes through Attr.value. Page and CDP views match the resulting geometry; every exact scene recovers byte-identically after renderer reset. The seventh extension retains empty structural collections across the rendered click mutation, observes the same dynamic node through live indexed/named access and CDP, and preserves the existing exact click hash. The eighth extension retains the author stylesheet/list/rule/declaration object graph across every earlier stage, then reflects one style-element rewrite in Stylo, synchronous geometry, CDP, and exact Flutter pixels at b09bce0ee8acf5ac3b40a2190241a6592880a3e47615c030469b2a887d118f1d. The ninth extension exercises detached Attr replacement/removal/reattachment, in-use rejection, synchronous geometry, CDP agreement, and exact Flutter pixels at 92181acffcd1e39ac9720c8edeeba2c148034a89f61297652dc948306f3af052. The tenth extension executes parser-discovered inline/external modules after classics with per-script/module/task microtask checkpoints, top-level await, bounded real task queues, cancellation, and post-load pumping. Its module-owned 120×32 target agrees with CDP and exact Flutter pixels at faa3c863350c742bdeb38338bca09307a4db49e6f7bb7a3f4e6d73eef60ae2fa. The first A2 extension imports a real file dependency in that same rendered corridor. Same-origin/file static dependency graphs now share BrowserCore request ids, redirect/final-URL policy, profile cookies/cache writes, bounded diagnostics, and stop cancellation while preserving the exact scene hash. The second A2 extension applies CORS to cross-origin HTTP(S) module roots, dependencies, and redirects before V8 exposure. Default graphs omit cross-origin credentials; crossorigin="use-credentials" requires an exact credentialed response and is inherited by dependencies. Cache reads now conditionally revalidate eligible exact-URL HTTP(S) roots and dependencies; matching 304 responses reuse bounded raw bytes only after current CORS/status/strict-MIME policy, while cache-disabled contexts bypass reads and writes. Freshness reuse, redirect aliases, and full Vary still fail closed. One bounded inline import map before module discovery now supports exact, prefix, URL-like, null-blocking, and scoped mappings plus import.meta.resolve() through the same policy-bound loader. Up to 64 inline maps may appear before or after module discovery and merge into one normalized state capped at 512 KiB, 2,048 mappings, 128 scopes, and 2,048 integrity entries. Earlier conflicting imports/scopes/integrity entries win with bounded warnings. A shared 2,048-entry/1 MiB successful-resolution set keeps each (referrer, specifier) result stable; parser-position static graph snapshots cannot be rewritten, while later dynamic imports and automation use the latest map. External, malformed, cumulative-overflow, and oversized maps fail closed. URL-like relative integrity keys resolve from each map's base. Static/dynamic graph dependencies and top-level modules without an authored integrity attribute verify mapped SHA-2 metadata over accepted raw bytes before V8, cookies, or cache insertion. Non-object/non-string/bare-URL forms and normalized duplicates reject the whole map. Dynamic import() from parser-discovered page modules, including later retained module functions and document tasks, keeps the originating graph's import map, credentials/policy, cumulative limits, redirect base, cache/profile effects, and cancellation. Parser classics and BrowserCore automation evaluations now use the same loader with exact source/document policy: mapped file imports execute, redirected classics resolve relative imports from the accepted final URL, and numeric request ids plus existing graph/cancellation bounds remain intact. Committed source-only fixture identifiers remain usable for ordinary evaluation, but dynamic imports from a non-URL realm fail without transport. Exact static and dynamic type=json imports now use that loader with strict .json file or JSON HTTP MIME policy. Unknown keys and text/bytes/custom types fail before transport; a bad MIME creates no profile cache row. External classic/module roots also enforce authored SHA-2 SRI over raw response bytes; mismatch executes nothing and commits no response cookie/cache effect. Cross-origin classic SRI sends document origin and requires CORS before hash verification. Child frame globals and documents remain unavailable rather than fabricated until A3.

Page fetch()/XHR and module resources now share bounded private-cache decisions. Exact effective final-hop request headers select simultaneous independently bounded Vary representations. Response Date/Age plus max-age or Expires determine explicit freshness; request no-store, no-cache, max-age, min-fresh, and max-stale constrain reuse and insertion. Stale/no-cache entries require validators, and wildcard/malformed/oversized variants plus no-store responses are not reused. Focused runtime proof fetches enfren, performs exactly two network requests, and reuses the first representation; a fresh two-context module root/dependency graph also reuses the profile cache. Current CORS/integrity/status/MIME/body policy still runs before exposure. Heuristic freshness remains unsupported. Fresh cacheable permanent same-origin 301/308 aliases reuse one final representation while preserving final URL, redirect count, module relative-import base, and network diagnostics. Temporary/cross-origin redirects remain live-only rather than bypassing response policy.

HTTP bodies are now read incrementally with the configured cap checked before buffer growth. Ordered response/progress/completed diagnostics include exact chunk/cumulative/final bytes and reach BrowserCore, C ABI output, module events, and CDP Network.dataReceived/loadingFinished. Response.body and Blob expose bounded ReadableStream readers with one-shot body-use behavior; XHR emits typed upload/download progress and terminal events. Pre-aborted fetch rejects with the first signal reason without network I/O. Active page abort now cancels the owned transport and retains the exact first JS reason; XHR abort cancels the same request and suppresses stale send completions. Realm teardown, BrowserCore stop/navigation, and deadlines also cancel without partial profile effects. For ordinary same-origin or CORS responses, fetch() now resolves after final redirect URL/CSP/mixed-content/CORS policy accepts the response head. Its body reader receives raw chunks before transport completion through an eight-message backpressured channel; XHR exposes headers at that boundary and enters loading as chunks arrive. Body completion waits for bounded cache/cookie commit, and an abort after resolution disconnects transport and rejects the body with the exact signal reason. Integrity-bearing fetches, conditional 304 revalidation, and opaque no-cors fetches remain intentionally buffered. Cloning or teeing an active network body is unsupported and throws rather than creating an unbounded or policy-detached consumer.

CDP targets now map to independent BrowserCore contexts/runtimes and share only profile-scoped state. BrowserCore source navigation is asynchronous, generation-checked, and directly cancellable; deterministic stop/supersede, redirect/stop, reload, history-traversal, and parser-stage race tests force stale work and prove no stale document/history/cookie commit or terminal success event. The CDP WebSocket path uses one event pump while navigation-producing requests are pending. Page.navigate, Page.reload, Target.createTarget, cross-document history traversal, and runtime/input-triggered navigation therefore leave the same connection available for Page.stopLoading or unrelated commands. Exact ordered BrowserCore navigation ids correlate multi-action evaluations, and claimed abandonment records prevent late outcomes from affecting later requests. Gated socket tests cover navigate/reload, history, multi-action runtime navigation, and non-blocking target creation. Configured initial-URL loading still settles before socket acceptance by design. Configured and parser-discovered scripts yield between items; a committed author exception emits Runtime.exceptionThrown, later independent scripts continue, and normal load settlement follows. Individual V8 jobs are deadline-bounded, failed/timed-out evaluations discard deferred DOM mutations before isolate reuse, and parser-discovered external classic-script reads are generation-cancellable. Navigate/reload/stop/ close commands snapshot and interrupt the exact active runtime generation before the deadline; interrupted mutations/effects are discarded, the cancellation is not reported as a page exception, and the isolate remains reusable. Runtime fetch() and CORS preflight waits also return promptly on that signal; the worker-local cancellation path drops the in-flight reqwest future, joins the worker, and cannot commit cookie/cache state. Gated peers observe the fetch and preflight connections close before sending a response. Runtime construction and other local native host calls remain open. Parser-discovered non-alternate <link rel="stylesheet"> now uses the same cancellable bounded text-resource worker before author scripts. Relative file and HTTP(S) sheets apply in document order to Page cascade/renderer source and refreshed runtime computed-style hosts. Redirect hops recheck style-src, mixed-content, and URL policy; accepted HTTP responses pass status/nosniff checks before cookie, bounded profile-cache, or style commit. A checked-in file fixture proves visible red 120×40 output, and gated HTTP/supersede tests prove request-id events and rejection of late cookie, cache, and style commits. Link media is currently limited to absent/all/ screen; alternate sheets, dynamic links, @import, SRI, cache reuse/freshness, and complete external-sheet CSSOM objects remain unsupported. There is still no HTTP download manager or Playwright context-tracing archive implementation.


Current Flutter shell smoke baseline

The Linux shell uses one BrowserCore and one Flutter renderer under native Wayland. Normal GUI, page-only automation, rendered CDP, Playwright, and the fixture manifest share the same formatter/commit/painter implementation.

Current evidence covers exact source revisions, full resync and mutation batches, block/inline/flex/grid formatting, Paragraph geometry, accepted PNG resources, commit-bound hit testing, pointer/key/text input, semantic actions and bounds, root scroll commits, scene PNGs at multiple viewports, renderer reset/recovery, and same-task element/Range/caret CSSOM geometry. Hidden/stale/missing commits fail closed with no native pixel fallback.

The C ABI has no frame descriptor or raw coordinate input. Pointer commands must carry an exact displayed-commit query and optional Flutter hit target. BrowserCore accessibility snapshots carry semantic meaning but no fabricated layout bounds; Flutter commits supply displayed semantic geometry.

fixtures/manifest.json keeps source and rendered assertions together. Native WPT runs source/runtime checks only. Renderer-dependent JavaScript is tagged flutter-js-eval; layout-box, visual-hash, and ref-equivalent are also Flutter-only. just flutter-fixture-manifest remains the complete rendered compatibility measurement.

Known shell gaps remain broader device/IME/AT matrices, non-Linux production runners, full CSS and text shaping breadth, advanced nested/smooth scrolling, GPU/compositor recovery on physical systems, process isolation, performance/size budgets, packaging, and sustained release evidence.

WPT target profile

Full upstream WPT is too broad to summarize honestly with one percentage at v1.0. The release contract is a curated, imported WPT profile with measured pass counts by category. Small, Vixen-minimized upstream-derived smoke fixtures may live beside local fixtures and remain recorded in fixtures/manifest.json. Larger upstream slices should use committed WPT profile JSON plus an ignored, pinned upstream checkout (for example .tmp/wpt/) so review diffs contain only the selected paths/checks/provenance, not vendored WPT source files. Both paths feed the same vixen-wpt check types and reporting.

Areav1.0 targetExpected achievabilityNotes
HTML parsing/tree constructionBroad smoke subset greenHighhtml5ever carries parser behavior; Vixen must preserve node ids/tree shape.
SelectorsModern selector subset greenHighBacked by Stylo/selectors; include combinators, attributes, :is, :where, :has, form/link pseudos.
CSS cascade/computed valuesInline plus one external stylesheet vertical greenHigh after full Stylo sliceCompact cascade is temporary; external-sheet media/import/CSSOM breadth and full Stylo remain.
CSS layout: block/inlinev1 visual/ref subset greenMediumFlutter-hosted Vixen formatter; start with normal flow, margin/border/padding, Paragraph-backed inline lines.
CSS layout: flex/gridUseful common-case subset greenMediumVixen Dart formatting contexts over Flutter primitives; full WPT edge coverage is post-v1.
CSS layout: tables/floats/fragmentationNot v1 release-blockingLow for v1Document as unsupported/partial until implemented.
DOM CoreTraversal, attributes, token lists, ranges, mutation observer subset greenMediumVixen-owned Web APIs over deno_core host extensions after the ADR-014 migration.
Events/forms/history/storageSelected behavioral subset greenMediumGate by fixtures from SPEC invariants and imported WPT cases.
JS languageUse V8/deno_core language coverage, not WPT percentageHigh for languageWeb API exposure remains Vixen-owned and separately gated.
Paint/ref testsFlutter scene/commit visual subset greenMediumOne formatter/Canvas path; pixels, geometry, hit/text/scroll, and semantic bounds share a commit.
Media/WebGPU/WebRTC/service workersOut of scope for v1Not targetedDeferred by ADRs / acceptance post-v1 scope.

Release-blocking WPT goals

For v1.0, Vixen should be able to claim:

  1. 100 % pass on local fixtures/manifest.json.
  2. Green imported WPT smoke profile for parser, selectors, cascade, DOM core, forms, and the v1 layout subset.
  3. Measured pass counts published here for every imported category.
  4. No global full-WPT percentage claim until the harness imports and runs a representative upstream WPT checkout.

Initial import targets before v1.0:

Imported WPT areaMinimum useful target
selectors/css-scoping/css-nesting selector behavior50 fixtures
css-cascade / css-values computed-value behavior50 fixtures
dom/nodes + traversal + ranges50 fixtures
html/semantics/forms basics25 fixtures
css/css-display + css-box + css-position normal-flow layout40 fixtures
css-flexbox common cases25 fixtures
css-grid common cases25 fixtures
paint/ref-equivalent smoke20 fixtures

These are minimum profile sizes, not final compatibility claims. The measured pass table below must be filled from vixen-wpt output as the fixtures land.

Imported WPT areaFixtures runChecks runPassedPass rateNotes
selectors50232232100.0%Target reached: :has() child/descendant/adjacent-sibling/general-sibling and selector-list smoke, attribute operators/flags, class/id matching, structural and typed structural pseudos, link/form/read-write/autofill/defined pseudos, negation/list pseudos, grouping de-duplication, and document-order coverage.
css-cascade/css-values50250250100.0%Target reached: specificity/source order, importance/inline, combinator/attribute operator matching, structural/link/form pseudo cascade, functional pseudo specificity, selector-list splitting, custom properties, declaration recovery, comments, math/color/gradient/transform/shorthand values, and quoted/nested/function declaration values.
dom-core50250250100.0%Target reached: query/getElementById/querySelectorAll, document/root/body access, tag/class/wildcard collections, attributes, reflected host properties, text aggregation, parent/child/sibling traversal, null relation checks, document URL, forms collection length, matches(), logical selectors, and :has()-backed matching.
forms25134134100.0%Required/optional/disabled/checked controls, labels/buttons/form attributes, reflected/default input/form/select/option properties, textarea text, tree traversal, repeated names, and :has() form selectors.
layout block/inline/position63030100.0%Block flow, margin/padding/border, auto margins, border-box sizing, inline flow, and relative/absolute positioned smoke.
flexbox52525100.0%Row/column grow-basis, gap/padding, and reverse-axis smoke.
grid52626100.0%Fixed, fractional, minmax(), row/column gap, and fixed-height fractional-row smoke.
paint/ref-equivalent82424100.0%Display-list reference-equivalent background/text, currentcolor, overflow clipping, positioned, flex/grid, and nested-background smoke.

Known v1.0 layout gaps

Expected unsupported or partial areas unless promoted by WPT/real-site evidence:

  • table layout
  • floats and float avoidance
  • full vertical writing modes / vertical text shaping
  • page fragmentation / pagination / print layout
  • advanced intrinsic sizing cycles (min-content / max-content edge cases)
  • complete absolute/fixed/sticky interaction matrix
  • full SVG layout integration

Each gap should fail closed where possible, emit diagnostics when visible to users/tests, and receive a WPT fixture before being marked supported.