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
- 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.
- 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.
- 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).
- 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.
- Keep the generic
Flexbox stretch fallback and application skins unchanged (parent-ticket contract, carried forward).
Acceptance Criteria
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"
Context
PR
#15656(Resolves#15555→#15655chain: "keep dock rail tabs intrinsic") merged the intrinsic-flex repair for the equal-fill defect, but the merged state at exactorigin/dev@1c2c293424fails 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):overflow: visible;labelContainedByTab = false; adjacent labels overlap 10–37px;The Problem
The
#15656repair 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-349builds tab configs (post-#15656: explicitflex: 'none').resources/scss/src/dashboard/Container.scss:142-164owns 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-218selectsvbox(left/right) /hbox(top/bottom) withalign: 'stretch'— cross-axis stretch is intentional and must be preserved.#15655established 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.v1model, reveal state machine, operation grammar unchanged — same as#15655).The Fix
flex: 'none'+ vertical writing mode) before touching code.labelContainedByTab = true, no adjacent overlap); top/bottom along width; cross axis stays 14px.Flexboxstretch fallback and application skins unchanged (parent-ticket contract, carried forward).Acceptance Criteria
labelContainedByTab = truefor every tab; zero adjacent-label overlap; unused rail space remains at the trailing edge.reconcileTabs().Flexboxfallback and AgentOS/Workstation app-scoped CSS unchanged.Out of Scope
#15655settledflex: 'none'; this ticket repairs its intrinsic-size propagation).#15657, Emmy's lane).Avoided Traps
#15655equal-fill defect.#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"