Skip to content

[Epic] CSS features, compatibility, validation, and performance #235

Description

@wieslawsoltes

Current implementation checkpoint — 18 September 2026

Pinned integration heads are AppScene eef005596716174594e9ec74966b89a0aba99a10, WebScene c595be47332adb88a50c374804c299f3db814616, and unchanged VS Code OSS 1.137 645f29cc3176500b4b5762ba887cf2a7f0ffdf2c.

Merged focused fixes in the latest tranche: AppScene #171; WebScene #431, #433, #434, #435, and #436. These cover directory deletion authority, the webview resource consumer matrix, canonical CSSStyleRule serialization, browser-shaped MessagePort accessors, directory removal, and dedicated-Worker cross-isolate MessagePort reachability. The current exact SDK archive is /private/tmp/appscene-webscene-sdk-ac235de-eef0055.tar.gz (2,868 files, SHA-256 031161a9c32274148852057b4af87e03635ae94d987e15271267a30a439e5b52).

User priority is implementation throughput. Release build and broad validation were stopped after the Code OSS payload completed and native host compilation began; no promotion claim is made. Validation debt remains recorded for one exact package after the implementation wave.

Active focused lanes:

Remaining dependency order: finish and merge focused implementations; close the ServiceWorker/iframe remainder of #288/#81; complete workspace/files/save; complete webviews/Markdown; complete CSS/layout/paint and terminal behavior; then run one cumulative exact-package smoke, visual comparison, performance, size/disk, accessibility, workbench/Chat, lifecycle, zero-browser, signing/archive, and supported-RID release gate.

The consolidation PRs AppScene #65, WebScene #76, and vscode-demo #1 remain open and unmerged. Focused AppScene/WebScene implementation PRs merge immediately during this implementation wave; skipped checks are explicit validation debt.

This CSS epic remains the single coordination source for CSS feature correctness, invalidation, layout, paint, visual parity, and CSS-driven performance. Existing sub-issue history and native sub-issue links below are preserved. The active agent must avoid duplicating already merged PR #148 work.

Final implementation-wave merges: WebScene #439 / PR #444 merged as d28995e2a8cd898a6ba5a3f43baffe091ccda18a, implementing aspect-ratio exposure, cascade/inline mutation, computed serialization, invalidation, pseudo projection, box-edge handling, and ordinary/flex/grid/floating/positioned sizing. WebScene #443 / PR #445 merged as c595be47332adb88a50c374804c299f3db814616, adding non-constructible Document.queryCommandSupported for copy/cut/paste/selectAll across top-level and iframe realms.

The local integration gitlink and WebScene upstream main now both point to 4ea2feeb. The previously built SDK archive at ac235def predates #441/#442/#444/#445 and is retained only as provenance; a new SDK/package plus all validation is deferred. All queued focused-PR CI tails were canceled under the implementation-only directive.

Implementation-only wave complete. WebScene main and the vscode-demo gitlink are c595be47332adb88a50c374804c299f3db814616. Focused merges after #445: #447 :required/:optional; #450 iframe clipboard Permissions Policy; #451 circle clip; #453 :read-only/:read-write; #455 nested meta CSP script admission; #458 Code OSS polygon clip; #459 end-to-end input.indeterminate; #461 stale iframe generation rejection; #464 brightness() paint; #465 :in-range/:out-of-range; #467 one-shot nested pagehide; #469 grayscale() paint.

Every child issue and parent epic records deliberately deferred WPT/browser/native/build/performance/memory/lifecycle/package/CI validation. The newest SDK archive remains the pre-wave ac235def package and is stale against current main; cumulative validation and a new SDK/release are the next phase. WebScene draft #76 is rebased to 4e79c127 on c595be47 and remains unmerged. AppScene #65 and vscode-demo #1 also remain unmerged.

Current continuation: stylesheet-lifecycle inheritance candidates — 2026-09-18

Read this section first. PR #339 is stacked on #338. Both are locally qualified structural milestones; the full epic remains active pending physical product acceptance and any further retained application-path work.

Implemented and verified

Immutable rule payloads now carry a modeled property mask for declarations that can resolve to inherit directly or through var(). The runtime builds a compact inheritance-candidate index at stylesheet creation/rebuild instead of reconstructing it by scanning every rule and declaration on each viewport-media transition. Navigation/frame initialization clears it; document and shadow cascade activation move it with the owning cascade; low-memory compaction and active/inactive memory accounting include it. The UI compiler emits it, and parsed/cached/generated stylesheet parity compares it. Legacy prepared payloads derive the mask once at indexing.

A deterministic 32/1,024 unrelated-rule matrix performs two candidate-index visits for two threshold transitions in both sizes and zero transition declaration scans, while inherited widths are correct on activation and deactivation. The focused media filter, adjacent attribute/CSSOM/dimension filters, full css-invalidation-scaling matrix, V8-free shared service, generated stylesheet integration, native 5/5 contract, and Chromium 5/5 contract pass.

Populated Spotify result

The unchanged 2,732-node/18-image catalog measured 240 alternating 800/700 transitions. Median synchronous dispatch is 53.0003 ms (mean 53.2729, p95 54.1071), down another 4.02% from #338 at 55.2183 ms and 42.47% from the merged #326 control at 92.1278 ms. Width medians are 52.7684/53.1736 ms. Representative narrow planning falls from 13.6822 ms to 11.3870 ms.

A separate shortcut that carried property-name vectors per request was rejected and removed: median regressed to 56.0747 ms and p95 to 61.6147 ms. Do not revive that allocation-heavy representation without new stable evidence.

Remaining boundary

The representative transition still creates 785 requests, 431 conditional inherited roots, and 690 targeted variable replays; application remains about 23 ms in the diagnostic trace. The approximately 53 ms dispatch is still above a 16.7 ms frame budget. Any further engine candidate should use product-neutral winning-declaration dependency provenance or another allocation-free representation and must not duplicate #238 cascade semantics.

After #338/#339 land, assemble and manifest-qualify the combined SDK, then run continuous physical Spotify resizing and repeated small-to-large threshold crossings against the same Chromium build. Product acceptance is correct content with no conspicuous threshold pause. A Chrome speed comparison requires matched content, scale, cadence, and idle-host conditions. No CI monitoring was started.

Current continuation: immutable variable dependencies and inherited replay — 2026-09-18

Read this section first. It supersedes older current-status statements below. The full CSS optimization goal remains active pending the remaining structural and physical product gates.

Implemented and verified

Immutable rule payloads now carry per-declaration and aggregate custom-property references. Runtime indexing, dependency expansion, media planning, consumer discovery, pseudo fallback checks, geometry invalidation, and custom-property mutation invalidation consume that metadata instead of rescanning stylesheet var() text. Inline style values remain transition-parsed because they are mutable. The UI compiler emits the same metadata; parsed, cached, and generated stylesheet parity now compares it. Older or hand-authored prepared payloads retain a conservative parsing fallback.

Inherited property consumers can now use exact-property variable replay. The runtime snapshots the consumer style, replays only affected properties, and propagates only inherited properties whose computed value actually changed. Explicit overrides remain intact; changed custom-property owners, pseudo-elements, unknown properties, shadow boundaries, and other conservative cases still use complete cascade.

Certification proves zero runtime stylesheet variable token scans across media activation/deactivation with 32 and 1,024 unrelated rules. The inherited-variable fixture stays at [3,3] complete cascade applications with 32 and 1,024 unrelated descendants. Native and Chromium browser-referenced contracts pass 5/5. The focused media filter, three adjacent native filters, full css-invalidation-scaling matrix, V8-free shared service, and parsed/cached/generated stylesheet integration pass.

Populated Spotify result

The unchanged 2,732-node/18-image catalog was measured for 240 alternating 800/700 transitions. Stable median synchronous dispatch is 55.2183 ms (mean 55.3375, p95 56.3241), down 7.14% from merged #335 at 59.4642 ms and 40.06% from the merged #326 control at 92.1278 ms. Metadata alone measured 60.0185 ms and is retained as a negative result; the accepted gain comes from exact-property replay for inherited consumers.

A representative narrow transition spends 13.6822 ms planning and 22.6188 ms applying, with 785 requests, 431 conditional inherited candidates, 137 changed inherited roots, and 690 targeted variable replays. This is synchronous dispatch evidence, not physical-window cadence or a Chrome-speed claim.

Remaining plan

  1. Evaluate reusable inherited-candidate metadata to reduce the 1,751 inheritance-rule planning scan and 431 conditional candidates without weakening alias, explicit-inherit, pseudo, unknown-property, shadow-boundary, or computed-inheritance correctness.
  2. Retain only a candidate that improves stable populated-Spotify evidence and all native/WPT bounded-work gates. Do not revive the twice-rejected root-only selector-index reuse shortcut.
  3. Consume Complete cascade layers, origins, global keywords, and custom-property resolution #238 semantics rather than duplicating them.
  4. Assemble and manifest-qualify a combined SDK, then run continuous physical Spotify resizing and repeated small-to-large threshold crossings against the same Chromium build.
  5. Product acceptance requires correct content and no conspicuous threshold pause. A Chrome comparison requires matched content, scale, cadence, and idle-host conditions.

The current approximately 55 ms threshold dispatch remains above a 16.7 ms frame budget, so #338 is a mergeable structural milestone rather than completion of this epic. No CI monitoring was started.

Current continuation: dependency-directed media recascade in #335 — 2026-09-17

Read this section first. It supersedes older current-status statements below; historical results remain preserved. The full CSS optimization goal remains active.

  • PR: Direct media recascade through CSS dependencies #335
  • Branch: feature/css-media-root-recascade-235
  • Current pushed head: 5d970efd983088d38e071bbcb1ce33cedce2eca0
  • Base inspected for this slice: d73d878b0670e78b5c599153121b6f3d3ca0e21c
  • Validation report: docs/validation/css-media-dependency-recascade-20260917.md
  • Machine evidence: docs/validation/css-media-dependency-recascade-20260917.json

Implemented and verified

The viewport-media path no longer treats a matched ancestor as an unconditional whole-subtree recascade. The pass-local plan now uses changed-rule subject indexes, exact-property masks, explicit-inherit consumers, conditional inherited propagation, and custom-property dependency/consumer discovery. Consumer-only custom-property requests replay the cascade only for affected property names; changed-rule subjects, custom-property owners, pseudo-elements, inherited values, unknown/shadow cases and other conservative fallbacks retain complete cascade behavior.

No throttling, deferred resize, stretched stale frame, mutation-lived computed-style cache, or Spotify-specific selector/property path was introduced.

The focused native media-query-targeted-recascade group passes. Its custom-property fixture crosses the media query in both directions with 32 and 1,024 unrelated descendants: complete cascade applications are now [3,3] in both sizes, down from [13,13]. The three complete cascades are the token owner and two alias owners; ten ordinary consumers use property-targeted replay. Exact non-inherited and inherited-value fixtures remain invariant under unrelated growth.

The browser-referenced media-query-targeted-subtree-recascade.html contract passes 1/1 document and 4/4 subtests in the native runner and 4/4 in Chromium. Adjacent attribute invalidation, stylesheet CSSOM, dimension-variable compatibility and cumulative CSS invalidation filters passed. The final rebuild and focused native rerun after trace cleanup also passed.

On the unchanged populated Spotify catalog, 240 alternating 800/700 CSS-pixel transitions with 2,732 measured nodes and 18 complete images improved from the merged #326 control median of 92.1278 ms to 59.4642 ms: 35.45% lower, or 1.55x dispatch throughput. This property-targeted step is 8.35% lower than the prior dependency-directed candidate at 64.8797 ms. It performs 287 targeted variable-consumer replays per representative narrow transition. This is synchronous engine-dispatch evidence, not physical-window cadence or a claim of beating Chrome.

WEBSCENE_TRACE_RECASCADE_ROOTS=1 reports dependency-plan counts. WEBSCENE_TRACE_RESIZE_PHASES=1 splits outer listeners, media refresh, frame listeners, batched recascade, layout and observers without requiring a certification build.

Rejected experiment retained as a boundary

The dormant root-only selector-index reuse experiment was repeated on this exact path. It eliminated 26,300 index-rule calls and improved the focused fixture, but did not materially improve Spotify median (64.8782 ms control versus 64.8062 ms) and regressed mean/tail (65.9190 ms versus 69.8560 ms mean). This agrees with the earlier cumulative CPU/FPS rejection. Production continues rebuilding indexes on media truth changes. Do not revive this shortcut without new evidence explaining both rejections.

Remaining plan, in order

  1. Precompute reusable, mutation-invalidated custom-property dependency and consumer metadata so each threshold crossing does not reparse every var() value or rebuild the full dependency graph. Prove invalidation for stylesheet insert/delete/replace, inline style mutation, adopted/shared sheets and tree/scope changes.
  2. Precompute inherited-property candidate metadata and reduce the representative transition's 431 conditional inherited candidates and 498 remaining complete-cascade requests without weakening alias, explicit inherit, pseudo, unknown-property, shadow-boundary or computed-inheritance behavior.
  3. Re-profile planning, cascade application, layout and publication independently on the populated Spotify workload. Retain only changes that improve stable multi-transition evidence and all bounded-work/correctness gates.
  4. Consume Complete cascade layers, origins, global keywords, and custom-property resolution #238's cascade/global-keyword/custom-property semantics instead of duplicating them here. Rebase and requalify when that owner lands relevant work.
  5. Assemble and manifest-qualify a combined SDK, then run continuous physical resizing and repeated small-to-large threshold crossings against the same Chromium build. Required product acceptance is correct content and no conspicuous threshold pause; any Chrome comparison must use matched content, scale, viewport cadence and idle-host conditions.

The current ~59 ms threshold dispatch is still above a 16.7 ms frame budget, so this is a mergeable structural milestone rather than completion of the epic. No CI monitoring was started.

Current CSS workstream handoff — 2026-09-17

Read this section first. It supersedes historical status/checklist statements in the collapsed archive below. The full CSS optimization goal remains active and incomplete.

0. Latest continuation: listener ownership and text topology in #292

Completed in the current draft

  • Listener lifecycle: strengthening the panel regression exposed a real listener → panel state → DOM retention cycle. Node targets now own callback/signal entries in their private JS graph and the native dispatch index is weak. Removal, once delivery, abort and native teardown retire ownership. The 512-row/100-cycle gate goes populated 2,565 → baseline 1 in 5/5 repeated CTest runs; a settled 250 ms interval adds no layout/publication. Four retirement routes each clear 128 callback WeakRefs while the target stays connected. New lifecycle contract: 5/5 Chrome and native; adjacent native 20/20 across eight documents, adjacent Chrome 5/5 across three.
  • Text topology: Text.splitText() and Node.normalize() now follow browser UTF-16, conversion, identity, recursive coalescing, stylesheet and textarea semantics. They preserve parent concatenated text and element-child structure, so the runtime dirties layout/paint without selector invalidation or cascade. The browser-referenced contract failed native 0/6 before implementation and now passes 6/6 Chrome and native; adjacent CharacterData remains 70/70.
  • Algorithmic fix found by the new gate: 12,800 split/normalize pairs initially took about 307–308 ms despite zero CSS work because every detached suffix compared itself with every historical detached root. Detached leaves now use an indexed constant-work registration path. The same local diagnostic is 23.6–28.7 ms at 32/1,024 unrelated nodes/rules, with zero containment comparisons.
  • The four-case topology matrix varies 8/128 affected parents independently of 32/1,024 unrelated nodes/rules. All nine selector/cascade/positional/detached-root work-counter deltas are zero. Generated bindings, detached-DOM GC, certification native tests/shared runtime and the production static SDK runtime (certification off, Inspector on) pass.
  • Evidence: listener report, listener machine evidence, text-topology report, and text-topology machine evidence.

Boundaries and next-session plan

1. Merge complete: continue from main on a new branch

The user explicitly approved merging with the package failures outstanding and requested that the IndexedDB owner handle that follow-up. #245 is now merged.

  • PR: Optimize structural CSS invalidation and DOM mutation checkpoints #245
  • Current pushed head: 4f9c3ba3e1926a3d6b93db3586834c167541f6ba
  • Merged source branch: feature/css-structural-invalidation.
  • Verified GitHub state: MERGED, at 2026-09-17T15:45:14Z.
  • Actual merge commit: 4040058e74d76b4485961d65dad74a77c46072fb. This includes the newer main tip aa786c0e; combined post-merge build/test qualification has not been performed yet.
  • Local continuation branch: feature/css-optimization-followup-245, created at the actual merge commit in /tmp/webscene-spotify-probe, now pushed with Fix listener ownership and text-topology CSS work #292 as described above.
  • Three uncommitted test files were preserved and reapplied successfully: the two panel-reclamation files described below, plus native_v8_runtime_indexeddb_tests.inc. None was included in the merged PR.
  • Recovery stash 9a11b261139276529cea5889d36a1382a4b9935f retains all three pre-switch changes; it was applied, not popped. The older unrelated stash 3ec44e704c5fe37157064cc617f2542edbb06195 is also untouched. Do not apply either blindly over existing changes.
  • There is no longer a pending merge-approval question. Resume CSS work on the continuation branch; hand off IndexedDB work to its owner rather than duplicating it. No CI monitoring or rerun was started.

One-time merge-readiness check (not CI monitoring)

Run https://github.com/SceneTech/WebScene/actions/runs/35239535458 is completed and the NuGet runtime-package workflow is not green.

Passed checks on the pushed head include main Linux/macOS builds/tests, both macOS NativeAOT lanes, Linux native SDK, Linux SDK source contracts, Native Linux document contracts, portable V8 contracts, NuGet metadata, and .NET package packing.

Outstanding package failures:

  • macOS runtime: full native suite says identical resources, including warmup, were loaded more than once across four engines; IndexedDB contract rejects the same-window navigation request at indexeddb-test-origin.js:1. Result: 41/43 tests passed.
  • Linux runtime: same repeated-resource assertion, followed by an Abseil mutex-corruption abort; containment script deadline exceeded; 4,096-control accessibility and 4,096-effect 100-cycle gates exceed 15 seconds; same IndexedDB navigation rejection. Result: 34/39 tests passed.
  • Windows runtime: MSVC C2026, oversized string literal at webscene_indexeddb_compatibility.h:431.
  • Cross-RID candidate evidence fails downstream; release/package-consumer/publish steps are skipped. Neither cross-RID nor release-package qualification is proven.

Logs: macOS job 105264286185, Linux 105264286330, Windows 105264286161. Causes and whether they are pre-existing versus regressions have not been established. Do not waive tests, enlarge time budgets, or call these infrastructure-only without evidence.

Local IndexedDB diagnosis — owner handoff, not a merge blocker

The IndexedDB package failure is reproduced locally at the current head, without any production-code changes:

WEBSCENE_NATIVE_ENGINE_TEST_FILTER=indexeddb \
/Volumes/SSD/builds/webscene-spotify-tests/webscene_native_engine_tests
  • Exit status 1; exact failure: WebScene rejected the same-window navigation request at indexeddb-test-origin.js:1. Saved log: /tmp/css-merge-indexeddb-diagnosis-20260917.log. The valid filter is indexeddb, not indexeddb-contract (the latter only reports an unknown filter).
  • In tests/native_v8_runtime_indexeddb_tests.inc, configure_indexeddb_test_origin mutates JavaScript location.protocol, hostname, origin, then href on a newly created engine. Native queue_top_level_navigation validates against the host-established top_level_location_address, which starts at about:blank; changing those JavaScript fields does not establish a native origin.
  • Verified local fixture repair, not committed/pushed: load_indexeddb_test_document now serves fixture-owned empty HTML for the four test origins, and configure_indexeddb_test_origin calls webscene_engine_load_url, then asserts the loaded document marker, location.href, and location.origin. Production navigation/storage code and existing storage assertions are unchanged. The contract passed once immediately and five repeated runs; adjacent navigation-realm and desktop-host-capabilities groups passed, including rejection of cross-origin navigation. These results belong to pre-merge head 4f9c3ba3 plus this local fixture change, not the newly combined main.
  • The current fetched main (aa786c0e) has no differences from this branch in the IndexedDB fixture or compatibility-header files; merely integrating that main does not provide an already-written fix in those files.
  • The repeated-resource failure is not diagnosed yet. Inspect test_process_wide_resource_load_single_flight and load_test_resource in tests/native_v8_runtime_resource_tests.inc; distinguish callback size negotiation/retries and fixture counting from actual duplicate transfers. Do not assume it shares the IndexedDB cause or that the Abseil abort is harmless.
  • Windows oversized JavaScript literal remains unaddressed; any literal-splitting fix must preserve exact script bytes and be qualified with MSVC. Linux timing failures still need representative local/package configuration evidence; no deadline changes are justified yet.
  • The fixture repair is preserved in the current working tree and recovery stash 9a11b261139276529cea5889d36a1382a4b9935f for the IndexedDB owner to inspect/adopt. No production fix or complete cross-platform IndexedDB qualification is claimed. The standalone storage-test target was built but not executed before the user chose to merge. No local diagnostic process remains running at this checkpoint.

2. Objective and invariants

