A WellStrength that evaluates negative, NaN or infinite now throws at construction (it built an
antimass well with NaN height). New tests: the core-inside-Roche guard judged at every mass on
curves that cross in the generated range; per-body multipliers move neither strength, core nor
Roche limit; potential and force consistency inside the cores' outer bands (0.5 R to R); a
moving Ship feels the field where it has moved to.
Not built or run locally; verified in the Yggdrasil job.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Under the potential-owner field the zone pulls everywhere (about 1.4 u/s^2 even in
its weakest places), so the staged runs bend. Crossing's player sat on the star at the
arena's origin and fell in; its crosser, braked by its pilot, never reached the bow
line from 150 m to port. The crosser now starts 96.5 m to port and 70 m ahead of a
player staged 250 m or more from every body, which keeps the pass at 3.2 s and 40 m
(the test's 3.0-4.2 s and 30-60 m unchanged). Lock On's hostile started on the side
where the zone bends its run by 7 degrees; the lock warning must point within 5 degrees
of where the hostile was staged. It now starts ahead and to port, where the bend is under
one degree and the lock comes at about 14 s. No assertion, limit or gravity is changed.
Not built or run locally; verified in the Yggdrasil job.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two hand mutants of GetNormal's K (ignored; times 3) survived because the test compared the ship's
tilt with the same GetNormal it was testing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GravityField is the law of one well (logarithmic tail, softened core).
Zone.GetForce and GetHeight sum it over the bodies; GetNormal derives from
the force for ship tilt; Flow and Ship read GetForce. Well strength, core
radius and Roche limit are PlanetSettings curves of mass, height
exaggeration K one global. Deletes GravityAcceleration, GravityReferenceRate,
GravityStrength, the PowerPulse well, GetNormal's finite differences and
BodyData.GravityDepthExponent. Settings.asset carries the calibrated curves.
Tests: PotentialOwnerTests, the moon's moon placement, retired keys over every
BodyData type, a body-derived giant sweep. Not yet built or run (verify job
follows); this commit may not build.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
UnderALookalikeLieNoGearIsLocated: claimed and true hulls of one type and size with a reactor mount of equal type, position and shape. AMountAimReadsThePositionAxesInOrder and TwoMountsOfOneTypeAreTwoRows use a Wing hull off the diagonal with two Sensors mounts. Assert.Same and DoesNotContain over Entities become ReferenceEquals asserts. The docked-stance test reads IsHostileTo on a hostile-by-default subject instead of _iffOverrides. Test-only; no production change. Not yet built.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Scanner.Progress is bound to the target the scan was built on, so a retarget with the scanner switched off no longer
draws the old scan on the new target (scan-progress-shown-on-retarget). RoleMapOf is the one accessor HasRoleMap now
delegates to. Not yet built or tested.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TrySelectTargetItem and ResolvedTargetItem gate on FireControl.IsLocated (an item seen to act, or one on a mount of the
believed hull's layout) instead of IsRevealed; Combat keeps IsRevealed. Entity.LayoutOf derives the layout from the
Contact profile; SchematicRows appends a mount row per unclaimed hardpoint. A mount aim centres on the mount's cells and
is frozen per shot (PendingShot.AimAtMount). The cycle runs over located items, the schematic renders mount rows and
marks through SchematicRow.Marks. Not yet built or tested.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The enemy schematic now lists every non-weapon claim as a gear row (cut scanner-catalog), so the old "no row" expectation became "one row, the claimed class, no range". Builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Format probe showed a Reveal formats as "Reveal" (no graph walk), so no ToString and no test is added (follow-up bearing-markers-test-residuals (2)). Builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
InspectionScannerCatalogTests and InspectionScannerCommandTests (new); AFinishedScanListsTheGearOnTheSchematic; AScanReadsNoHostility pins pace, emit and a target-side sensor; AScanTakesTheSamePathForAnyPilot uses a Minion in CombatState; an emission heard within Range over the lot's alpha (ping and scan); the docked-subject test is a Theory over true and false; a ReveEal formatting probe. Not yet run: may not build.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GetOrbitPosition places a parent as a side effect of placing its child, so with a child listed first the parent's previous position was already its new one and its Velocity came out zero. The constructor's unread PreviousPosition write is dropped; the first Update takes it from the placed Position. The velocity test now runs moon-first and planet-first packs over varying dt. Builds not verified yet (verify follows).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GameData/Aetheria.cc after `AetherDb inspection-scanner apply` on Yggdrasil (sha256 ed0500b4...): one GearData and three FactionProductData by Finch, AU and Lucent; a second apply wrote nothing. Builds: yes (data only).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entity.RevealedGear and SchematicRows' enemy branch (revealed weapons then revealed gear); SchematicRow.Range is float? (null for a non-weapon claim); SchematicDisplay shows ShowGear rows for non-weapon claims and hides the range label when null; SchematicListElement.ShowGear. ActionGameManager: one progress-indicator list (lock weapons hostile-gated, scanners ungated) and the incoming indicator follows Track or Scan paints. Not Unity-compiled yet; Shared tests unaffected by the UI files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds the inspection-scanner [apply] command beside launch-suppressor, in its pattern: dry run, all-or-nothing idempotence, partial refuses, ExpectUnchanged batch, root parameter for tests. One Inspection Scanner design (Tool 1x1, one ScannerData) and three products from Finch, AU and Lucent; ToolRolesByDesign gains the design. The catalog itself lands in the next commit. Builds: not yet verified.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The five bowl fixtures compare to the zone's own normal, so nothing pinned
the shared well's depth or radius to the bowl (a depth-scaled fixture
mutant survived). TheWellFixtureReproducesTheFormerBowl checks heights
against the bowl's own definition. This commit's test has not run yet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A failing Assert.DoesNotContain/Contains over a collection of Entities made xunit format the Entity graph and overflow the stack, aborting the host; the five such assertions now assert a bool. Adds a docked-subject stance test and a pending-paint-on-leaving test. Builds: yes (test-only).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A ship stepped alone drifts under the zone's wells while it idles. Orbits are
now placed at build, so those wells are where the bodies are and the drift is
real; the scenarios (Crossing, FusedRounds) staged geometry the wrong wells
happened to leave undisturbed. Settling is about stats and power, not place.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OrbitData and BodyData are run-store types; a cache opened with a catalog
only has no home for the well body. The six fixtures that dig a well now
open with a run path. The previous commit does not pass its tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GetHeight sums body wells only. Removes RadialWaves, GasGiant wave fields,
GasGiantData keys 14-17, PlanetSettings Zone*/Wave* fields, the minimap
gravity range, the Boundary brush and Gravity Waves objects from the scene
and both prefabs. The five bowl fixtures become one WellFixture well at the
origin with unchanged expected numbers. Not yet built or tested: this commit
has not been through the Yggdrasil job.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Orbit.Position and PreviousPosition are set from GetOrbitPosition at the pack's
time in the constructor, so wells, lights and poses are valid before the first
Update. AddOrbit and CreateOrbit had no caller. Tests not yet run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The hostility stamp (Reveal.Hostile, Contact.Hostile) is deleted: the observer knows its own
stance live. The real fault was the IFF override being dropped when its subject departs while
the book still remembers it; the override now goes when the book drops the subject (ReleaseStance),
so RememberedHostiles reads IsHostileTo. A ship removed from the zone clears its paint inbox and
incoming warnings at the owner, so the Parent == null gate in ActionGameManager is deleted.
Tests pin both stance directions after the act, the departed override hostile, the exclusive
memory window at the equality, and the empty inbox. Unbuilt until the verify job; Unity side not compiled.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
RememberedHostiles read the stance the freshest reveal was made under (Reveal.Hostile, surfaced as Contact.Hostile) instead of IsHostileTo now, so a hostile held by the observer's override keeps its marker and the music after it dies or warps, until the bearing lapses. The departure test no longer re-sets the override. New tests: the Detected clause for an in-zone lapsed hostile, position independence for far hostiles on three sides, a within-category lie in ClaimedClasses, and the stale warning of a docked ship. The HUD no longer collects sweeps for a docked ship, and a sweep flash resets the pooled lock indicator's motion.
Untested here: the Unity-side changes (ActionGameManager) have no headless test and no compile has run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A departure drops the observer's IFF override (it lasts the sitting), so the departed-hostile case re-sets it to stand for faction-derived hostility; the gun reveal in the claim fixture needs the target within the Eye's hearing. The previous commit's two new tests fail.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>