You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
Open Settings.
Open Test Centre.
Enable Recovery (Charge).
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.
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.
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.
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.
Finding
Confirmed independently on local
drift/metacommit032983d2bed9bf50dfcfc4d06ef707f3818cdc26and still present on upstreammainatb0d8a29fbc89836fc4257b9511af63629a2daa18.Android carries every Test Centre mode to
TestModeRow, but that row renders only title, status, blurb, switch, and Report. It never consumesmode.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
[recovery] charge day=2026-08-19 score=62.5 band=yellow.Expected: the active row shows
Last Charge breakdownandscore=62.5 band=yellow.Actual: the row remains title/status/blurb/Report only. The pure Android parser
TestReadout.lastChargeBreakdownhas no production call site. The same absence affects all declared live-readout IDs, not just Recovery.Evidence and provenance
TestCentreScreen:android/app/src/main/java/com/noop/ui/AppRoot.ktlines 443-447.TestCentreScreeniterates visible modes and passesmodeplus exported log text toTestModeRow:android/app/src/main/java/com/noop/ui/TestCentreScreen.ktlines 132-140.TestModeRowdoes not readmode.liveReadout: same file, lines 293-341.liveReadout = listOf("lastChargeBreakdown"):android/app/src/main/java/com/noop/testcentre/TestModeRegistry.ktlines 171-182.Strand/Screens/TestCentreView.swiftlines 511-539 and 673-687.e984f39aadded the Android Phase-2 live-readout IDs. Commit80ef2c4dadded Android Recovery/HRV parsers and tests but did not wireTestCentreScreen;fdce3270did wire the iOS UI.lastChargeBreakdownordering 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
liveReadout, from the same live/log source used by the report.