The full scope includes parsing/loading, selectors/specificity/invalidation, cascade/value/inheritance/custom properties, CSSOM, layout, paint/text/images, media/animation/state changes, visual-tree lifecycle, and end-to-end performance. The goal is not merely green microbenchmarks or one fast website.

  • Product-neutral engine fixes; unchanged Spotify and VS Code consumers. No site-specific CSS, selector exceptions, or application patches.
  • Optimize actual calculation/redraw work. No resize throttling, stretched stale frames, deferred resize, or elastic-band workaround.
  • Add browser-referenced WPT-style contracts and native regressions for retained changes.
  • Caches must have demonstrated dependency invalidation and lifetime bounds.
  • Use Chromium source/behavior as a reference, not a shortcut around WebScene correctness.
  • Preserve rejected experiments/timings and exact source/package identities.
  • Do not monitor CI. A one-time completed-check/log inspection was made for the requested merge.
  • Do not duplicate another agent's work; coordinate ownership before touching their implementation paths.

3. What is implemented and verified

The baseline #148 merged at 8ed76241; class-index work #234 merged at 7cd66b3e. #245 contains the follow-up structural lane, not the whole epic.

Stage Commit / evidence What it proves
Compiled structural routes and checkpoint consistency #245 history; workstream report Prepared selector dependency/subject routes; targeted child-list, positional, relational, attribute/ID/dataset, variadic/replacement and text checkpoints; callback/reaction correctness and work counters.
Main integration and emitted immutable metadata 86c83845, docs 170e0cff Fixed the compiler's missing pseudo/host classification fields; parsed/cache/compiled parity. The intermediate 5c727756 SDK was rejected, not qualified.
Match before precedence sorting 6aa01a5c, evidence afe98a0f Sparse cascade sorts six successful matches while candidate population grows 39→1,031; dense matching agrees with the old ordering oracle.
Negative-only pass-local ancestor filtering d95831cc Rejects impossible ancestor tag/ID/class requirements with full-match fallback for collisions; mutation boundaries discard state. At depth 8/64, 128 repeated absent-ancestor queries use zero compound checks plus 9/65 ancestor-summary builds. Not zero total work.
Changed-media subject indexing 09ccb478, qualification 47e84144; report Removes keyed changed-rule × visited-node full matching; preserves universal fallback, pseudo/root/focus cases, activation/deactivation, cascade and geometry. Index construction and DOM traversal still scale.
CharacterData methods 4f9c3ba3; report Five editing/query methods and UTF-16 length share targeted setter checkpoints; conversion/reentrancy/errors/identity/stylesheet/textarea behavior covered.

Latest direct #245 verification:

  • CharacterData contracts 70/70 Chrome and native (23 new +47 existing).
  • Native adjacent slice 329 subtests in ten documents, including a passing pseudo-layout reftest.
  • Cumulative invalidation matrix 172 route cases, including 32 method-transition cases invariant under unrelated growth.
  • Eight stable-text cases: up to 102,400 nonempty method edits, all eight CSS work counters unchanged at zero.
  • Generated bindings 24 interfaces /191 members, certification build, production build, five adjacent native runtime groups pass.
  • These scoped checks do not override the current failed full package jobs.
  • Optional legacy-binding syntax check fails at generated-only attr_template/node_template references in unchanged files. Default generated lane is verified; legacy build/runtime qualification is not.

Accepted and rejected performance evidence

Accepted only for the network-free bounded media fixture: installed-production-SDK serial A/B/B/A, four warmups and 32 measured crossings/process. All 384 geometry checksums agree. Sparse dispatch medians change from 17.8–20.4 ms to 0.51–0.68 ms; dense matching stays around 22–23 ms. This is not a Spotify/Chrome/native-presentation speedup claim.

Live Spotify A/B/B/A runs for matched sorting and ancestor filtering were rejected because of competing host compilation, drift and/or insufficient content equivalence. Preserve those rejections. No accepted evidence yet proves the visible small→large Spotify threshold pause eliminated or beats Chrome at physical resize cadence.

4. Latest qualified SDK and manual demo

  • WebScene source: 09ccb478fccc9f136de4614a06bcbb616191d209.
  • AppScene source: 68a9dbd15e6b02e4bec0a76d5190713868b6517a.
  • SDK: /Volumes/SSD/sdks/spotify-css-media-qualified-r2-20260917.
  • Package/archive SHA256: a339b1baf0eb325cc4f8677c8b2cc29123e95329391962cb7c022b225f8d91a5.
  • Engine archive SHA256: ed8f803cdebf79df189cc93be1a118532ede8cd4a51be56339ea9a76f8c08cbd.
  • Qualification: /Volumes/SSD/builds/spotify-css-media-qualification-20260917/qualification.json.
  • 16/16 producer tests, 2,868-file integrity, pinned compiler/runtime profile, eight relocated read-only source-denied consumer checks pass.
  • Installed Kestrel smoke/parity: 376/298/311 nodes, zero geometry differences.
  • Last launched app: /Volumes/SSD/builds/spotify-media-qualified-demo-20260917/spotify_catalog.app. Revalidate process/window identity before using it; do not assume a recorded PID remains live.
  • Native artwork and circular artist clipping were visually confirmed; header clipping remains.
  • No new SDK/demo was installed for 4f9c3ba3; the manual app does not contain that later API stage.
  • Optional GPU/presentation qualification was not run. Dawn targets macOS 26.5; no macOS 26.0 execution claim.
  • The first non-r2 producer attempt failed a companion-service startup deadline. The unchanged isolated test and subsequent full r2 build passed; no timeout/gate was relaxed.

5. Initial panel investigation history: #258 lifecycle boundary

The original #258 author measured a 512-row /100-cycle workload retaining 2,563 nodes after cleanup. Their local oracle is commit 8deca42d4bfd86d6ce0cc841a8e0a2b72d0cbf64, branch feature/panel-churn-258, reportedly at /Users/wieslawsoltes/GitHub/WebScene-issue-258 on their machine. That commit is not in this local object database, and no matching origin branch was found. Obtain their exact oracle before declaring their failure fixed.

The initial local investigation was test-only and uncommitted. It has since been strengthened into the runtime fix and committed regression in #292 (section 0). Original recovery pointers:

  • experiments/WebScene.NativeEngine.Probe/tests/native_v8_runtime_frame_scheduling_tests.inc: new test_reconnected_panel_subtree_reclamation.
  • experiments/WebScene.NativeEngine.Probe/tests/native_v8_runtime_tests.cpp: focused filter panel-subtree-reclamation and registration in detached-dom-gc.
  • Persistent backup of the current diff: /Volumes/SSD/builds/css-panel-reclamation-investigation-20260917.patch.
  • Source worktree: /tmp/webscene-spotify-probe (macOS canonical path /private/tmp/webscene-spotify-probe).

Findings:

  1. First setup failed because the baseline scene metric was still zero; changed it to wait for a real baseline.
  2. A run retained 2,562 nodes and still reported 2,562 after a forced scene. A diagnostic-only rebuild then reclaimed the same panel; not a deterministic engine-fix result.
  3. The scene-publication wait helper can observe a prior pending scene and return before the cleanup script completes. Requesting low memory then can collect while the JS root still exists.
  4. The local test now waits for script completion before GC. With no engine change and temporary instrumentation removed, 10/10 consecutive runs return baseline=1, idle-after=1.
  5. Logs: /tmp/css-panel-gc-barrier-{1..10}-20260917.log; initial evidence /tmp/css-panel-reclamation-before-20260917.log and /tmp/css-panel-gc-debug-20260917.log.
  6. This establishes a synchronization issue in our first reproducer. It does not prove the original Bound visual-tree churn, idle publication, and memory across panel mutations #258 oracle has the same bug or that all detached-node reclamation is correct.

The previously planned local test improvements are complete in #292: GC notification assertions, populated-snapshot proof, no forced-scene fallback, default-suite/CTest registration, reachable listener/identity checks and idle layout/publication checks. A listener cycle was then reproduced and fixed. Still obtain and inspect the original oracle's execution/GC barriers and full acceptance metrics; do not weaken #258's memory gate or claim it closed from this smaller fixture.

6. Ordered remaining work and ownership

Priority Work / owner Next concrete deliverable
0 #245 merged / owner follow-up Merge complete at 4040058e. Rebuild and verify combined main before new performance claims. IndexedDB owner handles its remaining package failures; local fixture repair is available above. Other failed package gates still require diagnosis/ownership; merge approval did not waive release qualification.
1 #237 structural/lifecycle lane Reconcile #258's exact oracle; finish remaining splitText/normalize and necessary mutation checkpoints. Current CharacterData work does not establish full Range, MutationObserver or processing-instruction pseudo-attribute conformance.
2 #257 separate live form-state owner Reconcile after #245 lands; state model → matcher/dependency invalidation → WPT → bounded/product acceptance. Six retained textarea dynamic-state cases remain Chrome6/native0; do not mark them covered by passing CharacterData tests.
2 #286 separate parsing/resource owner Coordinate integration into currently overlapping CSS parsing/cascade paths. Local oracle 7789039e reports Chrome8/native0; implementation must decode once and preserve escaped-scheme security checks.
3 #238 cascade/value semantics Origins/layers/importance/global keywords/custom-property cycles and fallbacks; investigate retained generated-content unitless-line-height mismatch. Any matched-style reuse requires dependency/lifetime parity.
3 #239 dynamic CSSOM Nested/imported/constructed stylesheet insertion/removal/replacement, detached/reattached owners, rule/declaration identity and refresh.
3 #240 layout and #241 paint Dependency-aware layout-cache profiling and correctness; logical/intrinsic/percentage/positioned/flex/grid/table/control paths; text/glyph/generated-content/stacking/clipping/transform/image parity. No speculative cache.
3 #242 responsive/temporal Remaining media/container/state interactions, transitions/animations and frame-demand cadence. Threshold indexing is implemented, not full responsive acceptance.
3 #256 retained effects Syntax/value first slice merged via #282 (2cf805f1); masks/clips/filters/backdrop painting and visual acceptance remain open.
4 #243/#258 product profiling Obtain original oracle, qualify reclamation/idle/RSS then isolate measured reconnect cost. Explorer/Settings/tabs/Search/Problems/sidebar/bottom-panel shapes, pinned actions and100-cycle restored checks.
4 #244 terminal latency Cold/warm command→prompt phases; separate Node/pty intervals from CSS/layout/scene/publication.
5 #44/#100/#112/#246 and consolidated products Native select/input, Settings/modal and rounded-tab/list acceptance on exact final heads; unchanged Spotify and VS Code geometry/pixels/events/accessibility.
Continuous #236 capability matrix Matrix implementation merged via #271 (aa121fe1); maintain revisioned inventory/denominators and add missing consumer features with owners. Do not reopen a parallel matrix implementation.

