Context
Third leaf of #17241, and the last of its named paint scope. The parent retained "the dock edge-zone / edge-row / edge-band / edge-rail chrome" after #17522 (rail-tab structural paint) and #17538 (splitter affordance floor) shipped. Measured on dev at 6f0b6619c8, only one of those four carries paint — the rest are geometry.
The parent's evidence sentence is still literally in the tree, now attached to this element alone. resources/scss/src/dashboard/Container.scss:305:
// Demo-consumable minimal hooks only — the real visual language lands with the F-tranche.
#17538 removed the splitter's copy of that marker. The rail's is what remains.
The Problem
.neo-dashboard-dock-edge-rail gets geometry and nothing else from the engine (Container.scss:304-322): flex-shrink, gap, and the per-edge width/height reading --dock-edge-rail-size. No background, no border, no radius, no shadow — the same shape the splitter had before #17538.
The whole visual identity lives in one application stylesheet, resources/scss/src/apps/workstation/Workspace.scss:59-63:
background : color-mix(in srgb, var(--workstation-signal) 18%, var(--workstation-rail));
border : 1px solid color-mix(in srgb, var(--workstation-signal) 52%, var(--workstation-line));
border-radius: 7px;
box-shadow : 0 0 22px color-mix(in srgb, var(--workstation-signal) 12%, transparent);
overflow : hidden;
A whole-tree grep for dock-edge-rail returns exactly four hits: the engine's geometry block, this paint block, and two workstation tab-padding selectors. No theme file paints it either — theme-*/dashboard/ exists in all five themes since #17242, and none of them touch the rail.
So a consumer that adopts the dock gets a rail strip with no surface of its own, and the only way to get one is to copy CSS out of the workstation. That is #17241's thesis, unchanged, on the element it has left.
What I have NOT established, deliberately: that the cockpit's unpainted rail is a visible defect. The rail tabs carry their own paint since #17522, so a transparent strip behind painted tabs may read as an acceptable neutral rather than a break — unlike #17211's splitter, which had nothing to see at all. Calling this a rendering bug without measuring it would be an absence reported as a defect. AC-1 makes that measurement the leaf's own first step, and its outcome decides whether the engine's default is a real affordance or a deliberate flat neutral.
The Architectural Reality
--dock-edge-rail-size was tokenised by #17614 and is already consumed by two readers (the rail's cross-axis extent and the reveal overlay's per-edge inset, Container.scss:423-426). So the rail already has a token contract for its measure; this leaf gives it one for its paint — precisely the measure/paint split #17241 names, one property set over from where #17522 left it.
The pattern is fixed by the two shipped leaves and is not open for redesign here:
- The engine declares the paint, reading neutral
--dock-edge-rail-* tokens. whose defaults resolve against currentColor so an unadopted consumer still gets a coherent surface (#17538's affordance-floor precedent) — corrected after AC-1's reading: the defaults are the empty identity slots (transparent / 0 / 0 / none), the --dock-splitter-ring class of token, not a currentColor floor. The engine distinguishes affordances it owes from slots an app fills, and the strip is the second kind: its tabs are the affordance and already carry an engine-owed visible active state since #17522. A currentColor floor here would push a surface onto every consumer that never asked for one.
- The app layer sets token values only. The workstation's four declarations become four token values mapping onto
--workstation-signal / --workstation-rail / --workstation-line.
overflow: hidden is structure, not paint — it clips the rotated vertical labels to the strip and belongs in the engine unconditionally, not behind a token. Corrected — this was wrong about why the property exists. It sits under border-radius: 7px and clips tabs to the corners, not the labels. The cockpit has radius 0 and resolves overflow: visible, so moving it in unconditionally would have silently changed every square rail. It ships as --dock-edge-rail-overflow, defaulting to visible.
Not in this leaf, and why: .neo-dashboard-dock-edge-zone / -edge-row (gap: 7px) and .neo-dashboard-dock-edge-band (min-height: 0; min-width: 0) carry no paint, and the rail-top/bottom tab padding: 4px 10px is a deliberate app deviation that already documents itself in-file. Promoting geometry a consumer has no defect from would be scope by adjacency.
The Fix
resources/scss/src/dashboard/Container.scss — declare --dock-edge-rail-background, --dock-edge-rail-border, --dock-edge-rail-radius, --dock-edge-rail-shadow in the .neo-dashboard token block beside --dock-edge-rail-size, and apply them on .neo-dashboard-dock-edge-rail. Move overflow: hidden in as structure. Corrected: add --dock-edge-rail-overflow, default visible, and apply it — see the Architectural Reality note. Retire the stale F-tranche marker comment, which this leaf is the F-tranche for.
resources/scss/src/apps/workstation/Workspace.scss — the five declarations collapse to four token values; the rail keeps its exact rendered appearance.
resources/scss/src/apps/agentos/fleet/cockpit/Container.scss — set FM values only if AC-1's measurement says the engine default is wrong for the cockpit. Adding an override the cockpit does not need would re-create the app-layer paint this ticket removes.
Contract Ledger Matrix
| # |
Target surface |
Source of authority |
Before |
After |
Fallback |
Evidence |
| 1 |
--dock-edge-rail-background |
src/dashboard/Container.scss .neo-dashboard block |
absent |
engine default transparent — an empty identity slot, currentColor-relative (corrected after AC-1) |
none needed; the default is the CSS initial value |
Workspace.scss:60 is the only current source |
| 2 |
--dock-edge-rail-border |
same |
absent |
engine default |
0 |
Workspace.scss:61 |
| 3 |
--dock-edge-rail-radius |
same |
absent |
engine default |
0 |
Workspace.scss:62 |
| 4 |
--dock-edge-rail-shadow |
same |
absent |
engine default |
none |
Workspace.scss:63 |
| 5 |
--dock-edge-rail-overflow |
Container.scss:304 |
app-declared |
engine-declared token, default visible — untokenised structure (corrected after AC-1) |
visible, which is what every square rail already resolves |
clips tabs to the radius, not the labels; Workspace.scss:64 |
Acceptance Criteria
A mutation control proves the promotion is observed: removing the engine token block changes what a consumer with no app-local rail CSS resolves. Retired 2026-08-23 — this arm cannot exist as written, and is deliberately not a criterion any more. Once AC-1's reading settled the defaults as empty identity slots, the engine's defaults became the CSS initial values. Removing them changes nothing a bare consumer resolves, so the arm would be green against a deleted promotion — vacuous by construction, the exact fault it was written to prevent. Replaced by the two below, which observe the two halves of what actually changed.
Out of Scope
- Edge-zone / edge-row / edge-band geometry and the rail-top/bottom tab padding — no paint, no consumer defect, already self-documenting. Named here so the next reader does not read this leaf as having skipped them.
- The reveal-overlay family in the cockpit (
Container.scss:164-214) — a distinct cluster, #17211-adjacent, not part of #17241's named paint scope.
#17241's remaining parent obligations: the net-LOC criterion, the rail-tab specificity-tie ACs, and the enhancement → epic taxonomy question, which the parent explicitly leaves to whoever closes it out.
- Any change to
--dock-edge-rail-size or its two readers (#17614, merged).
Avoided Traps
- Calling the unpainted cockpit rail a rendering defect without measuring it. The tabs are painted since #17522, so the strip's transparency may be an acceptable neutral. #17211 was a genuine invisibility; assuming this is the same is an absence reported as a defect.
- Promoting the geometry because it sits in the same block.
gap and padding values are app taste that harm no other consumer; moving them would be scope by adjacency and would grow the engine surface with nothing to show for it.
Tokenising overflow: hidden. It is what makes a vertical rail clip its rotated labels — structure, not skin. This trap was itself wrong and is inverted by AC-1's reading. The property is coupled to the radius, not the labels — it clips tabs to the workstation's rounded corners, and the cockpit resolves visible today with no overflowing labels. The real trap is the one this sentence recommended: moving it into the engine unconditionally, which would silently clip every square rail — a redesign wearing a promotion's clothes. Recording the inversion rather than deleting it, because a reader who reaches the same wrong conclusion deserves the counter-evidence.
- Letting the workstation keep its declarations "just in case". An app-layer paint rule surviving beside the engine's is what put the rail tab in the equal-specificity tie #17241 documents at
Container.scss:191.
Decision Record impact
aligned-with ADR 0029 — moves presentation into the substrate the record already describes; changes no ADR authority.
Structure-map gate: N/A — SCSS only, no .mjs introduced or relocated, no ai/ surface touched.
Live latest-open sweep: checked latest 20 open issues at 2026-08-23T17:52Z; no equivalent found. A2A in-flight claim sweep: latest 30 all-state messages at the same timestamp; no overlapping claim.
Related
#17241 (parent) · #17522 / #17538 (the two shipped leaves, whose pattern this follows) · #17614 (tokenised --dock-edge-rail-size, the measure half) · #17242 (created the theme-*/dashboard/ layer this can use) · #17211 (the splitter defect that started the parent)
Origin Session ID: eb671e6e-ca17-4a53-8069-64fd5885ce84
Retrieval Hint: query_raw_memories("dock edge rail paint promotion engine tokens workstation F-tranche marker")
Context
Third leaf of #17241, and the last of its named paint scope. The parent retained "the dock edge-zone / edge-row / edge-band / edge-rail chrome" after #17522 (rail-tab structural paint) and #17538 (splitter affordance floor) shipped. Measured on
devat6f0b6619c8, only one of those four carries paint — the rest are geometry.The parent's evidence sentence is still literally in the tree, now attached to this element alone.
resources/scss/src/dashboard/Container.scss:305:#17538 removed the splitter's copy of that marker. The rail's is what remains.
The Problem
.neo-dashboard-dock-edge-railgets geometry and nothing else from the engine (Container.scss:304-322):flex-shrink,gap, and the per-edgewidth/heightreading--dock-edge-rail-size. No background, no border, no radius, no shadow — the same shape the splitter had before #17538.The whole visual identity lives in one application stylesheet,
resources/scss/src/apps/workstation/Workspace.scss:59-63:background : color-mix(in srgb, var(--workstation-signal) 18%, var(--workstation-rail)); border : 1px solid color-mix(in srgb, var(--workstation-signal) 52%, var(--workstation-line)); border-radius: 7px; box-shadow : 0 0 22px color-mix(in srgb, var(--workstation-signal) 12%, transparent); overflow : hidden;A whole-tree grep for
dock-edge-railreturns exactly four hits: the engine's geometry block, this paint block, and two workstation tab-padding selectors. No theme file paints it either —theme-*/dashboard/exists in all five themes since #17242, and none of them touch the rail.So a consumer that adopts the dock gets a rail strip with no surface of its own, and the only way to get one is to copy CSS out of the workstation. That is #17241's thesis, unchanged, on the element it has left.
What I have NOT established, deliberately: that the cockpit's unpainted rail is a visible defect. The rail tabs carry their own paint since #17522, so a transparent strip behind painted tabs may read as an acceptable neutral rather than a break — unlike #17211's splitter, which had nothing to see at all. Calling this a rendering bug without measuring it would be an absence reported as a defect. AC-1 makes that measurement the leaf's own first step, and its outcome decides whether the engine's default is a real affordance or a deliberate flat neutral.
The Architectural Reality
--dock-edge-rail-sizewas tokenised by #17614 and is already consumed by two readers (the rail's cross-axis extent and the reveal overlay's per-edge inset,Container.scss:423-426). So the rail already has a token contract for its measure; this leaf gives it one for its paint — precisely the measure/paint split #17241 names, one property set over from where #17522 left it.The pattern is fixed by the two shipped leaves and is not open for redesign here:
--dock-edge-rail-*tokens.whose defaults resolve against— corrected after AC-1's reading: the defaults are the empty identity slots (currentColorso an unadopted consumer still gets a coherent surface (#17538's affordance-floor precedent)transparent/0/0/none), the--dock-splitter-ringclass of token, not acurrentColorfloor. The engine distinguishes affordances it owes from slots an app fills, and the strip is the second kind: its tabs are the affordance and already carry an engine-owed visible active state since #17522. AcurrentColorfloor here would push a surface onto every consumer that never asked for one.--workstation-signal/--workstation-rail/--workstation-line.Corrected — this was wrong about why the property exists. It sits underoverflow: hiddenis structure, not paint — it clips the rotated vertical labels to the strip and belongs in the engine unconditionally, not behind a token.border-radius: 7pxand clips tabs to the corners, not the labels. The cockpit has radius0and resolvesoverflow: visible, so moving it in unconditionally would have silently changed every square rail. It ships as--dock-edge-rail-overflow, defaulting tovisible.Not in this leaf, and why:
.neo-dashboard-dock-edge-zone/-edge-row(gap: 7px) and.neo-dashboard-dock-edge-band(min-height: 0; min-width: 0) carry no paint, and the rail-top/bottom tabpadding: 4px 10pxis a deliberate app deviation that already documents itself in-file. Promoting geometry a consumer has no defect from would be scope by adjacency.The Fix
resources/scss/src/dashboard/Container.scss— declare--dock-edge-rail-background,--dock-edge-rail-border,--dock-edge-rail-radius,--dock-edge-rail-shadowin the.neo-dashboardtoken block beside--dock-edge-rail-size, and apply them on.neo-dashboard-dock-edge-rail.MoveCorrected: addoverflow: hiddenin as structure.--dock-edge-rail-overflow, defaultvisible, and apply it — see the Architectural Reality note. Retire the staleF-tranchemarker comment, which this leaf is the F-tranche for.resources/scss/src/apps/workstation/Workspace.scss— the five declarations collapse to four token values; the rail keeps its exact rendered appearance.resources/scss/src/apps/agentos/fleet/cockpit/Container.scss— set FM values only if AC-1's measurement says the engine default is wrong for the cockpit. Adding an override the cockpit does not need would re-create the app-layer paint this ticket removes.Contract Ledger Matrix
--dock-edge-rail-backgroundsrc/dashboard/Container.scss.neo-dashboardblocktransparent— an empty identity slot,(corrected after AC-1)currentColor-relativeWorkspace.scss:60is the only current source--dock-edge-rail-border0Workspace.scss:61--dock-edge-rail-radius0Workspace.scss:62--dock-edge-rail-shadownoneWorkspace.scss:63--dock-edge-rail-overflowContainer.scss:304visible—untokenised structure(corrected after AC-1)visible, which is what every square rail already resolvesWorkspace.scss:64Acceptance Criteria
background-color,border,border-radiusandbox-shadowon.neo-dashboard-dock-edge-railin the FM scope, before any change. This decides whether the engine default is an affordance or a deliberate flat neutral — the leaf must not assume either.--dock-edge-rail-*tokens declared in the engine; no.neo-dashboard-dock-edge-railpaint declaration remains in any file underresources/scss/src/apps/**, verified by grep across the whole directory rather than the one known file.background-color,border,border-radiusandbox-shadowcaptured in the workstation scope, compared as computed values. A token that resolves differently fails this; an anti-aliasing delta cannot.overflowis engine-readable and the workstation still clips its tabs to the 7px corners. Corrected: the ticket body called this unconditional structure that clips rotated labels; it is coupled to the radius, so it ships as a token defaulting tovisible— moving it in would have silently changed every square rail.F-tranchemarker comment atContainer.scss:305is gone, not reworded — this leaf is what it was deferring to.Out of Scope
Container.scss:164-214) — a distinct cluster, #17211-adjacent, not part of #17241's named paint scope.#17241's remaining parent obligations: the net-LOC criterion, the rail-tab specificity-tie ACs, and theenhancement→epictaxonomy question, which the parent explicitly leaves to whoever closes it out.--dock-edge-rail-sizeor its two readers (#17614, merged).Avoided Traps
gapandpaddingvalues are app taste that harm no other consumer; moving them would be scope by adjacency and would grow the engine surface with nothing to show for it.TokenisingThis trap was itself wrong and is inverted by AC-1's reading. The property is coupled to the radius, not the labels — it clips tabs to the workstation's rounded corners, and the cockpit resolvesoverflow: hidden. It is what makes a vertical rail clip its rotated labels — structure, not skin.visibletoday with no overflowing labels. The real trap is the one this sentence recommended: moving it into the engine unconditionally, which would silently clip every square rail — a redesign wearing a promotion's clothes. Recording the inversion rather than deleting it, because a reader who reaches the same wrong conclusion deserves the counter-evidence.Container.scss:191.Decision Record impact
aligned-with ADR 0029— moves presentation into the substrate the record already describes; changes no ADR authority.Structure-map gate: N/A — SCSS only, no
.mjsintroduced or relocated, noai/surface touched.Live latest-open sweep: checked latest 20 open issues at 2026-08-23T17:52Z; no equivalent found. A2A in-flight claim sweep: latest 30 all-state messages at the same timestamp; no overlapping claim.
Related
#17241(parent) ·#17522/#17538(the two shipped leaves, whose pattern this follows) ·#17614(tokenised--dock-edge-rail-size, the measure half) ·#17242(created thetheme-*/dashboard/layer this can use) ·#17211(the splitter defect that started the parent)Origin Session ID: eb671e6e-ca17-4a53-8069-64fd5885ce84
Retrieval Hint:
query_raw_memories("dock edge rail paint promotion engine tokens workstation F-tranche marker")