AetherDb ship-authoring centre prints Shape.CenterOfMass; Package asks it and moves Ship Root so that point sits
at the world origin, after regenerating the unowned map icon, shield and tractor from the render meshes (Keep
leaves one alone). Package never makes a hull collider (ruling package-frame-defer-collider). smoke_package's
bound-collection rollback cases now rebind to a different path so a rollback that restores keys but not values fails.
C# not yet built when committed; the Blender smokes and Python unit tests pass.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The two Lows from Soul s1 (follow-up catalog-merge-replay-order). The thermal constants are placeholders
(-1) in this commit: it builds and fails by design, the next commit pins the measured values.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GameData/Aetheria.cc is master's blob, not this branch's; the consumables-first-set
apply is replayed in the next commit. The AetherDb command list takes both new
commands. This merge commit does not build until the apply and test seeding follow.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The command mutated the cache's own VerseGrammar before the batch upsert, so the upsert was redundant and two Soul
mutants (update branch dropped; Same ignoring description or render path) survived: the replace test judged the result
with the same Same() the command uses. The test now reads the fields. Unrun until the full job.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ValidateAll (one owner, called by AetheriaStores.Open) refuses duplicate verb names; Validate refuses the reserved role
name actor. Tests pin the name-class edges (a z 0 9 _), a null role element, the starter verb replaced when only its
description or render path differs, the grammar global updated in place, and the fixture's second allegiance and zero-role
speak. The test's scoped registry is TestCatalog.Registry(). Builds; unverified until the full run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Takes master's catalog pointer (GameData/Aetheria.cc) and its TestCatalog.Registry fixture path;
VerseGrammar is the global scratch catalogs author (TestCatalogGlobal stays deleted: the shipped
registry now has a real global, so a test-only second one would have to be authored beside it).
StatResolverTests, TestCatalogTests and AetheriaStoresTests author VerseGrammar.
Does not pass the suite: the catalog is master's and holds no grammar until the verse-grammar apply commit follows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Station and ship rates are measured per hull on two station hulls and two ship hulls with holds that
sixteen gear picks fill, on a station whose first bay refuses, and on the shipped catalog's own hulls.
The ship band is 3000 seeds so chances of .12, .15 and .05 fall outside it. These tests fail on the
generator as it stands (consumable stocked after the gear); the next commit fixes the generator.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Builds: yes. The previous commit's pin test failed on '.' (a dot last is refused by its own rule).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Regex form could not be mutated on the verification path (the mutant runner collapsed its backslashes), and a
character loop with named length constants states the same rule without the dependency. Adds refusals for a capital
inside a name, a hyphen, and a direct empty-name case. Builds (not yet run when committed).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
layout_revision(shape, hardpoints) is the revision rule replace_layout and Package share.
SHIP_ID_CHARS and RESERVED_SHIP_IDS mirror ShipAuthoringStore.RequireShipId; ShipSchemaPinTests
sweeps every character and every candidate stem against the C# rule. ship_cc errors no longer
carry the path, mount id, anchor id or object name. C# tests: create judges the ID not the
display name, FindRoot answers the working directory itself, short trailing-dot IDs.
Builds: yes (C# test edits and Python only).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The previous commit (8bfce189) does not build: CS0104 ambiguous Random in ThrustAllocatorTests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nothing asked, nothing fired is a fact about the intent: when all three clamped intents are exactly zero Allocate returns the zeroed buffer before the solve, so a warm solve that stops at the iteration cap can no longer fire thrusters. The output flush is gone. The warm start is left at the last solved point. Tests: the two 40-thruster hulls Soul found, and a small intent still answered at any column scale. Builds untested locally; verified on Yggdrasil.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Off-centre joint limits (20..50, -10..50, -50..0) so Max-Min is distinguishable from |Min|+|Max| and 2*max/2*Max; Bind walking past tagged
nodes that are not joints; Rigs and the lead mount follow hull order where it differs from name order. Tests only; builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Flushing an empty cache writes no file, so the previous fixture still hit the new missing-file refusal.
Builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A mutant that changed a constant moved the test's expectation with it and survived (station chance 1,
ship chance 0 and 1, station units 3).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A cost row pulling the errors the other way lowers the pre-onset drive throttle by about 20 percent (1.30e-4 to 1.06e-4 at turn .5); the bounds sit 8 percent under the measured value.
Commit builds: yes (tests/Aetheria.Shared.Tests not yet run on this commit; the full run is the closing job).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The turn leaves a forward error of 2, the top of TA-R2's error box; a bound of 1 or 1.5 gives yaw back.
Commit builds: yes (tests/Aetheria.Shared.Tests not yet run on this commit; the full run is the closing job).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
128 torque-free forward thrusters from a cold start reach the 100-iteration cap through the public surface; the call must keep the iterate it reached, not zero it.
Commit builds: yes (tests/Aetheria.Shared.Tests not yet run on this commit; the full run is the closing job).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A ship cannot be equipped once active, so the radiator has to be fitted inside the one builder.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The gated-versus-plain comparison alone cannot see an unconditional draw (both catalogs draw).
Values measured on origin/master d4a27def with the same fixture. The roll-before-availability
mutant survived the full suite without this pin.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The game treats a directory without ship.cc as not a package (TheBootCatalogIsTheShippedOneUntilAModIsInstalled), so da4d8c6c's
Compose exclusion broke that test. Reverts the Compose and ResolveCatalog change and moves the check to the one place that
holds the first-party tree to a stricter rule: TestCatalog.Resolve throws, naming each directory under GameData/Mods that
holds no ship.cc (missing-ship-cc-skipped). The GLB case change and the registry parameters stand.
Builds; not yet run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The test assembly registers a catalog [CultGlobal], so the global check already threw on a missing
file there and AStoreRefusesAMissingCatalog passed against the old Open (run at fe9da2e: 12 passed).
The refusal is now a FileNotFoundException naming the path, and the test pins that type, which the
global check never throws. Builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The test relied on a read-only open of a nonexistent file yielding an empty catalog, which
AetheriaStores.Open now refuses; the fixture writes the empty catalog first. Builds; the suite is green with it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TestCatalogGlobal existed only to give the test host one [CultGlobal] routed to the catalog. VerseGrammar is the
game's first, so the test-only type is deleted and every fixture authors a VerseGrammar instead (63 call sites; the
missing-global tests assert on aetheria.verse_grammar). Stale comments about the test type are rewritten.
Builds (not yet run when committed).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AetheriaBuild (Assets/Editor) sets the version, builds Addressables, builds the
Win64 player, stages GameData through PlayerStaging, publishes AetherDb to
ModTools and removes the Burst debug folder; any failure exits 1 naming the step.
PlayerStaging is Unity-free and linked into Aetheria.Shared.Tests. A read-only
AetheriaStores.Open of a nonexistent catalog throws.
Builds on the headless side; the Unity .meta files and the batchmode run follow.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FindRoot keys on GameData/Aetheria.cc. ShipAuthoringStore.RequireShipId is the one ID rule
(Validate and create), refusing Windows device names and a trailing dot, naming no value.
The add-on's one preference is Game folder; _aetheria_repo, the repo preference and the
dotnet-run invocation are deleted. Smokes take SMOKE_GAME_FOLDER. Not yet built or tested
at this commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deletes the direct GameData/Aetheria.cc opens (FireControlCut124Tests x3, FireControlCut7Tests, MiningCut3Tests x2,
RestoredHullsTests x11) in favour of TestCatalog.Repo, and the eight copies of the shipped-assembly registry in favour of
TestCatalog.Registry() (real-catalog-readers-bypass). Pirates and Roles command tests keep copying the shipped catalog (they
rewrite a copy through AetherDb) and take only the registry.
Builds; not yet run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AetheriaStores.Open, ShipModCatalog.Compose and ResolveCatalog take an optional registry (the game passes none and keeps the
process-wide one). TestCatalog.Registry() is the shipped assembly's registry, so the test assembly's TestCatalogGlobal is no
longer a catalog global the real catalog must hold (fixture-fails-on-real-package). TestCatalog.ForRepo(root) is the one
binding Repo uses, pinned by a test over a real catalog plus a package (repo-wiring-unpinned). A package directory without
ship.cc is excluded with a reason, in Compose and so in ResolveCatalog's pre-check (missing-ship-cc-skipped). The loader takes
only a lowercase .glb, matching the case-sensitive LFS rule (lfs-glb-case).
All commits build; not yet run (verification job follows).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>