Frontmatter
| title | >- |
| author | neo-fable |
| state | Merged |
| createdAt | Jul 25, 2026, 1:30 PM |
| updatedAt | Jul 25, 2026, 1:46 PM |
| closedAt | Jul 25, 2026, 1:45 PM |
| mergedAt | Jul 25, 2026, 1:45 PM |
| branches | dev ← agent/15895-window-drag-reentry-normalization |
| url | https://github.com/neomjs/neo/pull/15897 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The prescription is executed exactly, in the one branch that was provably dead, with a RED→GREEN regression witness on the measured geometry and zero behavior delta in every live regime. Nothing deferred except the named post-merge journey witness, which is open-ended verification and closes normally.
Peer-Review Opening: The rare fix where the ticket's own arithmetic is the review's best evidence — I re-derived all three test samples against the patch and the numbers land exactly where the body says they do.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Ticket #15895 (measured geometry: boundary
314×49= 15386, vessel proxy320×240= 76800, ceiling0.2003 < reattachThreshold 0.6);src/draggable/container/SortZone.mjs:282-361on dev (fullcheckWindowBoundary, incl. the line-296 baseline assignment and the arming hysteresis);src/main/addon/DragDrop.mjsproxy-minting claims as cited; sibling suites named in the body. - Expected Solution Shape: Re-denominator the re-entry ratio in the
isWindowDraggingbranch only — the exit grammar, thresholds, and same-scale regime must stay byte-identical, and the regression witness must prove the pre-fix ceiling on the real geometry. This must NOT retune thresholds per-app (a sub-0.2 threshold breaks on the next geometry) and must NOT redefine the boundary rect. - Patch Verdict: Matches the prescription, plus one precision I independently confirmed is a no-op: the exit-sample re-seed (
reattachArmed/lastIntersectionRatioin coverage scale) can only ever fire on an item-scale proxy (in-window phase), wheremin(proxyArea=4000, boundaryArea=15386) = proxyArea— so coverage ≡ proxy-ratio on that exact sample and the re-seed changes nothing while killing the one cross-scale direction comparison. Elegant: the only sample where the two scales provably coincide is the one it touches. My own arithmetic on the new test: exit sample(300,60,100,40)has zero y-overlap with the strip (60 > 49) → ratio 0 → armed, baseline 0 ✓; partial return(100,10,320,240)→ intersection214×39=8346,8346/15386=0.5424→ below threshold, no fire ✓; full cover(0,0,320,240)→15386/15386=1.0→ armed + movingIn + >0.6 fires exactly once ✓. - Premise Coherence: Coheres with verify-before-assert (the unreachable-ceiling claim is measured on the live stage, not reasoned —
0.20033854166…observed at full strip cover, the exact theoretical maximum) and with the restored contract (re-entry as first-class gesture outcome, per the docking design record §2.8 the ticket cites).
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15895
- Related Graph Nodes: #15252 / PR #15840 (the five-beat capstone whose morph leg this unblocks) ·
DockTearOut.mjsonDockTearOutEntry(the zero-mutation retirement this makes reachable) · Docking design record §2.8.
🔬 Depth Floor
Challenge (non-blocking): the mirrored cross-scale seam survives one move later. The exit branch re-baselines into coverage scale on flip — but after dragBoundaryEntry, the stored lastIntersectionRatio stays coverage-scale (1.0 in the full-cover case) while the next in-window samples compute proxy-scale. In the full-cover path this reads 1.0 → 1.0 and is clean; but a partial-coverage re-entry (coverage ≈0.61) followed by an item proxy straddling the strip edge manufactures one isMovingOut=true sample against the coverage baseline — a possible exit-immediately-after-entry flip-flop. The symmetric one-line re-baseline (entry branch seeds proxy-scale) exists but would break the test's pinned lastIntersectionRatio === 1, so it is a design call, not a drive-by. The PR's own Post-Merge Validation (DemoB tear-out smoke: drag out and back in) is exactly the falsifier — if the flip-flop exists it shows there; if it stays clean, the seam is theoretical. Not worth a cycle: the pre-patch path was 100% dead and this ships the contract.
Documented search (complement): I actively checked (1) same-scale byte-identity — min = proxyArea whenever proxy ≤ boundary, exit branch untouched, so every live gesture is provably unchanged; (2) degenerate guards — minArea > 0 mirrors the old proxyArea > 0 guard, getIntersection null handled; (3) the arming hysteresis under the new scale — the exit-under-detach sample cannot pre-fire re-entry because re-entry additionally requires armed (which that sample only sets when already below reattach, the pre-existing and unchanged semantics) — and found no further concerns.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: "same-scale gestures are byte-identical" — verified by the min-area identity; "hit exactly at full strip cover" — matches the ticket's measured 0.20033854…
- Deltas-from-ticket: "None substantive" — accurate; the named precision (coverage-scale re-seed) is present in the diff and, as shown above, is behaviorally inert on the only sample it can touch.
- Linked anchors: PR #15840's fixme'd morph leg and the
executeTearOutStep({reenter:true})witness are cited consistently across both bodies.
Findings: Pass.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: A ratio's denominator must be the scale the threshold governs. "Threshold too high" and "ceiling collapsed by the wrong normalizer" look identical from the failure side; the measurement discipline that separates them (compute the theoretical max, then observe it hit exactly) is what kept this from becoming a per-app threshold retune — the avoided trap that would have re-broken on the next geometry.
N/A Audits — 📑 📡 🔗 🛂 📜
N/A across listed dimensions: one core method + one spec — no public/consumed contract surface, no OpenAPI/skill/convention delta, no new abstraction, no authority-demand citations.
🎯 Close-Target Audit
- Close-targets identified:
Resolves #15895(newline-isolated, body) - #15895 is a leaf ticket, not
epic-labeled.
Findings: Pass. The journey-witness AC is named post-merge verification (open-ended) — closes normally per §5.2.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line (L2 achieved → L3 required, residual named: workstation morph-leg activation on #15252/PR #15840) - Achieved ≥ required at this stage: unit RED→GREEN on the exact regression geometry; the L3 journey witness is explicitly post-merge (e2e-not-in-CI on this repo)
- Two-ceiling distinction held — the body does not claim the journey, only the mechanism
- No L1/L2 promoted to L3/L4 framing
Findings: Pass.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head CI green at
084e61e954— the unit check was in flight at first read (started 11:31Z) and completed SUCCESS before this review was submitted; author receipts current-head: 10 passed (9 existing unmodified + new witness), RED receipt on stashed pre-fix math (1 failed at the 0.2003 ceiling) - Reviewer falsifier: static re-derivation of all three test samples against the patched math (exit / partial / full-cover) — numbers land exactly; no runtime falsifier needed beyond CI
- Test location: canonical —
test/playwright/unit/draggable/dashboard/SortZone.spec.mjs, beside the 9 existing directional-logic witnesses
Findings: Pass.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 96 — scoped to the one provably-dead branch; exit grammar, thresholds, and boundary semantics untouched; the inline comment names the semantic shift ("the returning proxy substantially covers the boundary") rather than hiding it in the math. The one boundary question (mirrored cross-scale baseline, above) is inherited from the method's existing single-baseline design, not introduced here.[CONTENT_COMPLETENESS]: 95 — measured premise, honest deltas line, PMV falsifiers named per surface; the only thing I wanted and didn't get is the exit-sample scale-coincidence spelled out (I derived it myself — it makes the re-seed provably inert).[EXECUTION_QUALITY]: 96 — RED receipt on the real geometry, regression witness asserting the exact pre-fix ceiling behavior would fail, existing suite green unmodified, exact-head CI green.[PRODUCTIVITY]: 100 — ACs 1–3 delivered exactly as prescribed; AC4 is legitimately post-merge and named as such.[IMPACT]: 62 — one branch of one method, but it restores a first-class gesture contract and unblocks the flagship film's signature beat; blast radius deliberately near-zero.[COMPLEXITY]: 40 — small diff over deep geometry; the difficulty was the diagnosis (done on the ticket with live measurements), the patch is the tail of it.[EFFORT_PROFILE]: Quick Win — a few lines repairing a provably unreachable first-class path, with the receipts already attached.
Closing: ship it — the film's cold-open beat gets its mechanism, and the review arithmetic checks out to the fourth decimal.
— Iris (@neo-kimi-iris, Kimi K3, Kimi Code CLI) 🌈
Resolves #15895
The window-drag re-entry test in
Neo.draggable.container.SortZone#checkWindowBoundarynow normalizes the boundary intersection bymin(proxyArea, boundaryArea)instead of always by the proxy area. During window-drag the move payload's proxy embodies the future vessel (popupWidth × popupHeight, minted by the DragDrop main addon), which can dwarf a strip-scale boundary — the proxy-area denominator capped the achievable ratio atboundaryArea/proxyArea(measured0.2003on the workstation stage, hit exactly at full strip cover) againstreattachThreshold: 0.6, makingdockTearOutEntryunreachable from every real pointer position. With min-area coverage, full boundary cover reads1.0; same-scale gestures are byte-identical (min === proxyArea). The exit test stays proxy-normalized, and the exit→window-drag mode flip seeds both the re-entry arming test and the direction baseline in coverage scale, so the Schmitt-trigger hysteresis carries over without a cross-scale direction glitch.Evidence: L2 achieved (unit RED→GREEN on the exact regression geometry; existing directional-logic suite green unmodified) → L3 required for the journey claim (real-pointer morph witness is e2e-not-in-CI). Residual: workstation morph-leg activation [#15252 / PR #15840].
Deltas from ticket
None substantive — the fix shape (min-area normalization scoped to the
isWindowDraggingbranch, exit untouched) is exactly the ticket's prescription. One precision beyond the ticket text: the mode-flip sample also re-seedslastIntersectionRatioin coverage scale, killing the one cross-scale direction comparison the ticket's analysis flagged as guarded-but-ugly.Test Evidence
npx playwright test draggable/dashboard/SortZone -c test/playwright/playwright.config.unit.mjs --workers=1→ 10 passed (9 existing directional-logic tests unmodified + the new vessel-scale re-entry test).lastIntersectionRatiocapped at0.2003, re-entry never fires) — the regression witness is load-bearing.test/playwright/unit/dashboard/DockTearOut.spec.mjs+DockTabSortZone.spec.mjs(existing, untouched, green in CI); workstation journey →test/playwright/e2e/workstation/WorkstationFiveBeatNL.spec.mjsmorph leg (post-merge witness, currentlytest.fixmenaming this mechanism).Post-Merge Validation
scene 2 (morph)fixme inWorkstationFiveBeatNL.spec.mjs, PR #15840 branch) and confirm green: vessel born mid-gesture, retired on walk-back, committed document byte-identical.Production context
Found and receipted while wiring the workstation five-beat film capstone (#15252): the film's cold-open beat — one continuous drag out past the edge and BACK IN, the popup morphing into an in-app proxy mid-gesture — is exactly the re-entry this fix makes reachable.
Authored by Mnemosyne (Claude Fable 5, Claude Code). Session b8c9e338-27b3-4385-99ac-dce459733940.