#254 and #255 are CLOSED, not planned new implementations: containment/container/content-visibility and accessibility preferences were merged and incorporated through the prior main integration. Revalidate cumulative behavior as other stacks land. #256/#257/#258/#286 and broad #237#244 remain open at this snapshot. Do not use stale issue counts or historical dependency rows as current state.

Completion / release gates still required

  • Exact WebScene/AppScene/WPT/browser/compiler/package identities and explicit pass/fail/skipped/unavailable denominators.
  • Browser/native product-neutral regressions for every retained feature/fix; map to unchanged application scenarios.
  • Initial→mutated→restored computed style, layout geometry, scene commands/pixels, focus/accessibility and event ordering equivalence.
  • Affected versus unrelated DOM/rule growth; counters for matching/cascade/layout/scene/publication, allocations and resident memory.
  • Quiet, content-qualified repeated A/B or ABBA timing; matched semantic work and cadence. Reject noisy runs, do not average them into a speedup.
  • Visible/hidden settled idle CPU and zero-unnecessary-publication budgets; repeated workload live counts return to warmed baseline with bounded retained-memory slope.
  • Physical native Spotify threshold resize and Chrome comparison; no elastic workaround.
  • Exact assembled SDK/package acceptance for unchanged VS Code editor, Command Palette, Settings, Explorer, terminal and panel mutations, accessibility, input latency, visual parity, lifecycle and no-browser audits.
  • All required released-RID/package gates. Current failed NuGet jobs mean this gate is not met.

7. Local resume instructions

Do not start in the ambient /Volumes/SSD/WebScene checkout by mistake.

cd /tmp/webscene-spotify-probe
git status --short
git log -3 --oneline
git stash list
gh pr view 245 --repo SceneTech/WebScene --json state,isDraft,headRefOid,mergeable

Expected at this snapshot: local branch feature/css-optimization-followup-245, pushed HEAD e1f634af, only native_v8_runtime_indexeddb_tests.inc dirty. Recovery stash 9a11b261139276529cea5889d36a1382a4b9935f and existing unrelated stash 3ec44e704c5fe37157064cc617f2542edbb06195 must be preserved. Do not pop, drop or overwrite them. Old panel patches are superseded by #292; do not apply them over the committed implementation. Native and production runtime builds were refreshed against combined main plus #292; artifact hashes are in the report. The test executable includes the unrelated IndexedDB fixture edit, but the focused lifecycle checks do not execute it.

Native test build and focused investigation:

SDKROOT=/Volumes/SSD/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.5.sdk \
DEVELOPER_DIR=/Volumes/SSD/Applications/Xcode.app/Contents/Developer \
cmake --build /Volumes/SSD/builds/webscene-spotify-tests --target webscene_native_engine_tests webscene_native_engine -j 4

WEBSCENE_NATIVE_ENGINE_TEST_FILTER=panel-subtree-reclamation \
/Volumes/SSD/builds/webscene-spotify-tests/webscene_native_engine_tests

WEBSCENE_NATIVE_ENGINE_TEST_FILTER=css-invalidation-scaling \
/Volumes/SSD/builds/webscene-spotify-tests/webscene_native_engine_tests

Other focused groups: detached-dom-gc, wrapper-retention-recascade, custom-element-checkpoints, stylesheet-cssom, textarea-value-lifecycle, dom-traversal-cloning-primitives, media-query-targeted-recascade.

WPT/Chrome:

dotnet run --project tests/WebPlatformSubset/runner -c Release --no-build -- \
  --selection all --test css-character-data \
  --native-library /Volumes/SSD/builds/webscene-spotify-tests/libwebscene_native_engine.dylib \
  --output /tmp/css-resume-character-data

CHROME_BIN='/Volumes/SSD/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' \
node tests/WebPlatformSubset/chrome/run-contracts.mjs \
  --path contracts/css-character-data-methods.html \
  --path contracts/css-character-data-checkpoints.html \
  --output /tmp/css-resume-character-data-chrome

Inspect results JSON: zero matching documents is not a passing gate. Repeated native --test arguments overwrite one another; use a matching substring or separate invocations. Chrome focus contracts require the committed Page.bringToFront harness behavior.

Other paths:

  • Production SDK build: /Volumes/SSD/builds/webscene-css-profile-sdk; NativeWeb contracts: /Volumes/SSD/builds/webscene-native-css-contract.
  • AppScene worktree: /tmp/appscene-pr61, pinned source above; preserve its codec-enabled raster renderer plus main's structured SVG behavior.
  • LLVM: /Volumes/SSD/tools/webscene-toolchain-22.1.8/llvm/22.1.8.
  • Dependencies: /Volumes/SSD/Caches/AppScene/sdk-preview-v2/a2d6ed0ee0114376/dependencies.
  • AppScene producer: /tmp/appscene-pr61/eng/sdk/build.py; producer build /Volumes/SSD/builds/appscene-spotify-integrated-sdk.
  • Always set the full-Xcode SDKROOT explicitly. Do not inherit Command Line Tools SDK selection.
  • SDK producer requires clean exact source revisions and a fresh output directory. Never install into an implicit cached prefix or modify an already-qualified package. The old dependency manifest pins LLVM22.1.1; use the documented22.1.8 source-lock workflow, not weakened validation.
  • Use native UI automation for the actual app and verify executable/window identity; a Spotify browser/native Spotify window is not evidence of WebScene rendering.
  • Debug-live skill was read; DebugMCP connector is unavailable. Investigation used bounded native diagnostics. Temporary GC instrumentation has been removed.
  • No own build/test process remains live from the completed ten-run investigation. Revalidate this instead of trusting a stale session/PID.

8. Evidence and history

Current repository evidence starts at css-invalidation-workstream.md, with per-stage reports and machine-readable records under docs/validation/evidence/. Keep the original reports; their claims are commit-specific.

The following archive is preserved for measurements, rejected attempts and ownership history. Old “current”, unchecked-task, SDK, PR, issue-count and merge statements inside it are historical, not the current handoff.

Historical synchronization record through 4f9c3ba (preserved)

Purpose

Use this issue as the shared synchronization point for current and planned CSS cascade, invalidation, layout, and visual-tree performance work motivated by unchanged VS Code OSS. Keep implementation details in focused issues/PRs, but update the status table and dated history here whenever a baseline changes, a measurement is accepted/rejected, or a PR merges.

The work must remain product-neutral: fixes belong in WebScene behavior, contracts, and benchmarks. Do not add VS Code-specific CSS or application patches.

Scope: all CSS work

This tracker covers every WebScene CSS concern, including:

  • CSS tokenization, parsing, error recovery, stylesheet loading, @ rules, and compatibility syntax.
  • Selector parsing/matching, specificity, pseudo classes/elements, shadow/ancestor dependencies, and invalidation.
  • Cascade origins/layers/order, inheritance, initial/unset/revert behavior, custom properties, and dependency resolution.
  • CSSOM and dynamic <style>/stylesheet/rule/declaration mutation.
  • Specified, computed, used, and resolved values, including getComputedStyle exposure.
  • Box model, logical properties, intrinsic sizing, positioning, overflow, scrolling, flex, grid, table, and form-control layout.
  • Text/font shaping, generated content, decorations, backgrounds, borders, clipping, transforms, opacity, and paint ordering.
  • Media queries, responsive recomputation, transitions, animations, and frame scheduling caused by style changes.
  • Visual-tree creation/reuse/removal, scene publication, allocation, memory, CPU, and latency.
  • Product-neutral WPT/native coverage, microbenchmarks, and end-to-end Chromium/AppScene visual comparison using unchanged VS Code OSS.

New CSS issues and PRs should be linked here even when they are feature or correctness work rather than optimization work.

Coordination rules

  • Fix catalog script and logical sizing compatibility #148 merged on 2026-09-17 at 8ed762413813d46d9a0fa4ed8ec1169d46520304. Use the resulting main baseline for follow-up CSS work.
  • Do not land parallel implementations that duplicate the merged Fix catalog script and logical sizing compatibility #148 compiled invalidation plans, batched cascade ordering, resize/scroll/hover invalidation, or layout fixes. Coordinate the structural/checkpoint follow-up below.
  • Avoid allocations in CSS class index lookups #234 merged on 2026-09-17 at 7cd66b3e35d3d2837d2f174ae92978ee96253fa8; its class-only boundary remained unchanged through cumulative validation.
  • Preserve rejected experiments and measurements here so another agent does not repeat them.
  • Require semantic parity and directly related browser/native tests before merge. Timing claims need repeated A/B or ABBA measurements; noisy timing remains informational.
  • Validate full VS Code visual/performance gates later at the consolidated WebScene/AppScene heads.

CSS feature workstreams

Area Current baseline / next evidence
Parsing and modern syntax #148 covers modern media-query ranges and related catalog syntax. Continue adding WPT cases for every newly accepted grammar and error-recovery boundary.
Selectors and cascade #143 fixed recursive selector-cache lifetime. #148 owns compiled invalidation plans and batched ordering. #234 merged the class-only allocation change.
CSSOM and dynamic styles Preserve product-neutral style/rule/declaration mutation contracts and extend nested/imported/constructed stylesheet coverage as implementations land.
Values and inheritance #148 includes inherited box-sizing, custom-property grid inputs, logical sizing, and cascade work. Add computed/used-value checks with browser references.
Layout #148 owns current logical sizing, responsive grid, scrolling, and catalog layout changes. #112 tracks VS Code Settings/modal layout acceptance.
Paint and retained scene #148 includes retained raster/image/fade and hover behavior. #246/#251 plus AppScene Stack #129 completed the generic structured-SVG implementation; fresh unchanged VS Code tab/list Chromium parity remains. Continue backgrounds, borders, clipping, generated content, text, and paint-order coverage.
Responsive/animated behavior #148 covers media/resize/hover invalidation. Extend transitions, animations, pseudo content, and frame scheduling with bounded cadence tests.
Performance #244 tracks terminal open-to-prompt phase attribution and budgets. Measure selector matching, recascade, layout, visual-tree mutation, scene publication, CPU, allocation, and memory on product-neutral fixtures and unchanged VS Code surfaces.
Validation Expand WPT/native contracts and compare Chromium/AppScene geometry and pixels for editor, palette, Settings, trees, terminal, and panel transitions.

Active stack

