This repository has been archived on 2026-09-16. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Syplheed-Reborn/docs/re/structures/archive-naming.md
Claude (auto) bcc23cba4a re: why each archive is low-coverage -- two different reasons, cleanly separated
Splitting every unnamed entry by magic turns the coverage percentages into an
explanation.

The three low-coverage UI archives have ZERO unnamed IDXD.  GP_HANGAR_ARSENAL
is 180 IDXD, 180 named, 0 unnamed -- its 1191 unnamed entries are 1149 T8aD/RATC
plus 42 LSTA, i.e. sprites.  GP_MISSION_SELECT and GP_DEBRIEFING_PILOTLOG hold
no IDXD objects at all.  So "22.6 % named" is misleading: every data table in
that pak is named, and these three are the same artwork-naming phenomenon as the
blocked 2D and READY_ROOM archives.

DefTables is the only genuine data gap: 1425 IDXD, 130 named, 1295 unnamed, in
17 record-name shapes -- Generic + Level_0..Level_3 (807, LOD sets) and Default +
EnumMotions + Generic + ReferenceFrames +/- Motion_break/dead/down (463, motion
sets).  One LOD and one motion table per model.  Level_0, EnumMotions and
ReferenceFrames appear in no document.

Control: the 100 % archives have no unnamed entry of any kind, and GP_MAIN_GAME_E
is 667/337 IDXD with zero unnamed artwork -- two failure modes, not a gradient.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
2026-08-27 19:41:29 +00:00

9.0 KiB
Raw Blame History

✅ Which archives the disc can name — and the two it cannot

The previous pass found that 0 of 419 in-game HUD config paths hash to a pak entry (hud-config). Chasing more prefixes would have been the same mistake twice, so this censuses the whole disc instead: harvest every plausible asset-name string from every archive, hash each under the 16 known path prefixes, and ask per archive what fraction of its TOC that explains.

idxd-container.md and idxd-tag-hash.md own the hash (name_hash = a checksum byte over a 24-bit modular value, case-insensitive, distinct from tag_hash); neither says which archives are reachable by it. Artefact ../data/archive-naming.txt, regenerator tools/re-capture/archive_naming.py (6 027 candidate names × 16 prefixes).

The result is bimodal

archive entries named
GP_TITLE, GP_PAUSE_MENU, GP_STAGE_CLEAR, GP_CHALLENGE, GP_MOVIE_THEATER, GP_GAMEOVER, GP_BUNK, GP_SYSTEM, GP_TUTORIAL, MiscBin, fonts 2–151 all 100 %
tables.pak 79 78 98.7 %
GP_DIALOG 140 139 99.3 %
deu/eng/esp/fra/ita/jpn.pak 117 115 98.3 %
GP_SAVE_LOAD / GP_LEADERBOARD / GP_OPTIONS / GP_MISSION_LOG 24–108 91–94 %
GP_MAIN_GAME_{D,E,F,I,J,S} 1 119 751 67.1 %
GP_DEBRIEFING_PILOTLOG 234 78 33.3 %
GP_HANGAR_ARSENAL 1 538 347 22.6 %
DefTables 1 465 130 8.9 %
GP_MISSION_SELECT 88 22 25.0 %
GP_READY_ROOM 1 106 6 0.5 %
GP_MAIN_GAME_{D,E,F,I,J,S}2D 711 each 0 0.0 %
sound.pak 9 519 1 0.0 % (a separate format — sound-pak-contents)

🔑 The six 2D paks are at exactly 0.0 %, all six, 711 entries each — while eleven menu paks are at 100 % by the same method in the same run. That is the control that makes it a finding rather than a failed guess: the method works, and these archives are outside it.

🔑 GP_READY_ROOM is a second such archive — 1 106 entries, 6 named. Not previously noted anywhere in docs/re/; it is the largest UI pak on the disc and its names are as unreachable as the 2D paks'.

✅ The sweep now says WHICH entry, not just how many (2026-08-27)

The percentages above were the whole output for a long time, and that hid something: the sweep had already named the 24 StageParameter_S<NN>.tbl objects that a later iteration "discovered" — they were in the 6 027-candidate set from the start. Nobody could tell, because the artefact only reported GP_MAIN_GAME_E … 751 named, 67.1 %.

