- Harness mode must not block on project picker when
?harness=trueand no?project=is present. Default todefault.ltproj(or first discovered project) for deterministic automated testing. - In animation combat, cyan/red solid rectangles indicate the deliberate sprite stub fallback path
(
draw.mainFrameis missing) insrc/engine/states/game-states.ts. - Fixed by gating
AnimationCombatinit:src/combat/animation-combat.tsnow waits until both sides resolvemainFramebefore entering visible phases (SPRITE_LOAD_WAIT_MS = 1500fail-safe). - Harness
loadLevel(clean=false)must not manually pusheventafterfree;FreeStatealready auto-pushes pending level_start events. Double-pushing can stack EventState and cause chapter intro soft-lock/transient empty-top-state behavior in long cutscenes (seen in Ch.2/Ch.3). - Talk menu discovery for level-scoped conversations must pass
levelNidintoeventManager.getEventsForTrigger(). MissinglevelNidhides valid Talk options even when matching events exist (reproduced with Ch.5 Natasha/Joshua recruitment). - For long village cutscenes in harness tests, use
BACKinput to enable EventState skip mode; relying on repeatedSELECTcan leave tests mid-event and make item assertions flaky. evaluateCondition(unit.can_unlock(region))must handle runtime item components stored asMap<string, any>, not just array-shaped components. Includecan_unlockexpression handling (e.g.region.nid.startswith('Chest')/'Door') for correct Chest/Door menu gating.- In multi-step interaction tests, prior actions can leave units with
finished=true; either reset per-turn flags explicitly or reload the level cleanly between cases to avoid false negatives when forcingmenustate. - Destructible village data may be mixed between
DestroyVillageXinteraction regions and event conditions that matchVillageX. Region-trigger code should retry with sibling region context whenDestructibletrigger fails onDestroy*region. - Ch.3 Colm spawn event (
3_Turn2) uses triggerother_turn_changewith conditiongame.turncount == 1in this data set; harness tests should set bothturnCountandturncountbefore triggering for deterministic behavior. - Ch.3 outro validation should assert recruit branch behavior during the outro timeline
(Colm becomes
player) rather than after Ch.4 loads, since Ch.4 intro removes many units. - Ch.4 Village2 recruitment (
change_team;Lute;player+add_unit;...;closest) can leave Lute unplaced (position == null) in some deterministic harness setups; assert team conversion and region consumption as primary correctness checks. - Ch.4 Turn3 cameo script intentionally removes
L'arachel,Dozla, andRennacafter dialogue; regression checks should assert finalposition == nullrather than persistent on-map presence. ralph-looponly runs whenPLAN.mdhas unchecked- [ ]items; keep backlog items concise so prompt titles stay short and avoid Discord attachment fallback.- Magic sword harness regression should assert deterministic execution signals (state resolution, weapon uses decrement) rather than RNG-dependent HP damage.
- Event dialog parity: portrait mouth animation must follow dialog typing state, not just dialog lifetime. Stop talking when dialog enters waiting/pause and only animate during active typing.
- Event background parity:
change_backgroundshould block event progression until panorama load resolves; async non-blocking loads can cause first cutscene lines to render without background.