Context
First leaf of #17559 (laws 1 + 3). apps/agentos/view/fleet/ is one flat folder of 43 files (27 PascalCase classes, 16 camelCase modules); twelve container.Base subclasses and seven component.Base subclasses carry role-word suffixes ("Pane", "Stream", "Card", "Detail", "Bar", "Rail", "Dot", "Grid" on a container) instead of their base family. Every later leaf of the epic is born into the topology this leaf creates, so it runs FIRST — after the in-flight fleet-folder PRs (#17542, #17545) merge, to keep the move conflict-free.
The Problem
Class names that lie about their base class (FleetGrid extends container.Base), a folder that cannot be navigated by surface, and Brain-side pure-function modules mixed into Body-side app code. Zero behavior change is owed here; the shape change is the deliverable.
The Architectural Reality
- Precedent:
apps/portal/view/** — a folder per surface (about/, learn/, news/, …), each with MainContainer + MainContainerController (+ MainContainerStateProvider), components named by base.
- Consumers of the current class names: unit specs under
test/playwright/unit/apps/agentos/view/fleet/**, e2e specs (Neural Link find_instances by className), cockpitDockDocument.mjs / kindRegistry.mjs module imports, docs/output. Dock item ids ('tasks', 'memories', …) and fm-* CSS class names are NOT JS class names and stay unchanged.
- SCSS mirrors:
resources/scss/src/apps/agentos/fleet/*.scss follow the same folder split (file moves only; selectors untouched).
The Fix
git mv into the epic's topology: cockpit/ (FleetCockpit → cockpit/Container, its Controller, dock document, presets), roster/ (+ roster/card/), activity/, tasks/, memories/, mailbox/ (agent + operator + compose form + recipient chips), detail/, instances/, health/.
- Rename every class so the suffix is its base family; the folder supplies the namespace (
AgentOS.view.fleet.tasks.Container, …roster.List once #17553 lands, …health.Container, …roster.card.Container, …roster.card.FamilyRailComponent, …). (Amended at delivery: ntypes stay UNCHANGED — they are registry keys consumed by item.ntype === checks, not base-class claims; renaming them would touch runtime consumers for zero conformance gain.)
- The camelCase modules RELOCATE to
apps/agentos/util/ as modules with imports rewritten. (Amended at delivery: the class CONVERSION and the final per-module placement — cockpit-scoped builders vs cross-surface util classes — are #17568, the natively-linked successor this review round mandated; converting call sites in 40+ files belongs in its own reviewable leaf.)
- Specs and SCSS files mirror the moves;
docs/output regenerated; kindRegistry / dock document imports updated.
- A structural witness spec under
test/playwright/unit/apps/agentos/ walks apps/agentos/view/** and asserts: every class's suffix matches its base family, and no camelCase module lives under view/ — the regression guard for laws 1 + 3.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback / Edge Case |
Docs |
Evidence |
AgentOS.view.fleet.* class names (ntypes unchanged — amended) |
#17559 law 1 |
renamed to base-family suffixes inside surface namespaces; ntypes stay as registry keys |
every consumer (specs, e2e selectors, registry, dock imports) updated in the same PR |
class docblocks |
structural witness spec + green suites |
apps/agentos/util/* (relocated modules — amended) |
#17559 law 3; Neo.util.* precedent |
modules relocated with imports rewritten; class conversion + final per-module placement = #17568 (successor, natively linked) |
none — pure relocation, no logic change |
module docblocks |
call-site grep: zero imports from the old paths |
additionalThemeFiles namespaces (added at review round 1) |
src/worker/App.mjs namespace→SCSS mapping |
every entry follows its moved chunk (…fleet.cockpit.SpineBanner, …fleet.cockpit.ViewerWakeTelltale, …fleet.mailbox.Chips) |
the conformance witness resolves every entry to a real chunk — fail closed |
config docblocks |
the theme-resolution witness |
dock item ids + fm-* CSS classes |
unchanged |
untouched |
n/a |
n/a |
theme-surface check green |
Acceptance Criteria
Out of Scope
Primitive migrations (their own leaves under #17559), CSS class renames (theme-surface + golden implications), controller/provider extraction (#17335), any behavior change.
Related
Epic: #17559. Must land after #17542 and #17545 (blocked-by edges). Precedent: apps/portal/view/**.
Live latest-open sweep: checked latest 20 open issues at 2026-08-22T16:55:35Z; no equivalent. A2A claim sweep: no competing claim.
Origin Session ID: 28bee2e0-4dc8-4375-8514-78fcf38d0d30
Retrieval Hint: query_raw_memories("fleet view folder topology move base-class naming mechanical util classes")
Context
First leaf of #17559 (laws 1 + 3).
apps/agentos/view/fleet/is one flat folder of 43 files (27 PascalCase classes, 16 camelCase modules); twelvecontainer.Basesubclasses and sevencomponent.Basesubclasses carry role-word suffixes ("Pane", "Stream", "Card", "Detail", "Bar", "Rail", "Dot", "Grid" on a container) instead of their base family. Every later leaf of the epic is born into the topology this leaf creates, so it runs FIRST — after the in-flight fleet-folder PRs (#17542, #17545) merge, to keep the move conflict-free.The Problem
Class names that lie about their base class (
FleetGrid extends container.Base), a folder that cannot be navigated by surface, and Brain-side pure-function modules mixed into Body-side app code. Zero behavior change is owed here; the shape change is the deliverable.The Architectural Reality
apps/portal/view/**— a folder per surface (about/,learn/,news/, …), each withMainContainer+MainContainerController(+MainContainerStateProvider), components named by base.test/playwright/unit/apps/agentos/view/fleet/**, e2e specs (Neural Linkfind_instancesby className),cockpitDockDocument.mjs/kindRegistry.mjsmodule imports,docs/output. Dock item ids ('tasks','memories', …) andfm-*CSS class names are NOT JS class names and stay unchanged.resources/scss/src/apps/agentos/fleet/*.scssfollow the same folder split (file moves only; selectors untouched).The Fix
git mvinto the epic's topology:cockpit/(FleetCockpit →cockpit/Container, its Controller, dock document, presets),roster/(+roster/card/),activity/,tasks/,memories/,mailbox/(agent + operator + compose form + recipient chips),detail/,instances/,health/.AgentOS.view.fleet.tasks.Container,…roster.Listonce #17553 lands,…health.Container,…roster.card.Container,…roster.card.FamilyRailComponent, …). (Amended at delivery:ntypes stay UNCHANGED — they are registry keys consumed byitem.ntype ===checks, not base-class claims; renaming them would touch runtime consumers for zero conformance gain.)apps/agentos/util/as modules with imports rewritten. (Amended at delivery: the class CONVERSION and the final per-module placement — cockpit-scoped builders vs cross-surface util classes — are #17568, the natively-linked successor this review round mandated; converting call sites in 40+ files belongs in its own reviewable leaf.)docs/outputregenerated;kindRegistry/ dock document imports updated.test/playwright/unit/apps/agentos/walksapps/agentos/view/**and asserts: every class's suffix matches its base family, and no camelCase module lives underview/— the regression guard for laws 1 + 3.Contract Ledger Matrix
AgentOS.view.fleet.*class names (ntypes unchanged — amended)apps/agentos/util/*(relocated modules — amended)Neo.util.*precedentadditionalThemeFilesnamespaces (added at review round 1)src/worker/App.mjsnamespace→SCSS mapping…fleet.cockpit.SpineBanner,…fleet.cockpit.ViewerWakeTelltale,…fleet.mailbox.Chips)fm-*CSS classesAcceptance Criteria
apps/agentos/view/**whose suffix contradicts its base family; no camelCase module underview/.npm run test-unit(owning trees incl.apps/agentos/**) and the agentos e2e specs green at the head — zero behavior change (no assertion text changes except names/paths).npm run check-theme-surfacesgreen; SCSS files moved, selectors untouched.docs/outputregenerated in the same commit; zero imports from retired paths (grep receipt).Out of Scope
Primitive migrations (their own leaves under #17559), CSS class renames (theme-surface + golden implications), controller/provider extraction (#17335), any behavior change.
Related
Epic: #17559. Must land after #17542 and #17545 (blocked-by edges). Precedent:
apps/portal/view/**.Live latest-open sweep: checked latest 20 open issues at 2026-08-22T16:55:35Z; no equivalent. A2A claim sweep: no competing claim.
Origin Session ID: 28bee2e0-4dc8-4375-8514-78fcf38d0d30 Retrieval Hint:
query_raw_memories("fleet view folder topology move base-class naming mechanical util classes")