# Handoff Notes

Last updated: 2026-06-11 08:21 KST.

## Current Cleanup Note

- This file is historical handoff memory.  For active cleanup/deletion decisions,
  prefer `docs/REVIEW_CLEANUP.md` and `docs/CLEANUP_INVENTORY.md`; entries below
  may mention retired pages or old prototype surfaces.
- As of 2026-06-24, `web/object_position_review.html` has been removed as a legacy candidate-only coordinate overlay. Do not reintroduce it as an active surface.
- Use `web/map3_active_initializer_review.html`, `out/active_object_resource_slot_review.html`, `out/active_object_bounds_semantics_review.html`, `web/map3_projection_binding_review.html`, and `web/scene_event_coordinate_semantics_review.html` for current active-object/map_*3/resource position evidence.
- Candidate browser smoke raw files are now compact-summary backed and have zero
  surface consumers in `out/candidate_browser_smoke_summary.*`.  They remain
  retained only as verifier outputs and summary-generator inputs; web/build/audit
  surfaces should use the compact summaries instead of raw smoke payloads.
- `out/save_point_candidates.*` and `out/event_object_branch_state_candidate_links.*`
  are still retained as active evidence summaries.

## Operating Window

- User requested continued work until the available-token reset window, with a work-to-wrap transition at 2026-06-11 08:00 KST.
- At 08:00 KST, stop starting broad new implementation work. Finish the current edit, run verification, and update this handoff plus `docs/GOAL.md`.
- The test web port is fixed at `8013`. If another process occupies it, stop that process and restart on `8013`; do not switch ports.
- Current server observed: `python3 -m http.server 8013`.

## Manual Request Mode

- As of 2026-06-11 08:21 KST, the user explicitly switched this thread from long-running `/goal` mode to manual-request mode.
- Treat this as an operational stop, not actual goal completion.
- Do not call `update_goal(status="complete")` unless a future fresh completion audit proves the original route/completion gates are satisfied.
- For future work, use this file and `docs/GOAL.md` as memory, then handle only the user's current manual request scope.
- Keep broad route-promotion work paused unless the user provides one of the missing external inputs or asks for a specific small local follow-up.
- As of 2026-06-12, original `savedat*.dat` analysis is parked. Do not restart savedata offset, selector `2:0`, selected-root, public/synthetic save, or save-based route proof work until the original EXE event/runtime state model is understood. Keep only the parked clues in `docs/SAVEDATA_PARKED.md`.

## Current Goal Status

The active goal is to continue the work described by `docs/GOAL.md`. It is not actually complete by the current completion audit.

Current audit state:

- `out/goal_completion_checklist.json`: `achieved=false`, `routePromotionStatus=blocked`.
- `out/completion_audit.json`: `achieved=false`.
- Hard missing evidence:
  - strict source coordinate
  - tile hotspot confirmation
  - runtime trace/equivalent selected-root proof
- Required external inputs:
  - Stable selected-root runtime trace or equivalent proof for selected pointer `0x0059de30` executing root `0x00540714`.
  - Strict `map1_01a` source coordinate or tile-hotspot proof linked to `map2_02d`.

Do not call `update_goal(status="complete")` unless a fresh completion audit proves those requirements are actually satisfied.

## Next Manual Requests

Use these as the first small manual requests after switching away from long `/goal` mode:

- Roadmap 8 battle numeric: continue from `web/battle_analysis.html#battleNumericBoundaryPanel` and `web/battle_analysis.html#numericTriagePanel`, binding descriptor-local numeric runs to enemy row/stat/reward/formula evidence before promotion.
- Roadmap 2 event VM: continue from `web/format_review.html#opcodeLayoutGapPanel`, expanding operand layout without claiming route-linked VM execution.
- Roadmap 5 runtime flow: continue from `web/event_review.html#eventRuntimeBoundaryPanel`, `web/dialogue_review.html#dialogueReplayBoundaryPanel`, `web/map3_active_initializer_review.html`, `out/active_object_resource_slot_review.html`, and `out/active_object_bounds_semantics_review.html`.  The old `web/object_position_review.html` page is retired and must not be restored.
- Route completion blockers stay external until original event/runtime proof and strict source coordinate/tile hotspot proof are supplied. Savedata is not an active route-proof path.

## User-Facing State

- `/web/` is a normal admin/web review landing, not a game-like landing.
- `web/index.html` keeps runtime/game links inside the collapsed `보조 런타임 도구` details section.
- `web/index.html` and `web/progress.html#evidenceHandoffPanel` now expose `완료 감사 상태`/`completion-audit-status` so the current `achieved=false` and route-blocked state is visible from normal admin pages.
- `web/menu_review.html#menuRuntimeBoundaryPanel` separates browser-local shop/party/skill/equipment/status runtime progress from missing original menu/system proof.
- `web/progress.html#evidenceHandoffPanel` now mirrors those 16 browser-local runtime slice links as a local evidence row named `home-playable-runtime-slices`.
- `web/progress.html#localRoadmapQueuePanel` separates 6 local roadmap candidates from route-promotion blockers so work can continue on roadmap 2/5/6/8 without implying completion.
- `web/progress.html#runtimeSliceMatrixPanel` expands the 16 browser runtime candidates into a normal progress table with scope counts and non-promoting boundaries.
- `web/system_review.html#systemOffsetTriageQueuePanel` turns the save/equipment/status offset boundary into a 6-row local triage queue without promoting it to original proof.
- `web/system_review.html#systemOffsetClusterPanel` shows `out/savedata_offset_triage_clusters.json`: 4 buckets covering 87 unknown varying ranges.
- `web/system_review.html#systemOffsetRouteControlMatrixPanel` shows 7 route selector/control-adjacent public-sample value rows and keeps selector `2:0` captured savedata as required external proof.
- `web/system_review.html#systemOffsetValueMatrixPanel` shows 4 inventory/equipment candidate ranges with selector-grouped public sample byte values.
- `web/system_review.html#systemOffsetPairDecodePanel` shows 2 pair-decode candidate rows plus equipment hits 9/9 and item hits 1/2 for the same public sample bytes, with separate 1-based and 0-based item hit columns.
- `web/system_review.html#systemOffsetEquipmentNameCoveragePanel` links those 2 pair-decode rows to `menu_review.html?panel=equipment` and the equipment runtime candidate, now showing equipment/item name candidates such as `약초` while keeping the offset/name match non-promoting.
- `web/system_review.html#systemOffsetTargetedDeltaPlanPanel` now lists 5 targeted save-delta capture rows for item count, equipment ownership, equip/unequip slot, status/story negative control, and route-selector negative control. It requires changed saves and remains non-promoting.
- `web/system_review.html#systemOffsetTargetedDeltaIntakePanel` now reads `out/savedata_targeted_delta_intake.json` and shows the actual targeted-delta intake state: 5 required rows, 0 provided capture pairs, 5 missing capture rows, manifest present but empty, non-promoting. The report also writes `out/savedata_targeted_delta_intake.md`/`.html`.
- `web/progress.html#localRoadmapQueuePanel` now links the system offset row directly to route-control, value-matrix, equipment-name coverage, and targeted-delta-plan panels while keeping the general `system_review.html` link.
- `web/progress.html#evidenceHandoffPanel` still links the same system evidence row to the focused value matrix.
- `web/progress.html#localRoadmapQueuePanel` may still contain historical wording, but current object/resource evidence should point to `web/map3_active_initializer_review.html`, `out/active_object_resource_slot_review.html`, and `out/active_object_bounds_semantics_review.html` rather than the retired object-position page.
- `web/progress.html#localRoadmapQueuePanel` now links the monster roadmap row directly to all extracted monster scope and source-linked candidate scope.
- `web/index.html` recent verified work keeps the general system offset row and adds focused `route-control`, `값 matrix`, `pair decode`, and `장비/아이템 coverage` links to the corresponding `system_review.html` panels.
- `web/battle_analysis.html#battleNumericBoundaryPanel` and `web/battle_analysis.html#numericTriagePanel` now have stable anchors; home recent work and progress rows link directly to them while keeping the original numeric context link.
- `web/progress.html#verificationLedgerPanel` records the fixed 8013 port and the latest passing verification commands.
- `web/progress.html#wrapChecklistPanel` records the requested 2026-06-11 08:00 KST work-to-wrap transition.
- `docs/GOAL.md` now has a current-count note at the top of `진행 결과`: home recent verified work 18 rows, progress handoff 27 rows, local 23 / external 4, runtime matrix 16 rows, verification ledger 6/6, wrap checklist 7 steps. Older 2026-06-11 entries with 11/22/18, 14/25/21, 15/26/22, 16-row, or 17-row counts are historical slice-local counts.
- Browser smoke confirmed the home page has `canvasCount=0`, `runtimeScriptCount=0`, and summary `view=admin-web-view workbench=table-review`.
- `game.html` remains the separate game/runtime entry.

## Latest Completed Work

### System Review: Targeted Savedata Delta Intake

- Added `tools/summarize_savedata_targeted_delta_intake.py`.
- It writes:
  - `out/savedata_targeted_delta_intake.json`
  - `out/savedata_targeted_delta_intake.md`
  - `out/savedata_targeted_delta_intake.html`
- `tools/build_web_assets.py` now regenerates this report after `savedata_offset_triage_clusters`.
- Current report state:
  - plan rows `5`
  - public samples `6`
  - manifest `data/targeted_savedata/manifest.json`
  - manifest found `true`
  - provided capture pairs `0`
  - valid capture pairs `0`
  - missing capture rows `5`
  - completion status `missing-targeted-saves`
  - non-promoting `true`
- `web/system_review.html#systemOffsetTargetedDeltaIntakePanel` displays the intake rows and links to `../out/savedata_targeted_delta_intake.html`.
- Browser marker:
  - `browserSystemOffsetTargetedDeltaIntakeImplemented=true`
  - `systemOffsetTargetedDeltaIntakeRowCount=5`
  - `systemOffsetTargetedDeltaIntakeProvidedCapturePairCount=0`
  - `systemOffsetTargetedDeltaIntakeValidCapturePairCount=0`
  - `systemOffsetTargetedDeltaIntakeMissingCapturePairCount=5`
  - `systemOffsetTargetedDeltaIntakeManifestFound=true`
  - `systemOffsetTargetedDeltaIntakeReportHref="../out/savedata_targeted_delta_intake.html"`
  - `systemOffsetTargetedDeltaIntakeNonPromoting=true`
- Verification at 2026-06-11 08:00 KST:
  - `python3 -m py_compile tools/summarize_savedata_targeted_delta_intake.py tools/build_web_assets.py tools/verify_home_landing_browser.py tools/verify_web_assets.py`
  - `git diff --check -- tools/summarize_savedata_targeted_delta_intake.py tools/build_web_assets.py web/system_review.html tools/verify_home_landing_browser.py tools/verify_web_assets.py out/savedata_targeted_delta_intake.json out/savedata_targeted_delta_intake.md out/savedata_targeted_delta_intake.html`
  - `python3 tools/verify_web_assets.py`
  - `python3 tools/verify_runtime_http.py --base http://127.0.0.1:8013`
  - `xvfb-run -a python3 tools/verify_home_landing_browser.py --base http://127.0.0.1:8013`
- This is a capture-readiness and comparison surface only. It does not provide changed saves, original save writer proof, selector `2:0` captured savedata, selected-root runtime proof, route promotion, or actual goal completion.

### Home/Progress: Completion Audit Status Row

- `web/index.html` recent verified work now includes `완료 감사 상태`, linked to `completion_review.html`.
- `web/progress.html#evidenceHandoffPanel` includes `completion-audit-status` as a local evidence row.
- The row records completion proof matrix 8 rows, passed 3, partial 1, blocked 2, missing 2, `achieved=false`, route promotion blocked, and hard missing evidence 5.
- Browser marker:
  - `recentWorkRowCount=18`
  - `recentWorkCompletionAuditHref=completion_review.html`
  - `progressEvidenceHandoffRowCount=27`
  - `progressEvidenceHandoffLocalRowCount=23`
  - `progressEvidenceHandoffExternalRowCount=4`
  - `progressEvidenceHandoffCompletionAuditStatusIncluded=true`
  - `progressEvidenceHandoffCompletionAuditHref=completion_review.html`
- This is visibility only. It does not satisfy real selector `2:0` savedata, selected-root runtime trace, strict source coordinate/tile hotspot, route promotion, or actual goal completion.

### Progress: Local Roadmap Queue

- `web/progress.html#localRoadmapQueuePanel` now lists 6 local candidates that can proceed without new external route proof.
- The rows cover roadmap 2/5/6/8: event VM operand/layout expansion, original runtime flow boundaries, browser runtime candidate expansion, battle numeric/formula narrowing, save equipment/status offset narrowing, and monster attack/battle backlinks.
- Representative links go to `format_review.html#opcodeLayoutGapPanel`, `event_review.html#eventRuntimeBoundaryPanel`, `index.html#runtimeUtilityDetails`, `battle_analysis.html`, `system_review.html`, and `monster_review.html`.
- The original runtime-flow row links directly to `event_review.html#eventRuntimeBoundaryPanel`, `dialogue_review.html#dialogueReplayBoundaryPanel`, and `object_position_review.html#objectRuntimeBoundaryPanel`.
- The save equipment/status row also links directly to `system_review.html#systemOffsetRouteControlMatrixPanel`, `system_review.html#systemOffsetValueMatrixPanel`, `system_review.html#systemOffsetEquipmentNameCoveragePanel`, and `system_review.html#systemOffsetTargetedDeltaPlanPanel`, whose tables now include equipment/item candidates and the changed-save capture plan.
- The monster row links directly to `monster_review.html?scope=all` and `monster_review.html?scope=candidate`.
- Browser marker:
  - `browserProgressLocalRoadmapQueueImplemented=true`
  - `progressLocalRoadmapQueueRowCount=6`
  - `progressLocalRoadmapQueueVisibleRowCount=6`
  - `progressLocalRoadmapQueueRouteProofSeparated=true`
  - `progressLocalRoadmapQueueRoadmap2Included=true`
  - `progressLocalRoadmapQueueRoadmap5Included=true`
  - `progressLocalRoadmapQueueRoadmap6Included=true`
  - `progressLocalRoadmapQueueRoadmap8Included=true`
  - `progressLocalRoadmapQueueFormatHref=format_review.html#opcodeLayoutGapPanel`
  - `progressLocalRoadmapQueueEventRuntimeHref=event_review.html#eventRuntimeBoundaryPanel`
  - `progressLocalRoadmapQueueDialogueReplayHref=dialogue_review.html#dialogueReplayBoundaryPanel`
  - `progressLocalRoadmapQueueObjectRuntimeHref=object_position_review.html#objectRuntimeBoundaryPanel`
  - `progressLocalRoadmapQueueRuntimeHref=index.html#runtimeUtilityDetails`
  - `progressLocalRoadmapQueueBattleHref=battle_analysis.html`
  - `progressLocalRoadmapQueueSystemHref=system_review.html`
  - `progressLocalRoadmapQueueSystemRouteControlHref=system_review.html#systemOffsetRouteControlMatrixPanel`
  - `progressLocalRoadmapQueueSystemValueMatrixHref=system_review.html#systemOffsetValueMatrixPanel`
  - `progressLocalRoadmapQueueSystemNameCoverageHref=system_review.html#systemOffsetEquipmentNameCoveragePanel`
  - `progressLocalRoadmapQueueSystemTargetedDeltaPlanHref=system_review.html#systemOffsetTargetedDeltaPlanPanel`
  - `progressLocalRoadmapQueueMonsterAllHref=monster_review.html?scope=all`
  - `progressLocalRoadmapQueueMonsterCandidateHref=monster_review.html?scope=candidate`
- This queue is deliberately non-promoting. It does not solve the hard route blockers or make the active goal complete.

### Progress: Browser Runtime Slice Matrix

- `web/progress.html#runtimeSliceMatrixPanel` now expands the collapsed home runtime links into a normal admin table.
- `web/index.html` recent verified work now links this panel as `브라우저 런타임 후보 매트릭스`.
- The table has 16 rows: title, field walk, dialogue, battle, sprite battle, save point, object, shop, party, skill, equipment, status, progress, story, confirmed transition, and `routeAssist`.
- Current scope counts:
  - browser verified: 2
  - prototype: 9
  - browser-local: 3
  - partial: 1
  - trial only: 1
- Representative runtime links:
  - `game.html?game=1`
  - `game.html?map=map1_02b&startTile=11%2C12&collision=1&moveMs=192`
  - `game.html?map=map4_08n&startTile=18%2C42&menu=shop`
  - `game.html?map=map1_02b&startTile=11%2C12&trialTransitions=routeAssist&routeGoal=map2_18d&routeAutoSave=1`
- Browser marker:
  - `browserProgressRuntimeSliceMatrixImplemented=true`
  - `progressRuntimeSliceMatrixRowCount=16`
  - `progressRuntimeSliceMatrixVisibleRowCount=16`
  - `progressRuntimeSliceMatrixBrowserVerifiedCount=2`
  - `progressRuntimeSliceMatrixPrototypeCount=9`
  - `progressRuntimeSliceMatrixBrowserLocalCount=3`
  - `progressRuntimeSliceMatrixPartialCount=1`
  - `progressRuntimeSliceMatrixTrialOnlyCount=1`
  - `progressRuntimeSliceMatrixNonPromoting=true`
  - `progressRuntimeSliceMatrixMenuRuntimeIncluded=true`
  - `progressRuntimeSliceMatrixRouteAssistIncluded=true`
- Home marker:
  - `recentWorkRowCount=18`
  - `recentWorkRuntimeMatrixHref=progress.html#runtimeSliceMatrixPanel`
- This makes roadmap 6 browser-local runtime candidates visible from progress without opening the collapsed home details section. It does not prove original runtime parity, normal route proof, route promotion, or completion audit success.

### Format Review: Event VM Operand/Layout Gap

- `web/format_review.html#opcodeLayoutGapPanel` now separates roadmap 2 VM layout evidence into 6 rows.
- Rows cover dispatcher table, text source opcode layout, display/cursor layout, control/display layout, browser replay scope, and the remaining full VM decode/runtime gap.
- Current summary: grounded 4, partial 1, missing 1, non-promoting.
- The panel records dispatcher table `0x0047f1d8`, text source decoded 3/3, display/cursor decoded 1/1, control/display grounded 11/11, grounded control events 1007, browser replay opcodes 4, full instruction decode false, full operand decode false, route-linked execution false.
- Browser marker:
  - `browserFormatOpcodeLayoutGapImplemented=true`
  - `formatOpcodeLayoutGapRowCount=6`
  - `formatOpcodeLayoutGapGroundedRowCount=4`
  - `formatOpcodeLayoutGapPartialRowCount=1`
  - `formatOpcodeLayoutGapMissingRowCount=1`
  - `formatOpcodeLayoutGapTextSourceDecoded=true`
  - `formatOpcodeLayoutGapControlOpcodeCount=11`
  - `formatOpcodeLayoutGapGroundedControlEventCount=1007`
  - `formatOpcodeLayoutGapBrowserReplayOpcodeCount=4`
  - `formatOpcodeLayoutGapFullInstructionDecoded=false`
  - `formatOpcodeLayoutGapFullOperandDecoded=false`
  - `formatOpcodeLayoutGapRouteLinkedExecution=false`
  - `formatOpcodeLayoutGapNonPromoting=true`
- This is roadmap 2 visibility and does not promote full original VM/runtime parity.

### Map Gallery: Source/Assembly Coverage Table

- `web/map_gallery.html` now includes `맵 소스/조립 커버리지`.
- The table summarizes the global map review surface separately from the current table filter:
  - field map CNS source index: `174/174`
  - accepted assembled map renders: `174/174`
  - visible single-map source/assembly review links: `174` in default accepted scope
  - visible source CNS links: `174` in default accepted scope
  - visible browser overview links: `174` in default accepted scope
  - route promotion proof from map render coverage: `0`, blocked
- Browser marker:
  - `browserMapSourceCoverageTableImplemented=true`
  - `mapSourceCoverageRowCount=6`
  - `mapSourceCoverageGlobalMapCount=174`
  - `mapSourceCoverageAcceptedMapCount=174`
  - `mapSourceCoverageVisibleSourceLinkCount=174`
  - `mapSourceCoverageVisibleReviewLinkCount=174`
  - `mapSourceCoverageRoutePromotionBlocked=true`
  - `mapSourceCoverageNonPromoting=true`
- Latest home browser smoke summary now includes `mapSourceCoverage=6/174`.
- `web/index.html` recent verified work links this as `map_gallery.html`; after the completion audit, runtime matrix, VM opcode/layout, event runtime, dialogue replay, object runtime, menu runtime, audio, and collision rows added below, the recent table is 18 rows.
- `web/progress.html#evidenceHandoffPanel` includes this as a local evidence row; after the completion audit, runtime-slice, VM opcode/layout, dialogue replay, object runtime, menu runtime, audio, and collision rows added below, handoff is 27 rows with local 23 / external 4.
- This makes it easier to see that all 174 maps have source and assembled review coverage from the admin map gallery. It does not prove strict hotspot coordinates, selector `2:0` savedata, selected-root runtime execution, or route promotion.

### Progress Handoff: Playable Runtime Slices

- `web/progress.html#evidenceHandoffPanel` includes `home-playable-runtime-slices`.
- It links back to `web/index.html#runtimeUtilityDetails`, `out/home_landing_browser_smoke.json`, and `out/playable_progress.json`.
- The row records the 16 browser-local runtime links exposed from the normal admin home: title, field walk, dialogue, battle, sprite battle, save/object/shop/party/skill/equipment/status/progress/story, confirmed transition, and `routeAssist`.
- This is intentionally marked local/non-promoting. It does not prove original event/save/battle/story runtime parity, route promotion, or completion audit success.

### Progress Handoff: Event VM Opcode Coverage

- `web/index.html` recent verified work now includes `event VM opcode coverage`, linked to `format_review.html#opcodeCoveragePanel`.
- `web/progress.html#evidenceHandoffPanel` includes `format-vm-opcode-coverage`.
- The row records format review opcode coverage: 16 rows, browser replay 4, variable length 1, literal storage 1, dispatcher verified.
- Browser marker:
  - `progressEvidenceHandoffFormatOpcodeCoverageIncluded=true`
  - `progressEvidenceHandoffFormatOpcodeCoverageHref=format_review.html#opcodeCoveragePanel`
- This advances roadmap item 2 visibility. It does not prove full instruction length/operand layout, route-linked dispatch, original VM runtime proof, or route promotion.

### Format Review: Roadmap 2 Ledger

- `web/format_review.html#roadmap2FormatLedgerPanel` now exposes `로드맵 2 포맷 추정 ledger`.
- The table has 8 rows:
  - archive container formats
  - CNS decode and image payloads
  - tilemap and map assembly surface
  - savedata semantic coverage
  - event VM opcode subset
  - audio archive/title boundary
  - DirectX runtime surface
  - original collision/event semantics
- Summary: grounded 2, passed 1, partial 4, blocked 1, non-promoting.
- Browser marker:
  - `browserFormatRoadmap2LedgerImplemented=true`
  - `formatRoadmap2LedgerRowCount=8`
  - `formatRoadmap2LedgerCnsPayloadCount=377`
  - `formatRoadmap2LedgerSavedataKnownBytes=160`
  - `formatRoadmap2LedgerOpcodeRowCount=16`
  - `formatRoadmap2LedgerDirectDrawVerifiedCount=25`
  - `formatRoadmap2LedgerOriginalSemanticsBlocked=true`
  - `formatRoadmap2LedgerNonPromoting=true`
- This is a roadmap 2 visibility surface. It does not prove original collision/event semantics, selected-root execution, route promotion, or completion audit success.

### Dialogue Review: VM Replay Boundary

- `web/dialogue_review.html#dialogueReplayBoundaryPanel` now exposes `대사 VM replay 경계`.
- The table has 8 rows:
  - dialogue storage index
  - candidate dialogue playback
  - prototype completion/title restore
  - branch/control replay
  - render/style/cursor/object replay
  - literal/input-wait replay
  - route-linked original dispatch
  - full original VM/story/battle
- Summary: grounded 1, passed 2, partial 3, missing 2, non-promoting.
- Browser marker:
  - `browserDialogueReplayBoundaryImplemented=true`
  - `dialogueReplayBoundaryRowCount=8`
  - `dialogueReplayBoundaryGroundedRowCount=1`
  - `dialogueReplayBoundaryPassedRowCount=2`
  - `dialogueReplayBoundaryPartialRowCount=3`
  - `dialogueReplayBoundaryMissingRowCount=2`
  - `dialogueReplayBoundaryBranchStepCount=62`
  - `dialogueReplayBoundaryLiteralEventCount=7`
  - `dialogueReplayBoundaryRouteLinkedOriginalMissing=true`
  - `dialogueReplayBoundaryFullOriginalVmMissing=true`
  - `dialogueReplayBoundaryNonPromoting=true`
- Latest home browser smoke summary includes `dialogueReplayBoundary=8/3/2`.
- This is a roadmap 5/8 visibility surface for what the browser-local dialogue replay covers. It does not prove route-linked original event VM execution, original story flag mutation, event-driven battle entry, full browser event VM, or completion audit success.

### Object Review: Save/Object Runtime Boundary

- `web/object_position_review.html#objectRuntimeBoundaryPanel` now exposes `세이브/오브젝트 runtime 경계`.
- The table has 8 rows:
  - save-point candidate index
  - save-point browser runtime
  - object inspection runtime
  - object collision runtime
  - linked dialogue/battle runtime
  - original save-point dispatch
  - original object dispatch
  - story/route state binding
- Summary: passed 4, candidate 1, missing 3, non-promoting.
- Browser marker:
  - `browserObjectRuntimeBoundaryImplemented=true`
  - `objectRuntimeBoundaryRowCount=8`
  - `objectRuntimeBoundaryPassedRowCount=4`
  - `objectRuntimeBoundaryCandidateRowCount=1`
  - `objectRuntimeBoundaryMissingRowCount=3`
  - `objectRuntimeBoundarySavePointCandidateCount=8`
  - `objectRuntimeBoundarySceneLinkedObjectCount=7`
  - `objectRuntimeBoundaryLinkedDialogueCount=3`
  - `objectRuntimeBoundaryBattleVictoryCount=3`
  - `objectRuntimeBoundaryRouteLinkedMissing=true`
  - `objectRuntimeBoundaryStoryFlagMissing=true`
  - `objectRuntimeBoundaryNonPromoting=true`
- Latest home browser smoke summary includes `objectRuntimeBoundary=8/1/3`.
- This is a roadmap 5/8 visibility surface for browser-local save/object candidate runtime coverage. It does not prove original save-point event dispatch, original object/NPC runtime, route/story state binding, selected-root runtime proof, or completion audit success.

### Progress Verification Ledger

- `web/progress.html` now includes `검증/운영 ledger`.
- The ledger has 6 passed rows:
  - fixed test port `8013`
  - `python3 -m py_compile tools/summarize_savedata_offset_triage_clusters.py tools/build_web_assets.py tools/verify_home_landing_browser.py tools/verify_web_assets.py tools/verify_runtime_http.py`
  - `git diff --check -- web/index.html web/progress.html web/system_review.html web/monster_review.html web/battle_analysis.html tools/summarize_savedata_offset_triage_clusters.py tools/build_web_assets.py tools/verify_home_landing_browser.py tools/verify_web_assets.py docs/GOAL.md docs/HANDOFF.md`
  - `python3 tools/verify_runtime_http.py --base http://127.0.0.1:8013`
  - `python3 tools/verify_web_assets.py`
  - `xvfb-run -a python3 tools/verify_home_landing_browser.py --base http://127.0.0.1:8013`
- Browser marker:
  - `browserProgressVerificationLedgerImplemented=true`
  - `progressVerificationLedgerRowCount=6`
  - `progressVerificationLedgerPassedCount=6`
  - `progressVerificationLedgerFixedPort=8013`
  - `progressVerificationLedgerGoalAchievedFalse=true`
  - `progressVerificationLedgerHomeSmokeHref=../out/home_landing_browser_smoke.json`
- This makes the handoff checks visible in the web UI. It does not change `achieved=false`, hard blockers, or route promotion status.

### Progress 08:00 KST Wrap Checklist

- `web/progress.html` now includes `08:00 KST 마무리 체크리스트`.
- The checklist has 7 pending rows:
  - stop broad feature work at 2026-06-11 08:00 KST
  - finish the current edit
  - rerun the verification-ledger commands
  - update `docs/HANDOFF.md` and `docs/GOAL.md`
  - recheck `goal_completion_checklist` and `completion_audit`
  - keep/confirm fixed port `8013`
  - report actual completion state and remaining external proof
- Browser marker:
  - `browserProgressKstWrapChecklistImplemented=true`
  - `progressKstWrapChecklistRowCount=7`
  - `progressKstWrapChecklistStartKst=2026-06-11 08:00 KST`
  - `progressKstWrapChecklistFixedPortIncluded=true`
  - `progressKstWrapChecklistFinalReportIncluded=true`
- This is an operating checklist for the user-requested token-reset window. It does not mark the goal complete by audit.

### Home Landing: Recent Verified Work Table

- `web/index.html` now includes a normal admin table named `최근 검증된 작업`.
- The table has 18 rows:
  - progress handoff: `progress.html#evidenceHandoffPanel`
  - browser runtime slice matrix: `progress.html#runtimeSliceMatrixPanel`
  - completion audit status: `completion_review.html`
  - event VM opcode coverage: `format_review.html#opcodeCoveragePanel`
  - event VM operand/layout gap: `format_review.html#opcodeLayoutGapPanel`
  - original event runtime boundary: `event_review.html#eventRuntimeBoundaryPanel`
  - dialogue VM replay boundary: `dialogue_review.html#dialogueReplayBoundaryPanel`
  - save/object runtime boundary: `object_position_review.html#objectRuntimeBoundaryPanel`
  - menu/shop runtime boundary: `menu_review.html#menuRuntimeBoundaryPanel`
  - map source/assembly coverage: `map_gallery.html`
  - collision/tile class coverage: `collision_review.html`
  - battle proof matrix: `battle_analysis.html`
  - asset workbench split: `legacy aggregate asset workbench (removed)`
  - WLK/MLK archive restoration: `audio_review.html`
  - battle runtime review link: `battle_analysis.html?candidate=event-dialogue-block-015%3Abtl_b1`
  - monster battle review backlinks: `monster_review.html`
  - battle numeric/formula boundary: `battle_analysis.html`
  - system save/equipment/status offset boundary: `system_review.html` plus focused value matrix: `system_review.html#systemOffsetValueMatrixPanel`
