Novolis Docs
novolis-governance / imports-todo/star-conflicts-revolt-patterns.md

Star Conflicts Revolt (SCR) — patterns for platform (mine, product)

dotnetgovernancenovolis

Source: D:\github\StarConflictsRevolt (not under D:\frankrepos; ~54 projects). Product rule: StarConflictsRevolt.Server.Simulation stays product code. Platform is Novolis.Simulation.* per library-boundaries.md.

Why this was easy to miss

  • SCR is not in the d:\novolis workspace or D:\frankrepos scan.
  • It lives on `D:\github\StarConflictsRevolt` only (plus governance references to StarConflictsRevolt.Server.Simulation).
  • It is not WEGO/tactical like FleetCommander — it is 4X strategy with server-authoritative event sourcing.

What SCR contains (high value)

AreaLocationPattern
Event log replaySessionAggregate.ReplayEvents, IEventStore, WorldEngineAppend-only IGameEvent → apply to World
Deterministic ticksGameSim, Advance*Tick eventsSeeded RNG per session/tick for encounters
Game modelStarConflictsRevolt.Server.GameModelFleets, diplomacy, encounters, economy — product domain
Storage facetsJsonFiles, LiteDb, InMemory, LocalEvent persistence — compare novolis-storage
CoordinationGarnet + InMemorySession/coordination — not in Novolis yet
ClientsRaylib hosts, multiplayer SignalRApps compose Novolis + SCR — no platform merge
Spatial spec consumerinertial-frame-stack-spec.mdFuture novolis-spatial driven by SCR needs

What to import (pieces only)

P1 — Event journal abstraction (platform)

SCR's IGameEvent + ApplyTo(World) is domain-specific. Platform analogue (new or extend Novolis.Simulation.Replay):

Platform typeSCR analogue
SimulationTimeline<TState>Snapshot after each tick
ISimulationStepRunner<TState>Re-run one tick for integrity
Future: ISimulationEvent<TState> + ISimulationEventStoreIGameEvent + IEventStore — generic, no fleet/planet types

Do not port World, Fleet, or GameSim into Novolis.Simulation.

P1 — Replay (implemented 2026-05)

See `Novolis.Simulation.Replay` — tick timelines + SimultaneousPlanBuffer for WEGO-style commit collection. SCR should keep event JSON lines in product storage; optionally also emit platform timelines for debug/scrub.

P2 — Encounter resolver pattern (inspiration)

AbstractEncounterResolver + deterministic Random — useful for Physics/Simulation tests, not a new package. Reimplement as small helper in product or novolis-physics tests.

P2 — Storage event line format

StarConflictsRevolt.Storage.Local persisted event lines — inspiration only. Platform novolis-storage exposes generic StreamId + IEventStore (not IGameEvent / WorldId). SCR keeps product event types in StarConflictsRevolt.Server.GameModel.

P3 — Garnet coordination

Server.Coordination.Garnet — product-only unless Novolis hosts multi-node sessions.

Skip (duplicates or wrong lane)

SCR pieceReason
Raylib bindings / codegennovolis-raylib
Server.Simulation namingProduct; do not rename per governance
Client rendering (Veldrid path in FC; SCR uses Raylib hosts)Apps
Full GameModelProduct

vs FleetCommander

FleetCommanderStar Conflicts Revolt
GenreWEGO tactical rounds4X tick + orders
Replay unitRoundRecord + GameEvent listIGameEvent stream + version
Platform fitSimultaneousPlanBuffer + timelineEvent store interface + tick timeline
Repo pathD:\repos\FleetCommanderD:\github\StarConflictsRevolt

How SCR should consume platform work

  1. PackageReference Novolis.Simulation.Replay for headless regression timelines.
  2. Keep product event types in StarConflictsRevolt.Server.GameModel — adapter maps tick end state → SimulationStepRecord when useful (not in Novolis.Storage.*).
  3. PackageReference Novolis.Transports.Tcp.* / Http for any custom wire protocols (not SignalR replacement).
  4. `novolis-spatial` when spec moves from draft — SCR dogfoods first.

Acceptance

  • This doc linked from README.md.
  • No ProjectReference from novolis-simulation to SCR.
  • SCR event store remains product; platform offers optional generic event-store interface only if second consumer appears.