Context
Operator report during flagship-film readiness review (2026-08-02): the bottom "footer info bar" reads white-on-light-green in the light theme and black-on-dark-green in the dark theme — inverted contrast both ways — with its text flush against the left edge; plus an "info bar at the left edge without content." Live-verified this session in both themes on the dev server; this ticket carries the measured mechanism. These bars are film-visible shell chrome: the flagship recording (#15252) shows the workstation in both themes, so this is a readiness gate for any take.
Live latest-open sweep: checked latest 20 open issues at 2026-08-02T10:04Z; no equivalent found. A2A claim sweep (herd window): no overlapping lane-claim.
The Problem
Both reported bars are the collapsed auto-hide dock rails (autoHidden: true items in the opening document — apps/workstation/tour/denseWorkstation.mjs:33 graph → left rail, :39 inspector → bottom rail). The feature is intentional; three presentation defects make it read as broken:
- Anti-theme label ink, both themes — measured computed styles, dev head:
| Element |
dark theme |
light theme |
.neo-dashboard-dock-edge-rail background |
srgb(0.111, 0.226, 0.233) — dark green, intended |
srgb(0.760, 0.845, 0.859) — light green, intended |
.neo-dashboard-dock-rail-tab computed color |
rgb(214, 220, 230) = workstation ink ✓ |
rgb(31, 39, 51) = workstation ink ✓ |
.neo-button-text span (what renders) |
rgb(0, 0, 0) ✗ black on dark green |
rgb(255, 255, 255) ✗ white on light green |
The rail-tab BUTTON computes the correct workstation ink; the inner .neo-button-text span is re-colored by the generic button skin's descendant tokens and lands anti-theme both ways. The app skin already documents this exact mechanism for the tourbar — resources/scss/src/apps/workstation/Workspace.scss:192 ("Beat generic button focus/pressed descendant colors without relying on theme load order") — the rail-tabs never received that treatment.
Zero inline start gap. Rail-tab padding is 4px 1px (shared base), so the bottom label renders ~1px from the workspace edge — the reported "text starts at the left edge without a gap."
Left rail label clipped to invisible. The vertical (writing-mode: vertical-rl) rail-tab measures 48px physical width inside the 14px overflow: hidden rail; its label span lands entirely outside the strip (span x≈32 vs rail x 12→26). The rail shows as an empty pill — the reported "info bar without content." The label ("Dependency Graph Explorer") exists in the DOM.
The Architectural Reality
- Shared base:
resources/scss/src/dashboard/Container.scss:142-181 — rail strip anatomy (14px cross-axis, padding: 4px 1px, 11px/1 label) plus the in-file comment documenting the generic-button-token battle, including the law "equal-specificity load-order ties are not a contract." Component: src/dashboard/DockRail.mjs.
- Workstation layer:
resources/scss/src/apps/workstation/Workspace.scss:91-104 styles the rail surface and sets color: var(--workstation-ink) on .neo-dashboard-dock-rail-tab — but not on its descendants, which is exactly where the generic skin re-colors.
- Proven sibling fix:
resources/scss/src/apps/agentos/fleet/FleetCockpit.scss:26-45 — .neo-dashboard-dock-rail-tab.neo-button { color: …; min-width: 0; border: 0; … .neo-button-glyph, .neo-button-text { color: inherit } } with a quiet hover idiom. Production AgentOS (per the Container.scss comment) fits an 18px label inside the 14px strip — the vertical-label fit is achievable.
- Token authority: workstation owns its palette (
resources/scss/theme-neo-light/apps/workstation/Viewport.scss + the theme-neo-dark twin). Zero CSS-in-JS — SCSS token/skin layers only.
The Fix
App-scope first (see Avoided Traps): in the Workstation layer,
- Lift the FleetCockpit rail-tab pattern into workstation tokens: add
.neo-button-glyph, .neo-button-text { color: inherit } under the existing rail-tab rule (plus the hover idiom if desired) — kills the anti-theme span in both themes.
- Give the horizontal (bottom) rail label an inline start gap — app-scope padding override (e.g.
padding: 4px 10px scoped to .neo-dashboard-dock-edge-rail-bottom .neo-dashboard-dock-rail-tab, or rail-level padding-inline).
- Root-cause the 48px physical width of the workstation vertical rail-tab so the left label renders inside the strip. First suspect set: the properties FleetCockpit's block overrides (
min-width: 0, border: 0, generic button anatomy); second: the generic button height pin named by the Container.scss comment.
If the root cause turns out to be shared (Container.scss), fix there ONLY with a FleetCockpit right-rail regression check in the same PR.
Acceptance Criteria
Out of Scope
- Auto-hide feature semantics (
autoHidden flag, flyout behavior) — working as designed.
- The a11y naming gap (rail/tab buttons expose no accessible names in the accessibility tree — separate audit seed).
- Body-level vs viewport-level theme-class propagation (probe artifact from this session: the
neo-body element kept neo-theme-neo-dark through an app-level theme flip while rail tokens flipped correctly; if you see "impossible" token values, check WHICH element carries the live theme class before concluding — resolving that split is not this ticket).
- Film choreography/narrative (owned elsewhere in the #15252 family).
Avoided Traps
- Shared-skin-first fix:
Container.scss serves FleetCockpit too; an app-scope fix in the Workstation layer is regression-free by construction. Only go shared with the regression check in-PR.
- Specificity roulette: the Container.scss comment is law — "equal-specificity load-order ties are not a contract." Match the established compound idioms (
.neo-dashboard .neo-button.neo-dashboard-dock-rail-tab shared-side / .neo-dashboard-dock-rail-tab.neo-button app-side); do not invent a new specificity tier.
- Widening the shared 14px strip globally — the slim strip IS the collapsed-affordance design; workstation-scope any geometry change.
Related
- #15252 — flagship film epic; this ticket is an app-readiness gate for the recording
- Precedents:
Workspace.scss:192-200 (tourbar descendant-color fix), FleetCockpit.scss:26-45 (rail-tab pattern), Container.scss:142-181 (shared anatomy + comment)
apps/workstation/tour/denseWorkstation.mjs:33 / :39 — the two autoHidden items
Origin Session ID: cc037e9f-7577-4a11-968d-7a5fe3c8db8d
Retrieval Hint: "workstation dock rail styling anti-theme film readiness"
UNASSIGNED — claimable, any family. Small, precise, fully measured. My seat stays on the narrative/show-order lane per the operator's collaborate steer.
Context
Operator report during flagship-film readiness review (2026-08-02): the bottom "footer info bar" reads white-on-light-green in the light theme and black-on-dark-green in the dark theme — inverted contrast both ways — with its text flush against the left edge; plus an "info bar at the left edge without content." Live-verified this session in both themes on the dev server; this ticket carries the measured mechanism. These bars are film-visible shell chrome: the flagship recording (#15252) shows the workstation in both themes, so this is a readiness gate for any take.
Live latest-open sweep: checked latest 20 open issues at 2026-08-02T10:04Z; no equivalent found. A2A claim sweep (herd window): no overlapping lane-claim.
The Problem
Both reported bars are the collapsed auto-hide dock rails (
autoHidden: trueitems in the opening document —apps/workstation/tour/denseWorkstation.mjs:33graph→ left rail,:39inspector→ bottom rail). The feature is intentional; three presentation defects make it read as broken:.neo-dashboard-dock-edge-railbackgroundsrgb(0.111, 0.226, 0.233)— dark green, intendedsrgb(0.760, 0.845, 0.859)— light green, intended.neo-dashboard-dock-rail-tabcomputedcolorrgb(214, 220, 230)= workstation ink ✓rgb(31, 39, 51)= workstation ink ✓.neo-button-textspan (what renders)rgb(0, 0, 0)✗ black on dark greenrgb(255, 255, 255)✗ white on light greenThe rail-tab BUTTON computes the correct workstation ink; the inner
.neo-button-textspan is re-colored by the generic button skin's descendant tokens and lands anti-theme both ways. The app skin already documents this exact mechanism for the tourbar —resources/scss/src/apps/workstation/Workspace.scss:192("Beat generic button focus/pressed descendant colors without relying on theme load order") — the rail-tabs never received that treatment.Zero inline start gap. Rail-tab padding is
4px 1px(shared base), so the bottom label renders ~1px from the workspace edge — the reported "text starts at the left edge without a gap."Left rail label clipped to invisible. The vertical (
writing-mode: vertical-rl) rail-tab measures 48px physical width inside the 14pxoverflow: hiddenrail; its label span lands entirely outside the strip (span x≈32 vs rail x 12→26). The rail shows as an empty pill — the reported "info bar without content." The label ("Dependency Graph Explorer") exists in the DOM.The Architectural Reality
resources/scss/src/dashboard/Container.scss:142-181— rail strip anatomy (14px cross-axis,padding: 4px 1px, 11px/1 label) plus the in-file comment documenting the generic-button-token battle, including the law "equal-specificity load-order ties are not a contract." Component:src/dashboard/DockRail.mjs.resources/scss/src/apps/workstation/Workspace.scss:91-104styles the rail surface and setscolor: var(--workstation-ink)on.neo-dashboard-dock-rail-tab— but not on its descendants, which is exactly where the generic skin re-colors.resources/scss/src/apps/agentos/fleet/FleetCockpit.scss:26-45—.neo-dashboard-dock-rail-tab.neo-button { color: …; min-width: 0; border: 0; … .neo-button-glyph, .neo-button-text { color: inherit } }with a quiet hover idiom. Production AgentOS (per the Container.scss comment) fits an 18px label inside the 14px strip — the vertical-label fit is achievable.resources/scss/theme-neo-light/apps/workstation/Viewport.scss+ the theme-neo-dark twin). Zero CSS-in-JS — SCSS token/skin layers only.The Fix
App-scope first (see Avoided Traps): in the Workstation layer,
.neo-button-glyph, .neo-button-text { color: inherit }under the existing rail-tab rule (plus the hover idiom if desired) — kills the anti-theme span in both themes.padding: 4px 10pxscoped to.neo-dashboard-dock-edge-rail-bottom .neo-dashboard-dock-rail-tab, or rail-level padding-inline).min-width: 0,border: 0, generic button anatomy); second: the generic button height pin named by the Container.scss comment.If the root cause turns out to be shared (Container.scss), fix there ONLY with a FleetCockpit right-rail regression check in the same PR.
Acceptance Criteria
.neo-dashboard-dock-rail-tab .neo-button-text, live, both themes.Out of Scope
autoHiddenflag, flyout behavior) — working as designed.neo-bodyelement keptneo-theme-neo-darkthrough an app-level theme flip while rail tokens flipped correctly; if you see "impossible" token values, check WHICH element carries the live theme class before concluding — resolving that split is not this ticket).Avoided Traps
Container.scssserves FleetCockpit too; an app-scope fix in the Workstation layer is regression-free by construction. Only go shared with the regression check in-PR..neo-dashboard .neo-button.neo-dashboard-dock-rail-tabshared-side /.neo-dashboard-dock-rail-tab.neo-buttonapp-side); do not invent a new specificity tier.Related
Workspace.scss:192-200(tourbar descendant-color fix),FleetCockpit.scss:26-45(rail-tab pattern),Container.scss:142-181(shared anatomy + comment)apps/workstation/tour/denseWorkstation.mjs:33/:39— the twoautoHiddenitemsOrigin Session ID: cc037e9f-7577-4a11-968d-7a5fe3c8db8d
Retrieval Hint: "workstation dock rail styling anti-theme film readiness"
UNASSIGNED — claimable, any family. Small, precise, fully measured. My seat stays on the narrative/show-order lane per the operator's collaborate steer.