Skip to content

feat(hud): put the verdict's explanation first, make Slim a MangoHud bar, add the network row - #285

Merged
papi-ux merged 1 commit into
masterfrom
feat/command-center-hierarchy-slim-v2
Sep 6, 2026
Merged

feat(hud): put the verdict's explanation first, make Slim a MangoHud bar, add the network row#285
papi-ux merged 1 commit into
masterfrom
feat/command-center-hierarchy-slim-v2

Conversation

@papi-ux

@papi-ux papi-ux commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Summary

  • Command Center opened on a one-line verdict and buried what explained it. The session strip says how the stream is doing; the Doctor's reading and the Stream card that say why, and what Auto is running, sat below Quick Keys, Controls, Session, and Overlays, three screens down on a Retroid. They now come right after the strip. Overlays follows because the HUD switch is the frequent tap, then Controls and Session, then the full Quick Keys grid, then Sync and Advanced.
  • Esc, Meta, and Alt + Enter stay pinned in one row directly under the strip, so reaching the game's own menu on a handheld never needs a scroll. The pinned row reuses the grid's own action instances: the grid stays the whole keyboard and both rows fire the same key.
  • This reverses the 1.4.3 order deliberately. Keys-first assumed the strip was enough, and it is not when the number is bad.
  • NovaHUD Slim is now a one-line bar in the MangoHud spirit: the health bar, the frame rate with its last minute drawn beside it, then decode time, round trip, and bitrate with 7 sp inline labels, so two millisecond values are never told apart by position. Bitrate drops its unit like Performance. Minimal stays the sparse two-line card, so Slim is about height, not about hiding data.
  • NovaHUD Debug gains a network row. The decoder has reported packet loss, round-trip variance, and the session's lost-frame count in every sample and no HUD mode showed them. LOSS is graded so zero is the only green: a trace reads "<0.1%" in warning rather than rounding to a green-looking 0%, under one percent is warning, one percent and over is danger. JIT reads "--" while there is no round trip to wobble around. DROPS is the session's cumulative count.
  • Source guards re-pin the new first-paint order, the Slim composition, and the Debug network row. Unit tests cover the pinned-key selection and identity, the Slim bitrate form, and the loss grading and formatting edges.

Exact candidate

Verification

  • :app:testNonRoot_gameDebugUnitTest (x86_64): 1617 tests, 0 failures, 0 errors. Note: pc-papi's /tmp is a tmpfs with a per-user quota that other sessions' Polaris asan/tsan build trees have filled; Robolectric and Mockito extract into the Java temp dir, so the suite fails there with "Disk quota exceeded" regardless of the code. The green run used an init script that points the Test tasks' java.io.tmpdir under /home. Nothing in the repo changed for that.
  • :app:lintNonRoot_gameDebug -PlintFailOnError=true: clean
  • :app:assembleNonRoot_gameDebug (arm64-v8a), installed on the Retroid Pocket 6 as com.papi.nova.debug
  • Device, Command Center: first paint is header, session strip, the pinned Esc / Meta / Alt + Enter row, the Doctor card, the Stream card with its Launch preset; scrolling continues Overlays (HUD switch, mode picker, Stats Overlay, Copy Diagnostics, both opacity rows), Controls, Session, the full Quick Keys grid, Sync Status, Advanced.
  • Device, Slim: one pill, health bar, fps, sparkline, DEC 6.2ms, RTT 3ms, BIT 17M. Guide + Y still walks Slim, Minimal, Performance, Debug, Slim, and the mode persists.
  • Device, Debug: fourth row LOSS 0% (green), JIT 0ms, DROPS 2 under HOST / IN / OUT.
  • dumpsys gfxinfo, 60 s windows on the RP6. The HUD recomposes once per sample, so these are the UI thread's one frame per second, not video frames. Control would not come up on the host this evening (the session showed the host desktop at 12 fps), so this PR's rows are from that desktop session; the reference rows from feat(hud): decode time in Debug, a Slim layout, and a Command Center that stays out of the way #283 were taken inside Control at 60 fps. The UI-thread work is the same either way.
HUD layout Session Frames Janky p50 p90 p99
Slim, this PR, window 1 desktop, 12 fps 59 2 11 ms 13 ms 14 ms
Slim, this PR, window 2 desktop, 12 fps 59 9 12 ms 13 ms 15 ms
Debug, this PR (4 rows), window 1 desktop, 12 fps 59 11 12 ms 14 ms 16 ms
Debug, this PR (4 rows), window 2 desktop, 12 fps 59 13 12 ms 14 ms 15 ms
Debug, #283 v2 (3 rows), reference Control, 60 fps 59 11 12 ms 13 ms 16 ms
Performance, #283, reference Control, 60 fps 59 0 11 ms 12 ms 13 ms

