Skip to content

Fix Guitar Hero failure recovery and force configured difficulty in V9 - #146

Merged
ProhibitedTV merged 6 commits into
mainfrom
fix/guitar-hero-failure-v9
Sep 6, 2026
Merged

ProhibitedTV merged 6 commits into
mainfrom
fix/guitar-hero-failure-v9

Conversation

@ProhibitedTV

Copy link
Copy Markdown
Owner

Live evidence

The latest V8 run reached gameplay but failed I Love Rock & Roll at 13%. The retained failure screen exposes two concrete lifecycle bugs before we tune note timing further:

  1. the screen visibly reports DIFFICULTY: MEDIUM even though config/guitar_hero.yaml requests difficulty: easy, so the stylized difficulty poster is preserving a previous selection and V7/V8's fallback assumption that fresh Quick Play starts on Easy is false;
  2. after the supervisor restarted while the emulator was sitting on SONG FAILED, V8 logged title settling/start behavior, meaning the failure card was being misclassified as the title screen instead of handled as a failure state.

V9 changes

  • add an explicit non-OCR SONG FAILED detector based on the retained live topology: dark central plaque, dense white type, saturated yellow RETRY row, green CONTINUE footer, and absence of the red BACK badge that distinguishes the difficulty poster
  • let failure ownership preempt inherited title/difficulty heuristics even after a supervisor restart
  • default failed-song handling to NEW SONG during calibration so the run returns through setlist/difficulty rather than endlessly retrying the wrong retained difficulty
  • deterministically home the four-row difficulty selector with three Up presses before applying the configured target; this removes the invalid assumption that the selected row is already Easy
  • preserve V8's joint highway tracking
  • mask impossible fret lanes by difficulty: Easy only green/red/yellow, Medium adds blue, Hard/Expert use all five
  • add telemetry for failure-card evidence, active lane count, homing transactions, and suppressed inactive-lane hits

Regression coverage

Adds tests proving that V9:

  • recognizes the retained failure-card topology from BOOT/restart state and chooses New Song instead of pressing Start
  • does not confuse the difficulty poster (red BACK footer) with SONG FAILED
  • emits up, up, up, confirm for configured Easy and up, up, up, down, confirm for configured Medium
  • suppresses blue/orange gameplay inputs on Easy while still allowing yellow
  • exports V9 through the active registry alias

This is intentionally still diagnostic: the next useful live run is now a real Easy chart, which isolates note timing from the accidental Medium difficulty and from disabled-lane false inputs.

@ProhibitedTV
ProhibitedTV merged commit fc2d5b9 into main Sep 6, 2026
2 checks passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: df5453b135

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +204 to +205
if self.screen == GuitarHeroScreen.FAILED and self._failed_card_active:
return self._tick_failed_card(controller, ctx, obs)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Route template-owned failures through the configured action

When a high-confidence gh_song_failed template identifies the screen but _failed_card_score() remains below threshold—for example with a differently filtered local capture—_classify() still returns FAILED through the existing template hints while leaving _failed_card_active false. This guard then delegates to the inherited failure handler, which hard-codes Confirm/Retry, so the configured default new_song action is ignored and the run may retry the retained wrong difficulty instead of returning through difficulty selection.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant