Skip to content

Android Test Centre renders none of the registry live-readout panels #82

Description

@bhelm

Finding

Confirmed independently on local drift/meta commit 032983d2bed9bf50dfcfc4d06ef707f3818cdc26 and still present on upstream main at b0d8a29fbc89836fc4257b9511af63629a2daa18.

Android carries every Test Centre mode to TestModeRow, but that row renders only title, status, blurb, switch, and Report. It never consumes mode.liveReadout. The Android registry advertises 16 live-readout IDs across nine modes, yet Android production code has no renderer for any of them.

Product path

  1. Open Settings.
  2. Open Test Centre.
  3. Enable Recovery (Charge).
  4. Let the recovery-tagged log contain a valid line such as [recovery] charge day=2026-08-19 score=62.5 band=yellow.

Expected: the active row shows Last Charge breakdown and score=62.5 band=yellow.

Actual: the row remains title/status/blurb/Report only. The pure Android parser TestReadout.lastChargeBreakdown has no production call site. The same absence affects all declared live-readout IDs, not just Recovery.

Evidence and provenance

  • Android navigation reaches TestCentreScreen: android/app/src/main/java/com/noop/ui/AppRoot.kt lines 443-447.
  • TestCentreScreen iterates visible modes and passes mode plus exported log text to TestModeRow: android/app/src/main/java/com/noop/ui/TestCentreScreen.kt lines 132-140.
  • TestModeRow does not read mode.liveReadout: same file, lines 293-341.
  • Recovery declares liveReadout = listOf("lastChargeBreakdown"): android/app/src/main/java/com/noop/testcentre/TestModeRegistry.kt lines 171-182.
  • iOS renders domain panels for every active mode and calls the Recovery parser: Strand/Screens/TestCentreView.swift lines 511-539 and 673-687.
  • Registry provenance: commit e984f39a added the Android Phase-2 live-readout IDs. Commit 80ef2c4d added Android Recovery/HRV parsers and tests but did not wire TestCentreScreen; fdce3270 did wire the iOS UI.
  • Upstream PR Test Centre Recovery reads "no score" while Charge is fine (#343) ryanbr/noop#360 is related provenance: it fixed lastChargeBreakdown ordering on both platforms and describes the panel, but it did not add the missing Android UI wiring. It is not a duplicate of this issue.

Severity and routing

P1 for the cross-platform Test Centre acceptance boundary: an entire advertised diagnostic surface is absent on Android. This is diagnostic-only; it does not alter Charge, HRV, or stored health data.

This is a production-code defect. Per fork policy, the implementation should be proposed upstream in ryanbr/noop; this fork issue tracks the confirmed finding and its disposition.

Required red test

Add an Android Compose/product-path test that renders an active Recovery row with the tagged recovery line above and asserts that both the label and parsed value are visible. It must fail on the unchanged product path before the fix. A source-string guard is not sufficient unless executable Compose test infrastructure is genuinely unavailable.

Acceptance

  • An active Android Test Centre row renders every ID declared in that mode’s liveReadout, from the same live/log source used by the report.
  • The Recovery red test passes with the exact parsed score/band.
  • Coverage proves all 16 currently declared IDs are mapped; an unknown future ID fails visibly in tests instead of disappearing silently.
  • Inactive rows remain compact and do not perform live-readout work.
  • Existing capture/report behavior remains unchanged.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions