Release Notes
What's New
Every public build of The Chronicles of Nesis, newest first.
v0.8.2347
9 changesFixed
- interactable on scene-entry spawn overlap (fix left-of-bed sleep)
- filter area_entered/exited to the player interaction area (fix walk-edge dead bug)
- fix intermittent upside-down thumbnails (single canonical capture)
- tighten zone to down-only (fix top overshoot, keep foot)
- [deploy-develop] public cut (owner): bed left-edge interaction fix (Quinn 3/3 PASS) + screenshot double-flip fix, v0.8.2347
Release
- deploy manifest v0.8.2342 (mobile touch + title-ready/loader-reveal build)
- WEB_VERSION 0.8.2347 — bed left-edge interaction fix + screenshot double-flip fix
Maintenance
- extend interaction zone y 40->85 to cover full head+foot of the left edge
- [deploy-staging] cut v0.8.2347 — staging = develop (forward-only)
v0.8.2342
8 changesImproved
- touch-accept: suppress in combat + rename beacon to allbyte_touch_accept
Release
- deploy manifest v0.8.2341 (backfill live public build cf260e59)
- touch=X in all conditions (owner override) + WEB_VERSION 0.8.2342
Maintenance
- emit allbyte_title_ready signal when title is painted + interactive
- defer intro music until web loader reveals the title
- mobile touch = ui_accept dispatch (Nix sandbox/nix-fv3l 67d0e8f6)
- [deploy-develop] full public deploy (owner): mobile touch=X + title-ready + loader-reveal signals, v0.8.2342
- [deploy-staging] cut v0.8.2342 — staging = develop (forward-only)
v0.8.2341
306 changesNew
- capture approved Laria-foundations dialogue additions (wiring-ready handoff)
- add Move / Health / Berserckounter Tier 1 prose from updated doc (owner 2026-07-30)
- save single auto-save alongside manual saves + on-screen indicator
Fixed
- close stale _pending_door_scene leaks causing intermittent transition skip (bd-cn4r)
- skilltree invalidate cached grid on save-load so learned nodes render
- uyzz WASD-accept fires stale mouse button, not focused one
- sluicegate clear isInEvent so Mother Slime boss charge engages combat
- save nudge save position out of transition triggers before serializing
- autoplay Mugwort heal never fired — check relic-SLOT binding not item.isEquipped
- autoplay Mugwort never CONSUMES — item pick left SKILL-confirm with no target
- load keep inLoadGameState set through deferred scene load so backward saves don't re-fire scene-entry events
- refresh develop channel to HEAD (adds QB-053 exit-indicator fix) [deploy-develop]
- [deploy-staging] rebuild v0.8.2314 as DEBUG (include TestBridgeDev hooks for Quinn QA)
- relic name title, fixed icon/title position, quieter music, 1.5s fade, pen SFX stops on fade end (owner 2026-07-30)
- acquisition vignette fully releases the player on close (fix NPCs un-clickable after Event 13 relic)
- charge enemy movement AP like the player (fix slime move-full-range + attack)
- Fix Event-13 hang after Item relic (event grant must skip vignette-first) + pen SFX loops while writing
- [deploy-develop] relic vignette (flash+void+particles, wild-first), Event 13 rebuild+choreography+timing+hang-fix, dialogue engine (branching/@emote/@setCond/choice-persistence), combat enemy-AP parity, equip SFX
- dialogue/vignette SFX + post-vignette NPC responsiveness fixes
- tools promote_to_staging reads/writes WEB_VERSION for both := and = (walrus-ban broke the regex)
- spawn defer EnemyTrigger enemy-spawn out of the physics query-flush
- QB-066 release enemy `encountered` flag when on_StartCombat bails
- [deploy-develop] fix(autosave): trigger on EVERY scene transition + fresh, right-side-up screenshot
- log 4 owner-reported bugs (scene-return, SFX regression, item-vignette music+NPC)
- [deploy-develop] fix batch: SFX regression (393w) + item-vignette state (8awt/gsj5) + immediate scene-return (jcye)
- [deploy-develop] fix(combat): QB-068 poison tick shows damage-type icon+number (+ QB-067 stacking)
- [deploy-develop] fix: QB-067 tighten floater stack gap + QB-070 reveal church intro slimes
- [deploy-develop] fix(QB-070): force-reveal church intro slimes (opacity + sprite + idle) + diagnostic
- event-initiated combat: contact-triggered handshake (church/MotherSlime fix)
- fix HUD-mount abort — details_panel/skills_picker typed Panel vs CanvasLayer root
- AllByteGames splash: fix cold-load layout (G3 ProjectSettings key + size.x timing)
- player ignores world input while relic vignette is up (NPCs un-clickable after)
- sync bootstrap EventDirector copy with emote-wait fix (dual-copy)
- fade-in waits for the deferred swap to mount (fix bed black-flash)
Tested
- AutoPlay ChurchSquare combat diagnostic (_diag, not collected)
- t4 pin TRANSITION-SAFE-SAVE-POS regression (v0.7.2219)
- Tier-3 pins for the osf0 mouse-entry WASD regression + facade blindness
- pin consume-menu highlight/click/Enter + Main Menu addressability (osf0)
- Anam vignette lock + trigger-sequencing contract (Tier 3)
- QB-062 _testExportCurrentSave — fall back to slot 1 when no slot assigned
- Event 13 (Raeges relic handoff): rebuild per v3 spec — conversation not lecture
- dialogue-engine suite (Vera sandbox/vera-dlg1 803aac47) — branching, conditions, @emote bug pin
- QB-066 Tier-2 regression pin for enemy `encountered` release on on_StartCombat bail
Tooling
- add deploy_develop.sh — one-command develop->prod deploy trigger
- allow 'staging' channel in build_manifest.py (unblocks staging deploy)
- allow 'staging' channel in build_manifest.py (unblocks staging deploy)
- staging channel is permanently DEBUG (Quinn QA target, not public)
- staging channel is permanently DEBUG (Quinn QA target, not public)
- refresh dialogue_review.json for App review (latest narrative rewrites)
- relic-vignette (Anam) review pipeline for App /test/vignettes/
- expand relic-vignette review data (owner authoring pass)
- dialogue export/apply round-trip + guide for prose iteration (owner 2026-07-29)
Release
- unify WEB_VERSION to 0.8.2338 on develop (reconcile 0.7/0.8 split)
- WEB_VERSION 0.8.2341 + commit stranded StatusMenu work
Docs
- MENU_WASD_BUG_CLASS.md — the osf0 menu bug-class runbook
- Nix CLAUDE.md correct stale Godot-3.6 note — WebBootstrap is Godot 4 (mid-port)
- Nix CLAUDE.md Enemy.gd extends CharacterBody2D (G4), not KinematicBody2D (G3)
- BRANCHING_DIALOGUE_GUIDE — dialogue engine schema, conditionType ops, inline commands, choice->state, one-time pattern, @emote bug
- COMBAT_AP_MODEL — canonical AP/movement bucket model (player = reference)
Maintenance
- QB-014: fix Elias max_hp=13 in Overworld combat via BattleSnapshot party capture
- combat benches: play combat music at gameplay-default volume + default VFX bench to Animation mode
- save-tree: wire the Medium spine + boss leaves (11 nodes) into the manifest
- smite bolt: bake owner-tuned params + canvas_pad headroom, single controllable bolt, dump-to-clipboard
- smite bolt: sky-column geometry — bottom-anchored pixel-height rect (screen-tall strike)
- smite bolt: bake owner sky-column tune + port geometry into real combat
- QB-022 / ChroniclesOfNesis-303r: fix Move Relic visibility + nav reachability in waterwayChannel
- save-tree: wire Hard spine (QB tree-build) — 2 fixtures + 4 manifest nodes
- [SKDIAG] instrument skill-tree load/read for skill-tree-not-loading diag
- save-tree: wire Easy PARTIAL spine — 2 fixtures + 4 manifest nodes
- QB-022 / ChroniclesOfNesis-303r p2: fix relic grab + canal drain visibility
- QB-022 pass3: disable relic StaticBody2D per-instance in waterwayChannel (player X-block fix)
- TEST tier2: pin battle-stat derivation formula for wqzs regression gate
- QB-022 pass 4: fix relic pickup shadowed by WaterHint lore triggers
- waterway relic: low-water re-enable must respect difficulty gate
- AutoPlay STORY auto-equip v1: AVG_STAT gear + Item Relic default + override hook + equipped mirror
- AutoPlay STORY auto-equip v1.1: gear-only trigger + Phase-7 done-latch + empty-slot fill
- AutoPlay STORY: reserve MP for Cure — don't Smite a wounded Elias into empty MP (QB-021)
- AutoPlay STORY: heal-FIRST with AP reservation so wounded Elias actually casts Cure (QB-021)
- AutoPlay STORY: Mugwort MP-out sustain + MP-reservation deactivation + watchdog flicker-proofing (QB-021 2nd-wound freeze)
- AutoPlay QB-021: signature-based unified no-progress combat watchdog
- AutoPlay combat: escape open skills-picker + turn-flicker-proof no-progress watchdog (2228 SluiceGate trap)
- scene-graph: register Bed (cond-9 sleep beat) so App's walkthrough FK-validates
- QB-030: new-game REQUEST API (Title→EliasHouse) — request, don't hand-drive menus
- dialogue-review: Arc data layer for the webapp dialogue editor (read + write halves)
- save-tree manifest: mark 12 owner-confirmed nodes approval=unapproved
- dialogue-review: emit origin + ingest arc-generated ambient dialogue (owner ask)
- dialogue-review: apply_ambient_overrides.py — write half for arc/ambient edits
- ItemsMenu/Consume: fix WASD mode (1ljq) + consume-all auto-close/remove (rkh0) — demo bugs
- ppqk-2 robust equip reconcile + zhoj cond-9 flow DIAG (instrument two save-tree blockers)
- save-tree: promote medium full-prep BEFORE-DUNGEON node (supersedes med_before_dungeon) — approved
- save-tree: re-promote med before-dungeon node — add 3 Mugwort (owner review)
- save-tree: re-promote med before-dungeon node — final Mugwort fix (1 collected + 2 shop)
- autoplay-mcp Phase 1: save_summary derivation (playtester state model)
- autoplay-mcp: Phase 2 skilltree_state — SP frontier + cost-to-reach (t0b9)
- autoplay-mcp: equipment_state — equippable gear + stat swing (t0b9)
- autoplay-mcp: document derivation layer + the missing live-export bridge (t0b9)
- combat snapshot: add unit_type/move_range/attack_range/status_effects (t0b9)
- save-tree: additive spine tags (chapter/section/seq) + schema v1.1
- save-tree: move dungeon-prep nodes to into-the-waterways (spine rev 2)
- save-tree: document the tag-by-beat rule in the manifest _doc
- save-tree: med_grind_start build-neutral label (owner, no build name before A/B split)
- combat cursor: top-of-input key trace to isolate swallowed confirm (QB-044 diag)
- combat cursor: remove QB-044 diagnostic prints (root cause resolved)
- Revert "combat: apply target physical_resist to physical damage (QB-047)"
- [deploy-develop] catch develop channel up from v2236 → HEAD
- [deploy-develop] ship testbridge dev-POST host-guard (channel flood + per-frame fetch drag fix)
- [deploy-develop] gate dev network feeds (stop channel console flood)
- ci/cloud_export: wipe .godot before import — hermetic re-encryption (channel decrypt fix)
- [deploy-develop] clean hermetic cloud export (fix channel pck decrypt failures)
- walk-indicators: constant on-screen exit-marker size under any zoom (QB-053)
- re-arm scene EnemyTriggers + clear triggeredSpawns on load (boss-nav retry)
- Cut staging at v0.8.2314 (from develop@777c9c66) [deploy-staging]
- deploy-history: record staging v0.8.2314 (hooked QA build)
- align demo-scope dialogue with lore framing + store lore reference
- Raeges as Morpheus — confident conviction; others frame it as 'Raeges says'
- Raeges confidence is faith-from-recognition, not foreknowledge
- Raeges confident but doesn't understand WHY — bravery->chosen stays hidden
- Raeges quiet + simple — 'you must be an Anam', not selling a theory
- Raeges lines — beast -> slime(s) (the village enemy)
- Raeges ending speech (pre-credits demo closer) — departure + faded-world + come-home hook
- QB-057 — player combat units start at full HP (drop shadowed-party saved-HP carry)
- save-tree: promote Quinn's walked Easy spine (root→ev1→ev2→ev3)
- save-tree: promote 3 more walked Easy nodes (post-intake → before-dungeon)
- save-tree: promote easy_grind_start (Waterway1) — Easy walked spine complete
- half-size markers, cover doors, + keyboard toggle (owner 2026-07-29)
- clamp mobile background time out of the play-time clock
- -10% size, web-robust T toggle, position at Elias-height+40px over event bottom (owner 2026-07-29)
- toggle on ui_secondary (E/O/triangle), not T (owner 2026-07-29)
- Anam relic vignette: parchment cutscene on relic acquisition (owner 2026-07-28/29)
- hide exit triangles during events/dialogue/transitions (owner 2026-07-29)
- adopt DIALOGUE_PATCH_v2 — de-paladin-ify Mayor/villager lines, refine Kein's legend (owner 2026-07-29)
- delete 38 dead entries — cut paladin ceremony + old intro thread (owner 2026-07-30)
- screen-edge directional arrows for on-screen exits (owner 2026-07-30)
- integrate Item Relic (The Cart) + Scan Relic (The Miren) prose; mobile-responsive paper (owner 2026-07-30)
- dialogue-style per-line reveal + blurred 'in Elias's mind' background (owner 2026-07-30)
- revert screen-edge arrows — back to stationary world-anchored, always-down markers (owner 2026-07-30)
- clamp marker inside viewport when its exit is on-screen (owner 2026-07-30)
- small screen-lift at the exit instead of Elias-height float — bottom exits hug the bottom (owner 2026-07-30)
- stack floaters off _pending_fade_count so status appears in place of damage (owner 2026-07-30)
- glowing relic icon, 1s line fade, pen SFX on text + click SFX on click, quiet GameOver music (owner 2026-07-30)
- Pen SFX: audible via playSFX + unified across dialogue writing and vignette fade-in (owner 2026-07-30)
- relic title ABOVE the icon; sync DialogueHandler pen-SFX into Laria/Overworld pack copies (owner 2026-07-30)
- wild-relic vignette-first flow — intro/header/story reveal + treasure overlay after
- reserve icon/title slots (no jump) + per-line click-snap
- cinematic relic open — static relic + silence, radial light-flash burst
- play magic-accent SFX on the relic light-flash burst
- Scan vignette: em-dash -> comma in 'Let me study it, it may still be part of this'
- downconvert FlashBurst.wav to 44.1k/16-bit/mono (2.27MB->342KB)
- shrink FlashBurst + PenWriting to fit bootstrap PCK budget (unblock deploy)
- Combat/movement batch (Nix sandbox/nix-67220 d3dcafae): walk-anim in events, enemy stat mask, easy intro slime
- Dialogue reframe step 1: cut dead paladin-ceremony thread + de-paladin ambient labels
- Dialogue reframe step 2: villager gratitude + Aor-abstract rewrites (owner-approved)
- relic vignette reads in a black memory-space with drifting motes
- Dialogue-engine expansion 1-4 (Nix sandbox/nix-17879 fea5e49f)
- Event 13 music resume + choreography + emote timing (Nix sandbox/nix-e13mus f2b17e7f)
- play gear SFX on equip + unequip (was silent)
- Event 13 timing (Nix sandbox/nix-25052 bfe1f69e): flat 1s emote hold + 0.5s face pauses
- [deploy-develop] Restore bed-prompt dialogue 10034 (was wrongly cut with the paladin thread)
- QB-066 log _release_encounter_flag when it undoes a strand (observability)
- [deploy-develop] deploy develop channel to 0.7.2327 (channel was stale at 0.7.2319, pre-autosave)
- [deploy-develop] perf(QB-069 step 1): prewarm combat music + enemy-type battle sprites at scene load
- [deploy-develop] feat(capture): teleport-complete EventDirector moveTo under capture flag (QB-069 Movie Maker unblock)
- [deploy-develop] chore(QB-070): diagnostic uses print() not web-only JS-eval (shows in desktop Movie Maker stdout too)
- post-combat expertise vignette (Part C) + difficulty-pinned-to-Medium note
- pin to Medium + all rewards/items findable (difficulty track dormant)
- EliasHouse bed: widen interaction zone to the floor left of the bed
- lift Relic.gd _is_hidden_on_difficulty too (missed 3rd copy)
- victory jingle plays fully before zone music resumes
- ellipsis + frustrated play 2x slower (owner)
- enemy HP/MP/AP bars show the RATIO without Scan (numbers still masked)
- emote command waits for emoteComplete (not a flat timer)
- [deploy-develop] full deploy (owner): ship QA'd 0.8.2341 to all channels — develop preview + staging + public
- [deploy-staging] cut v0.8.2341 — staging = develop (forward-only)
combat
- 18ba PHASE-RELAY — replace fixed delays with signal-driven phase queue
- floating color-coded hit-chance % labels during player targeting
- route hit-chance label through DamageQueue.spawn_preview()
- drop per-spawn_preview debug print (fires per cursor-move via hit-chance preview; no-per-frame-prints)
- VictorySFX on level-up + victory fanfare held for the SFX duration
- medium XP rebalance + difficulty XP multiplier (Quinn balance, owner-approved)
- MEDIUM Slime XP 5->6 (owner tune, bias toward 20min target)
- refine difficulty XP mult to x1.5/x1.0/x0.67 (owner, extremes pulled in)
- fix L1 XP curve on web runtime — WebUnitStub mirror 25->40 (Quinn gap)
- authored XP-per-kill per enemy × difficulty — remove =1 hardcode (ueuk/QB-032)
- gate enemy contact-trigger on player-lock — fixes load-settle combat hang (hlj7/QB-041)
- structured per-attack combat log — attacks finally visible (QB-042 data layer)
- View A in-game combat-log overlay (QB-042)
- View A polish — ModernGoth font, HUD-style button, △ glyph, controller toggle (QB-042)
- View A — scroll icon replaces "Log" text on the combat-log button (QB-042)
- expose cursor_cell in the combat snapshot (QB-040 enabler)
- poison fog fade-in + kill the opaque backing square (owner 2026-07-25)
- size poison fog to the damage range (owner 2026-07-25)
- fix grind drops armed fight (QB-044) + boss-approach lock deadlock (QB-045)
- engagement-angle initiative — scaled surprise boost (qf1z)
- Scan Relic — gated enemy stats + hit chance, EP by unique monsters (qf1z-adjacent)
- apply target physical_resist to physical damage (QB-047)
- derive max_ap from Speed, not Stamina (QB-048)
- refuse on_StartCombat during load / with no player (QB-051 corrupt-load)
- publish action-menu + skills-picker state in combat snapshot (QB-052)
- abort on_StartCombat if player freed during handover yield (QB-051 grind path)
- fix Unit.gd parse error (speed→spd) that broke ALL combat (QB-048 regression)
beads
- g3-guard bead + phase-relay/combat-batch note updates
- queue phase-relay (18ba) for verify
- AutoPlay ChurchSquare combat win (needs-verify per difficulty)
- AutoPlay combat win verified Easy+Hard (Quinn); Tier 2 heal roadmap
- scene-transition + traversal#1 fixed (cn4r, Quinn-verified); hit-chance shipped+verified
- create + verify scene-transition fix bead (was lost to shell-quoting)
- AutoPlay traversal #1+#2 verified LIVE + hit-chance restyle confirmed (Quinn, :8060 02:49)
- AutoPlay story-beat dispatch gaps (EliasHouse sleep cond 9)
- resync issues.jsonl (keno reopened — erroneous auto-close in 8ccfd042)
- sync issues.jsonl (Move Relic QB-022 closed, all Tier-3 tests green)
autoplay
- fix DEFAULT persona combat stall at ChurchSquare (cond 7→8)
- fix attack-gate cursor reliability via FACE orientation + diagonal routing
- remove dead _face_dir_sent local var (cleanup)
- WaterwayChannel bridge-jump crossing + gameState persona mirror
- cond-11 WaterwayChannel drop-in objective (route to SluiceGate regardless of wc_visited)
- fix cond-9 bed-dialogue hang — forward path now resolves option prompts (zhoj/QB-036)
- grind push-vs-farm danger gate — stop out-running level into deep water (np1j)
- deprecate np1j auto room-navigation — orchestrator drives rooms (owner 2026-07-24)
- fix grind self-paralysis (QB-044) — don't reserve MP for an unlearned/away Cure
- QB-044 combat-routing diagnostic (log-on-change)
- land the combat attack press after a debug-load (QB-044 candidate #3)
- QB-044 press-path instrumentation (mode / clear / press)
- gate combat cursor-confirm on a live red target (QB-044 candidate #4)
- release action-button focus in targeting mode (QB-044 candidate #5)
- confirm combat attack via a REAL key event (QB-044 candidate #6)
- fix root cause of grind-never-attacks — cursor null_hover latch (QB-044 c#7)
- count fights once-per-battle on observed inBattle, not the edge (P3)
AutoPlay
- fix Vector2i size type bug that prevented all combat moves
- fix LeaveArea walk-through crossing + PAUSED-after-reenable resume (5ucd + ta1k)
- EliasHouse cond=9 sleep dispatch + DEFAULT Mugwort heal threshold
- add STORY persona + skill-heal survivability for boss fight
- STORY casts Smite in melee (radiant vs physical-resist boss) [QB-021 combat-competence]
- fix after-boss-death combat stall + add armed-idle STUCK watchdog (QB-021)
- fix skill-picker infinite-loop freeze (2227) — bail + convergent nav
- ItemsMenu two-axis nav convergence + STORY relic mandatory-collect gate
- add reset() + progress tracker; reset run-state on save-inject
- publish window._testAutoplayVerdict at run-end (verdict object)
- promote sustained silent-stall to a verdict-publishing run-end
- guard ChurchSquare cond-8 route so Event-1 forced-fight engages
- exclude active-event time from silent-stall clock
- grind-to-level goal-mode — seek + cycle + adaptive-kit engage + halt
- grind-survival heal tuning + learned-state skill gate
- auto-equip owned gear on grind ARM (fixes bare-handed grind wipe)
- grind SP-spend down central line (Cure-first survival -> Relic Slot -> Smite)
- grind SP-spend = natural topology tree-walk (parents-before-children)
- QB-031 forward-play halt-at-target (stop_at_scene / stop_at_cond)
- QB-031 halt-gate v2 — check every tick, not just _decide (fixes missed brief arrival)
- dismiss modal treasure popup before menu-detour phases (event_10 order-40 hang fix)
- STORY auto-equip story-granted gear before forced fight (QB-035, generalize grind helper)
- suppress menu-detour phases during locked events + strip EQ-DIAG
- commit packs_src Laria copy — complete the dual-copy sync 3b38bd02 only half-staged (bootstrap committed, Laria left in tree)
- remove poison_attack from combat AI — out of demo scope (owner 2026-07-22, QB-037)
- QB-037 move DIAG — dump move-to-engage inputs (why no move at dist=2)
- path-aware MOVE cursor — route around occupied cells (QB-038 deliverable 1)
- multi-hop routing + wrong-scene recovery (zhoj)
- BED-DIAG instrumentation for cond-9 silent stall (zhoj, temporary)
- Bed interact walk-to-overlap (zhoj cond-9 fix) — walk_target approach point
sync
- propagate cn4r nav-flag fix to Laria+Overworld PlayerCharacter.gd pack copies
CombatUnit
- QB-014 — player max_hp now sourced from party growth model
SceneTemplate
- sync bootstrap copy with QB-014 party-stat capture (dual-copy fix)
CombatVFXBench
- tabbed shader tuner (Attack | Lightning Bolt) + freeze/scrub row
fixtures
- SluiceGate boss-arrival matrix (Easy/Hard x low/high) + fix leveled stats
- fix SluiceGate boss saves — HIGH water (cond3 1->0) so bridge-jump egress works
- synthetic full-gear boss save (easy_high + Leather Chestpiece + Quick Boots)
- HARD synthetic full-gear boss save (hard_high + Leather Chestpiece + Quick Boots)
- canonical SluiceGate post_boss save (Hard, win + Berserckounter relic)
- promote Quinn's Save A (side-branch, equipped) pre-boss saves ×3
- promote Waterway1 grind-start (Save-B grind seed, med)
redeploy
- :8061 iteration lane — divert here when :8060 is held instead of aborting
web
- bump WEB_VERSION 0.7.2208 (monotonic forward; SKDIAG diag build cache-bust)
- WEB_VERSION 0.7.2212 (menu WASD-accept fix live for verify)
- WEB_VERSION 0.7.2215 (AutoPlay STORY persona + Cure/Cleanse heal for boss re-QA)
- WEB_VERSION 0.7.2216 (AutoPlay bridge-jump nav + persona mirror)
skilltree
- strip [SKDIAG] diagnostic prints (root cause fixed in 63b4d584)
testbridge
- add _testInjectMouseMotion hook for uyzz menu-mode regression pin
- gate dev-server POSTs (/tab_state.json, /event) to localhost only
- gate dev network feeds on dev-host (live_mutations poll + tab_state)
- gameState.menuShown tracks MenuOverlay via isInMenu(), not isShown()
vera
- Tier-3 regression pin for 303r Move Relic Hard grab
DebugMenu
- in-game Demo/Alpha ending toggle (GlobalWorld.demo)
TestBridge
- add SP-gated learn-skill hook (chain-legal, no free-grant)
SluiceGate
- fix stuck return-to-WaterwayChannel (spawn-into-EntryArea)
diag
- fast cond-5 Mayor-leg repro for the FrontRoad nav-mesh stall (ypui)
DifficultySelectMenu
- reframe taglines by focus (Easy=story, Hard=combat, Med=blend)
Combat
- apply equipped gear on the snapshot-sourced stat roll (QB-014/QB-035 propagation)
- source equipped gear from inventory isEquipped flags, not just live slot pointers (QB-035 desync)
- QB-035 DIAG — dump equip_unit + party.party keys + full inventory flags in the equip pass
- apply equipped gear from the combat-ENTRY snapshot, not the live combat-context party lookup (QB-035 fix)
SkillsMenu
- inline relic-slotting mode replaces popup picker (owner 2026-07-21)
DAL
- persist equipped gear to save — reconcile item flags from unit slot pointers (ppqk)
TestBridgeDev
- add _testExportCurrentSave hook (epic t0b9)
menu
- fix ConsumeItemMenu WASD feather+accept — skip OS-cursor warp in WASD (nb7)
- fix the systemic WASD-menu regression root — stack-owner cursor authority
- consume submenu — WASD highlight + non-silent accept (owner video repro)
- consume submenu — WASD click activates (was swallowed by dead pressed-signal)
- ShopOverlay de-facade + nav-control override — fixes QB-020 shop mis-buy
- MenuOverlay (pause Main Menu) de-facade + nav-control override; doc corrections
- MainMenu — stationary mouse no longer overrides WASD selection (t84s)
- relic/skill picker — suppress MP/AP on cost-less rows, drop Back, Clear to top (yp99)
- MenuOverlay implements _mb_nav_to_label (pause menu was unreachable by label)
- publish ItemsMenu + SkillTreeMenu grids to JS (QB-052 dead _testBridgeNode)
spawns
- weighted-count spawn model + Waterway1/2/5 configs (Quinn, owner-approved)
dialogue
- apply owner's 54 ambient edits + fold his voice rules into regen guidance
- fix the 4 stray em-dashes in owner's applied ambient edits (owner OK'd)
feature
- WalkIndicators — animated exit markers over scene transitions (owner 2026-07-24)
deploy
- fire develop channel with combat parse-error fix [deploy-develop]
v0.7.2201
387 changesNew
- sluicegate add Mother Slime sprites + drop vestigial iso_poison.tres ref
- combat/autoplay poison_attack skill + AutoPlay trailer-minimum behavior
- CombatVFXBench slash shader live slider panel in animation mode
- CombatVFXBench slash clip fix + per-orientation target selector
- tools gotcha-#60 packs_src integrity guard in redeploy + G3-syntax pre-commit hook
- slash true facing mirror, bench/combat frame unification, crescent covers attack streaks
- combat port Mother Slime G3 boss behaviors to G4 combat
- autoplay route to Mother Slime boss + post-boss return to Mayor (Event 15)
- credits port G3 Credits scene to G4 + alpha end-of-game gate
- export expand web export matrix 2→4 — {alpha,beta}×{debug,public}
- combat Mother Slime drops the Berserckounter Relic (item 24)
- overworld G3->G4 zone pack port, beta-gated FrontRoad exit
- autoplay COMPLETIONIST persona — treasure pickup + boss loot discipline
- combat wire size-2 footprint throughout combat stack (Mother Slime)
- tests Tier-3 boss footprint pins — 4-cell occupancy, BFS blocking, perimeter attack, split spawn
- skilltree fog-of-war progressive reveal + frontier-only interactivity
- pack Overworld zone pack exportability — bead ChroniclesOfNesis-lty
- tests Tier 3 vision ring pins + chest/enemy coverage findings
- tests Tier 3 vision ring regression pins + F1/F2 coverage gap findings
- tests Tier 3 vision ring pins + chest/enemy coverage findings
- overworld vision ring reveals enemies and treasure chests
- overworld-combat world-fitting arena clip via BoundingGrid (G3 port)
- overworld-combat 2x intro zoom + unwind, reusing ChurchSquare cinematic path
- overworld location discovery — vision-circle reveal, name panels, save persistence
- combat player units source live party stats + equipment (beads ij8, 5fp)
- ci develop-channel deploy pipeline — every local build stages a test-gated deploy
- autoplay JP-policy override hook — grind-and-invest runs (Quinn unlock)
- ci cloud exporter — hermetic export, T2 gate, image, buildspec (bd-yp5 fixed)
- combat-vfx place slash by moving the rect, not shifting the shape (owner 2026-07-05)
- ci boot_check.py — verify an exported build boots + decrypts
- redeploy BUMP_ONLY mode — cache-bust local :8060 without AppC sync
- combat/slash persist owner per-facing tuning; render in-shader (revert rect-move)
- security+build disable _test* backdoors in public builds; plaintext local builds
- ybyz DifficultySelectMenu — new game difficulty-select screen
- combat-bench 2qi5 pin any floater type for live damage-label tuning
- vfx-bench right-side floater panel + full level-up cascade
- vfx-bench URL ?benchMode=combat / window._benchMode picks initial mode
- combat item skill → pick item then grid-target any unit (range=1)
- combat 2c8l wire AoE execution for sweep_attack + line_smite (Elias)
- vfxbench Slash/Bolt shader-target selector in animation-mode tuner panel
- save a92n wire Export/Import save bridge (WebBridge + DAL)
- waterway add y_flip uniform to water reflection shader (owner tune relic position)
- bd/mkjm port AllByteGames splash to G4; wire credits→AllByte→Title
- pl7g Mother Slime overworld landing tween + camera shake in SluiceGate
- yskz poison immunity for Slime, VSlime, Mother Slime
- w91l 2x2 hover highlight — footprint white, aimed cell red
- vx1x VSlime absorbs poison — heals instead of taking poison damage
- hxf3 generalize combat unit footprint from N×N scalar to W×H Vector2i
- ur21 TestBridge hooks for runtime status-display + details-panel tests
- Batch A in-combat debug menu — backtick toggle + number-key state pokes
- ms-cinematic Batch B — MS drop, Elias charge assets, relic drop sprite (#6/#7/#8)
- combat Batch C+D — 6 combat fixes (#1 #4 #9 #10 #12 #16)
- vfx-bench port real G3 poison-fog shader + MotherSlime + PoisonFog trigger
- vfx-bench fog alpha slider + Dump Fog params button (+ JS mirror)
- 4rok wire real poison-fog shader into combat _execute_poison_cloud
- vfx-bench fog fade-in/hold/fade-out sliders (replace no-op alpha) + owner-tuned defaults
- 4rok port G3 PoisonCloud SFX (cloud hiss) + play on Mother Slime fog cast
- vfx-bench SFX panel — per-SFX play + volume + timing sliders, auto-fire on anim
- vfx-bench per-unit ability panels — Player/Enemy dropdowns, active-unit anim+ability list, cross-unit floaters, inline SFX, Text show-on toggle
- pnze R-step1 combat-ready no-HUD mount — CombatOverlay.mount_ready_no_hud + ArenaBench VFX mode
- pnze R3 CombatOverlay debug_fire_* hooks + arena turn-advance guard
- pnze R3 VFX arena debug panel — fire real combat actions
- pnze R3 DebugMenu 'ArenaBench (VFX tuning)' button — launch VFX arena, no console
- pnze R3 arena immortal (no HP/death) + deterministic hit/miss/crit + Die button
- pnze R2 CombatOverlay.debug_fire_text — real damageQueue floaters for arena text panel
- pnze R2 arena UI — enemy swap, focus toggle, text-floater panel
- pnze R2 debug_fire_enemy_attack slap variant (BATTLE_SLAP_MAP)
- pnze R2 arena split panels — animations follow focus, no scroll
- pnze R1 CombatVFXConfig — config-driven fog params (single source combat+arena)
- pnze R2 arena fog sliders write CombatVFXConfig -> real combat reads live
- pnze R2 combat SFX volumes read CombatVFXConfig + audition/set hooks
- pnze R2 arena SFX volume sliders (audition + write config) + hide Title label
- pnze R2 SFX timing — config-driven delay from natural fire point
- pnze R2 arena SFX rows get a timing slider (vol + t) writing config
- combat universal 2x2 footprint-white hover for all skills (a3cm)
Fixed
- app_deploy inject GODOT_SCRIPT_ENCRYPTION_KEY to prevent PCK/WASM key mismatch
- water-shader G3->G4 hint_color->source_color + declare SCREEN_TEXTURE; add SKIP_APPC_SYNC
- water get_node_or_null for player ref in Water.gd
- menu framework bug fixes for mode-switch highlight clear + WASD popup clickability; 2.5x ControlsMenu glyph-action buttons
- menu-input holistic WASD stale-click fix — auto-discover all BaseButtons in MenuBase
- MenuOverlay persist DEBUG MENU button across scene transitions
- title gate Debug launcher button on GlobalWorld.debug — was leaking onto public build
- StatusMenu STATUS-STATS-RACE — null stat panels + CharacterSubpanel "null"
- tier5 fail fast on cond regression (page reload/crash) + crash-safe teardown in playthrough observer
- menu-matrix WASD trigger key from documented set; xfail status/saveload swap rows on MENU-MATRIX-INPUT-ROUTING gap
- combat Mother Slime boss verify — stats spelling, bootstrap ArenaBench sync, force-cloud hook + 4 pin tests
- combat bd-9oo — cold-boot init race + AutoPlay watchdog + trace gate
- bd-9oo-r2 three combat-init stall fixes for with-input race
- 9oo-r2 sync cancel_nav_following fix into bootstrap SceneTemplate copy
- combat bd-9oo r3 — gate turn_queue.start() on HUD mount completion
- autoplay bd-9oo layer 3 — reset per-turn combat state on turn boundary
- combat Roan boss-QA findings — targeting focus theft + boss AI routing
- combat tick-death at turn start no longer freezes combat (Roan F4)
- story Mother Slime win advances cond 12→13 on the live combat path
- autoplay drain open dialogue before cond-13 scripted routing
- autoplay dialogue detection by DialogueBox visibility, not flag
- test footprint perimeter pin targets unit_name Elias, not type Player
- menu first-open layout flash + null-texture crash in CharacterSubpanel
- test menu pins — Esc-close (Space toggle is lock-gated) + mode-aware Status nav
- world port G3 difficulty-dependent respawn stack (bounded clearedSceneStack)
- items-menu disable non-consumables, fix highlight bleed, add T3 pins
- QB-011 uncollected combat drops persist as overworld pickups after battle
- bench wire drops_to_overworld in ArenaBench + parse fix in drop pin
- items+drops open-hover seats on first ENABLED button; robust pickup approach in pin
- drops forgiving pickup radius (30px) + bench-safe player identity
- test drop pin (b) asserts grant outcomes — pickup can collect instantly at spawn
- test fog pins — SkillTree button shares a ROW with Skills (down x3 + right)
- skilltree recompute fog depths in the tree_skill_learned handler
- world Overworld pack wiring in the LIVE bootstrap World.gd + kill stale Laria copy
- redeploy hoist apply_cache_bust above the beta deploy block
- tests add missing _RING_RADIUS_PX constant in vision ring test
- tests add missing _RING_RADIUS_PX constant in vision ring test
- loadscreen raise LoadingScreen.tscn layer 100→129 above ScreenFade (layer 128)
- redeploy WEB_VERSION parser accepts plain = (walrus-hook conflict)
- vision-ring G4 directional area pairing — detection layer=256, player vision mask=256
- overworld-combat flip Grid.visible at clip time — fight rendered invisible
- autoplay bd-3ng — basement dungeon entry + silent-stall contract
- testbridge _testSetUnitStat raw writes recompute derived stats (Quinn LB-2)
- ci cloud_export.sh defaults to godot4, refuses non-4.x binary
- export exclude pack-owned Laria zone scenes from bootstrap (bd-r41d)
- items-menu non-consumables navigable but not clickable (owner 2026-07-05)
- skills-menu relic picker — feather jumps to first relic, normal highlight (owner 2026-07-05)
- title move Debug button left of the mode-icon HUD (owner 2026-07-05)
- r41d runtime-safe pack-class refs so cold bootstrap parses (correct fix)
- combat-vfx extend slash canvas so the crescent stops clipping (owner 2026-07-05)
- ci T2 runner honors $GODOT_BIN (App can drop the image symlink)
- cursor P0 bd-ril — restore OS cursor when a menu opens over a hover icon
- combat/slash widen crop range to -2..2 so it no longer clips
- vfxbench add crop sliders + sync SLASH_PARAMS to combat
- combat/slash flash at the strike beat, spawn-synced (was too early)
- combat+menu rk9l attacker idle at swing-end; y5ia no hover-highlight on disabled items
- status/jp 8n6a Save enabled only when JP spent this session
- menu bitz — ConsumeItem no longer frees shared PartyHeader buttons (null CharacterSubpanel)
- controls WASD-mode left-click activates the feather-focused glyph-action button
- combat+difficulty transition 1.0s; difficulty feather positions on first open
- difficulty arrow-key hint tofu — font lacks ← → glyphs, use text
- difficulty axis 2 is respawn frequency, not enemy count
- combat zjh2 Move/Attack gated on AP; kcpz item skill opens ItemsMenu directly
- combat qdmd hide horizontal sword when action overlay hides
- ui difficulty select larger fonts (owner: text should be larger)
- combat 8nh0 enlarge facing-picker arrows 1.6x
- combat aaq VSlime poison terrain persists entire fight
- combat 8icf part 1 — enemy walking onto a drop tramples/destroys it
- combat 8icf part 2 — uncollected drops vanish at combat end (owner: missable)
- combat Run button actually flees — emit run resolution (was a stub)
- vfx-bench right-side floater panel was invisible (degenerate anchor rect)
- options mobile web — engine yields fullscreen to parent /play page
- vfx-bench default to combat mode; drop harmful URL benchMode param
- menus WASD->MOUSE flip re-applies hover to button under cursor (MenuBase)
- combat 2qi5 baseline align by descent-comp — number no longer floats high
- ui wwfi ConsumeItem item name gets black outline (font policy)
- menu mwsy debug button to full-screen Control + z_index 200 (top-right, un-occluded)
- combat item skill SELF-only range 0 + heal floater (owner clarified)
- menu wwfi ConsumeItem shows true qty 0 + disables Use on last item
- menus WASD->MOUSE hover re-pick via synthetic motion (emit didn't drive native :hover)
- player x6yq force idle when locked mid-walk (Elias no longer 'runs' during events)
- combat eupd Mother Slime wrong sprite + cscv Elias vanish at SluiceGate
- combat ykb2 clear textureOverride post-combat — Elias no longer invisible after boss
- waterway waj7 waterway hint dialogues re-trigger (activateMultiplePerScene)
- combat Mother Slime cluster — ovtt/wbub/ms8q/lffu/epdm (5 bugs)
- ck0t skip Mother Slime split-spawn on miss
- csrs 2x2 nav — pass unit size to BFS in AI policy walkable calc
- 751p route Item skill through SKILL-mode grid targeting
- wipe combat targeting overlays on combat end
- 278z Cure uses G3 HeavenlyLight (blue column) + heal number + idle
- 65c5 Cleanse uses G3 Aura (golden->blue burst) + poison removal + idle
- 65c5 Valerian Powder / Barbados Extract clear combat poison/acid
- Line Smite deals radiant alongside physical (was physical-only)
- VSlime enemy attack applies poison alongside physical
- combat wra9+eiwj — legible status turns label + poison immunity/absorb passives
- hxf3 CombatAIDriver unit_sz must be Vector2i, not int(unit.size)
- lock user pan/zoom on ChurchSquare combat (parallax breaks on camera move)
- victory plays on cinematic wins too (ChurchSquare), then silence
- ny2c #15 VSlime terrain-poison finite 3-turn countdown (was -1/permanent)
- oll1 sync SceneTemplate.gd dual-copies (Laria+Overworld) with bootstrap
- redeploy release export flock (fd 7) before spawning HTTP daemon
- zjh2 don't force-enable AP-cost buttons on return to SELECT — keeps 0-AP Move/Attack disabled
- 7c5b range-0 skills default-hover the caster's own cell, not the facing cell
- ysz0 P0 in-game Items-menu Cancel returns to MainMenu instead of hard-locking
- ysz0,7c5b v2 correct Items-cancel + range-0 hover regressions
- vfx-bench raise UI above debug overlays (layer 50->250) + hide pack overlay
- vfx-bench attack returns to idle (action_id guard) + Text panel cutoff
- pnze R3 arena adjacency + skills need AP + enemy attack uses real enemy path
- pnze R3 enemy Kill (dissolve+SFX) + attack hframes reset + arena battle music
- eupd arena Mother Slime uses real motherSlime sprite (was placeholder)
- pnze move SFX vol/timing sliders to own bottom panel (were cut off under text)
- e0uy SP badge stays stale after learning a skill — refresh overlay
- test cure lifecycle tests — grant Cure before arena + HP polling
- hv2d wire _award_per_use_ep on Smite hit — two-root-cause fix
- q0cf-reconcile belt-and-suspenders explicit flag for skill-shape TestBridge injection (hv2c/q0cf)
- test align p0ee EP floater cast timing with proven lifecycle sequence (p0ee)
- q0r7 JP badge stale on MenuOverlay after StatusMenu Save
Improved
- menus MenuBase party-readiness API; migrate StatusMenu+EquipmentMenu
Tested
- waterway close V2/V3 relic-loop + shader-guard coverage gaps
- menu regression coverage for MenuBase input-mode fixes (Bug 1 + Bug 2)
- tier4 SluiceGate/Mother Slime boss encounter e2e regression
- tier4 pin AutoPlay trailer poison beat (A2/bd-trailer) — xfail pending exec fix
- menu pin holistic WASD stale-click + Status stats-race + debug-button persistence
- tier5 rewrite playthrough_to_event_9 as AutoPlay observer
- tiers add tier markers to 159 untagged WebTests + regen test_index
- menu matrix mode-swap contract for Options/Status/SaveLoad + coverage inventory
- combat pin treasure-drop award path (closes PIN_COMBAT_DROPS)
- probes Mother Slime journey + real-scene combat stall diagnostics
- probes Mother Slime journey init-race escape + no-autoplay init-race repro
- probe traced-fight diagnostic for 9oo layer 3
- contract 10% jitter allowance on transition duration floor
- skilltree fog-of-war T3 regression pins (a-d)
- menu bitz ConsumeItem CharSub null regression pin (Vera)
- wrg0 combat item effects regression — Mugwort heal + Valerian poison cure
- combat bd-wq7s regression gates — turns label fix + immunity/absorb passives
- e0uy pin SP badge stale-after-buy regression
- i4nq Tier-4 regression for difficulty-gated treasures
- q0cf grant Smite in smite lifecycle tests (empty default PartySkills) — fixes stage2, isolates stage1 to the per-use EP wiring
- av72+jp3u regression pin — AoE/Cleanse EP + Berserckounter physical trade-off
Tooling
- deploy emit deploy manifest for v0.7.2109
Docs
- waterway spec for water-channel puzzle (verify+polish) + confirm G3 dialogue-trigger port complete
- waterway log live-verify findings — water shader G4 breakage (P7), triggers healthy
- migration-guide §4.7 Area2D pairing directional in G4 (symmetric in G3)
- pin New Game Options redesign stub (parked, owner 2026-07-06)
- branch-convention flag sandbox half as stale (superseded by worktrees)
- combat skill+relic damage/tier/EP audit for Quinn (93kc)
- correct Berserckounter from counter-attack to trade-off mechanic
Maintenance
- tests regenerate test_index/spine post tier-marker + menu-matrix merges
- sync LeaveArea pack copy byte-identical; rebaseline deferred Overworld audit findings
- probes c13-return trap capture + alpha-final boss scaffold tweaks
- baseline Overworld-synced PlayerCharacter.tscn Battle/Grid ref
- packs_src sync packs_src/Laria/Autoload/TestBridge.gd with bootstrap
- commit two untracked pack assets found by hermetic-export audit
- beads close yp5 + r41d
- gitignore protect .secure_templates (key-baked export templates)
- baseline WEB_VERSION 0.7.2125 (stop BUMP_ONLY version regression)
- sync x6yq PlayerCharacter idle-lock fix to Laria pack copy
- re-sync PlayerCharacter dual copies after nix-eupd-cscv merge (x6yq + cscv in all)
- sync ovtt Enemy.tscn collision_mask fix to dual-copies (bootstrap/Overworld)
- sync all dual-copy files (PlayerCharacter/SceneTemplate/Enemy/Credits) across bootstrap+Laria+Overworld
- baseline WEB_VERSION 0.7.2153 (stop BUMP_ONLY regression below last real deploy 2152)
- StatusPanel.png import metadata (regenerated on v2165 export)
- combat mini-batch: music loops + item-menu back + skill/item cancel → SELECTED
- cloud-deploy: one env-driven buildspec — DEBUG/ALPHA booleans select preset
- cloud-deploy: rename buildspec.develop.yml → buildspec.web.yml (all channels)
- G1 batch: kcd7/43cy/03tz — skill-tree depth-2 hint, feather on Controls+Consume, Mugwort heal
- cloud-deploy: buildspec.web.yml generic header + channel-agnostic artifact
- combat vfx batch: poison damage icon, smite sfx timing, mouse deadzone fix
- pnze R1: migrate slash/bolt/cloud VFX params to CombatVFXConfig
- pnze arena: real status-effect firing + SFX dump button + earlier attack SFX
- packs_src sync Laria/Autoload/TestBridge.gd with bootstrap (_public_build gating)
- pnze R5: wire CombatVFXBench to CombatVFXConfig as single source
- pnze R5 fix: seed _overrides directly from CombatVFXConfig (ClassDB guard was dead)
- e0es B0: combat-math overhaul recon + eject-seat tag reference
- e0es B1: ratio damage mitigation via CombatMath.mitigate()
- e0es B3: table-driven status->hit modifier hook (poison now, blind later)
- e0es B4: Mother Slime INT buff + WIS-heal + fog cooldown/prob + absorb cap
- B5 (e0es.6): difficulty = enemy offense only; Easy 0.5→0.6; fog cooldown wired to difficulty
- e0es B6: combat-math overhaul regression tests (Vera)
- u0xr/wwfi: MenuBase WASD-click helper + ConsumeItemMenu feather focus fix
- 6jt (WC-21): get_tree()->get_viewport().set_input_as_handled() x7
- va1p-addendum: wire allbyte:bug_report_open for mobile DOM overlay
- 6pjv v2: mobile Options tap hit-test — use canvas transform (v1 off by one row)
- combat status: 'Poisoned'/'Cleansed' floaters + live-tunable icon pos & turns font
- 6pjv v3: mobile Options tap — snap to nearest button row + remove TAPDBG
- 6pjv ROOT CAUSE FIX: OptionsMenu dispatch by button node, not hardcoded index
- r2gt fix: move victory zone-music-resume delay to SceneTemplate (survives teardown)
- anlf/1qmi/2yu4 combat VFX/SFX batch: kill volume, VSlime combo button, poison colors
- packs_src sync Laria/TestScenes/ArenaBench.gd (1qmi combo button)
- status display: live-tunable StatusPanel position + size (independent of icon)
- bd ovtt: route Enemy forceWalkToPosition through move_and_slide to fix wall clipping
- bd ChroniclesOfNesis-3txi: fix GameOver skill-leak — clear treeSkills+skills before load
- q0cf Phase 1: EXPERTISE_DESIGN.md — increment audit + tier-effect proposal + wiring sketch
- bd goxv: Enemy event-move bypasses wall collision; roaming keeps move_and_slide
- sync Laria TestBridge.gd copy with new expertise seams (q0cf test infra)
- hv2d (q0cf Phase 3A): EP increment sites + calibrated thresholds + MoveUp tree node
- hv2d (q0cf Phase 3A): fix Smite EP + wire Berserckounter/HealthUp EP sites
- sync Laria TestBridge.gd (hv2c Shape-2 skill branch)
- d2jl (Phase 3B): wire Smite tier effects — general level-effect mechanism
- av72+jp3u: AoE/Cleanse EP wiring + Berserckounter damage trade-off
- git-hooks: auto-sync beads DB -> git on every commit (fix recurring drift)
- WC batch (szj + d86): G4 web-compat fixes in Unit.gd + PlayerCharacter.gd
- QB-016 (0o8l): MotherSlime fog AI range-gate + AOE dedupe
- Q2 debug-compile-out: extract dev/mutation surface into excludable TestBridgeDev.gd
- bqam-2: fix Eastwood/Spiter mounting as Slime in VFX arena
- port G3 GameOver floating-particle effect to G4 (CPUParticles2D)
- clean up fake UIDs from GameOver.tscn and offset_glow import
- beads sync
- beads sync
- wdlz/uaxb/yj0l: immune/absorb/resist render ON the damage row (type icon + sub-label)
- beads sync
- beads sync
- save-tree: land hard_root node + save_tree_manifest.json (web scenario launcher)
- save-tree: hard_root packs correction []->["Laria"]
- save-tree: add hard_town + hard_windmill1 nodes (pauper spine)
- save-tree: add hard_root_looted node (maximal-branch start)
- save-tree: add hard_shop_maximal + hard_town_maximal_items (maximal branch)
revert
- combat drops are fully missable — no auto-collect (owner)
- export undo r41d Laria exclude_filter — it was too broad
- q0cf remove _pending_skill_id_explicit; fix skill bypass for smite (refs q0cf)
perf
- overworld bake decor variants into the .tscn — kill the _ready RNG storm
balance
- boss Mother Slime CON 25 → 12 (owner-approved L3 floor)
- boss explicit max_hp=38 override — decouple boss HP from the CON dial
- spawns waterway density + VSlime depth gradient (owner-approved)
fixtures
- sluicegate_pre_boss (Quinn) + manifest hygiene per save-coverage audit
- saves add sluicegate_boss_leveled (L5) scenario save
style
- overworld location panels use standard non-interactive asset + Modern Goth
ci
- buildspec pre_build installs the custom key-baked web template (encryption fix)
- fix os shadowing in boot_check.py main() (UnboundLocalError)
- boot_check.py names failing request URLs (404 diagnostics)
- boot_check.py — 180s timeout + de-noised console tail + gameState probe
- boot_check.py — force software WebGL2 + capture full boot-abort error
- add unconditional artifact-integrity gate to cloud_export.sh
- revert boot_check SwiftShader/ANGLE flags — plain launch (App proof)
- boot_check probes crossOriginIsolated + WebGL2 context on failure
spec
- new-game difficulty-select screen — owner-confirmed (ybyz)
polish
- difficulty enlarge fonts (~1.4x) for readability
- difficulty tagline + hint text; confirm starts game directly; Main Menu difficulty label
- pnze arena hides pack-status overlay + trims panel titles
- pnze clear bench names in DebugMenu
- pnze hide 'Walk Elias into the Slime' Subtitle label in VFX arena
tune
- combat 2qi5 crisper floater text — 2x supersample via bake+counter-scale
- combat 2qi5 floater colors + sizes per owner policy
- combat 2qi5 crit stays RED — colors encode damage type
- combat 2qi5 baseline-align damage row + compact level-up
- combat 2qi5 tighter floater stacking — half a row between queued rows
waterway
- lock water shader params + fix RelicHint firing + enlarge relic pickup
audio
- combat/dungeon SFX + VictoryShort + volume + zone music resume (8 beads)
beads
- bopn + 1qmi -> needs-verify (fixed v0.7.2201)
- resync issues.jsonl to live DB (5-day drift + today's needs-verify sweep)
- pin Q2 debug-compile-out (k5g6) + ArenaBench status-tune (2qdf)
- auto-close post-commit hook + reconcile 28 resolved-but-open beads
- p2da (acid+rotation), bqam (Eastwood/Spiter port), 98qs (letterbox cursor), name-tag split from 2qdf
- sync
- sync (2k4p, 98qs scope)
- sync (gameover particles bead)
- seed verify-loop dry-run bead (needs-verify)
- close 8 owner-verified issues (verify-loop first live run)
- close throwaway verify-loop dry-run bead (gqsc)
va1p
- add in-game "Report a Bug" feature (Options → BugReportMenu)
COMBAT_MATH_B2
- ratio hit_chance() for physical + all magic apply-chance sites
fbrk
- fix charge-run frames static — ResourceLoader.exists + startChargeAnimation()
- sync PlayerCharacter.gd pack copies (Laria+Overworld) with bootstrap fix
ej12
- hide HUD immediately on run/flee so no combat UI bleeds into overworld
FIX
- OptionsMenu tap-routing in WASD mode — hit-test before handleClick (mobile)
6pjv
- TAPDBG instrumentation for mobile Options tap-routing (temporary)
- TAPDBG2 mobile-capture instrumentation (v3 still mis-routes on mobile)
- strip TAPDBG2 debug logging (mobile tap fix confirmed on device)
lv9q
- authoritative post-deploy :8060 health assert (HTTP-fetch packs)
csrs
- fix 2x2 footprint pathfinding — wrong end cell + add T2 regression tests
r2gt
- split victory player-release from zone-music-resume
5pb8
- move difficulty cards row down 20px so title is no longer covered
ljjz
- skip Berserckounter Relic (item 24) drop from Mother Slime on Easy
mphs
- hide Move Relic (id 17) and Health Relic (id 15) on Medium difficulty
- rework difficulty gate — delete Mayor's-office Health Relic, gate Easy+Medium
- gate Move Relic (iid 17) and Old Pendant (iid 18) by difficulty in Relic.gd
09gr
- confirm expertise EP→tier pipeline is incomplete (display only)
c2at
- hide expertise tier nodes on Easy mode in skill tree UI
EXPERTISE_DESIGN
- Phase 2 — category-calibrated thresholds (q0cf)
- Phase 2 FINAL owner decisions (EP-on-hit, HealthUp per-damage-absorbed, Sweep L2=PhysDmg+, Phase3 scope=Elias+combat relics, Web deferred)
q0cf
- Phase-3 expertise-lifecycle test framework (TEST-FIRST) + TestBridge seams
p0ee
- add +N EP floater in combat when EP is granted
- pin EP floater regression — seam + test
combat
- register radiant as magic-defended type; independent magic_attack roll (d2jl/93kc)
- floater sequencing rule — damage rows no-overlap, status text+icon +0.75s (uaxb)
- numeric physical_resist multiplier + Poisona Pendant poison-resistance + QB-018 HP load clamp (x0bh)
tests
- smite fix stage-6 level seam + add radiant structural pin (d2jl/93kc)
yhgj
- fog retune (Quinn 93kc) — Mother Slime INT 20->13, Hard fog cooldown 1->2, VSlime poison-absorb heal ->50% (minor)
- Mother Slime co-tune — Quinn 4-dial owner-approved (winnable both floors)
redeploy
- hard-abort when :8060 is held (LOCALHOST_HOLD.md)
xnpx
- MenuOverlay mobile-touch tap routing — port OptionsMenu _touch_hit_test
boot_check
- match smoke_prod launch (drop --no-sandbox default) + log console errors
hooks
- broaden beads_autoclose to prefix + merge + conventional styles
1kid
- Title WASD-mode click activates focused option (motion deadzone)
- contract-guard test — Title WASD click activates focused option
iup5
- play menu-nav SFX on skill-tree focus change in mouse mode
q0r7
- fix test instance_null default + mark NON-GATING (vacuous)
2qdf
- status-icon head-anchor + crisp turns-number + damage-pause coupling (owner live-tune)
bqam
- port Eastwood + Spiter sprites G3→G4, wire into ArenaBench
- guard attack/slap slime-sheet fallback (Eastwood/Spiter did slime attack)
ArenaBench
- Enemy picker as OptionButton dropdown, left above action panel (owner)
- sync Laria copy with bootstrap (dropdown + bqam2 ability fix)
2k4p
- enemy art pipeline — G3 art backfill + kill cross-enemy fallback (C1) + generic special-attack hook (C2)
wdlz
- Immune/Absorb feedback floater when poison cast on a resistant unit
- absorb floater = heal green (_HEAL_COLOR), immune = resist grey (_RESIST_COLOR)
yj0l
- physical resistance — VSlime + Mother Slime take HALF physical damage (grey floater)
doc
- physical-resistance rebalance brief for Quinn (VSlime + Mother Slime)
kx5p
- spawn smite radiant floater — radiant damage was applied (HP) but invisible
aj58
- VSlime poison terrain persists whole fight (_VSLIME_POISON_DURATION 3 -> -1)
p2da
- ACID full status effect + rotating status panels
TestBridge
- generic _testInjectAction hook (roan ui_select save-menu enabler, Quinn save-tree)
CombatVFXBench
- add Immune + Absorbed to universal text panel
v0.7.2109
25 changesNew
- combat treasure-drop system (G3→G4) — kill→drop→pickup verified
- controls suppress control HUD + Controls button on web-mobile via _allbyteMobileContext
- title restore cloud art — remove CloudCanvasLayer visible=false
- ControlsMenu 5-item UI refinement pass
- controls-menu device-scoped column nav, bottom-left feather, bigger fonts, full-width buttons
Fixed
- combat item-drop persist + _testPickupAt test hook
- vslime green tint in overworld + correct fadeIn + walrus parse fix
- ControlsMenu conflict-flow unreachable + Esc over-cancel during capture
- controls guard MenuOverlay autoload against closing ControlsMenu mid-capture
- controls guard all 4 Esc-closers + Escape reserved/permanent on Cancel
- ControlsMenu feather corner bottom-LEFT → bottom-RIGHT (2px inset)
- ControlsMenu GLYPH_ACTION popup — feather + nav as real modal submenu
- controls gpos := walrus broke ControlsMenu autoload load (v2091 regression)
- controls-menu resolve 3 glyph-action popup bugs (Esc dismiss, click leak, feather)
- controls popup buttons unclickable — GLYPH_ACTION _input ate mouse clicks
- deploy-manifest re-add squashed v0.7.2069 + dedupe bounced version keys
- controls right-click dismiss fires on RELEASE, not PRESS
Tested
- controls interactive control-remap regression suite (Tier 3)
- controls flip conflict xfail (fixed) + pin Esc over-cancel; durable headless WebGL2 boot
- controls regression suite for popup-driven ControlsMenu remapping
- controls correct headed-tier docstring to verified data + register realbrowser marker
Tooling
- deploy-history manifest emitter + backfill v0.7.2066–2069
- promote_to_staging.sh — staging-cut ritual + auto-emit deploy manifest
- backfill full deploy manifest from G4-migration anchor (v0.4.5 → v0.7.2100)
Maintenance
- release bump WEB_VERSION 0.7.2108 -> 0.7.2109 (release build staged for App)
v0.7.2069
3 changesNew
- cache version-query engine fetch for wasm+pck (CACHE-BUST-WASM-PCK)
Improved
- deploy extract patch_index_js to shared tools/lib/cache_bust.sh
Tested
- cache regression guard now covers the PUBLIC build index.js (the iPad/PWA source)
v0.7.2068
13 changesNew
- shell surface real first-load progress bar — reverse dot-only spec
- title background preload Laria.pck while player sits on Title
- testbridge add new_game_started funnel signal to gameState
Fixed
- QB-005 WordsOnBlack auto-transitions to EliasHouse after intro dialogue closes
- autoplay AP-ROUTE-GAP — events 3/5/8 now schema-driven via triggerKind
- webkit remove Title screen-reading shaders (god-rays/water/cloud-shadow) — iPad Title asset-drop fix
- P2 guard HoverIndicator JSON.parse_string against non-JSON eval results
Tested
- conftest per-file browser isolation + bulletproof zombie/OOM teardown
- infra close residual zombie/OOM gaps — reap init-orphans, playthrough teardown, pytest-timeout
- infra scale xdist to 4 workers + per-deploy release/pick gates
- frontier refresh pre-combat saves to 0.7.2048 + add cond_00 EliasHouse
Tooling
- one-command rebuild of the encrypted web export template
- webkit_verify.py — Safari/WebKit render smoke check
v0.7.2047
154 changesNew
- testbridge input-routing matrix observability — 7 gaps filled
- test-scene extend TreasureTestRoom with interior walls + area-gate interactables
- phase9 v0.1 SIM cross-validation scaffold + battle outcome hook
- phase9 composition override for SIM cell catalog parity
- phase9 between-battle reset — respawn killed enemy bodies
- balance encounter_sim_v3 — player avoidance axis + per-room rates
- balance wire v3 encounter rates into attrition_sim + tuning knob
- balance ambush + boss scene kinds + XP/level tracking
- balance combat_sim VSlime poison terrain + smart-kite policy
- church-square 2x cinematic zoom for Event 1 combat intro
- church-square combat transition tuning + Hero's Song persistence
- status-menu make Clear WASD-navigable like Save
- options default focus to Save on the New Game flow
- Dialogue Size dropdown in Options menu (Small/Medium/Large)
- skilltree add Skill_RelicSlot.png for the relic-slot node
- skilltree relic-slot nodes (id 31, 1 SP) above Smite + Line-Smite
- combat directional slash — orient crescent to attack facing
- testbench CombatVFXBench — 4-direction combat animation/VFX bench
- testbench CombatVFXBench Animation/Combat mode toggle
- debug Debug Menu > Test Scenes > CombatVFXBench load button
- title corner Debug button opens DebugMenu from Title
- testbench live slash-shader tuning via live_cmd (broadcast-driven)
- testbench prompt attack->idle + damage-floater buttons
- testbench live-tunable slash flip + attack feet nudge
- capture _testCaptureMode composite for clean marketing recordings
- skills-menu Phase 2 relic slots row + picker (runtime slotting)
- SkillsMenu relic slot picker diagnostic logs + version bump v0.7.2001
- relic-slots persist Skills-menu relic slot bindings across save/load
- quinn Movie Maker capture infra — QuinnTourDriver autoload + harness
- combatgrid debug_paint setter queue_redraws on toggle (live-tuning)
- combatgrid @tool + editor-draw so the grid is visible/editable in the editor
- churchsquare reposition combat grid in editor (position 0,30 -> 10,12)
- controls-discoverability Phase 2 — InputMap rebind + device tracker + title card
- controls-discoverability commit glyph assets + card uid + Tier-1 preventDefault
- controls Kenney glyph swap + GlyphResolver + ControlsCard PS branding + ModeIndicator
- title hide TitleMenu while ControlsCard is visible (Task A)
- pause Controls button in pause menu + ControlsMenu reference table (Task B)
- title rewrite ControlsCard into persistent two-corner control-hint HUD
- ui control-UX triple: HUD corners + remove pause Controls + title Controls item
- controls Phase 2 consolidated — 4 modes, backing, flush corners, 2-col menu
- hud diamond action cluster, ModeIndicator top-right + Title suppress, difficulty popup upward
- hud WASD diamond cluster + difficulty subpanel enlarge
- spine auto-derive scene nodes from test_index + coverage-gap report
- export encrypt both web PCKs (debug + public) via custom keyed template
Fixed
- autoplay Phase 8 partial — chest state machine + 3 real game fixes + bd-ch80
- menus bd-eq73 — consume ui_accept in EquipmentMenu._input
- switch unify bootstrap/pack Switch.gd + bump version
- interaction bd-ig01 — gate _fire_pending_interact on area overlap
- autoplay bd-ch80 — Phase 8 chest cycle completes after area-gate land
- combat camera: widen Camera2D limits during combat (Waterway1 fix)
- combat camera: per-edge grid margins + fix transition jump (global vs local pos)
- combat camera: round 6 — grid bounds include cell half-size (the real bug)
- combat camera: regression tests for transition silence + autoframe gate
- treasure overlay: fix WASD interact same-frame dismiss race + WASD pin
- bridge jump regression pin (Group C)
- regression pins for highlight + cursor (owner 2026-06-17)
- fix initial-highlight + feather-on-mouse-motion (owner 2026-06-17)
- fix disabled-button focus-bleed (owner 2026-06-17)
- feather-only in MOUSE mode + exactly-one-cursor regression pin
- fix parse error in ui_left/ui_right elif indentation
- churchsquare-zoom zoom timing, zoom-out survival, victory music silence
- dialogue name-persist on multi-line and event dialogue; bump box+font sizes
- mainmenu disabled-button highlight bleed — 3-root-cause fix
- status-menu WASD nav focus + feather on open; robust integration tests
- status-menu Save/Clear feather to bottom-right corner; Down-from-Clear → char; stop stray button highlights
- saveload clear save-slot highlight when WASD nav enters Export/Import row
- packloader stream pack download so the LoadingScreen bar fills
- save persist learned tree skills + per-unit stats across save/load
- equipment scope bd-eq73 ui_accept consume to WASD — restore mouse clicks
- skilltree blue-filled lit connectors + full-chain lighting + cursor
- cursor stop PlayerCharacter forcing OS cursor VISIBLE inside menus
- combat slash crescent stays stationary (sweep_extent 1.20 -> 0)
- cursor feather tracks real pointer in MainMenu mouse mode (no button warp)
- hud gate status/debug watermark overlay on GlobalWorld.debug
- options shorter dropdown rows + WASD nav advances from current
- cursor feather tip lands exactly on the mouse (was ~30px up-left)
- testbench show the OS cursor in CombatVFXBench
- combat attack feet anchor to frame 0 (no idle->attack jump) + bench flip
- equipment re-resolve _unit on action-panel build — first-open empty sub-page
- skills-menu relic asset fits inner ring (~3px frame) + WASD nav to relic slot
- title hovering Debug clears hoverMode so its click doesn't fire New Game
- skills-menu 5 relic-slot picker + WASD nav fixes
- churchsquare 3x slower custom Event-1 cinematic zoom (1.5s -> 4.5s)
- churchsquare zoom linear ease so the 4.5s cinematic zoom reads as deliberate
- churchsquare disable perspective camera zoom (perspZoom 1.0 -> 0.0)
- churchsquare zoom tween from current zoom (no .from snap-out)
- combatfacepicker use global_scale for head-top (arrows too high on scaled scenes)
- fix public-build deploy gaps (App Claude GAP 1+2)
- autoplay add triggerKind=area_enter to Events 9+10 in core_EventConditions.json
- Merge Event-10 AutoPlay fix: triggerKind=area_enter for Events 9+10
- QB-003 loadGameSave leaves player permanently isLocked
- Merge QB-003 load-lock fix: clear locks + skip event re-fire on save-load
- controls replace := with explicit types in ControlsMenu (parse errors)
- controls replace red-cross mode_controller.png with PS5 controller silhouette
- modeindicator flush top-right corner (overlap minimap OK, owner)
- options difficulty now saves to localStorage and restores on boot
- options WASD focus index 8->7 after in-game Options>Save>close
- options difficulty popup opens under the button, not top-left
- options difficulty confirm uses highlighted item, not stale tracker
Improved
- equipment remove gear-relic slots — relics slot via Skills menu now
Tested
- interaction bd-ig01 13-cell area-gate matrix
- combat transition: state machine + contract test suite
- combat transition: enemy-first lockout test + force-first-actor hook
- _testWarpToScene warp hook for App's walkthrough capture
- testbridge warp: also hide pack overlay as a side effect
- DialogueTrigger pack-mirror + Group B proximity hint tests
- church-square pin 2× cinematic combat zoom contract (e62f611 regression)
- regression three Tier-3 pins for recent menu + dialogue fixes
- status-menu WASD-driven JP spend → Save / Clear integration tests
- options pre-warm Laria pack in New Game Save→WordsOnBlack pin
- status-menu stat-coverage breadth + battle-stat mapping suite
- status-menu GAP 3 — rendered stat-label text updates on-screen
- skilltree grant→stat-apply + menu-reopen + save/load persistence suite
- cursor pin single-cursor invariant in menus
- skills Tier-3 regression for Skills-menu relic-slot picker
- skills,title relic-picker UX + Title Debug-click regression suites
- QB-003 pin Continue/Load no-soft-lock regression
- controls+difficulty Phase-2 control regression pins + difficulty persistence + spine.json
Release
- staging bump WEB_VERSION to 0.7.2042 for staging build
- bump WEB_VERSION to 0.7.2047 (encrypted build, fresh version)
Docs
- framework gotcha #69 — walrus := load-failure, scoped (was memory-only)
Maintenance
- autoplay Phase 7.3 partial — state machine + 300ms EquipmentMenu debounce + bd-eq73
- testscenes commit ArenaBench.gd.uid (auto-generated)
- per-turn input lockout contract + AutoPlay integration
- combat camera: pan-clamp contract — bg edge ↔ HUD edge within 2px
- combat camera: grid soft-margin clamp + Background node fallback
- combat camera: round 5 — Y-only limit widen + top margin 20
- combat camera: transition no-motion + 40px-margin autoframe (0.5s)
- walkthrough scene-graph for App's magazine-scroll guide
- combat camera: bump AUTOFRAME_SAFE_MARGIN_TOP_PX 140 → 250 + Vera pin
- combat camera: autoframe trusts safe-rect; GRID_TOP_MARGIN_PX 20→210
- G3→G4 migrate waterwayChannel.gd + SluiceGate.gd + water-state pin
- laria batch: missing audio assets + ChurchSquare music + revert feather-follow
- lock in FrontHills position (-700, 0) — owner live tune
- mainmenu + cursor: residual highlight + feather-follow with hide watchdog
- cursor v5: clear custom cursor texture in notify_mouse_motion
- include Export/Import in _mb_interactive_controls
- move Export/Import row above the scrollable save-slots
- WASD nav reaches Export/Import + larger font
- Merge sandbox/vera-ae814601 into develop
- action-row nav — up/down jump to slots, left/right flip
- release action-button focus when leaving action row
- Merge sandbox/vera-a7e4934e into develop
- WEB_VERSION 0.7.1959 (session redeploy bumps) for staging cut
- testbench slash flip_x mirror (across Y axis) per owner
- quinn relocate capture infra off develop
- WEB_VERSION bump to v0.7.2015 (redeploy artifact from relic-picker + title fixes)
- churchsquare zoom 2.0s (was 4.5s — owner: too slow)
- remove Dialogue Size option from Options menu
- nudge DownRight slash crescent right + up (offset 0.15,-0.15)
- live slash-shader preview hook for in-browser tuning
- CombatShaderTuner — tabbed live tuner for combat shaders
- controls update .import UIDs to Godot-assigned values after export
- controls commit new-autoload .uid + mode_touch .import
v0.7.1848
23 changesNew
- autoplay Phase 2 — boss-engage level override
- autoplay Phase 3 — combat retreat as per-persona toggle
- autoplay Phase 4 v1 — shop detour routing on retreat cycle
- autoplay Phase 4 v1c — shop buy state machine + merchant flakiness diagnostic
- TestBridge add _testCloseShop hook per Vera merchant-test conftest gap
- combat Item skill opens ItemsMenu mid-combat, consumes + heals
- autoplay Phase 5 — Scout consumes Mugwort mid-combat
- autoplay Phase 6.1 — open StatusMenu when leveled up
- autoplay Phase 6.2 — StatusMenu observation layer
- autoplay+ui Phase 6.3 — spend JP + Save via WASD nav
- testbridge expose raw stats via _testReadPartyXP
- autoplay Phase 7.1 — open EquipmentMenu when inventory has unequipped gear
- autoplay priority report on top-left debug overlay
- autoplay Phase 7.2 — EquipmentMenu observation layer
Fixed
- redeploy sync Web Public variant to AppC dir + drop self-ref symlink
- autoplay Phase 4 v1b — Merchant interact via NPCInteractionArea
- autoplay Phase 4 v1c — click on Merchant sprite not NPCInteractionArea
- autoplay Phase 4 v1d — buy Mugwort not Irid Liquor + shop debounce + loop gate
Tested
- Vera StatusMenu feather tests (d0b535a) + Arc Phase 1 retreat-to-bed (047638d)
- shop pin GeneralStore Merchant interact → shop-open contract
- Merge sandbox/vera-merchant-tests-002 into develop
- shop pin AutoPlay Phase 4 buys Mugwort, not Irid Liquor
Maintenance
- autoplay remove shop-trace diagnostic — kept buy state machine
v0.7.1810
8 changesNew
- autoplay per-turn watchdog + WaterwayChannel exit unlocked
- redeploy+plan BUILD_PUBLIC=1 default + AutoPlay persona plan doc
- autoplay Phase 1 — risk-based retreat-to-bed router
Fixed
- autoplay bail combat cursor from stuck-direction loops
- autoplay stop cancel-spam after attack confirm + intent diagnostic
- status-menu remove unconditional MOUSE_MODE_VISIBLE on mouse motion
- Merge sandbox/nix-status-menu-nav-fix into develop
Tested
- status-menu pin WASD-feather invariants (regression coverage for 78a9bc4)
v0.7.1803
5 changesNew
- tier-gated gate DebugMenu behind OS.has_feature("public")
- tier-gated Web Public export preset + opt-in dual-build
Fixed
- status-menu revert _debug_value_override default to empty (real stats)
- status-menu remove gold focus ring — feather + standard Button focus
- redeploy kill prior Tier 5 playthrough before kicking new one
v0.7.1798
97 changesNew
- branch model: add merge_agent_branch.sh, drop sandbox sync/promote scripts
- combat-camera single-camera refactor + QUART ease curve
- close gap #2 — add WaterwayChannel, full topology
- save schema: add discoveredDungeonScenes per-slot (fog-of-war)
- minimap game-side scene-mount emits + allbyte:ready initial state
- autoplay dungeon encounter mode + encounter NDJSON logging
- status-menu 2D WASD grid nav for raw stat +/- buttons
- TestBridge add _testReadUnitBattleStats + _testFireStatusClear hooks
- status-menu canvas-rendered gold focus ring for WASD nav
- combat transition-in 2.5s→1.0s, horizontal sword fix, transition-out sequence
- combat XP grant + level-up sequence on enemy kill
- damage-queue stack-aware peak Y + fade-begin gate for clean combat end
- combat WebUnitStub.incrementExperience completes XP grant chain
- autoplay Scout persona scaffold
Fixed
- StatusMenu parse error from orphaned col_w reference
- ArenaBench gets bd #9 phases 2-6; Windmill1Basement door debug bypass
- Windmill2Basement door: same debug bypass as Windmill1Basement
- door debug bypass: short-circuit on debug + null-safe party check
- pre-mount bug: CombatOverlay extends Node, has no `visible` property
- disable bd #9 pre-mount until interaction regression isolated
- Merge sandbox/nix-cursor-cover-fix into develop
- combat transition polish v2: 7 specs + await fixes + smoke test (v0.7.1624)
- revert BattleTransitionHandler self_modulate change (forensic, NOT a fix)
- autoplay three dungeon bugs — backtrack, startup delay, spurious encounter log
- autoplay clear inBattle on loadGameSave + _testForceEndEvent
- MenuBase restore OS cursor visibility in _mb_inherit_global_mode MOUSE branch
- AutoPlay eliminate backtrack via fixture discoveredDungeonScenes + case normalization
- menus update HTML5 guards to Web for Godot 4 + remove diag logs
- TestBridge+ItemsMenu accept plain string in _testSetMenuInputMode + move _mb_inherit_global_mode out of items guard
Improved
- combat transition cleanup: drop dead cover, hide cursor during transition, instrument pause (v0.7.1614)
- status menu: pass 2 + 3 + live-loop refactor
Tested
- tier2: combat script parse-error surfacing test (v0.7.1625)
- Merge sandbox/vera-parse-error-test into develop
- status-menu Tier-3 JP-spend regression suite (v0.7.1759 visual refactor)
- status-menu cross-test rebuild + force-focus to land additional spends
- wasd-nav pin StatusMenu 2D nav grid + visual baselines
- cursor-visibility pin MOUSE-mode + menu-open contract
- status-menu Tier-3 edge-case sweep + Clear multi-click bug pin
Maintenance
- StatusMenu round 7: font -25%, battle column swap, battle divider
- StatusMenu round 8: rows stretch to fill vertical space
- StatusMenu rounds 9 + 10: panel split + tighter values + mid-panel divider
- combat-transition: smooth StartCombat hitch + post-combat polish
- bd #9 followup: build cover in _init so fade_in works pre-_ready
- bd #9 followup: set ColorRect size explicitly so cover paints frame 1
- v0.7.1574 — promote Nix's bd #9 transition smoothness to develop
- combat-transition: cover yield uses frame_post_draw + timer
- bd #9 phase 2: pre-mount CombatOverlay at scene init
- bd #9 phase 3: pre-build sub-handlers in CombatOverlay._ready
- bd #9 phase 4+5: pre-warm battle sprites + Unit pool at scene init
- bd #9 phase 6: pre-INITIALIZE Units at scene load
- bd #9 timing: instrument encounter path with [TIMING] +Nms prints
- ROOT CAUSE: _BATTLE_SNAPSHOT_SCRIPT preload path was wrong
- bd #9 re-enable pre-mount + phase 7: pre-warm BattleTheme.ogg
- bd #9: TIMING-ABS instrumentation around encounter chain (v0.7.1602)
- bd #9 phase 8: defer _play_battle_music (v0.7.1604)
- bd #9 phase 9: AUDIO-PROBE results — gotcha #69 + devlog
- bd #9 phase 10: AudioWarmer autoload (v0.7.1610)
- bd #9 phase 10c: AudioWarmer keeps players alive (v0.7.1612)
- gotcha #69: fold in v0.7.1612 keep-alive learning
- bd #9 polish: tunable combat transition knob (v0.7.1610)
- combat HUD: state banners button-styled + stat block align + End/Run + font +10% (v0.7.1615)
- combat HUD: state banners button-styled + stat block align + End/Run + font +10% (v0.7.1615)
- v0.7.1615: redeploy bumped, capture pause measurements
- title menu: font +20% (44->53), true-centered, MSDF on ModernGoth (v0.7.1615)
- Merge sandbox/nix-hud-tweaks into develop
- Merge sandbox/nix-title-font-bump into develop
- split MSDF/non-MSDF + in-game menu buttons +25% (v0.7.1619)
- disable MSDF on ModernGoth.otf (v0.7.1620)
- combat transition polish: T=1.0, units always opaque, left flip, stat-block slides, sync chunked, default target (v0.7.1619)
- Merge sandbox/nix-transition-polish into develop
- Revert "Merge sandbox/nix-transition-polish into develop"
- in-game menu: unify Skills + AbilityTree text rendering (v0.7.1622)
- combat transition polish: T=1.0, units always opaque, left flip, stat-block slides, sync chunked, default target (v0.7.1619)
- Merge sandbox/nix-transition-polish-v2 into develop
- in-game menu: unify all 9 button heights (BUTTON_HEIGHT=120) (v0.7.1626)
- remove duplicate _find_first_living_player declaration (Vera-surfaced parse error)
- Merge sandbox/nix-menu-button-height into develop
- combat transition: reuse overworld camera (tween, no snap) + drop redundant Elias hide (v0.7.1627)
- combat transition: TRANSITION_DURATION 1.0 → 2.0 (owner tune)
- combat ATTACK: include actor's own cell in yellow + cursor-allowed (was d==0 excluded)
- Merge sandbox/nix-transition-camera-elias-hide into develop
- sim phase 1: equipment battleStatMods + loadout-aware attrition_sim + combat_sim (v0.7.1628)
- sim phase 1 v2: data-driven availability via scene graph + treasure pack tags (v0.7.NNNN)
- Merge sandbox/nix-sim-data-driven-availability into develop
- combat transition: TRANSITION_DURATION 2.0 → 2.5 (owner 2026-06-03)
- title menu: panel_margin 4→28 to clear corner ornaments
- title menu: panel_margin 28→4 + y-offset 200→220
- main menu: Flourishes z_index -1 (push corner sprites behind buttons)
- status menu: Clear button always visible, disabled when nothing to clear
- status menu: revert divider to panel mid-height
- status menu: per-stat region tint backgrounds (raw + battle panels)
- Waterway dungeon stitched mapview MVP
- status menu: visual-loop session — full lock-in pass
- regen at 596×266 (~85 KB) per AppC sizing ask
- drop minimap assets at /godot/minimap/ for AppC fetch
- enable via ?autoplay=1 URL query param
- lock in session work — Arten dialogue, CharacterSubpanel right-anchor, debug logs, font import fix, .uid sweep
v0.7.1563
2 changesMaintenance
- StatusMenu round 4: flat 2-column layout + full names + live-tunable
- StatusMenu round 6: +50% font + horizontal dividers under STA/SPD
v0.7.1555
3 changesDocs
- codify 4-branch model + WEB_VERSION/tag convention
Maintenance
- 2-column layout + Clear button + decrement gate + battle refresh
- sectioned 2-column layout for raw + battle stats
v0.7.1550
35 changesNew
- skilltree CharacterSubpanel + player select buttons (parity with Status)
- pwa Title checks for AppC PWA update pending on _ready
- charsubpanel _charsubpanel_layout_locked tune-mode flag (live_mutate)
- charsubpanel slim variant — 2-row compact for SkillTree header
- charsubpanel lock in slim layout from live-mutate iteration
- menu slim CharacterSubpanel header for StatusMenu + SkillsMenu
Fixed
- menu pair-button horizontal chrome overlap (the actual gap)
- debug SP/JP mutations propagate to MainMenu badges + Skill menus
- newgame wire Laria pack download to Options Save (with LoadingScreen)
- debug,subpanel MainMenu CharacterSubpanel refreshes on stat mutation
- menus SkillTree height + early prebuild; Status row spacing; CharacterSubpanel 2x3 table
- menus bump SkillTree header; fixed row gap; +/- touch; placeholders
- skilltree drop header chrome; subpanel + select-panel fill full header height
- partyheader detach_all hides parked widgets (no scene-bleed)
- combat-picker inline MOUSE-mode flip on left-click
- combat-picker UX taxonomy + diagonal-sword invariant + click manual-dispatch
- combat-picker WASD click fires WASD-focused skill, not hover target
- combat overlay parse error — drop duplicate show_skill_aoe
Improved
- charsubpanel split slim data vs layout; bump SkillTree header to 140
Tested
- skilltree Tier 3 WASD-nav + Learn regression pin
Tooling
- sandbox<->develop branch boundary scripts
Docs
- bugs log SaveLoadMenu UX overhaul (#9) — title-in-panel, top E/I, default focus, font
- bugs queue Status 2-col + Save-in-raw-panel followup (#10) for Nix
- bugs log #14 combat HUD polish; note banner work isn't in git history
Maintenance
- combat skills picker: WASD nav paints button highlight
- VIEW/SELECTED/CONFIRM state banners + SKILL-cancel reopens picker
- combat skill picker: feather kill + WASD-default open + button assets
- combat skill picker: defer WASD-open focus paint until layout settles
- combat confirm-mode: cursor confined to valid region + AOE grey/white split + grid-bounds paint clamp + smart skill default cell
- combat action overlay: deferred focus repaint on turn start
- combat action overlay: reparent sword from $Control to CanvasLayer root
- combat action overlay: persist WASD to GlobalWorld at showL(true)
- cleanse range 3 → 0 (mirror cure)
- bd #9: file battle transition pause for transition-polish cycle
- deploy v0.7.1550 — promoted bc7a679 from sandbox for review
v0.7.1509
34 changesNew
- dialogue tag scripted dialogue rows with info-critical vs flavor meta
- dialogue first-click-scripted, re-click-rotate ambient + reminder
Fixed
- input,dialogue click no longer flips WASD→MOUSE; unblock ambient gates
- dialogue rotate negative-id rows; clear optionMap on rotation
- skilltree repaint hover on BuySkillMenu pop; diag Learn click
- input gameplay motion-deadzone — right+left click stops flipping mode
- Laria-pack mirror PlayerCharacter motion-deadzone fix
- transit,scarecrow WASD bypasses LeaveArea nav guard; G4 anim revive
- leavearea body_entered backs up area_entered for post-walk arrivals
- input,buyskill cursor visibility on real motion; diag Learn flake
- menus Learn always-dispatch on focused; thicker outlines; drop Paladin
- menu MainMenu row chrome overlap — vertical gap matches horizontal pair
Tooling
- add app_deploy.sh + APP_DEPLOY.md for App-Claude self-serve web exports
Docs
- MainMenu disabled-button text + tight-margin rule doc
- bugs strike #1/#2/#3 (resolved in v0.6.1498/1502/1503)
Maintenance
- Menu UI overhaul chunk 1: MenuBase style helpers + 6 menus
- Menu UI overhaul chunk 2: DefaultButton + SaveLoadMenu + ShopOverlay + MenuOverlay + OptionsMenu + ControlsMenu + Title
- Mobile Phase 2 #2: SaveLoadMenu Export + Import buttons
- TitleMenu Panel uses BorderButton_Depressed (panel-with-buttons)
- adopt MenuBase canonical button triple
- canonical theme + Equipment 1/3 width
- Title menu: centered + always-visible buttons; hide parked PartyHeaderPanel widgets
- shift panel +200px and center button text
- center Chronicles sprite above menu, real Continue disable; SaveLoad Export+Import both modes
- Disabled button state: opaque mid-grey background + dark-grey font
- white font (was literal-black variable misnamed "white")
- white text + black outline on the RichTextLabel child
- WebBridge autoload: handle allbyte:visibility postMessage
- optionsButtonMargin 2 → 0 (buttons touch)
- drop inner panel chrome on Ability/SaveLoad/Options pair panels
- Laria-pack mirror DialogueHandler dual-copy to match bootstrap
- Merge app-deploy-script: tools/app_deploy.sh + APP_DEPLOY.md for App-Claude self-serve exports
- skilltree drop Learn click diag — owner confirmed working
- bump WEB_VERSION to 0.7.1509 (ahead of staging@0.7.1508)
v0.6.1481
1 changeMaintenance
- Mobile Phase 2 #1: in-game Quit button
v0.6.1476
1 changeMaintenance
- WASD-mode left-click + parent-focus resume on pop
v0.6.1475
1 changeMaintenance
- BuySkillMenu Phase B follow-up: force-focus Cancel, focus highlight, A on disabled Learn
v0.6.1474
222 changesNew
- ChroniclesOfNesis-jsh pixel-perfect alpha-mask hover hit-test for NPCs
- AutoPlay v1 MVP — Title -> Event 3 FSM driver
- Door.gd: add nav-transit guard mirroring LeaveArea.gd bd-9sv
- vera seed risk_map.json for pick_tests MVP
- new spawn shape (W1=1, W2+=1-4) + stat-override tuning
- Phase A pt2: drop MenuOverlay.update() fanout; add signature caches
Fixed
- world-qa: drive_dialogue.py + drive.py focus-fallback timeout fix
- drive.py _ensure_focus: DOM focus instead of click — fixes bd alu
- unified pointer-finger icon + lock/menu/title fixes
- mouse-mode clicks never fall through to proximity; fix walrus regression
- revert dialogue-direct branch; fix bed loop at source
- nav fixes: parallax bake parent, isInteracting clear, run-direction follow-velocity
- split hover vs trigger shapes — fix spawn-back teleport
- roan-driven QA fixes: TestBridge dialogue cleanup + remove nav fail-open
- nav + dialogue state-machine fixes; MainSquare reparent; nav-walkability test scene
- bake NPC bodies as holes + fix LeaveArea hole winding
- ChroniclesOfNesis-d59 shrink OverworldVisionInteraction radius 161.9→35px
- ChroniclesOfNesis-48y fix Bed hover area oversized by 15x9 scale
- bd-9sv + bd-60a: LeaveArea transit-guard + NPC capsule footprint fix
- nav fixes + tests: bd-noq + bd-co6 framework + OverworldVisionInteraction revert
- bd-cee TreasureChest.interact gains override=false param to match 3-arg TestBridge call
- bd-3it Switch.interact override=false + suppress-scene-entry-events knob + force_end clears inDialogue
- key-name fix + abort signal (per-action expected-effect windows)
- bd-ril keep cursor visible when menu is up in mouse mode
- bd-fjn raise NavigationPolygon agent_radius 8 -> 14 to match Elias capsule
- bd-fjn bump agent_radius 14 -> 18 after Vera sharp-corner tests wedge
- bd-c00: nav target = click pixel (owner-directed unified fix)
- fix intermittent scene-trigger + NPC-click target mismatch
- gotcha #67: correct fix-requires-both-steps; recommend upstream PR
- playthrough regression: Tier 5 default + redeploy auto-fire hook
- nav-bake parallax-NPC dedupe + dialogue pipeline + playthrough fixes
- bd-41u FIXED: await physics_frame x3 in bake_finished + regression test
- bug bundle: bd-n25 shop close + bd-jsv diag + Phase C click wiring
- test_combat_autoplay_v1: fix _combat_mode helper to read _lastCombatGetState
- save fixture library + Title→cond=3 reliably + Basement-race pin
- fix Windmill1 → Basement scene-transition race (bd-vkd)
- extend past Event 9 — Event 10 area_enter + known-wait fix
- AutoPlay puzzle phases + Waterway1 entry fixture for dungeon iteration
- combat UI shows displayName instead of node name (bug 2 of 8)
- wire Death→GameOver scene transition in SceneTemplate._on_battle_lost (bug 3 of 8)
- restore combat camera pan+zoom (bug 4 of 8)
- HP persists across combat encounters (bug 5 of 8)
- cleared scenes don't re-spawn enemies in same session (bug 6 of 8)
- one combat per scene — cascade-fire all EnemyTriggers on first contact (bug 7)
- prevent click events from flipping mouse_mode VISIBLE (bug 8 of 8)
- bd-c00: explicit door-target nav tolerance override (bug 9 of 10)
- bd-c00: AutoPlay LeaveArea short-stop retry watchdog (bug 10 of 10 — final)
- catch already-inside-trigger race in door-click handler (bd-vkd)
- bd-aaq + bd-0t3: terrain poison-roll uses magic formula + debug_force_status_apply flag
- debug menu: ArenaBench test scene row (QA access)
- bd-xa9: LeaveArea EntryShape height 17 → 40 (WASD-walk body-overlap fix)
- bd-cfp details panel never opened + bd-xti picker visual port
- cursor.cell() (was treating method as property) + picker visual rewrite
- Smite skill animation + full-click-flow regression test
- Cure/Cleanse/PushAttack mechanics + VFX + per-skill regression tests
- MenuBase-contract rewrite — fixes WASD/Enter desync
- SkillTree nav (WASD + mouse + cross-mode), BuySkillMenu fix, button asset adoption
- Eject point: SkillTree WASD-Cancel-first nav, right-click cascade fix, EP gate, more tests
- NEW_BUGS_TO_FILE.md: + load-MainMenu-unresponsive + ItemsMenu polish bundle
- World.loadGameSave: clear inLoadGameState at end of load (#5 fix)
- ItemsMenu polish (#6a, #6b, #6e from NEW_BUGS_TO_FILE.md)
- MenuStack Phase 2c: SkillTreeMenu integration + focus-coherence fixes
- Fix Items/Equipment menus failing to open (parse error in pre-existing code)
- Fix right-click cancel cascade — SceneTree vs Viewport input-handled flag mismatch
- Fix SkillTreeMenu cancel + MOUSE-mode hover-off null
- Fix VirtualCursor.notify_mouse_motion double-consume race
Improved
- AutoPlay v1: dict-action refactor + Event 3 lever-click dispatch
- bd-xti Phase 1: extract CombatSkillResolver (registry + validation)
- SkillsMenu + relic equip/unequip cascade + EP/SP/JP rename
Tested
- c5m.1 Phase 1: world_nav.py greedy corner-clip waypoint planner + tests
- test-infra: zombie reap guardrails + interactive XDIST default
- OptionsMenu BFS adoption + _testPressEnter Title fallback
- TestBridge worldSnapshot: emit leave_areas (LeaveArea + Door)
- single-click engages all interactables in TreasureTestRoom
- bake LeaveArea holes into navmesh; extend _testDismissModals
- file 3it (basement lever mouse-broken) + 49v (Vera interaction parity tests)
- file bd-puc (sharp-corner test geometry followup to bd-fjn)
- Windmill1 stair nav regression gate (Vera, all 5 transitions)
- pin ChurchSquare→MainSquare→Windmill2 nav failure (bd-mainsquare-isolated)
- chokepoint detector v2 + Vera 2-step test (hypothesis invalidated)
- Vera input-mode × multi-LeaveArea matrix (7 cases)
- pin combat AutoPlay clears in-game ChurchSquare slime fight
- Tier 4 ratchet for cond=11 → 12 (Windmill2 puzzle + SluiceGate)
- register combat_smoke marker for post-fix regression gate
- tier3 pin death→GameOver, combat mouse mode, camera pan+zoom regressions
- add combat_smoke baselines — attack lands + autoplay completes
- tools/combat_smoke.sh runner + cold-start robustness for attack-lands
- tag bug-1 routing proxy (test_lose_resolution) into combat_smoke
- Vera CLAUDE.md: codify test-hierarchy gap detection rule
- Merge feat/vera-pick-tests: pick_tests MVP risk_map seed
- bd-aaq runtime test: VSlime → poison terrain → step → poison status
- bd-cfp Phase 1: Combat Details menu (per-cell unit + status + terrain inspection)
- visual demo: test_visual_skills_picker_demo (per-iteration noVNC display)
- Picker mouse/WASD nav: rect-hit-test hover + click + behavioral suite
- MENU_STACK_DESIGN.md: spec for the unified focus/mode/SFX autoload
- Pre-MenuStack: TestBridge submenu parity, SkillTreeMenu mode-flip exorcism, mode-seed hook
- MenuStack Phase 1: autoload + state-machine tests (17/17 green)
- MenuStack Phase 2d: drop BuySkillMenu special-case in MenuOverlay
Tooling
- drive_player Phase 2 — CDP keyboard + world_nav planning (c5m.1, c5m.2)
Docs
- combat regression smoke suite — catalog + pending tagging checklist
Maintenance
- world-qa-mcp + combat driver primitives — shared-browser autonomous play
- world-qa primitive iteration #2 — Title→game playthrough drive
- c5m.2 Phase 1: CDP-attach input driver (launch_shared_browser + drive.py)
- c5m.1: worldSnapshot probe + drive_combat CDP read
- arc-observability + menu nav BFS: low-latency drive + named menu targets
- menu-nav phase A: MenuBase helpers + linear/grid graph derivation
- menu-nav: parse_input_event so handlers gated on is_action_pressed fire
- default to WASD mode with feather, refresh hover on mouse-mode flip
- cursor-move SFX on every successful interaction
- hover icons + click-to-interact: chest opens, door transitions, NPC dialogue
- sprite-sized hover bounds + faster title fade
- click-find honors hover bounds; door fires ChangeScene on arrival
- title highlight persists; click during dialogue can't reroute
- dialogue advance routes direct; wire owner's pointer PNG
- mouse-hover highlight follows cursor on all menus
- faster title fade — highlight + feather visible in ~1s
- title skip-click sets showTitleScreen so visibility ⇒ interactability
- close skip-click capture at fade-complete
- event-completion isInteracting clear; merge MODE line into pack overlay
- fall back to legacy walker when navmesh is unusable
- split InteractionArea (hover) from EntryArea (trigger)
- modal-ack rule: lock input while TreasureOverlay / dialogue is up
- mouse-mode: stop WASD/mouse flicker on stuck inputs; restore cyan-feather hover icon
- stop fighting PlayerCharacter for mouse mode in gameplay
- register HoverIndicator
- advance directly via DialogueHandler when in dialogue
- gate input on changingScenes; restore cyan-feather hover icon
- NAV-FACING-FOLLOWS-MOVEMENT v2: hold lookDirection during nav corners
- nav-sprite-facing: use velocity not direction-to-final in _process
- v0.6.1153 deploy snapshot + accumulated session state
- align Bed interactable with visible Sprite2D
- bd-co6: place NavHole_StairRailing polygons in Windmill1 + Windmill2
- event-condition schema extension + AutoPlay data-driven dispatch
- bd-gta: remove ChangeScene fast-track from _fire_pending_interact
- bd-c00: stop carving LeaveAreas as nav-holes (let player route INTO them)
- bd-c00: walk to click pixel (world_pos), not EntryArea center
- bd-gb5: lower nav agent_radius 14 → 10 to keep FrontRoad routable
- bd-c00: per-target click semantics — doors go to TRIGGER CENTER
- raise target_desired_distance 1 -> 3 to kill sub-px jitter
- bd-i0i: extend Windmill NavHole_StairRailing to full railing footprint
- bd-4e9 Phase 1: bake-time chokepoint detector (log-only)
- bd-5ks: dynamic agent_radius from player capsule + scale
- bd-xdk: nav-bake honors CollisionPolygon2D.build_mode
- retune Windmill2 corner-to-corner coords for inflated navmesh (bd-5ks)
- bd-41u: map_force_update + NavAgent warmup on bake_finished
- laria scenes: railing collision + leave-area position tuning
- BUILD_SEGMENTS for basement Stairs + diagnostic probes + gotcha #67
- trigger guards: reject non-player + body-out-of-area area_entered fires
- extend alpha-mask precision to doors, chests, levers, treasures
- ambient-dialogue-phase2: wire AmbientDialogue autoload + DialogueHandler hook
- bd updates: file bd-jsv (rotation), bd-h04 (Kint length), bd-n25 (shop close), bd-kcs (extend playthrough past Event 8), close bd-41u
- bd-kcs phase 1: extend playthrough Title→Event 9 + combat gate
- bd-vct + bd-hwg: fire-once-per-visit event guard + AutoPlay menu skip
- WASD-only combat driver v1 (move-and-attack)
- drive Event 10 to cond=8 — frontier advance
- capture cond=8 frontier save (post-Event-10, ChurchSquare)
- no_save flag mirrors in-game save UI policy
- drive Event 11 to cond=9 — frontier advance
- drive Event 12 (Elias sleeps) to cond=10
- walk routes for cond=10 (EliasHouse → MayorsHouse return path)
- relax NAV-TRANSIT-GUARD — accept overlap when pending is empty
- exploration mode for waterway dungeon (random unvisited)
- cond=11 approach routes + walk-tolerance for long traversals
- exploration back-bias — don't immediately retrace steps
- drive Title → cond=11 → waterway entry end-to-end
- gate armed-recheck on _pending_door_scene match
- back-path tracker for Phase B in-waterway return
- MapOverlay v1: in-game map for Laria Waterways dungeon
- MapOverlay v1.1: auto-hide on menu/combat + free top-right
- waterway1: swap ground relic Poison-Attack → Scan + smoke pin
- Vera CLAUDE.md: sharpen T4 vs T5 distinction with inductive rule
- bd-zwg: combat camera reserves left UI strip (turn-queue inset)
- bd-n51: LeaveArea requires player BODY overlap, not PCSceneInteraction
- bd-k5c: stop player movement before fade on scene transition
- bd-uko data layer: magic_hit_chance + magic_defense + VSlime poison_damage_mod
- bd-0t3: dual physical+poison damage + magic-roll for status application
- bd-8jd: in-combat status display — dedicated CombatStatusDisplay child per unit
- bd-8jd Phase 2: OverworldStatusDisplay — per-player status icons on overworld
- bd-uko visual baselines: poison subsystem reference screenshots
- bd-uko visual: G3 terrain tileset + VSlime tint to StatBlock + TurnQueue
- bd-xti Phase 2: all 11 combat-active skills wired + heal/buff/terrain/item kinds
- bd-xti Phase 3: SKILL mode cell highlighting (range + AoE preview)
- bd-xti Phase 4: CombatSkillsPicker — in-combat skill selection UI
- prints in CombatOverlay._input + tighter picker anchors
- bd-xti picker polish: dark BG + ModernGoth + AP/MP costs + wheel-zoom gate
- bd-xti picker round 4+5: full-width buttons, halved margins, larger AP/MP labels + bd-i67 nav contract pinned
- action overlay state contract: 6 source pins + Ability stays pressed while picker open
- G3-template visual + MenuBase port + sword cursors
- wire all 11 skills to unique icons
- MenuBase mode-switch focus contract + CombatSkillsPicker port
- drop self.get_global_rect() call (parse error)
- VFX overlay on target + radiant damage (round 16 round 2)
- Picker close-when-no-AP + cure range=0 + cure cast-stance animation
- Casting.png animation for cure + cleanse (G3 playCasting parity)
- Slash shader overlay on basic attack + smite (ShaderLab port)
- Attrition sim: L1 dungeon-chain Monte Carlo for stat tuning
- attrition_sim: in-combat mugwort mode + sweep findings
- attrition_sim: --count-mult knob for spawn-count sweep
- core_BattlerStats: Slime/VSlime nerf to STR=4 CON=6 (round 19 sim)
- Round 20: MP deduction + cure/cleanse light-pillar VFX
- Round 20 round 2/3: mouse visibility on menu open + cure/cleanse target=any
- Skill cell coloring: yellow=in-range invalid, red=valid, white=AOE
- range 6→1 + lightning bolt VFX (per owner reference video)
- Terrain +16px alignment (bd-qyd) + remove cleanse pillar VFX
- EquipmentMenu G3-parity: disabled equipped item, hover preview, real equip stats
- 3-col stat panel, item details on hover, save/load equip persistence
- skip MenuBase ui_accept helper in MOUSE mode
- relic slots, dark panel theme, live-tunable visuals
- preview column palette for dark theme
- ItemsMenu #6c (non-consumables disabled) + #6f (WASD autoscroll)
- MenuStack Phase 2a + 2b: input wiring + BuySkillMenu integration
- MenuStack Phase 3: sweep remaining menus
- SkillTree lazy update — only rebuild grid when actually opened
- SkillTree open: skip grid rebuild when grid is already populated
- pre-build grid on first scene-load, not on first menu show
- drop CanvasLayer to 150 so VirtualCursor renders on top
- Phase A: PartyHeaderPanel autoload — shared CharacterSubpanel + button row
- Phase C: Unit signals + signature caches replace direct menu.update() calls
- Phase B: BuySkillMenu becomes a MenuBase scene
- Phase C2: surgical SkillTreeMenu refresh on tree_skill_learned
- drop orphaned BuySkillMenu.gd.uid after Phase B move
- SkillTree WASD vertical walk: same-column preference + nearest-column fallback
v0.6.1106
26 changesFixed
- re-apply 8kc grid-disappear fix (lost in qqf sync)
- h22.1: flip Smite XFAIL→PASS — tune ranges, fix combat-test infra flake
Tested
- h22: skill-in-combat test framework + DamageResolver TestBridge hook
Maintenance
- Cloud shadows + wind shader + water shader port across Title and Laria zones
- Quick Setup section (grant JP+CP, kill/heal party, XP row)
- c31: Options sliders at 0% fully silence music + SFX
- migrate_owner_questions_to_bd: one-shot script for owner_questions → bd
- tools/bd_close.sh: wrapper auto-pushes after bd close (ChroniclesOfNesis-4n1)
- grid no longer disappears on first enemy kill (8kc)
- CombatAIDriver — pluggable player + enemy auto-control
- label qqf blocked-on-owner pending vpp + 2aq answers
- b7z: typed damage pipeline — DamageEvent + DamageResolver
- terrain layer + poison terrain (VSlime trail)
- close dyl (terrain shipped) + 3 child owner-questions filed
- register poison damage type with DamageResolver (bd 3ba)
- close ChroniclesOfNesis-3ba (poison damage type shipped)
- b5a: headless Monte-Carlo combat sim — tools/combat_sim.gd
- b5a claimed + done note + 3 owner questions (zx8/bse/kjq)
- VSlime enemy — wired as combat-mode unit with poison-trail terrain
- uh7: combat_sim_report.py — static HTML balance matrix viewer
- close uh7 (combat-sim report shipped)
- ox7: poison status effect — apply/tick/cure/persist end-to-end
- owner-answer batch — VSlime rebalance, poison-tile UX, AI MODE HUD
- batch h22.2/h22.3/bse/60i owner-answered changes
- default both sides to AI auto-drive on battle start
- ni2: overworld per-step poison tick (owner-answered ACTIVE_DRAIN)
v0.6.1054
589 changesNew
- Add cache-busting to .pck and .wasm in redeploy script
- Title visual r3: stack all 4 menu labels (NewGame/Continue/Options/Quit)
- persist menu lock-in (height +50, labels centered + left-shifted, FarBackHill -100, cursor at NewGame)
- NEWGAME-OPTIONS-FLOW: open OptionsMenu directly from Title.gd New Game handler
- WC-CHARSUB-G4-PATTERNS-AUDIT: catalog typed-param duck-type rejection + Control.size pre-add_child collapse
- LOADINGICON-ROTATION-PATTERN: add LoadingIcon instance to LoadingScreen overlay
- WATER-SHADER-RENDER-V2: add BackBufferCopy siblings for G4 hint_screen_texture
- ARCH-REFACTOR-PHASE0: add major refactor plan doc — menus, dialogue, event system
- ARCH-P1-MENU-BASE: add MenuBase + migrate MenuOverlay
- ARCH-P1: merge MenuBase implementation
- Revert "ARCH-P1: merge MenuBase implementation"
- Reapply "ARCH-P1: merge MenuBase implementation"
- Revert "Reapply "ARCH-P1: merge MenuBase implementation""
- ARCH-P1-MENU-BASE: merge Phase1 MenuBase implementation
- ARCH-P2-DIALOGUE-DISPLAY,ARCH-P2-EVENT-DIRECTOR: add DialogueDisplay + EventDirector alongside existing classes
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: add _mb_nav_buttons/_mb_open_nav/_mb_nav_step to MenuBase; MenuOverlay updateHoveredButton uses _mb_navigate(); OptionsMenu slider icons get FOCUS_ALL
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: fullscreen anchor uses get_global_rect(); remove hoveredButtonIdy>=0 routing fallback; add _on_mouse_took_over
- add y_sort Bodies node for correct depth sorting
- TREASURE-BAG-INVISIBLE-LARIA: add Treasure.gd + Treasure.tscn to packs_src/LariaVillage
- TestBridge _testSetPartyState + _testOpenMenu items/pause hooks
- GODOT_WEB_EXPORT_FRAMEWORK: add Rule 16 — cross-pack ext_resource resolves null
- COMBAT_LIFECYCLE_AUDIT: add Decisions 11-12 + handler design rules
- port waterway4-12 + SluiceGate + Channel, add no-enemies toggle + Slime idle fallback
- add _testSetGlobalWorldFlag hook for runtime GlobalWorld property writes
- add bootstrap-pck-size rule (25MB cap)
- Equipment, Skills, SkillTree menus — initial G4 web implementation
- spawn off-screen left only; add z_index_offset @export; Title up 800px + behind
Fixed
- Fix save menu not refreshing after saving
- SL-6: Save/Load GUI Playwright regression tests — 5/5 pass
- Fix save click: eat ui_accept to prevent MenuOverlay from closing
- Vera regression: title visual invariants suite for REQ-01..REQ-34
- Vera regression: switch _get_node_rect to canonical _tbGetNodeRectRequest slot
- Vera regression: test_sky_takes_top_45pct_height for REQ-35
- Vera regression: test_sky_visible_full_width_at_top for REQ-16/REQ-35
- Vera regression: refine mountains test to rect-based 90% coverage for REQ-18/REQ-32
- Vera regression: test_foreground_hill_present_at_bottom for REQ-19/REQ-21
- Vera regression: cloud drift + parallax speed ordering for REQ-09 (with Nix follow-up note)
- Vera regression: split both_windmills_spinning into per-windmill tests for REQ-33
- Vera regression: test_back_windmill_visible_mid_frame for REQ-22/REQ-31
- Vera regression: test_bridge_visible + test_stone_walls_visible for REQ-36/REQ-37
- Vera regression: test_version_label_uses_moderngoth for REQ-07
- Vera regression: harden cloud-drift test with 3-frame sampling for REQ-09 flake
- Vera regression: scarecrow test 3-frame sampling for REQ-23 (single-frame coincidence)
- Vera regression: test_no_black_left_right_edges for REQ-13/REQ-16
- Vera regression: test_scarecrow_visible_in_frame for REQ-11
- Vera regression: test_menu_panel_below_windmill for REQ-03
- Vera regression: test_controls_label_off_screen for REQ-06
- Vera regression: harden windmill spin tests with 3-frame sampling for REQ-33
- Vera regression: test_back_windmill_blades_attached_to_tower for REQ-38
- Vera regression: test_menu_panel_height_ratio for REQ-44
- Vera regression: test_menu_panel_bottom_margin for REQ-45
- Vera regression: test_scarecrow_x_between_windmill_and_right_wall for REQ-46
- Vera regression: test_menu_labels_right_aligned for REQ-47
- Vera regression: test_no_controls_label_leak for REQ-48
- Vera regression: REQ-47 pixel check tolerates partial off-screen rects
- Vera regression: test_text_to_cursor_gap_15px for REQ-49
- Vera regression: test_cursor_to_panel_right_gap_15px for REQ-50
- Vera regression: test_no_vertical_line_artifact_in_sky for REQ-51
- Vera regression: test_yellow_hill_bottom_layer_where_present for REQ-52
- Vera regression: test_no_scrollbars_on_text_labels for REQ-53
- Title visual r7: Continue+Options offsets gap fixed (50..92, 100..142); pytest 28/40
- Gameplay fix: G3->G4 PackLoader user:// remap + Time.get_time + Core/LariaVillage pack rebuild
- Gameplay fix: ScreenFade tween now fires; G3 setter recursion broken
- persist menu lock-in + fix Godot4 nine-patch property names
- BLACK-FLASH-G4 fix - move fadeIn=true before boot await
- fix PackedStringArray.join G3->G4 silent breakage
- NEWGAME-OPTIONS-SAVE-PROGRESS: real fix - missing UTILITY methods
- MENU-BUNDLE-A: 3 menu surgical fixes — cancel cascade + font sweep + G3->G4 hover color
- TITLE-FONT-AUTOHINTER-REGRESSION (P1): force_autohinter=false on ModernGoth.otf
- MAYORS-HOUSE-ENTRY-V3-CHERRY-PICK: cherry-pick V2 geometric fix
- YSORT-CHURCHSQUARE-REGRESSION: re-add y_sort_enabled=true on Bodies in pack-mirror ChurchSquare.tscn
- VERA-TESTSPEC-DEBUG-2: 9 testSpecs + LoadingIcon visual-baseline arc_inbox
- TOOLING-DASHBOARD-ACCURACY: 5 sub-fixes for in_progress drift
- LOADINGSCREEN-WASM-MAINTHREAD-BLOCK-FIX: threaded scene load + pack-mount yields
- YSORT-CHURCHSQUARE-REGRESSION-V2: keep real Player visible alongside InstancedPlayer
- SHADER-PARAM-G4-SWEEP: rename `shader_param/` to `shader_parameter/` in 8 .tscn files (silent-rebind fix)
- TIER2-REGRESSION-PIN-YSORT-CHURCHSQUARE: static .tscn invariants
- OPTIONSMENU-WASD-NAV-WIDGET-COVERAGE: generalize feather rect resolver + Controls fix
- TIER4-MAINMENU-NAV-COVERAGE: parametrized 4×3 matrix + V2 regression pin
- TIER5-NEWGAME-THROUGH-MAYOR-COVERAGE: 6-test split for demo-flow regression net
- WATER-LOCKIN-PROPERTY-ORDER-BUG: write reflectionOffset on inline ShaderMaterial subresource
- NPC-COLLISION-WIDER-V4: fix root cause — bump height (horizontal footprint) not radius. height 7.6->36, radius 20->6. Capsule is rotated 90deg so height=horizontal, radius=vertical.
- NPC-COLLISION-WIDER-V4-STAIRCASE-REGRESSION: widen staircase entrance from 21.1→26 units (P2/P3 spread 2.7 each side)
- MAINMENU-BUTTON-WIRING-MISMATCH + UNIFIED-MENU-CURSOR-NAV-SYSTEM: fix button click dispatch and Options WASD init
- MENUOVERLAY-SPACE-KEY-REGRESSION: guard ui_accept/handleClick when event also matches ui_select (Space opens menu then immediately clicked default button)
- ARCH-P1-MENU-BASE: ShopOverlay TODO + T4 xfail + conftest fix
- NEWGAME-COLDBOOT-POSITION-BUG: fix player spawning at origin on cold-boot load
- NPC-SPRITE-COMPILE-ERROR: fix type inference on _restore_dir
- ARCH-P1-MENU-BASE: WASM-compat fix — no class_name, no enum-typed signal param
- ARCH-P1-MENU-BASE: fix WASM inheritance chain — full path-based extends throughout
- ARCH-P1-MENU-BASE: fix missing _mb_open/close_cursor + restore SceneTemplate coldboot fallback
- ARCH-P1-REGRESSIONS: fix OptionsMenu new-game invisible + Continue player offscreen
- ARCH-P1-REGRESSIONS: fix missing res:// prefix in OptionsMenu new-game scene path
- ARCH-P1-REGRESSIONS: revert non-menu files to stable — SceneTemplate/World/PlayerCharacter changes were outside Phase1 scope and caused cascading regressions
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: fix click-after-WASD + Fullscreen FOCUS_ALL
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: disable focus outline globally; OptionsMenu Controls/Save highlight; CheckBox feather anchor fix; deferred cursor on open; Web mouse warp on WASD nav
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: fix fullscreen feather (redirect to fullscreenPanel row); fix WASD-then-click when mode drifted to MOUSE (hoveredButtonIdy fallback)
- WASD-NAV-DEBUG: add console prints for fullscreen nav + click routing in OptionsMenu
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: fix fullscreen feather anchor (use cb bottom Y); move set_input_as_handled after toggle call so browser gesture context intact; remove debug prints
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: fix VirtualCursor get_global_rect (eliminates 15px CanvasLayer offset); fix OptionsMenu click routing to use VirtualCursor.is_shown() instead of _mb_mode
- fix TreasureChest invisible in EliasHouse — add z_index=2
- MAYORS-HOUSE-2F-TREASURE-CHEST-MISSING: fix treasure chest invisible in web export
- ITEMS-MENU-RENDER: fix button height, WASD hover highlight, description display
- add TreasureChest.tscn to packs_src/LariaVillage — same root cause as Treasure.tscn
- cursor hide + Items focus on first pause menu open
- WASD click in OptionsMenu ignores hidden cursor over slider
- mouse visibility, menu nav, and Options Save routing
- MainMenu WASD click-override + hover highlight + cancel return
- difficulty dropdown WASD interaction (3 stacked WASM bugs)
- TreasureChest invisible — add textures to LariaVillage pack project
- StatusMenu — render stats + values, full-width Save, 1/3-2/3 layout
- StatusMenu — top row 1/4, larger stat font (22pt)
- StatusMenu nav — start at char button, Right=-, Left=+, cancel returns
- StatusMenu — feather centers on +/-, L/R toggles, 9-patch consistent
- StatusMenu — feather centers on +/- accounting for button scale
- StatusMenu — use get_global_rect for +/- centering, add tunable offset
- StatusMenu — bake +/- feather visual-center offset (30, 30)
- StatusMenu — correct +/- feather offset to (60, 30)
- StatusMenu — set +/- feather offset to (30, 30) per owner
- StatusMenu — no +/- buttons on stamina, speed, knowledge
- SHOP-VISIBILITY-PIN — TotalsGrid columns + TotalsPanel sizing
- ShopOverlay — focus ring, button heights, tab nav, mouse-only increment
- ShopOverlay — focus_mode=0, button_pressed migration, R from items
- ShopOverlay extends MenuBase — kills WASD-mode click-misfire
- ShopItemButton — stable height across states, restore original normal stylebox
- bump fonts, reorder 3rd col (Reset/Settle above Totals), description taller, Buy/Sell shorter, fix items first-load layout race
- ShopOverlay sell-count placeholder + add Tier 4 sell-flow test
- WASD mode filter, skip disabled, fix Left wrap from top-left
- fix emote-await lambda capture (5-8s phantom delay after every synced emote)
- scale screenshots by actual image width (fixes mixed-size renders)
- Combat Phase 2c-3: nearest-cell snap + arc-jump transition + scale fix
- input + interactivity fixes — Phase 2c-12 (cursor/cancel/wasd)
- Combat UI: fix transparent buttons + Enter routing + sword pos + debug label
- keep look_direction in cell space after walk (default cell off-by-one fix)
- strip CombatCamera debug prints (per-frame + per-input)
- fix turn-queue duplicate-position bug (tie-break + active contract)
- fix double-turn bug — tie-break in _sort_by_next_action_time
- audio polish + AP-reset timing + stamina fix
- fix dynamic-slime collision + per-scene CombatGrid + pack-asset audit
- debug menu v1 + Title boot fixes
- event flow: enemy lock toggle, emote bubble fix, debug button on web path
- EMOTE-PLAY-REGRESSION-FIX: revert /-prefix, restore bare animation name
- debug_no_enemies: default false — enemies spawn by default
- slime slap fix: query Dal.get_battler_attacks by unit_type, not unit_name
- live shader-parameter panel toggleable from DebugMenu
- filter abilityScore + add scrollbar; nav fix on SkillTree close
- drop empty-inv placeholder; Unequip fixed-width; CharacterSelectButton at top-left
- music loops; frontFan path fix; lowest cloud layer up 50px; viewport offset
- MainSquare wind shader + cloud slowdown + redeploy port-kill scope fix
Improved
- BED-OPTIONS-INVISIBLE (P1): G4 fit_content rename + Bed.interact 3-arg signature
- ARCH-P1-MENU-BASE: rename mode→_mb_mode to avoid subclass var shadowing
- ARCH-PHASE2: open Phase2 branch, document eject seats in MAJOR_REFACTOR_PLAN
- ARCH-P2: update MAJOR_REFACTOR_PLAN — Phase2 complete, document remaining cleanup
- ARCH-P3: SceneTemplate dead code cleanup — remove _on_eventCompleted, checkInput, EventCompleted wiring; delete .full backup (-903 lines)
- Rename Core pack → Combat (Phase 1a: scaffolding only)
- Combat UI: ActionBlock 3-row grid + WASD nav graph + mode rename
- video-faithful death + victory + permanent kill cleanup
- collision-triggered combat in Waterway1 + CombatArena→CombatOverlay rename
Tested
- Title visual r19: Mountains scale_x 1.5 + offset for full-width coverage (REQ-18, REQ-32)
- Title parallax: stretch/aspect expand→keep (letterbox bars OK per owner)
- Title visual r25: camera y=-130 + Panel resize + cream border + tbGetNodeProperty (REQ-43,44,45,47,39); pytest pass=21
- Title visual r26: Bridge sprite + FrontHills onscreen + Scarecrow z=60 + SunlightRays hidden (REQ-21,36,46,51); pytest pass=21
- get_node_rect returns viewport-pixel coords (camera transform applied); pytest pass=25
- Title visual r27: FrontWindmill x+150 / Scarecrow midpoint / Panel y+120 / BackWindmill Blades (REQ-14,30,38,45,46); pytest pass=26
- revert 1280x720 → 1270x920 (aspect 1.38) to match G3 + canonical
- Title visual r1: camera zoom=0.50 x=-380 y=-150 (right road off, left fg cleaner; pytest 22/38 vs base 21)
- Title visual r3: BackWindmill x: 280 -> -100 (back windmill visible mid-frame; pytest 23/38)
- Title visual r4: REQ-49/50 cursor gaps + REQ-53 no scrollbars (selectIconMargin 15->8, label offset_right 770->793, scroll_active=false; pytest 26/40)
- Title visual r5: title scale 2.0->1.0 + position shift, panel offset_left -1180->-900 (REQ-02 + REQ-05 logo/labels in 10%% frame; pytest 28/40)
- Title visual r6: title scale 1.3 + position (-380,-180) - logo prominent in upper area; pytest 28/40
- G4 migration batch: LoadingIcon, OptionsMenu, TestScenes + test contract updates
- conftest bump wait_for_engine 15->45s, page.goto wait_until commit->load
- cut TESTSCENE-G4-FOLLOWTHROUGH and update agent_activity
- bulk wait_for_engine 5→15s across 6 sites
- EVENT-LOCK-INTERACTION-AND-MOVEMENT-TESTS: restore player.isLocked + GlobalWorld.playerLocked in executeEvent/sceneDisplayDialogue
- VERA-AUDIT-CLEANUP: A2 retro-sign + A3 testspec-fill + LOADINGICON
- TEST-TIER-15-ENGINE-NATIVE: build engine-native headless test tier
- TEST-COVERAGE-TIER-1-INITIAL-PASS: 16 raw GDScript unit tests under WebTests/tier1/
- LOADINGSCREEN-DIAGNOSTIC-INSTRUMENTATION-AND-TEST: Tier 4 Vera test for 5 LoadingScreen advancement mechanisms
- LOADINGSCREEN-DIAGNOSTIC-INSTRUMENTATION-AND-TEST: Part 1 instrumentation + 6 TestBridge hooks (v0.6.303)
- WATER-SHADER-TITLE-CHURCHSQUARE: Tier 5 Vera test for Elias-on-bridge reflection (gold-standard scenario)
- LOADINGSCREEN-TIER4-REALLOAD-TEST: Phase 2 test — real pack-load path
- LOADINGSCREEN-DIAG-OVERLAY-RUNTIME-TOGGLE: forceDiagOverlay TestBridge hook
- WATER-REFLECTION-FULL-VERIFICATION: Nix probe-shipped + suspect 1/4 static analysis comment
- WATER-REFLECTION-FULL-VERIFICATION: Vera screenshot tests for bridge placement + Elias-in-reflection (per-scene)
- LOADINGSCREEN-LONG-LOAD-REPRO-TEST: Phase 3 long-load reproduction tests (CDP throttle + forceSlowPackLoad)
- TEST-TIER-NAMING-REFACTOR: unify Shape A/B/C/D + Tier 1.5 → Tier 1-5
- SHOP-COMPREHENSIVE-TEST-COVERAGE: Tier 4/5 shop suite (14 tests scaffolded)
- TESTBRIDGE-LIVE-MUTATE-SUB-PATH-RESOLVER: walk colon-form sub-paths
- ARCH-P0-MENU-TESTS: Tier 1-4 menu test suite — pins behavioral contracts before MenuBase refactor
- ARCH-P0-DIALOGUE-TESTS: T1-T4 dialogue baseline tests
- ARCH-P0-EVENT-TESTS: T1-T4 event system baseline tests
- ARCH-P0: merge phase0 test baseline (menu + dialogue + event T1-T4)
- options menu routing + cursor visibility + difficulty xfail suite
- TestBridge — add 'shop' open hook for ShopOverlay testing
- SHOP-VISIBILITY-PIN — Tier 3 baseline + TestBridge shop probes
- thumbnail rendering + test bridge screenshot capture
- minimal CombatArena.tscn + _testSpawnArena hook (Phase 1b)
- damage variance, slime buff, GameOver port, test resilience
- test/combat: split test_combat_basics into per-subsystem suites
- tier-3 PlayerCharacter visuals suite + _testPlayEmote bridge
- test-scene rows + emote investigation breadcrumbs
- _testForceCombatResolve hook (win/run/lose)
- combat-input test surface (Track B spec, no code)
- combat-input test surface: 7 TestBridge hooks + in-memory log
- T5 D5+D6: ChurchSquare combat + bed→waterway arc tests
- SkillTreeMenu._input: respect viewport.is_input_handled before processing
Tooling
- pkill orphan port-8060 server before redeploy
- redeploy_web.sh autostarts CORS server after deploy
- redeploy_web.sh CORS server allow_reuse_address=True
Docs
- CLAUDE.md + refactor plan updates — NPC arch, CapsuleShape2D gotcha, tools table, MCP rebuild note, refactor doc pointer
- dispatch discipline rules in CLAUDE.md + TOOLING-TOKEN-EFFICIENCY epic and tickets
- update refactor plan — Phase0 complete, Phase1 blocked on WASM autoload issue
- model assignment policy — Haiku for mechanical tasks, tool-use caps
- Revert "docs: model assignment policy — Haiku for mechanical tasks, tool-use caps"
- T3/T4 refactor test strategy — gates only, T1/T2 are before-snapshots
- gotcha #57 — WASM class_name intermediate base class breaks compilation
- correct rearchitecture direction — tests-only phases, no game code changes
- add gotchas 58-59 (zone pack null textures + Sprite2D WASM init bug)
- add gotcha 60 — zone pack .godot/exported cache holds stale binary after .gd added
- session 2026-05-06 devlog + G3 migration §5.9 (zone pack stale cache)
- add navigate_to_scene + consoleLogs failure signatures to WebBootstrap/CLAUDE.md
- eject plan for MENU-INPUT-MODE-REFACTOR
- log Shop migration commit in eject plan
- log Title wire-up; refactor scope complete
- log persistent ItemsMenu WASD→mouse hover-sync bug for follow-up
- COMBAT_LIFECYCLE_AUDIT: document non-combat ↔ combat transition gap
- Combat Phase 2c-4: slim CombatUnit foundation + audit-doc resolutions
- COMBAT_STATS_AUDIT: doc the 3-tier stat system + 8 quirks (parked)
- catalogue recursive call_deferred OOM as gotcha #65 + runbook note
- tools/balance: three-layer sim design doc + L1→L5 power-curve target
Maintenance
- Restore spinning circles for normal dialogue, triangle for options only
- Pre-migration baseline: session work from 2026-04-15/16
- Title visual r1+r2: legible menu labels + reduced letterbox
- Title visual r4: shrink + drop Title logo so 'The' isn't clipped
- Title visual r5: edge-fill ColorRects + stretch=keep_height + FrontWindmill z=1000; REQ-16 top=0 bot=2 (panel border); REQ-17 red labels
- Title visual r6: panel StyleBoxEmpty removes black border; REQ-16 top=0 bot=0 PASS; REQ-17 red OK
- Title visual r7: translucent dark panel bg restores label legibility; REQ-16 top=0 bot=0 PASS; REQ-17 red OK
- Title visual r8: revert to translucent panel; outline_size=0 (cleaner red labels); REQ-16 top=0 bot=0; REQ-17 red OK
- Title visual r9: shift Title sprite x=-100 (more centered, matches target); REQ-16 top=0 bot=0; REQ-17 red OK
- Title visual r10: REQ-17 corrected (labels black) + REQ-24 (cream panel bg)
- Title visual r11: panel smaller + shifted left, font 56, label rows 90px (REQ-25, REQ-26)
- Title visual r12: GroundFill tan -> grass-green, blends with FrontField (REQ-19)
- Title visual r13: Scarecrow animation=default explicit + speed_scale=1 (REQ-23)
- Title visual r14+r15: camera y 200->80 for more sky, panel offsets shifted up 100 (REQ-20)
- Title visual r16: camera y 80 -> -60 (more sky, REQ-20, REQ-35)
- Title visual r17: panel offsets up 140 to match camera shift (REQ-26)
- Title visual r18: BackWindmill larger + repositioned mid-frame (REQ-22, REQ-31)
- Title visual r20: Title sprite y 30 -> -120 (higher placement matches canonical)
- Title visual r21: BackWindmill at horizon line, mid-frame separate from FrontWindmill (REQ-22, REQ-31)
- Title visual r22: Scarecrow position into-frame (REQ-23, REQ-11)
- Title visual r23: Title sprite x -100 -> -250 (more centered, matches canonical)
- Title visual r24: BackWindmill x to mid-frame between FrontWindmill and Title (REQ-22, REQ-31)
- Title parallax architecture: viewport 1280x720 + BackgroundFill (-100) + expand for resize stability
- restore AppC sync to /workspace/allbyte-web/public/godot
- Title visual r1: camera zoom=0.7 y=-130 -> sky=45% mtn=0%(detected) mid=45% hill=0% — store/road/river visible (REQ-43)
- Title visual r2: camera zoom=0.55 y=50 -> sky=45% mid=55% (yellow road+water visible at bottom edge per canonical) (REQ-43)
- Title visual r3: camera zoom=0.55 y=0 -> sky=49% mid=51% (sky on target; full scene composition visible) (REQ-43)
- Title visual r4: camera zoom=0.55 y=-30 -> sky=50% mid=50% (sky exactly on target; pure-camera REQ-43 SHARPENED)
- Title visual r5: camera zoom=0.5 y=-30 -> sky=49% mid=42% hill=9% (wider view; yellow band emerging)
- Title visual r6: camera zoom=0.45 y=-30 -> sky=47% mid=41% hill=13% (sky+hill in target range; mid still high)
- Title visual r7: camera zoom=0.45 y=-50 -> sky=47% mtn=9% mid=33% hill=12% (3 of 4 bands within ±5%)
- Title visual r8: camera zoom=0.45 y=-70 -> sky=48% mtn=9% mid=33% hill=10% (sky closest to 50; 3/4 bands within ±5%)
- TITLE-G4-POLISH-2: retune TitleCamera y for 1270x920 viewport
- Title visual r1: shift Sky x +580 to close upper-right gap
- Title visual r2: shift Sky/Mountains/BackHill/FarBackHill/ForeBackHills x to canvas center for zoom 0.55
- drop broadcast poll 500ms -> 100ms
- live-loop sub-version label + persist v0.6.103 layout
- persist live-iteration lock-in (positions + scales)
- lock Mountains scale 1.1 + position (858, 0)
- remove GroundFill flat-green ColorRect
- lower selection cursor 4px on hover (iconMargin 20 -> 16)
- FIRST-VISIT-EVENT-CHURCH-NAPHTALI: pack DAL stub signatures match bootstrap
- WC-14 + CAMERA2D-RECURSIVE-SETTERS: dual-set theme keys + 3 sibling backing fields (v0.6.210)
- FONT-IMPORT-GITIGNORE-FRAGILE: stop ignoring per-asset .import metadata (G3->G4 migration snag)
- FONT-VISUAL-BASELINES-CAPTURE (P1): capture 8 of 9 baselines at v0.6.239
- redeploy_web: daemonize CORS server inside python to prevent script hang
- CHARSUB-MISSING-DETAILS-AND-BOX-ARTIFACT (P1, partial #1): persist partyStats on save
- CHARSUB-MISSING-DETAILS-AND-BOX-ARTIFACT (P1, Side B): pause-menu CharSub renders details + correct position
- Restore day's work: apply stash@{1} (105 files) — recovers the working v0.6.280 state
- BOOT-LOADER-CHRONICLES-BRANDING: Chronicles boot splash + custom HTML shell
- FEATHER-CURSOR-DEFAULT-ANCHOR-WRONG: default _ANCHOR_FRACTION (0, 0.5) → (1, 1)
- SAVELOAD-WASD-NAV: cherry-pick from today-bundle-fanout
- MENU-NAV-CURSORJUMP: cherry-pick from today-bundle-fanout
- BOOT-LOADER-CHRONICLES-V2-VISUAL-POLISH: double-stacked spinner + slower bob + faster dots
- MAINMENU-HOVER-HIGHLIGHT-MISSING-V2: port _apply_focus_highlight from today-bundle-fanout
- SAVE-SLOT-SCREENSHOT-PERSIST-V3: cherry-pick DAL screenshot funcs + wire World.saveGameSave to b64 it
- BASEMENT-EVENT-FORCE-MOVE-POSITION-OFFSET: FileAccess.file_exists -> ResourceLoader.exists per Framework Rule 12
- PLAYER-NPC-COLLISION-TOO-NARROW: widen collision capsule
- SAVELOAD-FEATHER-INVISIBLE-AND-MOUSE-TAKEOVER: yield+clear-on-mouse
- CHARSUB-FONT-PLACEMENT-POLISH: bump Level +10/labels +6/HP +15 + black-outlined white
- VERA-TIER4-WINDMILL1-EVENTS: Shape D playthrough covering windmill events
- MAINMENU-HIGHLIGHT-DOUBLE-V3: revert focus stylebox on non-focused buttons to NormalButton
- CHARSUB-BAR-WIDTH-POLISH: enlarge HP/MP bars to 215, anchor CP/JP at +30 gap, compute XP width from positions
- LOADINGICON-ROTATION-PATTERN: drop per-frame transform.rotation; rely on SpriteFrames cycle
- NPC-COLLISION-WIDER-V2 + NPC-INTERACTION-RANGE-WIDER: bump capsule + interaction radius
- Revert "LOADINGICON-ROTATION-PATTERN: drop per-frame transform.rotation; rely on SpriteFrames cycle"
- ITEMS-SUBPANEL-WRONG-THEME + OPTIONSMENU-SAVE-CONTROLS-BUTTON-9PATCH
- CHARSUB-FIRST-OPEN-LABELS-MISSING + EVENT-DELAYS-TOO-LONG-AUDIT
- MAYORS-HOUSE-2F-TREASURE-CHEST-MISSING: defensive _ready() render hardening
- LOADINGICON-ROTATION-PATTERN: WEB_VERSION sync 0.6.299 -> 0.6.300
- LOADING-SCREEN-PROCESS-MODE-PAUSE: set process_mode=ALWAYS on LoadingScreen root
- REDEPLOY-VERSION-NUMBER-OFF-BY-ONE: bump WEB_VERSION before export so PCK and current_version.txt agree
- WATER-SHADER-TITLE-CHURCHSQUARE: migrate water/foam shaders to G4 (SCREEN_TEXTURE + shader_param/ + null defaults)
- INSTANCEDPLAYER-WIRE-CHURCHSQUARE-FRONTROAD: wire PlayerInstance Sprite2D for water reflection
- REFLECTION-PATTERN-GODOT-SOURCE-DEEP-DIVE: source-level analysis of 2D reflection options
- WATER-REFLECTION-FULL-VERIFICATION: persist FrontRoad reflectionOffset baseline 0.0 -> 0.615
- LOADINGSCREEN-DESIGN-AROUND-WASM-BLOCK: hide animated UI around sync pack mount block
- LOADINGSCREEN-DESIGN-AROUND-WASM-BLOCK: bump WEB_VERSION 0.6.315 -> 0.6.318
- ITEMS-SUBPANEL-WRONG-THEME-V2: convert ItemsMenu.tscn G3→G4 keys
- SAVESLOT-SCREENSHOT-SIZE-TOO-SMALL: bump screenshot scale 0.15→0.45
- STATUS-CHARSUB-9PATCH-WRONG + STATUS-MENU-SHOW-ALL-STATS: full stat sheet + sized CharSub
- OPTIONSMENU-DIFFICULTY-SUBPANEL-TOO-SMALL + OPTIONSMENU-VOLUME-LABELS-OVERFLOW-SUBPANEL + OPTIONSMENU-SAVE-BUTTON-CONTEXT-AWARE-EXIT
- LOADINGSCREEN-WRONG-LIFECYCLE-CONTINUE: defer pack-load LoadingScreen to slot-confirm
- SAVELOAD-FEATHER-MISSING-BOTTOM-RIGHT: bump VirtualCursor CanvasLayer 64→200
- MENU-UX-BUNDLE: bump WEB_VERSION 0.6.318 -> 0.6.322
- LOADINGSCREEN-DEFAULT-HIDDEN-AUTOLOAD: codify autoload-defaults-hidden invariant
- FRAMEWORK-LOADINGSCREEN-WASM-INHERENT-CONFLICTS: §3.1 chapter on single-threaded loading-screen tension
- VERA-MAX-INTER-SAMPLE-GAP-ASSERTION: per-mechanism intra-window freeze detection
- EVENT-14-TIGHTEN-CINEMATIC-DELAYS: 389 3s->1s, 395 4s->2s
- DEVLOG-INSTANCEDPLAYER-PATTERN-AND-GODOT-PR: devlog post + Godot upstream PR deferred
- WATER-FRONTROAD-DISTORTION-OFF: zero distortion on FrontRoad water + Water.gd dev setters
- MAINMENU-OPTIONS-OPENS-SAVE: route handleClick via focus_owner
- SAVELOAD-HIGHLIGHT-DOUBLE-ON-NAV: cache + override authored normal stylebox
- SAVESLOT-SCREENSHOT-LAYOUT-V2: revert CharSub reposition; fit screenshot in gap
- SHOP-SETTLING-ACCOUNTS-RE-ENTERS-DIALOGUE + SHOP-WASD-FEATHER-PARITY
- FRONTROAD-PARALLAX-LAYOUT-LOCKIN: persist owner-tuned shifts + foreground windmill z_index
- MAINSQUARE-PARALLAX-LAYOUT-LOCKIN: persist owner-tuned parallax shifts
- CHURCHSQUARE-PARALLAX-WATER-LAYOUT-LOCKIN: persist owner-tuned shifts + water reflection
- TITLE-SAVELOAD-HIGHLIGHT-DOUBLE-ON-NAV: also override 'hover' stylebox on non-focused slots
- INSTANCEDPLAYER-VISIBLE-PRE-WIRE-DUPLICATE-ELIAS: swap setInstancedPlayer after iniatializeScene
- MAYORHOUSE-2F-TREASURE-CHEST-MISSING: bump TreasureChest3 z_index above Rafters
- MAINMENU-WASD-CLICK-V2: consume ui_accept after handleClick to prevent double-fire
- OPTIONSMENU-WASD-NAV-V2: consume ui_accept up-front so per-widget dispatch wins
- CHURCHSQUARE-EVENT-NAPHTALI-NOT-FIRING: remove InstancedPlayer per owner directive
- WINDMILL-GEAR-EVENT-DELAYS-TOO-LONG: cut all 61 event delays to ~33% of current
- NPC-COLLISION-WIDER-V3: capsule radius 6.5 -> 13.0 (2x V2)
- FRUSTRATED-EMOTE-PAUSES-AND-PERSISTS: align bootstrap with packs_src single-play
- SAVE-SLOT-SCREENSHOT-PERSIST-V3: diagnostic logs across capture/persist/load stages
- MAYORHOUSE-2F-TREASURE-CHEST-V2: extended diag in TreasureChest._ready + WEB_VERSION 0.6.339
- FRONTROAD-PARALLAX-HORIZONTAL-DRIFT: zero motion_scale.x on all parallax layers
- EMOTE-SYNC-EXIT-DELAY + NPC-COLLISION-WIDER-V4: trim emote exit delay, bump collision to 20.0
- Revert "FRONTROAD-PARALLAX-HORIZONTAL-DRIFT: zero motion_scale.x on all parallax layers"
- NPC-COLLISION-WIDER-V4: halve height 36->18 (too wide)
- NPC-FACING-RESTORE-AFTER-EVENT + PLAYER-INTERACTION-RADIUS-CALIBRATE: snapshot/restore NPC defaultLookDirection around executeEvent, interaction radius 30->22
- NPC-COLLISION-WIDER-V4: revert Elias capsule to original, bump NPC capsule height=20 at runtime via duplicate(). Interaction radius restored to 30.
- PROD-SAVE-LOAD-BROKEN + MAINMENU-BUTTON-WIRING-MISMATCH: await pack load before cold-boot scene change; skip handleClick for mouse events (left-click=ui_accept was firing focus_owner not clicked button); cancel from Load returns to Load not Save
- MENU-FOCUS-OUTLINE-DISABLE + MENU-MOUSE-WASD-MODE-TOGGLE + SHOP-TAB-ACTIVE-STATE-VISUAL + UNIFIED-MENU-CURSOR-NAV-SYSTEM: StyleBoxEmpty on focus in both themes; VirtualCursor global mouse motion via _unhandled_input; Shop Buy tab pressed=true on open
- SHOP-TAB-ACTIVE-STATE-VISUAL: shop name inline with Buy/Sell tabs (right-aligned); Reset/Settle Accounts stacked below totals panel
- NPC-FACING-RESTORE-OPTION-DIALOGUE: connect one-shot to dialogueCompleted in interact() so NPC restores facing after option/Yes-No dialogues
- SHOP-TAB-ACTIVE-STATE-VISUAL + MENU-FOCUS-OUTLINE-DISABLE + MENU-MOUSE-WASD-MODE-TOGGLE: shop UI redesign (name header, tabs+items left, totals+actions right), focus outline suppressed on DefaultButton, mouse/WASD toggle in ShopOverlay
- ARCH-P0-XFAIL-TRIAGE: clean xfail graveyard — menu/dialogue/event domains
- ARCH-P1-MENU-BASE: migrate OptionsMenu to MenuBase
- ARCH-P1-MENU-BASE: migrate SaveLoadMenu to MenuBase
- MENUBASE-CLASS-NAME-WASM-ORDER: remove class_name registration, use path extends
- Revert "MENUBASE-CLASS-NAME-WASM-ORDER: remove class_name registration, use path extends"
- restore v0.6.355-stable game code — park Phase1 MenuBase on arch/phase1-menus
- ARCH-P1-MENU-BASE: migrate remaining 4 menus from MenuTemplate to MenuBase
- ARCH-P2-DIALOGUE-DISPLAY: wire DialogueHandler extends DialogueDisplay; SceneTemplate.executeEvent delegates to EventDirector
- ARCH-P2: merge Phase2 DialogueDisplay + EventDirector to godot4-migration
- ARCH-P3: remove dead SceneTemplate code — _on_eventCompleted/_incrementCondition/checkInput + delete .full backup
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: handleClick mode-conditional — WASD mode trusts hoveredButtonIdx/y directly, skips focus_owner override that caused off-by-one routing
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: dynamic fullscreen feather anchor + always open at Music Volume in WASD mode
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: fullscreen feather uses show_at_control(checkbox) directly; click emits pressed signal
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: revert VirtualCursor get_global_rect (broke feather globally); restore show_at_control(fullscreenCheckbox) for visual iteration
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: bump fullscreen feather anchor +15px right+down (visual calibration)
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: bump fullscreen feather anchor +15px more right+down
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: bump fullscreen feather anchor +15px more right+down
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: fullscreen WASD toggle — direct _on_CheckBox_toggled call bypasses signal queue
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: restore WASD feather after fullscreen toggle so exit-fullscreen click works
- UNIFIED-MENU-CURSOR-NAV-SYSTEM: fullscreen sync cooldown + ControlsMenu handleCancel returns to OptionsMenu
- CONTROLSMENU-CANCEL-RETURNS-TITLE: intercept ControlsMenu cancel in autoload — always returns to OptionsMenu
- R-from-items goes to Settle, L-from-3rd-col goes to items, affordability gate
- Phase 1 cheat hooks for live state mutation
- relocate General Store panel to bottom-right, expand Totals, equalize button heights
- pin content_margin = 20 across hover/pressed/disabled
- open on first item with Buy active, highlight Reset/Settle on WASD hover
- Reset preserves Buy/Sell tab; mouse-click on tab fires pressed
- lock in 5 gold-standard baselines, drop version-stamped iterations
- switch motion catcher to _input + actively hide on non-interactive
- Title + SaveLoad: WASD-driven feather, mouse hover stops corrupting WASD idy
- drop spinning selectionIcon, place feather right-of and 1px below text
- convert main menu items RichTextLabel → Button with hover highlight
- feather offset (-6,-5), light cream hover, restore on cancel from submenu
- feather offset (-12,-11), opaque cream hover, restore feather on Options→Save
- feather offset (-12, -17), show feather + highlight on initial appearance
- kill dual-highlight on WASD↔mouse mode flips
- clear lingering native hover stylebox when entering WASD mode
- vertically center item name (equal margin top + bottom)
- bigger label height for descenders, no scroll, lingering-hover swap
- WASD-active highlight + visible-glyph centering + mouse-mode reset
- GlobalWorld.menuInputMode + engagement-contract hooks; ItemsMenu adopts both
- adopt MenuBase engagement contract + global input mode
- gate initial feather on GlobalWorld.menuInputMode + persist mode
- black countLabel font color (was default white-ish)
- WASD→MOUSE transition wakes hover under cursor + paint engagement on hover
- feather + highlight panel on options (replaces spinning icon)
- feather to LEFT side, mirrored, painted after final layout; kill spinner
- silence overriding _on_DialogueOptionTimer_timeout; nudge feather -25 / +6
- nudge feather -6 left + 6 down (now -31 / +8 vs option corner)
- nudge feather -4 left + 4 down (now -35 / +12 vs option corner)
- cap thumbnail height so scene name fits with bottom margin
- center thumbnail and scene-name in slot gap
- re-assert MOUSE_MODE_HIDDEN after closing SaveLoadMenu
- Loop Laria music + Wind SFX in Laria scenes
- Menu SFX: nav beeps + Continue/Cancel/Consume hooks
- 500ms debounce after fade-in + show feather on initial appearance
- EliasHouse chest: 100 Sen instead of Mugwort
- handle Sen (itemId=0) treasures so chest doesn't soft-lock player
- Waterway1 backdrop in CombatArena (Phase 1c)
- Elias + Slime sprites in CombatArena (Phase 1d-1)
- Combat Phase 2a: full lifecycle bookend stubs end-to-end on ArenaBench
- Combat Phase 2c-1: CombatGrid handler + arena strip + bench-as-host
- hoist isPlayer set so first sprite load takes Player branch
- Combat Phase 2c-2: BattleTransitionHandler + visual unit conversion
- Combat Phase 2c-5: BattleSnapshot resource pins the conversion contract
- Combat Phase 2c-6: UnitMovement child handler — motion ownership lift
- Combat skeleton: CombatTurnQueue handler + HP-stub on CombatUnit
- Combat skeleton: CombatCursor handler + arena wires it on player turns
- Combat skeleton: CombatActionOverlay + attack mechanic + victory loop
- UnitAnimation handler — battle transition + looping idle
- face-toward-opponent + back-attack initiative + slime in-world wobble
- action overlay extends MenuBase (WASD/mouse contract)
- COMBAT_UI_PORT_PLAN: review of full-game battle HUD + port phasing
- port action menu (5 buttons + ModernGothicTheme) — Phase 2c-10a
- port turn-queue sidebar — Phase 2c-10b
- port stat blocks (selected + targeted) — Phase 2c-10c
- port mode state machine + cursor sprite swap — Phase 2c-11
- MOVE mode entry + walkable-cells paint — Phase 2c-12 (1/3)
- UI port iteration to match video reference — Phase 2c-12
- MOVE epic — sword cursor + path line + walk animation (Phase 2c-12)
- cursor mouse-motion handler scaffolded (Phase 2c-12 polish)
- thinner action buttons + opaque stat block backgrounds
- targeted stat block + matching panel heights + filled buttons
- 165px strip + thin SimpleRaised2 button borders + static sword
- pixel-diff probe vs golden screenshot — Phase 2c-12 polish
- rotating sword on confirm + Run Away rule + gold-pixel diff
- Combat UI: gold-match rebuild — sub-paneled stat blocks + ModernGoth
- Combat UI: bars overlay text + colored fills + bumped fonts + no scrollbar
- Combat UI: thinner stat columns + wider action + bigger button font
- Combat UI: gold-style polish — combined panel, lighter buttons, WASD warp
- Combat UI: real spinning-sword sheet + NormalButton theme + WASD highlight
- Combat UI: pixel-match action buttons to ActionBlock.png golden
- Combat UI: stop nuking button styleboxes on WASD nav + sword +10px
- Combat UI: WASD focus highlight + click-after-WASD + cursor exclusivity
- Combat UI: WASD-mode click fires focused button; cursor stays hidden
- Combat UI: lighter hover stylebox + force HIDDEN on mode transitions
- walk-along-path facing-aware + slightly slower for visibility
- per-cell walking animation (face + walk sprite + slide)
- 6fps animations + iso-only facing + no-confirm-delay + drop game-over
- face-last-direction on idle + feet-on-cell-center anchor
- per-unit feet anchor, +20% button font, SELECT-mode cell hover
- force OS cursor HIDDEN on every mode change + 11-tile turn queue
- vertical sword centered, golden-corners active-cell frame, SELECT keeps acting unit in left panel
- nudge gold-corners frame down 6 px, vertical sword up 3 px more
- OS cursor stays hidden into ACTIVE_SELECTED + gold-frame polish
- gold-corners frame down 4 more px (y +10 → +14)
- Attack-button highlight on mouse-click-into-ACTIVE_SELECTED
- combat-start facing always diagonal so idle anim matches look_direction
- persist last-walked direction to look_direction at end of move
- unify look_direction in screen space; _facing_cell converts to cell delta
- real raw stats per unit (option A) — base + delta randomized rolls
- full BattleStats pipeline (raw → accumulator → battle) wired into damage
- attack swing animation (per AttackAndWinCombatExample.mp4)
- ship attack sprites + hurt-flash shader + attack SFX
- floating damage queue + swap to non-ff7 attack SFX
- slime death anim + victory check + framework gotcha #64 + damage-queue TODO
- damage queue 3-phase + dissolve + UI gate + 1s animation timings
- blocking visual sequence + animation-speed knob skeleton
- dissolve actually runs + slime attack animation
- enemy AI + data-driven enemy attacks + button polish + victory one-shot
- end-turn + AP + FACE picker + tiered overlay + stat balance
- ATTACK mode 3-layer painting (red target / yellow no-target / white aim)
- clear ATTACK paint on combat end (yellow cells lingered)
- Game Over flow — ally death + skip transition + scene change
- hit/miss/crit rolls + damage queue miss + crit text
- Damage Queue v2 — sign + icon + Critical sub-label
- damage queue live-preview hook
- COMBAT-CAMERA Step 1: CombatCamera skeleton + bind/make_current
- COMBAT-CAMERA Step 2: pan-rect clamp in _process
- damage queue sandwich layout + MSDF font + camera Y-bias
- COMBAT-CAMERA-STEP3: middle-mouse-gated WASD pan + UI_INSET_BIAS_Y bias
- COMBAT-CAMERA-STEP4: mouse-wheel zoom with cursor-anchored pan
- COMBAT-CAMERA-STEP5: auto-frame on turn_started when unit off-screen
- COMBAT-CAMERA-STEP6: slide-in / slide-out on combat transitions
- recover iteration work — damage queue, portrait, slime AP, AI, telegraph
- yield a frame in _advance_turn_after_action to break OOM loop
- restore CombatSpriteBounds (lost in stash recovery)
- cap portrait head-clip to 2 px (the owner rule)
- white-flash hurt shader (was red tint)
- enemy turn obeys AP — move OR attack, not both
- halve enemy move-telegraph delay (1.0+0.5 → 0.5+0.25 s)
- pan-clamp uses backdrop bounds (the owner's rules)
- cursor swap — dragCursor while panning, magnify while zooming
- audio + attack-timing + y-sort batch
- victory-music timing + Dungeon.ogg as post-combat track
- bump web version + commit Godot-regenerated .import UIDs
- lift Combat/ out of bootstrap into Combat.pck
- switch to inject-at-build (option A) — single self-contained zone pack
- ArenaBench drops bootstrap-side ext_resources, spawns Player + trigger at runtime
- extend inject to bootstrap-side GUI deps (ModernGoth + StatBlock textures)
- wipe zone-pack .godot/exported/ on every redeploy
- bump web version + Godot-regenerated .import UIDs
- merge LariaVillage + LariaWaterways → single Laria.pck
- port Waterway1 from full-game tree into Laria pack
- enemy-spawn pipeline + y-sort + EnemyTrigger body_entered
- signal-driven per-enemy PlayerDetectionZone (replaces per-frame distance check)
- thicken EnemyTrigger collision rect (20×20 → 20×80)
- drop Grid.visible=false in waterway1 — was hiding units + cell paint
- Grid.scale = Background.scale rule for G3-migrated zone scenes
- port waterway2/3, lift combat to SceneTemplate, bake Grid Y-offset rule
- event 5 flow + pack-load lifecycle + always-on pack overlay
- emote-trigger UI buttons for manual verification
- status label, prints, force VISIBLE cursor
- EMOTE-PACK-SHADOW: fill-pattern for PlayerCharacter in zone packs
- EMOTE-TAIL-DURATION: hold emote 0.5s past natural anim end
- Windmill1Basement: restore G3 grid scale 0.4 / position 0,0
- ChurchSquare grid: restore G3 scale=0.4/position=(0,0); revert Windmill1Basement
- ChurchSquare combat: remove zoom/pivot, all enemies join, unit counter-scale
- ChurchSquare combat: hide non-combatant NPCs + 1 unit per cell
- ChurchSquare combat: classify Bodies/ children by CharacterBody2D + unitType
- CombatGrid.find_nearest_cell: account for grid scale
- Revert "EMOTE-TAIL-DURATION: hold emote 0.5s past natural anim end"
- Revert "EMOTE-PACK-SHADOW: fill-pattern for PlayerCharacter in zone packs"
- Revert "CombatGrid.find_nearest_cell: account for grid scale"
- Revert "ChurchSquare combat: classify Bodies/ children by CharacterBody2D + unitType"
- Revert "ChurchSquare combat: hide non-combatant NPCs + 1 unit per cell"
- Revert "ChurchSquare combat: remove zoom/pivot, all enemies join, unit counter-scale"
- ChurchSquare combat: remove zoom/pivot, all enemies join, unit counter-scale
- ChurchSquare combat: hide non-combatant NPCs + 1 unit per cell
- ChurchSquare combat: classify Bodies/ children by CharacterBody2D + unitType
- drop KinematicBody2D — Godot 4 class doesn't exist
- CombatGrid.find_nearest_cell: account for grid scale
- _close_combat_and_restore: hard-clear locks, don't restore pre-combat isLocked
- NPCs hidden for combat: queue_free instead of restore visibility
- T5 D5: ChurchSquare combat playthrough + force_combat_resolve helper
- Bed sleep-flow: stamp DialogueHandler.currentNPC in populateDialogueByEvent
- clear optionMap on dialogue completion
- unit counter-scale: multiply, don't overwrite snapshot.scale
- sleep hold-black + slime attack-anim fallback
- enemy AI: get close (revert prefer-largest-attack-d)
- tools/balance: waterway encounter-rate sim v1
- tools/balance: sim v2 — HP/mugwort/sen economy + leave-decision queue reset
- item-name and count labels — white text + black outline
- enable EquipmentMenu post-paladin-event
- water shader: noiseTexture sampler — repeat_enable, filter_linear
- ChurchSquare water: format=2 → format=3 + NoiseTexture2D migration
- Title + FrontRoad water: G3 motion params + noise block populate
- MenuOverlay nav: include Equipment (1) in _LEFT_CHAIN
- SkillsMenu scroll-on-WASD; EquipmentMenu cancel routes through MenuOverlay
- action panel lists all matching inventory + Unequip
- real render via existing buildEliasSkillTree() builder
- EquipmentMenu action panel: wrap items + Unequip in ScrollContainer
- action panel = lower half; stats fit inside StatsPanel
- SkillTree cell: borderless grid, full-cell icons, centered labels
- SkillTree grid fills width; Equipment 2/3 top + always-on action panel
- SkillTree cell: SP cost lower + black outline; Lv text shifted higher
- Skills + SkillTree: top-chrome split mirrors StatusMenu
- Combat-end teleport: drop pre-combat position restore; face down
- EquipmentMenu action panel: parchment-style buttons (NormalButton.tres)
- bump base font 22 → 28; shift stat names right 20px
- empty action panel = empty; slot labels shifted +8px
- SkillTree WASD nav + real BuySkillMenu submenu (Learn / Cancel)
- feather cursor on focused cell; BuySkillMenu on CanvasLayer
- center top text; pull buttons in from BorderBox edges
- SkillTree scroll-on-WASD; right-click cancel intercepted in autoload
- hoist scroll-into-view helper; SkillsMenu + SkillTreeMenu use it
- pin SkillTree → BuySkillMenu → cancel returns to SkillTree
- extend SkillTree cancel pin — real Esc + real right-click + mainmenu-first flow
- Cloud system port — copy portable bundle + wire into Title.tscn
- Cloud system: @export sky_y_min/max + wire MainSquare/FrontRoad/ChurchSquare
- shift CloudSystem up 400px; hide old parallax cloud layers
- flip parallax (big/fast/top); restore initial random fill; deeper z
- density floor, faster wisps, wisp grows + speeds up over life
- CanvasLayer wrap + @export wrap_left/right + round-robin layer + extend Title sky
- Title cloud overrides: switch to viewport-space coords (CanvasLayer-relative)
- move FrontWindmill (blades sprite) into own CanvasLayer above clouds
- CloudSystem global_speed_mul; Title windmill blades follow_viewport
- hide WindmillShadow artifact; sky_y_max 410 → 360
- CloudSystem wisps: spawn anywhere on cloud, drift independently of parent
- hide BackgroundFill (extra sky); shift Sky sprite 20px left
- Sky.position.x 1140 → 1100 — eliminates left-edge black strip
- Cloud port: apply Title's tuned setup to MainSquare/FrontRoad/ChurchSquare
- Cloud port to Laria zones + version display + force_navigate + auto-reload
- Cloud z-ordering: clouds behind mountains/hills in Laria zones
- Wind band shader on Title hills + FrontRoad cloud slowdown
- Wind band shader on ChurchSquare BackHills + green-only gate
- bd init: initialize beads issue tracking
- Cloud shadow port to Title + FrontRoad parallax zoom-ignore + beads init
v0.4.70
22 changesNew
- Add translation rules 11-12: OS.window_size + ResourceLoader guards
- Add Shape D playthrough tests to architecture + 3 tickets
Fixed
- Fix event lock: only unlock player when NO event fires
- Fix fuzzy NPC sprites: set filter=false on all pack sprite imports
- Copy slime walk/idle sprites — fixes WASM hang in event 5
- Fix event 5 hang: copy missing SFX + guard resolveResImport
- Fix fuzzy NPCs: add filter=false to pack project importer defaults
- Fix event 5 hang: remove per-frame print + fix Enemy fadeIn Color bug
- Fix DialogueHandler parse error: broken indentation from replace_all
- Fix SaveLoadMenu crashes: null party, preload→load, web screenshot
- Create epics.json + 11 new tickets for Save/Load + Fixture Access epics
- SL-2/SL-3: Fix save/load flow — null guards, missing vars, web compat
Tested
- Devlog Session 12: playtesting, multi-agent architecture, doc restructure
Docs
- Multi-agent architecture: ticket system, expert prompts, workflow doc
Maintenance
- Port TreasureOverlay visual rendering from full game
- Port ItemsMenu from full game — items submenu now renders
- Replace spinning LoadingIcon with bouncing triangle indicator
- Port EquipmentMenu + StatusMenu from full game
- Complete multi-agent system: tickets, dashboard, agents, expert prompts
- multi-agent architecture aligns with Anthropic's Agent Teams pattern
- Remove diagnostic markers from DialogueHandler
- SL-1: Rewrite SaveGameButton — lightweight rendering, no Unit.tscn
v0.4.50
34 changesFixed
- Fix #50: Naphtali dialogue loops back after cutscene ends
- Fix #49 + #52: dialogue box sizing (Agent D) + cloud drift (Agent C)
- Bug cluster: #51 alpha, #30 slider, Windmill2SecondFloor port, infra
- Tier 3 options menu coverage (#39, unblocks on slider fix)
- Fix dialogue/menu dimensions + MainSquare movement lock
- Fix dialogue box height: remove anchors and rect_min_size
- Fix movement lock: clear player.isLocked + changingScenes at scene init
- Fix cloud direction (drift right to match windmills) + 50% slower
Improved
- Task #29: screenshot cleanup + file-size → state-check rewrite (Agent N)
Tested
- restore live-dev-loop hooks (PROC-LIVE-DEV-LOOP + PROC-TESTBRIDGE-HOOKS)
- Tier 3 event command coverage: position/face/speed/visibility (Agent E)
- #40: _testIsEventValid hook + un-xfail gated event test
- Event 9 prerequisite tests + copy missing music/SFX assets
- MenuOverlay submenu Tier 3 coverage (Agent M2)
- Event command slice 3 (Agent E3) + eventCurrentOrder TestBridge field
- Event 8 MayorsHouse tests — fills the last gap in the intro chain
- Chrome zombie mitigation: kill orphan browsers after every pytest session
Maintenance
- Version pipeline + visible Title label + cache-busting
- Session work: Godot 4 migration tooling + live dev loop infrastructure
- #53 recorder + #54 pre-render events + NPC sprites + cloud tuning
- restore version label CanvasLayer + ModernGoth + size 36 (Phase 2 recovery)
- Session 11 devlog: subagent workflow playbook
- Encrypted HTML5 export research report (Agent K)
- +Windmill2SecondFloor, scenes_done 14→15 (31.2%)
- pre-scouted GeneralStore port recipe
- GeneralStore port: closes Alpha Part 1 Laria town, scenes_done 15→16
- expose playerSpeed + npcPositions (Agent E follow-ups)
- Demo thermometer: re-xfail windmill1 entry event with clearer reason
- auto-step CORS server port on bind collision
- Agent W: Waterways dep audit + port plan
- Windmill story events 2-7: 6/7 passing, sprite deps copied
- Event command slice 2 (Agent E2) + anti-ripping research (Agent H)
- Remove fit_content_height from dialogue text — was inflating box height
- Port feather mouse cursor from full game
v0.4.1
5 changesFixed
- Godot 3→4 migration: converter + manual fixes (248→28 errors)
- v0.5.0: Godot 4 migration — fix Camera2D zoom inversion + version bump
Improved
- Asset migration: GUT removal, font conversion, texture reimport, project.godot cleanup
- Godot 3→4 migration: rect_, setget, API renames (24→0 parse errors)
Maintenance
- Godot 3→4 migration: WebBootstrap compiles clean (0 errors)