Read: Slim with its sparkline lands where Performance already was, 11 to 12 ms p50. Debug's fourth row is inside run-to-run noise against the three-row version. Janky counts move by several frames between identical windows, so treat those as a range, not a delta.

Not covered

  • androidTest is not compiled by CI and already fails to compile on master for unrelated reasons; the HUD androidTests were not touched or run.
  • The companion-display Command Center is still the legacy GameMenu, as before.
  • MangoHud draws per-frame frametimes; the HUD's samples arrive once a second, so the Slim sparkline is a 60 second trend of the frame rate, not per-frame jitter.
  • No 60 fps game capture of the new Slim bar this evening; the desktop session capture shows the same layout with a flat line at 12 fps.

…bar, add the network row

Command Center opened on a one-line verdict and buried what explained it. The
session strip says how the stream is doing; the Doctor's reading and the Stream
card that say why and what Auto is running sat below Quick Keys, Controls,
Session, and Overlays, three screens down on a Retroid. Now they come right
after the strip. Overlays follows because the HUD switch is the frequent tap,
then Controls and Session, then the full Quick Keys grid, then Sync and
Advanced. The three keys a handheld cannot press any other way, Esc, Meta, and
Alt + Enter, stay pinned in one row directly under the strip so reaching the
game's own menu never needs a scroll. The pinned row reuses the grid's own
action instances, so the grid stays the whole keyboard and both rows fire the
same key. This reverses the 1.4.3 order deliberately: keys-first assumed the
strip was enough, and it is not when the number is bad.

Slim was a pill with the frame rate and the round trip. It is now one line in
the MangoHud spirit: the health bar, the frame rate with its last minute drawn
beside it, then decode time, round trip, and bitrate, each with a 7 sp inline
label so two millisecond values are never told apart by position. The bitrate
drops its unit like Performance does. Minimal stays the sparse two-line card,
so the two modes stay distinct: Slim is about height, not about hiding data.

Debug gains a fourth row for the network. The decoder has reported packet loss,
round-trip variance, and the session's lost-frame count in every sample and no
HUD mode showed them. LOSS is the share of frames lost in the current window,
graded so zero is the only green: a trace reads "<0.1%" in warning rather than
rounding to a green-looking 0%, under one percent is a warning, one percent and
over is danger. JIT is the round-trip variance and reads "--" while there is no
round trip to wobble around. DROPS is the session's cumulative lost-frame count.

Source guards re-pin the new first-paint order (strip, pinned keys, Doctor,
Stream, Overlays, Controls, Session, Quick Keys, Sync, Advanced), the Slim
composition (sparkline plus DEC, RTT, BIT with inline labels, still no target,
autopilot text, breadcrumb, or stacked tiles), and the Debug network row. Unit
tests cover the pinned-key selection and identity, the Slim bitrate form, and
the loss grading and formatting edges.
@papi-ux
papi-ux merged commit e18b0bb into master Sep 6, 2026
6 checks passed
@papi-ux
papi-ux deleted the feat/command-center-hierarchy-slim-v2 branch September 6, 2026 21:00
papi-ux added a commit that referenced this pull request Sep 7, 2026
Matched client for Polaris 1.4.4. Everything on master since 1.4.3: Wake Host
(#284), the Command Center that leads with the verdict's explanation, the Slim
sparkline bar, and Debug's decode and network rows (#283, #285), the Stats
Overlay fix, and the honest Play and Doctor labels from this branch.

versionName 1.4.4, versionCode 46. The Unreleased section becomes the dated
1.4.4 section with a one-line summary and the same bullets, the store notes for
build 46 fit under 500 code points, and NovaReleaseMetadataTest pins all of it.

The label fixes in the same PR:

Three labels that stopped being true once the surfaces around them changed.

The library's Continue card said Resume whether or not the host was still running
the game. The kicker already told the truth (Continue, Live, or Watch) and the
summary said "Pick up where you left off", but the button promised a resume and
then launched. Resume now appears only while the host is running that game;
otherwise the button says Play. The Watch branch is unchanged.

The Doctor card led the Command Center after #285, and its first line of advice
repeated its own title: "Streaming telemetry looks ready" over "Try first:
Streaming telemetry looks ready. Keep this page open...". The host's first-try
line usually opens by restating the finding, so the state builder now drops that
opening sentence and keeps the advice that follows it. A first-try line that only
restates the title disappears rather than saying it twice; one that merely starts
with the same words as a longer word is left alone.

The Command Center subtitle still promised "Quick keys and controls" when Quick
Keys became the last panel. It now reads "Session controls for Private Stream" and
"Session controls for virtual display streaming"; the generic fallback reads
"Stream health, tuning, and session controls".

HonestLabelsSourceGuardTest pins the hero verb and the subtitles; the Doctor
dedupe has unit coverage for the repeated, bare, unrelated, and prefix-only cases.
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