Session Prompt — WP-008 — 2026-06-03
Paste this as the first message to the executing Claude Code session. The session opens execution for WP-008 against Showdown’s cached
object.iniandScooby.eng.
Header
- WP:
WP-008 - Title:
object.ini+Scooby.englogical asset catalog - Session date:
2026-06-03 - Paired pre-flight: pre-flight-WP-008-2026-06-03 — verdict
READY, signed against commitb279351 - Targets generation(s): Gen 1 (Showdown) primary; Phantom (Gen 1) stretch only — local-only outputs, no Phantom Findings beyond the byte-identical
Scooby.engobservation already recorded in the pre-flight - Targets disc(s): Showdown — operating against cached files at
tools/exes/showdown/object.iniandtools/exes/showdown/Scooby.eng. No ISO re-mount needed.
Intent
Produce a logical asset catalog — tools/parse_ini.py + tools/parse_eng.py + the combined tools/samples/asset-catalog.json — that maps room IDs → objects → asset references for Showdown, and answer the load-bearing question: is the engine name-driven (string references resolved through the WP-003 name table) or index-driven (numeric references that hit TGIFILE.ART entries directly)? Land a Findings subsection under docs/formats/scooby-exe.md titled “object.ini interpreter behavior” that records the answer with concrete cross-check numbers per WP-008 Exit criterion #6.
This unblocks WP-002 (decoder verification — “entry N is the asset referenced by section X”) and gives WP-009 a canonical room-ID list for screenshot naming.
Explicitly NOT in scope for this session: any Ghidra work, any TGIFILE.ART payload decoding (WP-002), any name → TGIFILE.ART entry index mapping (that comes from WP-001/WP-002 once the exe’s lookup mechanism is known — see WP-008 §Out of scope), any Gen 2/3 work (Jinx Mummy.mms, Case File #1 Museum.MMS — different format, different WP), any Phantom Findings beyond the byte-identical Scooby.eng cross-Gen-1 note. Phantom parser runs are permitted as a stretch but outputs stay local-only — no phantom-asset-catalog.json committed.
Authority chain (read order)
Read these files top-to-bottom before doing any work:
C:\Users\jjensen\.claude\CLAUDE.md— operator preferences (tone, ownership, even-handedness, commercial defaults)- docs/01-VISION — engine-lineage finding, generation discipline
- docs/reference/wp-lifecycle — Phase 3 execution discipline + commit hygiene + the §End-to-end operator workflow steps 8–13 + the new “regenerable diagnostic outputs stay local” bullet
- Paired pre-flight artifact: pre-flight-WP-008-2026-06-03 — Source binary identity table + scope lock + risk review + the cross-Gen-1
Scooby.engfinding - WP body: WP-008-object-ini-catalog — §Goal (truth-test framing), §Output schema (v1), §Failure handling, §Exit criteria, §Notes (deterministic naming rule)
- EC body: EC-004-object-ini-catalog — six time-boxed steps; Step 1 contains the parser-mode-lock gate that governs the rest
- Format doc to update: docs/formats/scooby-exe — current state; the new “
object.iniinterpreter behavior” Findings subsection lands here, NOT intgifile-art.md - WP-003 baseline (read-only input): tgifile-art.md §Pre-payload region — name-table schema; regeneration recipe for
tools/samples/wp003-name-table.txt - Cross-check input:
tools/exes/showdown/strings-ansi.txt(gitignored, locally accessible) — WP-007 strings dump, used for Scooby.eng spot-checks per EC-004 Step 4 - Cache reference: tools/exes/README §Showdown — SHA-256 ledger; the two new Showdown SHAs (
object.ini,Scooby.eng) recorded in the pre-flight are propagated into this README in the close commit
Pre-execution checks
Confirm each before touching files:
git status --shortreturns empty- HEAD on
mainat or after commitb279351(“docs: tighten WP-008 spec — parser mode gate, schema, cross-check metric”) - Paired pre-flight artifact
pre-flight-WP-008-2026-06-03.mdis onmainwith verdictREADY - Source binary SHA-256s match the Binary identity table in the pre-flight:
Get-FileHash tools\exes\showdown\object.ini -Algorithm SHA256→027928BB0219B9EADFEC1E066278D9BD3521B48B3E2D420DD7FEA69558A41C49Get-FileHash tools\exes\showdown\Scooby.eng -Algorithm SHA256→EE9BE93A024FF9B7F5EA1C2445B711FB7C13CEF61A079A4609EDF1201CBAB19B
tools/samples/wp003-name-table.txtexists (regenerated fromTGIFILE.ARTper tgifile-art.md §Pre-payload region). If missing, regenerate locally before Step 5 of EC-004 — the cross-check metric (Exit criterion #6) is blocked without it.- Python 3 available (
py -3 --version— use thepy -3launcher, not barepython, per the WP-007 lessons-learned Inkscape-on-PATH note)
If any check fails: STOP. Surface the failure; do not write parser code against mismatched state.
Execution rules
Scope allowlist (verbatim from pre-flight §Scope lock):
tools/parse_ini.py
tools/parse_eng.py
docs/formats/scooby-exe.md
docs/execution-checklists/EC-004-object-ini-catalog.md
docs/reference/pre-flight-WP-008-2026-06-03.md
docs/sessions/session-WP-008-2026-06-03.md
docs/work-packets/WP-008-object-ini-catalog.md
docs/work-packets/WORK_INDEX.md
tools/exes/README.md (Showdown §Additional cached text files — propagate two SHAs; no other section)
Allowed but local-only (gitignored under tools/samples/* per the comment block widened in b279351):
tools/samples/asset-catalog.json
tools/samples/unmatched-assets.txt
tools/samples/wp003-name-table.txt (regenerated input from WP-003; may already exist locally)
tools/samples/phantom-asset-catalog.json (conditional — only if Phantom stretch is exercised; never staged)
Forbidden:
- Game data binaries committed to git —
.gitignoreis the safety net; do not bypass. Note.iniis not a blanket-ignored extension; verify staged paths withgit diff --cached --name-onlybefore every commit. engines/scooby/**— out of scopedocs/formats/files other thanscooby-exe.md(no edits totgifile-art.md,mmfw-container.md,audio-archives.md)docs/execution-checklists/files other thanEC-004(no sprawl into EC-001/-002/-003/-005)- Committing any decoded
TGIFILE.ARToutput, palette dump, or audio extract — WP-001/-002/-004 territory - Adding a
logical asset name → TGIFILE.ART entry indexmapping. Recording evidence the mapping is 1:1 with the OBJ name table is in scope (Exit criterion #6); inventing per-index labels is out. - Running parsers against Gen 2/3 sources (
Mummy.mms,Museum.MMS) - Anything outside the allowlist above
Generation discipline (REQUIRED): every Finding subsection labels its source as #### Gen 1 (Showdown). The cross-Gen-1 Scooby.eng byte-identical observation may be stated as spanning Showdown+Phantom because it’s a SHA-level fact already in the pre-flight — but any interpreter-behavior claim stays Gen-1 (Showdown)-scoped.
Copyright posture: the catalog JSON contains verbatim asset-name strings and resolved Scooby.eng text extracted from copyrighted game data — keep it local-only per the §Allowed but local-only block above. Findings prose in scooby-exe.md cites counts, patterns, and structure (room count, section structure, match rate, mode selection) — never verbatim asset-string dumps. Parser scripts themselves are factual (parse a file format) and commit safely.
Commit conventions:
docs:prefix; imperative subject under ~80 chars- Two-commit topology (per wp-lifecycle §Two-commit topology):
- Commit A:
docs: WP-008 — object.ini + Scooby.eng asset catalog parsers + Findings - Commit B:
docs: close WP-008 — flip to ✅ Done
- Commit A:
- Body explains the why in 1–4 sentences
- Co-Author footer:
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Top risks (imperative form from pre-flight §Risk review):
- You MUST complete EC-004 Step 1 before opening
tools/parse_ini.pyin an editor. Record the selected parser mode (MODE_A/B/C/D) and the one-sentence justification in the EC checkbox slots, then commit the EC update or paste the mode into the first line of the scooby-exe.md Findings draft. Writing parser code before recording the mode is a process violation — the gate is non-reopenable because reopening means a rewrite, not a patch. - You MUST emit JSON that conforms to WP-008 §Output schema (v1) literally: top-level keys
rooms/objects/cursors/inventory, the room/object entry shapes specified,extra_fieldsfor unknown keys. A schema diff is a downstream-contract break with WP-002 probe labeling; paste the top-level key list and one sample room entry into EC-004 Step 5 recording slots as proof. - You MUST enforce WP-008 §Failure handling literally: warn-and-continue for unknown sections, preserve-in-
extra_fieldsfor unknown keys, hard-fail on unparseable lines / duplicate IDs / malformed JSON. Ship at least one synthetic-input check per policy line — feed a duplicate ID, confirm non-zero exit; feed an unknown key, confirm it lands inextra_fields. Cite these checks in the Findings note. - You MUST record Exit criterion #6 as four concrete numbers (total / matched / unmatched / match rate %) in the EC-004 Step 5 recording slots and in the Findings note. A Findings note carrying any
__placeholder is a process violation; the close commit cannot stage. - You MUST keep claims about interpreter behavior scoped to
Gen 1 (Showdown). The byte-identicalScooby.engSHA finding may cite both Gen 1 titles; everything else stays Showdown-only. - You MUST verify
git diff --cached --name-onlyagainst the §Scope allowlist before every commit. The catalog JSON contains copyrighted-derivative content; a stray stage oftools/samples/asset-catalog.jsonis a copyright leak. Remediate withgit restore --staged, not by widening the allowlist.
Session task
Execute EC-004 in order, treating each step’s time-box as a soft budget and Step 1 as a hard gate. Land outputs per WP-008 §Exit criteria.
-
EC-004 Step 1 — Manual structure survey + parser-mode lock (gate). Open
tools/exes/showdown/object.iniin a text editor. Walk the EC-004 §Manual structure survey checkbox list (section headers, key-value separator, section types, asset-reference format). End with the parser mode lock: record selected mode (MODE_A/B/C/D) and one-sentence justification. Outcome: parser design is decided before any code is written. -
EC-004 Step 2 — Parse rooms. Create
tools/parse_ini.pyimplementing room sections only first (ID, display name, exit map, list of objects). Run it on Showdown’sobject.ini. Verify room count matches manual count of section headers. Print 3-room excerpt; confirm structure. Fix parse errors before proceeding. -
EC-004 Step 3 — Extend to all entity types. Add object sections (graphic refs, sound refs, cursor flag), cursor definitions, inventory items. Run full parse; zero parse errors. Spot-check one familiar room’s JSON entry. Enforce the v1 schema and the failure-handling policy from WP-008 §Scope — synthetic-input checks for duplicate IDs and unknown keys ship with the script.
-
EC-004 Step 4 — Parse
Scooby.engstring table. Opentools/exes/showdown/Scooby.engin a hex viewer first. Record delimiter pattern / message-ID type / text encoding in the EC slots — do NOT infer them from the parser working. Createtools/parse_eng.py. Parse to{message_id: text}JSON. Spot-check 5 IDs againsttools/exes/showdown/strings-ansi.txt. -
EC-004 Step 5 — Cross-reference + write combined output + name-table cross-check metric. Walk the
object.inicatalog; resolve any message-ID-shaped value via theScooby.engtable. Writetools/samples/asset-catalog.json(local-only). Validate withpython -m json.tool. Then run the name-table cross-check againsttools/samples/wp003-name-table.txt: record total / matched / unmatched / rate %; export the unmatched list totools/samples/unmatched-assets.txt(local-only); note whether ≥95 % match rate (engine is name-driven) or below (record as a new unknown for WP-001). - EC-004 Step 6 — Findings note in scooby-exe.md. Add a subsection titled “
object.iniinterpreter behavior” under §Findings. Must answer (and concretely cite the SHAs):- Source binary identity: Showdown
object.iniSHA027928BB0219B9EADFEC1E066278D9BD3521B48B3E2D420DD7FEA69558A41C49(25,196 bytes); ShowdownScooby.engSHAEE9BE93A024FF9B7F5EA1C2445B711FB7C13CEF61A079A4609EDF1201CBAB19B(2,823 bytes — byte-identical to Phantom’sSCOOBY.ENG, cross-Gen-1 finding recorded in the pre-flight) - Section structure: confirmed room/object/cursor/inventory divisions (and any unexpected sections found)
- Asset reference format / parser mode selected: MODE_A/B/C/D + justification
- Room count + object count + cursor count + inventory count (concrete integers)
- Cross-check metric: total / matched / unmatched / match rate %; interpretation (name-driven vs index-driven vs encoded)
- Failure handling synthetic-input checks confirmed (duplicate-ID, unknown-key, malformed-line)
- Data-driven vs implicit: brief estimate of how much game logic is in
object.inivs. presumed-binary
- Source binary identity: Showdown
-
Propagate the two new Showdown SHAs into tools/exes/README §Showdown. The pre-flight noted these are recorded for the first time. Add them under the “Additional cached text files” bullet so future readers find them in the cache ledger, not just in this pre-flight.
-
Commit Commit A (
docs: WP-008 — object.ini + Scooby.eng asset catalog parsers + Findings). - Update WORK_INDEX — flip WP-008’s Status to ✅ Done (date 2026-06-03), actual effort recorded. Annotate downstream rows: WP-002 first-decode-strategy gets a name-driven-vs-index-driven note; WP-009 gets a “canonical room-ID list now available” note; §Current state pointer updates to next unblocked WP (likely WP-009 or WP-010). Commit as Commit B (
docs: close WP-008 — flip to ✅ Done).
Outputs this session MUST produce:
tools/parse_ini.py+tools/parse_eng.py(committed)- Updated
docs/formats/scooby-exe.mdwith a new “object.iniinterpreter behavior” Findings subsection answering all bullets in step 6 above, two source-binary SHAs cited - Updated
docs/work-packets/WORK_INDEX.mdwith WP-008 row at ✅ Done + downstream annotations + §Current state pointer - Updated
docs/work-packets/WP-008-object-ini-catalog.mdbody with Status → ✅ Done, actual effort recorded, Findings-landed link - Updated
docs/execution-checklists/EC-004-object-ini-catalog.mdwith every checkbox slot filled (parser mode + justification, Scooby.eng delimiter/ID/encoding fields, four cross-check numbers, entry counts) — no__placeholders left behind - Updated
tools/exes/README.md§Showdown with the two new SHAs propagated - Updated
docs/reference/pre-flight-WP-008-2026-06-03.md§Lessons learned (one line or “No lessons learned”) - Local-only (gitignored):
tools/samples/asset-catalog.json,tools/samples/unmatched-assets.txt
Outputs this session MUST NOT produce (sprawl guard — log as follow-up candidates instead):
- Ghidra annotations or
.gprwork (WP-001) TGIFILE.ARTdecoding or anyname → entry indexmapping (WP-002)- Gen 2/3 parser runs (
Mummy.mms,Museum.MMS) — different format, future WP - Phantom-side Findings beyond the byte-identical
Scooby.engSHA observation already in the pre-flight. Running the parser on Phantom’sOBJECT.INIis permitted as a curiosity check, but outputs stay local-only and no Phantom Findings table is added toscooby-exe.mdthis WP. - Format-doc updates outside
scooby-exe.md— even if a finding touchestgifile-art.md’s name-table section, leave that for a follow-up - Edits to EC-001 / EC-002 / EC-003 / EC-005
mmfw-container.mdupdates — the Gen 2/3 analogues (Mummy.mms≈Scooby.eng, packed scripts inside MMFW) are speculation territory until parsed
Close ritual
When all WP-008 §Exit criteria (six of them) are satisfied:
- Confirm outputs landed. Every file in the §Scope allowlist has the expected change. The Findings subsection in
scooby-exe.mdanswers all bullets in §Session task step 6 with concrete numbers; the SHAs are cited; the parser mode + cross-check metric are both recorded. - Confirm raw extracts gitignored.
git diff --cached --name-onlyshows zerotools/samples/**content files and zerotools/exes/**content files. - Verify the two-commit topology is on
main. Commit A = parsers + Findings + EC fill-in + README SHA propagation; Commit B = WORK_INDEX flip + downstream annotations. - Propagate to dependent WPs. Note in WORK_INDEX §Current state that WP-008 baseline is landed; update WP-002’s first-decode-strategy note if the cross-check confirmed name-driven; update WP-009’s row to reflect that canonical room IDs are now available.
- Update the lessons-learned section of the pre-flight artifact — either “No lessons learned” or one line on any preventable gap pre-flight should have caught (parser-mode-lock effectiveness, schema-drift surface, cross-check-metric recording discipline).
- Push to
origin/main(per wp-lifecycle triage off-ramp fix — direct-to-main commits needgit push origin mainfor GitHub Pages to rebuild). - Report back to operator. State: outputs landed, six exit criteria satisfied, status flipped, pushed. Lead the report with the single most load-bearing answer: is the engine name-driven or index-driven? Surface anomalies as follow-up WP candidates.
If any §Exit criterion is NOT met: WP-008 stays 🚧 In Progress. Do NOT flip WORK_INDEX. Document what’s open in WP §Notes and report back honestly.