LearnNewsExamplesServices
Frontmatter
id17805
titleThe Fleet Manager app leaves the Engine for its own repository
stateClosed
labels
enhancementairefactoringtestingarchitecture
assigneesneo-gpt-emmy
createdAtAug 26, 2026, 11:40 PM
updatedAtAug 27, 2026, 1:14 PM
githubUrlhttps://github.com/neomjs/neo/issues/17805
authorneo-opus-vega
commentsCount2
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 27, 2026, 1:02 PM

The Fleet Manager app leaves the Engine for its own repository

Closed Backlog/active-chunk-18 enhancementairefactoringtestingarchitecture
neo-opus-vega
neo-opus-vega commented on Aug 26, 2026, 11:40 PM

Context

apps/agentos — the Fleet Manager cockpit — now lives in neomjs/neo-agent-institution, which was created on 2026-08-26 and runs today against a dockerized Agent OS. The Engine still carries a full duplicate of the app, its styles, and the Electron harness. Two copies of a live application in two repositories is a divergence waiting to happen, and the Engine is the wrong owner: it is the Body, and the Fleet Manager is a product built on the Body.

This is the Engine-side completion of a move that has already happened on the receiving end.

The Problem

The Engine ships an entire application it does not own. Concretely, apps/agentos/**, three trees of agentos SCSS, and harness/** are duplicated between this repository and the institution repo, while the agentos and harness specs still run here against source that now has its canonical home elsewhere.

The institution repo also has no test/ directory at all, while its package.json already declares test-unit and test-e2e scripts pointing at test/playwright/playwright.config.unit.mjs and test/playwright/playwright.config.e2e.mjs. Those scripts are dangling today. Removing the Engine's copies without moving coverage first would leave the app with no tests in either repository.

Sequencing is therefore load-bearing: coverage moves first, removal second. A removal that lands ahead of the move converts a duplicate into a gap.

The Architectural Reality

Measured at origin/dev 514c6709bb.

Remove from the Engine — 165 files:

path files
apps/agentos/** 112
resources/scss/src/apps/agentos/** 29
resources/scss/theme-neo-dark/apps/agentos/** 2
resources/scss/theme-neo-light/apps/agentos/** 2
harness/** 20

The two theme trees are easy to miss when scoping from resources/scss/src/ alone; all three must go together or the theme build retains rules for an app that no longer exists.

The receive is complete. neo-agent-institution PR #6 merged at 48fcc8e, landing 132 product-coverage paths (103 specs + 29 support files) plus the Playwright runners the target repo lacked. Census verified against neomjs/neo@915c1a01e7: 58 unit/apps/agentos · 8 unit/harness · 58 e2e/agentos · 1 component · 1 visual spec + 6 goldens.

All 15 non-received paths carry a disposition — none falls through as a side effect of the source removal (ledger by @neo-gpt-emmy, verified here against the tree):

disposition count paths
Retire 6 2 tour/Mission-Control E2Es · 3 matching unit specs · 1 unreferenced screenshot
Move to e2e/dashboard 9 8 DemoB cross-window specs (Engine-owned subject) · TearOutMatrixRows4To7NL

FleetManagerNoTourWitnessNL.spec.mjs moved with the receive rather than retiring: what it witnesses is that the Fleet Manager runs no tour, and no-tour is now the product contract.

Keep src/ai/client/TourRunner.mjs and src/ai/client/tourScript.mjs. Removing them was considered and rejected: apps/workstation is a pure demo app that legitimately keeps its tour, and it consumes the runner at apps/workstation/view/Workspace.mjs:18. Two surviving specs also bind to it — unit/apps/workstation/tour/denseWorkstation.spec.mjs and unit/examples/dashboard/choreography/demoADockChoreography.spec.mjs. The runner keeps a real consumer and stays.

The Fix

The receive gate is closed, so what remains is the Engine-side removal. Ledger:

action paths
Remove product source 165 — 112 apps/agentos · 20 harness · 33 AgentOS SCSS
Remove received test paths 132
Retire 6
Move to e2e/dashboard 9
Old Engine paths removed 312
New Engine paths added 9
Net −303

Shared runners and Engine-owned witnesses are kept and retargeted. No tour or Mission-Control source is restored.

Acceptance Criteria

  • AC-1 — coverage lands before removal. Satisfied: institution PR #6 merged at 48fcc8e with 132 product-coverage paths and green CI on both its isolated and explicit-Brain jobs.
  • AC-2 apps/agentos/, resources/scss/{src,theme-neo-dark,theme-neo-light}/apps/agentos/ and harness/ are absent from dev. Verify: git ls-tree -r --name-only origin/dev | grep -cE '^(apps/agentos/|harness/|resources/scss/.*agentos)' returns 0.
  • AC-3 No dangling references remain. grep -rn "apps/agentos\|/harness/" --include='*.mjs' --include='*.json' --include='*.yml' src/ apps/ test/ buildScripts/ .github/ package.json returns nothing outside the generated ticket-data mirrors — resources/content/** and apps/portal/resources/data/tickets/**, both of which quote removed paths inside issue titles and are records rather than references. This is the check that the deleted apps/agentos/tour/ directory failed in the other direction — a removal whose consumer was never named.
  • AC-4 src/ai/client/TourRunner.mjs and tourScript.mjs are still present, and unit/apps/workstation/tour/denseWorkstation.spec.mjs plus unit/examples/dashboard/choreography/demoADockChoreography.spec.mjs are green.
  • AC-5 The theme build succeeds with no agentos rules emitted. npm run build-themes -- -n -e dev -t all completes and no built CSS references an agentos selector.
  • AC-6 — every non-received path is dispositioned, and the ledger reconciles. The 15 exclusions resolve as 6 retired + 9 moved; the PR shows 312 old paths removed, 9 added, net −303, and the three removal populations measured at head (112 / 20 / 33). Silence is not a disposition.
  • AC-7 — the 9 moved specs are green at their new home under test/playwright/e2e/dashboard/, and none retains an agentos import path.

Out of Scope

  • apps/workstation and its tour. It is a pure demo app; a demo may carry its own tour. Explicitly not touched.
  • src/ai/client/**. The Fleet Manager reaches the Agent OS over the wire, not through imports; the client layer is Engine capability and stays.
  • Anything under resources/content/**. That tree is the mirrored public record of issues and PRs that referenced these paths. It documents what happened and must not be rewritten.

Avoided Traps

  • Scoping the SCSS from resources/scss/src/ alone. That finds 29 of 33 and silently leaves the two theme trees behind.
  • Moving every agentos spec. 15 test source that does not exist in the destination, so moving them ports a break rather than coverage — they retire or relocate to their real subject instead.
  • Removing before the move. Turns a duplicate into a coverage gap, in a repository that currently has no test/ directory at all.
  • Removing TourRunner because its most visible consumer is leaving. It has a live consumer in apps/workstation and two surviving specs; readers orphaning a writer is the same defect class as a writer orphaning its readers.

Decision Record impact

none — this removes a duplicate application from the Engine. It records no new architectural decision and amends no ADR.

Related

#17791 (Brain executables leave the Engine — sibling removal, different subject) · #17786 · #17422 (same shape for devindex: move tests out first, then remove) · neo-agent-institution#1 (the receive ticket) · neo-agent-institution PR #6 (merged 48fcc8e) · neomjs/neo-agent-brain PR #178

Handoff Retrieval Hints

  • Retrieval Hint: "Fleet Manager app leaves the Engine agentos scss harness removal"
  • Anchor: all counts reproduce from origin/dev 915c1a01e7 via the AC-2 and AC-3 commands.

Live latest-open sweep: checked the latest 20 open issues at 2026-08-26T21:30Z; no equivalent found. A2A in-flight claim sweep: 20 most recent messages; active claims are neo-agent-brain#179 and neomjs/neo#17791 (@neo-gpt-emmy / @neo-gpt), both different scope — no collision.

Origin Session ID: 17d624e9-5964-4766-a40a-e971cfd3c5a2

— Vega (Claude Opus 5, Claude Code) 🌿

tobiu cross-referenced by PR #5 on Aug 27, 2026, 11:04 AM