GrabEvent carries a FloatingBodyId; Zone gains TryHold/SetHeldProgress/Free and places a held item instead of
integrating it; Entity.TractorPower is derived from Pickup.Power and TractorCommand is the pilot's input
(ActionGameManager writes it undamped, the Time.deltaTime ramp is deleted). Binder and FieldTester change the
delegate type only. PickupTests and a save round-trip pin for the player's zone index.
Group A builds; no beam is on any generated ship until group B.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Builds: with fa911f2d this is the tests project at the head of the Zone encapsulation; fa911f2d alone does not build
(FireControlCut8Tests still called the removed Entities.Add).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entities is a MemberView with no mutating member; Admit installs the death watch with the
membership and refuses a member already present, Remove takes it away with the membership.
The Reset and duplicate-Add bypass paths of the death watch cannot be spelled any more.
Tests move to Admit/Remove; Admit also activates, so the explicit Activate calls that followed
a raw Add are dropped. Unity call sites route through Zone.Remove.
Builds: unverified at this commit (verified in the job at the head).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Master's Read returns (Hull, Visual, Products); the branch's row-roundtrip
test deconstructed two. Mechanical; builds on the merged tree (the merge
commit before this does not build the test project).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
WatchDeath returns when the entity already holds a watch, so a duplicate
Entities.Add neither throws nor leaves a second live subscription;
Entities.Clear (ObserveReset) disposes every watch. Adds
AMemberAddedTwiceStillDropsEachItemOnce, AClearedZoneDropsNothingWhenAFormerMemberDies
(finding duplicate-add-leaks-second-watch) and
APickUpOfExactlyTheRoomLeftFitsAndOneMoreChangesNothing (finding
pickup-room-arithmetic-unpinned, from Soul's boundary probe). Unverified
until the Yggdrasil job; no commit here is known not to build.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Builds (tests only). The previous commit unset the gun's joint, which bind then refused against the model.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Catalog taken from master (2e2d927a); the branch's catalog change is replayed by the next commit. Scenarios.cs: both lists unioned.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Replaces the tests that pinned nested acceptance with refusal tests plus disjoint controls; gun arcs 10..360 against rows
of 1..5 thrusters; 360.01 and 360.5 against the thruster cap; a plan test that a thruster row adds no gun rig.
Findings nested-actuators-accepted and gun-conflict-pinned-at-fixture-sizes. Builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mechanical merge adaptation: contact-reveals landed on master after missile-stats' base, and its fixture built a LauncherData without the
munition parts ValidateMunitionParts now demands (63 failures at Upsert). Builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mount fires inside an arc about the shooter's facing; the first version fired backwards and found no hit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A direct absorb's heading and damage type are the shot's, on both layers (non-Kinetic weapon, both heading
components negative); a blast absorb carries the blast's damage type and the target's height on both layers;
DrawAhead.Impact sits at the hull's height. Tests only; every commit builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
EquippedCargoBay.TryStore(SimpleCommodity) now returns false before touching anything when
TryFindSpace says the whole quantity does not fit (its documented contract: true only when ALL
is stored), so Zone.TryPickUp keeps "first accepting bay, otherwise nothing changes" with no
rollback in Zone. Tests: refused pickup of a stackable item changes nothing; a stack plus free
cell stores whole; first accepting bay; headings cover the circle; the loot stream is not the
mine stream; dock/undock and jump drop once and only in the zone the ship is in.
Untested on this commit: not yet built (verify job follows).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One conflict, Zone.cs death subscription against contact-reveals' _departures insert: kept both.
The resolution already routes the death subscription through WatchDeath/UnwatchDeath (next
commit's fix target is the same line, so this commit resolves it in that shape).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The two-minute run let a hostile placed ten times farther still arrive; the hostile closes in about 15 s from 700 m (about 50 m/s),
so thirty seconds separates the arena's geometry from a mutant of it. Both controls fire within a second.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ShipAuthoringStore.ValidateLoaded is the one composition of hull Validate and ValidateProducts;
Read and the draft branch of ship-authoring validate both call it (ValidateProducts is private).
Tests: a draft with an unnamed hull is refused; blank product name and key collision with the
offending product not first (both makers in turn); a negative hull price refused.
Builds untested here; the verify job runs at the end.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- finding joint-moved-by-two-actuators (ruling one-joint-one-actuator): RigChains.Driven names every actuator's joint (weapon-mount and
thruster-emitter anchors), so YawReach's chain stops at a thruster row's joint as it does at a gun's; Validate refuses a gun and a
thruster row on one joint. The test that pinned the mixed joint as accepted is replaced.
- finding row-of-one-arc-uncapped: Validate refuses any Thruster hardpoint with FiringArc above 360, row or not; the named-row check keeps only
the above-0 rule.
- finding row-rules-pinned-at-fixture-sizes: tests at row sizes 3 to 5, arcs 10 to 360, hair-width arc gaps, every non-thruster type, case-distinct rows.
All three findings land in this one commit (the edits share hunks in ShipAuthoring.cs and ShipRigTests.cs). Not yet built here; verified on Yggdrasil after.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Builds. The previous commit's test survived the hand mutant munition-thruster-joins-ship-thrusters because the ship was never stepped.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The two fused rounds draw 4 energy a shot, so the Smoke Test Hull's one reactor carries the Fused Rounds fit and the rounds fire
(sha256 b60cefa2). New tests: every weapon aboard fires in the stepped Fused Rounds arena with the DeathCluster as the control,
the round's flight is seconds and bursts on the first hull, the DeathCluster kills the fragile hull before the round lands (A.3),
the AI holds fire against its two controls, New Game lists the three arenas, and the command's replay writes the shipped records.
Not run at this commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Test-only; builds. Ports Soul's feedback-1 s2 probes as behavioural tests that
observe where each rule is decided (the published AbsorbEvent, the handler's
view of hull and shield, Feedback.Cue, DrawAhead.Carried). The blast shield
Magnitude is read against an unshielded twin's totalShare so a scale mutant
fails. Covers findings shield-layer-fields-unpinned, blast-order-unpinned,
height-fixtures-at-zero and cue-saturation-edges-unpinned.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Station() activates the entity and TryEquip refuses while active; the second Crate at (2,2) failed for that reason, not a hull rule. Builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The previous commit's ContactTests did not build a Mid hull, so ten tests failed on the missing hull (full run at
806641ae: 1481 passed, 10 failed). The commit builds; those ten tests are red until this one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ruling ship-bounce-restitution-setting: j = -(1+e)(v_rel.n)/(1/m1+1/m2), applied only while closing. The old
exchange formula (PostCollisionVelocity) is deleted. ContactTests now pin momentum, frame shift, restitution,
no impulse while separating, slow closing, tangent of both bodies, inactive hulls, the contact point radius
and the three-body pile. Not yet built or run; verification follows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first version left the package's GLB in place, so validate judged records and model through ReadPackage and the test failed in the mutation baseline. Test-only; builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ship_cc.read lets cultcache-py refuse a zero-byte file (CultLib pins that); the test expects the refusal. New behavioural tests: ValidateJudgesProductsOnADraftAndInspectListsThem (through ShipAuthoringCommands.Run), AProductKeyAlreadyInTheCatalogExcludesThePackage, and price 1 in ASoldPackageHullNeedsAPrice. Tests only plus the add-on deletion; all commits build.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With equal masses the first exchange stops the visitor and a second contact with the docked hull cannot show.
Builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A docked hull shares its carrier's velocity, so the pair alone never closes; a visitor does expose a second contact.
Builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pair moved 0.1 each before the contact step and so closed inside the 14.14 bound; start them 15 apart.
Builds; the first commit's only red test was this one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Moving the target after Fire never changed the cell: the lateral is drawn in the hull's frame about the aimed point. Builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contacts.Step exchanges normal velocity between touching hull discs (PostCollisionVelocity moved verbatim
from ShieldManager) and publishes Zone.Contacted; ShieldManager presents it; HullCollider.OnCollisionEnter
and ShieldManager's ship-on-ship branch are deleted. Not yet built or tested (verification follows).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Survivor of the top-speed-any-behavior-counts hand mutant: the cleared fixture hull held no behavior at all. Test-only; builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The test asked a second cache for the handle of an object loaded by the first (identity lookup, no handle); it now asks the reopened cache for its product. cultcache-py raises an Unpack error on a zero-byte file, so ship_cc.read names the empty file through its own shape refusal. Both commits build.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>