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>
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>
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>
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>
Findings of verdict cut-ships-addon-guards.s1: guard-not-import (the version now comes from the checkout the imported
cultcache_py lives in, one owner, no pyproject-beside-a-path), prefix-compare-survives (0.3.0.1, 0.3.0rc1, 0.3.00
refused), cap-boundary-unpinned and group-restore-unpinned (smoke_package texture_boundary_cases: at the cap, one over,
height-long, non-square rounding, file/packed/node-group images, failed export restores). A copy whose scale raises is
removed. All commits build.
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>
The untested-cultcache test now refuses 0.4.0, 0.3.1 and 0.3 as well as 9.9.9 (a major-only comparison survived).
smoke_package's hull map is 4096x1000, so the scaled size (2048x500, 512x125) is not what a clamp of both sides or of
the other axis would give. Builds: yes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Passes 7 and 8 run mirror_matrix on ships whose grids are 14 (even) and 15 (odd) wide; the expected twin cells are
grid_w - a - w computed in the matrix itself. Pass 6 (5 wide) now runs through the same matrix_pass function. This is
the commit that adds the cases for follow-up mirror-wide-grid-test. Builds: yes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
_export_glb points each Image Texture node of the exported objects' materials whose image is longer than the Max texture
preference (default 2048) at a scaled copy (longest side at the cap, aspect kept) and restores the originals and removes
the copies in its finally block, so the .blend's images are never modified. smoke_package.py reads the GLB's PNG
headers: a 4096x1024 map exports at 2048x512 and at 512x128 under a 512 cap, a 256x256 map exports as it is, the .blend
images keep their size and no copy is left in bpy.data.images. Builds: yes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
_libraries reads [project].version from the pyproject.toml beside the cultcache-py source before importing it and raises
ValueError naming the version found and the packages path when it differs from TESTED_CULTCACHE_PY (0.3.0) or the file is
missing. Builds: yes. test_refuses_a_file_with_no_record fails as before (cultcache-py unpack error on a 0-byte file).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The committed font is not rebuilt yet, so test_fe0f_twins.py's first test is red against it; the font lands next. Builds nothing in Unity.
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>
hull_grid.mirror_position gives the twin Position as grid_w - a - w, so an even-width footprint mirrors to its true
reflection and the cell lookup's tie rule no longer decides a mirror; the twin's object stands in the cell that Position
puts it in, so Package derives the same Position back. test_hull_grid pins the reflection on odd and even grids and
rows of 4 or more cells; smoke_mounts runs footprint widths 1 to 4 at every cell of an even and an odd grid, the
boundary tie, the armour and arc copy, the muzzle's local X, the centre-line threshold, the grid edge and the parent
check, and keeps a mirrored pair of two-cell footprints through Package and the validator. Every commit builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds tools/emoji/emoji-sequences.txt (2760 fully-qualified multi-code-point sequences from the pinned emoji-test.txt), written by fetch_emoji_font.py and recorded in the lock. Not compiled yet (first Unity pass follows); the asset changes land in a later commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
smoke_package's hand-tagged ship has a weapon-mount object, no Ship Root and no loaded
buffer; the first mounts commit refused it. A ship with no frame has no grid to derive
from, so Package leaves its rows alone as before. A framed ship with a mount and an
unloaded buffer is refused with 'Load Layout first'. All commits build.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Thrust, DodgeFrequency and MissileVelocity are gone from LauncherData (keys 29-31) and GuidedWeaponData (keys 24-26), keys
reserved. GuidedProjectileManager flies the round from MunitionParts.Of: Acceleration, MaxSpeed and EvasionFrequency,
evaluated through the item. munition-parts-migrate is deleted with the fields it read.
The shipped catalog still carries the dead keys in this commit; the next commit re-saves it. The Unity assembly was not compiled.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MunitionHullData, MunitionThrusterData, MunitionSeekerData, MunitionControlData (with Cognition) and MunitionFuelData
(Behaviors union 43-47), read through MunitionParts.Of. StatValidation.ValidateMunitionParts refuses a launcher design
without exactly one of each and any other design carrying one, at catalog load and Upsert. AetherDb gains
munition-parts-migrate; LauncherRoles names the part's thruster stats by type and field (Range and Visibility also name
the seeker's and plume's flat stats, which RolesBackfill must not range).
Does not pass tests on its own: the shipped catalog is migrated in the next commit, and until then it fails the new gate at load.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ShipAuthoringStore.Load/Read return (Hull, Visual, Products); Open homes the third kind;
WriteProduct/DeleteProduct are the only product writers; ValidateProducts and the ship
top-speed rule; compose checks makers, keys and product names; ship-authoring product and
price commands. Unbuilt until the verify job (Python, pin test and docs follow in the next commit).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hull_grid gains mounted_position, facing_yaw, mirror_rotation and mirror_footprint. The
mount helpers edit the layout buffer and create a tagged weapon-mount object with its row
as a pair; Package derives each mounted row's Position from its object and each mount's yaw
from its row's Rotation, then saves the buffer through _save_layout. The panel gets a
Mounts box and greys a mounted row's x and y. smoke_mounts.py pins the gunboat flank,
derive and remove paths. All commits build.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The previous commit (93d5a0c6) does not build: two string literals in SmokeRoundsCatalog carry a raw line break. This commit builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Smoke Proximity, Smoke Delayed and Smoke Refused are Spectra clones with the operator's fuse values; Smoke Refused Beam is a constant weapon and Smoke Refused Charge a charged one cloned from ChargeBlast SG, each fused with a Range below its BlastRadius. No products. SmokeRoundsCommandTests covers dry run, apply and the no-op second apply.
The catalog and the arenas that carry the designs follow in the next commit. This commit builds; its command test needs no catalog change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 1x1 Ballistic side mount tripped IsFilledByAgreesWithACellOracle (Shape.FitsWithin never places a
design whose only cell is not its origin, so Takes and the oracle disagree on a 1x1 hardpoint); the
side mounts are 2x2 now, which needs two columns of margin on each side, so every Longinus cell and
hardpoint moves right by two. The two catalog-wide tests that listed every hull now list sold hulls.
This commit does not pass the suite: GameData/Aetheria.cc still holds the previous hull until the
next commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AetherDb smoke-hull [apply] adds a product-less Longinus copy with a 2x2 Energy and a 2x2 Ballistic
hardpoint past the bow and a 1x1 side mount on each flank. Weapon Feel (seed 107) stages it with
ChargeBlast SG, Autocannon and FastBlast+-; Arcs flies it with a mount on each flank and a Port and
Starboard hull. This commit does not build a passing suite: the scenarios name the hull and
GameData/Aetheria.cc does not hold it until the next commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Stale sweep identified generated anchors by collection membership and role, so an author's hull-collider in
Generated was deleted. Generated anchors now carry aetheria.generated; the sweep removes only those. New smoke
pass package_asymmetric_pass: an L-shaped render hull pins tractor X and shield centre to the bounds centre,
a Source-only ship pins that generation never reads the Source fallback, and a collider placed in Generated
survives Package. All commits build.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Hand mutants (floor dropped; recentre before generation) survived the first Package pass; both now fail.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AetherDb ship-authoring centre prints Shape.CenterOfMass; Package asks it and moves Ship Root so that point sits
at the world origin, after regenerating the unowned map icon, shield and tractor from the render meshes (Keep
leaves one alone). Package never makes a hull collider (ruling package-frame-defer-collider). smoke_package's
bound-collection rollback cases now rebind to a different path so a rollback that restores keys but not values fails.
C# not yet built when committed; the Blender smokes and Python unit tests pass.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
_bind_collection restores every aetheria.* key if the ID-property store
refuses a value, so a bad ship id or pending leaves the collection as it
was. smoke_package.py gains default-run cases: relpath raising ValueError
(the cross-drive signal) must store the absolute path and finish; a refused
id or pending must leave bound and unbound collections unchanged.
All commits build (Python only).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GameData/Aetheria.cc is master's blob, not this branch's; the consumables-first-set
apply is replayed in the next commit. The AetherDb command list takes both new
commands. This merge commit does not build until the apply and test seeding follow.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The command mutated the cache's own VerseGrammar before the batch upsert, so the upsert was redundant and two Soul
mutants (update branch dropped; Same ignoring description or render path) survived: the replace test judged the result
with the same Same() the command uses. The test now reads the fields. Unrun until the full job.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Takes master's catalog pointer (GameData/Aetheria.cc) and its TestCatalog.Registry fixture path;
VerseGrammar is the global scratch catalogs author (TestCatalogGlobal stays deleted: the shipped
registry now has a real global, so a test-only second one would have to be authored beside it).
StatResolverTests, TestCatalogTests and AetheriaStoresTests author VerseGrammar.
Does not pass the suite: the catalog is master's and holds no grammar until the verse-grammar apply commit follows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New Ship places each mesh by the matrix an object can hold (_held: location, rotation, scale), so a sheared parent no
longer makes the drafted cells differ from the cells Rasterise reads from the hull left behind. smoke_frame pins a failed
Save of a saved ship (write failure and stale revision) leaving its ship.cc, New Ship refusing a vertical wall before
anything changes (twice), the sheared-parent equality, and Ctrl+Z past a first Save: the refusals name the way forward
(Bind Ship Collection, Load Layout) and the route works. All commits build.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
New Ship baked rotation and scale into the mesh data after checking the cells on the evaluated mesh, so a Mirror
modifier acted in a changed frame (a half hull, length 10, got 3x5 cells). The meshes now keep their data and carry the
placement as their own matrix; the cells and grid_origin are the ones computed before the bind and are placed by the one
_place_grid writer, which Rasterise shares; no call that can refuse follows the bind. The single-user refusal, which
protected the baking, is deleted. One _triangles_xy reads the evaluated meshes for both New Ship and Rasterise.
smoke_frame: a Mirror half hull gets the cells of the hand-mirrored solid, and the drafted cells equal Rasterise's of the
hull left behind. Every commit builds (Python only).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Package refuses loose meshes and a pending ship; Package reads the .cc rows cut to the seven known members and only
compares a buffer that belongs to the bound ship; Flip Nose turns the hull back when its Rasterise fails; New Ship
refuses meshes in child collections; the Grid is not drawn from a buffer short of cells; Rasterise refuses a ship with
no Ship Root. Eight hand mutants, all caught. Every commit builds (Python only).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One frame predicate: _loose_meshes no longer exempts Source, so a mesh Rasterise reads is a mesh Flip Nose turns (it
turns Ship Root's descendants) or the operator refuses and selects it. Package: the glTF exporter's RuntimeError is
printed to the console and reported as fixed text; the validator's verdict goes to the console and the panel reports
accepted or refused with the anchor count only (no ship ID, no anchor ID). smoke_frame and smoke_package pin each, five
hand mutants caught. Every commit builds (Python only).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pass 7: a pending Save over an existing ship.cc is refused and leaves it; a failed Save keeps the files that were in
the ship folder; New Ship takes no hardpoints from the ship before it; a buffer that belongs to another ship is neither
saved nor rasterised. Pass 8: operators called with undo=True push a native step in background Blender only when they
carry UNDO, so Rasterise, Flip Nose and New Ship undo as one step and Save does not. Nine hand mutants, all caught.
Closes no finding; every commit builds (Python only).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One chooser (_ship_collection) and one predicate (_is_ship). _save_layout is the only
replace_layout caller and creates a pending ship's file, removing what it made on failure.
Rasterise writes the layout buffer and aetheria.grid_origin = [x, y, width, height]; Flip Nose
and Package refuse meshes outside Ship Root. New Ship checks first and writes nothing to disk.
Operator reports are fixed text; AetherDb output goes to the system console. smoke_frame covers
undo, hardpoints, Save, cleanup, loose meshes and an empty Game folder preference.
Builds: yes (needs the previous commit's ship_cc).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
layout_revision(shape, hardpoints) is the revision rule replace_layout and Package share.
SHIP_ID_CHARS and RESERVED_SHIP_IDS mirror ShipAuthoringStore.RequireShipId; ShipSchemaPinTests
sweeps every character and every candidate stem against the C# rule. ship_cc errors no longer
carry the path, mount id, anchor id or object name. C# tests: create judges the ID not the
display name, FindRoot answers the working directory itself, short trailing-dot IDs.
Builds: yes (C# test edits and Python only).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>