fix: device-pass fixes for replay modes, room transitions, and settings - #44
Merged
Conversation
prabu-openclaw
force-pushed
the
local/titles-plus-audio
branch
from
July 24, 2026 01:33
4475507 to
2ffd01d
Compare
Findings from a device playtest (2026-07-23), plus the test layer that would have caught the worst of them. Extraction resolved only on an explicit tap of the pad, or at the end of an enemy phase -- and once the last enemy is dead there is no enemy phase. Walking the final runner onto the pad produced the objective pulse and nothing else, with no message, because every rejection path lives inside requestExtraction and that was never reached. Side contracts were therefore uncompletable. adjudicateExtractionIfEligible now runs on the move commit alongside the terminal/grimoire step-on handlers; it is internally guarded and idempotent. Backtracking into a cleared room sent the squad to the room's ORIGINAL entry point, at the far end from the door they actually came through -- M1 room_2 -> room_1 landed them at the top when the connection authors the bottom. RoomManager now uses the connection's targetSpawn in both directions, which is what BattleScene's own transition comment already specified; the two had disagreed. A barrier dropped by removeOnFirstKill is painted into the room BACKGROUND art, and re-entry reloads that art pristine, so the wall came back visually while staying walk-through. The pixel patch is now replayed on room load. Replay modes ran the campaign intro AND outro VNs -- story beats for a mission the player never started. Both are skipped for gauntlet floors and side contracts. Also: the tutorial-tips replay button was a one-way door (no inverse for resetAll, and .disabled locked it afterward), and it lied about its state after reopening Settings because it tracked @State rather than the stored flags. TEAM was on both the main screen and the SELECT RUN bar wired to the same action; the main-screen copy is gone. New: backtrack patrols. Re-entering a cleared room has a 35% chance of 1-2 of the cheapest authored types, seeded on (attempt, room, visit) so a visit cannot be re-rolled by walking out and back, capped one per room per attempt, never in boss rooms. Doors re-lock until the patrol dies, matching the ReinforcementService contract. Tests: 113 -> 126. StepOnSemanticsTests certifies the player-input path. WP6's mission certification drives authority directly (applyRoomEntry, requestExtractionResolution), so the tap/move -> intent layer had no coverage at all -- which is exactly why contracts could be broken with the whole suite green. These enter through moveCharacter instead. ReplayModeCertificationTests gives gauntlet, contracts and arenas the WP6 treatment they never got (MissionCertificationMatrix.md mentions them zero times): all 20 arenas driven through the real contract path via seed sweep, all 3 tiers, 8 gauntlet floors -- every run finished by walking onto the pad. Both suites are mutation-checked: disabling the extraction fix fails 4 tests in the first and 3 in the second. Not yet verified on device. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
prabu-openclaw
force-pushed
the
local/titles-plus-audio
branch
from
July 24, 2026 02:19
2ffd01d to
b0ae2fd
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Findings from a device playtest on 2026-07-23, plus the test layer that would have caught the worst of them.
The blocker
Side contracts were uncompletable. Extraction resolved only on an explicit tap of the pad, or at the end of an enemy phase — and once the last enemy is dead there is no enemy phase. Walking the final runner onto the pad produced the objective pulse and then nothing, with no message at all, because every rejection path lives inside
requestExtractionand that was never reached.adjudicateExtractionIfEligiblenow runs on the move commit, beside the existing terminal/grimoire step-on handlers. It is internally guarded and idempotent.Other fixes
room_2 → room_1landed them at the top when the connection authors the bottom.RoomManagernow uses the connection'stargetSpawnin both directions, which is what BattleScene's own transition comment already specified; the two had disagreed and RoomManager won.removeOnFirstKillis painted into the room background art, and re-entry reloads that art pristine — so the wall returned visually while staying walk-through. The pixel patch is now replayed on room load.resetAll()had no inverse and.disabledlocked the button afterward. It also misreported its state after reopening Settings, tracking@Staterather than the stored flags.New: backtrack patrols
Re-entering a cleared room has a 35% chance of 1–2 of the cheapest authored types. Seeded on (attempt, room, visit) so a visit cannot be re-rolled by walking out and back; capped one per room per attempt so a corridor between objectives can't be farmed; never in boss rooms. Doors re-lock until the patrol dies, matching the
ReinforcementServicecontract. Tuning knob isbacktrackPatrolChance.Tests: 113 → 126
StepOnSemanticsTestscertifies the player-input path. WP6's mission certification drives authority directly (applyRoomEntry,requestExtractionResolution), so the tap/move → intent layer had no coverage — which is exactly how contracts stayed broken with the whole suite green. These enter throughmoveCharacter, the call the tap handler makes.ReplayModeCertificationTestsgives gauntlet, contracts and arenas the WP6 treatment they never had (MissionCertificationMatrix.mdmentions them zero times): all 20 arenas driven through the real contract path via a seed sweep, all 3 contract tiers, and 8 gauntlet floors — every run finished by walking onto the pad.Both are mutation-checked: disabling the extraction fix fails 4 tests in the first and 3 in the second.
Validation
126/126 green locally on iPhone 17 sim. Also verified the fixes apply cleanly to
mainand pass there standalone, independent of #41/#42.Not yet verified on device — that's the remaining gap, and given the bug this PR fixes was a device-only finding, worth a real playthrough before merge.
🤖 Generated with Claude Code