Commit graph Aetheria/docs
Author SHA1 Message Date
Meta Vens
549adb7912 Split Cut 8 into CultMath swap and data model cutover
Imagination refreshed Cut 8 against Aetheria 59bc5753 and CultLib main, with
probe builds: 8a swaps Unity.Mathematics for CultMath on the legacy cache
(76 Unity conversion errors listed per file, MathFormatters kept), 8b cuts the
data model over. Operator rulings: CultMath gaps filled in CultMath 0.2.1
(f060536), which 8a pins; double overloads keep double precision; the
Temperature and SchematicShape drawers are ported into Aetheria's Studio
drawers.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 17:36:08 +02:00
Meta Vens
59bc575301 Record Cut 7 release state and the held npm publish
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 15:35:35 +02:00
Meta Vens
fcecdd0537 Mark Cuts 6 and 6b landed at CultLib merge 1b95dd6
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 15:12:58 +02:00
Meta Vens
5b80215150 Record the decision to skip CultMath Studio drawers for now
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 14:57:07 +02:00
Meta Vens
9c9c004d3e Record Cut 6b closed: DXIL NaN rules and commit-independent DLL
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 14:47:43 +02:00
Meta Vens
bb964ca2d4 Record the second Cut 6b Soul pass and the row-indexer ruling
Soul compiled step with dxc and found NaN gives 1, so the docs-based
change is reverted to the compiler's behaviour. The shader mirror test
only proved compilation and grows numeric comparison of every mirrored
function. The operator keeps the ref row indexer without an analyzer and
documents that writes through readonly, in, and property receivers land on
a copy.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 14:15:31 +02:00
Meta Vens
3a8a37be6d Record the operator ruling deleting the composite heuristic
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 14:02:16 +02:00
Meta Vens
04ef8d3093 Record the second Cut 6 Soul pass and its operator decisions
Soul verified the Studio model rewrite and found a saveable partial edit
after a throwing drawer, edit decisions left in IMGUI, a comparer mismatch
on dictionary keys, and three model tests that do not pin their rules. The
operator chose: delete FlushAsync(soft) and edit Mimir's call, and retry a
lockless directory read on manifest mismatch. By-name reflection in CultNet
and CultMesh becomes a follow-up. The composite heuristic waits on the
operator.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 14:00:10 +02:00
Meta Vens
c8771eba45 Record Cut 6b Soul findings and CultMath scope decisions
HLSL source did not yet compile as C#. Operator chose A throughout: generate the
full swizzle set and mixed constructors with a test over CultMath's own shader
bodies, fix cheap intrinsic semantics now and defer larger matrix features, add
Studio drawers for the new types after merge, and compile-check the shader
mirror with dxc.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 13:41:54 +02:00
Meta Vens
136a2209d3 Keep the Studio inspection model reusable by CultUI
Operator goal: CultUI, descended from Aetheria's PropertiesPanel, should be able
to recreate the CultCache Studio at runtime. The inspection logic moves into an
engine-free model in CultLib core and the editor Studio lowers it; the runtime
lowering is a follow-up.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 13:19:48 +02:00
Meta Vens
17b848e087 Record Cut 6 Studio findings and decisions
Soul found foldouts dirtying records, fragile drawers, and type-only drawer
claims that cannot express Aetheria's inspector attributes. Operator decisions:
inspector attributes move into CultLib core, drawers claim by attribute or type
with a default fallback, opening a directory store creates no files, and game
data stores never live under a Unity Assets folder. Cut 8 lists CultMath in the
Unity manifest directly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 13:16:35 +02:00
Meta Vens
6fa5cfe8ff Move the Studio click-through into Aetheria
Operator decision: the manual Studio check runs in Aetheria against the tagged
package once Cuts 7 and 8 land. CultLib's demo Unity project, which has no
committed manifest and a UI assembly that does not compile, is recorded as a
follow-up outside the migration.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 13:11:18 +02:00
Meta Vens
47094d8900 Add Cut 6b: CultMath grows what Aetheria needs, HLSL as parity target
The parity audit showed CultMath is not a drop-in for Aetheria's
Unity.Mathematics use. Operator decisions: CultMath targets HLSL source
compatibility, so components and swizzles become writable; CultMath keeps its
own behavior where it differs from Unity.Mathematics; only what Aetheria uses is
added; the Unity bridge lives in CultMath's Unity package. Cut 8 swaps Aetheria.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 13:09:23 +02:00
Meta Vens
fc06a3fabd Adopt CultMath in Aetheria and drop Unity.Mathematics from Studio drawers
Operator decision: Aetheria moves onto CultMath as the best workout GameCult's
math library can get, with gaps filled in CultMath itself. The map no longer
rejects the switch, and Cut 6's Studio drawers target CultMath types only.
Unity.Mathematics stays permitted for tooling supporting a Unity game; CultLib
uses CultMath.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 13:02:52 +02:00
Meta Vens
3e1d51d8db Mark Cut 5 landed with its re-pin follow-ups
The sibling runtimes now hold one home store per type, refuse moves and
non-home loads, validate before writing, and serialize mutations. TS
registration and attach methods became promise-returning and Rust attach
returns a Result, which consumers adopt when they re-pin. Cut 6 is in progress.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 12:45:59 +02:00
Meta Vens
65a88e2a10 Drop the TS re-entry guard in favor of the precise waiting rule
The AsyncLocalStorage guard refused ordinary write-backs from store change
handlers and still missed the real deadlock. The contract instead says a store
call must not wait for a write to its own cache to finish. Legacy global
retirement stays two-step and a crash leaving both records stays loud.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 12:41:15 +02:00
Meta Vens
eae25a0aa8 Record the legacy global shim, re-entry rule, and Rust push_all shape
Operator decisions after Soul's check of the sibling locks: a legacy-key global
loads as a read-only compatibility shim that the first write replaces under
__global__ and removes; re-entrant mutation is forbidden in TS and Python; a
Rust store keeps receiving its full view and the default push_all fails closed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 12:16:01 +02:00
Meta Vens
4fba9f6c35 Record sibling write-atomicity decisions for Cut 5
Soul found the TS and Python caches writing stores before validating, TS open
to async interleaving, Python accepting globals under any key, and Rust's
load_soa clearing before it could fail. Operator chose A throughout: a per-cache
TS queue for mutations, globals only under __global__, delete Rust's uncalled
load_envelope and make load_soa atomic, and leave error wording alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 11:42:19 +02:00
Meta Vens
bd2ebfe7d2 Correct Cut 5's branch and Python command; record sibling parity gaps
Cut 5 landed on the routing branch and the Python suite runs under unittest.
Soul found the sibling runtimes let a record's home move and loaded records from
the wrong store, and TS and Rust refused in-memory writes; those are being
brought to the C# reference.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 00:45:34 +02:00
Meta Vens
ff858823cd Mark Cut 4 landed and Cut 5 in progress
Cut 4 ended at CultLib 5bd4e4e with the generator deleted and the registry
persisting exactly what MessagePack round-trips. The five Eve.Surface documents
change schema ids because constructor-filled get-only members now enter the
catalog; no store on disk holds them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 00:23:16 +02:00
Meta Vens
7e093605a8 Stop citing the deleted generator as live code in the cut map
Soul's check of the generator deletion found the map's Q2 and Q4 evidence still
describing generated metadata and serializers as current. Those lines now say
the registry owns type names and all payloads go through MessagePackSerializer,
and Delvehold's re-pin follow-up names its generator references and its
preference for a stale CultLib worktree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 23:54:04 +02:00
Meta Vens
31620653e4 Require MessagePackObject on documents and keep reflection type names
Deleting the generator exposed that its codec was the only writer for documents
without [MessagePackObject], and that it named nested member types with a dot
where reflection uses a plus. Operator decisions: the registry requires
[MessagePackObject] on every [CultDocument], and nested type names keep the
reflection form once a store scan shows no persisted record uses the dot form.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 23:22:58 +02:00
Meta Vens
73b0f69d70 Delete the CultCache generator from the plan
Operator decision: with .cc canonically MessagePack, the source generator only
duplicated the reflective registry. Nothing reads its output without a
reflection fallback, no consumer builds AOT, and nothing measured a benefit,
while the duplication caused every Cut 4 defect. The registry stays the single
descriptor authority with all rejection rules. Delvehold and EveUnity re-pin
follow-ups are recorded.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 22:55:00 +02:00
Meta Vens
14bd2fd5a2 Record the override rule Cut 4 landed and two generator follow-ups
MessagePack reads the base declaration's attributes, so the generator and
registry reject overrides whose Key or IgnoreMember differ from the base
instead of using the most-derived declaration. The typed serialize helpers are
deleted. Global-namespace type naming and generic document types in generator
assemblies are recorded as follow-ups.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 22:07:30 +02:00
Meta Vens
5d89447be0 Update the cut map's status to Cuts 0-3 landed, Cut 4 in progress
The header still said nothing past Cut 0 was cut. Each cut's landing commit now
updates it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 22:00:50 +02:00
Meta Vens
a20ee76aa7 Record Cut 4's slot authority, generic resolver rule, and generator findings
Operator decisions: MessagePack's integer [Key] is the only slot authority and
the cache core references MessagePack.Annotations directly, since .cc is
canonically MessagePack; a generic document's resolvers come from its own
assembly. Also records the generator and registry disagreements Soul found with
old-versus-new consumer probes and the shape of the fixes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 21:58:37 +02:00
Meta Vens
ed6c2bc498 Record the sequenced read rule for latest-value consumers
Operator chose option A on all three: a public cache read returns a document
with the current sequence, and consumers subscribe before reading; OnUpdate and
CultNet's derived streams stay unprotected and documented as such; schema-alias
handles and removals are documented as not stale-protected.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:52:57 +02:00
Meta Vens
17b8a95cb0 Record sequence follow-ups the cache change exposed in CultNet and Mesh
The CultNet subscription server and database watches keep latest values from
changes that carry no sequence, and the Mesh mirrors' refresh and observe paths
race with applied changes. None came from the sequence change; each is named so
it is not mistaken for covered.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:44:22 +02:00
Meta Vens
550964be81 Make change order data instead of cache scheduling
Operator decision: the cache stamps each admitted change with a per-cache,
in-memory sequence and publishes on the caller's thread without scheduling
delivery. Latest-value consumers compare sequence numbers. Save-order delivery
with tickets is rejected: it turned the cache into a delivery scheduler,
deadlocked against the CultNet subscription server's lifecycle lock, and could
stall a cache on an interrupted wait.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:29:25 +02:00
Meta Vens
9a27814c3b Guarantee observer delivery in save order
Operator decision: changes reach observers in the order they were saved, across
threads, so latest-value consumers such as CultMesh's WatchRecord never apply a
stale record. Also records per-call publication on the caller's thread and that
only OnUpdate handler exceptions are rethrown to the caller.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:59:28 +02:00
Meta Vens
c145370e0f State that observers run outside the cache gate
Cut 3's second Soul pass found Watch observers and OnUpdate running while the
gate was held on re-pull and commit, which deadlocks a subscriber that waits on
a thread reading the cache, and a throwing handler that could leave a store
holding records the cache dropped. Observers now publish after the outermost
gate exit, and stores adopt their loaded view first. Also corrects the flush
wording, which described only single-file stores.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:01:47 +02:00
Meta Vens
b0cb0fa7dc Keep directory stores merging under an unconditional commit
Operator chose option A: a flush or unconditional commit on a directory store
lands its changed pages onto the current manifest, so other writers' records
survive, while a single-file store stays last-writer-wins. Also records that an
attached store shares its cache's gate, which is how Cut 3 fixed the lock order.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 18:55:27 +02:00
Meta Vens
edb6703d3b Record Cut 3's concurrency and commit decisions
Operator chose option A on all three questions Soul raised: one lock order
(cache, then store) with store I/O blocking that cache's readers; an
unconditional Commit is last-writer-wins like a flush; a store that fails to
hydrate on open throws and is never overwritten. Also records one key per
store, load-only OnUpdate, missing-file dirtiness, the late-route fixture,
TryGet kept for AquaSynth, the scoped SemaphoreSlim check, and the corrected
size target for CultCache.cs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 18:32:58 +02:00
Meta Vens
d311901dbc Decide store overwrite for Cut 3: the consumer removes and rewrites
Operator chose option A. Opening hydrates; a consumer that wants a fresh store
removes the records it does not keep, upserts, and flushes, and the atomic
snapshot replace does the rest. No CultLib API is added and PullOnOpen goes in
Cut 3. The two AquaSynth single-document writers adopt that form; the
File.Exists-style setters in AquaSynth and Mimir just drop the property.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:25:30 +02:00
Meta Vens
e4a9cb4113 Record Cut 2's real behavior changes and restore durability coverage in Cut 3
Cut 2 was not purely subtraction: load-time admission failures now propagate,
a store attached to a second cache replaces the first cache's callbacks, a
missing manifest empties the store on the next flush, and a v1 snapshot opened
as a directory store throws. The code still keeps atomic replace, manifest
ordering, content-addressed pages and both leases, but the tests for them left
with the stage probes. Cut 3 now restores them with real file locks, makes load
all-or-nothing, refuses shared stores, settles the legacy catalog resolver, and
keeps CultNet from publishing before a batch commits. The managed document is
recorded as parked with SoA.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:13:09 +02:00
Meta Vens
8a889ee494 Amend Cut 2 from Hands' findings; open the overwrite question for Cut 3
OpenAsync keeps pulling until attach hydrates in Cut 3. CultCache.FlushAsync
keeps its dead soft parameter for Studio's reflection until Cut 6. Loaded and
Unloaded are protected internal; PullSelected goes with the directory store;
a missing directory manifest is an empty store; doc comments go from all eight
files. PullOnOpen has AquaSynth and Mimir setters that mean overwrite without
loading, so Cut 3 must decide who owns replacing a store before deleting it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:34:02 +02:00
Meta Vens
1643027851 Amend the cut map from Cut 1's Soul review
Cut 3 rewrites the Cut 1 fixture that attaches a second untyped store and
retires the reflective IsGlobal hack. Cut 4 makes the generator discover
inherited members like the reflective registry, so derived documents hash one
schema id in both builds, and requires [Key] on persisted document members.
Corrects sibling attach wording, the C# commit status, and a deleted doc target.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:11:50 +02:00
Meta Vens
040e50b249 Finish the compare-exchange fold-in; mark the race probe failed
The two-process race probe (P7) spawned recursively and produced no trustworthy
result, so conditional commit's lock behavior is proven by Cut 3's tests, which
now require guarded child launches (explicit host, role chosen by environment,
fail if a child would spawn) or in-process concurrent file handles. The fork bomb
is recorded among the risks. Compare-exchange leaves the follow-ups.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:52:17 +02:00
Meta Vens
365e8cd781 Fold compare-exchange into the atomic commit cut (in progress)
Saved mid-pass after a workstation crash: per-entry Expect and ExpectUnchanged
on the one-store batch, TryCommit, a lock sidecar for the single-file store,
the last-writer-wins flush contract, the race tests and probe P7, and full
CultLib\packages paths for sibling runtimes. The Imagination pass is finishing
the rest.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:37:25 +02:00
Meta Vens
80018f9730 Reshape the CultCache cut map: parked SoA, fixed routes, owned generator, atomic commit
Second and third Imagination passes, probe-backed. Globals get lifecycle owners
and the cache invents none; routing admits a record's home once and refuses
later routes over admitted types; mirrors go in every runtime; subtraction is
separated from behavior. SoA is parked at a tag with its intent recorded.
The MessagePack generator is contained in CultLib's own package reference.
Atomic multi-record commit stays as an explicit one-store batch replacing the
ambient transaction machinery. AetheriaEve is removed from all evidence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:28:26 +02:00
Meta Vens
e0fe049d78 Stop pointing the parked map at AetheriaEve as a living rebuild
AetheriaEve preserves the rolled-back rebuild as a specimen, not as direction
or precedent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 13:48:46 +02:00
Meta Vens
c3377f113a Drop AetheriaEve from the migration's consumers
AetheriaEve is preserved as a specimen and constrains nothing. The consumers
that must survive the CultLib changes are the ones that build against it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 13:47:46 +02:00
Meta Vens
82c1e72e2b Map the CultCache migration cut
The Imagination pass over cultcache-migration-target.md: answers to its eight
questions with evidence from CultLib and its canonical packages, the CultLib
store-routing authority map, the wire-parity plan, ten sequenced cuts with
failing-first tests, negative checks and build budgets, a subtraction ledger,
and rejected paths. Two corrections on review: Cut 0 is already done
(6bd3e176, 560779a4), and Cut 7 adds an LFS rule for .cc before committing
the catalog.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 23:40:17 +02:00
Meta Vens
eeffcadb89 Name only CultLib's packages as canonical parity runtimes
The neighboring cultcache-rs, cultcache-py, cultnet-rs and cultnet-ts
repositories are defunct. Wire parity is held against CultLib\packages
(cultcache, cultnet and cultmesh runtimes) with C# as the reference.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 23:29:56 +02:00
Meta Vens
68fbce4a8a Define the CultCache migration target
Aetheria moves onto modern CultCache from CultLib, cache only. States the end
state for Aetheria and CultLib, the wire-parity and foundation invariants, the
probe evidence, and the questions the Imagination pass must answer before any
cut. Points the parked perfect-machine map at it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 23:12:42 +02:00
Meta Vens
285b57713f Clear dangling boss hull links, and stop the tool writing on read
Eight factions pointed at one boss hull GUID that no longer resolves,
shared wreckage from the database loss. PlaceFactionsMain gives a boss zone
to every faction carrying a BossHull, so each dangling link claimed a
chokepoint that could never spawn a boss.

