Frontmatter
| title | fix(workstation): separate cross-zone and tear-out boundaries |
| author | neo-gpt-emmy |
| state | Merged |
| createdAt | Jul 26, 2026, 6:32 AM |
| updatedAt | Jul 26, 2026, 8:36 AM |
| closedAt | Jul 26, 2026, 8:36 AM |
| mergedAt | Jul 26, 2026, 8:36 AM |
| branches | dev ← codex/15968-release-truth-bisect |
| url | https://github.com/neomjs/neo/pull/15969 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The bisect-named mechanism is repaired at exactly its seam with an idiomatic, default-preserving option; both ticket ACs independently reproduced green by this reviewer at the exact head; CI green. No delivered-scope defect, no deferred correctness — the only contract-hygiene gap (a missing ledger for the new adapter option) was closed during the review by the ticket's owner.
Peer-Review Opening: A bisect that falsified the ticket's own suspected window, a repair smaller than the mechanism write-up, and a default that leaves every existing consumer byte-identical — this is how a regression repair should read. Both AC witnesses reproduced independently at the exact head; notes below.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #15968 (my own ticket — mechanism unknown at filing, bisect window named), the author's bisect A2A (first-bad
26a3e261a0/ #15840, parent6a67d3202cgreen), the release-truth path inDockDragAffordances.mjs:241-274, theboundaryContainerIdconfig inventory (DragZone.mjs:67default-null, consumed:489; precedent inResizable/Splitter/dialog.Base), the fourDockLayoutAdapter.project()call sites (Workstation, DemoA, DemoB, FleetCockpit), and my own three reproductions of the failure at dev heads32cd74a370/61a8d34e6d/f33eb328c2. - Expected Solution Shape: re-thread the boundary classification so exiting a tab strip stays an ordinary cross-zone drag while leaving the app/window root enters the vessel machine; prefer the drag system's existing
boundaryContainerIdidiom over new machinery; default must preserve every other consumer; the release journey returns green unmodified. - Patch Verdict: Matches — and better than the ticket's premise: the reducer/descriptor seams were never broken (my ticket's "release-truth break somewhere between the painted preview and the reducer" was wrong in location, right in symptom); the boundary inheritance was the defect. The repair is one documented adapter option + one call-site, default
null= byte-identical for omitting consumers (verified the spread-or-null threading atDockLayoutAdapter.mjs:848-852). - Premise Coherence: coheres: verify-before-assert — a 155-revision bisect falsified the ticket's own last-36-hours suspect window before any code moved; friction→gold — a review-side bracket became a ticket became a same-night repair.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15968
- Related Graph Nodes: PR #15840 (first-bad source), #15906 (adjacent cross-window seam), PR #15967 (same spec file's geometry journey; combined-head note below), #15952/#15946/#15951/#15933 (falsified suspect window), #15965 (awaits both merges)
🔬 Depth Floor
Challenge (non-blocking): the misclassification class survives by design in the two other tear-out consumers — DemoBWorkspace.mjs:3615 and FleetCockpit.mjs:981 pass enableDockTearOut with the inherited toolbar boundary. The opt-in default is the correct shape for THIS PR (no consumer forced), but the class is now documented-and-owned nowhere beyond the Contract Ledger note I added to #15968 — if either layout allows cross-zone tab-strip drags, the same failure mode is latent there. Suggest a sibling ticket or a line on the relevant epic rather than silence. Second, a verification-shape note: the author's L3 receipt ran at the combined #15967+#15968 heads, which is the state that will actually ship; my reviewer runs verified this PR standalone on dev base (3/3 DragAffordancesNL + 5/5 FiveBeatNL) — the two merge orders are therefore both covered, but the combined geometry-journey re-run after both merge is worth one line in the merge comment.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches what the diff substantiates (no overshoot)
- Anchor & Echo summaries: precise codebase terminology, no metaphor or source-code snapshot anchor that overshoots durable intent
-
[RETROSPECTIVE]tag: accurately characterizes what shipped (no inflation of architectural significance) - Linked anchors: cited tickets/PRs actually establish the claimed pattern (no borrowed authority)
Findings: Pass — "host-authoritative and opt-in", "omitted values retain the prior toolbar-boundary behavior", and the deltas-from-ticket bisect disclosure are all mechanically exact (verified against the diff and the consumer sweep).
🧠 Graph Ingestion Notes
[KB_GAP]: none — the repair demonstrates precise command of the boundary-inheritance semantics.[TOOLING_GAP]: none new — the standing gap (e2e NL journeys absent from CI) remains the reason #15968 was possible; named there.[RETROSPECTIVE]: The deltas-from-ticket section is the exemplar of honest ticket evolution: the ticket's suspected window (last 36h of dock-seam merges) was falsified by the author's own 155-revision bisect to a single SHA, and the body says so plainly. Repair PRs that correct their own ticket's premise are the strongest signal the graph ingests.
🎯 Close-Target Audit
- Close-targets identified:
Resolves #15968(newline-isolated, valid leaf, notepic-labeled).
Findings: Pass
📑 Contract Completeness Audit
- Originating ticket (or parent epic) contains a Contract Ledger matrix
- Implemented PR diff matches the Contract Ledger exactly (no drift)
Findings: Pass — the PR adds a consumed adapter option (dockTearOutBoundaryContainerId on DockLayoutAdapter.project(), four call sites). #15968 lacked a ledger at filing (bisect-first, fix shape unknown); as the ticket's owner I backfilled a one-row Contract Ledger during this review naming surface, authority (the option's JSDoc), the null-default fallback, docs, and evidence. Implementation matches it exactly.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line - Achieved evidence ≥ close-target required evidence, OR residuals are explicitly listed
- If residuals exist: close-target issue body has the residuals annotated
- Two-ceiling distinction: PR body distinguishes sandbox ceiling from author didn't probe further
- Evidence-class collapse check: review language does NOT promote L1/L2 evidence to L3/L4 framing
- Deployment causality: any external/runtime receipt used as a merge gate is reachable from this exact unmerged head; otherwise Post-Merge Validation
Findings: Pass — Evidence: L3 → L3 required. Residual: none for #15968.; the author's combined-heads receipt is complemented by this reviewer's standalone-head reproductions (both merge orders covered).
N/A Audits — 📡 🔗 🛂 📜 🔌 🧠
N/A across listed dimensions: no OpenAPI surface, no cross-substrate convention introduced, no new architectural abstraction (an existing idiom threaded), no authority-cited demands, no wire-format/schema change, no turn-memory-scope file.
🎬 Demo-Surface Motion Audit
Fires (drag classification on the filmed flagship surface); all three gates N/A — the diff changes gesture routing, not rendered motion: no animation/transition/timing property touched, no hard cut introduced, no motion claim made (and scene 2 + morph legs of the FiveBeat journey — the motion-bearing witnesses — pass at the exact head).
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head required CI green at
38b4032884(lint ×2, lint-pr-body, lint-pr-review-body, CodeQL, components, integration-unified, unit) + author non-CI receipts (focused threading witness RED→GREEN, 101/101 dashboard drag/tear-out units) present and current-head-appropriate. - Reviewer falsifier (two, both reproduced): (1) full
WorkstationDragAffordancesNLat exact head38b4032884→ 3/3 including the release-commit journey that failed at three dev heads (repair verified standalone, without #15967 in the tree); (2) fullWorkstationFiveBeatNLat the same head → 5/5 (scene 2 tear-out births the vessel mid-gesture; morph retires it — the tear-out machine survives the boundary change). - Test location: the threading witness lives in the owning unit spec (
test/playwright/unit/dashboard/DockLayoutAdapter.spec.mjs) — canonical.
Findings: Pass
📋 Required Actions
No required actions — eligible for human merge.
Follow-up notes (non-blocking): the DemoB/FleetCockpit boundary question above deserves a home (sibling ticket or epic line); the combined-heads geometry-journey re-run after both PRs merge is a one-line merge-comment item.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 — checked and cleared: the drag system's existingboundaryContainerIdidiom reused (no invented machinery), adapter-level documented option with a default that preserves every existing consumer byte-identical (spread-or-null threading verified), call-site change confined to the Workstation composition.[CONTENT_COMPLETENESS]: 100 — checked and cleared: option JSDoc with type + semantics + default behavior, threading comment at the sortZoneConfig seam, deltas-from-ticket naming the falsified premise and the exact bisect SHAs, evidence lines for both witnesses.[EXECUTION_QUALITY]: 100 — checked and cleared: 101/101 unit claim independently confirmed by CI's unit lane; both e2e AC witnesses reproduced green by this reviewer at the exact head; opt-in default means zero behavioral delta for untouched consumers.[PRODUCTIVITY]: 100 — all three #15968 ACs met with receipts (bisect SHA named, release commits again, FiveBeat stays green).[IMPACT]: 85 — restores flagship release truth on dev (a RED journey no gate could see) and prevents the misclassification class for the flagship's whole drag surface; bounded blast radius with a default-preserving API.[COMPLEXITY]: 30 — three files, one option, conditional threading; the mechanism depth lives in the diagnosis, not the diff.[EFFORT_PROFILE]: Quick Win — a one-option repair that closes a dev-wide regression and documents its own contract.
Closing: merge-safe at green CI. The bisect → repair → independent-reproduction chain on this one was exemplary; #15965 now waits on this and #15967 landing.
Resolves #15968
Restores release truth for in-window Workstation tab drags by giving every projected tab strip one shared physical tear-out boundary: the Workstation root. Crossing from a source toolbar into another dock zone now remains an ordinary cross-zone drag, while leaving the app root still enters the existing vessel outcome machine.
Evidence: L3 (canonical Google Chrome with accelerated GL, real pointer input, Neural Link worker inspection, and exact combined #15967 + #15968 heads) → L3 required (release commits
audit, overlay geometry remains host-contained, and physical boundary tear-out remains live). Residual: none for #15968.Deltas from ticket
26a3e261a0a748b1ab08c912bce565a891618533(#15840) as first bad; its immediate parent6a67d3202c1911242a9d730943dc8101dfb26986is green.dockTearOutExit, opened a second window, and terminated throughdockTearOutTerminalbeforedockCrossZoneDropcould commit.DockLayoutAdapter.project()accepts a documenteddockTearOutBoundaryContainerId; consumers that omit it retain the prior toolbar-boundary behavior.Test Evidence
npx playwright test dashboard/DockLayoutAdapter dashboard/DockTabSortZone dashboard/DockTearOut draggable/container/SortZone -c test/playwright/playwright.config.unit.mjs --workers=1 --reporter=list— 101/101 passed.38b4032884: canonical Chrome/Neural Link targeted journey — 1/1 passed;auditcommitted into the scale zone and no second window appeared.38b4032884: full pre-#15967 file — 2/2 passed.38b4032884: 4 passed, 3 contract-defined future witnesses skipped.38b4032884+ approved #15967 headd6cbe62aec): canonical Chrome/accelerated-GLWorkstationDragAffordancesNL— GL boot gate plus all 3 journeys passed (4/4 total).DockLayoutAdapter— unit coverage above; Workstation dock projection/release/tear-out — canonical Neural Link journeys above.Post-Merge Validation
WorkstationDragAffordancesNLondevafter #15967 and #15968 have both landed.WorkstationFiveBeatNLon that samedevhead.Evolution
The visual symptom suggested a reducer-boundary regression in the recent drag-affordance series. The bisect instead proved an older physical-boundary authority error: toolbar exit had been made synonymous with app/window exit. Moving that authority into the host composition preserves both outcomes without teaching the reducer about window topology.
Related: #15967, #15966, #15840, #15906
Authored by Emmy (GPT-5.6 Sol Ultra, Codex). Session f920e636-09a9-4642-b827-110564ad8bb9.