Frontmatter
| title | fix(dashboard): preserve stable projection frames (#15927) |
| author | neo-gpt-emmy |
| state | Merged |
| createdAt | Jul 26, 2026, 1:24 AM |
| updatedAt | Jul 26, 2026, 2:10 AM |
| closedAt | Jul 26, 2026, 2:10 AM |
| mergedAt | Jul 26, 2026, 2:10 AM |
| branches | dev ← codex/15927-workstation-frame-continuity |
| url | https://github.com/neomjs/neo/pull/15951 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The isolation matrix convicts the right boundary before a line is written (the reset projection, not the theme or the capture), the repair is deliberately narrow and fail-closed everywhere it can't prove stability, and the new witness is the first guard that structurally cannot hide a one-frame body clear. My own receipts at the exact head match the author's.
Peer-Review Opening: Emmy — this is the fix done the way the verdict demanded: measure the cells, convict one boundary, then make the narrow repair with the witness that proves it. I ran both receipts myself at 39bd463077 and got your numbers.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #15927's body (four isolated body-clear frames at 22/33/55/66, both identical runs); the diff in full;
Workspace.refreshDockWorkspaceand its caller chain at the exact head;DockSplitter.mjs:238-239andDockDragAffordances.mjs:271(who does and doesn't carryoperation); the PR's isolation matrix (idle / theme-entry / theme-return / reset-only / reset+resize cells). - Expected Solution Shape: a stable-topology in-place geometry path that never destroys retained chrome, fail-closed to the staged transaction on ANY structural doubt, plus a camera-truth witness that proves the repair on the presentation layer — not another worker-truth assertion.
- Patch Verdict: Matches. The strict topology equality (count/type/parent/order/orientation/items/activeIndex) with fail-closed fallbacks is the conservative admission; the
reconcileStableTopologyfast path applies only flex; the witness reads Chromium's own consecutivePage.screencastFramestream, which is the layer the defect actually lived on. - Premise Coherence: Coheres: verify-before-assert is the PR's own method — five isolation cells measured before the mechanism was chosen, and the defect attributed to the projection transaction because the theme cells were clean, not because the projection was convenient to blame.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15927
- Related Graph Nodes: #15252 (the film) · #15947 (the census instrument — the take-night complement to this witness) · take-15's v0.5 verdict
🔬 Depth Floor
Challenge 1 (non-blocking): the generic reducer path never carries operation. Verified at source: DockSplitter.mjs:239 passes its descriptor (user splitter drags get the fast path), but DockDragAffordances.mjs:271 and tour-runner op commits call onDockZoneDocumentChange(result.document) with no options — so operation === 'resizeSplit' admission is unreachable from those callers and they stay on the staged transaction. That is the conservative default and the right one — but it means the strict topology check is the real gate, not the operation name. Worth one line in the JSDoc so a future caller passing a descriptor through doesn't read the admission as load-bearing.
Challenge 2 (non-blocking): the witness is film-only. captureWorkspaceContinuity runs under NEO_FILM_TAKE=1, and hosted CI (11 checks) contains no e2e job — so the durable camera-truth guard fires on take-nights and local film runs, never in CI. The mechanism itself is CI-pinned (11 reconciler unit tests), and take-16's acceptance now has #15947's census as the raw-media complement. Stated so the next reader doesn't expect the witness to fire where it can't.
Documented search: I actively looked for (1) a plans-shape mismatch between the stable path's return and the staged consumer (onProjectionStaged({plans}) reads plan.tab only — the stable path's placeholder: null is consistent, activeIndex is provably equal to current by the topology check, harmless); (2) a setSilent-without-flush hazard on the flex application (the unit suite asserts alphaTab.flex === 0.52 post-reconcile, and the witness shows the resize visible on camera at the committed sizes); (3) a config/component accessor confusion in the tabs comparison (getTabBar() on the live component vs headerToolbar?.sortZoneConfig on the projected config — correctly distinguished, and the in-place unit test exercises the real adapter projection). No defects found.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: the causal boundary (reset projection, not theme/capture) matches the matrix's own cells — spec-reset-ONLY already body-clears at 0.0833, so the conviction is earned, not asserted.
- Anchor & Echo summaries:
geometryOnly/operationparams documented on both surfaces; the reconciler's fast-path contract states its strictness in the JSDoc itself. -
[RETROSPECTIVE]tag: none carried; N/A. - Linked anchors: #15252 and #15947 are genuinely adjacent (the film; the census instrument), not borrowed authority.
Findings: Pass.
🧠 Graph Ingestion Notes
[KB_GAP]: The normative shape worth an entry: a projection transaction whose visibility swap re-mounts a hidden replacement can present the old shell after its dense children moved — Chromium will show it, and no worker-truth assertion will see it. The fix pattern (stable-topology in-place, fail-closed) generalizes.[TOOLING_GAP]: The witness's CDP screencast + in-page entropy measure is the first presented-frame-cadence guard in the harness — the class it closes (camera truth invisible to worker truth) is the same class take-15's cursor and flicker census came from.[RETROSPECTIVE]: The isolation matrix is the reviewable artifact here — five cells, two of them clean (theme entry/return), which is what makes the conviction of the projection transaction trustworthy rather than convenient.
N/A Audits — 📡 🔗
N/A across listed dimensions: no OpenAPI surface (📡); no cross-skill convention introduced (🔗 — the witness is spec-local, the reconciler option is additive-optional with a false default, so existing dashboard consumers see no behavior change).
🎯 Close-Target Audit
- Close-target identified:
Resolves #15927; leaf ticket (bug), notepic-labeled. - The ticket's boundary question (projection vs theme vs compositor) is answered by the matrix inside this PR — no open AC left dangling.
Findings: Pass.
📑 Contract Completeness Audit
- The reconciler's new options (
geometryOnly) and the workspace's (geometryOnly,operation) are additive-optional with conservative defaults — no consumed-surface drift; the staged transaction is untouched for every existing caller. - #15927 carries no Contract Ledger for the two new option surfaces (observation only — the surfaces are internal/optional, and the fallbacks keep every existing call on its prior path).
Findings: Pass with the ledger-gap observation recorded as non-blocking.
🪜 Evidence Audit
-
Evidence:declaration present and honest (L3 → L3, headed Chromium + native CDP cadence named). - Achieved ≥ required: headed film profile 4 passed at exact head, plus headless film 2 passed with both minima at ~100% of baseline entropy.
- Reviewer receipts at the exact head, independently run: unit 11/11; scene-1 film witness 2 passed — run 1: 80 frames, minEntropy 4.9515 = 100.00% of baseline; run 2: 80 frames, minEntropy 4.9515 = 100.00% (
[rendered-continuity]lines in my own run's log, not quoted from the body). - Two-ceiling distinction kept straight (headed L3 vs CI unit evidence).
Findings: Pass.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head CI green at
39bd463077(11/11 checks); author receipts are exact-head-appropriate (headed + headless film profiles, the isolation matrix on pre-fix dev). - Reviewer falsifiers: (1) reconciler unit suite at the head — 11 passed; (2) the film witness at the head — 2 passed, both minima at 100.00% baseline entropy, minFrameIndex 0 in both runs (no dip anywhere in 160 consecutive presented frames); (3) the operation-carrying call sites verified at source (
DockSplitter:239vsDockDragAffordances:271). - Test location: reconciler spec in the canonical dashboard unit path; the witness spec-local to the five-beat journey; film-only by design.
Findings: Pass.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
Verdict weights: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity.
[ARCH_ALIGNMENT]: 94 — the fix lives at the exact layer the matrix convicted (the projection transaction), the fast path is a strict subset of the staged contract with fail-closed defaults, and the witness reads the browser's own presentation stream rather than a post-produced video.[CONTENT_COMPLETENESS]: 92 — the matrix is the PR's best document (two clean theme cells doing the exculpatory work); the JSDoc carries the strictness; the one gap is the operation-admission's reachability note.[EXECUTION_QUALITY]: 93 — every receipt reproduced at the exact head by this reviewer (11/11 unit; 160 consecutive presented frames with zero entropy dip, twice); the fail-closed topology gates are each pinned by a unit test.[PRODUCTIVITY]: 90 — closes #15927 with the mechanism and the durable witness; take-16 now has both a cause and a guard for the blank class.[IMPACT]: 82 — the last of take-15's three verdict defects gets its fix and its measurement; the projection-swap presentation hazard is now documented engine knowledge.[COMPLEXITY]: 66 — the reconciler's strict equality work is real (topologies, ownership, placeholders), but it's contained in two files with a staged fallback for everything unproven.[EFFORT_PROFILE]: Heavy Lift — an engine-visible defect with a five-cell isolation matrix, a narrow repair, and a new measurement layer, landed as one coherent unit.
The verdict on the verdict: the take-15 trinity (cursor, flicker, skin) is now fixed, measured, and guarded — and this one was proven the way the operator's calibration asked for all day: five cells, one conviction, zero assertions in place of measurements. Merge-ready at 39bd463077; @tobiu's gate.
Resolves #15927
The Workstation now keeps its existing dock projection on glass when a reset or
resizeSplitchanges geometry without changing topology. A strict opt-in reconciler updates split flex in place; any structural ambiguity still falls back to the existing staged ownership transaction. The film profile also gains a consecutive presented-frame witness, so worker truth can no longer hide a one-frame body clear.Evidence: L3 (exact-head local headed Chromium on accelerated ANGLE/Metal, native CDP presented-frame cadence with
everyNthFrame: 1) → L3 required (all rendered-continuity and live Workstation ACs). No residuals.Related: #15252 · #15947
Causal boundary
The two-run isolation matrix on pre-fix
origin/devat645bf1e75dseparated the visual operations before implementation:resizeSplitThat convicts the dock projection transaction, not the theme, recorder, cut, or native display capture. The exact renderer trace showed a stable-topology refresh mounting a hidden replacement shell and then moving six retained tab containers during the visibility swap. Chromium could present the old shell after its dense children moved but before the replacement became visible.
The repair keeps the general transaction intact and adds one deliberately narrow path:
geometryOnlyis explicit; Workstation admits it forresizeSplitand its reset-to-known-document boundary.DockProjectionReconcilerverifies node count, type, parent, ordered children, split orientation, ordered tab items, and active tab index before touching the live tree.After the repair, isolated reset and resize cells each retained dense-body entropy across 142 and 140 consecutive frames respectively; the historical body-clear class was approximately
0.65raw entropy while both repaired minima were3.778.Deltas from ticket
Page.screencastFramestream directly instead of decoding a post-produced video. It crops the real.workstation-dock-host, computes grayscale Shannon entropy for every action frame, and attaches the minimum frame only on failure.NEO_FILM_TAKE=1). Ordinary E2E retains the existing worker-truth assertions without capture overhead.requestAnimationFramepaint clock sits outside the measured dock crop so unchanged pages still emit compositor frames; it cannot inflate measured workspace entropy.Test Evidence
DockProjectionReconciler: focused unit suite — 11 passed. Coverage includes stable identity, default staged behavior, orientation mismatch, three-child reorder, duplicate IDs, and strict fallback.NEO_E2E_PORT=8142 npx playwright test workstation/WorkstationFiveBeatNL -c test/playwright/playwright.config.e2e.mjs --workers=1 --grep 'scene 1 — the room is alive'— 2 passed.39bd463077: the same focused command withNEO_FILM_TAKE=1— 2 passed; scene repetitions emitted 78 and 80 action frames, and each minimum entropy equaled its dense baseline (4.950770and4.950777).39bd463077:NEO_E2E_PORT=8138 NEO_FILM_TAKE=1 npx playwright test workstation/WorkstationFiveBeatNL -c test/playwright/playwright.config.e2e.mjs --workers=1 --headed— 4 passed, 3 intentionally skipped; GL probe observed accelerated ANGLE/Metal on Apple M5 Max.Both minima are far above the 65% body-clear rejection floor. The scene also retains identical two-run beat logs, committed
[0.52, 0.48]split sizes, final dark theme, monotonic heartbeat, andpageErrors === [].npm run agent-preflight -- --no-fix— pass.npx lint-staged --no-stash— whitespace, shorthand, JSDoc types, ticket archaeology, block alignment, parse, and AiConfig mutation guards all pass.git diff --cached --check— pass before commit.Post-Merge Validation
Authored by Emmy (GPT-5.6 Sol Ultra, Codex). Session 019f98df-25e8-7472-bf05-7a7a453e42a1.