- The existing quick review progress row and `progress.html#evidenceHandoffPanel` now report `local 23 / external 4`; the recent-work progress row also points users to the runtime matrix, completion audit status, VM opcode/layout gap, dialogue replay, object runtime, menu runtime, and verification-ledger context.
- Browser marker:
  - `browserHomeRecentVerifiedWorkImplemented=true`
  - `browserHomeRecentWorkAdminTable=true`
  - `browserHomeRecentWorkLinksImplemented=true`
  - `recentWorkRowCount=18`
  - `recentWorkRuntimeMatrixHref=progress.html#runtimeSliceMatrixPanel`
  - `recentWorkCompletionAuditHref=completion_review.html`
  - `recentWorkFormatOpcodeLayoutHref=format_review.html#opcodeLayoutGapPanel`
  - `recentWorkEventRuntimeHref=event_review.html#eventRuntimeBoundaryPanel`
  - `recentWorkFormatOpcodeHref=format_review.html#opcodeCoveragePanel`
  - `recentWorkDialogueReplayHref=dialogue_review.html#dialogueReplayBoundaryPanel`
  - `recentWorkObjectRuntimeHref=object_position_review.html#objectRuntimeBoundaryPanel`
  - `recentWorkMenuRuntimeHref=menu_review.html#menuRuntimeBoundaryPanel`
  - `recentWorkMapSourceCoverageHref=map_gallery.html`
  - `recentWorkCollisionCoverageHref=collision_review.html`
  - `recentWorkAudioTitleHref=audio_review.html?wlk=45`
  - `recentWorkSystemOffsetHref=system_review.html`
  - `recentWorkMonsterScopeAllHref=monster_review.html?scope=all`
  - `recentWorkMonsterScopeCandidateHref=monster_review.html?scope=candidate`
  - `recentWorkSystemOffsetRouteControlHref=system_review.html#systemOffsetRouteControlMatrixPanel`
  - `recentWorkSystemOffsetValueMatrixHref=system_review.html#systemOffsetValueMatrixPanel`
  - `recentWorkSystemOffsetPairDecodeHref=system_review.html#systemOffsetPairDecodePanel`
  - `recentWorkSystemOffsetNameCoverageHref=system_review.html#systemOffsetEquipmentNameCoveragePanel`
  - `recentWorkSystemOffsetTargetedDeltaHref=system_review.html#systemOffsetTargetedDeltaPlanPanel`
  - `recentWorkMonsterReviewHref=monster_review.html`
  - `recentWorkBattleNumericHref=battle_analysis.html`
- This keeps the landing page as a plain web/admin view while surfacing what was just verified. It does not change route promotion, original enemy AI, or completion audit status.

### Menu Review: Runtime Boundary

- `web/menu_review.html` now includes `메뉴/상점 runtime 경계`.
- The table has 8 rows:
  - candidate menu smokes
  - shop prototype transaction
  - party prototype join/trail
  - skill/status savedata review
  - equipment prototype effects
  - original shop/inventory/money
  - original equipment/status offsets
  - original story/party/combat runtime
- Current summary: `passed 5 · partial 0 · missing 3 · non-promoting`.
- Browser marker:
  - `browserMenuRuntimeBoundaryImplemented=true`
  - `menuRuntimeBoundaryRowCount=8`
  - `menuRuntimeBoundaryPassedRowCount=5`
  - `menuRuntimeBoundaryMissingRowCount=3`
  - `menuRuntimeBoundaryCandidateSmokePassedCount=5`
  - `menuRuntimeBoundaryShopItemCount=6`
  - `menuRuntimeBoundaryEquipmentCandidateCount=18`
  - `menuRuntimeBoundarySavedatSkillLearnedCount=6`
  - `menuRuntimeBoundarySavedatSkillTotalCount=24`
  - `menuRuntimeBoundaryStatusMemberCount=3`
  - `menuRuntimeBoundaryOriginalShopMissing=true`
  - `menuRuntimeBoundaryOriginalOffsetsMissing=true`
  - `menuRuntimeBoundaryOriginalStoryCombatMissing=true`
  - `menuRuntimeBoundaryNonPromoting=true`
- `web/progress.html#evidenceHandoffPanel` includes `menu-shop-runtime-boundary`; after the completion audit and opcode layout gap rows, the handoff table is `27 rows · local 23 / external 4`.
- This is a visibility boundary for browser-local shop/party/skill/equipment/status work. It does not prove original shop dispatch, inventory/money mutation, original equipment/status/story offsets, party/story/combat runtime proof, route promotion, or completion.

### Home Landing: Asset Split Status Table

- `web/index.html` now includes a normal admin table named `자산 분리 현황`.
- The table has 6 rows:
  - map source file: `../extract_fld/map1_02b.cns`
  - assembled map review: `map_review.html?map=map1_02b&visualFilter=layer1UnderSceneTilesets&tileIndexFilter=row40_zero`
  - monster sprite source: `monster_review.html?asset=zk_big`
  - monster attack frames: `monster_review.html?asset=zk_big&attack=special-or-reaction`
  - battle numeric/formula evidence: `../out/original_battle_numeric_context.html`
  - audio title provenance: `../out/audio_title_provenance.html`
- Browser marker:
  - `browserHomeAssetSplitStatusImplemented=true`
  - `browserHomeAssetSplitAdminTable=true`
  - `browserHomeAssetSplitLinksImplemented=true`
  - `assetSplitRowCount=6`
- Latest home smoke summary now includes `assetSplitRows=6`.
- This addresses the request to see map source-vs-assembled output and monster source-vs-attack-frame review from the admin landing. It does not promote route execution, enemy AI, combat formulas, or completion status.

### Monster Review: Extraction Coverage Table

- `web/monster_review.html` now includes `몬스터 추출 범위`.
- The table separates the full extracted gallery from battle-review-linked candidates:
  - extracted enemy/object sprites: 65
  - enemy sprite assets: 58
  - object sprite assets: 7
  - source-linked battle candidates: 8 unique sprites / 21 candidate rows
  - promoted original enemy rows: 0
- The coverage table now has direct scope links:
  - full extracted scope: `monster_review.html?scope=all`
  - source-linked candidate scope: `monster_review.html?scope=candidate`
- Browser marker:
  - `browserMonsterExtractionCoverageImplemented=true`
  - `monsterCoverageRowCount=5`
  - `monsterCoverageExtractedSpriteCount=65`
  - `monsterCoverageEnemySpriteCount=58`
  - `monsterCoverageObjectSpriteCount=7`
  - `monsterCoverageSourceLinkedSpriteCount=8`
  - `monsterCoverageBattleCandidateRowCount=21`
  - `monsterCoverageScopeLinkCount=2`
  - `monsterCoverageAllScopeHref=monster_review.html?scope=all`
  - `monsterCoverageCandidateScopeHref=monster_review.html?scope=candidate`
- This makes clear that the small battle-candidate subset is not the complete monster gallery. It does not prove original enemy rows, stats, AI, rewards, formulas, or battle-entry execution.

### Game Runtime: Battle Enemy Attack Review HUD

- `web/game.html` battle runtime now draws a compact enemy attack review panel under the enemy HP panel.
- The panel shows the current enemy sprite asset, selected attack candidate title, and frame run, for example `zky_ao` / `할퀴기` / `#0 #1 #2 #3`.
- New browser marker:
  - `window.HWANSE_LAST_BATTLE_ENEMY_ATTACK_REVIEW`
  - `source=battle-enemy-attack-review-hud`
  - `browserBattleEnemyAttackReviewHudImplemented=true`
  - `prototypeMonsterAttackFrameRuntimeImplemented=true`
  - `originalAttackSequenceBound=false`
  - `originalEnemyAiImplemented=false`
- `tools/verify_candidate_battle_browser.py` now verifies this marker during the real pointer-driven battle attack smoke.
- Verified sample produced by `tools/verify_candidate_battle_browser.py`: action `primary-command`, title `할퀴기`, frames `[0,1,2,3]`, asset `zky_ao`. Keep the raw smoke JSON as a verifier output, not as an active web/build/audit dependency.
- Battle scenes now expose direct runtime review links:
  - `battle_analysis.html?candidate=event-dialogue-block-015%3Abtl_b1`
  - `monster_review.html?asset=zky_ao&attack=primary-command`
- Link marker:
  - `window.HWANSE_LAST_BATTLE_REVIEW_LINKS`
  - `source=battle-runtime-review-links`
  - `browserBattleRuntimeReviewLinksImplemented=true`
  - `visible=true`
  - `originalEventDrivenBattleEntry=false`
  - `originalEnemyAiImplemented=false`
- This advances roadmap items 6/8 by making the playable battle prototype expose which extracted monster frames are active. It remains a browser prototype and does not prove original enemy AI, original attack sequencing, original combat formulas, or route completion.

### Battle Review: Runtime HUD/Link Evidence Matrix

- `web/battle_analysis.html` now pulls the pointer-driven battle smoke snapshot for the runtime enemy attack HUD and review links.
- `전투 proof matrix` now has 12 rows instead of 10.
- New passed rows:
  - `browser-enemy-attack-review-hud`
  - `battle-runtime-review-links`
- Browser marker additions on `HWANSE_LAST_BATTLE_REVIEW_RENDER`:
  - `browserBattleEnemyAttackReviewHudVerified=true`
  - `battleEnemyAttackReviewAsset=zky_ao`
  - `battleEnemyAttackReviewActionId=primary-command`
  - `battleEnemyAttackReviewFrames=0,1,2,3`
  - `battleRuntimeReviewLinksVerified=true`
  - `battleRuntimeReviewLinkHref=battle_analysis.html?candidate=event-dialogue-block-015%3Abtl_b1`
  - `battleRuntimeMonsterReviewLinkHref=monster_review.html?asset=zky_ao&attack=primary-command`
- Latest browser smoke confirms `grounded 2 · passed 6 · candidate 1 · missing 3`.
- `tools/verify_home_landing_browser.py` now verifies both direct battle review URL shapes:
  - sprite direct: `battle_analysis.html?sprite=zk_big`
  - candidate direct: `battle_analysis.html?candidate=event-dialogue-block-015%3Abtl_b1`
- The candidate direct row now resolves the nearest enemy sprite candidate and links to `monster_review.html?asset=zky_ao&attack=primary-command`.
- This is an admin evidence-surface improvement for the runtime prototype. It does not prove original enemy AI, original attack sequence binding, original combat formula, event-driven battle entry, or route promotion.

### Monster Review: Battle Candidate Backlinks

- `web/monster_review.html` now links source-backed monster rows back to the exact battle candidate review page.
- The selected monster info panel shows `전투 후보 검토` when the sprite is backed by extracted battle candidate data.
- The candidate table links each source-backed candidate to `battle_analysis.html?candidate=...` in addition to the existing runtime battle launch link.
- The full attack overview still keeps 65 runtime battle launch links, and adds 8 separate battle-review links for the 8 source-linked monster rows.
- Latest browser smoke confirms:
  - default selected monster `boss_2`
  - selected review link `battle_analysis.html?candidate=event-dialogue-block-041%3Abtl_a1`
  - selected candidate review link count `2`
  - attack overview battle review link count `8`
  - direct `zk_big` monster page remains sprite-only with no selected source-backed candidate link.
- Browser marker:
- `browserMonsterBattleReviewLinksImplemented=true`
  - `selectedBattleReviewCandidateId=event-dialogue-block-041:btl_a1`
  - `selectedBattleReviewHref=battle_analysis.html?candidate=event-dialogue-block-041%3Abtl_a1`
  - `candidateBattleReviewLinkCount=2`
  - `attackOverviewBattleReviewLinkCount=8`
- This closes the admin review loop between `battle_analysis.html` and `monster_review.html`. It does not prove original enemy rows, original attack sequencing, original enemy AI, combat formulas, event-driven battle entry, or route promotion.

### Battle Review: Numeric/Formula Boundary

- `web/battle_analysis.html` now includes `원본 전투 수치/공식 경계` at `battle_analysis.html#battleNumericBoundaryPanel`.
- `web/battle_analysis.html#numericTriagePanel` anchors the 16-row numeric triage table.
- `web/index.html` recent verified work links the battle numeric row to `battle_analysis.html#battleNumericBoundaryPanel`, `../out/original_battle_numeric_context.html`, and `battle_analysis.html#numericTriagePanel`.
- `web/progress.html#localRoadmapQueuePanel` and `web/progress.html#evidenceHandoffPanel` expose the same focused battle numeric review anchors without promoting descriptor-local numbers.
- The table has 6 rows:
  - descriptor context scan
  - candidate background/enemy pairs
  - descriptor-local numeric runs
  - numeric promotion blocker
  - enemy/reward row promotion
  - combat formula runtime proof
- Latest browser smoke confirms:
  - descriptor contexts `123`
  - candidate pairs `21`
  - close pairs `9`
  - plain numeric runs `32`
  - local run pairs `16`
  - close local run pairs `8`
  - promotable enemy rows `0`
  - promotable reward rows `0`
  - blocker `descriptor-context-only-no-handler-row-stride-or-runtime-edge`
- Browser marker:
  - `browserBattleNumericBoundaryTableImplemented=true`
  - `battleNumericBoundaryRowCount=6`
  - status counts `grounded/candidate/blocked/missing = 1/2/1/2`
  - `battleNumericBoundaryNonPromoting=true`
  - `battleNumericBoundaryPanelHref=battle_analysis.html#battleNumericBoundaryPanel`
  - `battleNumericTriagePanelHref=battle_analysis.html#numericTriagePanel`
- This gives the original battle numeric/formula gap a compact review surface. It does not promote descriptor-local numbers into enemy stats, rewards, formations, combat formulas, or original battle entry proof.

### System Review: Save/Equipment/Status Offset Boundary

- `web/system_review.html` now includes `세이브 장비/상태 오프셋 경계`.
- The table has 6 rows:
  - `known-editor-save-fields`
  - `selector-2-0-route-critical`
  - `equipment-ownership-offsets`
  - `equipment-effect-runtime`
  - `status-flag-offsets`
  - `story-event-flag-runtime`
- Latest browser smoke confirms:
  - row count `6`
  - status counts `grounded/passed/partial/missing = 1/1/1/3`
  - known semantic bytes `160/1274`
  - unknown varying ranges `87`
  - equipment evidence status `offsets-unmapped`
- Browser marker:
  - `browserSystemOffsetBoundaryTableImplemented=true`
  - `systemOffsetBoundaryRowCount=6`
  - `systemOffsetBoundaryKnownSemanticByteCount=160`
  - `systemOffsetBoundaryUnknownVaryingRangeCount=87`
  - `systemOffsetBoundaryNonPromoting=true`
- This makes the candidate equipment/status UI and the missing original save offsets readable in one table. It does not prove original ownership/equipped-slot offsets, status flag offsets, story/event flag writers, selector `2:0` captured savedata, or route promotion.

### System Review: Save Offset Triage Queue

- `web/system_review.html#systemOffsetTriageQueuePanel` now includes `세이브 오프셋 triage 큐`.
- The table has 6 local work rows:
  - `known-semantic-calibration`
  - `route-critical-selector-gap`
  - `equipment-ownership-offsets`
  - `status-flag-offsets`
  - `story-event-writer-offsets`
  - `unknown-varying-range-clusters`
- Latest browser smoke confirms:
  - row count `6`
  - status counts `grounded/partial/candidate/missing = 1/1/1/3`
  - known semantic bytes `160`
  - unknown varying ranges `87`
  - route-critical offsets `11`
  - selector `2:0` expected missing `1`
  - equipment offsets still `offsets-unmapped`
- Browser marker:
  - `browserSystemOffsetTriageQueueImplemented=true`
  - `systemOffsetTriageQueueRowCount=6`
  - `systemOffsetTriageQueueGroundedRowCount=1`
  - `systemOffsetTriageQueuePartialRowCount=1`
  - `systemOffsetTriageQueueCandidateRowCount=1`
  - `systemOffsetTriageQueueMissingRowCount=3`
  - `systemOffsetTriageQueueKnownSemanticByteCount=160`
  - `systemOffsetTriageQueueUnknownVaryingRangeCount=87`
  - `systemOffsetTriageQueueRouteCriticalOffsetCount=11`
  - `systemOffsetTriageQueueEquipmentOffsetsUnmapped=true`
  - `systemOffsetTriageQueueStatusFlagsMissing=true`
  - `systemOffsetTriageQueueStoryFlagsMissing=true`
  - `systemOffsetTriageQueueNonPromoting=true`
- This gives roadmap 8 a concrete next-local-work queue for save/equipment/status offsets. It does not prove original equipment ownership offsets, status flag writers, story/event flag mutation, selector `2:0` captured savedata, selected-root runtime execution, route promotion, or goal completion.

### Savedata Offset Cluster Report

- Added `tools/summarize_savedata_offset_triage_clusters.py`.
- `tools/build_web_assets.py` now regenerates this report after `savedata_sample_coverage` and `savedata_sample_deltas`.
- Outputs:
  - `out/savedata_offset_triage_clusters.json`
  - `out/savedata_offset_triage_clusters.md`
  - `out/savedata_offset_triage_clusters.html`
- `web/system_review.html#systemOffsetClusterPanel` renders the bucket summary from that JSON.
- `web/system_review.html#systemOffsetValueMatrixPanel` renders the inventory/equipment candidate value matrix from the same JSON.
- Latest browser smoke confirms:
  - bucket count `4`
  - unknown varying ranges `87`
  - unknown varying bytes `248`
  - candidate ranges `80`
  - partial route/control ranges `7`
  - `skill-status-candidate=45`
  - `character-status-candidate=31`
  - `route-selector-control=7`
  - `inventory-equipment-candidate=4`
  - route selector/control value rows `7`
  - inventory/equipment value rows `4`
  - value matrix samples `6`
  - distinct inventory/equipment ranges `4`
  - longest inventory/equipment candidate range `0x0022-0x0037`
  - pair decode rows `2`
  - 1-based equipment id hits `9`
  - 0-based equipment id hits `9`
  - 1-based item id hits `1`
  - 0-based item id hits `2`
  - equipment/item name coverage rows `2`
- Browser marker:
  - `browserSystemOffsetClusterReviewImplemented=true`
  - `systemOffsetClusterBucketCount=4`
  - `systemOffsetClusterRangeCount=87`
  - `systemOffsetClusterByteCount=248`
  - `systemOffsetClusterCandidateRangeCount=80`
  - `systemOffsetClusterPartialRangeCount=7`
  - `systemOffsetClusterRouteSelectorControlRangeCount=7`
  - `systemOffsetClusterInventoryEquipmentRangeCount=4`
  - `systemOffsetClusterSkillStatusRangeCount=45`
  - `systemOffsetClusterCharacterStatusRangeCount=31`
  - `systemOffsetClusterNonPromoting=true`
  - `browserSystemOffsetRouteControlMatrixImplemented=true`
  - `systemOffsetRouteControlMatrixRowCount=7`
  - `systemOffsetRouteControlMatrixDistinctRangeCount=7`
  - `systemOffsetRouteControlMatrixRequiresSelector20Save=true`
  - `systemOffsetRouteControlMatrixNonPromoting=true`
  - `browserSystemOffsetValueMatrixImplemented=true`
  - `systemOffsetValueMatrixRowCount=4`
  - `systemOffsetValueMatrixSampleCount=6`
  - `systemOffsetValueMatrixDistinctRangeCount=4`
  - `systemOffsetValueMatrixLongestRangeHex=0x0022-0x0037`
  - `systemOffsetValueMatrixNonPromoting=true`
  - `browserSystemOffsetPairDecodeImplemented=true`
  - `systemOffsetPairDecodeRowCount=2`
  - `systemOffsetPairDecodeOneBasedHitCount=9`
  - `systemOffsetPairDecodeZeroBasedHitCount=9`
  - `systemOffsetPairDecodeOneBasedItemHitCount=1`
  - `systemOffsetPairDecodeZeroBasedItemHitCount=2`
  - `systemOffsetPairDecodeLongestRangeHex=0x0022-0x0037`
  - `systemOffsetPairDecodeCandidateBasis=one-based equipment table candidate`
  - `systemOffsetPairDecodeNonPromoting=true`
  - `browserSystemOffsetEquipmentNameCoverageImplemented=true`
  - `systemOffsetEquipmentNameCoverageRowCount=2`
  - `systemOffsetEquipmentNameCoverageOneBasedHitCount=9`
  - `systemOffsetEquipmentNameCoverageZeroBasedHitCount=9`
  - `systemOffsetEquipmentNameCoverageOneBasedItemHitCount=1`
  - `systemOffsetEquipmentNameCoverageZeroBasedItemHitCount=2`
  - `systemOffsetEquipmentNameCoverageMenuHref=menu_review.html?panel=equipment`
  - `systemOffsetEquipmentNameCoverageRuntimeHref=game.html?map=map2_02d&startTile=11%2C12&publicSave=flack3r-savedat2&menu=equipment`
  - `systemOffsetEquipmentNameCoverageNonPromoting=true`
  - `browserSystemOffsetTargetedDeltaPlanImplemented=true`
  - `systemOffsetTargetedDeltaPlanRowCount=5`
  - `systemOffsetTargetedDeltaPlanRequiresChangedSaves=true`
  - `systemOffsetTargetedDeltaPlanPairDecodeHref=system_review.html#systemOffsetPairDecodePanel`
  - `systemOffsetTargetedDeltaPlanEquipmentRuntimeHref=game.html?map=map2_02d&startTile=11%2C12&publicSave=flack3r-savedat2&menu=equipment`
  - `systemOffsetTargetedDeltaPlanNonPromoting=true`
- This narrows roadmap 8 local work: route selector/control has 7 public-sample value rows to compare against a future selector `2:0` save, inventory/equipment has 4 public-sample-varying ranges to inspect first, and the value matrix shows selector-grouped bytes for each. `0x0022-0x0037` is the longest candidate and contains nonzero 2-byte pair patterns in selector `22:0`, but this is still proximity/delta triage only, not original writer proof, not selector `2:0` proof, and not route promotion.
- Pair decode candidate detail: `0x0022-0x0037` has 11 pairs and 8 unique one-based equipment-id hits in that range; examples include `청룡도`, `불타는 마검 !`, `그레이트소드 )`, `마인아수라 2`, and `투신의 갑옷`. The adjacent short range also overlaps the item table with candidates such as `약초`. Some ids remain unmapped, and one-based vs zero-based ambiguity is deliberately not promoted.
- The equipment/item name coverage panel is a navigation/triage aid only: it links candidate names to the existing equipment menu review/runtime, but it still does not prove ownership/equipped-slot offsets, original save writer behavior, item ownership, or original equipment effect formulas.
- `web/progress.html#evidenceHandoffPanel` also records `progressEvidenceHandoffSystemOffsetValueMatrixHref=system_review.html#systemOffsetValueMatrixPanel` so the handoff table enters the focused value matrix directly.

### Asset Viewer: Map/Monster Workbench Split

- `legacy aggregate asset workbench (removed)` asset workbench now has 7 rows instead of 5.
- Map review is split into source-file inspection and assembled-map inspection:
  - source row links to `../extract_fld/map1_02b.cns` and `../out/maps_runtime_chunks/map1_02b.js`; the old tile review page was removed in favor of `map_review.html`/`collision_review.html`.
  - assembled row links to `map_review.html?map=map1_02b&visualFilter=layer1UnderSceneTilesets&tileIndexFilter=row40_zero`, `map_gallery.html?map=map1_02b&scope=accepted`, and `game.html?map=map1_02b&startTile=11%2C12&collision=1`
- Monster review is split into sprite-source inspection and attack-frame inspection:
  - source row links to `monster_review.html?asset=zk_big`, `monster_review.html?scope=enemy`, and `monster_review.html?scope=object`
  - attack row links to `monster_review.html`, `monster_review.html?asset=zk_big&attack=special-or-reaction`, and `battle_analysis.html`
- Browser marker:
  - `browserAssetWorkbenchMapMonsterSplitImplemented=true`
  - `workbenchRowCount=7`
  - `assetWorkbenchMapSourceHref=../extract_fld/map1_02b.cns`
  - `assetWorkbenchMapGalleryHref=map_gallery.html?map=map1_02b&scope=accepted`
  - `assetWorkbenchMonsterAttackFramesHref=monster_review.html?asset=zk_big&attack=special-or-reaction`
- This addresses the admin visibility request for source-vs-assembled maps and monster source-vs-attack-frame review. It does not prove original route execution, enemy AI, or battle-system parity.

### Event Review: Runtime Flow Boundary

- `web/event_review.html` now includes `원본 실행 흐름 경계`.
- The table separates 8 runtime-flow boundaries:
  - grounded: event/object dispatch table and text/control opcode subset
  - passed browser evidence: partial dialogue replay
  - missing original flow: route-linked dialogue dispatch, event-driven battle entry, original save-point runtime, original object/NPC runtime, and original story flag mutation
- Browser marker:
  - `browserEventRuntimeBoundaryImplemented=true`
  - `eventRuntimeBoundaryRowCount=8`
  - status counts `grounded/passed/missing = 2/1/5`
  - `eventRuntimeBoundaryDispatchTableVaHex=0x0047f1d8`
  - `eventRuntimeBoundaryRouteLinkedCommandCount=2`
  - `eventRuntimeBoundaryRouteLinkedPointerOverlap=true`
  - `eventRuntimeBoundaryBattleCandidateCount=21`
  - `eventRuntimeBoundarySaveCandidateCount=8`
  - `eventRuntimeBoundaryObjectCandidateCount=10`
  - `eventRuntimeBoundaryNonPromoting=true`
- This advances work-order item 5 by keeping original execution-flow evidence visible without promoting route-linked event VM execution, battle entry, save-point/object runtime, or story mutation.

### Format Review: Event VM Promotion Boundary

- `web/format_review.html` now includes `event VM promotion boundary`.
- The table has 8 rows: 1 partial browser known-opcode replay row and 7 missing original-promotion gate rows.
- Missing gates remain `fullInstructionLengthDecode`, `fullOperandLayoutDecode`, `routeLinkedEventVmExecution`, `sceneEventDialogueBinding`, `originalStoryFlagMutation`, `fullBrowserEventVmImplementation`, and `eventDrivenBattleEntry`.
- Browser marker:
  - `browserFormatVmPromotionBoundaryImplemented=true`
  - `formatVmPromotionBoundaryRowCount=8`
  - status counts `partial/missing = 1/7`
  - `formatVmPromotionBoundaryRequiredGateRowCount=7`
  - `formatVmPromotionBoundaryPromotesOriginalVm=false`
  - `formatVmPromotionBoundaryAllGatesPassed=false`
  - `eventVmPromotionBoundaryNonPromoting=true`
- This advances work-order item 2 by making the binary/VM partial state visible. It does not complete full event VM decode, route-linked event dispatch, original story flag mutation, or event-driven battle entry.

### Home Landing: Boundary Quick Links

- `web/index.html` quick review now has 15 direct links instead of 11.
- Added direct admin links to `audio_review.html#audioRuntimeBoundaryPanel`, `savedata_review.html#savedataOffsetBoundaryPanel`, `format_review.html#vmPromotionBoundaryPanel`, and `event_review.html#eventRuntimeBoundaryPanel`.
- Added matching anchors to `web/audio_review.html` and `web/savedata_review.html`.
- `HWANSE_LAST_HOME_RENDER` now exposes `quickReviewAudioRuntimeHref`, `quickReviewSavedataOffsetHref`, `quickReviewFormatVmHref`, `quickReviewEventRuntimeHref`, `browserHomeQuickReviewBoundaryLinksImplemented=True`, and `browserHomeQuickReviewExecutionBoundaryLinksImplemented=True`.
- This is a navigation/progress visibility improvement only. It does not promote original DirectSound/WinMM playback, original savedata equipment/status/story offsets, selector `2:0`, or route completion proof.

### Format Review: Win32/DirectX Boundary

`web/format_review.html` now includes `Win32/DirectX 런타임 경계`.

Evidence surfaced there:

- EXE import surface: `DDRAW.dll`, `DINPUT.dll`, `DSOUND.dll`, `WINMM.dll`, `MSVFW32.dll`.
- API entry points: `DirectDrawCreate`, `DirectInputCreateA`, `DirectSoundCreate`.
- DirectDraw display: `640x480x8`.
- DirectInput keyboard state: `0x0055b868`, 2 action tables, 16 primary action groups.
- Runtime timing: `GetTickCount`, 48 ms frame interval.
- Browser movement mapping: 192 ms tile step.
- Original runtime parity remains `false`.

Browser marker:

- `browserFormatWin32RuntimeBoundaryImplemented=true`
- `formatWin32RuntimeBoundaryRowCount=8`
- status counts `grounded/passed/partial/missing = 4/1/2/1`

### Format Review: DirectDraw Call Sequence

`web/format_review.html` now includes `DirectDraw 호출 시퀀스`.

Evidence surfaced there:

- 25 DirectDraw-related vtable calls from `out/directdraw_flow.json`.
- 25/25 calls verified.
- Method counts:
  - `Blt`: 6
  - `Flip`: 1
  - `CreateSurface`: 4
  - palette calls: 6
- VA range includes first observed call `0x00415660` and last observed call `0x00417bdf`.
- This is non-promoting evidence: original draw ordering, dirty-rect invalidation, and full surface composition are still incomplete.

Browser marker:

- `browserFormatDirectDrawCallSequenceImplemented=true`
- `formatDirectDrawCallSequenceRowCount=25`
- `formatDirectDrawCallSequenceVerifiedRowCount=25`
- `directDrawBltCallCount=6`
- `directDrawFlipCallCount=1`
- `directDrawCreateSurfaceCallCount=4`
- `directDrawPaletteCallCount=6`
- `directDrawDirtyRectOrderingComplete=false`

### DirectDraw Notes

`docs/DIRECTDRAW_NOTES.md` now mirrors the same 25-call sequence in a
`Verified Call Sequence` section. It also records the next renderer questions:

- classify each `Blt` call as whole-surface copy, dirty-rect invalidation, or windowed scaling;
- tie sprite/object draw records to the surface wrapper table;
- reconcile the `Flip` path and windowed `Blt` path with mode flags `0x004676d4` and selector `0x004676ec`.

### Format Review: DirectDraw Draw-Order Gap

`web/format_review.html` now includes `DirectDraw draw-order gap`.

The table separates:

- grounded setup evidence: surface wrappers, palette update path, presentation call sites;
- browser mapping evidence: `640x480x8` source assumptions scaled through canvas;
- partial gap: copy/update `Blt` 3 vs windowed/scaled `Blt` 3 roles;
- missing gap: full original draw ordering, dirty-rect invalidation, and surface composition.

Browser marker:

