diff --git a/.github/workflows/docs-consistency.yml b/.github/workflows/docs-consistency.yml
index 84e8574818..07f1b67547 100644
--- a/.github/workflows/docs-consistency.yml
+++ b/.github/workflows/docs-consistency.yml
@@ -23,5 +23,5 @@ jobs:
run: python tools/docs_reorg.py --check-links --check-findings --check-root
- name: Pure-Python pipeline tests
run: |
- python -m pip install pytest
+ python -m pip install pytest numpy Pillow lupa
python -m pytest tools/decomp_pipeline/tests tools/script_recovery -q -k "not vc71 and not retail"
diff --git a/.gitignore b/.gitignore
index e1dfb70fef..9473645779 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,9 @@
imgui.ini
*.user
*.suo
+.junie/
+/.claude/worktrees/
+/.agents/CLEANUP_COORDINATION.md
# Proprietary/local binary inputs and analysis databases
/debug_build/
@@ -14,6 +17,10 @@ imgui.ini
/work/
/dist/
/tmp/
+/build/
+/.scratch_tmp/
+/scratchpad/
+/runtime_dumps/
/snapshots/
/FSE/
/FableTLC_RE_docs.zip
@@ -87,4 +94,9 @@ imgui.ini
/CON
/imgui.ini
/out_dat.txt
+/tmp_*
+/work_*.txt
+/*_native.txt
+/*.log
+/0x*
/[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]*
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 96c98fb475..e0da178b19 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -57,3 +57,9 @@ comparison. Root-level scratch (`*.obj`, `*.bin`) is ignored; keep working files
Open an issue with the function address, the verifier output, and the compiler flags used.
For readability complaints about landed code, name the file; a retype pass exists exactly for that.
+
+## Working alongside other sessions
+
+See [project layout and workspace care](docs/PROJECT_LAYOUT.md) for source and
+local-output locations, exact path ownership, and isolated publication. Preserve
+active builds and evidence even when ignored by Git.
diff --git a/README.md b/README.md
index ac565e298a..cc2c597e42 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@ An evidence-gated reconstruction of the native 32-bit Windows
`Fable.exe`, targeting readable, buildable C/C++ source and a durable native
modding platform.
-> **Actively developed — October 10, 2026.** Native C/C++ reconstruction is
+> **Actively developed — October 24, 2026.** Native C/C++ reconstruction is
> continuing. Recent local tests render a retail title sprite through recovered
> drawing routines and validate connected texture-loading and lifetime paths.
> The existing interactive frontend is an authored integration checkpoint,
@@ -14,7 +14,8 @@ modding platform.
[Run the checkpoint](#run-the-checkpoint) ·
[See current progress](#current-progress) ·
[Read the roadmap](#roadmap) ·
-[Browse the documentation](#documentation)
+[Browse the documentation](#documentation) ·
+[Project layout and workspace care](docs/PROJECT_LAYOUT.md)
## Contents
diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md
index 81f1bb3735..977e625f3d 100644
--- a/docs/HANDOFF.md
+++ b/docs/HANDOFF.md
@@ -1,49 +1,35 @@
-# Public handoff — updated 2026-10-10
-
-## Current public checkpoint
-
-Native recreation is active. Read [NATIVE_STATUS.md](NATIVE_STATUS.md) for the
-October 10 local verification results, current boundaries and publication scope.
-This update publishes status only; the newer local source/test checkpoint is
-not merged into `main`. The generated dashboard remains the September snapshot.
-The published frontend is authored integration, not a playable native engine.
-
-The resume instructions below are historical September notes. Their branch,
-head, clean-tree and `main` equality claims are not current instructions.
-Do not blindly merge the development branch: unrelated Lua work must stay out
-of a native-only publishing checkpoint.
-
-## Historical September 7 handoff
-
-## State
-- Branch: `feat/script-recovery-marathon` (head `2e038aa`, clean tree, `main` == this head); `main` was fast-forwarded (519 commits) and pushed to `BuffJesus/FableDecomp` on 2026-09-07 — fast-forward it again after each checkpoint. Note: `git add` on this tree takes 1–6 minutes and HANGS if another process is writing under `rebuild/` (or a reserved-name file like `CON` exists); never run it concurrently with the header generator or retype.
-- 22 old agent branches are now `archive/*` tags. Root scratch + `CON` removed. `LICENSE`, `CONTRIBUTING.md`, CI `docs-consistency` added.
-- Coverage (2026-08-28 dashboard): 8,082 byte-identical (16.3%), 18,579 functional-or-matching (37.5%) of 49,568; catalog is now 18,631 landed. Regenerate `rebuild/COVERAGE.md` before quoting numbers.
-
-## Open these five first
-1. `docs/ROADMAP.md` — what is done / in flight / next (the only task list)
-2. `docs/ARCHITECTURE.md` — the three source layers (lift intake / parity `rebuild/src/compiled` / modern)
-3. `docs/BUILDING.md` — Ghidra, VC7.1, GhidraMCP, FSE tooling commands
-4. `CONTRIBUTING.md` — landing rules, header contract, purity policy
-5. `rebuild/COVERAGE.md` — the numbers
-
-## Active lanes and their resume commands
-- Typed headers: `python tools/decomp_pipeline/gen_class_headers.py --all-trusted` (add `--compile-check`), then `python tools/decomp_pipeline/retype_landed.py --class CGameScriptInterface` (dry run; `--apply` only rewrites files that stay byte-exact). Log: `rebuild/backlog/retype_log.tsv`; headers: `rebuild/include/engine/` (`INDEX.tsv`, `RECONCILE.tsv`, `_quarantine/`).
-- Parity crawl: resume from `work/crawl_batch155` — `next_smallest.py` -> `trim_overcapture.py` -> `trim_tailjmp.py` -> author -> `verify_and_land.py`; iterate a DIFFER with `work/crawl_batch154/probe.py`. Ledger `tools/decomp_pipeline/crawl/gen_tried.txt`.
-- De-bake: `python tools/decomp_pipeline/crawl/bake_families.py` for the live family table; `debake_family.py --apply`.
-- Script recovery: `python -m unittest discover -s tools/script_recovery -p 'test_*.py'`; `python tools/script_recovery/verify_foundation.py`; readiness needs `--vtable-slots`, `--interface-catalog`, `--fse-address-map`. Ingest Aeon's 2026-09-06 LUAGameflow batch into `work/aeon_lua_ports/`.
-- ForgeFSE: canonical fork is `D:\Code\ForgeFSE-retail-shadow`, branch `feat/upstream-fse-2026-09-02` (`3f417ee`), untested in-game. `D:\Code\ForgeFSE` is stale.
-- Docs hygiene: `python tools/docs_reorg.py --check-links --check-findings --check-root` and `python tools/update_readme_progress.py --check` (both run in CI).
-- Build/visual QA: `rebuild/build_bootstrap.ps1 -RetailFrontendBank `; recipe in `docs/pipeline/VISUAL_PARITY_STATUS.md`. Retail Fable.exe must be CLOSED (single-instance mutex fails the WinMain fixture).
-
-## Where notes go
-- This file stays one page. The long-running journal is `docs/journal/HANDOFF_ARCHIVE.md` (12k lines, append-only history).
-- New session notes: `docs/journal/YYYY-MM/_.md` (e.g. `docs/journal/2026-09/`). Cited technical truth: `docs/journal/FINDINGS_LOG.md`.
-- Solved gotchas get a one-liner in `CLAUDE.md`; roadmap status changes go in `docs/ROADMAP.md`.
-
-## Gotchas not yet in CLAUDE.md
-- A file named `CON` at the repo root hangs EVERY git command on Windows (reserved device name). Delete it with `del "\\?\D:\Documents\FableTLC\CON"` — normal `del`/Explorer cannot.
-- A killed `git add` leaves a stale `.git/index.lock`; remove it before retrying (check no git process is running first).
-- Sibling repos hold the moved modding docs: FableForge `D:\Code\FableForge\docs\from_fabletlc\` and ForgeFSE-retail-shadow `docs\from_fabletlc\`. `docs/modding/README.md` is the index; do not recreate those docs here.
-- `native_conversion_readiness.json` silently loses all interface resolution if regenerated without `--vtable-slots` and `--interface-catalog`.
-- Two ForgeFSE forks existed; only `ForgeFSE-retail-shadow` is canonical. Any binding port must land there.
+# Public handoff - October 24, 2026
+
+## Published checkpoint
+
+Native reconstruction and separate C++23/x64 modernization work are active.
+The public source remains an earlier reviewed checkpoint. Newer local source,
+fixtures, and evidence are not included in this documentation update.
+
+The published interactive frontend is an authored integration checkpoint.
+It does not establish a playable reconstructed native or modern engine.
+See [NATIVE_STATUS](NATIVE_STATUS.md) for dated results and their limits.
+The generated coverage dashboard retains its published snapshot; new bounded
+test counts have not been added to whole-executable coverage.
+
+## Start here
+
+1. [ROADMAP](ROADMAP.md): current priorities and publication gates.
+2. [PROJECT_LAYOUT](PROJECT_LAYOUT.md): source locations, local scratch, and parallel-work rules.
+3. [ARCHITECTURE](ARCHITECTURE.md): native parity and modernization boundaries.
+4. [BUILDING](BUILDING.md): toolchain and reproduction commands.
+5. [CONTRIBUTING](../CONTRIBUTING.md): landing and evidence requirements.
+
+The [documentation index](INDEX.md) covers reference topics and dated journals.
+
+## Resume safely
+
+Use the current owning session's local handoff when continuing an active lane.
+A public status page is not an instruction to restart another session's jobs.
+Coordinate path ownership before changing shared files; publish from an
+isolated checkout. Do not merge accumulated development work without reviewing
+its dependencies and separating unfinished or unrelated experiments.
+
+Historical September resume commands and clean-tree/branch claims are preserved
+in the [October 10 public handoff archive](journal/2026-10/2026-10-10-public-handoff.md).
+They are historical evidence, not current execution instructions.
diff --git a/docs/INDEX.md b/docs/INDEX.md
index 79d77f473b..efd2da7871 100644
--- a/docs/INDEX.md
+++ b/docs/INDEX.md
@@ -6,8 +6,10 @@ Generated by `tools/docs_reorg.py --index`; do not edit by hand.
- [ARCHITECTURE](ARCHITECTURE.md) — Source architecture and modernization
- [BUILDING](BUILDING.md) — Toolchain & exact commands
-- [HANDOFF](HANDOFF.md) — Resume here (one page) — updated 2026-09-07
-- [ROADMAP](ROADMAP.md) — FableTLC roadmap (single source of truth for "what's done / in flight / next")
+- [HANDOFF](HANDOFF.md) — Public handoff - October 24, 2026
+- [NATIVE_STATUS](NATIVE_STATUS.md) — Native development update - October 24, 2026
+- [PROJECT_LAYOUT](PROJECT_LAYOUT.md) — Project layout and workspace care
+- [ROADMAP](ROADMAP.md) — FableTLC roadmap
## Engine reverse engineering
@@ -169,5 +171,7 @@ Generated by `tools/docs_reorg.py --index`; do not edit by hand.
- [BACKLOG_pre-roadmap](journal/2026-09/BACKLOG_pre-roadmap.md) — FableTLC RE / decomp / modding BACKLOG (prioritized)
- [PLAN_pre-roadmap](journal/2026-09/PLAN_pre-roadmap.md) — Fable: The Lost Chapters — Decompilation Plan
- [SESSION_HANDOFF_2026-09-01_SCRIPT_RECOVERY](journal/2026-09/SESSION_HANDOFF_2026-09-01_SCRIPT_RECOVERY.md) — ForgeFSE retail-script recovery handoff — 2026-09-01
+- [2026-10-10-public-handoff](journal/2026-10/2026-10-10-public-handoff.md) — Public handoff — updated 2026-10-10
+- [2026-10-10-public-roadmap](journal/2026-10/2026-10-10-public-roadmap.md) — FableTLC roadmap (single source of truth for "what's done / in flight / next")
- [FINDINGS_LOG](journal/FINDINGS_LOG.md) — FINDINGS — cited technical truth
- [HANDOFF_ARCHIVE](journal/HANDOFF_ARCHIVE.md) — HANDOFF — resume here
diff --git a/docs/NATIVE_STATUS.md b/docs/NATIVE_STATUS.md
index 639c8ae55e..2b6db54a4e 100644
--- a/docs/NATIVE_STATUS.md
+++ b/docs/NATIVE_STATUS.md
@@ -1,4 +1,32 @@
-# Native development update — October 10, 2026
+# Native development update - October 24, 2026
+
+Native reconstruction continues locally. The concrete text-bank composition
+checkpoint passed 108 bounded processes covering text, group, and narrator
+metadata, with 18 native fault controls. These are composition-test results,
+not an increase in whole-executable coverage. Decoded payloads and nonempty
+resource ownership remain under investigation; no full `gate_all` run or
+playable engine is claimed.
+
+Separate C++23/x64 subsystem libraries and offline replay tests also exist
+locally. This does not certify a playable modern engine or a complete headless
+gameplay session. Scheduling and ownership joins continue through their own
+qualification and promotion gates.
+
+This publication updates organization and status only. Newer native and modern
+source, fixtures, generated reports, local receipts, and retail-derived inputs
+remain outside this change pending dependency-complete review. The published
+coverage dashboard keeps its existing snapshot.
+
+See [the handoff](HANDOFF.md), [current priorities](ROADMAP.md), and
+[workspace organization](PROJECT_LAYOUT.md) for navigation and safe continuation.
+
+## Historical October 10 checkpoint
+
+The following results and unresolved boundaries describe October 10. Later
+bounded composition work above does not establish that all of these earlier
+boundaries have been closed.
+
+### Native development update — October 10, 2026
The project is active. Work has continued locally on faithful native PC
C/C++ reconstruction, rather than Lua recovery. The gap in public commits
diff --git a/docs/PROJECT_LAYOUT.md b/docs/PROJECT_LAYOUT.md
new file mode 100644
index 0000000000..a3f5f536f3
--- /dev/null
+++ b/docs/PROJECT_LAYOUT.md
@@ -0,0 +1,66 @@
+# Project layout and workspace care
+
+Start with [HANDOFF](HANDOFF.md) for the public checkpoint, [ROADMAP](ROADMAP.md)
+for current priorities, and [INDEX](INDEX.md) for the full documentation catalog.
+
+## Source and evidence locations
+
+| Location | Purpose |
+|---|---|
+| `rebuild/src/compiled/` | Curated VC7.1 reconstruction, organized by native address |
+| `rebuild/include/` | Shared engine layouts and subsystem declarations |
+| `rebuild/tests/` | Behavior fixtures and integration tests |
+| `rebuild/modern/` | Separate C++23/x64 subsystem work |
+| `tools/decomp_pipeline/` | Native reconstruction and verification tools |
+| `tools/modern/` | Modernization preparation and validation tools |
+| `tools/script_recovery/` | Lua recovery tools and tests |
+| `docs/engine/`, `docs/formats/`, `docs/pipeline/`, `docs/scripts/`, `docs/modern/` | Reference documentation by topic |
+| `docs/journal/YYYY-MM/` | Dated results, failed attempts, and historical checkpoints |
+| `refs/`, `ghidra_out/`, `lift/` | Curated analysis inputs, exports, and intake records |
+| `work/`, `build/`, `rebuild/build/` | Local scratch, builds, and evidence; retained locally |
+| `scratchpad/`, `runtime_dumps/`, `.scratch_tmp/` | Local captures and temporary experiments |
+
+New experiments belong under `work///`. Keep native source at its
+existing address-based path until dependency and parity checks justify a move.
+Keep related receipts beside the experiment; a failed attempt can still explain
+a current restriction. Ignoring a file does not make it safe to delete.
+
+## Parallel work
+
+Before cleanup, identify active sessions and registered worktrees with
+`git worktree list` and coordinate exact path ownership with their owners.
+Record local ownership in `.agents/CLEANUP_COORDINATION.md` when using that
+workspace convention. Keep local session identifiers out of public documents.
+
+Use an isolated checkout for public updates. Do not switch, stash, reset, stage,
+or commit the shared checkout while another session is writing there. Build
+outputs, source snapshots, failed attempts, and prior evidence may be live test
+dependencies even when old. Relocation, deletion, or compression needs an exact
+reviewed scope and a coordinated timing window.
+
+The local maintenance catalog and its saved project shortcuts provide navigation
+without relocating projects. Saved inventory dates describe past observations;
+they do not establish that a folder is currently unused.
+
+## Public updates
+
+Publish an explicit file list from a clean checkout and inspect the staged diff.
+Do not merge a development branch solely to make the public activity look
+current. A status update can describe qualified local work while source remains
+under review; state that distinction in [NATIVE_STATUS](NATIVE_STATUS.md).
+
+Never publish retail binaries, proprietary symbols, game assets, decoded
+payloads, local captures, or raw byte-oracle evidence. Keep user-supplied inputs
+and their generated products local. See [CONTRIBUTING](../CONTRIBUTING.md).
+
+Before publication, run:
+
+```powershell
+python tools/docs_reorg.py --index
+python tools/docs_reorg.py --check-links --check-findings --check-root
+python tools/update_readme_progress.py --check
+git diff --check
+```
+
+Regenerate coverage only from a settled, reviewed reconstruction checkpoint.
+Composition-test counts and CTest totals are not whole-executable coverage.
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
index 2db3d2e319..3236b274b4 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -1,145 +1,33 @@
-# FableTLC roadmap (single source of truth for "what's done / in flight / next")
+# FableTLC roadmap
-## Current native focus — October 10, 2026
+Current priorities as of October 24, 2026. This is the public task list;
+active owners maintain detailed local continuation notes.
-- [x] Publish a dated native activity update and clarify authored frontend versus recovered engine behavior — [NATIVE_STATUS.md](NATIVE_STATUS.md).
-- [x] Local real-GPU verification draws a retail title sprite; this is not full native frontend boot or gameplay.
-- [ ] Publish dependency-complete reviewed native source/test checkpoints; newer implementations remain local.
-- [ ] Recover remaining native bank-loading/resource-lifetime dependencies, preserving two-attempt deferrals.
-- [ ] Extend verified rendering toward a persistent native visual launch and later world/gameplay initialization.
-- [ ] Reconcile generated whole-project metrics before updating coverage percentages.
+## Repository organization
-## Historical September roadmap
+- [x] Keep current public handoff and priorities separate from historical resume instructions.
+- [x] Document source, test, reference, scratch, and evidence locations in [PROJECT_LAYOUT](PROJECT_LAYOUT.md).
+- [x] Exclude local build products, captures, and root scratch from routine Git staging.
+- [x] Publish a dated status update without merging active unreviewed source.
-The checklist below records the older published checkpoint, not the current
-native-only work queue. In particular, its broad branch-merge and Lua tasks
-are not instructions for the current native publication.
+## Native reconstruction
-Updated 2026-09-07. Checklists only. `[x]` = done with evidence, `[ ]` = open, "(verify)" = status
-unconfirmed. Numbers come from `rebuild/COVERAGE.md` (dashboard generated 2026-08-28). Resume
-instructions live in `docs/HANDOFF.md`; long history in `docs/journal/HANDOFF_ARCHIVE.md`.
-Superseded inputs: `docs/journal/2026-09/{PLAN_pre-roadmap,BACKLOG_pre-roadmap,ACTIVE_TASK_LIST}.md`.
+- [x] Qualify bounded local concrete text-bank metadata composition, including text, group, and narrator variants; see [NATIVE_STATUS](NATIVE_STATUS.md).
+- [ ] Complete decoded payload and nonempty resource ownership recovery and its original-code controls.
+- [ ] Review and publish dependency-complete native source/test checkpoints.
+- [ ] Extend connected loading and rendering toward native world/gameplay initialization.
+- [ ] Reconcile canonical reports before refreshing whole-executable coverage.
-## Current focus (2026-09)
+## C++23/x64 modernization
-- [ ] Typed shared headers: 2026-09-07 `--all-trusted --compile-check` = 957 compiling headers (257 quarantined); automatic passes plus the parity-gated manual tail have retyped 651 landed TUs onto PDB-named headers (162 manual conversions across thirty-three checkpoints). `VTABLE_TYPED` (37→0), `VIRTUAL_THIS` (54→0), non-source-failure `PARITY_CHANGED` (7→0), `BEHAV_FAIL` (8→0), source-failure `PARITY_CHANGED` (43→0), and `AMBIG_ALIGN` (10→0) are closed. The final source-failure pass recovered eleven byte-parity-preserving interface, creature-action, layout-access, and state-wrapper functions; the ambiguous-alignment review recovered four and reclassified six — `tools/decomp_pipeline/`
-- [x] 2026-09-07 Aeon's 12 new Lua ports ingested (20 packages, 71 scripts; foundation audit 15/18) — `docs/scripts/AEON_LUA_PORTS.md`
-- [ ] Port the 12 FSE 6.9.26 bindings LUAGameflow needs into ForgeFSE-retail-shadow; add package→native-name aliases so the new seeds correlate (8/20 today) — `docs/scripts/AEON_LUA_PORTS.md`
-- [ ] Keep the parity crawl moving from `work/crawl_batch155` (ledger 5,693; catalog 18,631 landed) — `docs/pipeline/FULL_DECOMP.md`
-- [ ] Live-test ForgeFSE-retail-shadow branch `feat/upstream-fse-2026-09-02` (commit `3f417ee`) in-game: CreateThread script + region unload — user-driven, needs Fable open
-- [ ] Merge `feat/script-recovery-marathon` into `main` once CI (`docs-consistency`) is green on the branch
+- [x] Establish bounded subsystem libraries and offline replay validation locally.
+- [ ] Qualify additional scheduling and ownership joins before production promotion.
+- [ ] Publish reviewed source with its complete build and test dependencies.
+- [ ] Connect a complete engine runtime; no playable modern engine is certified.
-## (a) Repo health & public presentation — `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`
+Lua recovery is a separate lane. This cleanup does not resume it or publish its
+accumulated work. Editor work remains in its own repository and checkout.
-- [x] 2026-09-07 `main` fast-forwarded to include 519 commits and pushed to `BuffJesus/FableDecomp`
-- [x] 2026-09-07 22 agent branches archived as `archive/*` tags (24 tags total)
-- [x] 2026-09-07 root scratch files + the `CON` file removed; `LICENSE`, `CONTRIBUTING.md`, CI (`docs-consistency`) added
-- [x] 2026-09-07 docs restructured into `ARCHITECTURE.md`, `BUILDING.md`, `engine/`, `formats/`, `pipeline/`, `scripts/`, `journal/`, `modding/`
-- [x] 2026-09-07 `docs/ROADMAP.md` + one-page `docs/HANDOFF.md` written (this file)
-- [x] 2026-09-07 `docs_reorg.py --check-links --check-root` clean; `update_readme_progress.py --check` clean; both run in CI (`.github/workflows/docs-consistency.yml`)
-- [x] 2026-09-07 `rebuild/COVERAGE.md` regenerated with genuine-C++ / asm-bake / readability rows; README rows generated from it
-- [x] 2026-09-07 all 56 FINDINGS_LOG entries re-homed into reference docs (Verified facts sections; new `engine/CUTSCENES.md`); `--check-findings` now runs in CI
-- [x] 2026-09-07 doc families merged: `formats/SAVE.md` (8→1), `formats/BIG.md` (3→1), `formats/MESH.md` (4→1), `engine/QUEST_CARDS.md` (5→1), `engine/NAVIGATION.md` (2→1); sources left as 3-line stubs
-- [x] 2026-09-07 remaining families merged: `formats/{ANIM,TEXTURE,TEXT,AUDIO,DEFS}.md`, `engine/{HERO_APPEARANCE,INPUT,GAME_ENTRY_PATHS,QUEST_SCRIPTS}.md` (sources are 3-line stubs; INDEX lists both)
-- [ ] Turn `rebuild/build_candidates.ps1` (130k lines of PowerShell objects) into a TSV + small driver
-- [ ] Prune superseded intake drafts: 600/1,066 `rebuild/candidates/snapshots` and 604/1,079 `lift/reports/*/code` files have a landed reconstruction at their address (counted 2026-09-07). Needs the manifest/status generators to stop counting them first (`agent_candidates`, `agent_source_path`)
-- [x] 2026-09-07 FQT + Fable-2 scene-import one-offs (21 scripts) moved to `tools/archive/` with a README
-- [x] 2026-09-07 hidden scheduled tasks documented in `docs/BUILDING.md` (Background automation) with the disable command
-
-## (b) Symbols & types — `docs/pipeline/SYMBOLS.md`, `docs/pipeline/NAMING_STRAGGLERS.md`
-
-- [x] Ghidra 12.1 import + RTTI pass; PDB two-binary symbol port (FableWin.pdb / Ego_r.pdb donors)
-- [x] BSim names applied; RTTI vtable-slot force port (`ghidra_out/labels_rtti_port.tsv`)
-- [x] 100% mechanically named (49,568/49,568); 99.2% accepted naming quality; 40 names in review tail
-- [x] FSE manifest corrected to 933 functions and propagated to FableForge
-- [x] FSE address map (`refs/script_recovery/fse_address_name_map.json`, 80 addrs, 63 manifest clashes) wired into readiness analyzer
-- [x] 2026-09-07 typed shared headers `rebuild/include/engine/`: 957 compiling headers from the PDB layouts, per-header compile check, quarantine on donor/retail conflict
-- [x] 2026-09-07 automatic and manual parity-gated retyping applied to 638 landed TUs; `VTABLE_TYPED`, `VIRTUAL_THIS`, non-source-failure `PARITY_CHANGED`, and `BEHAV_FAIL` tails closed (see Current focus for the active source-failure parity lane)
-- [ ] Bulk `.gdt` import of donor struct layouts into the Ghidra DB (open)
-- [ ] Calling convention known 77.7% -> close the 11,031 unknown-CC functions
-- [ ] Complete prototypes 69.2% -> close the 15,280 incomplete ones
-- [ ] Apply the 63 FSE-vs-BSim name clashes as manifest corrections (FSE ASLR address wins in `0x00CBxxxx`)
-
-## (c) Byte-parity reconstruction — `docs/pipeline/FULL_DECOMP.md`, `docs/pipeline/DEBAKE_WORKLIST.md`
-
-- [x] VC7.1 RTM 13.10.3077 harness; `verify_and_land.py` oracle->author->verify->land loop
-- [x] Byte-identical 8,082 (16.3%); functional-or-matching 18,579 (37.5%) as of 2026-08-28
-- [x] Manifest gap recovery: 7,529 xref-confirmed starts merged (functions.tsv 49,568 -> 57,097) — `docs/pipeline/MANIFEST_GAP_RECOVERY.md`
-- [x] Over-capture trimming (`trim_overcapture.py`, `trim_tailjmp.py`) repo-wide
-- [x] Jump-table lander `verify_land_jumptable.py` (raw-COFF extraction) proven on 0x557CA0 / 0x5578A0
-- [x] Skeleton clone harvester + de-bake family tooling (`debake_family.py`, `harvest_all`, `crossfam`, `shape_author`)
-- [x] Parity crawl batches 153 (8/8) and 154 (7/8) landed 2026-09-02; `probe.py` + `disasm.py` + `iat_lookup.py` helpers in `work/crawl_batch153-154`
-- [ ] De-bake: 614 `__declspec(naked)`/`__asm` + 218 `_emit` non-genuine sources remain — regenerate with `crawl/bake_families.py` (verify counts)
-- [ ] Mislabelled dtor families (`_Dest_val`/`_Cons_val` BSim labels on non-dtor bodies) re-attributed on landing; sweep the rest
-- [ ] `00995e70 PeekData` honest DIFFER(16v15) — attack load-through-lea, not the compare
-- [ ] `LinkToNeighbouringMaps 0x00A7A650` 9 bytes long; `CNavQuadTree::UpdateLines 0x00A781A0` fixture-first
-- [ ] GFMain `0x00402510` dependency closure; CRT `entry 0x00401067` parity (deferred until GFMain boundary useful)
-- [ ] Wave-3 review tails (CGSI wrappers with end-sentinel derefs, co-op spirit tail) rebuilt from bytes before promotion
-- [ ] 84 deferred over-captures worklist `rebuild/backlog/overcapture-recovery-worklist.tsv` (~11 recovered)
-- [ ] Lifted modules 3/3,433 -> next module-level link proof after OpenRetailBank ring (`LINK_WORKLIST.md`)
-
-## (d) Running frontend / renderer parity — `docs/pipeline/VISUAL_PARITY_STATUS.md`, `docs/engine/GAME_ENTRY_PATHS.md#continue-and-load-game-path`
-
-- [x] Stage-0/1 executable integration: VC7.1 links byte-identical fns into an owned Win32 process; `WinMain 0x403480` promoted
-- [x] `FableTLC-Reconstruction-VisualCheckpoint.exe` renders the D3D9 frontend headlessly (synth-click + screenshot QA recipe)
-- [x] Profile-name font doubling fixed 2026-08-10 (half-texel UV inset in `AppendProfileNameText`)
-- [x] Save-enumeration seam opened 2026-08-10; 6 display-name-tier fns landed; find-loop blocker solved 2026-08-16
-- [x] `CGame::Play 0x412f90` landed byte-exact; `CMainGameComponent::InitWorld 0x41735a` RELOC_MATCH
-- [ ] Continue Game screen flash on press (D3D9 present/clear path) — known, unfixed
-- [ ] `CWorld::LoadGameState` -> subsystem deserializers -> level stream (Continue Game core still unreconstructed)
-- [ ] `lzo1x_decompress` for minimap decode is a hard defer (regalloc); keep as functional oracle
-- [ ] Hero-in-world Phase A: wire `FableGFMainPhase10PlayBoundary` to real `CGame::Play` behind `FABLETLC_EXECUTE_EXACT_PLAY` after debugger live-oracle capture at `0x412f90` (verify: adapter ring still UNWIRED) — `docs/engine/HERO_IN_WORLD_ROADMAP.md`
-- [ ] Phase B: streaming crash `0x7dd1d3` (`CEngineLandscapeMap::OpenStaticMap 0xBDD0E0` NULL malloc; BP `0xBDD1B2` reads `field_04`)
-- [ ] Phases C-F (CWorld::PostInit ctors, tick orchestration, hero spawn, RenderCell/D3D9 device layer) — months; renderer is the cost driver
-
-## (e) Engine subsystem RE — `docs/engine/SYSTEMS_ANALYSIS.md`, `docs/engine/CAPABILITY_INDEX.md`
-
-- [x] Nav: quadtree line init/update, multilayer nav, navmesh RE — `engine/NAVIGATION.md` (merged from `NAVMESH_RE.md`, `MULTILAYER_NAV.md`)
-- [x] Quest logic is compiled C++ (161-entry allocator table @ `0x00CD52D0`, no VM) — `QUEST_SCRIPTS.md#quest-binding-compiled-c-classes`, `QUEST_SCRIPTS.md#cutscene-and-region-script-interpreter`
-- [x] Quest cards: display map, body art (3D mesh via `Graphic.modelId`), CUIDefs 8487-8489, empty-card fix — `engine/QUEST_CARDS.md` (merged from `QUEST_CARD_*.md`)
-- [x] Input: Redefine Keys system, controller enums from FableWin.pdb — `INPUT.md#binding-store-and-redefine-subsystem`, `INPUT.md#controller-enum-tables`
-- [x] Video system, minimap, hero morph, appearance strip, console commands, demon door face — per-doc
-- [x] Terrain: whiteout + render fixes; ForgeTest64 terrain renders in-game (stage33); foliage group-sphere contract recovered (stage46)
-- [x] Cut co-op multiplayer + EgoMP donor audits — `CUT_COOP_MULTIPLAYER.md`, `EGOMP_*.md`
-- [ ] Nav: `CWorldMap::GetMapNavigationAreaInit` -> collision-hull -> blocking-line extraction
-- [ ] Foliage stage46 runtime gate (custom collection-load probe + visible grass) — needs Fable closed then relaunched
-- [ ] stage45 near-black terrain faces: compare authored foreground packed normals vs retail patch
-- [ ] Save graph: `CTCInventory::Transfer`, `CQuestManager`/`CFactionManager` field/tag names
-- [ ] Statue Master restoration `mods/StatueMasterRestoration/RUNTIME_PROBE.md` ten-case live probe (user-driven)
-- [ ] Recover full 31-action `EGameAction` int->name table (3 sourcing passes failed; do not re-scan binary/web) — `docs/engine/INPUT.md#open-gaps`
-
-## (f) Quest-script recovery / Lua — `docs/scripts/SCRIPT_RECOVERY_PIPELINE.md`, `docs/scripts/AEON_LUA_PORTS.md`
-
-- [x] 161/161 retail scripts with complete 5-method lifecycle IR; 615/615 entity bindings; 1,708 interface calls resolved
-- [x] Aeon's 8 hand-ports ingested (`work/aeon_lua_ports/`: DragonBossFight, GuardianSisterInfo(2), GuardianTrophyDealerInfo, HerosOldHouse, MazeResearch, MeetSister, StatueMaster) as `reconstructed-source` oracles
-- [x] 2026-09-02 upstream FSE 14 bindings + `lua_newthread` threading ported onto canonical `D:\Code\ForgeFSE-retail-shadow` (1000-row table, corpus 111/111 callable); two ABI defects fixed (`FadeOutAndKillEntity`, cutscene arg order)
-- [x] `map-native-helpers` stage shown to be 73% non-semantic (CRT/STL/lifetime) — not a real gate
-- [x] `tools/script_recovery` tests 94/94; foundation audit 17/18
-- [ ] Ingest the 2026-09-06 LUAGameflow batch (12 ports) into `work/aeon_lua_ports/`; extend alias table in both tools
-- [ ] Ghidra anchor-discovery run for `V_StatueMaster` + `Q_DragonBossFight` (`decompile_native_script.py`) — the 18th audit check
-- [ ] Runtime-confirm Aeon's addresses `0x00CBE716`, `0x00CBE87F`, `0x00CBE960` with a live probe
-- [ ] First OUR end-to-end hand reconstruction of one `manual-lua-reconstruction` script against its trace fixtures (0 of 161 converted by us so far)
-- [ ] Recompute the 69/92 stage split with non-semantic helper categories excluded
-- [ ] Live world-entry smoke of the shadow package (previous menu-only smoke proved 0/16 script loads)
-- [ ] `MsgOnLevelLoaded` ABI-blocked (retail writes `std::list`)
-
-## (g) Modding toolchain
-
-- [x] Lives in FableForge (`D:\Code\FableForge`) and ForgeFSE-retail-shadow now; moved docs indexed at `docs/modding/README.md` (`docs/from_fabletlc/` in each repo)
-
-## Parked / shelved
-
-- Gamepad redefine patch — shelved 2026-08-10; install reverted to clean retail; #811 clone renders black, row-value read path unknown — `docs/engine/INPUT.md#open-gaps`
-- Mario rig (`work/mario_hero/stage_bindaxis4`) — body segments stretch apart; needs animation translation retargeting, not more bind-axis placement
-- Unicorn emulation — assessed 2026-07-27 as optional local pilot; not implemented; not on parity totals — `docs/pipeline/UNICORN_EMULATION_PLAN.md`
-- Co-op revival — RE audits done (`CUT_COOP_MULTIPLAYER.md`); implementation moved to FableForge docs; no active work
-- Installer / settings UI / x64 / broad C++23 modernization — deferred until the reconstructed process reaches the game loop
-
-## Definitions (grade ladder, lowest to highest)
-
-- `candidate` — generated/reviewed source exists; not compile-verified (1,066 rows)
-- `checker-pass` — passes the structural checker only; no compiler involved
-- `compiled` — builds to a VC7.1 object; no parity claimed (18,604)
-- `functional` — behavior fixture passes vs local oracle; bytes differ (`DIFFER`) — never counted in byte totals
-- `matching` — `MATCH` (exact `.text`) or `RELOCATION_MATCH` (exact after masking COFF reloc slots) — the only "landed byte-exact" grades
-- `asm_bake` — `__declspec(naked)` / `_emit` byte-bake; byte-exact but NOT genuine C++; purity debt tracked by `crawl/purity.py`
+The [October 10 public roadmap archive](journal/2026-10/2026-10-10-public-roadmap.md)
+preserves the earlier September checklist, branch names, and measurements.
+Those older merge/resume commands are not current instructions.
diff --git a/docs/journal/2026-10/2026-10-10-public-handoff.md b/docs/journal/2026-10/2026-10-10-public-handoff.md
new file mode 100644
index 0000000000..13184be96d
--- /dev/null
+++ b/docs/journal/2026-10/2026-10-10-public-handoff.md
@@ -0,0 +1,49 @@
+# Public handoff — updated 2026-10-10
+
+## Current public checkpoint
+
+Native recreation is active. Read [NATIVE_STATUS.md](../../NATIVE_STATUS.md) for the
+October 10 local verification results, current boundaries and publication scope.
+This update publishes status only; the newer local source/test checkpoint is
+not merged into `main`. The generated dashboard remains the September snapshot.
+The published frontend is authored integration, not a playable native engine.
+
+The resume instructions below are historical September notes. Their branch,
+head, clean-tree and `main` equality claims are not current instructions.
+Do not blindly merge the development branch: unrelated Lua work must stay out
+of a native-only publishing checkpoint.
+
+## Historical September 7 handoff
+
+## State
+- Branch: `feat/script-recovery-marathon` (head `2e038aa`, clean tree, `main` == this head); `main` was fast-forwarded (519 commits) and pushed to `BuffJesus/FableDecomp` on 2026-09-07 — fast-forward it again after each checkpoint. Note: `git add` on this tree takes 1–6 minutes and HANGS if another process is writing under `rebuild/` (or a reserved-name file like `CON` exists); never run it concurrently with the header generator or retype.
+- 22 old agent branches are now `archive/*` tags. Root scratch + `CON` removed. `LICENSE`, `CONTRIBUTING.md`, CI `docs-consistency` added.
+- Coverage (2026-08-28 dashboard): 8,082 byte-identical (16.3%), 18,579 functional-or-matching (37.5%) of 49,568; catalog is now 18,631 landed. Regenerate `rebuild/COVERAGE.md` before quoting numbers.
+
+## Open these five first
+1. `docs/ROADMAP.md` — what is done / in flight / next (the only task list)
+2. `docs/ARCHITECTURE.md` — the three source layers (lift intake / parity `rebuild/src/compiled` / modern)
+3. `docs/BUILDING.md` — Ghidra, VC7.1, GhidraMCP, FSE tooling commands
+4. `CONTRIBUTING.md` — landing rules, header contract, purity policy
+5. `rebuild/COVERAGE.md` — the numbers
+
+## Active lanes and their resume commands
+- Typed headers: `python tools/decomp_pipeline/gen_class_headers.py --all-trusted` (add `--compile-check`), then `python tools/decomp_pipeline/retype_landed.py --class CGameScriptInterface` (dry run; `--apply` only rewrites files that stay byte-exact). Log: `rebuild/backlog/retype_log.tsv`; headers: `rebuild/include/engine/` (`INDEX.tsv`, `RECONCILE.tsv`, `_quarantine/`).
+- Parity crawl: resume from `work/crawl_batch155` — `next_smallest.py` -> `trim_overcapture.py` -> `trim_tailjmp.py` -> author -> `verify_and_land.py`; iterate a DIFFER with `work/crawl_batch154/probe.py`. Ledger `tools/decomp_pipeline/crawl/gen_tried.txt`.
+- De-bake: `python tools/decomp_pipeline/crawl/bake_families.py` for the live family table; `debake_family.py --apply`.
+- Script recovery: `python -m unittest discover -s tools/script_recovery -p 'test_*.py'`; `python tools/script_recovery/verify_foundation.py`; readiness needs `--vtable-slots`, `--interface-catalog`, `--fse-address-map`. Ingest Aeon's 2026-09-06 LUAGameflow batch into `work/aeon_lua_ports/`.
+- ForgeFSE: canonical fork is `D:\Code\ForgeFSE-retail-shadow`, branch `feat/upstream-fse-2026-09-02` (`3f417ee`), untested in-game. `D:\Code\ForgeFSE` is stale.
+- Docs hygiene: `python tools/docs_reorg.py --check-links --check-findings --check-root` and `python tools/update_readme_progress.py --check` (both run in CI).
+- Build/visual QA: `rebuild/build_bootstrap.ps1 -RetailFrontendBank `; recipe in `docs/pipeline/VISUAL_PARITY_STATUS.md`. Retail Fable.exe must be CLOSED (single-instance mutex fails the WinMain fixture).
+
+## Where notes go
+- This file stays one page. The long-running journal is `docs/journal/HANDOFF_ARCHIVE.md` (12k lines, append-only history).
+- New session notes: `docs/journal/YYYY-MM/_.md` (e.g. `docs/journal/2026-09/`). Cited technical truth: `docs/journal/FINDINGS_LOG.md`.
+- Solved gotchas get a one-liner in `CLAUDE.md`; roadmap status changes go in `docs/ROADMAP.md`.
+
+## Gotchas not yet in CLAUDE.md
+- A file named `CON` at the repo root hangs EVERY git command on Windows (reserved device name). Delete it with `del "\\?\D:\Documents\FableTLC\CON"` — normal `del`/Explorer cannot.
+- A killed `git add` leaves a stale `.git/index.lock`; remove it before retrying (check no git process is running first).
+- Sibling repos hold the moved modding docs: FableForge `D:\Code\FableForge\docs\from_fabletlc\` and ForgeFSE-retail-shadow `docs\from_fabletlc\`. `docs/modding/README.md` is the index; do not recreate those docs here.
+- `native_conversion_readiness.json` silently loses all interface resolution if regenerated without `--vtable-slots` and `--interface-catalog`.
+- Two ForgeFSE forks existed; only `ForgeFSE-retail-shadow` is canonical. Any binding port must land there.
diff --git a/docs/journal/2026-10/2026-10-10-public-roadmap.md b/docs/journal/2026-10/2026-10-10-public-roadmap.md
new file mode 100644
index 0000000000..87c891caf9
--- /dev/null
+++ b/docs/journal/2026-10/2026-10-10-public-roadmap.md
@@ -0,0 +1,145 @@
+# FableTLC roadmap (single source of truth for "what's done / in flight / next")
+
+## Current native focus — October 10, 2026
+
+- [x] Publish a dated native activity update and clarify authored frontend versus recovered engine behavior — [NATIVE_STATUS.md](../../NATIVE_STATUS.md).
+- [x] Local real-GPU verification draws a retail title sprite; this is not full native frontend boot or gameplay.
+- [ ] Publish dependency-complete reviewed native source/test checkpoints; newer implementations remain local.
+- [ ] Recover remaining native bank-loading/resource-lifetime dependencies, preserving two-attempt deferrals.
+- [ ] Extend verified rendering toward a persistent native visual launch and later world/gameplay initialization.
+- [ ] Reconcile generated whole-project metrics before updating coverage percentages.
+
+## Historical September roadmap
+
+The checklist below records the older published checkpoint, not the current
+native-only work queue. In particular, its broad branch-merge and Lua tasks
+are not instructions for the current native publication.
+
+Updated 2026-09-07. Checklists only. `[x]` = done with evidence, `[ ]` = open, "(verify)" = status
+unconfirmed. Numbers come from `rebuild/COVERAGE.md` (dashboard generated 2026-08-28). Resume
+instructions live in `docs/HANDOFF.md`; long history in `docs/journal/HANDOFF_ARCHIVE.md`.
+Superseded inputs: `docs/journal/2026-09/{PLAN_pre-roadmap,BACKLOG_pre-roadmap,ACTIVE_TASK_LIST}.md`.
+
+## Current focus (2026-09)
+
+- [ ] Typed shared headers: 2026-09-07 `--all-trusted --compile-check` = 957 compiling headers (257 quarantined); automatic passes plus the parity-gated manual tail have retyped 651 landed TUs onto PDB-named headers (162 manual conversions across thirty-three checkpoints). `VTABLE_TYPED` (37→0), `VIRTUAL_THIS` (54→0), non-source-failure `PARITY_CHANGED` (7→0), `BEHAV_FAIL` (8→0), source-failure `PARITY_CHANGED` (43→0), and `AMBIG_ALIGN` (10→0) are closed. The final source-failure pass recovered eleven byte-parity-preserving interface, creature-action, layout-access, and state-wrapper functions; the ambiguous-alignment review recovered four and reclassified six — `tools/decomp_pipeline/`
+- [x] 2026-09-07 Aeon's 12 new Lua ports ingested (20 packages, 71 scripts; foundation audit 15/18) — `docs/scripts/AEON_LUA_PORTS.md`
+- [ ] Port the 12 FSE 6.9.26 bindings LUAGameflow needs into ForgeFSE-retail-shadow; add package→native-name aliases so the new seeds correlate (8/20 today) — `docs/scripts/AEON_LUA_PORTS.md`
+- [ ] Keep the parity crawl moving from `work/crawl_batch155` (ledger 5,693; catalog 18,631 landed) — `docs/pipeline/FULL_DECOMP.md`
+- [ ] Live-test ForgeFSE-retail-shadow branch `feat/upstream-fse-2026-09-02` (commit `3f417ee`) in-game: CreateThread script + region unload — user-driven, needs Fable open
+- [ ] Merge `feat/script-recovery-marathon` into `main` once CI (`docs-consistency`) is green on the branch
+
+## (a) Repo health & public presentation — `CONTRIBUTING.md`, `docs/ARCHITECTURE.md`
+
+- [x] 2026-09-07 `main` fast-forwarded to include 519 commits and pushed to `BuffJesus/FableDecomp`
+- [x] 2026-09-07 22 agent branches archived as `archive/*` tags (24 tags total)
+- [x] 2026-09-07 root scratch files + the `CON` file removed; `LICENSE`, `CONTRIBUTING.md`, CI (`docs-consistency`) added
+- [x] 2026-09-07 docs restructured into `ARCHITECTURE.md`, `BUILDING.md`, `engine/`, `formats/`, `pipeline/`, `scripts/`, `journal/`, `modding/`
+- [x] 2026-09-07 `docs/ROADMAP.md` + one-page `docs/HANDOFF.md` written (this file)
+- [x] 2026-09-07 `docs_reorg.py --check-links --check-root` clean; `update_readme_progress.py --check` clean; both run in CI (`.github/workflows/docs-consistency.yml`)
+- [x] 2026-09-07 `rebuild/COVERAGE.md` regenerated with genuine-C++ / asm-bake / readability rows; README rows generated from it
+- [x] 2026-09-07 all 56 FINDINGS_LOG entries re-homed into reference docs (Verified facts sections; new `engine/CUTSCENES.md`); `--check-findings` now runs in CI
+- [x] 2026-09-07 doc families merged: `formats/SAVE.md` (8→1), `formats/BIG.md` (3→1), `formats/MESH.md` (4→1), `engine/QUEST_CARDS.md` (5→1), `engine/NAVIGATION.md` (2→1); sources left as 3-line stubs
+- [x] 2026-09-07 remaining families merged: `formats/{ANIM,TEXTURE,TEXT,AUDIO,DEFS}.md`, `engine/{HERO_APPEARANCE,INPUT,GAME_ENTRY_PATHS,QUEST_SCRIPTS}.md` (sources are 3-line stubs; INDEX lists both)
+- [ ] Turn `rebuild/build_candidates.ps1` (130k lines of PowerShell objects) into a TSV + small driver
+- [ ] Prune superseded intake drafts: 600/1,066 `rebuild/candidates/snapshots` and 604/1,079 `lift/reports/*/code` files have a landed reconstruction at their address (counted 2026-09-07). Needs the manifest/status generators to stop counting them first (`agent_candidates`, `agent_source_path`)
+- [x] 2026-09-07 FQT + Fable-2 scene-import one-offs (21 scripts) moved to `tools/archive/` with a README
+- [x] 2026-09-07 hidden scheduled tasks documented in `docs/BUILDING.md` (Background automation) with the disable command
+
+## (b) Symbols & types — `docs/pipeline/SYMBOLS.md`, `docs/pipeline/NAMING_STRAGGLERS.md`
+
+- [x] Ghidra 12.1 import + RTTI pass; PDB two-binary symbol port (FableWin.pdb / Ego_r.pdb donors)
+- [x] BSim names applied; RTTI vtable-slot force port (`ghidra_out/labels_rtti_port.tsv`)
+- [x] 100% mechanically named (49,568/49,568); 99.2% accepted naming quality; 40 names in review tail
+- [x] FSE manifest corrected to 933 functions and propagated to FableForge
+- [x] FSE address map (`refs/script_recovery/fse_address_name_map.json`, 80 addrs, 63 manifest clashes) wired into readiness analyzer
+- [x] 2026-09-07 typed shared headers `rebuild/include/engine/`: 957 compiling headers from the PDB layouts, per-header compile check, quarantine on donor/retail conflict
+- [x] 2026-09-07 automatic and manual parity-gated retyping applied to 638 landed TUs; `VTABLE_TYPED`, `VIRTUAL_THIS`, non-source-failure `PARITY_CHANGED`, and `BEHAV_FAIL` tails closed (see Current focus for the active source-failure parity lane)
+- [ ] Bulk `.gdt` import of donor struct layouts into the Ghidra DB (open)
+- [ ] Calling convention known 77.7% -> close the 11,031 unknown-CC functions
+- [ ] Complete prototypes 69.2% -> close the 15,280 incomplete ones
+- [ ] Apply the 63 FSE-vs-BSim name clashes as manifest corrections (FSE ASLR address wins in `0x00CBxxxx`)
+
+## (c) Byte-parity reconstruction — `docs/pipeline/FULL_DECOMP.md`, `docs/pipeline/DEBAKE_WORKLIST.md`
+
+- [x] VC7.1 RTM 13.10.3077 harness; `verify_and_land.py` oracle->author->verify->land loop
+- [x] Byte-identical 8,082 (16.3%); functional-or-matching 18,579 (37.5%) as of 2026-08-28
+- [x] Manifest gap recovery: 7,529 xref-confirmed starts merged (functions.tsv 49,568 -> 57,097) — `docs/pipeline/MANIFEST_GAP_RECOVERY.md`
+- [x] Over-capture trimming (`trim_overcapture.py`, `trim_tailjmp.py`) repo-wide
+- [x] Jump-table lander `verify_land_jumptable.py` (raw-COFF extraction) proven on 0x557CA0 / 0x5578A0
+- [x] Skeleton clone harvester + de-bake family tooling (`debake_family.py`, `harvest_all`, `crossfam`, `shape_author`)
+- [x] Parity crawl batches 153 (8/8) and 154 (7/8) landed 2026-09-02; `probe.py` + `disasm.py` + `iat_lookup.py` helpers in `work/crawl_batch153-154`
+- [ ] De-bake: 614 `__declspec(naked)`/`__asm` + 218 `_emit` non-genuine sources remain — regenerate with `crawl/bake_families.py` (verify counts)
+- [ ] Mislabelled dtor families (`_Dest_val`/`_Cons_val` BSim labels on non-dtor bodies) re-attributed on landing; sweep the rest
+- [ ] `00995e70 PeekData` honest DIFFER(16v15) — attack load-through-lea, not the compare
+- [ ] `LinkToNeighbouringMaps 0x00A7A650` 9 bytes long; `CNavQuadTree::UpdateLines 0x00A781A0` fixture-first
+- [ ] GFMain `0x00402510` dependency closure; CRT `entry 0x00401067` parity (deferred until GFMain boundary useful)
+- [ ] Wave-3 review tails (CGSI wrappers with end-sentinel derefs, co-op spirit tail) rebuilt from bytes before promotion
+- [ ] 84 deferred over-captures worklist `rebuild/backlog/overcapture-recovery-worklist.tsv` (~11 recovered)
+- [ ] Lifted modules 3/3,433 -> next module-level link proof after OpenRetailBank ring (`LINK_WORKLIST.md`)
+
+## (d) Running frontend / renderer parity — `docs/pipeline/VISUAL_PARITY_STATUS.md`, `docs/engine/GAME_ENTRY_PATHS.md#continue-and-load-game-path`
+
+- [x] Stage-0/1 executable integration: VC7.1 links byte-identical fns into an owned Win32 process; `WinMain 0x403480` promoted
+- [x] `FableTLC-Reconstruction-VisualCheckpoint.exe` renders the D3D9 frontend headlessly (synth-click + screenshot QA recipe)
+- [x] Profile-name font doubling fixed 2026-08-10 (half-texel UV inset in `AppendProfileNameText`)
+- [x] Save-enumeration seam opened 2026-08-10; 6 display-name-tier fns landed; find-loop blocker solved 2026-08-16
+- [x] `CGame::Play 0x412f90` landed byte-exact; `CMainGameComponent::InitWorld 0x41735a` RELOC_MATCH
+- [ ] Continue Game screen flash on press (D3D9 present/clear path) — known, unfixed
+- [ ] `CWorld::LoadGameState` -> subsystem deserializers -> level stream (Continue Game core still unreconstructed)
+- [ ] `lzo1x_decompress` for minimap decode is a hard defer (regalloc); keep as functional oracle
+- [ ] Hero-in-world Phase A: wire `FableGFMainPhase10PlayBoundary` to real `CGame::Play` behind `FABLETLC_EXECUTE_EXACT_PLAY` after debugger live-oracle capture at `0x412f90` (verify: adapter ring still UNWIRED) — `docs/engine/HERO_IN_WORLD_ROADMAP.md`
+- [ ] Phase B: streaming crash `0x7dd1d3` (`CEngineLandscapeMap::OpenStaticMap 0xBDD0E0` NULL malloc; BP `0xBDD1B2` reads `field_04`)
+- [ ] Phases C-F (CWorld::PostInit ctors, tick orchestration, hero spawn, RenderCell/D3D9 device layer) — months; renderer is the cost driver
+
+## (e) Engine subsystem RE — `docs/engine/SYSTEMS_ANALYSIS.md`, `docs/engine/CAPABILITY_INDEX.md`
+
+- [x] Nav: quadtree line init/update, multilayer nav, navmesh RE — `engine/NAVIGATION.md` (merged from `NAVMESH_RE.md`, `MULTILAYER_NAV.md`)
+- [x] Quest logic is compiled C++ (161-entry allocator table @ `0x00CD52D0`, no VM) — `QUEST_SCRIPTS.md#quest-binding-compiled-c-classes`, `QUEST_SCRIPTS.md#cutscene-and-region-script-interpreter`
+- [x] Quest cards: display map, body art (3D mesh via `Graphic.modelId`), CUIDefs 8487-8489, empty-card fix — `engine/QUEST_CARDS.md` (merged from `QUEST_CARD_*.md`)
+- [x] Input: Redefine Keys system, controller enums from FableWin.pdb — `INPUT.md#binding-store-and-redefine-subsystem`, `INPUT.md#controller-enum-tables`
+- [x] Video system, minimap, hero morph, appearance strip, console commands, demon door face — per-doc
+- [x] Terrain: whiteout + render fixes; ForgeTest64 terrain renders in-game (stage33); foliage group-sphere contract recovered (stage46)
+- [x] Cut co-op multiplayer + EgoMP donor audits — `CUT_COOP_MULTIPLAYER.md`, `EGOMP_*.md`
+- [ ] Nav: `CWorldMap::GetMapNavigationAreaInit` -> collision-hull -> blocking-line extraction
+- [ ] Foliage stage46 runtime gate (custom collection-load probe + visible grass) — needs Fable closed then relaunched
+- [ ] stage45 near-black terrain faces: compare authored foreground packed normals vs retail patch
+- [ ] Save graph: `CTCInventory::Transfer`, `CQuestManager`/`CFactionManager` field/tag names
+- [ ] Statue Master restoration `mods/StatueMasterRestoration/RUNTIME_PROBE.md` ten-case live probe (user-driven)
+- [ ] Recover full 31-action `EGameAction` int->name table (3 sourcing passes failed; do not re-scan binary/web) — `docs/engine/INPUT.md#open-gaps`
+
+## (f) Quest-script recovery / Lua — `docs/scripts/SCRIPT_RECOVERY_PIPELINE.md`, `docs/scripts/AEON_LUA_PORTS.md`
+
+- [x] 161/161 retail scripts with complete 5-method lifecycle IR; 615/615 entity bindings; 1,708 interface calls resolved
+- [x] Aeon's 8 hand-ports ingested (`work/aeon_lua_ports/`: DragonBossFight, GuardianSisterInfo(2), GuardianTrophyDealerInfo, HerosOldHouse, MazeResearch, MeetSister, StatueMaster) as `reconstructed-source` oracles
+- [x] 2026-09-02 upstream FSE 14 bindings + `lua_newthread` threading ported onto canonical `D:\Code\ForgeFSE-retail-shadow` (1000-row table, corpus 111/111 callable); two ABI defects fixed (`FadeOutAndKillEntity`, cutscene arg order)
+- [x] `map-native-helpers` stage shown to be 73% non-semantic (CRT/STL/lifetime) — not a real gate
+- [x] `tools/script_recovery` tests 94/94; foundation audit 17/18
+- [ ] Ingest the 2026-09-06 LUAGameflow batch (12 ports) into `work/aeon_lua_ports/`; extend alias table in both tools
+- [ ] Ghidra anchor-discovery run for `V_StatueMaster` + `Q_DragonBossFight` (`decompile_native_script.py`) — the 18th audit check
+- [ ] Runtime-confirm Aeon's addresses `0x00CBE716`, `0x00CBE87F`, `0x00CBE960` with a live probe
+- [ ] First OUR end-to-end hand reconstruction of one `manual-lua-reconstruction` script against its trace fixtures (0 of 161 converted by us so far)
+- [ ] Recompute the 69/92 stage split with non-semantic helper categories excluded
+- [ ] Live world-entry smoke of the shadow package (previous menu-only smoke proved 0/16 script loads)
+- [ ] `MsgOnLevelLoaded` ABI-blocked (retail writes `std::list`)
+
+## (g) Modding toolchain
+
+- [x] Lives in FableForge (`D:\Code\FableForge`) and ForgeFSE-retail-shadow now; moved docs indexed at `docs/modding/README.md` (`docs/from_fabletlc/` in each repo)
+
+## Parked / shelved
+
+- Gamepad redefine patch — shelved 2026-08-10; install reverted to clean retail; #811 clone renders black, row-value read path unknown — `docs/engine/INPUT.md#open-gaps`
+- Mario rig (`work/mario_hero/stage_bindaxis4`) — body segments stretch apart; needs animation translation retargeting, not more bind-axis placement
+- Unicorn emulation — assessed 2026-07-27 as optional local pilot; not implemented; not on parity totals — `docs/pipeline/UNICORN_EMULATION_PLAN.md`
+- Co-op revival — RE audits done (`CUT_COOP_MULTIPLAYER.md`); implementation moved to FableForge docs; no active work
+- Installer / settings UI / x64 / broad C++23 modernization — deferred until the reconstructed process reaches the game loop
+
+## Definitions (grade ladder, lowest to highest)
+
+- `candidate` — generated/reviewed source exists; not compile-verified (1,066 rows)
+- `checker-pass` — passes the structural checker only; no compiler involved
+- `compiled` — builds to a VC7.1 object; no parity claimed (18,604)
+- `functional` — behavior fixture passes vs local oracle; bytes differ (`DIFFER`) — never counted in byte totals
+- `matching` — `MATCH` (exact `.text`) or `RELOCATION_MATCH` (exact after masking COFF reloc slots) — the only "landed byte-exact" grades
+- `asm_bake` — `__declspec(naked)` / `_emit` byte-bake; byte-exact but NOT genuine C++; purity debt tracked by `crawl/purity.py`
diff --git a/tools/decomp_pipeline/tests/test_render_fable_frontend_subscreens.py b/tools/decomp_pipeline/tests/test_render_fable_frontend_subscreens.py
index f732eee2d3..5d8bae7a03 100644
--- a/tools/decomp_pipeline/tests/test_render_fable_frontend_subscreens.py
+++ b/tools/decomp_pipeline/tests/test_render_fable_frontend_subscreens.py
@@ -412,6 +412,9 @@ def test_save_browser_selection_uses_complete_retail_button_texture(self):
bounds[3],
SAVE_LIST_ORIGIN[1] + 3 * SAVE_ROW_STEP_Y + 64)
+ @unittest.skipUnless(
+ os.path.isfile(FRONTEND_BANK) and os.path.isfile(FONT_BANK),
+ "retail frontend/font banks are not installed")
def test_save_names_are_centered_on_selection_highlight(self):
# Retail centres each save-slot label on its highlight button, exactly
# like the main-menu and Options rows. Regression guard for the bug where
@@ -541,6 +544,9 @@ def test_component_save_cell_leaves_title_text_for_live_glyphs(self):
component.crop((0, 35, 240, 80)))
self.assertIsNotNone(diff.getbbox())
+ @unittest.skipUnless(
+ os.path.isfile(FRONTEND_BANK) and os.path.isfile(FONT_BANK),
+ "retail frontend/font banks are not installed")
def test_save_browser_renders_preview_viewport_ring(self):
# UI_VIEW_RING_SMALL (serialized at 314,37) frames a region minimap in
# the save-preview viewport on the right. Guard that the 256x256 region
@@ -553,6 +559,9 @@ def test_save_browser_renders_preview_viewport_ring(self):
# The ring ornament fills essentially the whole 256x256 tile.
self.assertEqual((0, 0, 256, 256), bounds)
+ @unittest.skipUnless(
+ os.path.isfile(FRONTEND_BANK) and os.path.isfile(FONT_BANK),
+ "retail frontend/font banks are not installed")
def test_save_browser_renders_file_information_backdrop(self):
# UI_TEXT_AREA (0,254) frames File Information with a UI_TEXTBOX_MIDDLE
# rule (UI_TABLE_TEXT_LEFT width 287 + UI_TABLE_TEXT_RIGHT 463,width 40).