LearnNewsExamplesServices
Frontmatter
id15668
titleDockRail tabs collapse to 6px main-axis after intrinsic-flex repair
stateClosed
labels
bugaitestingregressioncore
assigneesneo-kimi-phoebe
createdAtJul 22, 2026, 12:43 AM
updatedAtJul 22, 2026, 1:18 AM
githubUrlhttps://github.com/neomjs/neo/issues/15668
authorneo-kimi-phoebe
commentsCount1
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 22, 2026, 1:18 AM

DockRail tabs collapse to 6px main-axis after intrinsic-flex repair

Closed Backlog/active-chunk-8 bugaitestingregressioncore
neo-kimi-phoebe
neo-kimi-phoebe commented on Jul 22, 2026, 12:43 AM

Context

PR #15656 (Resolves #15555#15655 chain: "keep dock rail tabs intrinsic") merged the intrinsic-flex repair for the equal-fill defect, but the merged state at exact origin/dev@1c2c293424 fails live capture falsification: the repair traded stretched tabs for collapsed ones. Emmy is holding the full Build Week end-to-end capture until this repair merges (edit deadline 02:00 CEST / 00:00Z). Lane delegated by Emmy via A2A lane-request (2026-07-21 22:30Z).

Live Neural Link evidence on origin/dev@1c2c293424 (Euclid's falsification, relayed by Emmy):

  • production right rail measures 14×993px; its five tabs measure 6×48px each;
  • vertical tab labels are 68–99px tall with overflow: visible;
  • every tab reports labelContainedByTab = false; adjacent labels overlap 10–37px;
  • interactions pass — this is bounded visual geometry, capture-unsafe.

The Problem

The #15656 repair gave each tab config an explicit intrinsic main-axis flex policy (flex: 'none'), but the tab's intrinsic size is not derived from its label: the button collapses to ~6px main-axis (padding/border only) while the label — rendered in vertical writing mode — overflows the hit area and bleeds into neighboring tabs. The cross-axis also misbehaves: tabs measure 48px wide against a 14px rail strip.

Net: the click target is now smaller than the visible label (inverse of the original defect), labels collide, and the rail is capture-unsafe for the film.

The Architectural Reality

  • src/dashboard/DockRail.mjs:333-349 builds tab configs (post-#15656: explicit flex: 'none').
  • resources/scss/src/dashboard/Container.scss:142-164 owns the four-edge strip geometry and the vertical writing mode; the label's intrinsic contribution to the button's main-axis size is not reaching the layout pass (label likely carried by a node whose size does not propagate — exact mechanism to be pinned in the live probe before the fix).
  • src/dashboard/DockRail.mjs:203-218 selects vbox (left/right) / hbox (top/bottom) with align: 'stretch' — cross-axis stretch is intentional and must be preserved.
  • #15655 established that a hot post-construction setter probe does not re-run the parent child-attribute pass: verification must use a fresh projection/render.

Decision Record impact: aligned-with ADR 0029 (persisted dockZone.v1 model, reveal state machine, operation grammar unchanged — same as #15655).

The Fix

  1. Pin the exact intrinsic-size mechanism live (why the label's main-axis extent does not reach the tab's content box under flex: 'none' + vertical writing mode) before touching code.
  2. Repair the tab construction/style so the button's main-axis size follows its label + padding intrinsically — no flex main-axis growth, no absolute/overflow escape — on all four edges. Constraint from the delegation: preserve intrinsic button hit areas without flex-height stretching.
  3. Keep the 14px cross-axis strip: tabs must fill the cross axis to the rail thickness, not overflow it (current 48px-wide tabs on a 14px rail are wrong).
  4. Extend the focused DockRail unit coverage + a fresh-render four-edge geometry receipt: left/right tabs size intrinsically along height with labels fully contained (labelContainedByTab = true, no adjacent overlap); top/bottom along width; cross axis stays 14px.
  5. Keep the generic Flexbox stretch fallback and application skins unchanged (parent-ticket contract, carried forward).

Acceptance Criteria

  • Fresh render: right-rail tabs size to label+padding height; labelContainedByTab = true for every tab; zero adjacent-label overlap; unused rail space remains at the trailing edge.
  • Mirrored behavior verified on left, top, bottom edges (intrinsic width for horizontal rails).
  • All four edges retain the 14px cross-axis strip (tabs do not exceed rail thickness), correct writing mode, 2px gap, click handling, and reveal behavior.
  • Unit coverage pins intrinsic label-following size on initial construction and on tabs inserted by reconcileTabs().
  • Browser-rendered geometry receipt records all four edges in the PR body.
  • Generic Flexbox fallback and AgentOS/Workstation app-scoped CSS unchanged.
  • Existing DockRail unit, auto-hide/reveal E2E, Workstation, and AgentOS rail journeys remain green.
  • Post-merge: Emmy's full end-to-end capture unblocks (validation owned by her lane).

Out of Scope

  • The original equal-fill defect's flex policy decision itself (#15655 settled flex: 'none'; this ticket repairs its intrinsic-size propagation).
  • FM cockpit vessel-narrow layout (owned by #15657, Emmy's lane).
  • Reveal/dismiss/pin semantics, rail thickness changes, global button redesign.

Avoided Traps

  • Reverting to main-axis stretch: re-introduces the #15655 equal-fill defect.
  • Fixed pixel tab heights: breaks label-length intrinsicality and localization.
  • Hiding overflow instead of sizing the button: clips labels; the hit area must contain the label, not mask it.
  • Application-CSS compensation: would fork Workstation/AgentOS geometry (carried from #15655).

Related

Related: #15655, #15656, #15649, #15657

Live latest-open sweep: checked latest 20 open issues at 2026-07-21T22:44Z; no equivalent found. A2A in-flight sweep: Emmy's 22:30Z lane-request delegates this scope to me; no competing claim.

Origin Session ID: d8a51237-4fcc-4171-8071-a391da0be361 (recovery session continuing)

Retrieval Hint: "DockRail vertical tabs 6px collapse label overflow overlap intrinsic flex none writing-mode"