Skip to content

Rework Guitar Hero failure recovery and temporal note timing in V10 - #147

Merged
ProhibitedTV merged 8 commits into
mainfrom
fix/guitar-hero-calibration-v10
Sep 6, 2026
Merged

ProhibitedTV merged 8 commits into
mainfrom
fix/guitar-hero-calibration-v10

Conversation

@ProhibitedTV

Copy link
Copy Markdown
Owner

Why this is a larger calibration pass

The latest live run made two things clear: lifecycle recovery still needs to be deterministic, and the gameplay path is not good enough to tune by moving one static threshold around. V10 changes the shape of the problem instead of adding another screenshot-specific patch.

Failure-screen recovery

  • keep explicit SONG FAILED ownership
  • detect the actual yellow selected row (RETRY / NEW SONG / QUIT)
  • drive that row directly rather than relying on generic frame-signature transactions
  • keep failure ownership valid when NEW SONG, not just RETRY, is highlighted
  • retry Confirm only after a bounded transition timeout
  • fail closed if the selected row genuinely cannot be read, rather than blindly walking onto QUIT

Gameplay timing

  • keep V8's joint five-receptor geometry and V9's difficulty lane masking
  • add a temporal note-approach filter on top of V8's per-lane note gaps
  • require a note candidate to move toward the receptor across frames before it can fire
  • reject stationary same-color clutter near the strike line
  • derive a bounded dynamic trigger gap from measured approach velocity, compensating roughly one capture/controller frame without allowing unbounded early hits
  • expose approach confirmation, per-lane velocity, dynamic trigger gap, and suppressed instantaneous hits in telemetry

Calibration posture

The profile stays on Easy, with whammy and Star Power disabled, so the next live pass isolates base perception and timing. This still is not being promoted beyond diagnostic maturity until a complete Easy song survives.

Regression coverage

Adds tests for stationary-clutter suppression, approaching-note timing, deterministic failure-row navigation, retained failure ownership when NEW SONG is highlighted, active V10 registry export, and V10 timing telemetry.

@ProhibitedTV
ProhibitedTV merged commit 15f9a7a 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: b5c5fa8eaa

ℹ️ 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 +60 to +62
if history and gap > history[-1] + self.approach_backtrack_tolerance:
history.clear()
history.append(gap)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Reject downward component switches before confirming approach

When the closest contour changes to a different same-color component with a smaller gap—for example, transient stage lighting appearing below a tracked note—this logic preserves the history because it only treats gap increases as discontinuities. The resulting large downward jump is interpreted as approach velocity and can immediately satisfy both confirmation and the dynamic trigger threshold, causing the temporal filter to generate the false fret presses it is intended to suppress. Track contour identity or reject implausible downward jumps before appending them.

Useful? React with 👍 / 👎.

Comment on lines +52 to +56
if gap is None:
self._missing_frames[lane] += 1
if self._missing_frames[lane] > self.approach_missing_grace_frames:
history.clear()
return False, 0.0, self.note_trigger_gap

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 Account for missing frames in the velocity estimate

With the default one-frame missing grace, a sequence such as gaps 0.07, None, 0.045 retains only the two numeric endpoints, so the later delta calculation treats movement spanning two frame intervals as one-frame velocity. That inflates the dynamic trigger lead and can fire notes early specifically after a brief detection dropout or occlusion. Preserve elapsed-frame information in the history or divide the displacement by the number of intervening frames.

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