Order Work State Boundary / evidence
1 #148 catalog compatibility and compiled CSS invalidation plans Merged 2026-09-17 Final PR head 4a8c8600; merge commit 8ed76241. General optimization follow-up remains incomplete; see current structural work below.
2 #233 / #234 transparent class-index lookup Merged 2026-09-17 PR head 3ff61a3b; merge commit 7cd66b3e. It owns only the class-index container type and class-token lookup allocation removal. Focused native and portable V8 runners passed.
3 #237 / #245 structural invalidation Draft; active implementation Head 4f9c3ba3; main ee6efa9f integrated; owns structural DOM/style checkpoints and structural matching/scaling only. Broader CSS workstreams remain separately coordinated.

Commit-specific validation boundary: Corrected WebScene 86c83845 / AppScene 68a9dbd passes the normal SDK producer, all 16 AppScene native tests, eight relocated read-only source-denied consumer checks, and installed Kestrel smoke + parsed/compiled parity (376/376, 298/298, 311/311 nodes, zero differences). The intermediate merged 5c727756 package failed Kestrel geometry parity because the compiler omitted new rule classification fields; fix and regression are in 86c83845. Documentation head 170e0cff. Manual native Spotify now uses the corrected build and visibly renders artwork. Optional GPU presentation, physical resize/Chrome parity, and header clipping remain open. See the dated integration entry below for scope and rejected attempts.

#148 general CSS optimization workstream — 2026-09-17

This work generalizes the selector/cascade fixes found while exercising unchanged Spotify; it is not a site-specific stylesheet patch. #148 is the merged invalidation baseline; #245 continues its structural subset under #237. The class-index allocation-only boundary of #234 remains unchanged.

Implemented and pushed

  • Compile class/attribute dependencies once into shared immutable rule payloads, including escaped identifiers and recursive functional-selector dependencies. Mutation handling uses feature indexes rather than rediscovering dependencies from selector text.
  • Route class mutations through targeted invalidation, preserving raw [class] dependencies.
  • Coalesce repeated node/attribute transitions while preserving first/final values and synchronous style/geometry checkpoints.
  • Evaluate batched transitions from a coherent pre-batch state, including simultaneous removal of conjunctive selector attributes.
  • Apply ancestor providers before descendant consumers, including inherited custom properties reached through sibling/descendant selectors.
  • Queue toggleAttribute() invalidation before reentrant custom-element callbacks.
  • Add product-neutral WPT-style contracts, parser-plan tests, and a native unrelated-DOM/rule scaling gate.
  • Merge latest main (e8f132f9) into Fix catalog script and logical sizing compatibility #148, resolve conflicts preserving both sides' behavior, and push merge head 1c90b55a2dc765b3111ea9a2d6e8a401be307c39. This is a main-into-PR merge, not a merge of Fix catalog script and logical sizing compatibility #148 into main.

The first compiled-invalidation stage is in 8b835703; the updated integration baseline is 1c90b55a. Local validation after the merge passed 15 focused native test groups, 47 grid WPT checks, and 19 invalidation WPT checks. The changed grid-template-areas contract also passed Chrome. These are local results, not a claim that remote CI passed.

Second stage pushed — 5fc16759

  • Compiled forward/reverse nested-selector routes and inherited disabled/enabled descendant routes.
  • Added counters for compound matching, rule matching, full cascades, and cascade candidates, alongside invalidation traversal.
  • Added a 20-case scaling matrix: descendant, sibling, disabled-control, custom-property-chain, and relational shapes; 8/128 affected targets; 32/1,024 unrelated nodes and rules.
  • Removed a measured quadratic sibling-prefix matching path using pass-local prefix reuse and a sibling index. Caches are reset between old/new states and discarded at pass end; recursive selector lists stay pinned through parser-cache eviction.
  • Fixed single-node appendChild/insertBefore sibling/reparent invalidation exposed by the new tests. A compiled sensitivity flag keeps the ordinary path when structural/sibling selectors are absent. The sensitive case uses a conservative parent-local refresh; finer structural invalidation and other mutation APIs remain work to do.

Validation: certification and production native builds pass. All 20 matrix cases and the original batched invalidation fixture pass. Unrelated DOM/rule growth leaves all seven counters identical. The new contract passes 10/10 in both WebScene and Chrome, including sibling reorder/reparent, CSSOM checkpoints, and recursive selector-cache eviction. The existing invalidation contract passes 19/19; insertion/fragment contracts pass 6/6. Nine adjacent native groups (fragment attach, stylesheet CSSOM, controlled switch, hover invalidation/cache, post-message batching, resize-attribute batching, dimension variables, media recascade), recursive selector-cache tests, and parser tests pass locally.

Measured work, not a timing claim: in the local route-only development variant, 128 sibling targets needed 51,328 compound checks. Pass-local prefix reuse reduces this to 2,560, with unchanged rule/cascade counts and styles. The matrix's CSS counters remain constant with unrelated content, but elapsed time still grows: layout/scene work remains to be profiled. No end-to-end Spotify or Chrome-speed advantage is claimed.

ID/dataset checkpoints and native contract follow-up

  • f1484d9f: ID property/attribute APIs and dataset assignment/deletion now share compiled invalidation and batched checkpoints. ID reconstruction updates both selector identity and the attribute map. Dataset mutations deliver custom-element reactions after invalidation; value-conversion side effects occur before capturing the previous state.
  • New css-id-dataset-checkpoints.html: 7/7 checks pass in both WebScene and Chrome. The initial five tests reproduced stale sibling/relational styles in the previous native implementation; additions cover dataset reactions and reentrant string conversion.
  • Matrix expanded to 28 cases with ID/dataset sibling transitions. Production and certification runs pass; all seven counters remain identical when unrelated nodes/rules grow from 32 to 1,024. At 128 targets, each new shape has 256 candidate visits, 1,028 compound checks, 512 rule checks, and 258 cascades.
  • 4a8c8600: corrected the historical Linux native contract compile failure: tests/NativeWeb/css_service.cpp omitted the new parent box-sizing argument to apply_pseudo_value. Added explicit inherited border/content-box assertions; the independent native_web_css_service target now builds and passes locally with Clang 22 and the selected full Xcode SDK. This is not a remote Linux/package-CI pass claim.

Rejected test assumption: navigating to a missing fragment and subsequently inserting an element with that ID did not make it :target in Chrome. Do not implement the dynamic-state audit using a naïve live ID/hash equality assumption. The checkpoint contract deliberately tests ID selectors, not that incorrect expected behavior.

Current follow-up: structural mutation invalidation — #245 / #237

Ownership boundary: PR #245 is the existing structural-invalidation implementation under #237, continuing #148. It is not a parallel implementation of the whole selector/CSS epic. Its current lane covers compiled child-list routes, DOM mutation style checkpoints, structural matching/scaling and directly related regressions. Further work on general CSSOM (#239), cascade/value semantics (#238), layout algorithms (#240), responsive/animation behavior (#242), or VS Code profiling (#243) must be coordinated with those workstreams before implementation. The terminal-latency (#244) and rounded-background (#246) investigations are separate and untouched.

