Release Notes

What's New


Every public build of The Chronicles of Nesis, newest first.

v0.8.2642

179 changes

New

  • Merge QB-111 reaction-aware enemy positioning (sandbox/nix-qb111-reaction-aware-positioning @34f9cc67): enemy AI prefers to attack from OUTSIDE the target's on-struck reaction range when its attack_range allows. Generalized (REACTION_DEFS carries 'range'; reaction_on_struck_range() reads max across on_struck_melee kinds) + scored decision-engine term reaction_avoid_weight (enemy-only). Outcome: range-1 adds forced adjacent (feed Counter = Build A add-clear), range-2 Mother strikes from 2 (dodges Counter → Build B Smite is the boss answer). Follow-up flagged: non-trail-leaver dumb move-pick path lacks the term (fine today, all range-1).
  • Add seedable CombatRNG for deterministic QA combat repro (qa_standards.md Part 3)
  • Deploy gate: add 6th check (anonymous no-token boot) + manifest provenance

Fixed

  • Merge QB-108 reaction-strike facing restore (sandbox/nix-qb108-reaction-facing @ef80783c): _perform_free_strike now saves the reactor's facing before turning to strike and restores it AFTER _present_attack_result's await (overriding the internal re-idle). Covers Counter + Opportunity + Preemptive (all shared this leak). Normal attacks unaffected (they call _present_attack_result directly, not via free-strike). Fixes counter permanently re-facing the unit (flank/crit exposure).
  • QB-104b/QB-109/QB-110: per-component mitigation tags, Counter icon fix, drop-cell path tie-break
  • QB-112 pass JSON STRING (not parsed object) to __nesisStepDone — CDP Runtime.addBinding accepts exactly one string; JSON.parse(obj) threw 'Invalid arguments' + silent-failed. Driver parses on receipt (universal string contract). Found by Quinn.
  • QB-113: fix skill-tree buy-submenu leak (MenuStack pop-order bug)
  • QB-115 self-heal SpeedControl menu-suspend state, robust off-step cycle
  • Merge QB-115 speed-cycle-after-navigate fix (sandbox/nix-qb115-speed-navigate @16b6e621): SpeedControl._sync_menu_state() polls MenuOverlay.isAnyMenuShown() every frame to self-heal _menu_suspended (gated out of combat), instead of relying on push-style resume_from_menu() which a bypassing menu-close path (Esc/right-click on root panel, no submenu) skipped → _menu_suspended stuck true → speed input permanently no-op. + hardened _cycle_time_scale off-step fallback. SpeedControl.gd only; distinct from QB-113.
  • menu-close-path regression suite (QB-113 MenuStack strand + QB-115 SpeedControl stuck-suspend)
  • Merge menu/submenu-nav regression suite (sandbox/vera-menu-nav-regression @42bb0c8c): 9 behavior tests — MenuStack-empties-on-close, nested teardown (SkillTree/BuySkill, Items/Consume), cancel-never-doubles, QB-113 literal repro, mouse/WASD/mode-swap matrix (test_menu_nav_stranded_stack_regression.py); + QB-115 speed-survives-menu-close-via-Esc/right-click/Space (test_speedcontrol_menu_close_paths_qb115.py). Behavioral assertions (refactor-survivable). Flagged: no _testMenuStackOp reset hook for a Tier-2 pin (not blocking).
  • QB-114 accept tied-progress moves so short-range enemies route around wide friendly obstacles
  • Merge QB-114 enemy multi-turn pathing to open side (sandbox/nix-qb114-multiturn-path @1ea1aa74): accept a tied (same bfs-distance) lateral move as progress in _move_enemy_toward + _pick_move_destination, so a short-move_range add past a wide (>move_range) friendly body (Mother 2x2) advances every turn instead of stalling (strict < required beating a value that ties on the whole near side). QB-111/QB-110/body-landing-exclusion untouched. Sim-verified: move2 add stalled pre-fix, converges 5 turns post.
  • Fix Move relic soft-lock: interact() no-op left player permanently locked
  • Fix Move-relic engage soft-lock (sandbox/nix-waterway-relic-softlock @2c6f6258): Relic.interact() return-contract gap left player permanently locked when engaged pre-water-lower (interactable=false → silent no-op, caller waited on a true return/modal that never came).
  • Combat polish: reaction turn-barrier, feather-cursor leak, victory facing, done-push fixes
  • Regression tests: combat-batch bugs (BUG1-6) + Move-relic soft-lock (d0f987fe/2c6f6258)
  • Merge combat-batch + soft-lock regression suite (sandbox/vera-combat-batch-regression @d29366c6): 5 test files — reaction turn-barrier (BUG4), victory-facing (BUG3), item-menu cursor asset (BUG1 partial), step-done push contract (BUG5/6), Move-relic soft-lock. Tier-2 collect-clean; Tier-3 WASM verified post-merge (Quinn-hold). Flags: BUG1 cursor needs a TestBridge mirror to be assertable; BUG3 victory-facing needs fail-before/pass-after confirm.
  • Poison DoT source-independence + resistance model (sandbox/nix-poison-dot-source-independence @673634af): recurring poison tick = ceil(5% x affected.max_hp) once/round, source-independent (CombatOutcome.affected_unit_dot_tick). On-hit burst + apply-chance stay source-based; QB-116 chance-only untouched. Poison resistance (Poisona) halves apply-chance + ALL incoming poison damage uniformly (resolver is_resistant choke). Root fix for heal-negative: the ~-16/round was on-hit-burst + DoT both source-scaled; DoT now ~2/round. Reusable for acid/elemental.
  • Real-input side-control + status_stacks + cursor-mirror (sandbox/nix-side-control-statusstacks @a4bd4d3): manual-both-sides toggle arms enemy turns for the driver via _arm_active_selected_turn (same player-arm path, REAL input, no force-action); _testSetCombatManualSides + snapshot manual_sides. status_stacks:{type:count} in snapshot (consume-skill ready). window._testBridge_activeCursor mirror at CombatOverlay+ItemsMenu cursor sites (makes BUG-1 cursor test assertable). Default OFF; live play unchanged.
  • pin time_scale=1.0 during EVENTS (fix Ep1 intro soft-lock at 4x)
  • flag between-event windows as unsafe (fix ChurchSquare slime mid-sequence save)
  • AutoPlay QB-044: fix combat brain returning 'end' every player turn (retired AP gate)
  • Merge sandbox/nix-autoplay-combat: fix AutoPlay compute_intent AP-gate (retired ap -> Move+Act budgets)
  • benchmark-infra #1: _testSpawnBoard deterministic fixed-cell staging
  • AutoPlay QB-107 R2: preserve in-flight attack intent through transient mode dip + face the focus target (fixes 3+-enemy no-confirm stall)
  • Fix residual combat-EXIT camera jump: ease offset-recenter instead of snap
  • Fix WASD paging cursor-jump in scrolling list menus (Items + combat Skills)
  • QB-107 r3: fix 3+-enemy attack no-commit — position attack/skill cursor via move_to (root cause: cursor never reached target)
  • add pre_waterway.json (E1 benchmark Fixture 1, owner-canonical)
  • P2: combat-log regression suite — deterministic seeded log-accuracy pins
  • Fix Elias portrait off-center in shared CharacterSelectButton
  • Merge sandbox/nix-combatbugs into develop
  • stats level-up grows Sta/Spd/Knw accumulators (QB-108) + DEX/AGI/LUCK SP nodes apply (QB-109)
  • Merge sandbox/nix-statfix into develop
  • Fix mana-clamp asymmetry on save load + blank skill icons (Counterattack/HealthUp)
  • P2 v2: drive combat to completion (batch + instant-resolve) — fix harness gap
  • export autosave boss-window bug (ChroniclesOfNesis reminder)
  • export ArenaBench coroutine-override bug (P2, Nix)
  • Add relic equipment-stat regression tests: Move Relic/Quick Boots move_range stack (gnt4), Health Relic +25% maxHP pin (vh60)
  • Merge sandbox/vera-relictests into develop (relic move/maxHP regression tests + fixtures)
  • ChroniclesOfNesis-vh60 follow-up: fix Health Relic +25% compounding to 54%
  • Release gate: test the cut artifact + curated smoke set (GATE-FIX)
  • Phase 2 harness: fix restage determinism race (ChroniclesOfNesis-akt6 follow-up)
  • Phase 2 harness: fix restage chain-accumulation drift + atomic comp/seed intake (ChroniclesOfNesis-akt6 gate-4)
  • Phase 2 harness: fix restage determinism ROOT CAUSE — skip party write-back on synthetic restage (ChroniclesOfNesis-akt6 gate-5)
  • Merge sandbox/vera-gate into develop (release-gate fix: correct build served + debug token + release smoke tier)
  • Playtest harness P2: fix inventory drift + no-delay restage race
  • Fix restage-chain T0-hash drift: idempotent kit-item apply + fresh-equip T0 sync

Tested

  • gate update 2 stale tier15 pins to owner-set values (unblock release gate) — enemy_static Mother magic_attack 18->8 (QB-097 poison~=physical); boss_balance Cure mp_cost 5->3 (owner: 5 too high). Both re-run PASS. Not balance regressions — owner-intentional value changes the pins hadn't caught up to.
  • Tier-2 test: pin QB-116 status-stack vulnerability (CombatOutcome.magic_status_hit_chance)
  • Merge QB-116 stack-vulnerability tests (sandbox/vera-qb116-tests @a5318ecb): Tier-2 pin of CombatOutcome.magic_status_hit_chance — curve [55,76,83,91,91] at stacks [0,1,5,9,12], cross-status independence, Pendant composition. 8 assertions.
  • Seeded combat RNG (sandbox/nix-combat-seeded-rng @8b5d9abc): CombatRNG.gd module-singleton — route live rolls (CombatMath.luck_biased_roll = the single hit/crit/dmg/poison funnel + slime-split + Unit._roll + MotherSlime cloud-prob) through one seedable RNG. _testSetCombatSeed(n) + [seed=N] log + snapshot combat_seed. Default randomize() (live play unchanged); deterministic only when seeded. No distribution change — pure routing.
  • Instant-resolve QA combat mode (sandbox/nix-combat-instant-resolve @f6c2ce11): _qa_instant_resolve flag + _dur() returns 0.01s floor when set (collapses animations, keeps state-machine/settled/reaction-barrier order intact via ≥1-frame floor). _testSetCombatInstant + snapshot instant_resolve field. Off by default (byte-identical _dur when off). For QA driving to the true floor; marketing runs leave it OFF for 1x natural animation.
  • Driving framework Phase 1: readable time_scale field + _testSetTimeScale set hook
  • AutoPlay LAYER 1 combat policy + data-driven strategy profile (Quinn spec)
  • per-test timeout overrides for live-fight pins + QB-107 oscillation pin
  • Merge sandbox/nix-rag3a into develop (real-scene composition staging: _testStageRealCombat / SceneTemplate hook — Phase-1 harness slice)
  • Merge sandbox/nix-restage into develop (harness P2: in-place restage — _testRestageRealCombat, no browser reset)
  • Merge sandbox/nix-restage3 into develop (harness P2 determinism: _testForceReseed resets CombatRNG on restage)
  • Merge sandbox/nix-restage6 (harness P2: inventory snapshot/restore on restage + latest-wins atomic intake)
  • Deploy smoke gate: 5 high-level critical-system checks (owner spec)

Release

  • bump WEB_VERSION 0.8.2630 -> 0.8.2631 for alpha cut (fresh stamp incl. Health Relic vh60b)

Docs

  • COMBAT_OBSERVABILITY.md — trace/snapshot layer + regression-tested log-accuracy contract (owner-greenlit)
  • observability QB-107 resolved as measurement artifact; combat log verified accurate, de-dup roster is the defect
  • observability add QA-tooling-correctness contract (owner canon)

Maintenance

  • QB-108: reactions (Counter/OA/preemptive) restore facing after the strike
  • QB-107b: mouse mode flips to VISIBLE with the combat log open (residual gap from QB-107)
  • Merge QB-107b combat-log cursor visible (sandbox/nix-qb107b-log-cursor-visible @7e61787a): with the combat log open, mouse motion now flips to mouse mode (VISIBLE + diagonal sword) via VirtualCursor.notify_mouse_motion() inside the QB-107 reassert. Root cause: log panel isn't a MenuBase (no mode-flip machinery) + set_log_open early-returns the other panels, so nothing flipped mouse_mode while the log was up.
  • Merge combat batch3 (sandbox/nix-combat-batch3 @fdab0502): QB-104b per-component (resisted)/(immune) inline in the damage line (line-level tag suppressed when >1 component); QB-109 Counterattack skill-menu icon (SkillsMenu name-resolver alias Counterattack->ReactionAbilityIcon; getIcon() was already fine); QB-110 player-movement path tie-break toward drop cells (CombatGrid.astar_path drop_cells param + DROP_PREFERENCE_K, pure tie-break, player call sites only, not enemy AI).
  • QB-111: reaction-aware enemy attack-cell positioning (GENERAL rule)
  • QB-112: PUSH "done" signal for QA driver (window.__nesisStepDone)
  • Merge QB-112 done-push CDP binding (sandbox/nix-qb112-done-push @3c79c0ae): game fires guarded window.__nesisStepDone({armed,reason,settled,context,snapshot,log_tail}) at combat turn-ready edge (_set_input_armed changed&&armed) + scene-ready (await_scene_ready, all 3 SceneTemplate mirrors synced). Zero-cost no-op when no driver registered (ship-safe). Lets Quinn's QA driver await instead of poll (60-90s/turn -> seconds).
  • Merge QB-113 skill-tree submenu leak (sandbox/nix-qb113-skilltree-submenu-leak @b1a48a97): MenuOverlay._hide_all()/isAnyMenuShown() reordered children-before-parents so nested submenus (BuySkillMenu<SkillTreeMenu, ConsumeItemMenu<ItemsMenu) pop off MenuStack in reverse-push order — parent-first hid stranded 'skilltree' + a stale focused button that a later global ui_accept click re-fired (submenu leak → double menu). + MenuStack.reset() backstop at _hide_all end. Root cause in the two autoloads; no GUI/Menus script changed.
  • QB-116: status-stack vulnerability — chance-only poison snowball
  • QB-116: status-stack vulnerability — poison stacks discount target magic_dodge (chance-only snowball, ×0.5 dodge at 9 stacks)
  • Combat batch: reaction turn-barrier + counter idle + cursor + victory-facing + done-push emitters (sandbox/nix-combat-anim-cursor @d0f987fe)
  • Instant-resolve QA combat mode: collapse _dur() to a near-zero floor for sub-single-digit driven turns
  • Poison/acid DoT source-independence: tick = ceil(5% affected max_hp), once/round
  • real-input side control, status_stacks snapshot field, cursor-assertability mirror
  • WEB_VERSION -> 0.8.2606 (autosave event-window + SpeedControl event-pin live)
  • re-port the knock-on-wood SFX at game open (owner request)
  • restore the ESCALATING knock sequence + opening monologue (owner)
  • drop the first two monologue lines (owner)
  • WEB_VERSION -> 0.8.2610 (knock SFX escalating sequence live)
  • Merge sandbox/nix-autoplay-l1 into develop
  • benchmark-infra #4: wire enemy RandomPolicy through seeded CombatRNG
  • benchmark-infra #1/#2/#3: combat_result + t0_hash + board-override applier
  • Merge sandbox/nix-benchinfra into develop
  • benchmark-infra: sync bootstrap ArenaBench.gd to canonical pack copy (dual-copy class_name race)
  • pin AutoPlay Layer-1 boss-priority/kite + benchmark-infra staging (Tier 3)
  • benchmark-infra: AutoPlay batch-mode pacing-collapse (CRUX #5) + is_boss priority read (#3)
  • benchmark-infra: ArenaBench in-place re-stage (#2) + player-KIT board fields (#4)
  • Merge sandbox/vera-benchpin into develop
  • Merge sandbox/nix-irbatch into develop
  • QB-105: preserve action-commit handshake under AutoPlay batch mode
  • QB-106: recognize board-granted item skill as combat-usable (not just relic)
  • Merge sandbox/nix-p1pair into develop
  • AutoPlay QB-107: stable multi-target focus + never-END-with-target-in-range
  • Merge sandbox/nix-qb107 into develop
  • Merge sandbox/vera-benchpin2 into develop
  • Merge sandbox/nix-qb107b into develop
  • Merge sandbox/nix-camexit into develop
  • Merge sandbox/nix-menunav into develop
  • interrupt now applies a STUN status (loses next turn + no reactions)
  • capture 2611 (Health Relic +25% maxHP) + abzw (skills-menu blank icon)
  • Merge sandbox/nix-interrupt into develop
  • Merge sandbox/nix-qb107c into develop
  • move ALL status ticks from turn START to END of affected unit's turn
  • Merge sandbox/nix-statustick into develop
  • QB-107 r4 DIAGNOSTIC: combat-AI build marker + upstream mode-abort instrumentation
  • Merge sandbox/nix-qb107d into develop
  • QB-107 r5: lock has_acted-only-if-enqueued invariant + conclusive confirm/resolve trace; bump AI-build
  • Merge sandbox/nix-qb107e into develop
  • combat-observability P1/T0: per-instance log naming + panel-visibility gaps + log contract
  • Merge sandbox/nix-logp1 into develop
  • combat-log P1 FINAL: status remaining-count + death line + mid-spawn on-screen labels (logp1b)
  • Merge sandbox/nix-logp1b into develop
  • Merge sandbox/vera-logp2 into develop
  • Merge sandbox/nix-charbtn into develop
  • Mother Slime max_hp 70 -> 60 (owner, forgiving-demo direction)
  • learned-reaction reaches combat + 2x2 resting-overlap + 2x2 target-hover coloring
  • Overworld pack Skill.gd -> canonical bootstrap (QB-109 dual-copy)
  • 4 realistically-leveled E1 boss builds (2 stat x 2 skill)
  • Merge sandbox/nix-clampicon into develop
  • Merge sandbox/vera-logp2b into develop
  • disable name-label scrollbar (single centered line, keeps approved portrait 4/5)
  • combat HUD: control-hint row + COMBAT MODE title (drop Confirming); gate AI charge on has_acted
  • Merge sandbox/nix-hudcharge into develop
  • suppress during SluiceGate Mother Slime boss (cond 11)
  • P2 v3: use named-body enemies + real baselines (enemy hp/maxHp override drop)
  • Merge sandbox/vera-logp2b into develop
  • combat HUD: COMBAT MODE title font 12->10 (was clipping to 'COMBAT MOD' at 75px)
  • Combat HUD r2: COMBAT MODE as grouped header, vertical hint stack (ChroniclesOfNesis-kmmp)
  • sync beads/daemon state
  • Merge sandbox/nix-kmmp into develop (HUD r2: grouped header + vertical hints) [re-merge; prior attempt aborted on dirty tree]
  • Combat HUD r3: bigger hint boxes+caption font (y5y5) + fieldset-legend mode group (h4hw)
  • sync beads/daemon state
  • Merge sandbox/nix-y5y5 into develop (HUD r3: fieldset-legend h4hw + caption/button size y5y5)
  • Combat HUD r4: fieldset outline as thin gapped stroke, not opaque patch (h4hw)
  • sync beads/daemon state
  • Merge sandbox/nix-h4hw2 into develop (HUD h4hw: fieldset outline via gapped gold strokes, drop opaque patch)
  • sync beads/daemon state
  • Combat HUD r4: inset V/S/C buttons from box outline, right margin, thicker stroke, shorter hint rows
  • sync beads/daemon state
  • Merge sandbox/nix-679j into develop (HUD r4: button inset for visible box verticals + right-margin + thicker stroke + shorter hint rows)
  • Combat HUD r5: bump L1/Info/R1 caption+glyph size, nudge row height to fit
  • sync beads/daemon state
  • Merge sandbox/nix-vzaq into develop (HUD r5: enlarge hint caption/glyph to fill boxes)
  • Combat HUD: auto-hide top-right Speed:Nx indicator after idle at 1x
  • sync beads/daemon state
  • Merge sandbox/nix-khi6 into develop (combat Speed:Nx indicator auto-hide at 1x, persistent non-1x)
  • ChroniclesOfNesis-vh60: Health Relic +25% maxHP (was flat +10, then clobbered)
  • sync beads/daemon state
  • Merge sandbox/nix-vh60 into develop (Health Relic +25% maxHP: survive recompute + WebUnitStub equip-reapply)
  • reposition boss_str_smite to SluiceGate pre-boss (controllable entry, was stranded at waterway1)
  • sync beads/daemon state
  • Merge sandbox/nix-vh60b into develop (Health Relic +25% idempotent: capture base once, no compound)
  • rag3 gap (a): stage MotherSlime + composition combat on REAL SluiceGate scene
  • Phase 2 harness: in-place combat restage without browser reset (ChroniclesOfNesis-akt6)
  • sync beads/daemon state
  • harness P2: sync SceneTemplate restage hook into Laria+Overworld pack copies (dual-copy)
  • sync beads/daemon state
  • Merge sandbox/nix-restage2 into develop (harness P2 determinism: atomic re-seed + in-flight guard on restage)
  • Phase 2 harness: force CombatRNG reset on restage, not just pin the seed value (ChroniclesOfNesis-akt6 gate-3)
  • sync beads/daemon state
  • sync beads/daemon state
  • Merge sandbox/nix-restage4 into develop (harness P2 determinism CLOSED: _resolution_pending on restage + atomic comp/seed capture)
  • sync beads/daemon state
  • default top-left pack-status banner HIDDEN (show_pack_overlay=false, explicit-typed)
  • sync beads/daemon state
  • Merge sandbox/vera-deploygate into develop (6-check deploy smoke gate, App-signed-off: boot/save-load/movement/menu/combat + no-token public boot)
  • combat units block movement pathing regardless of side (ChroniclesOfNesis-t4li)
  • sync beads/daemon state
  • Merge sandbox/nix-blockmove into develop (revert ally pass-through: units block each other + poison-walk on leading edge)
  • sync beads/daemon state
  • Merge sandbox/nix-kitidempotent (P2 determinism: idempotent kit re-apply + fresh-stage equip snapshot)
  • release_channel: relative packs symlink so host-side aws sync resolves (App Defect 1)
  • opening monologue instant + click-progressable + 2x font (owner)

v0.8.2592

200 changes

New

  • combat P1 consolidated movement evaluator core (ChroniclesOfNesis-ioe4)
  • combat extend P1 movement evaluator to the legacy enemy path + player MOVE (ioe4 epic, bugs 21/18)
  • Relic vignette: new shared intro text (owner 2026-09-02)
  • boss engage: port Nix's new cond-14 sequence into the GAME's core_Events.json (was written to the wrong repo-root copy)
  • Add jump event command (parabolic arc) + boss-engage cond14 hop2 rewrite
  • Merge nix jumpcmd: new jump event command (parabolic arc) + boss hop2 arc + 0.5s pause
  • Add TestBridge combat-speed setter + snapshot field (Quinn/Vera enabler)
  • add R2 momentary fast-forward + surface speed/log buttons in ControlsMenu
  • Add _testSpendStat TestBridge sentinel: spend JP on base stats via real commit path
  • QB-097 Mother magic_attack 18->8 (poison~=physical) + ELIAS_BASE agility 3->5 (guarantee move_range 3 at new-game start)
  • Merge QB-100 A-build Counter Attack (sandbox/nix-heal-balance: 0c5fbd9f tree-swap + 1c31247f Counter impl): swap Counterattack id19 -> STR terminal (grid213, cost 5->1 SP), Push id12 -> branch; NEW on-struck-melee reaction (physical_attack-scaled via free-strike, adjacency-gated, uncapped, depth-1 recursion-safe), wired to tree id19 + un-stubbed Counter-Attack Relic id22, reaction-child log. Deploy held pending Quinn hold release.
  • Merge QB-106 Counter melee-only gate (sandbox/nix-qb106-counter-melee-gate @cd39f55a): add event.damage_type=='physical' to the counterattack reaction condition. Root cause: poison DoT tick (source=original poisoner) re-ticked at the struck unit's own turn-start every turn, re-firing the counter against the same enemy ('counterattack like crazy' + 'on his own turn'). Now Counter fires ONLY on real physical melee attacks; poison DoT/cloud/acid/radiant no longer trigger it. Legit enemy-melee case + depth guard unchanged.

Fixed

  • ul07 stop title music on New Game; don't auto-start Laria BGM on intro->EliasHouse
  • 4v2d distinct SFX when opening the main menu overlay
  • 6nwi dialogue-option cursor move uses UI-move SFX, not cancel SFX
  • wqv1 SFX on item-quantity increment/decrement in the store
  • pgcu remove em-dashes from Kein's Glenn story + guard dialogue overflow
  • kv3d don't flash the LoadingScreen progress UI on a no-download scene reload
  • y8on Title defaults to Continue when valid; hide Import/Export under Continue
  • rcv8 post-entry lockout on relic-slot pick (mobile debounce)
  • dialogue DialogueHandler.gd Resource.get() 2-arg regression broke ALL dialogue loading
  • combat WASD-mode action-block click fires the button under the click, not just the focused one
  • combat WASD action-click uses native hit-test (gui_get_hovered_control), always consumes
  • combat WASD action-click hit-tests buttons in canvas-correct space (get_global_transform_with_canvas)
  • combat WASD action-click uses event.position (get_mouse_position frozen at center when cursor hidden)
  • leveling WebUnitStub XP curve desynced from Dal display source (ChroniclesOfNesis-c76x)
  • combat VSlime poison trail terrain persists for the whole fight (ChroniclesOfNesis-b70r)
  • ui save-slot numbers wrap vertically; AUTO slot now shows a floppy icon (ChroniclesOfNesis-uqif)
  • ui rename 'Active Skills' to 'Known Skills' on the combat Unit Details panel (ChroniclesOfNesis-yprn)
  • combat recenter overworld camera on Elias after combat ends (ChroniclesOfNesis-nk49)
  • file young-slime AI passivity bug (ioe4 baseline finding)
  • Tier-2 regression pins for 9-1 bug batch (c76x, b70r, yprn, uqif)
  • Merge vera-ep1tests: Tier-2 regression pins for 9-1 batch (c76x XP curve, b70r/yprn/uqif drift guards)
  • combat guard enemy AI turns against external end-turn races (ChroniclesOfNesis-jrqn)
  • Merge nix ioe4-P1: consolidated movement evaluator (friendly-passable + best-progress + facing term) — bugs 21/18 (ioe4 epic)
  • Merge vera-ioe4tests: Tier-3 regression pins for jrqn AI-turn race guard + ioe4 P1 movement evaluator (facing/friendly-passable/best-progress)
  • file ioe4/jrqn regression follow-ups (residual race gap, broken pack test env, facing-on-forced-move P2 note)
  • Merge nix ioe4-P3: poison-walk terrain-coverage cost fn (real path threaded, coverage/facing/adjacency/range-leave folded into score_move) — bug 23
  • file Waterway VSlime trash-fixture request (unblocks P3/xdog/facing visual verify)
  • ioe4 P3 regression pins — score_move coverage+facing fold (commit 478d2a5b)
  • Merge vera-ioe4p3tests: P3 terrain-coverage regression pins (coverage-beats-doubleback + facing/coverage fold)
  • ioe4 P2: data-driven intelligence-tier enum (bug 22), gates P3 coverage only
  • T4 Waterway5 adult-VSlime trash-fight fixture, Elias non-adjacent (dnpd)
  • Merge vera-vslimefix: Waterway5 VSlime trash fixture (adult VSlime, Elias non-adjacent) — unblocks Quinn P3/xdog/facing visual verify
  • file bed-wake facing flash + dialogue pen-SFX loop bugs
  • Combat drops: fixed chest size regardless of enemy scale (young slime chest was 0.5x)
  • jcp7: fix sticky BGM silence root cause (SoundPlayer early-return) + harden relic-vignette restore
  • Merge nix audiofx: pen-SFX loop (v43j) + bed-wake facing (4xdj) + BGM permanently-off restore fix (jcp7 P1)
  • file qf1z AWAY-case surprise tie-break bug (Vera finding)
  • Merge nix bossengage-supz: all-event-driven Mother Slime boss engage (3 new event cmds, shake fix, grid-center land, gut _scene_command)
  • boss engage: fix jump-1 landing to -190,0 (in front of Elias, original spot), not back at the well
  • file Cure-heal-not-visible bug (P1) + fast skill-test harness capability
  • close xq9w/z88m/6uq0 (already-fixed, Nix triage); ecic needs-verify
  • file DamageResolver over-damage bug (P1, likely Cure-bug root)
  • Merge nix resolver: eisd fix (Mother split reaction damage now logged) + uhbk healdiag diagnostic
  • reopen uhbk (auto-closed, not fixed); close eisd (split-damage now logged)
  • fit 11-row remap table without scroll + relabel + fix label spill
  • Fix combat-log reconciliation: capture effects[].delta at the choke point, not pre-mitigation (QB-095)
  • Merge QB-095 combat-log delta-at-seam fix (sandbox/nix-qb095 5587f045)
  • Leveling batch: C6 grant-timing fix, C9 AP->JP purge, C3 normalize-on-set, history ledger, XP-bar audit
  • Merge leveling batch (sandbox/nix-leveling cd7a8ccf): grant-timing B->A (JP6/SP15 @L5), AP->JP rename (jpAtLevelup/spAtLevelup/xpToLevelup), normalize-on-set via experience accessor, debug levelHistory ledger (starting_roll/grant/spend+currency). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJrsZCEz2v2eFg4gsXV5p5
  • Combat-log bugfix + polish batch: turn-depth, movement logging, cancel-priority, T-prefix, title, font (owner v0.8.2575)
  • Merge combat-log fixes (sandbox/nix-combatlog2575 c13dc866): turn-headers depth-0 (no accumulating indent), movement logging, cancel-priority modal gate (all combat input pickers respect log-open), T%d->'n - ', remove COMBAT LOG title, white/no-outline log text. No delta-capture change (QB-095 reconciliation preserved). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJrsZCEz2v2eFg4gsXV5p5
  • Fix mid-combat spawn main-thread freeze (Mother Slime split -> Young Slime)
  • default-hide debug diagnostics (DiagOverlay + pack/mode banner) even in debug builds (owner 2026-09-03)
  • Merge spawn-freeze fix (sandbox/nix-freeze1 44c92c1d): chunk _mid_combat_spawn with process_frame yields + await in split-reaction + pre-warm Slime.png. No spawn-data change. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJrsZCEz2v2eFg4gsXV5p5
  • Fix levelHistory ledger over-recording: append-once dedupe + clear-on-fresh-roll hook
  • Merge ledger record-once fix (sandbox/nix-ledgerfix c0f88bf0): _has_grant_entry dedupe + clear_level_history() on init — exactly 1 grant/level (JP6/SP15), no over-record under re-entry. Ledger-only, no wallet/grant-timing change. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJrsZCEz2v2eFg4gsXV5p5
  • _testClearLevelHistory sentinel (Quinn fixture-provenance, owner 2026-09-03)
  • Combat-log corrections: turn-order header number only, sentence attack/skill phrasing, own-action nesting fix
  • Merge combat-log format corrections (sandbox/nix-qld0hitchance2 2e135d66): turn-order number on headers only (drop per-event t-counter), sentence phrasing (attacks/misses/crits X. X takes N damage), nesting fix (own move+action parent to turn not each other; reactions still nest under trigger). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJrsZCEz2v2eFg4gsXV5p5
  • Merge _testSpendStat sentinel (sandbox/nix-spendstat 899bf971): real-path JP-spend-on-stat (incrementStat+calculateCoreBattleStats+unspentJP-=+record_spend, flat 1 JP/pt) for provenance-backed fixture JP + wallet-balance. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJrsZCEz2v2eFg4gsXV5p5
  • re-commit 4 boss-ready saves with exact-max full HP/MP (fix partial-HP export defect)
  • Fix Poisona Pendant poison resistance: resolve is now the single ×0.5 source
  • Merge QB-096 Poisona Pendant poison-resist fix (sandbox/nix-poisona-fix 9eacf7fc): apply ×0.5 once in _resolve_poison (after resolve, mirrors _resolve_physical), remove dead call-site halving, raw_amount>=resolved_amount truthful. Pendant now actually reduces enemy poison. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJrsZCEz2v2eFg4gsXV5p5
  • QB-098 fix + QB-099 heal balance: restore combat Item skill, Cure > Mugwort
  • Merge QB-098 + QB-099 heal batch (sandbox/nix-heal-balance @8ea80106): restore 'item' to _PLAYER_CASTABLE (Aug-27 refactor dropped the in-combat Item button, making Mugwort-heal unreachable — QB-098 game bug, not the verb); Mugwort static heal 10->12; Cure heal_amount 8->21 (=30 HP at wis11, always >Mugwort). Tree-swap commit 0c5fbd9f held on branch pending Counter-Attack impl.
  • dual-copy sync Overworld Item.gd mirror to bootstrap (Mugwort heal 12) — resolves pack_asset_audit DUAL-COPY DIVERGED gate
  • QB-101 (P0): fix enemy-turn sequencer hang on mid-turn acting-unit death
  • Merge QB-101 P0 soft-lock fix (sandbox/nix-qb101-softlock @6c8f4156): CombatTurnQueue.advance() no longer conflates 'acting unit died mid-turn' (_active nulled by remove_unit, e.g. uncapped Counter one-shotting an add on its own turn) with 'queue never started' — guards the outgoing-unit logic behind _active!=null and falls through to emit turn_started for the next living unit. Generic for any mid-turn death; unblocks Counter + Quinn's viability runs.
  • Counter-learned boss-ready saves (Quinn regen) — A+B learn Counterattack id19 at STR terminal, Push removed; supersedes stale Push fixtures for QB-100/102
  • Merge QB-102 Counter learned-gate (sandbox/nix-qb102-counter-gate @247d6f74): gate the tree-path counterattack grant on GlobalWorld.party.party[name].skills.has('Counterattack') (reliable save-loaded signal, verified live by Quinn — party-skills dict populated; NOT the empty treeSkills/skilltree_state.learned). Relic path untouched. Fixes Counter auto-firing for players who never learned it.
  • QB-103: systemic tier-resolution fix (Part 1) + Counter damage ladder (Part 2) + test hooks (Part 3)
  • Merge QB-103 systemic expertise-tier resolution + Counter ladder (sandbox/nix-qb103-tier-resolution @739d3a6f): new saved Skill.purchased_tier (set by learn(), survives setEP clobber + DAL save/load incl. action-type re-derive fix); _effective_skill_level branches by source (class-tree=purchased_tier, relic=getLevelByEP, both=max); Counter dmg ladder L1-L5 0.5/0.75/1.0/1.1/1.25 via live-tunable override_value(damage_mod); +1 EP/proc uncapped, thresholds 0/50/100/200/500; hooks _testSetPurchasedTier + _testSetSkillProficiency. BALANCE: whole _PLAYER_CASTABLE roster switches EP-auto->purchase-gated (E1 base-tier by design, expertise pays off E2+).
  • Merge combat-log batch (sandbox/nix-combatlog-batch @cd8a3f05): (1) charge-begin log line 'X readies Poison Cloud' (both cast sites); (2) damage-line resisted/immune annotation (resisted live via math.resisted; immune forward-compat); (3) mouse scroll routes to combat log not zoom when log open. Bug B (turn-9 absorb) confirmed NOT a mechanics bug — VSlime absorbs its own Poison Walk trail at turn-start (poison_absorb + Poison Walk in core_BattlerStats), the missing readies line made it look simultaneous.
  • Merge QB-105 poison-trail absorb fix (sandbox/nix-qb105-trail-absorb @e2e6ef00): remove the 9j2e fake-zero-damage poison event that manufactured a heal-from-trail for poison_absorb units. Absorb/immune units now get a true silent no-op from trails (per owner canon: trail = status-chance only, immune/absorb can't receive it → no heal). Cloud absorb-heal (real damage) unchanged.
  • Merge copilot=N per-session observability isolation (sandbox/nix-copilot-session-id @16a39ba7): ?copilot=<id> (1=owner,2=Quinn) → game POSTs tab_state with ?id=N → server writes per-id files tab_state.<N>.json / copilot_console.<N>.log / copilot_cmd_queue.<N>.json (no id = shared file, backward-compat). do_POST routing fixed to split query before matching. Ends the shared-file last-writer-wins clobber. (/copilot/console + /copilot/cmd remain game-side-unwired — tab_state.<N>.json.consoleLogsTail is the live channel. Laria TestBridge.gd mirror is stale dead-weight, flagged for Port.)
  • Add Counterattack reaction invariant regression tests (QB-100/101/102/106)
  • Merge counterattack reaction invariant regression tests (sandbox/vera-counter-tests @84de75de): 5 Tier-3 tests — melee-only (QB-106 poison-tick-on-own-turn), once-per-attack, no-reaction-of-reaction (depth-1), no-soft-lock on mid-turn counter death (QB-101), unlearned-unit-no-counter (QB-102). Console-ground-truth assertions. Coverage gap flagged: relic-grant (id22) path untested (tree id19 only).
  • sync World.gd WEB_VERSION 2591->2592 to match served build (APPC-sync reverted it post-export; served PCK+txt already 2592). Keeps next deploy's version bump consistent.

Tested

  • enemy-stats update stale pins — Young Slime move_range 3->2, Mother Slime pa 9->4 (c71c000a canon)
  • combat regression pins for jrqn AI-turn race guard + ioe4 P1 movement evaluator
  • Combat AI: ioe4 P3 poison-walk terrain-coverage cost fn for trail-leavers
  • file P3 test-infra findings (ArenaBench terrain no-op, score_move hook); note P3 proven on ioe4
  • Merge nix ioe4-P2: intelligence-tier enum (data-driven ai_tier, gates P3 coverage to self-aware+, facing universal) — ioe4 impl scope complete
  • qf1z FINAL spec — player-facing-only surprise (ignore enemy facing)
  • qf1z spec LOCKED — non-event combat, Elias-facing-only measurement
  • qf1z: engagement surprise double-turn (SPEC LOCKED 2026-09-02)
  • combat WASD-click: fall through to native gui on hit-test miss + dump button rects (diag)
  • combat WASD-click: confirm the focused button (_hovered_idx), drop positional hit-test — WASD has no cursor (owner root-cause)
  • Merge nix speedhook: _testCombatSetSpeed hook + animation_speed snapshot field (harness/test enabler)
  • Combat speed hook tests: cycle+snapshot pin, speed-invariance, T4 speed-up adoption
  • Merge vera-speedtests: speed cycle/snap pins + 1x-vs-4x invariance (byte-identical) + 4x adoption in slow autoplay test
  • QB-103 Counter base mult 0.50->0.75 (Quinn live-test read well), upper tiers shifted accordingly {0.75/1.0/1.25/1.35/1.5}. E1 plays base tier=0.75; live-tunable override still wins.

Docs

  • design skill & effect model DRAFT — Known skills (Action/Reaction/Passive) vs Effects (Passive=permanent/details-panel, Status effect=temporary/head-bubble); terminology locked + migration plan (owner review pending)
  • design skill & effect model APPROVED — owner answers locked (Poison Resistance canonical def, relic/inherent=known, effect source-tracking relic/inherent/class/<equipment-name>)
  • design expertise-tier resolution by source — class-tree=SP-purchase-gated (EP gates buyability), relic=EP-auto; systemic _effective_skill_level rework (QB-103) + Counter ladder/thresholds

Maintenance

  • Anam vignette: capture pre-relic music synchronously, not one frame deferred
  • Merge nix-e1r2: E1 round 2 — ul07 title-music-stop, 4v2d menu-sfx, 6nwi dialogue-opt-sfx, wqv1 store-sfx, pgcu Kein-text, kv3d bed-rest-transition, y8on title-default-continue, rcv8 relic-debounce (jcp7 Laria-BGM still open)
  • WEB_VERSION + beads export (pre-merge)
  • Merge nix-ep1: 9-1 batch — c76x XP/level display (Dal read), b70r poison-trail permanent, uqif save-slot layout+AUTO icon, yprn Known Skills, nk49 post-combat centering (fxtj HP-reset stays open, needs repro)
  • beads pre-merge
  • Merge nix jrqn: guard enemy AI turns against external end-turn races (ChroniclesOfNesis-jrqn)
  • close jrqn (driver-truncation, verified v2546); note ioe4 P1 landed
  • beads pre-merge
  • beads pre-merge
  • reopen ioe4 (P1+P3 done, P2 enum remaining — was closed prematurely)
  • re-scope zkvy to §6.1 game-side continue_confirmed (page-side shipped by App)
  • correct zkvy note — continue_confirmed is a first wire-up, not a proxy swap (per App)
  • beads pre-merge
  • file mobile tap=X-outside-combat scope (suppress positional touch-menu select)
  • link tap=X stopgap sxd7 -> deferred full-touch epic cmhp
  • close 2mjq/91yy (owner-confirmed NPCs respond after relic event)
  • suppress touch-emulated positional mouse presses outside combat (ChroniclesOfNesis-sxd7)
  • Dialogue pen-SFX: re-trigger mid-line so it covers full line length
  • Merge nix sxd7: mobile tap=X outside combat (suppress emulated-touch pointer in menus, device-gated) — combat untouched
  • jcp7->P1 (BGM permanently off); file kill-SFX-still-loud + victory-full-song
  • Bed wake: deterministic facing when scene-entry has no direction mapping
  • qf1z->P1, update requirement — engagement-angle surprise DOUBLE-TURN, re-enable, head-on ambiguity flagged
  • beads pre-merge
  • commit WEB_VERSION 0.8.2549 (deploy bumps were uncommitted since 2544)
  • file parked mobile-resume-snapshot feature (App handoff, non-E1)
  • Merge nix qf1z: engagement surprise double-turn (Elias-facing-only, non-event combat)
  • clear WASD at-rest highlight on mouse takeover (_on_mouse_took_over override) — mouse mode highlights only cursor-hovered
  • Boss engage (SluiceGate cond14): fully event-driven, no scene cinematic code
  • reopen supz needs-verify (boss engage deployed, awaiting owner live confirm)
  • boss engage: hop2 as two moveTos (up to peak over Elias, then to center) — no tween, per owner
  • boss engage: two symmetric moveTo-jumps (speed/apex/land/speed0/SFX/shake each) + 0.5 pause between
  • boss engage: jump-2 apex twice as high (81,-160); 1s pause before jump 2
  • boss engage: stop the impending forever-rumble (shake 0) the instant Mother appears
  • boss engage: jump-2 apex twice as high again (81,-320)
  • Boss engage: flat initiative for unlock-driven event combat (qf1z)
  • commit WEB_VERSION bump (was blocking merge)
  • Merge nix eventflat: unlock-driven event combat = flat initiative (no qf1z surprise)
  • Cure-heal (uhbk) diagnosis — compose->cast->read repro, hypothesis A does not reproduce in ArenaBench
  • Vera Cure diagnosis on uhbk (A not repro'd synthetically; real-path repro pending)
  • Merge vera-curerepro: Tier-3 bench heal-correctness pins (Cure heals visible unit in bench)
  • instance-id logging at 4 combat-unit binding sites (diagnostic-only)
  • Merge nix healdiag: instance-id logging at spawn/HUD-bind/heal-target/resolver-write for Cure diagnosis
  • triage combat-AI stale trio closed (xdog enforced; bne5/jipx superseded by aaw6.1 AP-retirement)
  • file fast-forward (hold F/L2 -> 4x combat) feature
  • revise fast-forward -> R1/F tap-cycle speeds; L1 log already wired
  • Combat fast-forward: F/R1 tap-cycles animation speed via existing speed system
  • Instantiate speed_label so the top-right speed indicator actually renders
  • Merge nix fastforward: R1/F tap-cycle combat speed (1-2-4-8x) + top-right 'Nx ▶▶' speed label
  • combat speed steps -> 1x/1.5x/2x/4x + float-aware label (1.5x no longer truncates)
  • commit WEB_VERSION 0.8.2569 — stop deploy re-bump collisions (dirty World.gd re-bumped from stale 2568 base each deploy)
  • Merge nix r2speed: R2 saved-speed hold (G/gamepad-16, R1-state gated) + ControlsMenu rows (log/speed/saved) + log->action
  • Global speed control: R1/R2 cycle Engine.time_scale outside combat (owner greenlit)
  • commit WEB_VERSION/beads pre-merge
  • Merge nix globalspeed: SpeedControl autoload (Engine.time_scale outside combat) + combat-enter/exit no-doubling guard + shared saved_ff_speed
  • log Mother Slime Split's unlogged +2 self-damage; uhbk: close heal-refresh diagnostic gap
  • beads pre-merge
  • sync 3 cond-14 rumble/splash SFX into WebBootstrap/SFX (two-copy gap)
  • commit WEB_VERSION 0.8.2572 (sync HEAD with deployed build)
  • QB-094: neutralize overworld fast-forward while pause menu is open
  • WEB_VERSION 0.8.2573 (deploy: SFX sync + QB-094 batch)
  • QB-094: re-engage R2 saved-speed hold if still held across menu close
  • ioe4 pin — enemy prefers FLANK over FRONT when REAR unreachable
  • Merge ioe4 flank-over-front pin (sandbox/vera-flankfront 549d4805)
  • WEB_VERSION bump (ControlsMenu fit/relabel deploy)
  • Combat-log transparency: unified choke point + v2 records + stacking poison (ChroniclesOfNesis-89hq)
  • Merge combat-log transparency (sandbox/nix-89hq 262f68f4)
  • WEB_VERSION 0.8.2574 (combat-log deploy) + re-baseline pre-existing bootstrap-pck oversize
  • subtle floppy icon instead of text pill (owner 2026-09-03)
  • WEB_VERSION bump (QB-095 combat-log delta fix + floppy indicator)
  • WEB_VERSION bump (leveling batch deploy)
  • WEB_VERSION bump (combat-log fixes deploy)
  • sync World.gd WEB_VERSION to 0.8.2577 (match served PCK+txt)
  • WEB_VERSION bump (spawn-freeze + debug-hide deploy)
  • WEB_VERSION bump (ledger record-once fix deploy)
  • Combat-log batch: remove qld0 engage-HP mask, scan-gate log hit%, name reaction skills, t0/t1 per-turn numbering
  • Merge combat-log rework (sandbox/nix-qld0hitchance 99b45bdd): remove qld0 engage full-HP restore+log line (drain NOT yet root-caused - trace hook stays), hit%/crit% scan-gated in log, reaction lines name procced skill (underlined), t0/t1 per-turn event numbering, turn-start status icons at L1. Records unchanged structurally (+reaction_skill field). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJrsZCEz2v2eFg4gsXV5p5
  • WEB_VERSION bump (combat-log rework + clear-history hook deploy)
  • WEB_VERSION bump (_testSpendStat + combat-log format corrections deploy)
  • commit 4 same-roll boss-ready saves (A/B × allstr/even JP) — provenance-backed replacements
  • rebuild 4 sluicegate boss-ready saves (Quinn regen) — agi5/6 move4, +Leather Chestpiece+Quick Boots, exact-max full-at-arrival HP 19/18/18/17
  • QB-100: A/STR build guarantees Counter Attack instead of Push (tree swap)
  • QB-100 item 3: on-hit Counterattack reaction (owner GO)
  • QB-102 (P1): gate Counterattack reaction on actually having it
  • QB-103 investigation: STOP-flag purchased-tier signal (no code rework)
  • Cure mp_cost 5->3 (owner: 5 felt too high)
  • Combat-log batch: charge-begin log line, resisted/immune damage annotation, log-open scroll routing
  • QB-105: remove trail-absorb-heal (poison trail cannot give absorb/immune units anything)
  • Per-session isolation for the copilot/tab_observe channel
  • Wire terrain type + tile icon into the hover stat panel (CombatStatBlock)
  • Merge terrain-panel poison readout (sandbox/nix-terrain-panel-poison @1912c27e): wire CombatStatBlock's unwired TerrainIconLabel/TerrainDiamond scaffold to terrain_layer.get_terrain_at(cell) → shows the poison tile (gridPoisonTerrain.png) + 'Poison' label (via get_terrain_short_name) instead of an empty diamond when hovering a poison cell. Generic over terrain type; reuses CombatDetailsPanel's asset map.
  • QB-106: gate Counterattack to genuine melee attacks only (damage_type == "physical")
  • QB-107: combat mouse cursor always the diagonal sword (never feather/nothing)
  • Merge QB-107 combat cursor always-sword (sandbox/nix-qb107-combat-cursor @c4af4f2c): centralized sword-cursor re-assert at top of CombatOverlay._input() on every mouse motion (before the combat-log modal early-return) + in _toggle_combat_log open. Root cause: 5 panels each independently set/null Input.set_custom_mouse_cursor on their mode switches (feather/none leaks); log panel managed no cursor. Now combat always shows the diagonal sword in mouse mode across all sub-states + over the log. Does not touch Input.mouse_mode (VirtualCursor owns it).

v0.8.2538

130 changes

New

  • Skill-System Unification Phase 2: live SKILL add/remove/tune TestBridge hooks
  • Merge Phase-2 core: live skill add/remove/tune hooks + _testRequestCombatSnapshot (combat-scoped, explicit acks)
  • Add per-skill per-unit status-effect override surface (poison_attack first consumer)
  • per-skill status-effect override layer (additive, magic-derived default unchanged; live via tune_skill)
  • Add _testCombatForceAction: force a REAL, visible attack for capture staging
  • combat-capture live turn_order readout + _testCombatSeatOrder queue-seed hook
  • testbridge _testSetUnitCell rejects off-grid cells (owner request via Quinn)

Fixed

  • [deploy-develop] WEB_VERSION bump (clean re-export: young move_range fix + fresh DataStore)
  • get_battler_attacks spelling tolerance — fixes Mother Slime no-poison (empty attack_profile)
  • [deploy-develop] WEB_VERSION bump (Mother poison fix: get_battler_attacks spelling tolerance)
  • Merge Phase-1 Step 4: gate picker+AI skill enumeration off Unit.skills (fixes la7w P0 + tr01 P1)
  • fix fragile direct-child CombatOverlay lookup (group-based)
  • Add skill-system unification regression gate (Phases 0-2)
  • robust CombatOverlay group-lookup (fixes snapshot-null F1 + hooks unit_not_found F2 + marketing stuck-mount)
  • skill-migration regression gate (Tier-3 spine/picker/AI/poison/phase2 pins)
  • Fix WASM test-suite WebGL2 boot: Chromium headless lost SwiftShader GL (ChroniclesOfNesis-w4zn)
  • conftest WebGL2 fix — headless=False + private per-worker Xvfb (Chromium 145 Ozone-headless regression, w4zn)
  • WATCH emitter (allbyte:state postMessage, debug-gated, read-only) — dev-session bridge Phase 1
  • shader compile bug + chest interactable + close retracted confirm
  • P0 fix: ChurchSquare<->MainSquare infinite scene-transition flip-flop
  • Merge P0: church<->mainsquare flip-flop fix — 15px containment margin in SceneTemplate._point_in_collision_shape (proactive spawn-latch no longer misses doors by 1-2px)
  • Fix Hurt.gdshader compile failure: MODULATE -> COLOR (G4 canvas_item)
  • combat-camera run HUD-clearing autoframe at turn start, not just post-resolve (ChroniclesOfNesis-ebws)
  • force-attack seed synchronous pending ack so _lastCombatForceActionAck never reads null mid-flight
  • Add regression tests: ChurchSquare<->MainSquare arrival-suppression P0 + combat shader-compile coverage gap
  • regression pins — scene-transition arrival-suppression (P0 flip-flop) + Hurt.gdshader compile guard (Vera, 4 tests, all pass 2x)
  • _testCombatSeatOrder order_after excludes the active unit (predicted()[0])
  • P0 fix: scene-transition walk-back broken by spawn-occupied over-latch (owner-reported)
  • treasure grow interaction Area2D to cover yOffset-lifted sprite
  • interaction box/ray facing model — face the interactable's bounds, not its center
  • spawn-audit scale-aware footprint validator + audit/fix all authored spawn coords (P0)
  • spawn-coordinate zone audit — SpawnZoneValidator + 12 spawn-in-zone fixes (owner-requested)
  • TreasureTestRoom yOffset interaction test (Vera) — 8 tests incl. from-below regression pin
  • Revert "fix(interaction): box/ray facing model — face the interactable's bounds, not its center"
  • treasure register proximity from player BODY (on-top fallback) + diag
  • treasure forgiving distance-based proximity (fixes 'right on top can't interact')
  • waterway proportional spawn-clearance epsilon, fixes waterway1<->waterway2 flip-flop (P0)
  • treasure proximity measures to BASE (min base/lifted), not lifted center
  • interact on-top ui_accept resolves via scale-correct click resolver (P0, Quinn live-repro)
  • on-top interact fix — ui_accept falls back to scale-invariant _find_interactable_at; revert failed Treasure.gd attempts (P0)
  • interact on-top ui_accept fallback must match in CANVAS space, not world (Quinn re-repro on 2528)
  • hook _testSetPlayerPosition was nested inside if click_world block — dedent to top level so it fires standalone (Vera caught)
  • interact bump on-top canvas radius 50->60 (chest was 53.5px, just outside); add _testCombatCastSkill verb
  • scaled-scene on-top interact regression test + _testSetPlayerScale hook + TreasureChest proximity guard (Vera)
  • combat guard _end_active_turn() against stale end-turn requests hijacking the next unit's fresh turn (ChroniclesOfNesis-6lc4)
  • poison-tick-race fix — _end_active_turn no-ops player-turn end unless combat_input_armed (P1)
  • testbridge unit-scope _testCombatEndTurn so a stale request can't hijack the next unit's already-armed turn (ChroniclesOfNesis-z65v)
  • _testCombatEndTurn accepts scoped unit-name — no-op on active_unit_mismatch (fixes driver ending wrong unit's turn) (Nix z65v)
  • ChroniclesOfNesis-1kax enforce dungeon-key gate on waterway basement doors
  • ChroniclesOfNesis-2uds move Waterway1 EnemyTrigger2 clear of Waterway2-entry spawn point
  • ChroniclesOfNesis-ocmr General Store re-asks Yes/No every visit; drop stray @shop ambient variants
  • pan camera to targeted cell + fix turn-start autoframe no-op (ChroniclesOfNesis-dqwp)
  • sync session issue exports (bug-list + epics + E1 blockers)
  • Merge nix-e1batch: E1 event/dialogue fixes — 1kax basement-door key gate, 2uds Waterway1 spawn-trigger clearance, ocmr General Store dialogue (2mjq/91yy remain open)
  • Merge nix-65629: E1 combat/UI fixes — xe2d screen-click, 2oct end-combat camera, dqwp camera-pan, mwfu victory-anim-once, naiy young-slime shader restore, yexy skills->relic-slot

Tested

  • Pin TEST_BENCH_INVENTORY.md — canonical bench status + real-scene-for-combat-verification policy (owner 2026-08-28)
  • force-attack hook (_testCombatForceAction + real _execute_enemy_attack path)
  • treasure pin yOffset interaction-Area2D regression (ChroniclesOfNesis-treasureyoff)
  • hook _testSetPlayerPosition — deterministic teleport for proximity/interaction regression tests
  • treasure on-top ui_accept regression — pins scale-invariant fallback
  • on-top treasure interact red->green test (Vera) — pins fallback-no-op; scaled-scene coverage flagged as follow-up
  • hook wire _testCombatCastSkill JS poll hook + _run_combat_cast_skill async wrapper (ack _lastCombatCastSkillAck)
  • treasure pin scaled-scene on-top-interact fix (canvas vs world fallback)
  • _testSetUnitCell rejects placing a unit onto an occupied cell (QB-089 hardening)

Docs

  • correct combat-mount recipe in TEST_BENCH_INVENTORY (Vera) — combat mounts on real contact, not _testEncounter=2

Maintenance

  • TIER15 fidelity: sync stale enemy-stat + max_ap pins to current intended data (unblock prod gate)
  • combat overlays: render above terrain art (z=5, below units)
  • status application never renders in damage queue (remove "Immune -0" indicator)
  • poison-boss batch — VSlime trail, Mother poison-shift, range-2 young, QB-082 stat->profile, score_move free-move AI
  • sync issue export (72q5 close, s3nh + xq9w create)
  • Merge sandbox/nix-poisonboss into develop
  • combat data: young slimes attack_range 1 + move_range 2; Mother physical 7->4
  • combat balance: Mother Slime poison_damage_mod 0.65->1.0 (poison-primary, owner pick (a))
  • Combat invariant: begin_charge forfeits remaining move this turn (ChroniclesOfNesis-o2so)
  • sync export (o2so close)
  • Merge sandbox/nix-chargemove into develop (charge forfeits movement)
  • [deploy-develop] Mother poison_damage_mod 1.0->0.5 (standard, not amplified) + WEB_VERSION 0.8.2505
  • poison on-hit burst is MAGIC-based, not physical (owner canon) + Mother coeff 0.4
  • [deploy-develop] WEB_VERSION 0.8.2506 (magic-basis poison burst)
  • boss-split-spawned young slimes move_range 3->2 (hardcoded override missed the data change)
  • Combat damage log: console diagnostics + damage_components schema (eo4l)
  • sync (eo4l close + log beads)
  • Skill-System Unification Phase 0: CombatSkill spine + details-panel-lists-all (non-breaking)
  • Merge sandbox/nix-combatlog: verbose [CombatDamage] console logging + damage_components schema
  • sync (fight-id + user-log + console-tool beads)
  • Merge sandbox/nix-skillspine: Skill-System Phase 0 — CombatSkill spine + details-panel-lists-all (non-breaking)
  • Skill-System Unification Phase 1 Step 1: re-plumb poison-TRAIL onto CombatSkill spine
  • combat snapshot: expose resolved Unit.skills[] (name/source/category) per unit
  • Merge Phase-1 Step 1: poison-trail unit_type string-match retired onto Unit.skills spine (sandbox/nix-0cece1c8)
  • Skill-System Unification Phase 1 Step 2: executor reads unit spine, not _REGISTRY
  • sync issues.jsonl export (skill-migration + gamebridge P2 beads)
  • Merge Phase-1 Step 2: executor reads skill data off Unit.skills spine (resolver as fallback)
  • Phase-1 Step 3: poison-on-hit coefficient sourced from spine poison_attack CombatSkill
  • Phase-1 Step 4: gate skill enumeration off Unit.skills spine (picker + AI)
  • sync export
  • sync export
  • sync export
  • sync export
  • sync export
  • sync export
  • sync export
  • route remaining fragile CombatOverlay lookups through _find_combat_overlay()
  • close qu6g (comprehensive overlay-lookup sweep)
  • comprehensive _find_combat_overlay() sweep — all ~19 combat hooks depth-independent (unblocks set-cell + apply-status on deep mounts)
  • Dev-session bridge WATCH phase: emit allbyte:state to parent (Phase 1)
  • WATCH emitter + reach-mirror: robust combat-overlay lookup (group combat_arena, not direct-child) — combat payload survives deep mounts
  • force-attack hook + combat-AI free-attack-skip
  • shape#3 attack stall + apply-status no-visual
  • S3 bucket versioning follow-up
  • combat camera doesn't clear HUD at turn start (owner)
  • Hurt.gdshader MODULATE->COLOR (G4 canvas_item built-in; hit-flash compiles + renders)
  • beads sync
  • combat turn-start autoframe — HUD-clear correction runs on turn 1 (not deferred to post-resolve)
  • close n9j8 (shader), file 0ryp (autoframe-establishing polish)
  • waterway spawn flip-flop — scale-proportional push epsilon (not flat 1px) (P0)
  • treasure unconditional DIAG print (d/base/lifted/player/scales/getIx) — chase coord-space mismatch
  • on-top interact canvas-space correction — resolve in canvas space (not world), scale-invariant (P0 v2)
  • interact strip temp on-top DIAG; guard executeEvent on conditionalEventId>=0
  • TreasureChest.gd dual-copy (propagate is_player_pc_scene_interaction guard to Laria+Overworld copies)
  • beads sync
  • beads sync
  • combat snapshot: expose action_menu/skills_picker MenuBase input-mode (MOUSE/WASD)
  • combat sfx: kill SFX -40% volume (15 -> 10.6 dB) per owner
  • require click-on-button for WASD-mode confirm (ChroniclesOfNesis-xe2d)
  • ease camera position at combat end instead of snapping (ChroniclesOfNesis-2oct)
  • de-dupe victory/level-up pose animation replay (ChroniclesOfNesis-mwfu)
  • restore young-unit pale shader after hurt-flash (ChroniclesOfNesis-naiy)
  • mark ui_accept handled in SkillsMenu to stop stale-focus replay (ChroniclesOfNesis-yexy)
  • sync exports pre-merge
  • commit WEB_VERSION 2538 bump + beads export (pre-merge)

v0.8.2503

80 changes

New

  • Additive accumulator stat model + tanh HP/MP cap + L99 cap (from Nix sandbox/nix-39hk @901f0010)
  • Boss-balance combat pass: push build + young-add move-2 + skill MP costs + forced-movement rules (from Nix sandbox/nix-boss1 @a005255b)
  • difficulty-down (post-chase): throttle boss adds + trim deep-waterway counts (Quinn spec)

Fixed

  • tier15 regression: additive accumulator model — feed/delta/tanh-9999/L99, 49/49 pass
  • Boss-balance follow-up: §2d cloud-heal routing + push 2x2 self-block fix (from Nix sandbox/nix-a736da75 @17311cb3)
  • tier15 regression: boss-balance combat pass + 2x2 push fix (58/58, from Vera sandbox/vera-266x @1ab80dfe)
  • Engine legality fix: decide() enumerates learned-skills-only (deny-by-default) + margin=0.0 root-caused (from Nix sandbox/nix-31544 @2909a3a3)
  • Engine over-filter fix: learned skills sourced from both treeSkills+skills dicts + id fallback (from Nix sandbox/nix-31544 @98a43272)
  • UI batch: suppress feather cursor in combat, sword cursor on action-button hover, fix bed sleep-fade ordering
  • Promote save fixture: cond_11_waterway1_entry_EQUIPPED (Quinn, vouched)
  • Skill tree: fix node border crop — stretch_mode COVERED->CENTERED
  • P1 scene: per-door spawn-grace fixes waterway up-then-down (alir) + harden post-event flag clear (ited)
  • P1 menu: fix Item-click race — _shown gated on actual visibility (0qe3)
  • Luck curve reshape (convex, delay early impact) + connector-gap fix
  • Crit curve: LOG span 0->99 (fix REF=17 plateau) — noticeable in demo, maxed at 99
  • Fix scene-transition regression: spawn-grace now blankets frame 0 (waterway2 immediate-transition)
  • Robust spawn-door fix: geometry-based occupied-latch (waterway2 immediate-transition)
  • Revert Move-relic placement 'fix' — it's an UNDERWATER relic, correct at (-327,-300)
  • Waterway Move relic: render UNDER water + BEHIND Elias (z-index) — the real underwater-relic bug
  • waterway spawns: vary the jumper (adult ambushers escalate with depth) + fix WW2 zero-jump
  • fix low-water duplicate wall band + drop dead DialogueTrigger ref
  • DebugMenu Items-by-ID: collapsible + alphabetized inventory readout
  • show CanalBed at low water again with owner's fixed art
  • sync SceneTemplate.gd pack copies (Laria/Overworld) with the contact-combat spawn fix
  • combat AI: enemies path toward target by obstacle-aware BFS distance (fix multi-turn stall)

Improved

  • P1 keystone: pure CombatOutcome.gd extraction — single-source combat outcome model (from Nix sandbox/nix-df82a1 @563e1809)

Tested

  • v2456 accumulator-band boss-test saves (from Quinn, level-through)
  • QA hooks: _testGetCritProb + physical_crit_prob in combatEnemies + adult-VSlime bench spawn

Maintenance

  • Center-arena boss engage + combat arm-wedge recovery (from Nix sandbox/nix-f944 @c5a2b4d1)
  • Combat engine configs (from Quinn): mother_slime enemy (res://) + qa_player.optimal (QA override)
  • P1 engine-core: CombatDecisionEngine.decide + res:// loader + read-only QA oracle hook (from Nix sandbox/nix-27996 @5ed6e054)
  • Ep1 credits: fire allbyte_ep1_credits_complete postMessage for App's Ep2 subscribe form
  • allies default to full castable set (no learned-gate exists in live combat)
  • STOPGAP deny-list charge_attack from ally oracle set
  • Organize GUI/Assets: damage-type icons -> damageIcons/ subfolder, camelCase
  • Consolidate all damage + status icons into GUI/Assets/damageStatusIcons/, camelCase
  • enumerate usable consumables as heal plans (item enumeration)
  • Combat movement: classic-FFT act-then-move (symmetric player+enemy)
  • Skill tree readability: behind-node glow, hide fog pipes, L2 visible+locked, purchased-pipe shader
  • Sync Overworld pack Skill.gd with bootstrap (ep_locked_visible field)
  • Overworld enemy vision: range 250->200 + chase-persistence grace
  • multi-hop act->move, entry-jump occupancy, always-sword cursor, poison-absorb floater, 0.5s camera ease
  • Balance (Quinn sim, owner-approved): VSlime physical parity, young XP up, front-load L1->L2
  • Skill tree refinement v2: hover-scale-only, subtle pipe, connector both-learned gate, calm glow, fog=1-past, smooth wheel
  • Facing-based crit: x1.5 flank / x2.0 rear on top of 30% base cap; faceless slimes exempt
  • Luck-bias roll model: luck biases every roll's distribution favorable (Kumaraswamy, per-family peaks)
  • P1 combat: play death animation on poison-tick killing blow (7xx6) + relic drop fires relic event (eytq)
  • Skill tree v3: connector-lit-from-source revert, remove gold border, bigger rotating glow, WASD all-visible nav
  • 5% base-crit floor (owner) — reshape no longer nerfs baseline player
  • expose partyProgress (level/exp/JP/SP) + combatEnemies (attack/hit/def/hp/luck) in gameState
  • Crit recomposition: DEX+LUCK co-primary + WIS tertiary, convex per-stat (owner+Quinn)
  • Skill tree v4: locked-node readable description + LOCKED indicator, expertise upgrade text
  • waterway Move-relic y-sort offset + Title water shader material
  • Move relic (Waterway1): reposition onto walkable floor -327,-300 -> -307,-240 (njo3)
  • P3 batch: scaled young-slime collision (837b), top-of-grid floater clamp (49m1), camera-pan bench (8u0n)
  • combat crit: log-A 12->5 so luck+dex investment reads noticeably (owner-approved A=5)
  • exclude .wt/ agent worktrees (prevent accidental embedded-repo commits)
  • waterwayChannel RelicHint: align trigger to sibling water-channel hints (fire on walk-up)
  • co-pilot relay v1: ?copilot=1 opt-in + console drain + clear-items + cmd-queue endpoints
  • RelicHint at (-417,135) matching sibling hints + editor re-serialize
  • hide + disable the Move Relic once the player owns it
  • co-pilot READ: fold copilotState (inventory/equip/relics/skills/raws/save#) into tab_observe mirror
  • Items-by-ID section (give/set-qty/delete-all) + move Quick Setup to bottom
  • interaction facing: target the sprite's yOffset-shifted visual, not the Area2D origin
  • CanalBed art reposition/rescale (owner) for low-water drained look
  • waterway spawns: depth->enemy-count RAMP (deeper = harder, WW12 peak) per owner directive
  • keep CanalBed hidden in all cases (owner — art WIP)
  • dungeon spawn: contact-combat pulls FULL hidden-jumper roster; triggers reveal jumpers as roamers (owner Model B)
  • jump spawn: gen_random_pos order-independent so flipped/negative-scale boxes still spread
  • facing-based DODGE (front dodge x2.0 / flank x1.0 / rear x0.5), mirror of facing-crit
  • combat Hurt shader: multiply by MODULATE so hurt flash keeps the sprite's tint
  • waterway12: owner box/scene edit (jump source/dest spread tuning)
  • combat feedback: clamped absorb-heal floater tell + self-turn poison-death dead-state hold
  • Slime Split reactive ability (Mother Slime) + QB-081 split-spawn sizing
  • combat targeting: grey a multi-cell target's other footprint cells (whole unit lights up)
  • Mother Slime reach 1 -> 2 (attackRange + attack_range) per owner
  • split-spawned units start their idle animation on spawn
  • young slimes: uniform move_range 3 (dungeon-placed AND boss-split-spawned) for consistency
  • Slime Split always spawns + mid-combat units get normal turn order + Mother HP 70
  • [deploy-develop] commit WEB_VERSION 0.8.2503 (was uncommitted local-redeploy bump; origin was 2463)

v0.8.2455

31 changes

New

  • add gated _testRequestAutoSave hook
  • Readiness barrier: gate on FULL combat pre-warm, not just the instance (new-game engage delay)

Fixed

  • Poison turn-beats: fix physical floater anchor (head, not above bubble); status-apply bubble gets its own ~0.5s beat on attacker turn (relay min_dwell); victim-turn tick is a gated sequence (silence -> decrement+damage together -> dwell) that holds input until shown
  • Add cold-boot combat-engagement regression test (ChroniclesOfNesis-okt8 recurrence)
  • Fix cold-boot combat test: correct Waterway1 scene path + real EnemyTrigger contact
  • Merge cold-boot combat-engagement regression guard (okt8 recurrence)
  • Readiness barrier: gate player-unlock on combat-system-ready (game-start race fix)
  • Readiness barrier: gate on the pre-mounted CombatOverlay INSTANCE, not just the pack (row-3 fix)
  • OA reuses normal-attack resolution via shared _present_attack_result (beat order fix)
  • Readiness barrier: gate on combat pre-warm (v2, poll-loop) — re-land after regression fix

Docs

  • combat-ready-at-game-start audit + enforced Scene/Game-Ready readiness contract
  • ASSET_WARMING_CONTRACT — canonical warming technique + tracked registry

Maintenance

  • Reaction badge: ModernGoth number at damage-queue size (was pixelated fallback) + crisp icon (svg/scale 1.0->4.0 on ability/affinity/key SVGs, matching stat icons)
  • Poison floater anchor: sit above the status bubble when it's RENDERED, else at head
  • Combat engagement: defer (not drop) a contact that lands during an in-flight scene transition
  • Stagger bar: pin inside caster's diamond (center) above all units; clear charge-viz on ANY death
  • Game-start combat race: retry CombatOverlay pre-mount when the Combat pack mounts
  • VSlime poison cloud/absorb: absorb implies poison-condition immunity
  • Poison cloud: show the damage/heal floater (was applied to HP invisibly)
  • Poison cloud: dedicated ~3 base (floored) + visible resistance, decoupled from the tick
  • WEB_VERSION bump (redeploy) + bead 8lwy
  • Unify Status-page + combat battle-stat derivation onto the combat model
  • Combat walk-in: fire immediately on a deliberate approach, not the 90-frame grace
  • show targeted stat block on non-unit cells (empty block + Chest on drop cells)
  • Combat ATTACK mode: grey-cell highlight under sword for invalid targets
  • Combat UI tweaks (owner): empty block = bg panel only; grey 2x transparent; white whiter
  • Item buttons: scale key icons ~25% down to match other item glyphs
  • Revert pre-warm barrier gate (67e31740) — leaves phantom in-event state on scene load
  • Revert pre-warm barrier gate v2 (ce616d08) — relocates delay to scene-load unlock
  • Combat sprite boot-warm: CombatWarmer autoload + warming-contract registry
  • WEB_VERSION 0.8.2455 — Quinn-validated prod-promote candidate

v0.8.2442

361 changes

New

  • Boss add tuning follow-up (owner via Quinn): Young-variant split-spawn
  • Add QB-068 fast-track test save: boss_defeated_at_mayor (cond 13 @ MayorsHouse, pre-Event-15)
  • combat Mother Slime leaves a 2-wide poison trail (2x2 footprint)
  • per-variant ability assignment — adults (Slime=OA, VSlime=cloud) teach; Young variants stay vanilla (boss adds are ability-less)
  • reaction pipeline adds self-reactions (mover, e.g. heal-on-walk) + performance req (precompute threat index, O(1) per step, no scans)
  • combat turn-queue: smooth slide — hide new stack, translate opaque ghost to new positions, swap (aaw6.24)
  • Add data-only turn-queue-placement pin + isolated CombatTurnQueue sim hooks
  • Merge sandbox/nix-ww1-spawn: WW1 empty — add missing EnemyPrespawn node to waterway1.tscn (prespawn was silently skipped; WW2 had it)
  • Add CombatSandbox dev bench: arbitrary-roster in-combat testing
  • Young VSlime: add physical_resist 0.5 + poison_absorb (match adult VSlime) — owner: young vslime = VSlime minus poison-cloud, weaker stats
  • Re-arch Combat Sandbox: spawn-in-wander-zone -> real Enemy Hitbox engage; add movement-bench Vision Range slider
  • Mother Slime bite = physical + poison (owner) — add attack entry with poison_damage_mod 0.5 (was physical-only, no entry)
  • Add Interrupted-status swirl icon (owner-requested spiral) at GUI/Assets/InterruptedStatusEffect.png
  • Add ability-category icons (owner 2026-08-19): Action=sparkle, Reaction=counter-arrow, Passive=infinity — GUI/Assets/*AbilityIcon.png, for menus to show symbol instead of category text
  • Merge sandbox/nix-spawnb2f1: roll in Quinn's per-tier jump/spawn table (young-only jump-in, adults roam; WW1-2 gentle, first adult WW3, WW4-9 anchor+young, WW10-12 poison crescendo; WW6/WW8 added; 0 adult-on-jump)
  • Add backwards-K key icon (owner 2026-08-20) for Key to Larian Waterways — replaces the missing-texture red-x. GUI/Assets/KeyToLarianWaterways.svg (gold backwards K); wiring + item-icon-fallback audit follows.
  • Add Key TYPE badge (owner via App 2026-08-20): GUI/Assets/Key_Icon.svg (backwards-K); ItemButton isKey now shows it for ALL keys (was neutral placeholder). Gives App the type-table asset + makes Key a real type badge like Consumable/Equipable.

Fixed

  • [deploy-develop] StatusMenu cancel fully reverts like Clear (spent-JP-on-stat fix) — 0.8.2356
  • Add combat-engagement regression suite (ChroniclesOfNesis-okt8)
  • Merge sandbox/nix-okt8: fix combat engagement — hoist deferred-contact resolver above _physics_process early-returns (okt8)
  • Merge sandbox/vera-okt8: combat-engagement regression suite (okt8)
  • capture Move-Relic water-channel bug te5a (defer)
  • te5a move-relic detail (ysort+water-gate) + file global relic-flash cadence bug
  • correct aglq premise (max_ap already speed-based; real fix was moveRange)
  • _hide_all() now hides ALL pause submenus (fix iy3s status-menu input leak)
  • sync Combat-pack MenuOverlay._hide_all with the iy3s submenu-hide fix + iy3s needs-verify
  • Merge sandbox/vera-iy3s: status-menu input-leak regression test (iy3s)
  • iy3s partial fix deployed (trigger closed), mechanism hardening remains
  • fix stale poison_resistant declaration comment (bool/permanent, not 3-turn int)
  • resize interaction box to match bed asset footprint (extents 213x269 @ -40,-12) — fixes 'not interactive across entire left edge' (fk4a)
  • Merge sandbox/nix-menu (e9aaa4a0): t84s filter-lifecycle fix — enforce MOUSE_FILTER_IGNORE on every WASD assertion + node_added watcher (osf0)
  • pre-apfix-merge sync
  • Merge sandbox/nix-apfix (b4828ce2): max_ap from raw_speed dial not derived spd — Slime/VSlime 1 AP, MS/Elias 2 AP + Tier-2 pin test (saco)
  • version 0.8.2362: t84s click-retarget fix + bed box clean rebuild
  • reopen t84s (follow-up fix pending — click must still fire WASD button)
  • close t84s — OWNER VERIFIED fixed on 0.8.2362
  • okt8 delay-fix: arm Mother Slime combat-init before walkToward (SluiceGate boss)
  • okt8 dead-pause fix merged
  • fk4a fix real root cause — facing gate, not box size
  • Mother Slime boss tuning (owner via Quinn, QA_CLAUDE_BOSS_TUNING.md 5 knobs) + promote Smite fixture
  • Close save-tree back half: cond-13 (boss-defeated) + cond-14 (end-Ep1) fixtures + 4 boss save-tree nodes
  • Fix QB-068: Episode-1 end Event 15 unreachable in natural play (Mayor cond-13 stale ambient)
  • ChroniclesOfNesis-wau9: fix Mother Slime engage cinematic (sword-draw x2, drop-from-ceiling)
  • WEB_VERSION 2373: wau9 Mother Slime engage cinematic fixes
  • Fix ChroniclesOfNesis-98hc/QB-070: Ep1 credits ending unreachable in natural play
  • player party takes the opening turn (aaw6.1 regression fix)
  • Merge sandbox/nix-charge-fix-834dce into develop
  • Revert "Combat: player party takes the opening turn (aaw6.1 regression fix)"
  • combat FIX: remove duplicate move_range dict key in snapshot (parse error broke combat post-aaw6.16)
  • combat HUD (aaw6.23) pt1: cell-coord x:y debug readout, empty terrain panel (drop stray diamond glyph), color inversion (dark bg/border + light subpanels)
  • Revert "combat HUD (aaw6.23) pt1: cell-coord x:y debug readout, empty terrain panel (drop stray diamond glyph), color inversion (dark bg/border + light subpanels)"
  • combat HUD (aaw6.23) iteration: split-line HP/MP, horizontal HP/MP gradients, turn-queue HP bars, terrain diamond+(x,y) coord, face-arrow height, turn-queue flash fix
  • combat HUD (aaw6.23) iter 4: glassy panels, faction-tinted stat blocks, dark HP track, turn-queue redesign (neutral tiles + FFT yellow highlight), terrain always-visible, move-after-attack fix, hide mode-debug label
  • combat HUD/flow (aaw6.23) iter 6: icon size fix + auto-face-on-end + VIEW targets any unit + SELECTED clears target
  • no default target at mount — targeted panel empty in SELECTED (root fix)
  • combat HUD: fix HP/MP/stat font sizing — bold text needs bold_font_size (normal_font_size was a no-op); +20% + terrain->stat width, dark XP, portrait slight tint, gold turn badge
  • live-loop fix: _resolve_node unique-suffix match so live_mutate targets deep nodes under CanvasLayers; + font baseline val22/key18/num22 + MP jungle-green
  • targeted stat block + turn-queue highlight only in inspect/target modes (fix lingering target in SELECTED)
  • slime taxonomy (data, landable subset): Slime attackRange 1->2, VSlime +OA, VSlime off poison trail; + QB-071 doc fix
  • Merge sandbox/vera-07167: QB-071/QB-072 regression tests (Chebyshev range + OA crossing pins)
  • PackLoader strip query/hash from base URL — any query string was breaking zone-pack loading
  • Merge sandbox/vera-flar2: danger-viz acceptance pins (Tier2 astar + Tier3 viz) + TestBridge danger/cursor enablers + ArenaBench composition fix
  • sync Laria copy with canonical (Vera composition fix — player_reactions override + unit_type player-body match)
  • fix turn-queue advance blink + selected-mode targeting leak (aaw6.24)
  • combat turn-queue: fix end-turn flicker + clearer 2->1 exit (aaw6.24)
  • Merge sandbox/nix-slimetax: structural young-slime rows (first-class Young Slime/VSlime + attacks/sprites/½-scale tint/XP + church intro fix)
  • QB-075 fix: Young Slime/Young VSlime combat sprite invisible
  • Merge sandbox/nix-0jp3: turn-queue deterministic stable order — _seq enqueue-key tiebreak (fixes reshuffle; non-acting units decrement 1/turn per owner CTB model)
  • Task B: danger-cell shaders replace debug hatch/glow (owner-approved preview)
  • Fix Waterway1 zero-spawn: add missing EnemyPrespawn node
  • sync Overworld dual-copies (SceneTemplate FRICTION + GameOver debug-return) to bootstrap
  • Fix CombatSandbox empty-screen bug + wire test benches into DebugMenu
  • Merge sandbox/nix-sandboxfix: Combat Sandbox renders (backdrop Background node + grid-local body coords; camera-ownership fix) + debug-menu rows (CombatSandbox, NavObstacleArena, NavTestArena)
  • combat QB-076 roaming-enemy interception — Hitbox mask + chase-speed/vision tune
  • Fix combat auto-firing on scene entry (P1 regression from QB-076)
  • Merge sandbox/nix-combat-grace: fix combat firing on scene-entry — load-time spawn overlap no longer auto-triggers (grace: needs separation+re-contact or player displacement); QB-041 guards intact
  • Add _testSpawnEnemyAt hook + T4 repro test for combat-on-scene-load bug
  • Merge sandbox/vera-qb080: _testSpawnEnemyAt hook + T4 repro test for combat-on-scene-load bug
  • Unified debug bench framework: generic controller for combat/movement sandboxes
  • Merge sandbox/nix-bench: unified debug bench framework (DebugBench controller + _add_bench_row scene+flags API) + combat/movement configs on real Waterway scenes; debug-gated, release-stripped
  • Refine QB-080 repro test after live investigation: pin the ACTUAL bug
  • QB-080 v2: fix instant combat on scene entry — grace never fires on player movement while overlapping
  • Fix WW1 prespawn placement + young-unit DamageQueue shrink
  • Merge sandbox/nix-wwbugs: WW1 EnemyPrespawn repositioned onto walkable corridor (enemies were spawning off-path) + young DamageQueue counter-scaled (floaters full-size regardless of ½ sprite)
  • Movement bench: fix reset-loop root cause + freeze/GO state machine + count-control viewport clamp
  • Merge sandbox/nix-movebench2: movement arena — PCHurtbox-gate the reset intercept (kills reset-loop), sync wanderType→state on GO/reset (fixes stuck-freeze), teleport-apart reset FSM, viewport-clamp count controls
  • Jump mechanic v3: spawn-on-trigger jumpers, distance-gated post-land chase, visible parabolic arc, roamer-at-scene-start, sandbox parity (owner fixes 2026-08-19)
  • Fix JumpTrigger accidental cascade-fire (isActive->armed) + diagnostics — found via walk-verify
  • Merge sandbox/nix-jumparc: jump = visible parabolic arc to destination-then-chase (jump-locked detection guard), spawn-on-trigger (jumpers absent until trigger; roamer at new RoamSpawn on entry), sandbox parity + 100000 slider ceilings; fixed JumpTrigger cascade-fire bug
  • Fix bench roamer spawning near player + reposition WW1 RoamSpawn to top roaming area
  • Merge sandbox/nix-2hbu: fix bench roamer spawning near player + reposition WW1 RoamSpawn to top roaming area
  • Movement bench: add Acceleration slider + fix jumper-trigger no-op
  • Merge sandbox/nix-accel51538: movement bench acceleration slider (exp, interception knob) + jumper-trigger fix (listener was inside early-return; + overlap poll for already-on-trigger-at-GO)
  • Danger-viz revision (ChroniclesOfNesis-2652): cut ambient hatch, walk-path-only glow, dramatic pulse, unlimited reactions, fix 2x2 attack-white inversion
  • Poison-trail source hygiene: rename _VSLIME_POISON_DURATION -> _POISON_TRAIL_DURATION + fix stale comments (trail is Mother-only; VSlime lays no trail)
  • Danger-viz state->art fix (owner 2026-08-19): potential=pulsing amber outline, impending=ring aura circling out; draw both in base BLEND_MIX layer (additive _glow_layer rendered nothing)
  • Merge sandbox/port-vfxfix-b7e2: consolidate charging/shader/stagger tuning into CombatVFXBench (VSlime + Young VSlime added, charging shader controls + stagger-bar preview); revert ArenaBench charging duplicate
  • Fix Charging shader "no visible effect" bug (CombatVFXBench cold-nav compile break + hframes edge-detection)
  • Merge sandbox/port-chg-9f21: fix charging shader invisible — CombatVFXBench bare CombatVFXConfig identifier (cold-session compile fail) via runtime load(); shader edge-detection per-frame (frame_count uniform) so glow reaches real silhouette; seed shader defaults
  • Combat-visual batch (owner 2026-08-19): unify charged-cloud impending with OA ring aura, fix VSlime fog sizing, redesign charging turn-queue highlight
  • gate CombatVFXConfig seed on pack-ready (fix charging panel never appearing)
  • Merge sandbox/port-vfxpack-a1c3: fix charging bench never appearing — _ready() called _vfx_cfg() unconditionally before pack mount, null-crashing _ready and skipping the pack_loaded rebuild wiring. Gate + ResourceLoader.exists guard + rebuild on pack-ready. Live-verified both cold-open paths.
  • WEB_VERSION -> 0.8.2420 (deploy: charging-bench pack-timing fix + concurrent jump + combat-ready-on-contact gate + reaction badge 2x)
  • Fix Charging VFX bench: sheet-UV radial + loop-timer override (v2422 follow-up)
  • Fix charging_pulse.gdshader: illegal 'return' broke shader compile entirely
  • Merge sandbox/port-chgsheet-a1: fix charging shader never rendering — (C) bare return in fragment() = WebGL2 compile error (material never compiled); (A) sheet-UV remap (frame_uv_offset/scale) so radial/sweep use the displayed frame; (B) ChargingVFX.reassert() so loop-timer/ability replays don't clobber charging. Live-verified via screenshot.
  • Restyle combat stagger bar to FFT rhombus (HP/MP match) + fix death-charge leak
  • Merge sandbox/nix-stagbar-a1: stagger bar restyled to CombatRhombusBar (HP/MP slanted+outline, forward-fill, ModernGoth 14pt label) + bench preview matched; charge visuals cleared on caster death (all 4 mark_unit_dead sites — fixes lingering danger cells/stagger bar when a charging VSlime is killed)
  • Deploy v0.8.2425 (charge/stagger batch: locked shader values + rhombus stagger bar + death-cleanup) + harden redeploy version parse (strip -bNNN build suffix so $((PATCH+1)) never hits an unbound var; reconcile World.gd 2422-b237 -> clean 2424)
  • Single-build debug gate: TestBridgeDev/DebugMenu/DebugBench ship in every build, dormant unless authorized
  • Merge sandbox/port-dbg-a1: single-build debug gate — TestBridgeDev compiled into all builds, call-time-gated on GlobalWorld._debug_authorized (non-public auto-authorize; true prod requires ?debug=<token>); boot-log scrub; + _testHoldDirection sustained-hold mode. Live-verified on encrypted public preset.
  • WEB_VERSION -> 0.8.2426 (deploy: single-build debug gate + _testHoldDirection sustained-hold)
  • Fix combat-log double-map (owner 2026-08-20): triangle (JOY_BUTTON_Y) opened BOTH log + details (details is on ui_secondary=triangle). Log now on L1 (JOY_BUTTON_LEFT_SHOULDER) / R key; triangle stays details-only. Dropped dead _COMBAT_LOG_TRIANGLE_ICON const.
  • Fix item-icon red-X: wire Key to Larian Waterways icon + fallback audit (owner 2026-08-20)
  • Merge sandbox/nix-keyicon-b824ea45: fix item red-X — itemIconPlaceholder.png WAS a red-X graphic (repainted to neutral badge, kills it everywhere as fallback); Key to Larian Waterways (id 10) -> backwards-K KeyToLarianWaterways.svg; guarded item/equipment icon loads
  • WEB_VERSION -> 0.8.2428 (deploy: item red-X fix + backwards-K key)

Improved

  • owner resolutions — keep both relics (rename MoveAnytime->AttackMove), lean demo variety, confirm poison swap (VSlime trail->cloud; teaches absorb/status + group danger)

Tested

  • status-menu pin ChroniclesOfNesis-iy3s — "+" click leaks to ConsumeItemMenu
  • 3-batch deploy — iy3s test green, t84s/bne5/p586 needs-verify
  • t84s WASD-hover-wins regression suite (parked mouse + accept-fires-focused, MainMenu+OptionsMenu) — 3 tests green on 0.8.2360
  • t84s tests green on 2360
  • enemies use STATIC per-monster battle stats (bypass raw->derive); initiative=3 all -> round-robin; keep current values + pin test (owner architecture)
  • t84s add no-touch (has_touch=False) desktop context + default-suite click repro pin
  • 1-action economy + charged skills (delay-to-execute) spec
  • combat HUD visual redesign spec + approved mockups
  • _testArenaBossOnly hook — spawn only MotherSlime for fast charged-cloud verify (aaw6.7)
  • _testArenaBossOnly hook — spawn only MotherSlime for fast charged-cloud verify (aaw6.7)
  • robust reaction/skill test framework (deterministic entry, per-mechanic pins, schema-driven, test-driven) — Vera owns
  • QB-071 Chebyshev-range + QB-072 OA-crossing regression pins
  • d18s: combat test-infra hooks for QB-072 reaction pins + Quinn range QA
  • Merge sandbox/nix-d18s-09280: combat test hooks (_testArenaComposition, is_charging/reactions_remaining snapshot, active_attack_range_cells, poison-tick log)
  • Danger-viz test pins (ChroniclesOfNesis-flar 6-point acceptance contract)
  • Reconcile combat range tests with Manhattan metric (owner revert, 57356097)
  • Merge sandbox/vera-manhattan: replace Chebyshev range test with Manhattan pins (test_combat_manhattan_range.py) + slap/melee split pin
  • _testArenaComposition: young bodies, duplicate types, player HP/MP seed
  • Merge sandbox/vera-turnq: turn-queue placement pin (validates determinism) + _testArenaComposition young/duplicate/seed-HP-MP (Quinn harness) + snapshot mp fields
  • Player-triggered 3-point jump mechanic (Enemy.gd JUMP state + JumpTrigger) + WW1 wiring + movement-bench parity (owner spec 2026-08-19)
  • Fight all enemies on combat start: fire pendingJumpSpecs at combat mount (ChroniclesOfNesis-5q9t)
  • Merge sandbox/nix-cb0495: jumpers join combat on combat-start — on_StartCombat fires remaining pendingJumpSpecs (hop onto grid, swept into bodies) so no scene enemy is left out; JumpTrigger path unchanged
  • Combat sandbox: 99 HP testing-tank override for Elias
  • Merge sandbox/nix-jumpreuse: movement bench jump-reuse (real pendingJumpSpecs path) + collapsible HUD + combat-sandbox 99HP Elias tank
  • Roll out Quinn's per-tier jump/spawn spec to Waterway3-12

Maintenance

  • move-AP bucket accounting floor()->round() — free only BELOW half a bucket
  • relic slots: grant 1 free slot once Elias becomes paladin (cond 1 > 7)
  • okt8: hoist deferred-contact resolver above Enemy _physics_process movement early-returns
  • file okt8 (combat engagement) + claim/annotate iy3s (status-menu leak)
  • okt8 delay note + file ecic (MS 2x2 grid) + owner narrowing detail
  • Mother Slime 2x2 — center sprite/walk + footprint-reflect move paint
  • Cure costs 1 AP (was 2) — CombatSkillResolver cure.ap_cost 2->1 (all 3 live pack copies)
  • Merge sandbox/nix-ecic: Mother Slime 2x2 sprite-centering + footprint range-paint + centered walk (ecic)
  • kilf floater no-status-bubble repro detail
  • Slime/YoungSlime/VSlime moveRange=4 via battler base stat (data-driven)
  • file Poisona Pendant 3-turn immunity status-effect feature
  • Poisona Pendant poison resistance is now PERMANENT while worn (was 3-turn cap)
  • p586 done
  • capture resistance rule (half chance + half type damage) on p586
  • Mother Slime double-move (should be one cumulative 2-AP move)
  • t84s root-cause = MenuBase mouse-motion arbitration (systemic, osf0)
  • slime move-color-by-AP + p586 reopen (reach Elias + visible resistance)
  • color move overlay by AP cost + one cumulative enemy move
  • quinn-blocker review + move-AP/pendant/menu batch dispatch notes
  • Merge sandbox/nix-moveap: move-range paint by AP cost + Mother Slime single cumulative 2-AP move (bne5 + move-color)
  • Poisona Pendant poison resistance — visible grey numbers + Details entry + burst-damage resist (p586)
  • pre-merge sync
  • Merge sandbox/nix-pendant: pendant poison resistance reaches Elias + grey resisted numbers + Details row (p586)
  • osf0 systemic WASD-vs-mouse arbitration (t84s) + active-menu input mutual-exclusion (iy3s)
  • Merge sandbox/nix-menu: t84s WASD/mouse arbitration (40px sweep) + iy3s modal-stack accept gating (osf0)
  • WEB_VERSION 0.8.2357 -> 0.8.2358 (session batch: move-AP paint/AI, pendant, iy3s, t84s, Cure, relic slot)
  • file redeploy auto-bump WEB_VERSION follow-up
  • version 2359 (bed box) + beads: slime-AP-from-derived-spd, MS 2-charge-anim, poison-chance/combat-log
  • t84s root out the FILTER LIFECYCLE — enforce MOUSE_FILTER_IGNORE on every WASD assertion, not just the mode transition
  • pre-t84s-merge sync
  • combat AP: read the RAW speed dial, not the derived agi/dex accumulator (bead saco)
  • version 0.8.2360: bed box + t84s filter-lifecycle + slime AP from raw_speed
  • sync Overworld pack copy of Bed.tscn with resized box (dual-copy)
  • turn-order round-robin (demo) + GameOver text fade-on-click
  • pre-staticenemy-merge
  • Merge sandbox/nix-staticenemy: static per-monster enemy battle stats + round-robin initiative (owner architecture)
  • version 0.8.2361: static enemy battle stats (round-robin initiative) + bed box (cache cleared)
  • close saco/b39u/aglq — owner-verified turn order + AP good on 0.8.2361
  • t84s WASD-mode LEFT CLICK fires the WASD-focused button, not the parked-cursor button — gate the mobile-touch retarget
  • Merge sandbox/nix-menu (6c32e6a6): t84s click-retarget gate on is_touchscreen_available — desktop left-click keeps WASD selection (owner's exact repro)
  • t84s verified green on 2362 + file .scn-cache-after-gd-change process note
  • Skills menu relic-hover-skill-detail + remove darker highlight
  • Merge sandbox/nix-delay (0a684930): SluiceGate arms Mother Slime before walkToward — kills the ~2s dead-pause on boss contact (okt8)
  • wjil GameOver timing (0.25/0.5s) + kilf intermittent height + icon x-align
  • 18ba phase-relay overlap (should sequence 5 phases, collapse empties) — likely root of kilf
  • Merge sandbox/nix-bed2 (1a5d8a17): bed omnidirectionalInteract — skip the facing gate (real root cause, not the box) so bed interacts from any direction (fk4a)
  • combat floaters: relay-gate Cure heal skill + align stacked damage-type icons
  • speed up fade timing (bead wjil)
  • preview slotted relic's skill on hover/focus + drop darker selected-row fill (bead 1chy)
  • Merge sandbox/nix-uipolish: floater phase-relay heal+EP sequencing + icon-x align (kilf/18ba) + GameOver 0.25/0.5s (wjil) + skills-menu relic-hover detail + remove darker highlight (1chy)
  • version 0.8.2363: bed omnidirectional + dead-pause + floater/GameOver/skills-menu batch
  • file Quinn's Port-lane driver blocker (skill face-commit ends turn) + verified batch
  • enforce input-lockout contract on enemy AI dispatch + disable surprise initiative (6kp1)
  • sync issue state (np5h/9w69/8q0c closed, 6kp1 updated) pre-merge
  • Merge 6kp1: enforce input-lockout on enemy AI dispatch + disable surprise initiative (Nix 3feb07a5)
  • per-unit jump watchdog + boss-engage full-HP invariant (ChroniclesOfNesis-qld0)
  • sync (qld0 claimed, residual filed) pre-merge
  • Merge qld0: defensive full-HP-at-first-turn invariant + per-unit jump watchdog + instrumentation (Nix 3f54aac8)
  • pass-2 qld0 — trace hook + move full-HP clamp to armed-flip
  • sync pre-qld0-pass2-merge
  • Merge qld0 pass-2: clamp full-HP at armed-flip + [qld0-trace] on take_damage (Nix 521f273d)
  • Mother Slime half-HP fog gate (owner): poison_cloud only below 50% HP
  • Boss danger-phase softening (owner KNOB #2): Medium fog cooldown 3->5
  • sync pre-qb068-merge
  • Merge QB-068: Ep1-end Event 15 fires on Mayor talk (npc_talk trigger + PlayerCharacter dynamic fallback)
  • WEB_VERSION 2372: QB-068 Ep1-end Event 15 npc_talk trigger
  • Merge wau9: Mother Slime engage cinematic — single sword-draw + rise-from-water spawn (no ceiling-drop); contact delay verified <0.5s
  • sync pre-qb070-merge
  • Merge QB-070: GlobalWorld.demo default true — Ep1 end-credits gate (cond>=14, leave MayorsHouse) now fires on deployed builds
  • WEB_VERSION 2374: QB-070 demo=true (Ep1 credits gate now live on deployed builds)
  • 1-action economy + charged-skill core (aaw6.1 + aaw6.2)
  • Merge sandbox/nix-charge-7117f67e into develop
  • Charging VFX shader: outline->center pulse asset (aaw6.3)
  • Merge sandbox/port-chargevfx-d859ac into develop
  • Combat charged-skill cast-site visuals: pulsing danger zone + stagger bar + interrupt teardown (aaw6.5, aaw6.4)
  • Merge sandbox/nix-chargevis-016a76 into develop
  • turn-queue pulsing resolution marker (aaw6.6)
  • Merge sandbox/nix-tqmarker-600a7b into develop
  • register charging_pulse shader in CombatShaderTuner (aaw6.3 tuning)
  • Combat HUD visual redesign: FFT rhombus stat block + themed turn queue + stagger variant B (aaw6.12)
  • Merge sandbox/nix-hud-962dc2 into develop
  • Combat HUD polish: white outlined text + bold ally/enemy colors + even turn-queue spacing (aaw6.12 follow-up)
  • Merge sandbox/nix-hudtext-1942c3 into develop
  • combat HUD: rhombus HP/MP bar skew 20 -> 26 deg (owner max-slider pick, aaw6.12)
  • Combat HUD: stat-panel edge feather via canvas_item shader (aaw6.12 Port follow-up)
  • Merge sandbox/port-feather-9cb27b into develop
  • Combat HUD polish pass 3: 7 owner tweaks (aaw6.12 follow-up)
  • Merge sandbox/nix-hud5-6a3a35 into develop
  • aaw6.7: Mother Slime poison cloud -> charged skill (enemy-AI charge path)
  • Merge sandbox/nix-cloud-794322 into develop
  • Combat HUD polish pass 4: 9 owner tweaks (aaw6.12 follow-up)
  • Merge sandbox/nix-hud6-aa0b45 into develop
  • Combat move overlay: uniform move-range color + drop cells-moved readout (aaw6.12)
  • Merge sandbox/nix-move-8e1bec into develop
  • Combat HUD polish pass 5: 13 owner tweaks (aaw6.12 follow-up)
  • Merge sandbox/nix-hud7-4d9223 into develop
  • aaw6.12 follow-up: fade rhombus bar edges (~2px), following the skew
  • Merge sandbox/nix-barfeather-75923 into develop
  • aaw6.16: Move is a spendable cell BUDGET, not a one-shot
  • Merge sandbox/nix-movebudget-bac866 into develop
  • Merge sandbox/nix-mstrail-76644 into develop
  • combat aaw6.18: FFT-contiguous default — acting ends movement (can_move requires not has_acted)
  • combat ability architecture + reactions exploration (relic/innate, OA-vs-MoveAnytime, data schema)
  • ability slotting model — no FFT per-category caps, only slot-count/relic-access gates; high breakable ceiling by design
  • guardrails/rules-of-thumb (cap resources not loadouts; enemy tier budgets) + Quinn's Q4-Q6 resolutions
  • charging suppresses reactions rule + Mother Slime OA (charge window = safe retreat, teaches the rule)
  • unified top-of-screen action label ([Unit] - [Action]) as trigger clarity; label always + pre-commit spatial tell only for high-impact reactions (owner)
  • movement-triggered reaction choreography (stop->pause->label->pan-to-both-units->attack->pause->resume)
  • general per-step reaction PIPELINE (terrain+units, halts_movement contract, shared choreography) — OA is instance #1, web plugs in later
  • general per-move-step reaction pipeline + OA (instance #1) + action label
  • Merge sandbox/nix-reaction-3855afe3 into develop
  • promote before_dungeon_lowprep to tree/medium/ + manifest node (Quinn-authored, sibling prep branch)
  • Combat calibration + deterministic reaction bench (aaw6-22)
  • combat HUD (aaw6.23) pt1 REDO crash-safe: cell-coord x:y, empty terrain panel, color inversion via StyleBoxFlat
  • Merge sandbox/vera-bench-52e38649: aaw6.22 deterministic combat bench + calibration payload + reaction pins
  • aaw6.23 pt1 done + aaw6.22 bench merged (status notes)
  • combat HUD (aaw6.23) iter 2: HP=gold->red-orange / MP=green->royal, spaced "x / y", rows down 15px, widened value boxes, isometric terrain tile, turn-queue bottom HP bar (name removed)
  • combat HUD (aaw6.23) iter 3: targeted unit marked on all its turn-queue tiles
  • capture combat-logic/flow items from HUD iteration session (OA, HP persist, poison-row, exit-transition, auto-face, view/SELECTED targeting, feather cursor, OA-as-skill, icon+terrain follow-ups)
  • combat HUD (aaw6.23) iter 5: HP/MP fonts +20% + heavier outline; crisp stat icons (SVG scale 4.0 + LINEAR filter)
  • combat HUD (aaw6.23) iter 7: +15% HP/MP+stat fonts, terrain->stat width, rows down 6, dark XP bar, slight portrait tint, turn-index badge; SELECTED shows no target; named stat blocks for live-tune
  • combat HUD lock-in: persist live tuning (fonts/positions) + stat/terrain panels use portrait faction bg + gradient focus glow + ?/? unknown text
  • combat turn queue: first-pass slide-down animation on turn advance (less jarring reorder)
  • combat turn queue: revert turn-advance slide (broke the queue — ScrollContainer clipped the shifted column out of view)
  • combat QB-071/QB-072: Chebyshev range metric (diagonal reach) + OA fires on range-crossing only
  • ?arenaCombat=1 URL param — auto-mount full combat + auto-enter ATTACK (Quinn reach-QA via read tools)
  • safe-default A* pathing + phase-1 danger viz (ChroniclesOfNesis-flar); mirror reach cells to gameState (ChroniclesOfNesis-u2gm)
  • Merge sandbox/nix-flar: safe-default A* + 2-layer danger viz (flar phase1) + combat reach-cell gameState mirror (u2gm)
  • combat turn-queue: container-safe turn-advance slide (aaw6.24)
  • revert attack/threat range metric to Manhattan; free slime slap from axis-lock
  • Merge sandbox/nix-804167: combat distance Chebyshev→Manhattan (owner) + slime diagonal slap (drop straight_only)
  • '2 to 1' stat-block promotion on turn advance (aaw6.24)
  • OA choreography stops mover's walk anim -> idle during pause (xlar)
  • Merge sandbox/nix-oapause-17856: OA choreography — pause walk→idle→label→attack→resume during opportunity attack
  • resolve on_leave (OA) reactions at prev_cell, before the translate
  • Merge sandbox/nix-oatiming-19442: OA resolves at last in-range cell (attempt-to-leave trigger), not the out-of-range cell
  • combat turn-queue: show each unit once (real next-turn order), not the initiative forecast (aaw6.25)
  • Revert aaw6.25 dedup: keep the speed-based turn forecast (owner wants speed calc kept)
  • Wire up HP carry between combats (QB-073): read side was dropping persisted damage
  • Merge sandbox/nix-vb6t: QB-073 HP carries between fights (BTH hp_carry snapshot + Unit hp-carry init, single source of truth)
  • Promote Young Slime + Young VSlime to first-class standard enemies (structure only)
  • WW1-5 young-slime injection per Quinn's LOCKED composition
  • MP carries between fights (QB-074) -- exact analog of QB-073 hp_carry
  • Merge sandbox/nix-mp-slime: WW1-5 young-slime on-ramp (prespawn) + QB-074 MP carries between fights (mirror QB-073 + MP write-back)
  • Merge sandbox/nix-qb075: QB-075 young combat sprite invisible — make apply_type_visuals idempotent (was multiplicative→scale compounding to 0) + alpha 1 + min-scale floor
  • VSlime range-1 melee only (remove range-2 slap) + stat-block name shrink-to-fit (aaw6.26)
  • Waterway spawn caps — deterministic ≤3 gradient WW1-12 (Quinn locked, owner 'fewer enemies')
  • Waterway WW10-12 poison-synergy crescendo (owner via Quinn) — deep rooms escalate past the cap
  • Task A: young-slime PALE canvas_item shader (replaces flat modulate darken)
  • Task A refinement: Young VSlime tint -> pale yellow-green (was too close to blue)
  • deterministic tiebreak for turn-queue ties (ChroniclesOfNesis-0jp3)
  • Merge sandbox/nix-shaders: young pale shader (Young Slime sky-blue / Young VSlime yellow-green) + danger-cell shaders (thick pulsing rim L1 / aura+noisy rings L2)
  • per-row slime FRICTION tunable + normalize slime movement baseline (aaw6.27, owner WW2 tuning)
  • sync bootstrap SceneTemplate copy with FRICTION edit (dual-copy)
  • Merge sandbox/nix-combatsandbox: Combat Sandbox dev bench (?combatSandbox=1) — enemy picker + GO → real combat, L5 all-skills party, post-combat return; _mid_combat_spawn texture_override
  • expose party mp/maxMp in gameState.partyHealth (aaw6.28)
  • Merge sandbox/nix-qb076: engagement gap — restore Enemy Hitbox mask 5 (drifted to 1) + chase tune (slime maxSpeed 260, distanceToChase 400) so roaming enemies intercept a click-walking player
  • Movement Tuning Bench: ArenaBench ?arenaMove=1 mode (roaming+jumping enemies, live chase/jump sliders)
  • Merge sandbox/nix-rxeq: ArenaBench movement-tuning mode (?arenaMove=1) — roamers+jumpers, 4 live sliders (chase speed/friction, jump speed, jump-at-player%), count pickers, reset; gated, existing paths untouched
  • ChroniclesOfNesis-zqg4 Movement Bench: setup/GO HUD split + real WW1 jump geometry
  • Merge sandbox/nix-movebench: movement bench — bottom-left setup/play HUD split (no mouse-overload), real WW1 EnemyEntrance/Destination jump geometry (river→walkway), roamers on walkway
  • QB-080 v3 (ROOT CAUSE): combat only on PCHurtbox contact, not vision/interaction areas
  • Young-slime visual polish: clearer pale tints + HUD portrait tint/scale
  • Merge sandbox/nix-youngpolish: stronger young pale tints (clearer blue / mint-green) + young HUD portraits (turn-queue tile + stat block get tint+scale)
  • Unit.gd: sync young pale tint values + shader strengths to match Enemy.gd/HUD polish (combat sprite was rendering the old subtle tint)
  • WW1: 2-4 young slimes JUMP IN from the river (owner) — roaming avg=3/delta=1, static prespawn disabled
  • poison_absorb replaces poison_immune on VSlime + Young VSlime (owner) — absorb supersedes immune
  • Merge sandbox/nix-jumpmech: player-triggered jump mechanic (JUMP state + collision-ignore + validated in-polygon landing + JumpTrigger node) + WW1 composition (1 roam + 1-2 jump YS + 0-1 jump YVS) + sandbox jump parity, wander-range slider, exponential speed/friction/jump sliders
  • sync issues.jsonl (ChroniclesOfNesis-2hbu created+claimed)
  • purge native enemy that leaks in before suppress_native takes effect
  • sync issues.jsonl
  • Merge sandbox/nix-2hbu: purge leaked native enemy before suppress_native activates
  • sync issues.jsonl (ChroniclesOfNesis-2hbu closed)
  • Lock in slime overworld chase tuning (owner, via movement bench): acceleration=8500, speed/maxSpeed=300 across all slime spawn rows
  • Merge sandbox/nix-cbsandbox: combat sandbox re-arch (drop bespoke mount; spawn roster into WW1 wander zone → walk-in = real combat) + Vision Range slider
  • Movement bench: reuse REAL SceneTemplate jump path instead of parallel jumper impl
  • Remove 'X ended' status floater (owner) — status-bubble disappearance already signals the effect ended
  • Merge sandbox/nix-2652: danger-viz revision (cut hatch/rim, path-cell-only impending pulse 0-1-0, cloud-clear-on-aim) + unlimited reactions (per-round budget removed, depth-1 kept, count=true total) + 2x2 targeting-white on targeted cell only
  • WEB_VERSION bump to 0.8.2406 (deploy: danger-viz + unlimited reactions + 2x2 targeting + mother poison + poison-ended removal)
  • Combat danger viz: two-state walk-path cell paint (potential -> impending)
  • Merge sandbox/nix-3state: danger-viz two-state cell paint (potential amber path cells + impending red trigger-cell ring, same-cell flip; faster pulse <0.2s transparent; drop reaction-badge glyph)
  • VSlime poison cloud: plus-5 self-inclusive AOE reusing Mother's charged-cloud path (ChroniclesOfNesis-8lpx)
  • Poison cloud charge_turns retune (owner 2026-08-19 follow-up): VSlime 0.5, Mother 1.5->1.0
  • Revert Mother Slime charge_turns to 1.5 (owner correction, ChroniclesOfNesis-8lpx)
  • VSlime cloud charge_turns: 0.5 -> 1.0 (owner correction, ChroniclesOfNesis-8lpx)
  • Merge sandbox/nix-vsc-59541: VSlime poison cloud (plus-5 AOE incl self-heal, buddy-synergy + <50%HP exclusive cast, charged/staggerable)
  • VFX arena: live Charging-VFX bench (toggle + shader sliders + progress probe)
  • Merge sandbox/port-vfx-a1f3: charging-shader VFX bench (?arenaVfx=1) — Mother/VSlime picker, charging toggle + live pulse sliders + color, Q9 charge_progress uniform
  • Stagger threshold defaults to 25% of caster max_hp (owner 2026-08-19)
  • Combat batch: VSlime OA poison, animated stagger bar, INTERRUPTED status (owner 2026-08-19)
  • Merge sandbox/nix-oa-cb1: VSlime OA poison + stagger UX (bar tweens with damage then interrupts, remove poison-applied floater, formal Interrupted status, charging/interrupted units cant react)
  • Move charging/stagger VFX suite to CombatVFXBench (the owner's actual shader bench)
  • Impending aura: fill whole cell + pop (owner 2026-08-19) — full-cell base fill, radius frac 0.62->1.0, alphas boosted (aura was a faint center blob in base MIX layer)
  • replace ability-category text with icon (owner 2026-08-19)
  • Merge sandbox/nix-icons-a1b2: ability-category icons in SkillsMenu detail panel (inline [img] + tooltip, replaces (Source:Category) text)
  • Revise ability icons (owner 2026-08-19): Action = plain arrow (was sparkle — collided with stat_matk sparkle in combat HUD); Passive = owner's infinitySymbol asset recolored white (was hand-drawn lemniscate). Reaction counter-arrow unchanged.
  • Ability-category icons: extend to every site, not just descTags (owner 2026-08-19 follow-up)
  • Merge sandbox/nix-icons-a1b2 (follow-up): ability-category icons everywhere — skill-list row badges, detail panel icon+(name), BuySkillMenu Learn popup, CombatDetailsPanel, skill-tree grid cells
  • Deprecate :8061 iteration lane (owner 2026-08-19): redeploy ABORTS on LOCALHOST_HOLD (exit 3) instead of diverting to :8061 — the divert silently stranded fresh builds on :8061 while :8060 served stale. FORCE_DEPLOY=1 still overrides.
  • Danger-viz + icons pass (owner 2026-08-19): impending aura no longer pulses (constant fill, rings still travel); reaction badge = count + reaction SYMBOL (no 'reaction' word); ability icons recolored muted taupe + Reaction redrawn as sharp bounce + Passive from owner infinity asset; Skill Menu category icons enlarged (detail 1.1->1.7x, row badge 0.5->0.72x)
  • Merge sandbox/nix-cv-8f21: charged-cloud impending unified to shared ring-aura renderer (no pulse); VSlime fog sized to plus-5 AOE; turn-queue charging = warm hover-shaped highlight +15px (lightning removed)
  • Remove player-visible AP UI remnants (dead mechanic, aaw6.1)
  • Merge sandbox/nix-ap-0iix: remove vestigial player-visible AP (aaw6.1 killed the model) — Status/Equipment 'Actions' stat, Skill-menu + in-combat-picker 'AP' cost labels, log text; internal ap_cost plumbing kept (QB-077 / ChroniclesOfNesis-0iix)
  • Mother Slime cloud charge 1.5 -> 2.0 (Quinn deep-room re-lock, Monte-Carlo 2026-08-19): closes the heal-build no-win hole (37.5% -> 0%) — low-init WIS build center-locked got only 1 turn, couldn't trip stagger OR clear radius-3 cloud. 2.0 is minimal window closing ALL builds; keeps 22 threshold + intended Smite-commit/Physical-decision/Heal-run fork.
  • Reaction badge symbol 2x size (owner 2026-08-19)
  • Concurrent enemy jump + combat-ready-before-contact gate (owner 2026-08-19)
  • Merge sandbox/nix-tt-8a3f: concurrent enemy-jump + combat transition (drop blocking await, thread validated landing cells); combat-ready gate (is_combat_system_ready on hitbox + deferred-contact retry so contact never silently drops)
  • Combat VFX Bench: charging shader defaults ON in combat mode (owner 2026-08-19) — tuning bench should show the effect + sliders immediately, not gated behind an OFF toggle; toggle stays for on/off A/B
  • WEB_VERSION -> 0.8.2421 (deploy: Quinn jump/spawn table rollout + Combat VFX Bench charging defaults-ON so shader sliders show immediately)
  • CHARGING state: freeze/cast sprite so charging_pulse shader reads clean
  • Merge sandbox/nix-chganim-8x2p: charging freezes the sprite — play_battle_charge (cast loop if cast sheet exists e.g. Elias, else hold frame 0), wired into ChargingVFX.apply/clear so pulse shader reads on a still sprite (bench + real combat)
  • WEB_VERSION -> 0.8.2422 (deploy: charging freezes sprite — cast loop / hold frame-0 under pulse shader)
  • Charging shader owner-locked defaults (2026-08-20): pulse_color #333333, speed 2.05, width 0.12, outline_boost 0.52 (tuned live in Combat VFX Bench). Seeds real combat + bench via ChargingVFX default-seed.
  • WEB_VERSION -> 0.8.2427 (deploy: combat-log remap L1/R, triangle=details-only)
  • Lock in final icon set (owner-approved 2026-08-20): stat icons darker-brown+dropshadow (drop-in overwrite); key final white+outline; ability/interrupted as SVG; affinity marker-only SVGs (white+outline). Wiring (.png->.svg refs) follows.
  • Wire owner-locked icon set: ability/interrupted/affinity PNG->SVG refs
  • Merge sandbox/nix-iconwire-a1b2: wire locked icon set — ability/interrupted/reaction-badge refs .png->.svg; poison_immune->affmark_immune, poison_absorb->affmark_absorb on Details; stat/key drop-ins confirmed
  • WEB_VERSION -> 0.8.2429 (deploy: locked icon set wired — stat icons brown+shadow, ability/interrupted/key SVG, affinity immune/absorb on Details)
  • WEB_VERSION -> 0.8.2430 (deploy: Key type badge for all keys)

v0.8.2356

23 changes

New

  • add cond_11_mugwort_grindbase test node (grind base for Cure-path build)
  • add repeatable flag; General Store re-offers shop indefinitely

Fixed

  • [deploy-develop] public cut (owner): bed left-edge interaction fix (Quinn 3/3 PASS) + screenshot double-flip fix, v0.8.2347
  • [deploy-develop] WEB_VERSION 0.8.2353 — cache-bust the thumbnail flip fix to clients
  • defer enemy contact during post-load window, don't lose it (fix Waterway1 no-engage)
  • WEB_VERSION 0.8.2354 — cache-bust Laria pack for the Waterway combat-contact fix
  • exempt event-forced combat from the QB-051 load-window refuse (fix boss no-engage)
  • WEB_VERSION 0.8.2355 — cache-bust Laria pack for the boss-engage (event-armed QB-051) fix
  • [deploy-develop] boss-engage fix: exempt event-forced combat from QB-051 load-window refuse (Mother Slime no-engage) + Waterway1 defer
  • cancel now fully reverts like Clear (fix spent-JP left painted on stat)

Tested

  • harden _testConsumeItem to fail-loud (kill the silent phantom)
  • save-tree manifest: Medium-only launcher (Quinn spec) — dormant easy/hard, flag med as stale

Release

  • deploy manifest v0.8.2347 (bed + screenshot fixes)

Maintenance

  • wire out-of-combat skill Cast (flag -> Cast button -> party window -> apply)
  • mark Kein story (22) + Falmri/Mia recruit (10065/10066) repeatable (owner: all re-ask)
  • publish combat_snap.settled (DamageQueue idle + input armed) for reliable autoplay reads
  • soften Mother Slime fog ~12->~8/turn (INT 13->8), keep <=50% trigger
  • promote sluicegate_boss_ready (L5 + Item Relic slotted, pre-boss cond 1:11)
  • restore Mother Slime INT 13 (fog nerf held — tuned on gimped build)
  • honor physical_resist via DAL fallback when instance-var reads no-resist (osvr)
  • deploy-manifest: backfill 8 records (builds 2125-2311, 2026-07-01→26)
  • ci/release_channel: emit deploy-record to push-channel.js for S3 changelog mirror
  • remove flip_y() from canonical capture — G4 web get_image() is already upright

v0.8.2347

9 changes

Fixed

  • 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 changes

Improved

  • 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 changes

New

  • 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 changes

New

  • 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 changes

New

  • 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 changes

New

  • 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 changes

New

  • 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 changes

New

  • 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 changes

New

  • 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 changes

New

  • 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 changes

New

  • 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 changes

New

  • 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 changes

Maintenance

  • 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 changes

Docs

  • 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 changes

New

  • 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 changes

New

  • 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 change

Maintenance

  • Mobile Phase 2 #1: in-game Quit button

v0.6.1476

1 change

Maintenance

  • WASD-mode left-click + parent-focus resume on pop

v0.6.1475

1 change

Maintenance

  • BuySkillMenu Phase B follow-up: force-focus Cancel, focus highlight, A on disabled Learn

v0.6.1474

222 changes

New

  • 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 changes

Fixed

  • 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 changes

New

  • 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 changes

New

  • 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 changes

Fixed

  • 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 changes

Fixed

  • 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)