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>
Imagination r2 re-map (session self-2026-10-10-ag): the sim already carries
per-hardpoint arc and weapon traverse; links are rig only. Target doc moves
articulated weapon mounts into scope under ruling mount-arc-gun-traverse.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Eyes pass before the hull shader fork: DECALmachine 2.17 export paths,
forward-renderer decal practice, parallax for panel lines, layered wear
on the built-in pipeline, and this project's rendering constraints.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ambientCG 2K sets under Assets/Materials/PBR (GlowFade .mat per material,
packed metallic/smoothness), and Asset Sources/PBR Materials.blend as a
UV-mapped Blender asset library linking the same textures. Sources and
licence in Assets/Materials/PBR/SOURCES.md. Unity import unverified until
the project is opened.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 asset-marked materials, UV mapping with a scalar Tiling node, images
linked by relative path to Assets/Materials/PBR, previews generated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2K-JPG Color/Roughness/NormalGL (+Metalness, AO where the set has them),
generated MetallicSmoothness.png (R metallic, A 1-roughness), texture and
material .meta files, SOURCES.md. Unity side not opened yet.
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>
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>
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>
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>
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>
Deletes At, the end formula (Unity restating the range) and Resolve's own stop
arithmetic. Launch binds ShotCommitted (refresh the record, learn the outcome)
and ShotResolved; Draw is DrawAhead.Round plus RoundOver; a hit or burst stops at
DrawAhead.RoundStop. Projectile names no flight quantity.
Builds headless (Projectile is not in the test project); the Unity compile is
run separately at the final head.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
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>
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>
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>
Deletes the Time.deltaTime gravity/drag/position integration and the range-distance kill from Projectile and the
UnityEngine.Random jitter, barrel direction and inherited velocity from ProjectileManager. A round holds a copy of
its PendingShot and draws at RoundAt(Zone.Time + Clock.Lead) with a barrel offset decaying over BlendTime; ShotResolved
ends a hit or burst at the outcome's BurstPoint, a miss flies to the FireRange clamp. Unity compile not yet run at
this commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
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>
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>
Soul s1-s2 hold (aetheria-release:verdict:cut-cultmath-0-3-pin.s2). The generated galaxy re-rolls with the noise kernel.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
Body facts RF1-RF8, model rows, booster and consumable tables, and rationale for the
revisions admitted under follow-up rulings-2026-10-09-spec-refresh. Sweeps the stacking
and hoarding lines the 2026-10-09 rulings made stale.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
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>
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>
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>
Directory.Build.props, Packages/manifest.json and the lock move to
cultmath-unity-v0.3.0 (614fd445) together. VerifyCultLibRevision matched the
CultMath ProjectReference by a backslash-spelled identity and was skipped on
Linux; it now matches by project file name. Does not pass tests: generated
content re-rolls with the new noise kernel, fixtures follow in later commits.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
AetherDb roles-backfill apply on master's blob 32a2e401: 12 designs and 6 products authored; a second apply is a no-op.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>