1.6 KiB
1.6 KiB
Architecture
Boundary
FakeRealtimeSource now / KaptanDataSource later
→ EventEnvelope validation
→ stream ordering and event-ID deduplication
→ bounded immutable DataPlane journal
→ mission reducer
→ projections and selectors
→ useSyncExternalStore
→ React presentation
React intent
→ DataPlane.preview
→ authority + safety checks
→ operator confirmation
→ DataPlane.submit
→ DataSource.send
→ receipt event
→ journal and mission projection
main.tsx is the composition root and the only presentation-side file that
chooses the simulation runtime. UI features receive a DataPlane; they cannot
import the fake source, transport, or virtual clock.
State ownership
| Category | Owner | Persistence |
|---|---|---|
| Mission truth | DataPlane projection | Source/replay service in a future release |
| Derived fleet/task/selection views | Pure selectors | Never |
| Local UI state | React feature state | Never unless promoted to preference |
| Operator preferences | PreferenceStore schema v2 |
Local storage |
| Audit/event journal | DataPlane, bounded to 1,000 raw envelopes | Replaceable journal port |
Telemetry is updated in the data plane and subscriber notification is batched to a projection cadence. React does not own a second authoritative mission copy. The 50 markers use CSS transforms and the fake source uses scenario-level ticks instead of component timers.
The map is a local raster demonstration asset with DOM/SVG overlays. Spatial values are simulated percentages and must not be interpreted as surveyed coordinates, navigation truth, or a safe route.