Skip to content

feat(play-setup): state the ask-vs-grant gap and the host tuning verdict - #247

Merged
papi-ux merged 1 commit into
masterfrom
feat/fps-ask-vs-grant
Aug 20, 2026
Merged

feat(play-setup): state the ask-vs-grant gap and the host tuning verdict#247
papi-ux merged 1 commit into
masterfrom
feat/fps-ask-vs-grant

Conversation

@papi-ux

@papi-ux papi-ux commented Aug 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • The ask-vs-grant gap is stated where the grant is stated. buildNovaLaunchProfileSummary now takes clientAskedFps (the Settings frame rate) and, when the granted rate sits below it, the Selected line reads "Recovery profile / 30 FPS · you asked 120" and a new grantHoldReason names what is holding it ("Held by History Safe Profile", from preference_blocked_reason, else the limiting issue). The Play Setup Asked/granted fact carries the reason in its detail. This was the one fact no screen said anywhere — exactly what made a 30 FPS launch under a 120 FPS setting read as a mystery.
  • The High FPS pin moves into the summary itself (clientFpsPinned): it owns the "Launch 120 FPS · your pick" headline and the "120 FPS pinned (host offered Recovery profile / 30 FPS)" Selected line, and retires the one-shot trial button while active, since the launch already goes out at the asked rate. The button-site special case from feat(play-setup): make High FPS tuning binding via one composed launch blob #246 is removed; the button just reads the summary.
  • The Tuning caption states the host's verdict on the asks the host owns: "Applied by host" or "Host declined · History Safe Profile" for quality/stability, via a new pure novaTuningOutcome helper. A host that predates preference_applied gets the default caption — a decline is never fabricated from a missing field. auto asks for nothing and high_fps is binding client-side (feat(play-setup): make High FPS tuning binding via one composed launch blob #246), so neither shows a host verdict.
  • issueLabel becomes internal novaLaunchIssueLabel so the outcome helper reuses the one prettifier.
  • Design note: the plan's "inline recovery exits in Play Setup" was dropped as already-solved — Reset Game Profile lives on the Overview's fixed four-action rail by deliberate design (its source guard explains Play Setup has no room for a copy), and Try-High-FPS rides the expanded review.

Exact candidate

Verification

  • :app:testNonRoot_gameDebugUnitTest — 1388 tests, 0 failures, 0 errors, 0 skipped (XML-counted; includes 3 new NovaLaunchProfileSummaryTest fixtures and the new NovaTuningOutcomeTest)
  • :app:lintNonRoot_gameDebug -PlintFailOnError=true — 0 new errors (baseline noise only)
  • :app:assembleNonRoot_gameDebugAndroidTest — compiles
  • Device QA on the RP6 (arc's end-to-end pass, next: recovery game shows "you asked 120" + hold reason on Auto; pin flips the button to "your pick"; declined quality/stability asks read "Host declined")

…rdict

The launch profile summary now knows what this client actually asked for.
When the granted rate sits below the Settings frame rate, the Selected
line says both halves ("Recovery profile / 30 FPS · you asked 120") and a
new grantHoldReason names what is holding it ("Held by History Safe
Profile"), which the Asked/granted fact carries in its detail. Until now
the gap between the ask and the grant was the one fact no screen said
anywhere, which is exactly what made a 30 FPS launch under a 120 FPS
setting read as a mystery.

The High FPS pin moves into the summary itself: buildNovaLaunchProfileSummary
takes clientAskedFps and clientFpsPinned, owns the "Launch 120 FPS · your
pick" headline and the "120 FPS pinned (host offered Recovery profile /
30 FPS)" Selected line, and retires the one-shot trial button while the
pin is active, since the launch already goes out at the asked rate. The
button-site special case from the previous change is gone; the button
just reads the summary again.

The Tuning row's caption states the host's verdict on the asks the host
owns: "Applied by host" or "Host declined · History Safe Profile" for
quality and stability. A host that predates preference_applied gets the
default caption, never a decline fabricated from a missing field.
@papi-ux
papi-ux merged commit 0c9af32 into master Aug 20, 2026
6 checks passed
@papi-ux
papi-ux deleted the feat/fps-ask-vs-grant branch August 20, 2026 05:24
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