# AA scene NPC recovery ## Observed loading failure The current Client reports `CreateNPCMonster Invalid ID 4015011` while entering Peak 204 from selected group 2. The source resource row supplies entrance 3013501, maze group 8, event 30502021 and NPC 4015011. This is a scene actor creation failure, separate from refreshing the selected AA group. `loadPeakResources` in `handlers_challenge.go` copies `NpcMonsterIDList` into `PeakStageData.MonsterID`. `loadChallengeScene` in `handlers_challenge_scene.go` forwards that value directly into `SceneNpcMonsterInfo.MonsterId`; no current Client config lookup validates it. The battle wave monster is a different identifier namespace and cannot be converted into an adventure NPC by truncating digits. ## Evidence boundary The existing `WorldBattleConfig.json` NPC catalog is a partial capture of 153 NPCs, from assembly SHA-256 `c5e02e6e984f7e5577c78b995a8efeee2d06ee22e67d484ad5e859c8bf21e144`. An offline comparison finds that 42 of the 44 Peak rows refer to at least one NPC outside that partial catalog. Absence from it is therefore insufficient to declare an AA room invalid. Using it as a mandatory allow-list would disable most AA rooms, including ones not demonstrated to fail. The reported Client error establishes that this particular NPC failed in the actual session. It does not establish a replacement NPC or prove that all other Peak rows are invalid. No replacement ID, arbitrary fallback monster, save migration was justified by the old partial catalog alone. ## Reference-backed correction prepared The FFGO update inspected on 2026-10-26 contains an explicit `challenge_peak_extra_data` JSON object at binary file offset `0x114c212`, decoded length 9101 bytes, binary SHA-256 `235f5c3567f281cc99613ed84694ef23f492c15298dc868a8e78e6529f0cda86`. Its Peak 204 mapping is NPC **4015010**, entrance **3013701**, maze group **10**. These values come from the reference object, not ID arithmetic. The full reference extraction is retained in `battle_diagnostics/ffgo-20261026/challenge_peak_extra_data.json`. `resources/ChallengePeakSceneOverrides.json` retains all 44 explicit mappings and their provenance. `peak_scene_overrides.go` applies only the scene NPC, entrance and maze group after loading canonical Peak group memberships. Battle event IDs, waves, buffs, targets and saved/active runs are unchanged. The loader validates provenance, duplicate/unknown IDs, group membership and merged resource scene placements. A missing mapping or unusable placement is stored as a configuration error. `StartChallengePeak` rejects it before creating battle/run state or sending EnterScene; unknown Peak IDs also now return the existing typed challenge-not-exist error instead of empty success. The first 36 reference mappings have monster placements in raw `res.json`. The last eight (Peak 1001–1104) require supplementary placements or further capture; no placement is invented when the merged loader cannot supply one. The resource is labeled reference evidence, not a captured Client table. `go build ./internal/gameserver` succeeded; no tests were run, no deployment was performed by this subtask, and actual Client NPC/scene acceptance remains unverified. ## Next bounded capture `tools/aa_npc_config_metadata.lua` is prepared outside `scripts/` and passes Lua syntax parsing. It inspects only six named candidate types, at eight members per heartbeat, to locate `NPCManager.CreateNPCMonster` and the NPC/Peak flat config entry points. Missing candidate types are logged rather than treated as proof that config is absent. It does not enumerate assembly types, call getters, create actors, load scene graphs or send gameplay packets. The Client process was not open during this offline inspection, so this probe has not been staged or run. Once current native/config lookup evidence is available, capture the relevant Peak row and each referenced NPC config to verify or supersede the reference mapping. Client battle/scene success remains unverified.