Aetheria/Aetheria.State/README.md
2026-07-09 19:46:41 +01:00

465 lines
30 KiB
Markdown

# Aetheria.State
`Aetheria.State` is the replacement owner for durable Aetheria game state.
It uses modern `GameCult.Caching`, `GameCult.Caching.MessagePack`, and
`GameCult.Mesh`. It does not reference the old `Assets/Scripts/ServerShared`
tree, RethinkDB, JsonKnownTypes, or Newtonsoft.Json.
The first live state files are `GameData/aetheria-world.cc` for daemon-owned
Verse state and `GameData/aetheria-client.cc` for the client-owned active Verse
target. `Aetheria.State.Import` generates the daemon-owned world file from
checked-in legacy catalog inputs without embedding machine-local absolute
paths. Legacy files such as `GameData/AetherDB.msgpack` are migration inputs
only.
The typed runtime state model is split into player settings, loadout templates,
run state, zone state, entity snapshots, item slots, weapon groups, action-bar
bindings, stat grids, and runtime session documents. Runtime checkpoints
include current action-bar bindings as stable typed targets: input control
path, binding kind, item key, equipment index, behavior index,
or weapon-group index. They also include current faction relationship rows as
typed corporation references plus relationship tokens and numeric standings.
Zone checkpoints include typed orbit and body rows for generated celestial
state: orbit IDs, parent IDs, distance, phase, fixed positions, body kind,
typed resource item keys, gravity/body multipliers, asteroid entries, and gas/sun visual
parameters. Entity checkpoints include typed simulation stat grids for
temperature, thermal mass, armor, max armor, and hull-conductivity axes.
Player settings include player name, tutorial flag,
story-file hash cursors, gameplay formatting, graphics preferences, input
binding overrides, and action-bar inputs. Do not preserve `SavedGame`, Unity
runtime settings projections, or runtime entity blueprints as opaque payloads in
the new store; they are source shapes for projection, not portable state
authority.
The Unity client no longer writes `PlayerSettings.msgpack`, `.loadout`, or
`.zone` files. `AetheriaPlayerSettings` is the typed Verse replacement for
`PlayerSettings.msgpack`, and `AetheriaLoadoutTemplate` is the typed Verse
replacement for bespoke loadout files, with structured hull/equipment/cargo/
docking item slots, nested child-entity loadouts, and weapon groups.
`RuntimePlayerSettings` is the Unity session projection for menus, formatting,
and input binding display. Menu and input-screen changes send typed Eve request
documents to the provider-owned Aetheria Verse service; they are not portable
state authority and must not mutate daemon-owned state inside Unity.
The old `.cc.pending` runtime commit document lane is deleted. Gameplay state,
loadout templates, and run checkpoints are accepted by the daemon/Verse owner
through typed state operations and daemon command documents, not by
renderer-side commit authority.
`AetheriaRuntimeSession` is the typed Verse signal for the running daemon.
`Aetheria.State.Daemon` owns the long-running `aetheria-daemon` heartbeat and
publishes `starting`, `running`, and `stopping` states through `Aetheria.State`;
legacy outbox status remains operation telemetry, not daemon-session ownership.
The daemon also owns the first deterministic abstract combat kernel. That
kernel consumes native runtime run/zone/entity snapshot commits directly and
mutates those same snapshot rows: stat grids for hull, shield, heat, thermal
capacity, signature masking, cognition, cognitive load, fire control, and
munition pressure; contact rows for track confidence and visibility; and native
weapon-state rows for abstract firing and lock state. It is meant for
out-of-view combat advancement and balance simulation without creating a second
private combat state model. The current C# host exposes it behind
`--abstract-combat-kernel` while the older shared daemon simulation remains the
default compatibility path. The promotion path is to move this authority into
the Rust daemon/Ymir simulation body, not into Unity or a renderer package.
Unity Eve surfaces construct typed `gamecult.eve.command.v1` command documents.
`AetheriaRuntimeVerseClient` is the shared CultMesh client boundary for
headless, Unity, and non-Unity runtimes. Typed command clients submit directly
to the same Verse records; there is no command-port facade or cached submitter
between client code and the Aetheria state graph.
`AetheriaEveCommandBridge` is the provider-owned command acceptor for those
records: it validates the provider, surface, and command template before
running the narrow refresh handlers for the catalog and operations surfaces
plus the typed player-settings mutation handlers for gameplay/graphics Eve
controls and typed Verse-host visibility commands. Renderer callbacks do not
accept commands or mutate game state locally.
`AetheriaEveRuntimeBootstrap` mounts the `aetheria.operations` surface through a
runtime-created `UIDocument` after scene load, with environment and command-line
switches for diagnostics. UI Toolkit is now a live runtime lowering path, not
only a package sample.
The old `SavedGame`/`SavedZone` DTOs and `Galaxy` loader constructor have also
been deleted; the new document family is live Verse run/zone state, not a
bespoke save-file format.
Daemon run frames project into Unity through the explicit
`EntityConstructionBlueprintProjector.ProjectObservedFromBlueprint` lowering
path; authoritative blueprint construction remains named separately as a
migration target for code that still has to move into the daemon.
Main-menu gameplay boot also projects the daemon run through
`Galaxy.ProjectObservedDaemonRun` rather than constructing or generating a
Unity-owned run. The Unity handle for this shell is
`ActionGameManager.ObservedGalaxy` to keep the client-side object named as an
observation.
The dead `SavedStory` JSON DTO is gone. `ZoneConstructionBlueprint` and
`RuntimeEntityBlueprint` remain in-memory construction/loadout projections for
Unity runtime code, with `RuntimeEntityBlueprintProjector` capturing and
instantiating those projections. They no longer carry save-file or serializer
vocabulary, and they do not declare MessagePack persistence attributes.
Keyboard layout rendering now builds the static ANSI-104 display as typed
`InputLayout` rows and columns. It no longer reads a checked-in JSON text asset
or uses `SimpleJson` for display geometry. The generated `AetheriaInput` wrapper
still calls Unity's `InputActionAsset.FromJson`; that is an engine-owned
lowering boundary under Aetheria's remapping layer, not a save format or state
owner. The old generated `GameData/KeyboardLayouts/*.msgpack` cache and the
checked-in `ansi104.json` display file are deleted. Remapping and action-bar
edits are owned by typed `AetheriaPlayerSettings` commits, and the live input
screen now lowers through Eve/UI Toolkit instead of the old drag/drop uGUI
shell. Keyboard display layout edits remain runtime-only until Verse owns a
typed layout document.
The unused Unity Localization package and imported Google Sheets localization
sample have been removed; the old transitive Unity Newtonsoft package is no
longer in the manifest or package lock.
The old IMGUI CultCache database editor has been deleted, and `NameTools` no
longer exports `NameFile/*.msgpack`. `AetherDB.msgpack` and existing name files
remain legacy catalog inputs only; typed catalog records are the durable owner.
Dead legacy catalog roots for user records and galaxy map-layer resources have
been deleted from live Unity source. Surviving runtime DTOs no longer carry
legacy catalog group/table annotations; their remaining metadata is projection
and inspection metadata for the typed runtime bridge.
Item instances now carry `AetheriaRuntimeItemReference`, a typed item-key
facade. `ItemInstance.ItemKey` is the identity surface; the old `ItemId`
legacy-GUID projection has been deleted from item instances.
Cargo inventory indexes, consumable activation lookup, action-bar consumable
quantity/fill, transfer lookup, trade owned counts, weapon ammo references, and
item-use behavior references now use item keys. The old cargo/consumable GUID
lookup overloads and the derived behavior `AmmoType`/`Item` GUID properties
have been deleted. Action-bar consumable bindings now read the target `ItemKey`
directly from typed runtime catalog rows instead of reconstructing it from
legacy item IDs.
Daemon snapshot DTOs carry typed `ItemKey`/`HullItemKey` fields only for
loadout items, action-bar targets, body resources, entity hulls, and active
consumables; daemon command application no longer reconstructs item keys from
legacy item GUID fields.
Daemon snapshot DTOs now carry typed `FactionKey` only for loadout entities,
run entity snapshots, and faction relationship state. The old command-document
`CorporationLegacyId` fallback fields are deleted.
`EntityConstructionBlueprint` also carries `FactionKey` only. Loadout restore,
entity construction, run entity snapshots, and faction relationship commits no
longer rebuild corporation references from legacy `Faction.ID` GUIDs.
Galaxy faction relationship projection is also typed-key-only: the old
`Faction.Allegiance` GUID dictionary, GUID containment helper, and GUID faction
resolver are deleted from the simulation shell.
The remaining temporary `Faction` shell also uses `GeonameFileKey` and
`BossHullItemKey`; it no longer parses name-file or boss-hull legacy IDs into
GUID link fields.
`Faction` equality, hashing, narrative constraints, sector display filtering,
sector-map link/influence rendering, zone security ownership checks, and
runtime faction-relationship ordering now use `FactionKey`. The legacy
`Faction.ID` projection field is deleted from the temporary simulation shell.
Run checkpoint snapshot DTOs carry typed `OrbitKey`, `ParentOrbitKey`, and
`BodyKey` only for zone orbit/body snapshots. The old command-document
`OrbitLegacyId`, `ParentLegacyId`, and `BodyLegacyId` fallback fields are
deleted. Behavior-state daemon snapshots and readback snapshots carry typed
body-key fields for resource scanner targets and mining tool asteroid belts;
the old raw body ID commit/readback field names are deleted. `ResourceScanner`
and `MiningTool` now retain typed body-key runtime state directly, while
`Zone` owns parsing and resolution at the current Unity body runtime boundary.
`Zone`, `Planet`, `AsteroidBelt`, and `Orbit` now own the runtime body/orbit
key surfaces used for projection, and `ActionGameManager` no longer formats or
resolves body/orbit keys locally while checkpointing or restoring state.
Typed `AetheriaZoneState` orbit/body snapshot rows now use `OrbitKey`,
`ParentOrbitKey`, and `BodyKey` property names all the way through the typed
document and runtime catalog readback surface; the old `...Id` names were only
legacy-shaped aliases for those key strings and are gone.
Orbit-targeting agent runtime also now retains typed orbit keys directly:
`PatrolOrbitsTask`, `MoveToOrbitState`, and `StationTowing` no longer own raw
orbit GUID targets, and `Zone` resolves orbit keys for agent orbit movement.
Orbital runtime entities and their construction blueprints now follow the same
rule: `OrbitalEntity` and `OrbitalEntityConstructionBlueprint` retain
`OrbitKey`, runtime loadout generation seeds the empty value as `""`, and
`Zone` resolves orbit keys for orbital entity movement and dock camera parent
lookup.
Renderer and gameplay orbit consumers now stay on that keyed edge too:
intro-cutscene planet selection, zone planet/belt loading, gas-giant parent
lighting, asteroid-belt UI setup, and `ResourceScanner` planet range checks all
read `OrbitKey` from runtime wrappers and ask `Zone` to resolve it instead of
reading wrapper GUID orbit fields directly.
`Planet` and `AsteroidBelt` runtime wrappers no longer publish separate wrapper
orbit GUID fields either: they keep `OrbitKey` plus their `Orbit` runtime
object, and `Zone` lowers asteroid transforms through `belt.Orbit.ParentOrbitKey`
instead of reading a raw wrapper orbit GUID.
`Zone`'s own public key-facing lookup surface is also now natively keyed:
body and orbit lookups resolve through key-indexed runtime dictionaries rather
than reparsing GUIDs from `BodyKey` or `OrbitKey` strings before touching the
Guid-indexed substrate.
The live asteroid helper surface follows the same rule: nearest-asteroid,
asteroid-exists, transform-update, and mining paths now use typed body keys or
runtime `AsteroidBelt` objects directly instead of Guid asteroid-belt helper
overloads.
The package runtime catalog snapshot indexes items by canonical item key; Unity
gameplay, HUD, inventory, trade, ship, and zone helper lookups use `ItemKey`
directly instead of deriving `ItemId` and searching by legacy GUID.
The Unity runtime package snapshot also no longer exposes item, corporation, or
name-file lookup by legacy ID, and its item/corporation/name-file DTOs no
longer publish legacy relationship fields. Canonical legacy-ID lookup remains
only in `Aetheria.State` migration/catalog inspection APIs.
The shared runtime item catalog reader is also item-key-only now: its GUID index,
`GetRuntimeItem(Guid)` entry point, raw GUID string fallback,
`AetheriaRuntimeItemReference(Guid)` constructor, `FromLegacyId`, and reverse
legacy-GUID projections have been deleted.
`ItemManager` now reads typed item rows directly from the shared
`AetheriaRuntimeCatalogSnapshot`; the redundant `AetheriaRuntimeItemCatalog`
adapter layer has been deleted.
The old generic `RuntimeCatalogLink<T>` abstraction, `ItemManager.GetData`
hydration path, vague `ItemInstance.Data` identity field, and old
`RuntimeItemReference.Projection` cache have been deleted; runtime item facts
come from typed catalog rows.
ItemManager's behavior construction no longer exposes a generic GUID reader or
item GUID projection helper. Migrated legacy-id behavior payload fields carry
`LegacyIdValue` as provenance/backfill only; gameplay item behavior reads the
typed `ItemKeyValue` emitted by import/runtime projection.
Loadout generation now applies typed catalog prefilters for item category,
hardpoint type, shape fit, hull type, and behavior kind, then instantiates
generated equipment directly from typed runtime rows.
Typed item definition `Category` values are stable Aetheria tokens such as
`hull`, `weapon`, `gear`, `cargo-bay`, and `docking-bay`; legacy union class
names remain migration provenance, not live category predicates.
The surviving trade menu also applies typed catalog prefilters for row size,
hardpoint type, and behavior kind before legacy buy actions.
The old `ItemData`/`EquippableItemData`/`HullData`/`WeaponItemData` DTO
hierarchy has been deleted from live Unity source. Shared runtime geometry and
stat primitives now live in `RuntimeGeometry.cs`; item facts come from typed
runtime rows. The old `RuntimeCatalogEntry` and `RuntimeItemProjectionEntry`
base names no longer appear in live source.
The dead `InspectableRuntimeCatalogLinkAttribute` inspector metadata is gone;
live Unity source no longer carries `LegacyPayloadKeyAttribute` either.
Catalog import and migration readers own deterministic legacy field layout
through explicit key maps, while runtime behavior construction uses an explicit
typed behavior-kind mapper.
Agent task DTOs no longer inherit the item projection base; they are local
runtime AI work orders until a typed Verse task document exists.
`Aetheria.State.Import` captures the legacy catalog files into typed quarantine
state: path, size, and SHA-256 fingerprint for `AetherDB.msgpack` plus
`NameFile/*.msgpack`, and a migration ledger update. It also performs a bounded
raw MessagePack union pass that maps stable catalog fields into typed
item/faction/name-file documents without compiling Unity's legacy domain model
into `Aetheria.State`. The current checked-in catalog maps to 115 item
definitions, 12 factions, and 12 name files. Typed item definitions include
legacy manufacturer IDs, price, shape dimensions, occupied cell counts, full
shape-cell masks, interior shape masks for hull/cargo equipment, hull hardpoint
definitions, behavior kind fingerprints, typed recursive behavior payloads, and
stable equipment facets: hardpoint type, hull type, stack size, durability, and
weapon range/caliber/type/fire/modifier classifications.
Typed corporation documents include the legacy short name, the true description
field from key 3, name-file and boss-hull legacy IDs, influence distance,
allegiance count, full allegiance edges, and music bank IDs. Corporation
documents are `aetheria.corporation.v2` records because runtime generation
needs actual allegiance weights, not only display counts. Runtime checkpoints
now persist session faction relationships into typed run state, and runtime
sessions publish typed state-host liveness. Zone checkpoints persist generated
orbit/body rows into `AetheriaZoneState`, so `ZoneConstructionBlueprint` is a
one-shot construction input carrying typed orbit/body keys rather than the retained surface carrying celestial graph facts. Entity checkpoints
persist hull simulation grids into `AetheriaEntitySnapshot`, so
`EntityConstructionBlueprint` is no longer the only surface carrying those live
values. Run checkpoints project the flattened live entity graph, including
docked children, into exact typed entity snapshot records. Continue restore
lowers the current zone entity graph from those records, including position,
velocity, target/contact state, child/docking relationships,
shutdown/heatsink state, thermal exposure, active consumable timers, and typed
stat grids for temperature, thermal mass, armor, max armor, and hull
conductivity. Continue also lowers typed weapon and behavior runtime rows back
into live equipped-item and active-consumable behavior instances through
behavior-owned restore methods; construction/loadout blueprints do not own
behavior replay. Broader runtime object graphs without typed rows remain legacy
until dedicated typed runtime documents exist. Live behavior
instances expose typed behavior kind and group through `Behavior.Kind` and
`Behavior.Group`; behavior construction now reads typed payload fields through
`RuntimeBehaviorDefinition` instead of projecting through config DTOs. Stat
modifiers ask live behavior instances for target stats instead of reading
behavior config objects directly; base `Behavior` captures a runtime stat table
at construction without config reflection.
Heat, EnergyDraw, and Cooldown behavior instances now copy their constructor
stat/scalar inputs into explicit runtime fields and no longer retain their
config subclasses after construction.
Wear, Visibility, Reflector, VelocityLimit, VelocityConversion, and ItemUsage
also copy their constructor stat/key/scalar inputs into explicit runtime fields
instead of retaining config subclasses.
Capacitor, Shield, Thruster, MiningTool, ResourceScanner, Thermotoggle, Switch,
HeatStorage, and Cockpit have also dropped runtime config retention. Thermotoggle
adjustability is exposed on the live behavior instance, not through its config.
Reactor, Radiator, Sensor, and StatModifier now copy their constructor
performance stats, curves, flags, and target strings into explicit runtime
fields; those live behaviors no longer retain their config subclasses.
AetherDrive now follows the same rule for rotor geometry, performance stats,
torque curve, audio parameters, and prefab path. Weapon, InstantWeapon,
ConstantWeapon, ChargedWeapon, and LockWeapon now copy constructor stats,
curves, ammo/reload fields, guided projectile profile fields, burst/cooldown
fields, charge multipliers, and lock parameters into runtime-owned fields.
Behavior instances no longer retain construction config DTOs after
construction.
Cockpit, HeatStorage, Switch, Trigger, and TurretController read directly from
typed runtime behavior definitions.
Heat, EnergyDraw, Cooldown, Wear, Visibility, Reflector, VelocityLimit,
VelocityConversion, and ItemUsage also bypass the temporary config bridge and
read typed behavior fields through `RuntimeBehaviorDefinition`, registering
runtime performance stats explicitly for `StatModifier`.
Capacitor, Shield, MiningTool, ResourceScanner, Thermotoggle, and Thruster now
follow the same direct-definition path.
Reactor, Radiator, Sensor, StatModifier, and AetherDrive also read typed
payload fields through `RuntimeBehaviorDefinition`; AetherDrive registers its
live performance-stat names explicitly for `StatModifier`.
Weapon, InstantWeapon, AutoWeapon, ConstantWeapon, ChargedWeapon, LockWeapon,
Launcher, and GuidedWeapon payloads also construct directly from
`RuntimeBehaviorDefinition`. The old `RuntimeBehaviorConfig` bridge,
`BehaviorPayloadReader`, and weapon config hierarchy are deleted.
Typed name-file documents are `aetheria.name_file.v2` records. They carry the
legacy ID, display name, count, compact sample names for surfaces, and the full
name array used by `Galaxy`/Markov name generation through typed name-file
keys rather than legacy `NameFile.Names`.
Legacy GUID references that are `Guid.Empty` are imported as absent references,
not as resolvable catalog links.
Before materializing state, the importer clears the generated `.cc`,
`.cc.records`, and `.cultmesh` outputs for the selected state path. Legacy
catalog inputs are captured first and are not deleted. This lets schema changes
rebuild the typed artifact instead of failing on a stale embedded schema catalog.
`AetheriaCatalogSnapshot` is the typed read surface over materialized catalog
documents. It exposes trade items, legacy-ID migration lookup, typed
manufacturer/corporation/name-file key lookup, corporation prefix lookup,
equipment items, behavior lookup, and hardpoint lookup without reading runtime
projection DTOs.
`AetheriaCatalogSurfaceProjector` publishes the first Eve-compatible provider
surface from typed catalog state. The importer materializes
`gamecult.eve.surface.v1` at `eve:surface:aetheria.catalog.operator` with
summary, trade-catalog, and corporation views. This is a typed CultCache
provider document and a local mirror of the Eve contract until the shared Eve
Unity UI Toolkit lowering package exists.
`Aetheria.State.Unity` is the Unity-facing runtime read facade over typed state.
It resolves the active Verse through the client-owned `aetheria-client.cc`
target document, then opens the selected typed state source. Today that source
is still a local `.cc` file transport, so the facade emits immutable catalog
read models for trade, equipment, behavior, hardpoint, manufacturer,
corporation, and name-file queries, exposes typed item shape masks for layout
and fitting consumers, exposes typed interior masks and hardpoints for
equipment/cargo layout consumers, exposes typed behavior payload read models,
can read typed player settings for Unity boot, and can read the published Eve
catalog surface. It does not deserialize legacy runtime projection objects and
does not write daemon-owned Verse state. Unity can use this as the first
package boundary once CultLib/Eve runtime packaging is available.
Unity `MainMenu` now lowers a typed Verse settings shell over that split:
client-target edits persist locally in `aetheria-client.cc`, while Verse-host
visibility changes append provider-owned Eve request documents against the
selected local Verse state file.
`Galaxy` now consumes this package-owned runtime catalog for faction selection
and name generation, so generated sectors use typed corporation v2 and
`aetheria.name_file.v2` records instead of legacy `Faction`/`NameFile`
catalog documents. Loadout manufacturer-distance weighting also resolves
manufacturers through typed corporation keys rather than parsing manufacturer
legacy IDs. `Galaxy` still projects typed corporations into temporary `Faction`
DTOs, including local GUID equality for the surviving simulation surface,
because the surrounding simulation has not yet been rebuilt around typed
corporation records. The DTOs now carry typed faction/name-file keys and typed
allegiance edges so they cannot reclaim catalog lookup authority.
`Aetheria.State.Smoke` writes and reopens full typed player settings plus a
typed loadout template in addition to world, catalog, run state, zone state, and
an entity snapshot. It also writes and reopens `AetheriaRuntimeSession`, the
provider-owned `aetheria.player_settings` Eve surface, and player-settings Eve
commands that mutate typed significant-digit and minimap-asteroid settings
through the provider bridge. The smoke checks that the Eve provider advertises
the runtime-session schema and player-settings command surface. The run smoke
proves a typed run can reference a typed zone, the zone can preserve
orbit/body rows and reference typed entity snapshots, and entity snapshots can
preserve equipment slots, weapon groups, and simulation stat grids without
reviving `PlayerSettings.msgpack`, `.loadout`, or `.zone` serialization.
Unity `MainMenu` now lowers that same player-settings Eve document contract
locally through UI Toolkit instead of hand-authoring separate gameplay/graphics
widgets; the menu shell keeps name entry and back-navigation while gameplay
still owns command semantics through `ActionGameManager.RequestRuntimePlayerSettingsCommand`.
The run document also carries `CurrentEntityKey`, so Continue restore binds the
saved player entity by exact typed record identity instead of reconstructing it
from a transient entity-slot index. Canonical typed run state no longer stores
`CurrentZoneEntityIndex`; older stored runs are translated through the package
reader into `CurrentEntityKey`. The older runtime commit importer has
been removed from the first-party state host and Unity package.
`Aetheria.State.Verify` opens a materialized state file and checks that the
typed migration ledger matches the actual item, corporation, and name-file
records in the `.cc` store. It also verifies the canonical legacy-ID lookup API
for one migrated record of each catalog kind, checks that name-file v2 records
carry their full name arrays, and checks that expanded item and corporation
catalog facts survived materialization. The verifier also exercises the typed
catalog snapshot query surface, shape-mask invariants, the typed behavior
payload tree, and the published Eve catalog surface. The current catalog
materializes 65 behavior payloads, 661 behavior fields, and 18 behavior-side
legacy-ID references. Legacy content currently includes at least one overhanging
hardpoint; the verifier preserves the payload and checks hardpoint local masks
rather than silently converting content repair into migration. The verifier also
fails if live `Assets/Scripts` source grows back serializer or legacy database
symbols such as MessagePack, Newtonsoft, JsonKnownTypes, RethinkDB, or old
`DatabaseEntry`/`DatabaseLink` references; the remaining MessagePack usage is a
named package/import CultCache transport boundary, not gameplay state authority.
The package boundary is also fenced: MessagePack symbols may only appear in the
runtime catalog reader, CultCache document store, and typed runtime/Eve
command document files until generated CultCache serializers replace that
temporary Unity-side codec. The verifier also checks that the Eve runtime
bootstrap exists, mounts the operations surface through the UI Toolkit presenter,
and keeps renderer commands routed through the typed Eve command inbox.
Use it after import when `GameData/aetheria-world.cc` changes.
`Aetheria.State.Unity.Smoke` opens the materialized state through the runtime
facade and proves read-only Unity-facing catalog access without the legacy
catalog reader. Live Unity code uses typed Eve or daemon request documents
instead of runtime commit outboxes. Runtime and Eve requests are typed `.cc`
records with embedded schema catalogs; their current record payload codec is
still temporary package code until Unity consumes generated CultCache
serializers directly.
`Aetheria.State.Daemon` opens the CultMesh Verse daemon, publishes daemon-owned
Verse identity/health/game/editor surfaces, accepts observed Eve command
documents on startup, and executes observed daemon command records each tick.
For a bounded one-shot daemon tick:
```powershell
dotnet run --project .\Aetheria.State.Daemon\Aetheria.State.Daemon.csproj -- --once
```
The daemon publishes `AetheriaEveCommandAcceptanceStatus`, the
`aetheria.operations` Eve surface, and the
typed `aetheria.player_settings` Eve surface after request acceptance attempts,
so observed depth, accepted/applied/rejected counts, failures, timestamps, and
player settings controls are typed state rather than console-only status. It also
persists daemon-owned `aetheria.verse_host_settings.v1`, with boot-time
defaults or overrides for service id, Verse id, visibility, and CultMesh
address. When visibility is `public`, the daemon also serves a
derived CultMesh Verse catalog from that same typed host document, using the
located service name as the discoverable `cultnet://...:3075` endpoint. The
operations surface and provider advertisement project from that typed host
document instead of hardcoded daemon identity strings. The provider
advertisement still publishes `gamecult.eve.provider_advertisement.v1` for the
`aetheria` provider, advertising the catalog, operations, and player-settings
surfaces plus the typed schemas witnessed by the local `.cc` state file.
Remote Unity clients should not pretend a public Verse is local authority. Use
`Aetheria.State.Replica` to pull a cache-only local witness from the daemon:
```powershell
dotnet run --project .\Aetheria.State.Replica\Aetheria.State.Replica.csproj -- sync --endpoint cultnet://host:3075 --game-data-root .\GameData --verse-id aetheria.public
```
That writes `GameData\Verses\<verse>.cc` as a replica projection of daemon
truth. The selected remote client target resolves to that replica path. The
daemon still owns accepted state; the replica is only the local read surface
Unity lowers from.
The Unity Verse-settings shell can also trigger the same one-shot sync through
the `Aetheria.State.Replica` bridge when the repo-local tool is available. That
keeps target selection local while the replica organ owns daemon transport.
The old standalone `Aetheria.State.DrainCommands` applicator is deleted. Command
acceptance is daemon behavior now; bounded operation uses `Aetheria.State.Daemon
--once` so the same Verse member publishes the same provider, health, command
boundary, and Eve surfaces.
Current rebuild notes:
- `MessagePack` 3.1.4 is pulled transitively through CultLib and is currently
flagged by NuGet advisory `GHSA-hv8m-jj95-wg3x`; update CultLib's
`GameCult.Caching.MessagePack` package ownership rather than adding a local
Aetheria override.
- `CultRecordRef<T>` should become the persisted reference shape once the
MessagePack source-generator path handles the GameCult formatter cleanly.
Until then, v1 profile documents store explicit record-key strings at the
persistence boundary.