- `browserFormatDirectDrawDrawOrderGapImplemented=true`
- `formatDirectDrawDrawOrderGapRowCount=6`
- status counts `grounded/passed/partial/missing = 3/1/1/1`
- `directDrawCopyUpdateBltCallCount=3`
- `directDrawWindowedScaledBltCallCount=3`
- `directDrawFullCompositionProofFound=false`

### Progress Evidence Handoff

`web/progress.html` now includes `증거 경계/인수인계`.

The table separates:

- 23 local evidence rows: admin home/game-entry separation, home playable runtime slices, completion audit status, event VM opcode coverage, event VM operand/layout gap, dialogue VM replay boundary, save/object runtime boundary, menu/shop runtime boundary, map source/assembly coverage, collision/tile class coverage, Win32/DirectX boundary, event VM promotion boundary, event runtime flow boundary, original audio playback boundary, WLK/MLK archive restoration, savedata offset boundary, system save/equipment/status offset boundary, movement renderer/projection boundary, DirectDraw 25-call sequence, battle runtime attack HUD/review links, monster battle candidate backlinks, battle numeric/formula boundary, this handoff document.
- 4 external-input rows: hard blocker set, real selector `2:0` captured savedata, selected-root runtime trace, strict source coordinate/tile hotspot.
- 6 boundary handoff rows link directly to `format_review.html#vmPromotionBoundaryPanel`, `event_review.html#eventRuntimeBoundaryPanel`, `audio_review.html#audioRuntimeBoundaryPanel`, `savedata_review.html#savedataOffsetBoundaryPanel`, `system_review.html`, and `movement_review.html#rendererProjectionBoundaryPanel`.
- The map source/assembly row links to `web/map_gallery.html` and records 174/174 source CNS plus 174/174 accepted assembled render coverage, with route proof still `0`.
- The runtime-slice row links to `web/index.html#runtimeUtilityDetails` and records 16 browser-local links, with original parity and route proof still blocked.
- The VM opcode row links to `web/format_review.html#opcodeCoveragePanel` and records 16 rows, browser replay 4, variable length 1, literal storage 1, dispatcher verified, with full VM proof still blocked.
- The VM operand/layout gap row links to `web/format_review.html#opcodeLayoutGapPanel` and records 6 rows, grounded 4, partial 1, missing 1, and 1007 grounded control events, with full VM decode/runtime still blocked.
- The dialogue replay row links to `web/dialogue_review.html#dialogueReplayBoundaryPanel` and records 8 boundary rows, branch steps 62, literal events 7, and route-linked original dispatch/full event VM still missing.
- The object runtime row links to `web/object_position_review.html#objectRuntimeBoundaryPanel` and records 8 boundary rows, save candidates 8, scene-linked objects 7, linked dialogue/battle 3/3, and original save/object dispatch still missing.
- The menu/shop runtime row links to `web/menu_review.html#menuRuntimeBoundaryPanel` and records 8 boundary rows, passed 5, missing 3, candidate menu smokes 5/5, shop items 6, equipment candidates 18, skill 6/24, and original menu/system proof still missing.
- The completion audit status row links to `web/completion_review.html` and records proof matrix 8 rows, passed 3, partial 1, blocked 2, missing 2, `achieved=false`, and route promotion blocked. It is non-promoting status visibility, not proof of completion.
- The collision/tile class row links to `web/collision_review.html` and records 174 map coverage, average 97.77%, 59 full-coverage maps, and 1090 map tile class gap rows, with route collision proof still blocked.
- The WLK/MLK archive row links to `web/audio_review.html` and records WLK 54 verified PCM rows, MLK 20 verified SMF0 rows, WLK embedded `0`, browser cue provenance `9`, EXE id entries `45`, MLK embedded `16`, fallback `4`, raw WLK playback, and MLK soundfont smoke evidence.
- The battle runtime row links to `web/battle_analysis.html` and records the 12-row battle proof matrix with runtime HUD/link evidence.
- The monster backlink row links to `web/monster_review.html` and records the 8 source-linked battle review backlinks.
- The battle numeric row links to `web/battle_analysis.html`, `web/battle_analysis.html#battleNumericBoundaryPanel`, `web/battle_analysis.html#numericTriagePanel`, and `../out/original_battle_numeric_context.html`, and records descriptor/numeric evidence as non-promoting boundary evidence.
- The system offset row links to `web/system_review.html` and records known 160/1274, unknown varying ranges 87, and `equipment offsets-unmapped` as non-promoting boundary evidence.

Browser marker:

- `browserProgressEvidenceHandoffImplemented=true`
- `progressEvidenceHandoffRowCount=27`
- `progressEvidenceHandoffLocalRowCount=23`
- `progressEvidenceHandoffExternalRowCount=4`
- `progressEvidenceHandoffBoundaryRowsIncluded=true`
- `progressEvidenceHandoffBoundaryRowCount=6`
- `progressEvidenceHandoffPlayableSlicesIncluded=true`
- `progressEvidenceHandoffPlayableSlicesHref=index.html#runtimeUtilityDetails`
- `progressEvidenceHandoffDialogueReplayBoundaryIncluded=true`
- `progressEvidenceHandoffDialogueReplayBoundaryHref=dialogue_review.html#dialogueReplayBoundaryPanel`
- `progressEvidenceHandoffObjectRuntimeBoundaryIncluded=true`
- `progressEvidenceHandoffObjectRuntimeBoundaryHref=object_position_review.html#objectRuntimeBoundaryPanel`
- `progressEvidenceHandoffMenuRuntimeBoundaryIncluded=true`
- `progressEvidenceHandoffMenuRuntimeBoundaryHref=menu_review.html#menuRuntimeBoundaryPanel`
- `progressEvidenceHandoffCompletionAuditStatusIncluded=true`
- `progressEvidenceHandoffCompletionAuditHref=completion_review.html`
- `progressEvidenceHandoffFormatOpcodeCoverageIncluded=true`
- `progressEvidenceHandoffFormatOpcodeCoverageHref=format_review.html#opcodeCoveragePanel`
- `progressEvidenceHandoffFormatOpcodeLayoutGapIncluded=true`
- `progressEvidenceHandoffFormatOpcodeLayoutGapHref=format_review.html#opcodeLayoutGapPanel`
- `progressEvidenceHandoffMapSourceCoverageIncluded=true`
- `progressEvidenceHandoffMapSourceCoverageHref=map_gallery.html`
- `progressEvidenceHandoffCollisionTileCoverageIncluded=true`
- `progressEvidenceHandoffCollisionTileCoverageHref=collision_review.html`
- `progressEvidenceHandoffAudioTitleDiagnosticIncluded=true`
- `progressEvidenceHandoffAudioTitleDiagnosticHref=audio_review.html?wlk=45`
- `progressEvidenceHandoffBattleReviewRowsIncluded=true`
- `progressEvidenceHandoffMonsterReviewLinksIncluded=true`
- `progressEvidenceHandoffBattleNumericBoundaryIncluded=true`
- `progressEvidenceHandoffSystemOffsetBoundaryIncluded=true`
- `progressEvidenceHandoffNextInputCount=3`
- `progressEvidenceHandoffHardMissingCount=5`
- `progressEvidenceHandoffRouteBlocked=true`
- `progressEvidenceHandoffGoalAchieved=false`

### Movement Review: Renderer Projection Boundary

`web/movement_review.html` now includes `렌더러/투영 경계`.

The table separates:

- grounded projection evidence: tile/camera projection, dirty-rect helper consumer, party actor projection, source-rect selector cadence;
- browser-only evidence: interpolation overlay;
- partial gap: DirectDraw composition and dirty-rect scheduling;
- missing gap: original sub-tile interpolation writer/timing.

Browser marker:

- `browserMovementRendererProjectionBoundaryImplemented=true`
- `movementRendererBoundaryRowCount=7`
- status counts `grounded/browser-only/partial/missing = 4/1/1/1`
- `movementRendererBoundaryDrawRectHelperVaHex=0x00424cd6`
- `movementRendererBoundaryDrawRectBoundsVaHex=0x00416ce2`
- `movementRendererBoundaryProjectedDrawXFieldHex=+0x1c`
- `movementRendererBoundaryProjectedDrawYFieldHex=+0x20`
- `movementRendererBoundaryProjectedFrameSelectorFieldHex=+0x28`
- `movementRendererBoundaryNonPromoting=true`

### Audio Review: Original Playback Boundary

`web/audio_review.html` now includes `원본 런타임 플레이백 경계`.

The table separates:

- grounded EXE zero-based audio id evidence: WLK loader entry shape at `0x0042a5bb`, DirectSound buffer/WAVEFORMATEX path at `0x0042af73`, `DirectSoundCreate`, and WinMM MIDI stream imports;
- grounded title provenance split: WLK has no embedded effect names, MLK has embedded MIDI track-name titles only for 16/20 entries;
- passed browser evidence: raw WLK browser playback, MLK soundfont scheduling, and browser runtime cue smoke;
- missing original parity: DirectSound mixer/loop timing and WinMM MIDI playback timing/instrument/selection proof.

Browser marker:

- `browserAudioRuntimeBoundaryImplemented=true`
- `audioRuntimeBoundaryRowCount=8`
- status counts `grounded/passed/missing = 4/2/2`
- `audioRuntimeBoundaryWlkLoaderVaHex=0x0042a5bb`
- `audioRuntimeBoundaryDirectSoundBufferVaHex=0x0042af73`
- `audioRuntimeBoundaryDirectSoundCreateFound=true`
- `audioRuntimeBoundaryWinmmMidiFound=true`
- `audioRuntimeBoundaryDirectSoundMissing=true`
- `audioRuntimeBoundaryWinmmMidiMissing=true`
- `originalWinmmMidiPlaybackImplemented=false`

### Savedata Review: Semantic/Offset Boundary

`web/savedata_review.html` now includes `세이브 의미/오프셋 경계`.

The table separates:

- grounded calibration evidence: public savedata semantic coverage is 160/1274 known bytes and 1114 unknown bytes;
- grounded editor/runtime boundaries: legacy hwanedit has 46 stat controls but no selector/route proof, and the runtime loader is at `0x00423319` with selector store `0x004234ba` and selected pointer global `0x0059de30`;
- blocked selector evidence: route-critical bytes require `0x0002=0x02` and `0x0003=0x00`, and no public sample covers current selector `2:0` or the route pair;
- partial/missing offsets: unknown/varying ranges remain broad, and original equipment/status/story offsets are still unmapped.

