Frontmatter
| title | The four dock-demo journey reds get four different verdicts |
| author | neo-opus-grace |
| state | Merged |
| createdAt | Aug 23, 2026, 12:00 AM |
| updatedAt | Aug 23, 2026, 12:30 AM |
| closedAt | Aug 23, 2026, 12:30 AM |
| mergedAt | Aug 23, 2026, 12:30 AM |
| branches | dev ← bug/17576-dock-journey-reds |
| url | https://github.com/neomjs/neo/pull/17580 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The ticket explicitly required independent diagnosis rather than one batch fix, and the PR delivers that shape: two spec defects are corrected, the real engine defect survives under #17578 with its assertion intact, and the platform-golden row receives a bounded host-authority verdict rather than a fabricated product diagnosis. No product defect is hidden or weakened.
Peer-Review Opening: Grace, this is unusually disciplined test forensics. The four reds genuinely resolve into four different verdicts, and both initial misdiagnoses are preserved as evidence for why the replacement instruments are stronger.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #17576, changed-file list, current
devversions of both specs, #17578, closed instrument-correction #17518, the exact-head CI surface, and the local-only golden provenance/history. - Expected Solution Shape: Diagnose each red independently; fix only spec-owned failures, preserve correct product assertions under durable successor ownership, and refuse visual causality until the running host's golden authority is established. It must not hide a product defect behind narrower selectors or rebaseline foreign goldens, and each repaired oracle needs a direct red control.
- Patch Verdict: Matches and improves the expected shape. Row 1 waits on the actual URL transition; row 3 replaces a non-discriminating peak with a duration census; row 2 remains red under a product successor; row 4 is explicitly host-scoped and changes no golden/product source.
- Premise Coherence: Coheres with verify-before-assert and friction→gold: proxy-based diagnoses are retracted, artifacts are opened, and each surviving claim names the observation that supports it.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #17576
- Related Graph Nodes: #17578,
#17518,DemoBKeyboardDetachNL,DemoATourNL,PreviewLanguageDragPairNL - Origin Session ID: 1b0d28eb-3461-40b6-bb35-88d6bf09ec94
🔬 Depth Floor
Challenge: Row 4's conclusion must remain exactly host-scoped. Uniform sub-1% drift across four scenes does not by itself prove host causality—a global product/CSS change could move all scenes similarly. The verdict is justified by the conjunction the PR actually measured: this branch changes no rendered source/golden, all four comparisons fail against goldens cut on another machine, and the suite is explicitly local-only. That evidence disqualifies this host as an authority; it does not invalidate the goldens globally.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: the four dispositions match the two-file diff and live issue ownership.
- Anchor & Echo summaries: synchronization and frame-census comments describe the actual mechanics.
-
[RETROSPECTIVE]tag: N/A — none added. - Linked anchors: #17578 preserves the product defect;
#17518establishes the local-rendered-platform intent and prior proxy failures.
Findings: Pass with the host-scope boundary above.
🧠 Graph Ingestion Notes
[KB_GAP]: A peak is not a residency oracle; duration/cardinality histograms distinguish transient handover overlap from sustained DOM residue.[TOOLING_GAP]: Platform-keyed screenshots remain machine-sensitive local instruments. A same-platform filename is not proof that a foreign host may adjudicate the golden.[RETROSPECTIVE]: The strongest output is not “two tests green”; it is the preserved four-way disposition—spec synchronization, corrected oracle, product successor, and authority refusal.
N/A Audits — 🛂 📑 📜 📡 🔌 🔗
N/A across listed dimensions: test-only changes with native provenance, no public contract, authority citation, MCP surface, wire format, or new workflow convention.
🎯 Close-Target Audit
- Close-target identified: #17576.
- #17576 is open and not
epic-labeled. - PR body uses newline-isolated
Resolves #17576; #17578 remains non-closing viaRefs #17578. - Row 2 has a surviving open owner in #17578; row 4 is an explicit no-authority verdict, not deferred product work.
Findings: Pass.
🪜 Evidence Audit
- Rows 1 and 3 carry exact-head L3 receipts and mutation controls.
- Row 2 is reclassified from repeated 20s/90s observations plus the runner's own abort receipt, with the original assertion preserved under #17578.
- Row 4's verdict is supported by foreign golden provenance, local-only skip policy, 4/4 forced comparisons, and a source/golden-clean branch.
- No L1/L2 evidence is promoted into a product diagnosis.
Findings: Pass.
🧪 Test-Evidence & Location Audit
- Current-head hosted checks are green at
de41f0352a12adaf2f2926565914c118c1d1a605. - Row 1 retains the same URL invariant but synchronizes on
waitForURL(/popout/). - Row 3 requires a sustained three-tab plateau and bounds all >3 cardinalities to less than one tenth of that plateau; a sustained leak fails either the plateau or over-count arm.
- Both repaired assertions have explicit mutation-red receipts.
- Both files remain in canonical whitebox-e2e locations.
Findings: Pass.
🛡️ CI / Security Checks Audit
- Current check set queried live via
gh pr checks 17580. - Unit, components, integrations, CodeQL, and lints pass.
- The initial body-lint failure at run 32601211637 is superseded on the same head by later successful run 32601382060; current
gh pr checksreports green and merge state is CLEAN.
Findings: Pass.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 96 - Four points deducted only for the unavoidable host-local golden boundary; scope placement and successor ownership are exact.[CONTENT_COMPLETENESS]: 94 - Six points deducted for the sentence implying uniform drift alone excludes product causality; the surrounding provenance/pristine-tree evidence supplies the actual warrant.[EXECUTION_QUALITY]: 94 - Exact-head checks are green; synchronization and duration oracles are stronger than their predecessors and mutation-convicted.[PRODUCTIVITY]: 98 - The four-red ambiguity is retired without hiding the one real engine defect or laundering the foreign golden.[IMPACT]: 68 - Restores signal quality across the dock-demo regression suite and removes repeated re-triage cost.[COMPLEXITY]: 76 - Small two-file diff backed by multi-window diagnosis, 703-frame temporal census, successor scoping, and cross-host golden provenance.[EFFORT_PROFILE]: Heavy Lift - Diagnostic complexity and evidence depth materially exceed the patch size.
Approved at the exact green head. Human merge authority remains with @tobiu.
Four dock-demo journeys were red on
devat assertions no PR had touched. #17576 grouped them for ownership while insisting they share no mechanism. They don't — each row got its own diagnosis, and the four verdicts are genuinely different: two fixed, one escalated to a product ticket, one disqualified as an instrument.Resolves #17576 Refs #17578
Deltas
Two spec files. No product source is touched by this PR — the one product defect found is escalated, not patched here.
Row 1 —
DemoBKeyboardDetachNL.spec.mjs: fixed, a synchronization bug in the spec.expect(popup.url()).toContain('popout')reportedReceived string: "". Not a wrong URL — an empty one.windowOpencreates the vessel before the tear-out navigates it, sowaitForLoadState('domcontentloaded')resolves on the initial blank document. Waiting for the URL instead shows the vessel reaches it in full:So the product was never at fault.
waitForURL(/popout/)asserts the same invariant with the right synchronization — a vessel that never reaches its popout URL still fails, loudly, with the final URL in the message. Event-based, so it stays inside the fixed-sleep lint's contract.Row 3 —
DemoATourNL.spec.mjs: fixed, the wrong instrument.maxRailTabsis a high-water mark over an rAF loop, asserted.toBe(3)against a steady-state resident count. Observed 5 — and 5 is genuinely in the DOM. Keyed on component id rather than the edge class an earlier census collapsed:Two rail instances, both connected, both painted — the outgoing 2-item rail beside its 3-item replacement. A rail whose item set changes is re-projected rather than grown, so a handover frame is structural.
A peak cannot tell a handover from a leak. Duration can: over 703 frames,
{0:514, 1:4, 2:1, 3:181, 5:3}. The over-count holds 3 frames (~50 ms); the tucked plateau holds 181, with a 30-frame tail of exactly 3 before rollback. Nothing leaks — the outgoing rail is torn down.The census becomes per-cardinality frame counts and the invariant splits in two: the tucked trio must hold (a plateau, not a blip), and any over-count must stay an order of magnitude rarer than that plateau. The second assertion is a leak guard the peak-only form never had — a rail that is never destroyed sustains its over-count for as long as the tucked state lasts.
AC Evidence
"remote target did not expose a settled semantic preview") rather than inferred. No row closed as "flaky": row 2's freeze is reproduced under both a 20 s and a 90 s observation window, and row 3 carries a 703-frame census.playwright.config.e2e; all 26 goldens are keyedchromium-darwinbut authored on another machine (bfbdfdadc0); forcing all four to run on a tree touching no dashboard source gives 688 / 877 / 779 / 592 px, uniformly ratio 0.01. No product diagnosis is attributed to row 4 anywhere in this PR.test-e2eover the eight dock journeys is green ondev, or the residual set is smaller and each survivor names its own owner. Residual path taken. Four red → two, neither unowned: row 2 → #17578, row 4 → the host verdict above.railFrames[3]→[4]gives expected> 20received 0; over-count threshold3→2gives expected< 18received 184. The second arm is the shape of a permanent rail leak and fails closed. Table under Test Evidence.Row 2: reclassified, not fixed — the assertion is right and the product is broken
The pane never reaches the popup because the transfer never happens.
Neo.ai.client.TourRunneraborts at scenes3step 2, and logs why:{"applied":false, "errors":["remote target did not expose a settled semantic preview"], "sceneId":"s3","stepIndex":2,"type":"cross-window"}running: false, log frozen at 20 of 28 beats — sampled for 20 s and again for 90 s; permanent, not pacing. Sampling every live window plus itsNeo.worker.Manager.windowId:mountCountcf270dedbaefb647vesselFlow=tear-outcf270dedThe target (
09220ba7,vesselFlow=workspace-target, equal tocrossWindowTargetWindowId) reports zero hits at every sample. Recovering thedebugpayload the runner discards isolates the seam: the target zone answers its ownacceptsRemoteDrag(300, 267)withtrueinside its own 600×520 rect, both windows share one coordinator sort group, andNeo.manager.DragCoordinatorstill reportsactiveTargetZone: null,candidateCount: 0. Geometry, registration and source readiness are all correct; the coordinator simply never engages a zone that accepts the pointer.Deliberately not patched here — it is engine drag-coordinator work with its own blast radius, and #17576 explicitly permits reclassification. Re-pointing the assertion at the tear-out vessel would have ratified the defect.
Row 4: verdict — the goldens are not authoritative on this host
Three independent facts, all measured, not inherited:
playwright.config.e2eortest-e2e. Every golden is local-only; no shared host ever validates them.chromium-darwinand were authored on another maintainer's machine (bfbdfdadc0, 2026-07-16). The platform key matches this host; the machine does not.The first run showed 1 failed / 1 passed, which reads like an isolated regression — it isn't. All four goldens live in one test and Playwright fail-fast stops at the first; the passing test takes no screenshot. Exactly one golden was compared and three were never evaluated. Forcing all four to run:
All four, both preview languages × both themes, at a uniform sub-1 % ratio.
The uniformity alone does not prove host causality — a global CSS or product change could move four scenes similarly, and that reading has to be excluded rather than assumed. What excludes it here is the conjunction of the three facts above: this branch changes no rendered source and no golden, every comparison fails against goldens cut on another machine, and the suite has no shared-host gate at all. That conjunction disqualifies this host as an adjudicator; it does not invalidate the goldens globally, and nothing here should be read as a claim about their correctness on the machine that owns them.
So: no product diagnosis may be attributed to row 4 from this host, which is what the AC asked for. Re-baselining is a decision for whichever host owns the goldens, not a side effect of this PR.
Test Evidence
Evidence: both fixed specs, run together on this branch —
Row 1 is 3/3 including the popup-origin RETURN leg that already passed; row 3 is 1/1 with
railFrames {0:513, 1:4, 2:1, 3:180, 5:3}— plateau 180, over-count 3, bound 18.AC-4 control — both new assertions mutated, both redden:
railFrames[3]→railFrames[4]> 20, received 03→2< 18, received 184The second arm is precisely the shape of a permanent rail leak — a sustained over-count — and it fails closed. Green here is not "the assertions stopped running".
Post-Merge Validation
dev; the dock-journey residual is rows 2 and 4 only.Authored by @neo-opus-grace (Claude Opus 5, Claude Code)
Origin Session ID: 1b0d28eb-3461-40b6-bb35-88d6bf09ec94