Ship S0: correct the authoring doc, record the merge status in the map

Applies corrections 1-4 of docs/moddable-ships-cut.md B.1 to
docs/moddable-ship-authoring.md: label the Quiet probe numbers as unrecorded,
name the double-held mod hull in the derived catalog, name the ShipAuthoring
catalog-routing invariant, and scope "same semantic validator" to C# callers.
The map's status header gains the S0 result (615 tests on the merge), the
S-Soul status, the corrected TradeMenu.cs path, and anchors re-taken against
the merged tree.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-09-30 02:26:50 +02:00
commit 01e9db1c27
2 changed files with 40 additions and 3 deletions

View file

@ -6,6 +6,10 @@ authoring, validation, loading, and play checks.
## LineArt proof from Quiet.blend
The numbers in this section and in the compose example below come from an
unrecorded probe. `Build/quiet.cc` is git-ignored and no committed fixture or
test reproduces them.
`C:\Users\Meta\Desktop\Quiet.blend` is a read-only source for this probe. At frame
1, `Quiet / Dexter Quiet Lineart` evaluates to 1,040 polylines with 3,125
points. Blender 5.2.2 wrote those coordinates, point radii and opacities,
@ -96,7 +100,9 @@ is not yet an end-to-end ship loader in the current game.
migrated hull; it does not keep two writable definitions of that hull.
`ship-authoring validate`, the catalog composer, and the visual importer call
the same semantic validator. Blender edits the hull grid, hardpoints, and
the same semantic validator; that shared path is true of the C# callers only.
The Blender side checks grid bounds and footprint shape (`ship_cc.py`) and
nothing semantic. Blender edits the hull grid, hardpoints, and
captured lines in the typed source record; `inspect` reads incomplete drafts.
Unity's **Aetheria / Preview Mod Ship
Package** imports a validated package from disk, resolves stable GLB node IDs,
@ -107,13 +113,23 @@ records.
## Runtime catalog seam
`AetheriaStores.CatalogTypes` routes `ShipAuthoring` to the shipped catalog,
but the shipped catalog contains no `ShipAuthoring` record. This stays correct
only while nothing writes a `ShipAuthoring` through a catalog-writable cache on
`Aetheria.cc`; a mod ship's authoring record lives in its own `ship.cc` and in
the derived catalog.
`CultCache` routes `ItemData` to one home backing store, and
`ActionGameManager.CultCache` holds that store for the entire play session.
Attaching each mod's `.cc` as another item store would violate the cache's
one-home invariant. `ship-authoring compose` instead derives one runtime catalog from
the shipped catalog and validated mod packages, preserving all shipped record
keys. Each mod's stable `ShipAuthoring.Id` yields separate deterministic keys
for its copied `HullData` and its runtime authoring record. The generated
for its copied `HullData` (`mod-hull:<id>`) and its runtime authoring record
(`mod-ship:<id>`). The authoring record's key 1 is the same `HullData`, so the
derived catalog currently holds each mod hull twice. Gameplay reads only the
`mod-hull` copy; the `mod-ship` copy is dead weight inside a disposable file
until the open question on which record owns the hull is settled. The generated
catalog is disposable; the shipped catalog and each mod's source `.cc` remain
the owners. A player session opens one catalog snapshot and cannot hot-swap its
designs beneath existing entities.

View file

@ -136,10 +136,31 @@ control, which has since moved 8 commits to `b66ba524`. Neither side touches the
| `375d6bd4` | Blender layout editing (hull grid, hardpoints) through `ship_cc.py` |
The delta is +511 C# (including `tools/AetherDb`), +494 Python, +119 tests, and one new Unity package dependency.
It also carries a stray fix in `TradeMenu.cs` (an unused `using System.Runtime.Remoting.Contexts`).
It also carries a stray fix in `Assets/Scripts/UI/Menu/TradeMenu.cs` (an unused `using System.Runtime.Remoting.Contexts`).
Self's ruling: it stays on this branch as cleanup. Master compiled clean in Unity with the using present, so master does
not need it.
**Test counts.** The two ship tests pass on the merged tree: 364/364 (section 0).
**S-Soul status:** F1, F2, F3 and F6 fixed at `fe38f288` (479 tests). F4 has no spec entry. The Python tests
(`tools/blender/tests/test_ship_cc.py`, 32) have no runner yet; run them by hand.
**S0 status (2026-09-30):** master `65c63495` (fire control 12, `dcd7bbc5`) merged into `codex/moddable-ships` with
`--no-ff` at `18e12d81`, no conflicts. Corrections 1-4 applied to `docs/moddable-ship-authoring.md`. Yggdrasil full
suite on the merge (`dotnet test tests/Aetheria.Shared.Tests`, CultLib `45c2f40`, CultMath `6d5e209`): **615 passed, 0 failed**. The Unity batchmode compile and the `ShipModPreview.Smoke` run are Self's
steps and have not run.
**Anchors re-taken against the merged tree (`18e12d81`).**
- Unchanged: `ShipAuthoring.cs:15` (`Hull`, key 1), `:84`, `:111-136` (the hardpoint checks are `:112-131`),
`ShipModCatalog.cs:20-21` (keys), `ItemData.cs:512` (`Hardpoints` `Key(23)`), `:515` (`Prefab` `Key(24)`),
`Loadout.cs:74`, `EntityInstance.cs:15-27`, `ZoneRenderer.cs:289-310` (`LoadEntity`), `AetheriaStores.cs:9`.
- Moved: the second upsert in `ShipModCatalog.Compose` is `:68-69` (was `:60-61`; the F1-F3 fix added the
name-collision checks above it). `ship_cc.py`: slot constants are `:23-25`, `replace_layout` is `:96-124`,
the `body[HULL_SLOT]` reads are `:84,101`. `ActionGameManager.cs`: the catalog opens at `:55-59`
(`AetheriaStores.Open`, not `:45-60`); `capturepreset` is `:621-662`.
- S1's key 32 for `HullData.Visual` holds: `EquippableItemData` owns 30 and 31, `HullData` uses 23-29, and
`WeaponItemData.Fuse` at 32 (`ItemData.cs:505`) is a sibling class, not an ancestor.
**Proof-gate status against the doc's own gates (`docs/moddable-ship-authoring.md:149-164` @`375d6bd4`):**
| Gate | Doc implies | Verified in git |