| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .. | ||
| Documents | ||
| Migration | ||
| Aetheria.State.csproj | ||
| AetheriaCatalogKeys.cs | ||
| AetheriaCatalogSnapshot.cs | ||
| AetheriaCatalogSurfaceProjector.cs | ||
| AetheriaDocumentRegistry.cs | ||
| AetheriaEveCommandBridge.cs | ||
| AetheriaOperationsSurfaceProjector.cs | ||
| AetheriaPlayerSettingsSurfaceProjector.cs | ||
| AetheriaProviderAdvertisementProjector.cs | ||
| AetheriaRuntimeCommitLogApplier.cs | ||
| AetheriaStateNode.cs | ||
| AetheriaStatePaths.cs | ||
| AetheriaVerseCatalogProjector.cs | ||
| AetheriaVerseDiscoveryHost.cs | ||
| AetheriaVerseHostSettingsNormalizer.cs | ||
| AetheriaVerseReplica.cs | ||
| README.md | ||
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 edits; menu and input-screen changes queue typed
.cc.pending player-settings commits and are not portable state authority.
Unity settings, loadout templates, and run checkpoints now queue typed
.cc.pending runtime commit documents beside
GameData/aetheria-world.cc. Aetheria.State owns applying those documents
into canonical typed state through AetheriaRuntimeCommitLogApplier; the
Unity-side command log is command-only and cannot become durable truth by
itself.
AetheriaRuntimeSession is the typed Verse signal for the running state host
or one-shot pending drain. Economy.Server owns the long-running
cultmesh-state-host heartbeat and publishes starting, running, and
stopping states through Aetheria.State; drain status remains operation
telemetry, not daemon-session ownership.
Unity Eve surfaces also emit typed gamecult.eve.command.v1 documents under
GameData/aetheria-world.cc.eve.pending. AetheriaEveCommandBridge is the
provider-owned acceptance organ for those commands: 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.
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.
Unity runtime commit DTOs carry typed ItemKey/HullItemKey fields only for
loadout items, action-bar targets, body resources, entity hulls, and active
consumables; the commit applier no longer reconstructs item keys from legacy
item GUID fields.
Unity runtime commit DTOs now carry typed FactionKey only for loadout
entities, run entity snapshots, and faction relationship state. The old
pending-command 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 commit DTOs carry typed OrbitKey, ParentOrbitKey, and
BodyKey only for zone orbit/body snapshots. The old pending-command
OrbitLegacyId, ParentLegacyId, and BodyLegacyId fallback fields are
deleted. Behavior-state runtime commits 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 queue provider-owned Eve commands 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.CommitRuntimePlayerSettingsCommand.
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, and older queued runtime commits are translated
through the pending commit reader when those compatibility seams are needed.
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, pending CultCache envelope 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 log.
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. It also proves runtime commit envelopes for settings and run
zone/entity snapshots can be queued, applied through Aetheria.State, and
cleared. Pending runtime state and Eve command queue files are CultCache-shaped
.cc records with embedded schema catalogs; their current record payload codec
is still temporary package code until Unity consumes generated CultCache
serializers directly.
Economy.Server opens the CultMesh state host, applies pending runtime commits
and pending Eve surface commands on startup, and polls for new pending work
while running. For a bounded one-shot drain without leaving the host running:
dotnet run --project .\Economy.Server\Economy.Server.csproj -- --apply-pending-once
The server publishes AetheriaRuntimeCommitDrainStatus,
AetheriaEveCommandDrainStatus, the aetheria.operations Eve surface, and the
typed aetheria.player_settings Eve surface after drain attempts, so pending
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 long-running 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:
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.
Aetheria.State.ApplyPending is the smaller local operator applicator for
queued Unity runtime commits and Eve commands when the server host is not being
used. It also republishes the typed drain status, operations surface,
player-settings surface, typed aetheria.verse_host_settings.v1, and provider
advertisement after applying pending files:
dotnet run --project .\Aetheria.State.ApplyPending\Aetheria.State.ApplyPending.csproj -- .
Pass an explicit state path as the second argument when applying a non-default
.cc file. Use --keep only for diagnostics; normal application deletes
successfully applied command files.
Current rebuild notes:
MessagePack3.1.4 is pulled transitively through CultLib and is currently flagged by NuGet advisoryGHSA-hv8m-jj95-wg3x; update CultLib'sGameCult.Caching.MessagePackpackage 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.