Aetheria/docs/aetheria-perfect-machine-map.md
Meta Vens 6a1bb47758 Target and map: the first release is the demo
Rewrites the release target for the demo cut (one gate, one region, one boss, a fixed cast of Pirates, Zhestokost, Lucent and AU, called a demo). Adds the map's Demo scope section with body facts D1-D6 and the scope table, and sweeps four stale docs the design review listed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 19:11:46 +02:00

217 lines
10 KiB
Markdown

# Aetheria Perfect Machine Map
Date: 2026-06-12
**Parked (2026-09-11).** This migration was built and then rolled back by
commit `7006a6b0`. `F:\Projects\AetheriaEve` preserves that rebuild as a
specimen; it is not direction or precedent. Current
direction for this repo is [aetheria-release-target.md](aetheria-release-target.md) (the
demo), with [three-gates-scope.md](three-gates-scope.md) as the full game's run. Read
this document as a record of the deferred plan, not as current direction.
The cache move alone is now [cultcache-migration-target.md](cultcache-migration-target.md).
This is the Proprioception and Imagination pass for turning Aetheria from a
Unity project with ancestral cache/network/UI machinery into a coherent
GameCult machine: typed CultCache state, CultMesh networking, and Eve CultUI
surfaces lowered into Unity without JSON or RethinkDB remaining as live
authority.
## Objective
Aetheria should persist and replicate game state as typed CultCache documents,
publish multiplayer/service state through CultMesh, and render operator/runtime
interfaces from Eve CultUI surfaces. The old JSON, RethinkDB, JsonKnownTypes,
local CultCache, and legacy UI paths should be migration-only or deleted.
## Current Mechanism
- Unity client/runtime lives under `Assets/`, with gameplay scripts reading and
mutating old `CultCache` data, especially through `ActionGameManager`.
- Shared domain state is built around `DatabaseEntry`, GUID identity, MessagePack
attributes, Newtonsoft attributes, JsonKnownTypes polymorphism, and static
cache references.
- Local persistence is mostly old MessagePack files in `GameData/`, but JSON
backing stores, JSON converters, JsonKnownTypes, and Newtonsoft attributes are
still welded into the model.
- `Economy.Server` uses LiteNetLib and MessagePack messages, while its database
path still directly connects to RethinkDB and depends on the old shared cache
model.
- A vendored RethinkDB driver lives under
`Assets/Scripts/ServerShared/NIH/RethinkDb/` and pins old Newtonsoft.
- The old Unity DB inspector is an IMGUI editor window under
`Assets/Scripts/CultCache/Editor/`, tied to Rethink tables and the old
cache model.
- Runtime UI is old Unity UI/uGUI prefabs plus `MonoBehaviour` scripts under
`Assets/Scripts/UI/` and `Assets/Prefabs/UI/`.
- Aetheria already has Unity UIElements support available through
`com.unity.modules.uielements`, but no imported Eve Unity lowering package.
## Invariants
- Durable game state is typed CultCache state, not JSON documents or ad hoc
sidecars.
- Network-visible state is published through CultMesh/CultNet documents, not a
RethinkDB changefeed or bespoke status endpoint.
- Record identity belongs to CultCache record keys and typed references, not to
mutable domain base classes.
- UI surfaces are provider-owned Eve CultUI documents; Unity is a lowering
runtime, not the owner of UI truth.
- Migration code may read old formats, but old stores cannot decide live state
after migration.
- The runtime must have one commit path for user action, load/import, server
replication, and editor mutation of the same state.
## Current Authority Map
- Owner: `DatabaseEntry` plus old `CultCache` act as the practical state owner.
- Inputs: Unity gameplay code, editor DB inspector actions, legacy data files,
RethinkDB changefeeds, and server messages.
- Outputs: in-memory domain objects, old MessagePack files, optional JSON files,
RethinkDB table writes, and UI/editor projections.
- Derived state: UI panels, editor rows, Rethink table names, and serialized
payloads pretend to be projections but can still influence write paths.
- Forbidden writers: Rethink changefeed handlers, old JSON backing stores,
JsonKnownTypes converters, editor table exports, static cache globals, and
server-side `DatabaseCache` paths.
- Shared paths: manual gameplay edits, editor edits, server updates, file load,
file save, and migration all need to converge on one typed commit primitive.
- Deletion line: no new behavior should be added to the old `DatabaseEntry`,
RethinkDB, JsonKnownTypes, or IMGUI DB inspector paths.
## Target Authority Map
- Owner: `Aetheria.State`, a typed document layer backed by modern
`GameCult.Caching` and opened through a CultMesh node.
- Inputs: typed commands, save/import migration records, CultMesh replication,
editor mutations, and deterministic simulation facts.
- Outputs: CultCache `.cc` state files, CultMesh document streams, Eve surface
documents, simulation events, and migration reports.
- Derived state: Unity scene objects, HUD panels, editor inspectors, debug
views, server dashboards, and compatibility DTOs.
- Forbidden writers: Unity UI components, RethinkDB, legacy JSON stores,
`DatabaseEntry.ID`, global cache statics, and any compatibility reader.
- Shared paths: gameplay input, editor edits, import/deep-load, replication,
simulation ticks, and tests all call the same typed state service.
- Deletion line: after migration smokes pass, delete vendored RethinkDB,
Newtonsoft/JsonKnownTypes dependencies, old JSON backing stores, and the old
cache editor window.
## Intended Change
Create a modern Aetheria state runtime that opens a CultMesh node over a typed
CultCache file, registers Aetheria document types, and exposes narrow ports for
gameplay, editor tools, migration, and UI projection. The state runtime becomes
the only live writer. Everything else becomes a consumer, a command source, or
a migration reader.
Use modern CultLib surfaces:
- `GameCult.Caching` for `[CultDocument]`, record keys, indexes, references,
schema catalog, and typed persistence.
- `GameCult.Caching.MessagePack` for the binary CultCache backing format.
- `GameCult.Mesh` for node/database illusion, durable shard logs, Verse
descriptors, authority leases, replication, and peer discovery.
- Eve CultUI for portable UI documents and command envelopes.
## UI Direction
Unity should lower Eve surfaces through UI Toolkit, not through the old uGUI
CultUI package as the strategic path.
The package should live in the Eve repo as an importable Unity package, for
example `org.gamecult.eve.unity-uitoolkit`. It should consume
`gamecult.eve.surface.v1` and `gamecult.eve.command.v1`, lower retained
components into `UIDocument`/`VisualElement` trees, and publish commands back to
the provider through CultMesh/CultNet.
Aetheria should import that Eve package and provide surfaces. It should not own
a bespoke Unity lowering. The existing CultLib Unity uGUI package remains useful
as prior art for resolver-backed controls and inspector generation, but it is
not the new portable UI authority.
First Aetheria surfaces to publish:
- runtime HUD
- inventory
- menu shell
- sector/map view
- typed state inspector
- migration report / quarantine viewer
- server/session status
## Migration Phases
1. Baseline
- Record the current compile/test status for Unity and .NET projects.
- Keep this map current before cutting code.
- Count old authority references with `rg` so deletion has a visible target.
2. Modern state spine
- Add references to modern `GameCult.Caching`,
`GameCult.Caching.MessagePack`, and `GameCult.Mesh`.
- Create `Aetheria.State` document definitions using `[CultDocument]`,
`[MessagePackObject]`, `[CultName]`, `[CultIndex]`, and typed references.
- Add a smoke that writes, flushes, reopens, and reads typed state from a
CultCache `.cc` file.
3. Legacy quarantine
- Move legacy readers into an explicit migration namespace/project.
- Read old `GameData/AetherDB.msgpack` and related files without granting
them runtime authority.
- Emit typed CultCache records plus a migration ledger.
4. Runtime cutover
- Replace `ActionGameManager` cache bootstrap with the new state runtime.
- Convert domain references from GUID/base-class patterns to typed record
refs.
- Remove runtime dependency on old `CultCache` and `DatabaseEntry` as owners.
5. Mesh host
- Replace `Economy.Server` RethinkDB and LiteNetLib database authority with a
CultMesh node.
- Keep any transport bridge only if it delegates to CultMesh and protects a
named external compatibility contract.
- Publish Verse descriptors and state subscriptions through CultMesh.
6. Eve UI
- Build or import the Eve UI Toolkit lowering package from the Eve repo.
- Publish Aetheria UI as Eve surfaces.
- Replace the old IMGUI DB inspector first, because it is closest to state
authority.
- Then replace runtime HUD/menu/inventory/map screens.
7. Purge
- Delete vendored RethinkDB.
- Delete JsonKnownTypes.
- Delete Newtonsoft dependencies and attributes from live code.
- Delete old JSON backing stores.
- Delete or quarantine old cache abstractions that no longer protect an
invariant.
## Verification
- `rg "Newtonsoft|JsonObject|JsonProperty|JsonConvert|JsonKnownTypes|RethinkDb|RethinkTable|DatabaseCache"` is zero outside migration quarantine and docs.
- `rg "DatabaseEntry" Assets Economy.*` shows no live runtime ownership path.
- `dotnet list package --vulnerable --include-transitive` is clean for active
maintained projects.
- CultCache smoke proves write, flush, reopen, query, and typed reference
resolution.
- CultMesh smoke proves node start, typed put/get, subscription, flush, and
reopen.
- Migration smoke proves old data can be read once and converted without old
readers remaining on the live runtime path.
- Unity play smoke proves runtime UI reads from Eve surfaces and sends commands
through the shared state service.
- UI Toolkit lowering parity compares Aetheria surfaces against the Eve browser
renderer for component tree, state bindings, command envelopes, disabled/stale
states, and visible error surfaces.
## Immediate Cut Line
Do not bump Newtonsoft as the fix. That keeps the wrong organ alive with newer
paint on it.
The first implementation cut should create the modern typed state spine and a
legacy quarantine. After that, every RethinkDB/Newtonsoft/JsonKnownTypes removal
has somewhere clean to land, and every old path can be judged by whether it
still owns behavior.