Commit graph Aetheria/tests
Author SHA1 Message Date
Meta Vens
f2ecc96a3c ConsumableAiTests: the lock held on someone else is a real lock
The locker aimed at the prey was not hostile to it, so no lock ever built and
the whose-target mutant survived.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 10:57:52 +02:00
Meta Vens
73277ce62f ConsumableAiTests: lockers dead astern so a lock bearing is exact; drop diagnostics
A lock gun aimed along a normalised vector at a 3-4-5 style offset can read a
dot product just over 1, acos is NaN, and no lock builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 09:40:26 +02:00
Meta Vens
dd98ec22e0 ConsumableAiTests: fix diagnostic literal (temporary)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 08:51:18 +02:00
Meta Vens
c6ff3bbb6b ConsumableAiTests: locker diagnostic (temporary)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 08:44:47 +02:00
Meta Vens
6caf747aae ConsumableAiTests: more diagnostics (temporary)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:38:12 +02:00
Meta Vens
513aba25e2 ConsumableAiTests: diagnostic message (temporary)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:35:23 +02:00
Meta Vens
200f8c5cc9 ConsumableAiTests: mint the hold from its own design type
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:26:28 +02:00
Meta Vens
f270529f9b Consumable AI: agents vent when locked and overdrive to close, with tests
CombatState activates a vapour dump when an enemy lock on the ship passes .5,
else a throttle lock when the target is past twice the optimum range and
ahead within 15 degrees. Consumables are picked by behaviour kind through
Entity.FirstCarriedConsumable and activated through TryActivateConsumable.
Work in progress: tests not yet run (this commit may not pass them).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:16:38 +02:00
Meta Vens
e71540be5b Merge origin/master into eureka/aetheria-release-vapour-cloud
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>
2026-10-10 05:51:04 +02:00
Meta Vens
b623d519f7 ThrottleLock tests: pin the exact tick the lock ends, as a function of Duration
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>
2026-10-10 05:26:51 +02:00
Meta Vens
1be1023558 Merge origin/master into throttle-lock 2026-10-10 05:26:11 +02:00
Meta Vens
c22456b52c Merge origin/master into eureka/aetheria-release-consumable-host
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 04:59:19 +02:00
Meta Vens
d519d99b1e Consumable host: an effect lives exactly its Duration, not Duration plus one tick
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>
2026-10-09 23:48:02 +02:00
Meta Vens
a74065dbee ThrottleLockTests: pin stick length, counter-clockwise turn, non-lock consumables and the lock-end boundary
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>
2026-10-09 23:46:33 +02:00
Meta Vens
afe44b09d3 ConsumableTests: the overlap test attaches both modifiers before the first expires
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>
2026-10-09 23:38:26 +02:00
Meta Vens
6b36835953 Ballistic flight r3: name CultMath.float2x2.Rotate in full (the math.float2x2 method shadows the type)
The previous commit (2dcb7b20) does not build: DrawAhead.cs CS0119.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 23:29:32 +02:00
Meta Vens
2dcb7b2078 Ballistic flight r3: DrawAhead draws a round from the sim's facts, a hit ends at its impact cell; FireControl draws nothing
FireControl.RoundEnd and RoundAt leave FireControl (RoundEnd to DrawAhead verbatim, RoundAt as DrawAhead's private Line);
DrawAhead.Round takes the published outcome, steers a hit or burst from its frozen line at the commit tick onto its
end (burst point, else the impact cell on the target's drawn pose), and RoundStop is deleted. Projectile caches the
last published ShotOutcome and calls DrawAhead only. BallisticFlightTests move to the new signatures; the frozen-line
moving-target test is replaced by impact-cell, steer and no-drawing-function tests. Unverified: not yet built or run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 23:27:22 +02:00
Meta Vens
29c5f7aba1 Consumable host: one initialiser for gear and running effects; tests pin overlap, lifetime, per-design cooldown, refit
Entity.Activate re-initialises the running consumable effects through the same
InitializeBehaviors that initialises gear and ActivateConsumable, so a consumable
active across deactivate/refit/activate retargets to the new items.
ConsumableTests gains the stackable overlap/multiply, shared-entry detach,
expiry-boundary, per-design cooldown and refit facts. StatResolverTests' expiry
test builds its consumable through ItemManager.CreateInstance.
Not yet built or run; verification follows in a later commit message.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 23:24:54 +02:00
Meta Vens
d98818ea0c BallisticFlightTests: a receding proximity target puts the burst point off the arrival line
The contact-burst fixture cannot tell RoundStop's burst point from the line at
arrival (CommitBurst puts both at the same distance), so a stop that ignored the
burst point survived. A targeted proximity round at a target receding faster
than the round closes bursts at the pulled-back range point while arriving at
the fired-at distance; this test pins the stop to the sim's burst point.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:56:51 +02:00
Meta Vens
f9483181f2 BallisticFlightTests: the moving target crosses at 10, below the round's speed, so an intercept exists
Spec r2 said 30 against a round speed of 20: no first-order intercept exists
there (the target outruns the round sideways), so the round did not lead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:35:37 +02:00
Meta Vens
a9f1196472 BallisticFlightTests: using UniRx for the Subscribe lambda
Builds headless; Unity still on the old Projectile at this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:33:51 +02:00
Meta Vens
85e57aef78 BallisticFlightTests: using System for the Subscribe lambda; DrawAhead comment names no frame clock
Builds headless; Unity still on the old Projectile at this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:32:08 +02:00
Meta Vens
60aacfdc35 FireControl.RoundEnd states a round's end; DrawAhead draws rounds as pure statics
RoundEnd(shot, known) is the one statement of when a ballistic round's drawn
flight ends: arrival for a hit, burst or unpublished outcome, the frozen range
(never short of arrival) for a miss. RoundAt takes the known outcome and clamps
at RoundEnd. DrawAhead gains Round, RoundStop, RoundOver (pure, no state) so the
blend, stop and done rules are headless-testable. Seven new tests (ten cases).

Unity build: Projectile.cs still calls the old RoundAt, so this commit does not
compile in Unity (the headless test project does not include Projectile). The
next commit moves Projectile onto the statics.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:31:12 +02:00
Meta Vens
e56f9c8be5 BallisticFlightTests: move the shooter after Fire so a live-origin RoundAt fails
The origin-from-live-shooter hand mutant survived against a stationary shooter. Builds: yes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:56:01 +02:00
Meta Vens
8c549719c0 ThrottleLockTests: strafe pairs placed for opposing torque
Pairs mirrored across the ship's width had equal torque and the compensation still cancelled one; the previous commit's AnUnlockedShipFollowsIntent was red. Mirror across its length instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:54:20 +02:00
Meta Vens
015e6d86bd ThrottleLockTests: strafe thrusters in mirrored pairs
A lone off-axis strafe thruster cancels its own torque in Ship.Update, so its axis read 0 unlocked; pairs leave the strafe axis plain. The previous commit's AnUnlockedShipFollowsIntent was red for this.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:51:30 +02:00
Meta Vens
84f9cd39e5 VapourCloudTests: settled ratio to two places
The settled ratio carries the seed's last residue (.4007 against .4); two
places still separates .4 from the squared .16. Test-only; builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:40:48 +02:00
Meta Vens
42c403dc32 VapourCloudTests: settled-state ratios, drag-aware drift, capture at vent
Fixes the fixtures the first verify run falsified: the sensor's start-up seed
made one-tick ratios meaningless (compare settled infos and the settled ping
extra), launch drag moves a cloud less than its velocity, and the vent's own
velocity is read when the cloud is added, not after it has drifted. Test-only;
builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:39:24 +02:00
Meta Vens
2b03d90812 RoundAt clamps at the weapon's frozen Range (PendingShot.MaxRange), not FireRange
FireRange is the distance to the engaged target and 0 for a round with none, so a no-lock burst round and a
round that misses never flew. MaxRange = weapon.Range is frozen at Fire beside Speed. Unity compile not yet run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:35:37 +02:00
Meta Vens
0c29ea1768 ThrottleLockTests: place thrusters on interior hull cells
The first commit's tests failed in setup (border cells are not interior); it builds, its three new tests were red.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:32:00 +02:00
Meta Vens
f79cf8b7a7 ConsumableTests: a hold with room for two consumables
The 1x1 interior fixture could not store the second consumable the
non-stackable test needs. Builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:29:27 +02:00
Meta Vens
2640faa9a6 VapourCloudTests: drift, ping, wire shape and authored stats
Pins the cloud's drift and fade-from-vent-time, the ping branch of Gain, the
dump's authored radius/opacity/lifetime and its union 42 keys 1-3. Test-only;
builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:24:06 +02:00
Meta Vens
0fb5ac1dfc Sensor.Gain takes the obscuration of its sight line
Gain stays the one detection rule: both branches are scaled by the fraction
of the signal that survives the clouds between observer and target
(Zone.Obscuration, exactly 1f with none, so the pre-cloud trace is
bit-identical). The entity loop passes it for pings and passive ticks and
PassiveRate for the chunk position. Entity.cs is untouched: a lock falls by
the existing detection-threshold rule when info does. Adds the sensor-level
facts to VapourCloudTests. Builds; not yet run (verify job follows).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:22:16 +02:00
Meta Vens
6dcf33d11c Vapour clouds: Zone owns them, a VapourDump behaviour vents one (union 42)
Zone.Vent is the one adder, StepClouds the one remover, Zone.Obscuration the
one reader: the product of (1 - opacity) over clouds whose disc the segment
touches (closest point of the segment to the centre within Radius), 1f when
none. Derived from live clouds at each call, never cached. VapourDump vents
once on its first run, drifting with its venter. Nothing reads Obscuration
yet (Sensor.Gain takes it in the next commit); this commit builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:22:00 +02:00
Meta Vens
aaab561f98 Consumable host: initialise at activation, dispose at expiry, instantiate consumables
ActivateConsumable runs Initialize on the effect's behaviours; expiry disposes
them before Resolver.Forget, so a consumable's modifiers exist exactly while
its effect is active. ItemManager.CreateInstance returns a ConsumableItem for a
consumable design. StatResolver.DetachModifier drops an entry left with
nothing attached, so ModifierEntryCount returns to baseline. LoadoutTests'
hand-built ConsumableItem goes through CreateInstance. Builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:19:22 +02:00
Meta Vens
0e89dd1673 FireControl.RoundAt: the one statement of where a fired round is at a sim time
PendingShot freezes the weapon's Velocity as Speed at Fire; RoundAt(shot, time) reads the frozen origin,
direction, speed and fire time, clamped to the FireRange point. Step, Commit and Apply do not call it.
BallisticFlightTests pin the line against the shooter position, aim and authored velocity.
Builds: yes. Presenters still fly their own rounds at this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:19:22 +02:00
Meta Vens
c6bca1a522 ThrottleLock behaviour: an active consumable forces full forward intent, read once in Ship.Update
ThrottleLockData (union 41) marks the lock; Entity.ThrottleLocked is derived from the
active effects; Ship.Update reads one `move` in place of MovementDirection. Turn is
untouched (ruling overdrive-keep-steering). Not yet verified by a build when committed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:17:47 +02:00
Meta Vens
739eee4a8e Consumable host: tests first (red at the base; they build, three fail)
Adds AConsumableModifierBoostsUntilExpiry, ABoughtConsumableActivates and
ANonStackableConsumableRefusesASecondActivation. This commit builds; its tests
fail until the host cut lands.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:17:36 +02:00
Meta Vens
a3ea1d7ba1 Tests: scan's miss path fails then returns default (Assert.Fail is void)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 15:40:42 +02:00
Meta Vens
549c1b0253 Tests: the two no-Lagrange zone tests share one scan; restore NotSame, use Assert.Fail
The tutorial-seed scan for a zone with no genuine Lagrange candidate ran
once per test; it now runs once behind a Lazy. The leak test regains
Assert.NotSame(galaxy.Entrance, otherZone), and the scan's miss path uses
Assert.Fail (xUnit2020).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 15:39:05 +02:00
Meta Vens
ab396c786a Tests: the evasion volleys fire enough shots to resolve the price gap
With the target's fit written out the jinking price is .383 against .440
coasting, but 200 rolled shots gave 93 hits jinking against 78 coasting: the gap
between the prices is smaller than the noise of two 200-shot volleys. 2000 shots
put the expected gap near four standard deviations; the assertion is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:57:48 +02:00
Meta Vens
c724001467 Tests: the evasion range's target is a written-out Djinni fit
EvRangeLaunch placed stage.Generated("Djinni"), whose fit follows the galaxy; at
CultMath 0.3.0 the generated target gave 95 hits jinking against 78 coasting.
The target now carries an explicit Talaria/cockpit/reactor fit, so the hit
comparison does not depend on generated content.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:54:44 +02:00
Meta Vens
0ccf02746d Tests: restored-hull station tests pick their zone by the property they test
EAC-7089 and EAC-2733 were generated-content names that CultMath 0.3.0 re-rolled
away. The no-Lagrange-candidate zone is now found by its property (planets that
are all rosette members, so no genuine candidate) by scanning seeds, and the
zero-natural-station zone by its isTutorial: false roll. Every assertion keeps
its claim; the candidate predicate is shared with the leak test's fixture check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:54:43 +02:00
Meta Vens
a59f1fa977 Tests: TutorialSeed1 follows the galaxy CultMath 0.3.0 rolls
The noise kernel changed at cultmath-unity-v0.3.0, so the fixed seed gives a
different tutorial. TutorialGalaxy_unchanged keeps its claim (a fixed seed
gives a fixed tutorial) against the regenerated shape. Does not pass the whole
suite: the RestoredHullsTests and the evasion test follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:54:42 +02:00
Meta Vens
80d2c7f305 Tests: TurnRateIsTheActuatorsTurn idles the drives before it checks a Direction write
The backfilled Large Drives differ in quality, so a held forward thrust is a net torque and TurnRate never settled to zero. Release the movement demand with the turn demand.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 03:35:13 +02:00
Meta Vens
e915f95244 Merge eureka/aetheria-release-roles-backfill: roles backfill command and its tests (catalog blob stays master's; regenerated on the next commit)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 03:21:01 +02:00
Meta Vens
f28d4b4b12 Merge eureka/aetheria-release-sim-speed: one SimClock steps the zone, presenters draw ahead by Lead
AetherDrive.cs: master deleted the behaviour (2cfdc728); the branch only added a
TurnRate line to it. Deletion kept. Thruster remains the one rotation actuator
and feeds Entity.TurnRate. No sim stepping outside the clock on master
(mines presenter, Pirates AI, lot-product all step through Zone.Update).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 02:29:37 +02:00
Meta Vens
450e371f74 Tests: the exponent pin reads the shipped designs through the catalog opener
AetherDb.Open refuses a catalog without the test global record the scoped copies lack.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 02:14:54 +02:00
Meta Vens
a91bd1f7cf Tests: the replay resets the drives to unnamed terms, not stripped ones, as they shipped
Large Drive and Small Drive shipped with unnamed Quality terms on their flat stats; the command keeps those exponents. The reset stripped them, so the new exponent check read the Thruster precedent instead.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 02:13:15 +02:00
Meta Vens
ba382a6d5c Merge eureka/aetheria-release-modifier-subtypes: modifiers reach a behaviour type and its subtypes 2026-10-09 02:12:41 +02:00