rrt/docs/rehost-queue/locomotive-descriptor-tails-2026-04-21.md

139 lines
6.8 KiB
Markdown

# 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