Pushed implementation 3c315a83; integrated main (including #234) at ba468ff3; positional-index follow-up 8dea62a4. PR #245 is draft. This does not finish #237's broader specificity/matching inventory or the overall CSS optimization plan.

  • Compile child-list routes and per-cascade structural indexes, replacing the conservative parent-subtree fallback.
  • Apply source/destination invalidation to the covered removal, replacement, insertion, reordering and reparenting APIs, including HTML/text setters and fragments.
  • Cover completed-fragment and HTML connected callback style checkpoints, inherited variables and relational ancestors.
  • Fix :empty for comments, empty text and whitespace.
  • Expand the original 19-check baseline (Chrome 19/19, native 3/19) to 50/50 passing in WebScene and Chrome.
  • Expand the native matrix to 48 cases: structural insertion/removal, sibling and ancestor subjects, and empty state alongside previous shapes. All eight certification counters stay identical as unrelated DOM/rules grow from 32 to 1,024, with zero document fallback.
  • Integrated validation: the first stage passed 11 adjacent native groups and parser tests; the positional-index follow-up reran seven adjacent groups and eight WPT-style contracts (98/98). Production build, 48-case semantic matrix and structural contract (50/50) also pass.
  • Add css-positional-sibling-visits to expose scans hidden inside compound matching. The wide 128-target fixture fell from 32,896 to 257 sibling visits using an index confined to one immutable pass; computed styles and other counters are unchanged. The new linear-work assertion fails on the pre-index path and passes with the index. This is an operation-count result, not a timing claim.
  • Disconnected reaction checkpoints pushed in 91d11f14: callbacks now run after the native mutation and structural invalidation, with per-element FIFO ordering for reentrant operations and exception-safe scope unwinding. First registry activation during argument conversion is covered; cold documents make zero begin/end reaction-bridge calls.
  • Expanded contract: 63/63 Chrome and native (production and certification). Six adjacent custom-element contracts, including upstream lifecycle tests, pass 118/118; five adjacent structural/attribute contracts pass 35/35. Seven adjacent native groups, the cold/lifecycle group, and parser tests pass.
  • Expanded 52-case production/certification matrix includes synchronous connected/disconnected callback style reads. All eight CSS counters remain identical with unrelated growth and obey linear component budgets. At 128 callback targets: 512 plan lookups, 384 candidate visits, zero fallback, 1,408 compound checks, 512 rule checks, 896 cascades, 512 cascade candidates, zero positional scans.
  • Structural-rule candidate indexes pushed in 145a9213: group compiled routes and index mandatory outer ID/class/tag/attribute features. Keep universal fallback for functional pseudo arms; exchange/rebuild indexes with cascade state and include their storage in memory accounting.
  • The new keyed structural-rule workload reproduced growth at eight affected siblings from 198 to 6,150 plan lookups, 689 to 21,521 candidate visits, and 866 to 25,666 compound checks, with 32 vs 1,024 unrelated rule families. Indexed results stay at 31 / 54 / 66 at both sizes, with unchanged rule/cascade counts and styles. These are work counts, not an end-to-end timing claim.
  • 76-case production/certification matrix passes: 52 ordinary-rule cases plus 24 structural-rule cases. New regression is included in the normal native suite and scaling filter. Structural contract 73/73 Chrome/native covers key variants and index rebuilds after stylesheet mutations; seven adjacent WPT contracts 48/48, nine adjacent native groups and parser tests pass.
  • Variadic insertion follow-up pushed in cf0dfd03: share append/prepend/before/after conversion, flat fragment expansion, last-occurrence deduplication and viable sibling selection. Argument conversion errors stop native mutation; final source/destination styles precede reactions, including source removals after failed multi-node insertion.
  • New required-profile WPT-style contract initially passed 28/28 Chrome vs 4/28 native; expanded contract now passes 42/42 Chrome/native, including reentrant conversion, Symbols, self/duplicate/repeated-fragment arguments and error checkpoints. Existing structural contract 73/73, adjacent DOM contracts 9/9, custom-element contracts 118/118, seven adjacent native groups and parser checks pass locally.
  • Expanded 100-case production/certification matrix includes multi-argument prepend/before/after. It verifies complete child identities/counts and empty fragments as well as styles. Eight CSS work counters stay identical with unrelated ordinary/structural rule growth, bounded by component size with zero fallback.
  • Replacement checkpoints and matching reuse pushed in 05aa8f12: replaceChildren/replaceWith now share conversion, flat fragment/deduplication, viable-sibling and final source/destination style handling. Initial expanded tests passed 55/69 native vs 69/69 Chrome; final contract passes 79/79 in Chrome and native, including empty replacements, stylesheet removal, lone surrogates, retained-node reactions and focus teardown.
  • The first 116-case matrix exposed repeated sibling-prefix matching despite passing the broad budget: 18,055 compound checks at 128 retained children. A tighter replacement-specific regression fails before the fix. Sharing a matching context only across the completed insertion's immediate subtree cascades reduces checks to 1,799, with unchanged other work counters and computed styles (8 targets: 175 → 119). The context ends before resources/reactions; queued flush handling is unchanged.
  • Final 116-case production/certification matrix and 279 related WPT-style checks pass, plus ten adjacent native groups and parser tests. CSS counters remain identical with unrelated ordinary/structural rule growth, with zero fallback. No end-to-end timing/Chrome-speed or remote CI claim.
  • Character-data checkpoints pushed in 66af2789: data/nodeValue/textContent preserve conversion errors and reentrant effects, nullable semantics and node identity. New required contract passes 47/47 Chrome/native (initial native 15/47).
  • Stable nonempty text edits now avoid structural CSS work: the control's first 1,600 edits caused 8,000 plan lookups, 6,400 candidates, 8,000 compound checks and 3,200 cascades; all eight candidate CSS counters stay zero, including at 25,600 edits. Layout/text and stylesheet activation still run.
  • Production/certification validation passes 140 route cases plus four stable-text cases, 342 related checks, ten adjacent native groups, parser and generated-binding checks. These are local results, not end-to-end timing or CI claims.
  • Finish native child-vector movement profiling and remaining unexposed character-data API coverage. Broader CSSOM, cascade/layout and dynamic-state work stays coordinated.
  • Retained candidate css-textarea-dynamic-state.html passes 6/6 Chrome, 0/6 native: live textarea validity and unimplemented :placeholder-shown require Complete selector matching, specificity, and dependency invalidation coverage #237/Qualify media-query, transition, animation, and style-driven frame scheduling #242 follow-up. These six failures are excluded from the 342 passing checks.

Browser-reference note: the failed-insertion test originally assumed a materialized temporary-fragment parent. Chrome does not expose that parent: its Node implementation deliberately uses a flat worklist. The retained contract checks source removals, style and reaction checkpoints rather than asserting that rejected parent identity. This is not a claim of full DOM insertion conformance.

Replacement focus reference: Chrome rejected an assumed removal-time blur callback; the retained contract requires cleared focus and :focus-within without blur/focusout events, matching its removal handling. This is limited to the replacement paths, not completion of the general focus audit.

Remaining measured cost: one informational production callback-workload sample rose from about 26 ms to 77 ms when unrelated nodes/rules grew from 32 to 1,024, despite identical CSS work counters. The cause is not yet attributed; do not interpret the counter result as an end-to-end speedup. Further cascade/layout profiling must stay coordinated with #238/#240/#243.

All figures above are local evidence. No remote CI success or end-to-end Chrome-speed advantage is claimed. Broader plan items below remain open and must be satisfied through coordinated work, not duplicated implementations.

Resize-stage profiling and harness qualification — 3488758

Production head 66af278 was profiled using the generic resize fixture and live Spotify through the headless Avalonia host. The generic fixture performs about three layouts per resize and its headless timer is near 30 Hz; Spotify’s sampled retained draw exceeds its mean engine resize dispatch. These are diagnostic observations, not AppScene-demo or Chrome-parity evidence. Compact reports and limitations: resize-stage profile.

Corrected an invalid comparison: native previously used a sawtooth while Chrome used a triangle. Native v3 / Chrome v2 record requested bounds and waveform; native comparisons reject missing/mismatched source identities and options. Unavailable production telemetry is null. Headless callbacks cannot pass a physical-presentation/Chrome qualification gate. Three .NET workload tests, three Python tests (18 metadata mismatch/missing cases), native/Chrome/reference smoke runs pass. No engine speedup is claimed.

Follow-up 5e9b0d1: installed the exact pinned LLVM 22.1.8 compiler/config/header closure side-by-side on the local SSD (existing compiler unchanged). Fixed macOS WEBSCENE_LLVM_ROOT propagation into CMake try_compile, with four SDK profile tests and successful full SDK configure. Native SDK build and actual AppScene presentation qualification remain unfinished; no remote CI was monitored.

Ordered implementation and acceptance tasks

  • Extend the implemented descendant/sibling/custom-property/disabled/relational scaling matrix to structural mutations, media/container queries, and further dynamic state. Matching/cascade counters are now implemented.
  • Finish compiled nested-selector/inherited-control relationship routes with correctness tests. Structural child-list routes are now implemented in Optimize structural CSS invalidation and DOM mutation checkpoints #245; its remaining structural audits are listed above.
  • Continue checkpoint consistency across inline-style, remaining DOM/CSSOM, and dynamic-state paths. ID/dataset checkpoints are implemented in f1484d9f.
  • Profile cascade reuse and dependency-aware layout caching. Any retained cache needs invalidation tests for inheritance, custom properties, fonts, and available size.
  • Repeat matched-cadence end-to-end Spotify/Chrome resize profiles, with repeated A/B or ABBA runs and equal semantic work. Keep the unchanged VS Code consolidated validation gates below.
  • Commit and push validated follow-up stages based on merged main; record the follow-up PR, SHAs and measured results here. Coordinate Avoid allocations in CSS class index lookups #234 without overlapping its class-only allocation change.

Performance policy: optimize the cost of recalculating and drawing each correct frame. Do not reintroduce stretched/cached resize frames, delayed-layout “elastic band” behavior, or caches keyed solely by viewport size.

Existing deterministic evidence: the first-stage certification run grew unrelated DOM nodes and unrelated rules from 32 to 1,024, with a fixed component receiving 200 repeated class/attribute mutations. Both sizes recorded 15 plan lookups, 6 candidate visits, and 0 fallback visits. Those are invalidation-planning counters only; they exclude total matching/layout/painting and do not establish a Chrome-speed advantage. The pushed second-stage certification rerun preserves those counts and adds 49 compound checks, 12 rule checks, 7 cascades, and 12 cascade candidates at both sizes; the larger matrix is documented in the linked workstream.

Implementation plan and caveats: CSS invalidation workstream. Existing resize investigation: Spotify resize invalidation.

Completed history

Current class-index evidence

On the bounded 200-refresh fixture, candidate and owned-string control produce identical work:

  • selector-index calls: 52,600
  • root refreshes: 200
  • class lookups: 800
  • result checksum: 8,100
  • temporary owned class keys: 800 -> 0
  • copied class-key bytes: 46,200 -> 0

Chrome and native both pass all three long-class className / classList cascade assertions on merged baseline 8ed76241. Candidate/control targets compile and the final four-block ABBA gate preserves 52,600 index calls, 800 class lookups, 200 root refreshes, and checksum 8,100 while reducing temporary keys from 800 to 0 and copied bytes from 46,200 to 0. Informational p50 improved 0.16%; earlier samples were noisy, so exact allocation elimination and unchanged semantic counters remain the deterministic claim. PR #234 merged as 7cd66b3e after its Native Linux document-contract and portable V8 jobs passed.

Ordered remaining work

Immediate stack

CSS feature backlog

  • Maintain a CSS capability matrix mapping supported syntax/properties/selectors/at-rules to product-neutral tests and implementation locations.
  • Inventory unsupported or partial CSS used by unchanged VS Code after each fresh server build; open focused issues and link them here.
  • Expand selector coverage for structural/state pseudo classes, pseudo elements, combinators, attribute matching, specificity, and ancestor invalidation.
  • Expand cascade coverage for origins, !important, layers, shorthand/longhand interaction, inheritance, custom-property cycles/fallbacks, and global keywords.
  • Expand dynamic CSSOM coverage for insertion/removal/replacement, nested rules, imported and constructed sheets, detached/reattached owners, and computed-style refresh.
  • Expand layout coverage for logical axes, intrinsic/min/max sizing, percentage resolution, absolute/fixed/sticky positioning, flex, grid, tables, overflow, and native controls.
  • Expand paint coverage for text/glyph fallback, decoration, generated content, backgrounds, borders/radii, clipping, transforms, opacity, stacking contexts, and image sizing.
  • Expand responsive and temporal coverage for media changes, viewport resize, transitions, animations, hover/focus/active changes, and frame publication cadence.
  • Add a regression and a bounded performance gate with every retained CSS feature/fix; update this tracker with SHAs, evidence, and disposition.

2026-09-17 gap audit and dependency schedule

The unchanged VS Code CSS inventory and current WPT/native contracts leave five concrete gaps that were not executable tickets. The broad owners remain authoritative; these issues are focused children rather than replacement epics.

Order Issue Concrete gap and ownership Dependency / proposed PR grouping
0 complete #236 / #271 Versioned fail-closed parser/selector/cascade/CSSOM/value/layout/paint/responsive/animation matrix, with pass/fail/skipped/unavailable denominators and revision provenance Merged as aa121fe. Native 32/32; Chrome 25/32 with all seven failures retained; #245 structural files remained untouched.
1 #237 / #245 Structural mutation routes and checkpoints Rebase/reconcile 66af2789 onto current main, rerun the exact Kestrel theme probe and cumulative direct gates, then decide merge. 05aa8f12 evidence is commit-specific.
2A #257 Live form-control pseudo states (:invalid, :placeholder-shown, related IDL state) and bounded invalidation After #245 settles: state model/matcher -> dependency invalidation/cascade -> remaining WPT slices -> perf/product acceptance.
2B #254 contain, container queries/units, and content-visibility used by terminal/chat/survey/workspace panels After #236 inventory; coordinate dependency metadata with #237: syntax/CSSOM -> query layout/invalidation -> visibility paint/accessibility/transitions -> perf/product acceptance.
2C #255 Forced colors/system colors, focus visuals, native-control theme, and host motion/contrast preferences After #236 inventory; may run parallel to #254: media/values -> host publication/invalidation -> control/focus paint -> idle/memory/product accessibility.
2D #256 Masks, filters, clip paths, and backdrop compositing used by xterm/workbench/chat/onboarding After #236 inventory and required #240 geometry: syntax/values -> masks/clips -> filters -> backdrop isolation -> lifetime/perf/product pixels.
3 #258 Retained visual-tree churn, zero-idle publication, and memory stability across Explorer/Settings/editor/search/bottom-panel mutations Build on #243 counters and correctness from #112/#246: workload schema/counters -> browser/native fixtures -> idle/RSS/latency gates -> measured optimizations only.
3A #286 Decode CSS string and url() escapes once before resource resolution Add isolated Chromium/native/WPT and 100k-token/lifecycle gates; parser/cascade implementation waits for #245 ownership reconciliation.
4 #244 Terminal command-to-prompt phases and budgets Reuse #243/#258 counters; keep Node/pty time separate from CSS/layout/scene/publication.
5 #112 / #246 and consolidated release gates Settings/select and rounded tab/Explorer product acceptance Run on exact final AppScene/WebScene heads after relevant focused stacks merge.

No new cascade-layer or general CSSOM issue was created: #238 already owns origins/layers/global keywords/custom-property resolution, and #239 already owns nested/imported/constructed stylesheet APIs and lifetime. No new general animation or layout issue was created: #242 and #240 already own those surfaces; #254/#255/#256 narrow only independently proven gaps.

Cross-cutting release gates

  • Every claim names exact AppScene/WebScene/WPT/browser revisions and reports explicit pass, fail, skipped, unavailable, and total denominators; missing evidence fails closed.
  • Each retained feature has a minimal product-neutral browser/native regression plus the mapped unchanged-VS-Code scenario, with no application stylesheet workaround.
  • Mutation gates compare initial/mutated/restored computed-style, geometry, scene-command, pixel, focus/accessibility, and event-order checksums.
  • Performance gates record affected-work counters, wall time, allocations, scene publications/frames, and peak RSS against unrelated DOM/rule growth; timing claims require repeated A/B or ABBA samples.
  • Settled visible and hidden documents must meet explicit idle-CPU and zero-unnecessary-publication budgets. Repeated panel/resource cycles must return live counts to the warmed baseline without a retained-memory slope.
  • Portable/native and released-RID gates validate the changed behavior before merge; the exact assembled SDK/package reruns editor, Settings, Explorer, terminal, panels, accessibility preferences, visual parity, lifecycle, and no-browser audits.

Native GitHub sub-issues

The epic uses GitHub's native parent/sub-issue hierarchy. The current 33 children are listed below (16 open, 17 closed). Every open child that this VS Code OSS integration will implement or finish carries the vscode-oss/planned label; completed historical children do not.

Open/current

Completed history

PR #148 is the merged baseline but cannot be a native sub-issue because GitHub's hierarchy accepts issues only. Keep follow-up PRs and the #234 disposition current in the Active stack table.

Performance evidence format

For every new result, record:

  1. WebScene base/head SHAs and whether the change is stacked.
  2. Workload shape and iteration count.
  3. Control/candidate ordering, warmups, and sample count.
  4. Semantic counters/checksum proving equal work.
  5. Allocation, cascade, layout, scene, publication, CPU, and memory deltas that apply.
  6. Browser and native contract results.
  7. Decision: retain, revise, or reject, with the reason.

Update history

Native child-vector scaling and main integration — 14ca683

Implementation 7d2e17a adds actual variadic child-vector scan accounting and compacts safe consecutive sibling runs once. At 128 ordinary siblings the control visits 8,256 entries; the candidate visits 128 (replaceWith also removes its receiver: 8,257 → 129). Nested/mixed-parent runs preserve order; active custom-element registries and focused replacement paths retain sequential removal. This is bounded common-path work reduction, not total DOM linearity or a wall-clock/browser-speed claim. The new required contract passes 52/52 Chrome/native, including sparse subsets, duplicates, nested moves, rejected insertion, textarea, focus and reactions.

Merge bc16392 integrates main b81f594. The only conflict was the generated DOM exposure hash; regenerated bindings preserve both main's HTMLAnchorElement and this PR's character-data setters. Cumulative certification and production builds pass all 140 route cases, four stable-text cases, twelve vector cases, the original batched fixture, 410 related WPT checks, ten focused native groups and parser tests. Generated binding checks pass; Chrome passes 131/131 new/existing variadic checks. Retained work report and scope/validation.

Native SDK consumer/compiler qualification passed at 5e9b0d1, but its AppScene Spotify performance attempt is rejected: the page had zero cards/links/images, session startup errors, and the resize driver failed with AXError. Blank-page presentation is not resize evidence. Recorded disposition. The exact installed Kestrel theme probe remains commit-specific to 05aa8f1 and needs a fresh cumulative-head rerun. No CI monitoring or remote CI success claim. Broader CSS work remains open; live form-state failures are now coordinated through #257, not duplicated here.

Interleaved mutation work and startup recovery — 6da8c56

Main 45d7f52 is integrated via e0a5504; combined bindings retain iframe sandbox and character-data behavior (24 interfaces, 185 members). PR #245 is pushed at 6da8c56.

Implementation 5b57af9 compacts each ordinary source parent once even when arguments alternate between parents. At 128 nodes, two-parent scans fall 4,160 → 128; eight-parent scans 1,088 → 128. replaceWith adds one receiver visit. All 36 native scan cases pass; active custom-element/focused-replacement paths remain sequential. The expanded product-neutral contract passes 76/76 Chrome/native. This measures child-vector work, not total frame time or Chrome-speed parity.

Cumulative production/certification pass 140 route cases, four stable-text cases, 36 vector cases and the original batched fixture. Certification WPT: 438/438 checks, 15 documents; production: 443/443, 16 documents including anchor identity. Eleven focused native groups, parser/generated-binding checks and production worker/MessagePort tests pass. No CI monitoring or remote CI result is claimed.

The independent startup correction 94171a3 restores local MessagePort peer reachability across GC: the unmodified native Spotify demo now populates 68 catalog cards. Forced-GC regression fails before and passes after; browser/native contract 3/3. Artwork placeholders and header clipping remain visual blockers, so the populated run is not resize acceptance.

The clean packaged SDK attempt is rejected before qualification because cached Skia 8d2cb51c... / build-argument identity does not match current lock bcd81c64.... Pinned LLVM 22.1.8 and V8 identity alone do not qualify the full closure. No lock/manifest was weakened. The exact installed Kestrel gate remains verified only at 05aa8f1 until the locked dependency set is obtained/built and the cumulative gate reruns. See updated workstream and startup evidence.

Remaining full-plan scope is unchanged: coordinated dynamic-state/container/media/CSSOM/cascade/layout work, dependency-aware caches, remaining structural checkpoints, and matched populated native/Chrome resize acceptance. No duplicated #257 implementation.

Native Spotify integration / breakpoint follow-up — 2026-09-17

AppScene #84 now includes main, is retargeted to main, and restores actual album/circular artist artwork in the installed native demo. WebScene startup/GC and AppScene raster pixel regressions cover the two independent blank/placeholder causes. See integration evidence.

The user’s new recording reports smooth ordinary resizing but a pause after crossing into a very narrow layout and growing again. Profiling is now focused on that transition (media recascade versus responsive DOM/JS, layout and painting), coordinated with #242. No new CSS/media implementation or performance claim has been made from the recording alone; no throttling/stretch workaround or CI monitoring.

Breakpoint recascade matching — c7859be

Breakpoint profiling and bounded optimization pushed at c7859be on #245. The user’s native recording is confirmed by an engine-only Spotify reproduction: media recascade itself accounts for about 315 ms; sampling points mainly to reapplying the affected subtree, not image painting. Reusing the existing pass-local matching context removes repeated positional work: eight siblings 288→8 visits, 128 siblings 128 visits across four transitions. Context ends before matchMedia callbacks. Required repeated-transition/reordering contract passes Chrome/native 2/2; adjacent media-list contract 1/1; five adjacent native groups pass. Chromium testdriver adapter now drives actual viewport changes, not mocked CSS.

Serial production A/B/B/A, 24 measured crossings per variant: median engine dispatch 302.961→235.400 ms (~22% lower), means 315.167→234.250 ms. This is partial progress, not a fixed breakpoint stall or native frame-latency/Chrome-speed claim. The broad subtree cascade remains costly. Previous integrity-qualified SDK/Kestrel evidence is commit-specific to 6da8c56; the candidate development SDK is not release-qualified. The user’s open demo is unchanged. No CI monitoring.

Evidence and rejected diagnostic attempts: https://github.com/SceneTech/WebScene/blob/c7859bec/docs/validation/spotify-breakpoint-profile-20260917.md

Immutable rule classification — 51fef1f

Follow-up pushed at 51fef1f2 on #245: shared candidate matching now reads pseudo kind/exact-host classification from immutable prepared rule payloads and directly matches the already-compiled pseudo origin. Production sampling identified the repeated string classification; no computed-style results are cached across mutations and resize is not deferred.

Fresh serial A/B/B/A uses c7859bec as control: 24 crossings per variant, identical 2,723-element/15-image workload. Median dispatch 226.868→195.708 ms (13.7% lower), means 226.796→192.122 ms. This remains a perceptible breakpoint pause, not a physical-frame/Chrome-speed claim. Normal full-subtree cascade still needs further work.

Local validation: shared native CSS service; Chrome/native CSSOM + shadow replacement contracts 15/15, media contracts 3/3, adjacent attribute/nested contracts 29/29; cumulative certification scaling 140 route cases, four stable-text cases, 36 vector cases and the original batched fixture; focused media, CSSOM, dimension and shadow geometry native groups. Tests use generated-box geometry because the separate getComputedStyle(element, pseudo) API currently ignores its second argument; gap coordinated in #238. No duplicate implementation of #238 cascade semantics or other agents’ lanes.

The development overlay is not a release-qualified SDK and the open manual demo is unchanged. No CI monitoring. Evidence and limitations.

Compiled subject buckets and main integration — 5c72775

Pushed #245 at 5c727756: implementation 9cf764f5 indexes stylesheet candidates from the already-compiled outer subject (mandatory ID/class/tag/attribute), preserving features after pseudos and escaped identifiers. Control at 128 targets visits 4,224→131,200 candidates when unrelated pseudo-prefixed rules grow 32→1,024; candidate stays at 128. Runtime media cascade stays at 130 checks including provider rules. The old engine also fails escaped-class styling; the expanded Chrome/native contract passes and is now required. Functional alternatives without a mandatory outer key retain the general fallback.

Fresh serial Spotify A/B/B/A is timing-neutral: median 194.801→195.292 ms, means 193.622→193.615 ms; no additional Spotify speedup claimed. This does not resolve the ~195 ms breakpoint pause.

Merge 4e9cfd0f integrates main ee6efa9f cleanly, preserving #254 container/containment and #255 accessibility-preference work rather than duplicating it. Combined local validation: 79/79 native contract checks in ten documents, shared CSS service, six focused native groups, eight subject-index transitions + 140 route cases + four stable-text + 36 vector cases + original batched fixture; portable CSS 364/364 on each of .NET 8 and 10. Both 4,096-node/control lifecycle gates pass (100 cycles each), and production SDK build passes.

The packaged/source-denied SDK and populated native Spotify/Chrome presentation gates still need repeating at this merged head. The open manual demo is unchanged, PR remains draft, broader plan remains incomplete, and CI was not monitored. #257 live form-state work remains separately owned. Evidence, rejected attempts and timing limits.

Prepared stylesheet SDK integration — 170e0cf

Pushed #245 at 170e0cff (fix 86c83845). Exact merged-SDK consumer testing found an integration regression in 51fef1f2: runtime parsing set immutable pseudo/host classification, but the UI compiler omitted it from generated stylesheet payloads. The compiler now emits both fields. The old installed compiler fails the new controlled regression; the fixed compiler suite, parsed/persistent-cache/generated stylesheet metadata and scene parity pass. Required generated-text-box CSSOM coverage passes Chrome/native 6/6.

The rejected merged package had Kestrel parsed/compiled geometry differences 41/0/41 across the existing three snapshots. Corrected clean WebScene 86c83845 + AppScene 68a9dbd SDK passes all 16 AppScene tests, 2,868-file integrity, compiler/runtime profile, eight relocated read-only source-denied consumer gates, installed Kestrel smoke and zero-difference parity (376/376, 298/298, 311/311 nodes). The optional GPU presentation suite was not run; the existing Dawn binary targets macOS 26.5, so macOS 26.0 runtime support is not qualified.

The manual native Spotify app has been replaced with the corrected SDK build and visually shows album/circular artist artwork; header clipping remains. A fresh populated engine profile still points to compound matching and candidate sorting, but its 2,726-element/18-image content differs from earlier ABBA and host compilation was active. It is attribution only, not an accepted timing comparison or browser-speed claim. A separate runtime generated-content unitless-line-height mismatch is coordinated in #238. #257 remains separately owned. PR stays draft; full CSS plan and physical native/Chrome resize acceptance remain incomplete. CI was not monitored.

Exact evidence, source identities, rejected attempts and follow-up.

Match before precedence sorting — afe98a0

Pushed #245 at afe98a0f (implementation 6aa01a5c). The shared V8/NativeWeb cascade now deduplicates numeric candidate indices first, matches/filter rules, then sorts only successful ordinary and pseudo matches by existing specificity/source precedence. This follows the ordering-stage pattern checked in Chromium ElementRuleCollector; no new computed-style cache, resize deferral, priority semantics or other agents’ dynamic-state implementation was introduced.

Focused sparse fixture: candidates 39→1,031, precedence-sort entries remain six. This does not eliminate numeric deduplication or selector work. Reversed discovery, duplicate indices, inactive media, pseudo rules and equal-specificity source order pass; dense matching agrees with the previous full-sort oracle. Shared CSS/precompiled stylesheet gates pass, required CSSOM order/replacement contract Chrome/native 7/7, native contract slice 81/81 in ten documents, cumulative certification scaling (140 route cases plus existing subject/child-vector/text fixtures) and six adjacent runtime groups pass. Development SDK Kestrel parity is still 376/376, 298/298, 311/311 nodes with zero differences.

The serial production Spotify A/B/B/A completed 48 measured crossings, all 2,726 elements/18 images. Its timings are explicitly rejected for speedup/regression claims: medians A1 331.242, B1 195.169, B2 288.624, A2 204.940 ms, with concurrent host compilation and large within-variant variation. Do not pool these into a percentage improvement. This stage proves reduced precedence-sorting work, not another accepted Spotify speedup. A quiet, content-qualified timing run and physical native/Chrome acceptance remain open.

Candidate SDK is a development overlay, not a new integrity-qualified package; the open manual demo remains qualified 86c83845. The full CSS goal is still incomplete, #257 remains separately owned, and CI was not monitored. Implementation scope, checks, rejected attempts and raw timing evidence.

Pass-local ancestor rejection — d95831c

Pushed #245 at d95831cc. Added a conservative negative-only ancestor tag/ID/class filter inside existing immutable matching passes. Sibling relations reset requirements; functional-pseudo arms are not treated as mandatory. Hash collisions fall through to full matching, capacity exhaustion disables rejection, and state is discarded before mutations/callbacks. No resize deferral, frame stretching, new cascade semantics, or persistent computed-style cache. Ordinary NativeWeb calls currently have no matching context, so this runtime optimization applies to V8 batch paths, not all NativeWeb queries.

For 128 repeated absent-ancestor queries at depth 8/64, the existing prefix-cache-only matcher performs 137/193 compound checks; the new filter performs zero compound checks but builds 9/65 ancestor summaries and still does mask/cache work. Collision, scope, sibling/functional selectors, XML/case, capacity limits, class/ID mutation and reparenting parity pass. Expanded contract passes Chrome/native 7/7; native contract slice 84/84 across ten documents; cumulative 140-route scaling and six adjacent groups pass. Production build, shared parsed/cache/precompiled stylesheet checks and installed-consumer Kestrel parity pass (376/376, 298/298, 311/311 nodes; zero differences).

Production Spotify A/B/B/A timings are again explicitly rejected for speedup/regression claims: medians A1 190.766, B1 132.511, B2 205.426, A2 312.162 ms. Other host compilation began during the comparison. All 48 measured transitions have 2,726 elements/18 images, but content bytes are not qualified. No own builds/tests or profiler overlapped the timing run. This stage demonstrates less matching work, not removal of the visible pause.

The candidate SDK remains a development overlay. The manual app remains the qualified 86c83845 build; full CSS-plan completion and physical-frame/Chrome acceptance remain open. #257 stays separately owned. CI was not monitored. Design, tests and raw rejected timing evidence.

Indexed media-threshold subjects and qualified demo — 47e8414

Pushed #245 at 47e84144 (implementation 09ccb478). The media-query transition path previously matched every changed rule against every visited element. It now builds a pass-local index from prepared subject keys, preserving original rule IDs, pseudo origins, root/focus handling, universal fallback, full matching and full selected-subtree cascade. No resize deferral/stretching or mutation-lived cache.

A new 16-transition native matrix independently varies affected elements (8/128), unrelated nodes (32/1,024), and unmatched changed rules (32/1,024). At the largest eight-element case, activation checks drop from 1,059,866 to 24; 128-element checks drop from 1,183,106 to 384. Deactivation is 16/256 respectively. Computed styles agree, and matching work is invariant under unrelated growth. Index construction and document traversal still scale with rule features/nodes; universal and dense selector work remains.

The network-free installed-production-SDK benchmark uses identical generated DOM/CSS, four warmups and 32 measured crossings per process. All 384 geometry checksums agree across serial A/B/B/A. Sparse dispatch medians move from 17.8–20.4 ms to 0.51–0.68 ms; the dense matching case stays around 22–23 ms. This result is accepted only for the bounded product-neutral fixture, not as a Spotify/Chrome/native-presentation claim. No own builds/tests overlapped timing; pre/post host snapshots showed no compilers. Direct allocation/RSS and physical-cadence acceptance remain open.

Expanded media WPT passes Chrome/native 4/4; native adjacent slice 86/86, Chrome adjacent 62/62, cumulative 140-route scaling plus existing fixtures, six adjacent runtime groups and shared parsed/cache/precompiled gates pass. Chrome focus tests now activate the headless page through Page.bringToFront after diagnostics proved the inactive-page fixture invalid; the focus assertion remains.

Clean WebScene 09ccb478 + AppScene 68a9dbd SDK at /Volumes/SSD/sdks/spotify-css-media-qualified-r2-20260917 passes all 16 producer tests, 2,868-file manifest, compiler/runtime profile, eight relocated read-only source-denied consumer gates, Kestrel smoke and zero-difference parity (376/298/311 nodes). Its engine archive is identical to the measured candidate. The first producer's existing companion-process timeout failure is retained; isolated and full unchanged reruns passed, without weakened gates. Optional GPU qualification was not run; no macOS 26.0 execution claim.

A fresh native Spotify demo is open from that package with album/circular artist artwork. Header clipping remains. Physical resize timing is not qualified; the user changed the window during the attempted UI check. #257 stays separately owned; remaining structural APIs, cascade/layout dependencies and consolidated product gates keep the full plan open. CI was not monitored.

Implementation, bounded benchmark, raw evidence and SDK qualification.

CharacterData editing checkpoints — 4f9c3ba

Pushed #245 at 4f9c3ba3. This completes the five CharacterData editing/query methods and UTF-16 length exposure in the existing #237 structural-checkpoint lane. appendData, insertData, deleteData, replaceData, and substringData share the text-setter checkpoint, preserving conversion order/errors, reentrant reparenting/data changes, lone surrogates, node identity, empty/relational selectors, connected stylesheet text and textarea default/dirty values. Stable nonempty edits avoid structural CSS work without suppressing layout.

The initial contract passed Chrome and failed native 0/20 before implementation; the final expanded contract passes 23/23 in each engine, plus the existing setter contract 47/47 in each (70/70 combined). Native adjacent verification totals 329 subtests across ten documents, including a passing pseudo-layout reftest. Cumulative scaling passes 172 route cases; all 32 new method-transition cases retain identical eight-counter results as unrelated nodes/rules grow 32→1,024. Eight stable-text cases pass, with up to 102,400 nonempty method edits and zero work across all eight CSS counters. These are deterministic CSS-work assertions, not a wall-clock or Spotify-presentation speedup.

Default generated bindings (24 interfaces/191 members), certification and production builds, and five adjacent runtime groups pass. An optional legacy syntax check fails at generated-only attr_template/node_template references in unchanged files; legacy build/runtime qualification is not claimed. Existing detached-GC tests passing does not resolve the separate #258 retained-subtree oracle failure.

No changes to other agents' #257/#286 implementations, no new SDK/manual app replacement, and no CI monitoring. The open demo remains the media-index qualified package. Remaining splitText/normalize, complete Range/MutationObserver semantics, #258 owner reconciliation, cascade/layout dependencies and physical/native/Chrome resize acceptance keep the full CSS goal open.

Implementation boundaries, checks and exact machine-readable evidence.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    epicTracks a coordinated set of focused issuesvscode-oss/plannedPlanned for the AppScene/WebScene VS Code OSS integration

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions