Commit graph Aetheria/tools
Author SHA1 Message Date
Meta Vens
7e857cd6e5 Fix the Pirates top-up's two string literals (ac0b39f8 does not build)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 15:58:49 +02:00
Meta Vens
fbd8ab0915 product-lines minor-powers: ten products of Aya, Megiddo and Forge
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 15:54:34 +02:00
Meta Vens
ac0b39f84e minor-power-factions command, MakerProfiles rows, Pirates allegiance top-up (ported from 57083412)
MinorPowerFactionsCommand authors Aya Collective, Megiddo and Orbital Forge as
ordinary factions plus the gains on other factions' Allegiance. pirates-faction on
an existing record now tops up allegiance under its key. Unbuilt here; verified at
the head on Yggdrasil.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 15:54:31 +02:00
Meta Vens
6fe7f7cecb Merge eureka/aetheria-gravity-children-within-reach (children-within-reach, head cf242106)
Merged into master f937662d. No textual conflicts (auto-merged: ActionGameManager.cs,
Belt.cs, LockOn.cs, RunStartTests.cs, ScenarioTests.cs, AetherDb/Program.cs).
GameData/Aetheria.cc untouched by the merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 11:52:44 +02:00
Meta Vens
84337de569 ZoneGenerator.Place owns every generated distance, fold and belt width
PlanetSafetyRadius, ChildDistanceMinimum/Maximum, ExpandSolar's distance series
and the window filters are deleted. Place (ported from replace.py, root window
from rootReach per root-window-floor) lays children inside-out, folds the
lightest family while the outermost overflows, stretches to the window, merges
rings that cannot keep their heavy member outside its Roche margin and sets
belt half widths. Stations pick well-bearing, sibling-clear off-ring bodies;
the tutorial entrance falls back to an orbit round a root node; turrets stop a
side when within the base body's extent. GenerateZone/GenerateArena take
PlanetSettings. Not yet built.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 04:55:57 +02:00
Meta Vens
d7f30ed165 Merge eureka/aetheria-release-faction-play-1 (cut-faction-play-1 r3, h6) into master
Catalog GameData/Aetheria.cc regenerated by replaying doctrine-catalog apply on the merged catalog, not taken from either branch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 04:50:24 +02:00
Meta Vens
7518c0f3e8 DoctrineCatalog: fix the nothing-to-author line (previous commit does not build)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 22:07:49 +02:00
Meta Vens
c30764e33e faction-play-1 fixes: doctrine-catalog apply writes nothing on rerun; tests pin the unseen rule off-origin, the hail speaker in every build order, wire slot 17, exact-name match, scaled standoff, compliance axes, threshold boundaries, follow velocity
Does not build-verified yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 22:05:02 +02:00
Meta Vens
ceb1a08edb product-lines apply lands on a catalog with older-schema records; refusal axes pinned; one maker-profile table
ExpectUnchanged compares the file's schema ids with the loaded ones, so master's blob (hulls written before
HullData lost GridOffset) made apply throw and write nothing. The batch now expects only that the keys it authors
are absent and lands onto the file as it is. Tests: older-schema replay, the design and maker match, case-insensitive
name conflict, a row name that is a design's, the dispatch word, and the sold-weapon floor replaced by "only Smoke
designs are unsold". LaunchSuppressorCatalogTests reads Program.MakerProfiles instead of spelling six profiles.

Not built or run yet; the catalog blob is regenerated in the next commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 20:50:47 +02:00
Meta Vens
04516c72cf Faction play 1: s1/s2 fix batch (Engaged-first anchor, doctrine pins, follow verb)
Flight anchors a blind member on an Engaged track before a nearer Hailing one and keeps its anchor only while nothing outranks it. Doctrine.cs states the trespass rule as the zone owner's permission. DoctrineCatalog matches the faction by exact name and its comment names the landed Pirates record. VerseGrammarCommand gains the follow verb. Tests pin default and authored standoff, Grace against ComplySpeed, nearest hail, the Identified boundary, off-origin direction and anchor choice and switch, the unseen-member rule across geometry, combat from follow, the doctrine-catalog dry run and the turret's global hit threshold.

Not yet run: this commit's tests have not been built.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 20:31:41 +02:00
Meta Vens
86c3a94880 Merge origin/master into faction-play-1
Conflicts: GameData/Aetheria.cc takes master's blob (doctrine-catalog and verse-grammar re-applied in a later commit, follow-up catalog-blob-merge-order); IffAndCombatTests NewShip admits through zone.Admit(ship, piloted); Program.cs keeps master's cases plus doctrine-catalog; FireControlPerWeaponTests keeps master's asserts with the branch's Minion constructor. Master-only compile sites adapted: Minion(ship, doctrine) in FireControlPerWeaponTests, LayoutAimTests, ScannerTests; AgentFires threshold in SolutionTests; Zone.Remove and VerseGrammar in FlightTests.

Not verified to build until the verify run at the end of the pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 20:18:54 +02:00
Meta Vens
05b262f139 Product lines: records get keys derived from the product name; two catalog tests stop hard-coding the old seller sets
The command's records now land with a key derived from the product name, so a replay at a merge reproduces the same records. CatalogRoleTests.RenamedDesignsKeepTheirKeysAndProducts asserts the renamed products are among a design's sellers, not all of them; RolesBackfillIsAuthored reads maker profiles from Program.MakerProfiles (plus the Pirates) instead of its own copy, which lacked AU. Catalog commit before this one is stale: the next regenerates it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 19:28:00 +02:00
Meta Vens
6667b4c6d3 Tests for the weapon product lines and the product-lines command
Catalog tests read the shipped records against the command's own table; command tests run it on a scratch catalog (dry run, apply, replay, untouched bytes, partial line, name conflict, tier accepted). AetherDb shows its internals to the test project. These tests fail until the catalog commit that follows; this commit builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:47:30 +02:00
Meta Vens
fa3c2ab4d3 AetherDb: product-lines command, with the weapons table
One command file owns the twenty second-maker weapon products; roles and quality come from Program.MakerProfiles, now internal. A maker already selling the design is not refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:46:12 +02:00
Meta Vens
eb2dc1e501 Scanner progress reads 0 on another target; Program.RoleMapOf exposes roles-backfill's map
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>
2026-10-15 00:17:17 +02:00
Meta Vens
70b7829bb0 AetherDb: inspection-scanner command (design, three products, role map)
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>
2026-10-14 21:11:17 +02:00
Meta Vens
97b7566ee9 Merge origin/master into damage-falloff
Conflicts: FusedRounds scenario brief and fixture comment, SmokeRoundsSteppedTests, and AetherDb's usage line keep both sides, with
DeathCluster renamed Cluster Cannon. GameData/Aetheria.cc is master's blob; range-falloff is rerun on it in the next commit.
This commit's catalog does not carry the falloff stats, so CatalogRole/falloff catalog tests do not pass here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 09:54:44 +02:00
Meta Vens
742ce88a88 sensor-stat-set: name the Finch Passive Array product Murmur
master's NoDesignTextNamesAProduct fails on the first name, Feather, because the Racing Drive's
functional text begins "Feather-light". The product is renamed; its design text is generic-designs' and untouched.
Builds. The catalog does not yet carry the command's output (next commit).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 04:02:48 +02:00
Meta Vens
005e2fc57b Merge origin/master into sensor-catalog-r2 (code; catalog is master's)
Conflicts: EvasionTermTests keeps the branch's EvLonginusDrive split with master's generic
design names; AetherDb Program.cs keeps both the sensor-stat-set and generic-designs cases and
lists both in the usage line. GameData/Aetheria.cc is taken from origin/master unchanged;
sensor-stat-set apply is rerun on it in the next commit. Tests that read the sensor catalog
(TheCatalogCarriesSensorStats and the roles checks) do not pass at this commit: it builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 03:34:19 +02:00
Meta Vens
aed269ad94 Fire clamps the delivery range to Range; smoke-rounds keeps the template's falloff ratio; fixtures follow the gate
Not yet verified together.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 03:04:45 +02:00
Meta Vens
6025009b24 range-falloff: rewrite only stale records; EffectiveRange joins the Range role; fixture fixes
EffectiveRange takes Range's role in the roles maps; the lock weapon's array
header grows to 37 with the weapon base's new keys; the AI test builds its
gun's effective range in the encounter fixture. Not yet verified.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 02:44:45 +02:00
Meta Vens
177bf4ba50 AetherDb range-falloff: fix a newline literal that did not compile
The previous commit (5e0ec925) does not build tools/AetherDb.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 02:21:46 +02:00
Meta Vens
5e0ec92509 Damage falloff: effective range and damage at max range replace DamageCurve
WeaponData.RangeFactor is the one function of damage over range: 0 outside
[MinRange, Range], 1 up to EffectiveRange, one lerp to DamageAtMaxRange.
DamageCurve (key 7, retired) and its formula parameters, CurveField's
BezierCurve path, and every fixture curve line are deleted. Fire freezes
damage times the factor at BurstReach; the AI's DPS reads, Combat's optimum
sampling and the properties panel chart read the same function. AetherDb
gains range-falloff (command only; the catalog is re-saved in a later commit).
Cut and wiring land in one commit rather than two; this commit has not been
built yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 02:16:04 +02:00
Meta Vens
a8394f3f92 Merge origin/master into generic-design-names
Conflicts: AetherDb usage line (kept master's list plus generic-designs [apply]), Program.cs class tail (kept the
launch-suppressor catalog and GenericDesigns both), GameData/Aetheria.cc taken from origin/master (f1642a12; the
generic-designs apply rerun follows in its own commit). The old-name sweep of the newly landed code follows separately.
This commit does not pass the generic-name tests: the catalog is master's, not yet renamed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 01:49:18 +02:00
Meta Vens
7d1fa5ce60 AetherDb: ExpectUnchanged belongs to generic-designs' batch, not roles-migrate's
The previous sweep commit put the ExpectUnchanged batch in RolesMigrate's commit (first match of the anchor) and left GenericDesigns on a plain commit. RolesMigrate is restored to its base text; GenericDesigns now lands its batch onto the file as it is. Builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 22:52:24 +02:00
Meta Vens
205c9f5205 Briefs, comments and tests name current gear; generic-designs lands only its own records and rewrites the last flavour and brand design texts
Scenario Briefs (Crossing, Duel, FusedRounds, LauncherAngles, StarvedReactor, WeaponFeel), scenario and test comments and test locals say the design names (Lightning Projector, Light Laser, Cell Blaster, Guided Missile Launcher, Swarm Rocket Pod, Muon Fusion Reactor, Cluster Cannon, Charged Scatter Blaster, Rugged Drive, Racing Drive) instead of the retired brand names; Crossing.PlightRange is ProjectorRange.

generic-designs: the batch carries ExpectUnchanged so every record it does not author keeps its bytes (the plain commit re-encoded four records, dropping SensorData key 7). DesignTexts rewrites Large Drive, Tractor Beam, Smoke Proximity, Smoke Delayed, Smoke Refused and Smoke Refused Charge as tech-node text; the Tractor Beam's old line moves to its product Space Tractor. smoke-rounds' authored text names Light Laser and Charged Scatter Blaster to match.

Tests: NoScenarioBriefNamesRetiredGear, TheCapacitorDesignCarriesItsRoleMap, NoDesignTextNamesAProduct, and a command test that widens every payload and checks apply changes only the three records it authors and restores the rewritten texts.

Not built or run at this commit; GameData/Aetheria.cc is regenerated in the next commit, so NoDesignTextNamesAProduct and the command test fail here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 22:34:08 +02:00
Meta Vens
824e0f6a95 AetherDb: the Passive Array design description is tech-node text (designs-are-tech-nodes); flavour stays on its products
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 21:44:05 +02:00
Meta Vens
18fa8a5e1d launch-suppressor: apply lands only its own records; tests pin late hiding, the rating line, linear suppression and a named observer sensor
Command: the batch carries ExpectUnchanged, so CultCache lands it onto the file as it is. A plain commit re-encoded every record through today's types (two sensors lost a retired key-7 payload and gained a trailing nil, LRMM72 and GT 3K gained a trailing nil); this one leaves every record it did not author byte-identical. A conflicting writer now fails the apply instead of being overwritten.

Tests: the mild baffle stores exactly flash x Factor and pays exactly its predicted heat for the first 30 launches of a 300 flash or 8 of a 1000 flash, then is either hidden or bright; the rating is pinned to half a kelvin either side at three heat-sink qualities; suppression and heat are checked at six flash strengths; the observer fits the named sensor 'not if i see you first'; the command test widens every payload and checks apply leaves all other records byte-identical.

This commit's GameData/Aetheria.cc pointer is the previous apply's output; the regenerated catalog follows in its own commit. Not built or run at this commit yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 21:37:41 +02:00
Meta Vens
743d62ae7e Tests for generic-designs: brands on every product, no authoring notes, renamed designs keep keys, the command's refusals and idempotence
The command's authoring-note suffix is a public constant so the catalog test reads the one literal.
Not built yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:32:21 +02:00
Meta Vens
f7cf3257d0 Sweep: every old design-name literal in C# becomes its generic name; product texts ship without the authoring notes
Scenarios, tests, AetherDb templates and name-keyed maps now resolve designs by the generic names (231 literals in 30 files);
TargetingCatalog's product texts lose the authoring note, Steadfast carries its r3 text, DragOnBreath plight's old design text.
Not built yet; tests that depend on the generic-designs command and new tests follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:29:10 +02:00
Meta Vens
4aeeea0ff7 AetherDb generic-designs: track changed records in a list (ReferenceEqualityComparer is not in this target)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:21:38 +02:00
Meta Vens
c17b70a862 AetherDb generic-designs [apply]: 43 designs take generic tech-tree names, eight same-named products take brands
Adds the command, its rename/brand/product-text tables, and the ToolRolesByDesign
Capacitor key. The catalog and the old-name literal sweep follow in later commits;
this commit has not been built yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:14:41 +02:00
Meta Vens
de6dbce70f AetherDb launch-suppressor: two Tool designs (Launch Suppressor, Launch Baffle) and six products, with catalog and command tests
The catalog tests need the applied catalog; this commit does not pass them until the next commit lands the apply output.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:10:21 +02:00
Meta Vens
bce2cd0154 sensor-stat-set: Lucent and Finch products for the two sensor designs; catalog test
The catalog sold only two sensor designs (DME and Miss Terri's), so brand flavour had
nothing to vary: the command adds one Lucent and one Finch product per design. Adds
TheCatalogCarriesSensorStats. Catalog not yet regenerated; not built.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:15:19 +02:00
Meta Vens
45f98c74eb Listener gear (ListenerData, union 50), float HearingMultiple, and AetherDb sensor-stat-set
Entity.HearingMultiple is now the largest of 1 (any active sensor) and each active
listener's Multiple. sensor-stat-set authors every sensor design's InterceptFactor
as a quality-ranged emission-discipline stat plus the Passive Array and its
products. Not yet built or run; the catalog is not yet regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:10:15 +02:00
Meta Vens
eebf6f375a Visibility 5: an item can be aimed at when the observer's book holds it and it is still fitted and whole
IsRevealed is now the observer's book (Entity.HasReveal) plus the live filter
(still on its ship, not IsDestroyed). The tier ladder and
GameplaySettings.TargetArmorInfoThreshold are deleted, with the 19 fixture
initializers and the Settings.asset line. Fixtures that aim at an item record
its reveal through RecordReveal; Aetheria.Shared exposes internals to
Aetheria.Shared.Tests for that. Unbuilt and untested at this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 04:15:35 +02:00
Meta Vens
6177ded511 Merge cut ships-addon-bake (Soul verdict cut-ships-addon-bake.s3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 02:33:01 +02:00
Meta Vens
8c8669b669 Merge cut ping-signature-retired (Soul verdicts cut-ping-signature-retired.s1, .s2)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 02:05:22 +02:00
Meta Vens
bc88f43a19 Bake From Source: one pair under its own names even beside orphans, linked mesh data refused, one error-text site in the operator
Orphan images holding the pair's names are freed at the commit instead of forcing .001; a bake never repoints a slot Source shares through mesh data; the operator's execute is the only place a bake error becomes report text (Refusal marks the module's own fixed text, everything else goes to the console); the copied-material count is asserted. Builds (Blender add-on, no compile step).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 01:47:23 +02:00
Meta Vens
4cea604b85 Bake From Source: the bake never rewrites what Source owns, bakes onto UV0, keeps one pair under its own names, reports Blender errors as fixed text
Shared material (shared-material-source-rewritten): a target slot holding a material a Source mesh uses is given a copy before the bake; a replaced image is removed only when unused.
UV0 (bake-follows-active-uv-not-uv0): every target's active UV layer is held at 0 for the bake and put back.
Relief (normal-tolerance-accepts-near-flat): smoke_bake bounds the normal's median tilt at 3 degrees (copy of Source 0.32, hull 16.59).
Pair names (pair-names-suffixed): a name held by an image the bake would not free refuses with fixed text.
Fixed text (refusal-passes-plain-runtimeerror-text): any foreign exception inside the bake becomes BakeFailed with the console pointer.
All builds; smoke_bake.py passes on Blender 5.2.2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 01:10:34 +02:00
Meta Vens
07852e6313 smoke_bake: pin the link restore, the offender selection, Blender's text staying out of the report, and the preference-to-bake relation
Found by hand mutants that survived: a failed bake restored a Base Color link only when a prior non-image link
existed (the smoke now has one), the offenders were already the selection, the bake's RuntimeError text was not
checked, and the cage/ray windows allowed a constant offset. All commits build; no C# touched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 00:45:59 +02:00
Meta Vens
39713df097 smoke_bake: fixture gaps found by the hand mutants: commit-step rollback, bare-mesh rollback, linked Metallic, bake preferences
The Source gets a linked Metallic and a Transmission Weight of 1, the bake is forced to fail at the
wiring and replace steps and with meshes that have no material, and the cage extrusion and max ray
distance preferences must move the normal map. All commits build; no C# touched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 00:40:20 +02:00
Meta Vens
91bae0dd83 Bake From Source: Cycles Selected-to-Active from Source onto her UV0, one albedo and normal pair per ship
Adds aetheria.bake_from_source: bakes the Source meshes onto the selected render meshes as
'<ship id>.albedo' (sRGB) and '<ship id>.normal' (Non-Color), packed, wired into every material
(a shared '<ship id>.hull' material for a mesh with none). One routine serves both maps and every
target. The Source's Metallic and Transmission Weight are neutralised for the bake (the glTF importer
sets Metallic 1.0, which bakes black); engine, samples, device, selection and Source are restored in
a finally, and a failure removes everything made and puts every changed link back. Three bake
preferences, a panel button, the tripo-hull.glb LFS fixture and smoke_bake.py (4 passes).
_refuse_loose_meshes now shares the select-offenders refusal with the bake.
All commits build; no C# touched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 00:38:26 +02:00
Meta Vens
018a62be81 Merge cut scenarios-smoke-rounds (Soul verdict cut-scenarios-smoke-rounds.s2)
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>
2026-10-12 21:32:51 +02:00
Meta Vens
3535660cc5 Merge cut package-product (Soul verdict cut-package-product.s4) 2026-10-12 20:54:40 +02:00
Meta Vens
a19e3ba647 Merge cut missile-stats (Soul verdict cut-missile-stats.s2) 2026-10-12 20:54:30 +02:00
Meta Vens
d8b7f33d90 Visibility 4a: retire the ping's light signature; Emission is never light
SetSignature refuses Emission; Sensor.PingVisibility (key 7) is retired and
Ping() writes no signature; Sense's Emission skip, the departure subtraction
and SignatureOn are deleted. Tests: SetSignatureRefusesEmission,
APingNoLongerBrightensThePinger; fixtures drop PingVisibility.

Not yet built or tested at this commit (verify job follows).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:51:46 +02:00
Meta Vens
6087fd967e zero-byte test asserts cultcache-py's own refusal, so a restored add-on size==0 branch fails it
The test compares type and message with SingleFileMessagePackBackingStore.pull_all on the same
file; the add-on's shape refusal (also a ValueError) no longer passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:00:35 +02:00
Meta Vens
96bbaa6320 validate shares Read's post-load composition; products, key, price rules pinned beyond the first product
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>
2026-10-12 20:00:18 +02:00
Meta Vens
b0de7c746b AetherDb smoke-rounds: Smoke Proximity and Smoke Delayed draw 4 energy a shot
A stepped Fused Rounds arena showed no round fired from any weapon aboard, the DeathCluster included: the Smoke Test Hull's one
2x2 reactor (Core Power, charge 100) cannot carry two Spectra clones at 20-40 energy a shot, overloads, reaches 445 K within a
second and goes offline. The catalog is regenerated in the next commit; this commit's command no longer matches the committed
catalog, so SmokeRoundsCommandTests/stepped tests are not meaningful at this commit alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 19:50:13 +02:00