archive_naming.py now also emits, per archive, the resolved name families (digits collapsed to #) with counts — 6 573 named entries, 1 631 families across the disc. That turns the statistic into a content index; the GP_MAIN_GAME_E head is

   x28   EnumUnit_S#.tbl        x28   StageResource_S#.tbl
   x28   FormationSet_S#.tbl    x28   UnitGroup_S#.tbl
   x28   Route_S#.tbl           x22   AIParams_S#.tbl
   x22   StageParameter_S#.tbl  x22   UnitMessageSet_S#.tbl        …212 families

Method lesson, paid for twice now: a coverage percentage is not a name table. If a sweep can name a thing, make it say the name, or the next reader will redo the work.

⚠️ Determinism: the resolved map is built by iterating the candidate set, so it is now iterated sorted — a plain set gave a different winner for collided hashes on each run and the artefact failed its own byte-identical check.

✅ WHY each archive is low-coverage — two different reasons (2026-08-27)

Splitting every unnamed entry by its magic turns the percentage table into an explanation. The three "low-coverage" UI archives are not missing data at all:

archive IDXD named unnamed IDXD unnamed T8aD/RATC unnamed LSTA
GP_HANGAR_ARSENAL 180 180 0 1 149 42
GP_MISSION_SELECT 0 0 0 64 2
GP_DEBRIEFING_PILOTLOG 0 0 0 148 8
DefTables 1 425 130 1 295 0 0
GP_MAIN_GAME_{D…S} 1 004 667 337 0 0

🔑 GP_HANGAR_ARSENAL's "22.6 %" is misleading: every one of its 180 data tables is named. Its 1 191 unnamed entries are sprites and bundles, and GP_MISSION_SELECT / GP_DEBRIEFING_PILOTLOG contain no IDXD objects at all. Those three are the same phenomenon as the 🔴 blocked 2D and GP_READY_ROOM archives — unreachable artwork names — not a data gap.

🔑 DefTables is the only genuine data gap on the disc: 1 295 unnamed IDXD objects, in 17 record-name shapes, and two families cover almost all of them:

Generic + Level_0 … Level_3          807   LOD sets      (cf. EnumLODSet_*.tbl)
Default + EnumMotions + Generic +    463   motion sets   (cf. EnumGameModel_*.tbl)
  ReferenceFrames (+ Motion_break /
  Motion_dead / Motion_down)

stage-definition-table.md and stage-mission-tables.md own the names EnumLODSet_*.tbl / EnumGameModel_*.tbl; the record shapes above are not in docs/re/ anywhere — Level_0, EnumMotions and ReferenceFrames appear in no document. So what DefTables withholds is one LOD table and one motion table per model, keyed by model names the disc does not spell out.

⚠️ The 40 <?xml entries in DefTables are already identified — isl-condition-builtins.md calls them XPR2 resource manifests (<RDF Version="XPR2">, <XBGMesh …/>, <Texture …/>) and corrects an earlier "the config reader is XML" claim. Not new here.

Control: GP_TITLE and the other 100 % archives have no unnamed entry of any kind, and GP_MAIN_GAME_E splits 667 named / 337 unnamed IDXD with zero unnamed artwork — the two failure modes are cleanly separated, not a gradient.

What that means for the 419

The in-game HUD's asset paths are not "missing". Nothing in the 2D paks is reachable by name from the disc's own strings, whatever the extension. So the 2D and READY_ROOM TOC keys are hashes of names that are not written anywhere we can read — built by the tool chain, or from a string the executable composes, or from a name list held outside these archives.

🧪 Also refuted here — 13 name transformations

Before the census, the 419 config values were re-hashed under 13 rewrites: as-is, forward slashes, basename, basename without extension, without extension, uppercased, .rat substituted, 2d\/eng\/hud\/GP_MAIN_GAME_2D\ prefixed, and first-directory stripped. Every one scored 0, both against the E2D pak's 711 entries and against all 16 630 entries on the disc.

🔴 BLOCKED — three routes to those names, all closed

Followed up the next iteration. Every avenue the container can reach is now tried, each with a positive control in the same run:

1. A different hash family. The corpus knows three (idxd-tag-hash): name_hash (pak TOC), tag_hash (IDXD keys) and ixud_hash. Scoring all 5 977 harvested names × 6 prefixes:

archive name_hash tag_hash ixud_hash
GP_TITLE (control) 8 / 16 0 0
GP_PAUSE_MENU (control) 6 / 11 0 0
GP_MAIN_GAME_E2D 0 / 711 0 0
GP_READY_ROOM 6 / 1 106 0 0

tag_hash and ixud_hash explain nothing anywhere, including the paks name_hash does explain — so they are not the TOC function, and the two unnameable archives are not simply keyed by a different one.

2. The executable. sylpheed.db's strings table holds 7 140 rows, of which exactly two look like asset paths — Data\gmicon002_2.t32 and Data\gmicon006_2.t32, in a Data\ directory nothing else on the disc uses. Neither resolves in any archive. So the binary is not the name source either; it holds two strays and no table.

3. Name transformations of the config paths — 13 of them, all 0 (above).

🔴 This is where the container runs out. The 2D and GP_READY_ROOM TOC keys hash names that are on neither the disc nor the executable in readable form. The remaining lever is a dictionary attack using name_hash's shape — the top byte is the character-sum checksum, so candidates are cheap to reject — but that needs a plausible name corpus, and this disc does not contain one. Noted as blocked rather than improvised around.

⚠️ The port does not need these names: the sprites and bundles are readable by content (T8aD, RATC), and the config records already say which asset each HUD element uses. Only the archive-key ↔ name mapping is missing.

🟡 Not settled

  • What names the 2D and GP_READY_ROOM TOCs actually hash. The one lever left is the hash's own shape — the top byte is the character-sum checksum, so any candidate is cheap to reject — but that needs a name corpus this disc does not contain.
  • Why DefTables (8.9 %) and GP_HANGAR_ARSENAL (22.6 %) sit in the middle; probably just that most of their entries are tables referenced by records this harvest does not treat as filenames. Not chased.