# Locomotive Descriptor Tails (2026-04-21) This note preserves the checked evidence behind the locomotives-page tail after the full local `.gms + .gmx` save-corpus pass, so the short queue can treat the remaining work honestly as an external-corpus or dynamic blocker rather than another repo-local static task. ## Local Save-Corpus Census The checked [locomotive catalog tail census](../../artifacts/exports/rt3-1.06/locomotive-catalog-tail-census.json) now exhausts the full local save corpus under `rt3_wineprefix/drive_c`: - `29` candidate saves found - `26` parsed samples - `5` saves with a save-side named locomotive table and derived `locomotive_catalog` - `26` saves with packed-event collections present - one save-stable catalog prefix through ordinal `58` (`VL80T`) - two observed tail clusters beyond that prefix: - one `63`-entry tail on `g.gms` / `Spanish Mainline.gmp`: `242 A1 / Class 460 / Class A1 / Class P8 / U1` - one `61`-entry tail on the four 1.05 save families: `GP 35 / U1 / Zephyr` The added `18` `.gmx` sandbox saves still carry no reconstructed named locomotive table and no derived `locomotive_catalog`, so they widen the local event corpus without widening the save-native ordinal catalog evidence. The three classic `rt3/` `.gms` saves (`Autosave.gms`, `hh.gms`, `kk.gms`) remain catalog-free too, so the save-native tail evidence is still carried only by the same five 1.05 `.gms` saves. The scan still skips the three classic `rt3/` sandbox saves (`Autosave.gmx`, `aaa.gmx`, `bbb.gmx`) at save-slice load time, so the currently parsed sample set is `26` rather than the full `29` candidate paths. That does not change the locomotive blocker: none of the successfully parsed `.gmx` samples widens the save-native catalog, places `Class QJ`, or surfaces descriptor carriers in `452` or `457..502`. ## Grounded Lower Bands The lower descriptor bands are now grounded enough to execute through the existing save-native owner seam: - availability descriptors `241..351` already map directly onto recovered locomotive ids `1..111` - cost descriptors `352..451` already map directly onto recovered locomotive ids `1..100` - the save-side named locomotive table already projects into `RuntimeState.locomotive_catalog` as one ordinal id-to-name map derived from row order - that means the remaining lower-tail rows `302..351` and `413..451` are no longer missing an owner seam; they are just later ordinals on the same catalog The old “grounded executable prefix through save-backed locomotive id `61` (`Zephyr`)" boundary is therefore retired. The whole lower bands are executable whenever the save or overlay supplies the catalog context. ## Grounded Shipped Name Cohort The remaining lower-tail labels are no longer blocked on missing shipped engine names. The checked export [engine-type locomotive display census](../../artifacts/exports/rt3-1.06/engine-type-locomotive-display-census.json) now parses the fixed `.car` header fields for every shipped `Data/EngineTypes` locomotive pair: - `66` shipped `.car` / `.lco` locomotive families - `61` primary display names that match the broader checked shipped-name prefix - `5` extra shipped named families not present in the current grounded prefix: - `242 A1` - `Class 460` - `Class A1` - `Class P8` - `Class QJ` That means the remaining lower-tail uncertainty is no longer “what are the extra shipped locomotive names?” It is where those five named families land in the live ordinal catalog that the save-side named availability table mirrors. The full local save corpus tightens that further. The only observed nonclassic tail in the checked census is `rt3_wineprefix/drive_c/rt3_105/Saved Games/g.gms`, which exposes one `63`-entry named locomotive table whose observed tail is: - `59` `242 A1` - `60` `Class 460` - `61` `Class A1` - `62` `Class P8` - `63` `U1` That observation matters because the four catalog-bearing 1.05 save families still carry the classic `59..61` tail `GP 35 / U1 / Zephyr`. So the currently honest static descriptor-name boundary is not the broader shipped-name prefix through `61`; it is the last save-stable prefix through ordinal `58` (`VL80T`). After that point, save-backed ordinal names are real and executable, but they are no longer universal enough to hard-code in the static semantic catalog. The same checked local corpus still does **not** surface `Class QJ`, even though the shipped engine-type corpus proves that family exists on disk. So the current non-hook evidence only closes the dynamic tail through the observed `63`-entry family above; it does not yet place the fifth extra shipped name in any live ordinal slot. The same checked local corpus also exposes no packed-event rows in descriptor range `452..502`, so the remaining `Unknown Loco Cost` and upper-band frontier is absent from the local save-backed event corpus as well as unmapped in the static descriptor metadata. ## Remaining Blocker What is left is narrower and cleaner, but it is no longer a repo-local static task: - ordinal placement of the scenario-dependent locomotive tail beyond the save-stable `1..58` prefix - descriptor `452` `Unknown Loco Cost` - upper availability band `457..474` - upper cost band `475..502` The upper bands still carry only slot labels in the checked semantic catalog: - `Upper-Band Locomotive Availability Slot 1..18` - `Upper-Band Locomotive Cost Slot 1..28` The lower bands now split cleanly into two layers: - ordinals `1..58` keep fixed checked descriptor labels through `VL80T` - ordinals `59+` stay executable through recovered ids plus save catalog context, but the checked semantic catalog keeps generic slot labels because the local save corpus already shows scenario-dependent tails Unlike the lower bands, the current checked row summary metadata does not yet recover live locomotive ids for the upper-band descriptors at all. ## Blocker Result The next question is no longer whether locomotive page descriptors can import through a save-native owner seam at all, or whether the shipped engine-type files even have stable names. The checked repo-local answer is already as tight as it can get: - where the extra shipped named families (`242 A1`, `Class 460`, `Class A1`, `Class P8`, `Class QJ`) land across the scenario-dependent tail beyond the save-stable `1..58` prefix, and - whether the upper bands continue the same ordinal locomotive catalog after the lower `1..111` / `1..100` families, or - do they belong to a separate page-owned selector family that only sits adjacent in the recovered `EventEffects` table Descriptor `452` should stay separate from that question until stronger evidence ties it to either the lower cost band or the upper tails. The current repo-local blocker is therefore explicit: - the next honest non-hook step needs a broader save corpus than the eight local saves already exhausted here - the next honest non-static step needs dynamic tracing or hooks