AetherDb.Open no longer registers the name file store. CultCache subscribes
Add to a store EntryAdded, MultiFileBackingStore.PullAll re-emits what it
loads, and Add pushes to that type store, whose Push writes a file: opening
the cache rewrote all twelve name files, 4.4 MB, on every command. They were
byte identical, and it only surfaced as an error because Unity had one of
them memory mapped. Name files now load only on request, and the scope doc
records the underlying smell.

Adds commands: factions, clear-boss-hulls, save, loadout (runs the real
LoadoutGenerator against every hull), hardpoint-fit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 02:05:33 +02:00
Meta Vens
8d93b937bc Author manufacturer variation as faction products
A design lists role names; a faction product is a manufacturer's branded
build of one, carrying its name, its flavor text, and a pseudo-gaussian
quality distribution per role whose mean is the technology put in and
whose deviation is their quality control. A PerformanceStat may name the
role whose quality it reads, unset reading the item own workmanship as
before, so old saves behave unchanged. Generation selects products rather
than designs, which makes what a faction makes the availability rule.

This is Njordr shape at one dimension: role names, per-role derivation
and per-product distributions carry over when quality widens into
dimensions. No parts exist yet; the product authors the role quality.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 01:12:12 +02:00
Meta Vens
95932da895 Record Njordr as the owner of item property derivation
Aetheria authors roles, per-role stat derivation, continuous part quality
and per-faction role competence: the same shape one dimension wide, so
migration widens quality into dimensions rather than restructuring. No
second owner of item property derivation grows here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 00:22:08 +02:00
Meta Vens
02058a3cdf Build ServerShared without Unity and add AetherDb scripts
Aetheria.Shared.csproj compiles ServerShared with MessagePack, UniRx
core, Ink and Unity.Mathematics from source against .NET Standard 2.1
(Unity's API level) with no Unity defines; a clean build checks that the
simulation stays engine-independent. tools/AetherDb opens AetherDB.msgpack
through the game's own CultCache for file-based C# scripts; station-fit
checks every station hull can take a docking bay.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 23:23:20 +02:00
Meta Vens
086b966c30 Record Unity-independent simulation as an invariant
Also itemize the coast-path preview as a navigation computer behavior.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 21:04:59 +02:00