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
discovered=true + last_nonempty_at populated = tile renders as "fast / fresh", indistinguishable from a real working collector. But there is no ARM thermal hardware on this host — the collector should either:
Discover false — return False from discover() on hosts without ARM thermal zones (matches discover() invariant in adapters/collectors/CLAUDE.md).
Sample empty — return {} from sample() so last_nonempty_at stays None, signalling "no data" via the very mechanism PR Track last non-empty adapter samples #17 introduced.
Currently it does neither: discover=True + non-empty sample() output, yet the underlying hardware is absent.
Symmetric analogue: rapl.py:113-133 (correct pattern — registers but yields no values when energy_uj unreadable, last_nonempty_at stays None)
Acceptance
coolstep adapters and /api/adapters should distinguish "arm_thermal absent" from "arm_thermal present and contributing". Either gate at discover() (cleaner) or return empty sample() (less invasive). Pick whichever matches the project preference encoded in the rapl false-positive precedent.
Surfaced by PR #17 (
last_nonempty_atper-collector visibility, v0.5.18).Symptom
On a Ryzen 9 7940HS laptop (no ARM thermal zones present),
/api/adaptersreturns:{"name":"arm_thermal","discovered":true,"sample_us":0,"last_nonempty_at":1779610759.5733576,...}discovered=true+last_nonempty_atpopulated = tile renders as "fast / fresh", indistinguishable from a real working collector. But there is no ARM thermal hardware on this host — the collector should either:Falsefromdiscover()on hosts without ARM thermal zones (matchesdiscover()invariant inadapters/collectors/CLAUDE.md).{}fromsample()solast_nonempty_atstaysNone, signalling "no data" via the very mechanism PR Track last non-empty adapter samples #17 introduced.Currently it does neither:
discover=True+ non-emptysample()output, yet the underlying hardware is absent.Where to look
coolstep/adapters/collectors/arm_thermal.py—discover()predicatecoolstep/adapters/collectors/arm_thermal.py—sample()return shaperapl.py:113-133(correct pattern — registers but yields no values whenenergy_ujunreadable,last_nonempty_atstaysNone)Acceptance
coolstep adaptersand/api/adaptersshould distinguish "arm_thermal absent" from "arm_thermal present and contributing". Either gate atdiscover()(cleaner) or return emptysample()(less invasive). Pick whichever matches the project preference encoded in the rapl false-positive precedent.