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>
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>
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>
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>
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>
Behaviors.cs union list: keep Union(41, ThrottleLockData) from master and
Union(42, VapourDumpData) from this cut; no key renumbered. All commits build
as a merge result only after the verify job.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
LoadoutGenerator.AvailableProducts and RandomProducts now range over CraftedItemData; only
equippable gear needs a hull home. StockConsumables is the last step of GenerateShipLoadout and
GenerateStationLoadout: it draws nothing when no consumable is on offer. Unbuilt/untested at
this commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first commit's gear modifiers never executed (test gear has no heat response, so it read offline). Builds; the first commit's new tests fail without this.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pins ruling boost-stacking-multiply through the production path (gear and consumable StatModifierData on a ship, read via EquippedItem.Evaluate): TwoScalesOnOneStatMultiply, AConsumableBoostMultipliesWithGear, TwoConstantsOnOneStatAdd. Tests only; no production change. Not yet run; the commit is unverified.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replaces TheLockHoldsThroughMostOfItsDurationAndEndsAfter with a theory over Duration 1 and 2 at 0.25 s ticks. Builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deletes the articulation anchor role. Adds ShipJoint (key 5 Joints), ShipAnchor.Joint (key 5),
the judge's joint-shape, mount-on-joint and yaw-reach checks over RigChains, Bind's GLB checks
(ReadNodeIds returns the nearest tagged ancestor), and ShipModPlan.Rigs. Presentation only:
arc stays HardpointData.FiringArc and traverse WeaponData.Tracking (ruling mount-arc-gun-traverse).
Not yet built or run when committed; the verification commit follows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Stryker survivors 12390 (initial _columns +1 skips the first resize at n = 1) and
12399/12400 (A not cleared between same-count calls) get tests. Array.Clear on b was an
equivalent mutant: rows 0-6 are assigned every call and the ridge rows are never written.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Removes the scratch probe. The spec pinned 1e-4; the optimum leaks 1.2e-4 (Duel) and
1.6e-4 (halved Talaria) from the first touch of Turn. Builds; ran 18 tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rules TA-R1 to TA-R4 of cut-thrust-allocator-core.r2, tests on synthetic columns
(Duel, damaged Duel, symmetric hull). First draft; not yet run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Expiry fires when the remaining duration reaches zero (<= 0), so behaviours execute on
Duration/dt ticks and not one more. AConsumableRunsForExactlyItsDurationInTicks pins it
with 0.25 s ticks. Builds; verified in the next run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Four tests for Soul's survivors lock-intent-length, lock-ignores-ccw-turn, lock-any-consumable and
lock-ends-at-half-duration. Tests only; not yet run on Yggdrasil.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first draft activated the second effect so late it was not yet attached when the
first detached, so the shared-entry guard mutants survived it. Builds; tests green
status is in the next verification run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>