LearnNewsExamplesServices
Frontmatter
id15634
titleFleet cockpit: roster badge honesty, grid scroll, rail-tab hover
stateClosed
labels
bugdesignai
assigneesneo-kimi-iris
createdAtJul 21, 2026, 1:53 PM
updatedAtJul 21, 2026, 8:54 PM
githubUrlhttps://github.com/neomjs/neo/issues/15634
authorneo-kimi-iris
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 21, 2026, 8:54 PM

Fleet cockpit: roster badge honesty, grid scroll, rail-tab hover

Closed Backlog/active-chunk-8 bugdesignai
neo-kimi-iris
neo-kimi-iris commented on Jul 21, 2026, 1:53 PM

Context

Operator live observation (2026-07-21, current dev, during the #15631 film-surface check): three small Fleet-cockpit surface bugs, all independently verified in source the same hour. Bundled per the anti-over-fragmentation rule — three one-area fixes, one review.

Live latest-open sweep: checked the live tracker (created-desc, 12 latest) at 2026-07-21T11:55Z; no equivalent. A2A in-flight sweep: latest 30 messages; no claim on this scope (Vega's #15624 is the AgentCard anatomy leaf — adjacent, disjoint). KB ticket sweep: #14560 (FM cockpit epic), #14619 (a11y pass) — no equivalent.

The Problem

  1. The roster badge lies about provenance. The fleet header shows sample roster while the roster it renders is derived from the graph's identityRoots (buildScripts/util/deriveFleetRoster.mjsapps/agentos/resources/data/fleetRoster.json, shipped in #15621). The badge conflates "statically served" (no live bridge) with "sample data" — on the film surface this mislabels our real fleet as fake data.
  2. The fleet grid cannot scroll vertically. With the derived ten-resident roster at 3-column cockpit-zone heights, overflowing cards are unreachable — no scroll path exists.
  3. The right-edge rail tabs have no hover affordance. The #15633 quiet-rail reset stripped the chrome but added no hover state, so the navigation reads as inert until clicked (the bar buttons kept theirs).

The Architectural Reality

  1. apps/agentos/view/fleet/FleetGrid.mjs:305adapterState === 'sample' → 'sample roster'; the state defaults to 'sample' at apps/agentos/view/fleet/FleetCockpit.mjs:203 (rosterSourceMode) and :290 (gridAdapterState). The derived-roster work (#15621) changed the data's truth but not the badge's semantics: sample now means "static seed of graph-derived identities", not fabricated sample agents.
  2. resources/scss/src/apps/agentos/fleet/FleetGrid.scss.fm-fleet-grid / .fm-fleet-cards carry padding/gap but no overflow-y anywhere in the chain (compare OperatorComposeForm.scss:11, which solved the identical overflow symptom with overflow-y: auto).
  3. resources/scss/src/apps/agentos/fleet/FleetCockpit.scss:9-20 — the rail-tab reset (background: transparent; border: 0; box-shadow: none) defines no &:hover block, unlike the sibling bar buttons (.fm-preset-button:hover at :39, .fm-fleet-start:hover at :66) which kept the --motion-fast transition idiom.

The Fix

  1. Badge honesty: rename/rework the sample adapter state to name provenance, not fabrication — e.g. static/derived rendering as derived roster · offline (or the design owner's wording). The stale/live paths are unaffected. Touch points: FleetCockpit.mjs state defaults + FleetGrid.mjs:305 render branch; keep rosterSourceMode's ingress-policy contract (non-reactive by design, :199-201) intact.
  2. Scroll: give the fleet grid a vertical scroll path (overflow-y: auto on the scroll-owning element — verify against the dock projection's sizing so the zone keeps owning layout), mirroring the OperatorComposeForm.scss precedent.
  3. Hover: add a quiet &:hover state for .neo-dashboard-dock-rail-tab.neo-button inside .fm-fleet-cockpit (ink-dim → ink on text, panel-toned background lift, the existing --motion-fast / --ease-out-soft tokens) — affordance without re-introducing the blue slab the reset removed.

Acceptance Criteria

  • The fleet header never calls graph-derived roster data "sample": the badge names static/offline provenance honestly in both themes.
  • A roster taller than the fleet zone scrolls vertically (10-resident derived roster at minimum cockpit height reachable end-to-end).
  • Rail tabs show a visible hover state matching the surface's quiet idiom, in both themes; no return of the primary blue slab.
  • npm run build-themes consumes the SCSS changes cleanly; no token-layer (CSS-in-JS) violations introduced.

Out of Scope

  • Live-bridge wiring/bearer hand-off (separate launch-contract lane).
  • Activity-stream and AgentDetail overflow behaviors (already handled per-component).
  • Any rail behavior change (reveal/pin/auto-hide semantics) — this ticket is surface-only.

Related

#15621 (derived roster from identityRoots — made the badge a liar) · #15633 (quiet rail tabs — dropped the hover) · #15624 (Vega's AgentCard anatomy leaf — adjacent, disjoint) · #14619 (FM a11y pass — hover-affordance adjacency) · #15631 (the film-surface lane that surfaced these)

Origin Session ID: 557fd3c7-7307-499b-9c35-d07fe1c2efcd

Retrieval Hint: fleet cockpit sample roster badge honesty vertical scroll rail tab hover FleetGrid FleetCockpit.scss film surface

tobiu referenced in commit b67f16e - "fix(agentos): honest roster badge, grid scroll, rail-tab hover (#15634) (#15638) on Jul 21, 2026, 8:54 PM
tobiu closed this issue on Jul 21, 2026, 8:54 PM