novolis-governance / imports-todo/fleetcommander-patterns-for-platform.md
FleetCommander — platform patterns (mine, pieces only)
Policies that keep the org coherent
dotnetgovernancenovolis
Status (2026-05-25): WEGO replay shipped asNovolis.Simulation.Replay(+ optionalISimulationEventStore<T>spike). FleetCommander repo should adopt via PackageReference in headless tests. Master plan: platform-import-plan.md.
Source: D:\repos\FleetCommander (also on D:\github\FleetCommander)
Verdict: Product — do not import the repo. Extract patterns into novolis-simulation, novolis-transports, novolis-storage, novolis-machinelearning as needed.
What (worth borrowing)
| FleetCommander area | Types / behavior | Novolis target |
|---|---|---|
| WEGO simulation | RoundPlan → lock → RoundSimulator.Resolve → RoundPackage / GameEvent list | Novolis.Simulation.* — deterministic round pipeline |
| Replay | ReplayTimeline, RoundRecord, ReplayScrubber, MessagePack RoundPackageMessagePack | New facet e.g. Novolis.Simulation.Replay |
| Interpolation | Interpolate / InterpolateFromPackage for render scrub | Simulation.View or app bridge |
| Transport | FleetCommander.Transport.Abstractions + InProcess Channel + SignalR | Inspiration for test transport; SignalR stays in apps |
| Scenarios | JSON scenarios under .storage/blob/scenarios/ | Novolis.Simulation.World.Builders or scenario loader |
| Headless CLI | FleetCommander.Headless play-scenario | Dogfood pattern for simulation tests |
| AI | ONNX + heuristics; uses Frank.ML.Foundation.Neural NuGet | Already aligned with novolis-machinelearning; keep training in product |
| Rendering | Veldrid + Raylib adapters | Skip — use novolis-rendering + novolis-raylib; FC renderers are product-specific |
Why
- simulation-layer-policy.md lists replay under Simulation; `Novolis.Simulation.Replay` is implemented (WEGO-style timelines; racing still uses ticks).
- FleetCommander is the most mature deterministic sim + replay + transport Frank product on disk.
- Full import would violate boundaries (Veldrid, SignalR, Azure storage, game domain in platform).
How
P1 — Replay facet (shipped)
Status: Novolis.Simulation.Replay in novolis-simulation (SimulationTimeline, InMemorySimulationRecorder, ReplayPlayback, SimultaneousPlanBuffer).
Original spike steps:
- ~~Spike in
novolis-simulation(new projectNovolis.Simulation.Replay):~~
ISimulationRecorder/ISimulationPlaybackwith immutable snapshots (BCL + optional MessagePack).- Borrow data model from
RoundRecord/ReplayTimeline, not FC namespaces or ship/combat types.
- Unit tests: record 10 ticks of
Novolis.Simulation.Racingor a minimalSimulationWorld→ playback equality. - No PackageReference to FleetCommander.
P2 — WEGO planning (only if SCR/WEGO product needs it)
PlanBuffer+ simultaneous commit phase — generic names inNovolis.Simulation.Abstractions.- Document difference vs real-time
SimulationClocktick.
P3 — Scenario JSON loader
- Extract schema style from FC scenario files for dogfood; keep game content in apps.
Skip (duplicates)
| FC piece | Already in Novolis |
|---|---|
| Raylib rendering project | novolis-raylib |
| Neural foundation | novolis-machinelearning |
| General physics | novolis-physics |
| Aspire host | novolis-aspire (separate) |
Acceptance
- Replay facet documented in
library-boundaries.mdplacement table when implemented. - Zero
FleetCommander.*references in platform packages.