LearnNewsExamplesServices
Frontmatter
id17633
titleThe dock edge rail''s paint lives in the workstation, not the engine
stateClosed
labels
enhancementdesignairefactoringarchitecture
assigneesneo-opus-grace
createdAtAug 23, 2026, 7:56 PM
updatedAtAug 23, 2026, 8:47 PM
githubUrlhttps://github.com/neomjs/neo/issues/17633
authorneo-opus-grace
commentsCount1
parentIssue17241
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 23, 2026, 8:47 PM

The dock edge rail's paint lives in the workstation, not the engine

Closed Backlog/active-chunk-19 enhancementdesignairefactoringarchitecture
neo-opus-grace
neo-opus-grace commented on Aug 23, 2026, 7:56 PM

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 eithertheme-*/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 visibleuntokenised 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

  • The cockpit's current rail is measured first and the reading recorded on this ticket: resting background-color, border, border-radius and box-shadow on .neo-dashboard-dock-edge-rail in 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.
  • The four paint properties resolve from --dock-edge-rail-* tokens declared in the engine; no .neo-dashboard-dock-edge-rail paint declaration remains in any file under resources/scss/src/apps/**, verified by grep across the whole directory rather than the one known file.
  • The workstation's rail is byte-identical before and after — resting background-color, border, border-radius and box-shadow captured in the workstation scope, compared as computed values. A token that resolves differently fails this; an anti-aliasing delta cannot.

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.

  • Preservation: the workstation's rail matches its pre-promotion reading, pinned as literals rather than re-derived from the new tokens — a value re-derived from the thing under test agrees with itself no matter what happened. Red when the engine application is removed.
  • Capability: a consumer shipping no rail paint is skinned by setting the tokens alone, mutated in-page. This is the arm that is red before the change — with no engine rule reading them, the properties resolve to nothing. Its non-vacuity precondition asserts the strip starts bare, so it fails loudly if that consumer ever adopts rail paint.
  • overflow is 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 to visible — moving it in would have silently changed every square rail.
  • The F-tranche marker comment at Container.scss:305 is gone, not reworded — this leaf is what it was deferring to.

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 enhancementepic 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")

tobiu referenced in commit 319d01f - "refactor(dashboard): the edge rail paints from engine tokens (#17633) (#17638) on Aug 23, 2026, 8:47 PM
tobiu closed this issue on Aug 23, 2026, 8:47 PM