Browser marker:

- `browserSavedataOffsetBoundaryImplemented=true`
- `savedataOffsetBoundaryRowCount=7`
- status counts `grounded/blocked/partial/missing = 3/2/1/1`
- `savedataKnownSemanticByteCount=160`
- `savedataUnknownByteCount=1114`
- `savedataLegacyEditorStatControlCount=46`
- `savedataRuntimeSaveLoaderVaHex=0x00423319`
- `savedataRuntimeSelectorStoreVaHex=0x004234ba`
- `savedataRuntimeSelectedPointerGlobalVaHex=0x0059de30`
- `savedataSelectorDistinguishingOffsetCount=102`
- `savedataOriginalEquipmentStatusStoryOffsetsMissing=true`

## Verification Commands Last Passing

Run from `/home/exedev/hwanse`.

```bash
python3 -m py_compile tools/summarize_savedata_offset_triage_clusters.py tools/build_web_assets.py tools/verify_home_landing_browser.py tools/verify_web_assets.py tools/verify_runtime_http.py
git diff --check -- web/index.html web/progress.html web/system_review.html web/monster_review.html web/battle_analysis.html tools/summarize_savedata_offset_triage_clusters.py tools/build_web_assets.py tools/verify_home_landing_browser.py tools/verify_web_assets.py docs/GOAL.md docs/HANDOFF.md
python3 tools/verify_runtime_http.py --base http://127.0.0.1:8013
python3 tools/verify_web_assets.py
xvfb-run -a python3 tools/verify_home_landing_browser.py --base http://127.0.0.1:8013
```

The last browser smoke summary included:

- `home scene=home mode=dom-table`
- `bareGamePath=/web/index.html`
- `assetSplitRows=6`
- `mapSourceCoverage=6/174`
- `runtimeMatrix=16`
- `formatLedger=8/4/1`
- `format opcode layout gap 6 rows · grounded 4 · partial 1 · missing 1`
- `home recent verified work 18 rows`
- `progress evidence handoff 27 rows · local 23 / external 4`
- `progress local roadmap queue 6 rows · route proof separated`
- `progress local roadmap runtime-flow direct links=event/dialogue/object`
- `progress local roadmap battle direct links=numeric boundary/triage`
- `progress local roadmap system direct links=route-control/value/name-coverage/targeted-delta`
- `progress local roadmap monster direct links=all/candidate scope`
- `progress runtime matrix 16 rows · browser verified 2 · prototype 9 · browser-local 3 · partial 1 · trial only 1`
- `dialogueReplayBoundary=8/3/2`
- `objectRuntimeBoundary=8/1/3`
- `menuRuntimeBoundary=8/5/3`
- `progress verification ledger 6/6 · port 8013 · achieved=false`
- `08:00 KST wrap checklist 7 steps`
- `system offset boundary 6 rows · missing 3 · offsets-unmapped`
- `system offset triage 6 rows · grounded/partial/candidate/missing 1/1/1/3`
- `system offset clusters 4 buckets · 87 ranges · inventory/equipment 4 · skill/status 45`
- `system offset route-control matrix 7 rows · selector 2:0 save required`
- `system offset value matrix 4 ranges · samples 6 · longest 0x0022-0x0037`
- `system offset pair decode 2 rows · equipment hits 9/9 · item hits 1/2 · candidate only`
- `system offset equipment/item name coverage 2 rows · menu/runtime links · candidate only`
- `system offset targeted delta plan 5 rows · changed saves required · candidate only`
- `browser compact smoke systemOffsetEquipHits=9/9 · systemOffsetItemHits=1/2`
- `home recent system offset route-control href=system_review.html#systemOffsetRouteControlMatrixPanel`
- `home recent system offset value matrix href=system_review.html#systemOffsetValueMatrixPanel`
- `home recent system offset pair decode href=system_review.html#systemOffsetPairDecodePanel`
- `home recent system offset name coverage href=system_review.html#systemOffsetEquipmentNameCoveragePanel`
- `home recent system offset targeted delta href=system_review.html#systemOffsetTargetedDeltaPlanPanel`
- `battleCandidateDirect=event-dialogue-block-015:btl_b1`
- `monsterCoverage=65/8`
- `monster coverage scope links=2 · all/candidate direct`
- `home recent monster scope links=monster_review.html?scope=all / monster_review.html?scope=candidate`
- `monsterBattleReviewLinks=8`
- `monster selected review=battle_analysis.html?candidate=event-dialogue-block-041%3Abtl_a1`
- `format directdraw calls 25 · verified 25 · Blt 6 · Flip 1 · non-promoting`
- `battle proof matrix 12 rows · passed 6 · runtime attack HUD/link verified`
- `battle numeric direct links=battle_analysis.html#battleNumericBoundaryPanel / battle_analysis.html#numericTriagePanel`
- `audio review runtime boundary 8 rows · DirectSound/WinMM missing`
- `movement renderer boundary 7 rows · non-promoting`
- `savedata offset boundary 7 rows · selector/equipment/status/story missing`
- `routeGate=blocked`
- `proofAccepted=0`

## Pre-Wrap Audit Snapshot

Last checked at 2026-06-11 07:52 KST:

- `out/goal_completion_checklist.json`: `achieved=false`, `routePromotionStatus=blocked`.
- `out/completion_audit.json`: `achieved=false`, confirmed route progress `2/174` maps.
- Hard missing evidence remains exactly 5:
  - strict source coordinate
  - tile hotspot confirmation
  - selected-root execution ref
  - real selector `2:0` captured savedata
  - runtime trace/equivalent selected-root proof
- External input checklist remains 3 rows:
  - `real-selector-2-0-save`: missing
  - `normal-route-runtime-trace`: blocked-by-environment
  - `strict-source-hotspot`: missing
- The new `systemOffsetTargetedDeltaPlanPanel` is a changed-save capture plan only. It does not satisfy these route blockers.

Final wrap verification at 2026-06-11 07:52 KST:

- `python3 -m py_compile tools/summarize_savedata_offset_triage_clusters.py tools/build_web_assets.py tools/verify_home_landing_browser.py tools/verify_web_assets.py tools/verify_runtime_http.py` passed.
- `git diff --check -- web/index.html web/progress.html web/system_review.html web/monster_review.html web/battle_analysis.html tools/summarize_savedata_offset_triage_clusters.py tools/build_web_assets.py tools/verify_home_landing_browser.py tools/verify_web_assets.py docs/GOAL.md docs/HANDOFF.md out/savedata_offset_triage_clusters.json out/savedata_offset_triage_clusters.md out/savedata_offset_triage_clusters.html` passed.
- `python3 tools/verify_runtime_http.py --base http://127.0.0.1:8013` passed.
- `python3 tools/verify_web_assets.py` passed.
- `xvfb-run -a python3 tools/verify_home_landing_browser.py --base http://127.0.0.1:8013` passed.
- Server observed on fixed test port: `python3 -m http.server 8013`.

## Files Touched In Latest Slice

- `web/index.html`
- `web/battle_analysis.html`
- `web/system_review.html`
- `web/monster_review.html`
- `web/progress.html`
- `tools/summarize_savedata_offset_triage_clusters.py`
- `tools/build_web_assets.py`
- `tools/verify_home_landing_browser.py`
- `tools/verify_web_assets.py`
- `docs/GOAL.md`
- `docs/HANDOFF.md`

Existing generated smoke files may be updated:

- `out/home_landing_browser_smoke.json`
- `out/savedata_offset_triage_clusters.json`
- `out/savedata_offset_triage_clusters.md`
- `out/savedata_offset_triage_clusters.html`

## Next Local Work Candidates

Prefer work that advances roadmap item 2, 5, 6, or 8 without pretending route promotion is solved.

Good next local candidates:

- Start from `web/progress.html#localRoadmapQueuePanel`; it lists the 6 current local lanes and their representative review links.
- Continue expanding admin review pages for already extracted evidence, especially places where `docs/GOAL.md` has partial roadmap items but no compact UI summary.
- Add more compact review surfaces for event VM, save/equipment/status offsets, or battle numeric gaps without promoting prototype gameplay to original parity.

Avoid for now:

- Spending the whole session on route/exit promotion unless new external proof is provided.
- Marking route promotion, full original runtime parity, or the active goal complete from proxy evidence.
- Moving the test server off port `8013`.

## 08:00 KST Wrap Checklist

At or after 2026-06-11 08:00 KST:

1. Stop broad new feature work.
2. Finish the current edit and run the verification commands above.
3. Update `docs/HANDOFF.md` with the latest completed slice, passing/failing checks, and exact blockers.
4. Update `docs/GOAL.md` with a short dated bullet for the final slice.
5. Confirm `out/goal_completion_checklist.json` and `out/completion_audit.json` still reflect the real state.
6. Leave `8013` running if it is useful for review.
7. Report plainly whether the actual audit is complete or still blocked.

## Manual Audio Archive Cleanup - 2026-06-11

Manual-request mode supersedes the earlier special-case audio diagnostic work for restoration.

- WLK restoration is now the verified 54-row `PCMDATA.WLK` table in `out/audio_archive_manifest.*`.
- MLK restoration is now the verified 20-row `MIDDATA.MLK` table in `out/audio_archive_manifest.*`.
- Active filenames and references are EXE zero-based: WLK id `45` is `extract_wlk/45.wav`.  Do not keep a separate archive/display numbering layer in active docs or UI.
- The field after WLK sample rate is gain metadata, not a loop-start pointer. Loop playback remains flags bit `0x20`.
- Removed restoration dependency on per-entry probe output and any special alternate preview. Keep restoration tied to the verified manifest unless the user explicitly asks for a separate experiment.
- Web/admin surfaces should link `web/audio_review.html`, `out/audio_archive_manifest.html`, and `out/audio_title_provenance.html`.
- MIDI BGM playback validation is implemented in `web/midi_bgm_test.html` and `web/engine/audio/midi_bgm_player.js`: SMF-derived events, WebAudio GM Lite baseline, optional SF2/SF3/Web MIDI modes, IndexedDB/OPFS soundfont cache, and lookahead scheduling.
- `tools/verify_midi_bgm_test_browser.py` writes `out/midi_bgm_test_browser_smoke.*`; the current 8013 WebKit smoke verified `scheduled:webaudio-gm-lite-synth` for MIDI BGM test default synth playback.
