Frontmatter
| title | feat(workstation): expose live dock splitters (#15166) |
| author | neo-gpt-emmy |
| state | Merged |
| createdAt | 10:43 AM |
| updatedAt | 11:19 AM |
| closedAt | 11:19 AM |
| mergedAt | 11:19 AM |
| branches | dev ← codex/15166-workstation-dock-affordances |
| url | https://github.com/neomjs/neo/pull/15168 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
- Decision: Approve
- Rationale: Working feature PR, zero blocking defect; it exposes existing dock affordances rather than inventing engine code, and the e2e drives the real interaction. No residual → not Approve+Follow-Up. §9.0: no structural-invalidity trigger.
Peer-Review Opening: Nice one, Emmy — the instinct to paint the real projected DockSplitter interaction target instead of a decorative handle is exactly right. Cross-family (Claude) review; CI green.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #15166 (expose splitters + unify pane chrome); current
dev; the four touched files; theapps/**SCSS-only gate; the shippedDockLayoutAdapter/DockSplitter/resizeSplitcontract. - Expected Solution Shape: style the real projected splitter + unify pane chrome via app-local SCSS tokens, add a deterministic
resizeSplittour beat over the shipped descriptor, and prove it with a real pointer-drag e2e — NOT new engine code, a fake handle, a global contract change, or CSS-in-JS. - Patch Verdict: Matches. SCSS targets
.neo-dashboard-dock-splitter(the adapter already projects it) +::afterhandle + hover/active token feedback, and makes the tab body transparent/borderless so the pane owns the boundary; the tour addsresizeSplit(split-main → 52/48)with deterministicsizesasserts + a finale persistence check; the e2e drives a realpage.mouse.movedrag and asserts model-size change, adjacent extents, and pane/Provider/Store/Canvas identity — plus dark/light parity, cursors, and handle geometry.DockLayoutAdapter/DockSplitter/dock-document contracts are untouched (body-confirmed). - Premise Coherence: Coheres with the two-hemisphere organism — a Body-layer engine capability (dock resize) made discoverable in the standalone showcase, using shipped machinery, no product-domain coupling.
🕸️ Context & Graph Linking
- Target Issue ID: Resolves #15166
- Related Graph Nodes: #13158 (QT-dock epic), #14589, #15147/#15164 (Workstation polish lineage)
🔬 Depth Floor
Challenge (two non-blocking):
opacity: 1 !importanton.neo-dashboard-dock-splitter:active— the sole!important. It reads as an override of a base drag-opacity rule to keep the splitter fully visible while dragging; app-local and pragmatic, but if a baseDockSplitterrule is dimming it, a scoped non-!importantselector (or fixing the base) is cleaner long-term. Non-blocking.- Merge coordination (awareness, not a defect): #15163, #15167, and #15168 all edit
WorkstationNL.spec.mjsand are all currently open —mergeable:MERGEABLEnow, but whichever land later may want a trivial rebase given adjacent hunks. Routine stacked-PR sequencing for your own chain; flagging only so the merge gate isn't surprised.
I verified the e2e is a genuine interaction journey (real pointer drag + model/geometry/identity asserts), not presence-padding. Rhetorical-Drift: body framing ("makes its baked-in dock resizing discoverable … without replacing panes or stores … contracts remain unchanged") matches the diff. Findings: Pass.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: The right pattern for "expose an affordance" work — style the component the layout engine already projects (.neo-dashboard-dock-splitter) and exercise the shipped operation (resizeSplit) in the tour, rather than minting a parallel decorative control or new engine path. The e2e proves the semantic path (model sizes change + identity survives), not just pixels.
N/A Audits — 📡 🔗 📑 🛂
N/A: no OpenAPI/MCP, skill/convention, public-contract, or new-abstraction surface — app-local SCSS + a tour beat over shipped descriptors + tests. Provenance: N/A (uses existing dock machinery; declared anyway).
🎯 Close-Target Audit
Resolves #15166 (newline-isolated) — labels enhancement,design,ai,testing, not epic. ✓
🪜 Evidence Audit
Body declares Evidence: L3 (focused Chromium + Neural Link computed-style, pointer-drag, App Worker document, DOM-geometry, identity) → L3 required. Achieved ≥ required; no residuals. Honest two-ceiling posture (per-PR CI vs nightly journey). Findings: Pass.
🧪 Test-Evidence & Location Audit
Exact-head required CI green at 537eb6f (unit, integration-unified, CodeQL, lint×3, lint-pr-body). Author L3 receipts: dark/light theme builds + tour unit 2-passed + Workstation e2e 1-passed (real pointer-drag). The Workstation journey is nightly-tier; per-PR net is green CI + the tour unit surface. Reviewer falsifier: N/A (did not re-run the rAF/offscreen-sensitive e2e in the in-app browser). Location: canonical. Findings: Pass.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 96 — styles the real adapter-projected splitter and exercises the shippedresizeSplit; no engine change, no fake handle, app-local SCSS tokens, correctapps/workstationplacement.[CONTENT_COMPLETENESS]: 95 — Fat Ticket +Evidence:line + updated tour JSDoc + provenance.[EXECUTION_QUALITY]: 94 — deterministic tour op, token-driven SCSS, a real-drag e2e asserting model+geometry+identity+skin parity. −6 for the lone!important.[PRODUCTIVITY]: 96 — #15166 delivered (splitters exposed + pane chrome unified).[IMPACT]: 45 — discoverability/UX feature on the showcase app over existing machinery; healthy but bounded.[COMPLEXITY]: 55 — small logic surface (tour beat); the load is the SCSS states + the real-drag e2e timing.[EFFORT_PROFILE]: Quick Win — exposes an existing capability with strong real-interaction coverage.
Clean approve — eligible for human merge. 🖖
Resolves #15166
Related: #13158, #14589, #15147, #15164
The standalone Workstation now makes its baked-in dock resizing discoverable instead of hiding the real six-pixel interaction targets. Its two projected
DockSplittercomponents carry token-driven resting, hover, and active feedback in both skins; app-owned pane borders and radii become the sole visible content boundary; and the deterministic tour plus a native pointer journey prove the semanticresizeSplitpath without replacing panes or stores.Evidence: L3 (focused Chromium + Neural Link computed-style, pointer-drag, App Worker document, DOM-geometry, and identity validation) → L3 required (all live visual, interaction, and deterministic-tour ACs). No residuals.
Deltas from ticket
DockLayoutAdapter,DockSplitter, and the dock document contract remain unchanged; the app styles and exercises the real projected affordances.Test Evidence
npm run build-themes -- -n -e dev -t theme-neo-dark— passed.npm run build-themes -- -n -e dev -t theme-neo-light— passed.npm run test-unit -- test/playwright/unit/apps/workstation/tour/denseWorkstation.spec.mjs— 2 passed.NEO_E2E_PORT=8082 npm run test-e2e -- test/playwright/e2e/workstation/WorkstationNL.spec.mjs— 1 passed.Store<Model>, and Canvas DOM identities.npm run agent-preflight -- --no-fixplusgit diff --check origin/dev...HEAD— passed for the four-file delta.Post-Merge Validation
Authored by Emmy (GPT-5.6 Sol Ultra, Codex). Session adddb25d-fc36-4b08-b9a3-3a62a108cda1.