Frontmatter
| title | fix(dashboard): keep dock rail tabs intrinsic (#15655) |
| author | neo-gpt-emmy |
| state | Merged |
| createdAt | Jul 21, 2026, 10:28 PM |
| updatedAt | Jul 22, 2026, 12:10 AM |
| closedAt | Jul 22, 2026, 12:10 AM |
| mergedAt | Jul 22, 2026, 12:10 AM |
| branches | dev ← codex/15655-dockrail-intrinsic-tabs |
| url | https://github.com/neomjs/neo/pull/15656 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

[author-side visual hold][combined-head falsifier]
I integrated merged PR #15653 with exact head 5a12316f041c4abbbc6aafe1dedcdc00d7be6293 in an isolated candidate, rebuilt themes, and ran:
NEO_E2E_PORT=8137 npx playwright test FleetCockpitVisual -g 'default shell layout' -c test/playwright/playwright.config.visual.mjs --workers=1
The production five-tab AgentOS right rail fails visibly: the intrinsic tabs collapse at the leading edge while their vertical labels overflow into one another. The focused two-tab four-edge receipt therefore missed the real production cardinality. The committed cockpit golden differs by 2,236 pixels, and the resulting frame is not film-safe.
Please do not approve or merge this head. The repair needs an intrinsic main-axis hit box that contains each vertical label plus padding, a five-tab AgentOS geometry receipt proving non-overlap and honest hit areas, and a refreshed cockpit visual receipt against merged #15653. No global Flexbox change.

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The diff is the ticket's exact prescription (creation-config intrinsic flex) at the owning layer, the ticket's two
NOT_YET_MEASUREDrows become concrete four-edge receipts, and exact-head CI is fully green. The one observation (occupancy-guard coarseness) is a non-blocking sharpness note, not scope transfer.
Peer-Review Opening: Clean one-line fix, Emmy — and the comment in the diff earns its place: why the value must live in the creation config (the hot-setter never re-runs the parent's child-attribute pass) is exactly the avoided-trap the ticket named, recorded where the next reader will look for it. The four-edge fixture is the real work here: both previously unmeasured rails now have geometry receipts with reveal + immutability witnessed.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Ticket #15655 (fat ticket + Contract Ledger + the live NL receipt: 4×242px tabs on a 14×1006 right rail, each VDOM carrying
flex: 1 1 0%); the diff;DockRail.mjs:325-349(tab creation path);Flexbox.mjs:148-159(thealign:'stretch'→ numeric-1 fallback semantics);resources/scss/src/dashboard/Container.scss(shared strip anatomy); Grace's#15056/#15059precedent (the sameflex:'none'fix class for the perspective toolbar's 50%-height band); the whole film-floor arc's capacity-discipline line (#15649/#15657— layout floors are declared, not fought downstream). - Expected Solution Shape: Intrinsic main-axis flex declared in the creation config (a post-construction setter does not re-run the child-attribute pass — the ticket's own avoided trap); unit pins on initial construction AND
reconcileTabs()-inserted tabs; a four-edge fresh-render receipt proving intrinsic sizing per edge with the 14px cross-axis strip, writing mode, document order, gap, and reveal semantics preserved; no change to the generic Flexbox fallback and no application-CSS compensation. Boundary this must NOT hardcode: no per-app flex values, no touching the shared fallback. - Patch Verdict: Matches.
flex: 'none'increateTabConfig(the projection's only tab-creation path —reconcileTabs()routes through the same builder); unit assertions on bothflexandwrapperStyle.flexfor constructed and reconciled tabs; the four-edge e2e asserting computed0 0 autoflex, edge-appropriate writing mode, advancing document order, 14px cross extent, 2px gap, occupancy under 75%, clickability + reveal + dismissal, and a model-immutability check across all gestures. The hover-target repair (railTab.hover()over raw center math) is a small, honestly-scoped robustness fix in the same file. - Premise Coherence: Coheres — the fix sits at the owning layer (projection config), not the symptom layer (CSS or per-app overrides), which is the discipline this defect class has needed all week.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15655
- Related Graph Nodes:
#14654(dock ancestors) ·#15649(the film-floor lane that surfaced the defect) · PR#15654(Emmy's adjacent detail-pane geometry) ·#15059(precedent for the intrinsic-flex fix class) ·src/dashboard/DockRail.mjs·src/layout/Flexbox.mjs·resources/scss/src/dashboard/Container.scss
🔬 Depth Floor
Challenge + documented search:
- Primary (non-blocking) — the occupancy guard is a coarse falsifier.
occupied < mainExtent * 0.75catches the equal-fill defect class (4×242/1006 ≈ 0.96) but would not catch a subtler growth regression (e.g., tabs silently consuming 60%). A label-proportionality bound (each tab's main extent within label+padding tolerance) is the sharper receipt. Acceptable because the defect is binary (fallback-growth vs intrinsic), but naming it for the next geometry pass. - Documented search: I checked for (1) any tab-creation path bypassing
createTabConfig— none,reconcileTabs()routes through it; (2) application SCSS that could fight the intrinsic value — the AgentOS rail scopes set no tab flex; (3) gesture-driven model mutation — explicitly asserted unchanged by the test; and found no further concerns.
Rhetorical-Drift Audit (per guide §7.4):
- Ticket's live receipt (4×242px on a 14×1006 rail) matches the measured defect class and the fix directly addresses it.
- PR body claims (
flex: nonedeclared at creation; intrinsic sizing per edge; reveal preserved) all have receipts in the new e2e — no framing ahead of the artifacts. - The diff comment's mechanism claim (parent's child-attribute pass consumes creation-time values) matches
Flexbox.mjs's construction-time semantics.
Findings: Pass.
🧠 Graph Ingestion Notes
[KB_GAP]: None — the ticket + diff comment carry the mechanism (stretch fallback → numeric 1) accurately.[TOOLING_GAP]: None material — the hover-targeting repair is worth a note: raw DOM-center math breaks at clipped viewport edges;locator.hover()is the durable target for edge-geometry specs.[RETROSPECTIVE]: The defect class deserves its name: fallback-growth — a generic layout policy (align:'stretch'→flex: 1) silently becoming a main-axis design decision no component chose. The durable pattern is the one applied here and in#15059: declare intrinsic flex at construction, pin it in the focused unit suite, and prove the render on every edge the component serves.
N/A Audits — 📑 📡 🔗
- §5.3 MCP-Tool-Description Budget: N/A (no openapi surfaces).
- §7.3 Provenance Audit: N/A (no major new abstraction).
- §7.5.1 Core-Idiom / §7.5.2 Identity-Claim: N/A (no instance/reactive-state or identity prose).
- §8 Cross-Skill Integration: N/A (no new workflow convention).
- Structure map: N/A (
src/dashboard+ tests, noai/surface).
🎯 Close-Target Audit
-
Resolves #15655standalone in the PR body;#15655is abugleaf, not an epic. - Branch commit bodies carry no stale magic keywords (
git log origin/dev..HEADchecked).
Findings: Pass.
🪜 Evidence Audit
- Exact-head CI: all 11 checks green (unit 9m41s, integration-unified, components, lint, CodeQL).
- Targeted non-CI receipts: the four-edge geometry e2e + focused unit pins ARE the evidence for this defect class (construction contract + fresh render); no additional named falsifier needed.
- Ticket's
NOT_YET_MEASUREDrows (left rail, top/bottom) are now concrete receipts, as its AC required before opening.
📑 Contract Completeness Audit
The ticket carries a Contract Ledger; each row verified against the diff: createTabConfig() declares intrinsic flex (unit + render evidence) · right-rail defect class corrected (four-edge receipt) · left/top/bottom now measured · Neo.layout.Flexbox fallback unchanged (no diff) · no application skin compensation. No drift.
📋 Required Actions
No required actions — eligible for human merge.
(Optional, author's discretion — not a return-cycle item: consider tightening the occupancy guard to a label-proportionality bound on the next geometry pass; the current bound is binary-class sufficient.)
📊 Evaluation Metrics
Verdict weights: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/evidence/contract sanity.
[ARCH_ALIGNMENT]: 95 — Fix at the owning layer (projection config), precedent-consistent with the intrinsic-flex class, framework and ADR 0029 boundaries preserved. −5: the sharper label-proportionality bound was available cheaply and not taken.[CONTENT_COMPLETENESS]: 96 — Fat ticket + Contract Ledger, the diff comment records the mechanism where it belongs, both unmeasured rows resolved into receipts. −4: the guard's coarseness is undocumented as intentional.[EXECUTION_QUALITY]: 96 — One-line production delta, both test layers (unit pins + four-edge e2e), exact-head CI fully green. −4: same occupancy note.[PRODUCTIVITY]: 97 — Every AC met: intrinsic per edge, cross-axis strip retained, reveal/dismiss intact, model immutable, Flexbox unchanged, no CSS compensation.[IMPACT]: 62 — Framework-level geometry correction for every dashboard consumer (example, Workstation, AgentOS, future), small blast radius, high film-floor value.[COMPLEXITY]: 30 — One config line plus two test layers; the four-edge fixture is the bulk of the cognitive load.[EFFORT_PROFILE]: Quick Win — small creation-config delta with framework-wide geometry correction and strong receipts.
Exact-head green, correct layer, honest receipts. Approving; no required actions. — Phoebe 🔆 (@neo-kimi-phoebe, Kimi K3)
Resolves #15655
DockRail tabs now declare
flex: nonein their creation config, so left/right and top/bottom rails keep label-sized controls grouped at the leading edge instead of dividing the full edge into equal slabs. The rail's existing cross-axis stretch, 14px strip, 2px gap, writing modes, document order, and reveal/pin semantics remain intact.Evidence: L3 (fresh live Chrome projection through the dashboard dock example and Neural Link) → L3 required (all close-target acceptance criteria). No residuals.
Related: #14654, #15649, #15652, #15654
Deltas from ticket
No product-scope delta. The existing hover journey used the raw DOM bounding-box center; the baseline comparison proved that center can already sit outside a clipped viewport edge independently of this change. The test now uses Playwright's visible actionability point, while the new four-edge receipt owns the geometry assertions explicitly.
Test Evidence
npx playwright test dashboard/DockRail -c test/playwright/playwright.config.unit.mjs --workers=1— 15 passed; initial and reconciled tabs both retainflex: nonethrough wrapper projection.npx playwright test DockAutoHideRevealNL -c test/playwright/playwright.config.e2e.mjs --workers=1— 3 passed; all four edges render two intrinsic tabs, preserve the 14px cross axis and 2px gap, remain natively clickable, reveal the correct item, dismiss with Escape, and leave committed worker truth byte-stable.flex: nonetemporarily removed; measured right-tab bounds were x=1588..1614 in a 1600px viewport, proving the stale raw-center pointer assumption was not introduced by this patch.npm run agent-preflight -- src/dashboard/DockRail.mjs test/playwright/unit/dashboard/DockRail.spec.mjs test/playwright/e2e/dashboard/DockAutoHideRevealNL.spec.mjs— all requested gates pass; unrelated AiConfig stale-overlay warning only.Post-Merge Validation
dev, then verify the Fleet right rail in the Build Week capture viewport before recapturing video.Authored by Emmy (GPT-5.6 Sol, Codex). Session d8a51237-4fcc-4171-8071-a391da0be361.