Summary
On eink-0167 (eink factory target 25 + PR #38 watchdog), after ~3h of Wi-Fi-connected uptime the board became undiscoverable over BLE from the lab host, while BlueZ still reported ActiveInstances=1. A systemctl restart improv immediately restored a fresh, discoverable advertisement.
This is an on-air / "ghost advertising" state: the advertisement is registered (so is_advertising() looks healthy) but nothing is actually radiating. The current watchdog (PR #38) only recovers from registration drops / stack wedges (ActiveInstances==0 or unresponsive D-Bus), so it cannot detect or recover this case.
Evidence
- Reproduced once at ~3h uptime, Wi-Fi connected.
ActiveInstances=1, improv.service healthy, no errors in journal; XPS scanner saw nothing until a service restart.
- Earlier 48-min soak (Wi-Fi on, idle + saturated, both bands, serial-driven) was 24/24 discoverable, 0 misses — so this is a long-uptime effect, not reproducible in short runs.
- With Wi-Fi OFF, advertising has been 100% reliable over long soaks (primary fresh-onboarding path is unaffected). Points at Wi-Fi/BT coexistence on the shared IW612 radio (shared-antenna topology) as a contributing factor, though the ghost state has also been seen around aborted BLE connects / fresh boot with Wi-Fi off.
Impact
Affects re-onboarding an already-provisioned board (Wi-Fi up). Fresh factory onboarding (Wi-Fi off) is unaffected. Onboarding must never depend on a manual restart, so this needs a self-healing fix.
Mitigation in progress
A parallel "ghost-advertising bounce" (ADVERT_BOUNCE_SECS, default 60s) is WIP on the chore/layer-tidy branch: it periodically re-asserts (unregister + re-register) the advertisement even while BlueZ reports it active, since ActiveInstances can't tell us whether the advert is truly radiating. A bounce is a sub-second re-register gap, skipped whenever a central is mid-session. This needs to be reconciled with PR #38's Bugbot-fixed watchdog (the two watchdog lines have diverged) and then soak-tested at multi-hour uptime.
Follow-ups
Related: meta-dynamicdevices PR #38 (watchdog), PR #41 (Device-Status superset).
Summary
On
eink-0167(eink factory target 25 + PR #38 watchdog), after ~3h of Wi-Fi-connected uptime the board became undiscoverable over BLE from the lab host, while BlueZ still reportedActiveInstances=1. Asystemctl restart improvimmediately restored a fresh, discoverable advertisement.This is an on-air / "ghost advertising" state: the advertisement is registered (so
is_advertising()looks healthy) but nothing is actually radiating. The current watchdog (PR #38) only recovers from registration drops / stack wedges (ActiveInstances==0or unresponsive D-Bus), so it cannot detect or recover this case.Evidence
ActiveInstances=1,improv.servicehealthy, no errors in journal; XPS scanner saw nothing until a service restart.Impact
Affects re-onboarding an already-provisioned board (Wi-Fi up). Fresh factory onboarding (Wi-Fi off) is unaffected. Onboarding must never depend on a manual restart, so this needs a self-healing fix.
Mitigation in progress
A parallel "ghost-advertising bounce" (
ADVERT_BOUNCE_SECS, default 60s) is WIP on thechore/layer-tidybranch: it periodically re-asserts (unregister + re-register) the advertisement even while BlueZ reports it active, sinceActiveInstancescan't tell us whether the advert is truly radiating. A bounce is a sub-second re-register gap, skipped whenever a central is mid-session. This needs to be reconciled with PR #38's Bugbot-fixed watchdog (the two watchdog lines have diverged) and then soak-tested at multi-hour uptime.Follow-ups
chore/layer-tidybounce work withmain's PR python3-improv: self-healing BLE advertising watchdog (imx93-jaguar-eink) #38 watchdog, land as a focused PR.Related: meta-dynamicdevices PR #38 (watchdog), PR #41 (Device-Status superset).