make test-hidden reports a leaked thread from the wizard stress case. The suite still
passes, so this is a warning rather than a gate, but the listener's own text names the
consequence:
[ISOLATION-LEAK] test "Wizard stress: bounce step 2 <-> 3" leaked 1 thread(s): 8 -> 9
(likely an unjoined hv::EventLoopThread -> later UAF crash)
Why it is worth a ticket rather than a shrug
An unjoined hv::EventLoopThread outliving the test that made it is the same shape as the
WiFi backend leak fixed in test_home_widget_teardown_uaf.cpp: a worker with no join site,
alive while later tests run and while exit handlers tear down globals it still touches.
That one surfaced as a ThreadSanitizer failure in the nightly. This one has not surfaced
yet, which is the argument for chasing it before it does rather than after.
make test-hidden is the only suite that sees this class at all - test-run and
test-all shard the binary and report the Catch2 summary, so a crash after that summary
prints still reads green.
Needs
Find the owner of the thread, give it a join site that actually runs, and confirm the
listener's count returns to its baseline. If the thread is deliberately detached, say so
where the code creates it so the next reader does not re-chase this.
Seen while sweeping CI failures on 2026-09-08.
make test-hiddenreports a leaked thread from the wizard stress case. The suite stillpasses, so this is a warning rather than a gate, but the listener's own text names the
consequence:
Why it is worth a ticket rather than a shrug
An unjoined
hv::EventLoopThreadoutliving the test that made it is the same shape as theWiFi backend leak fixed in
test_home_widget_teardown_uaf.cpp: a worker with no join site,alive while later tests run and while exit handlers tear down globals it still touches.
That one surfaced as a ThreadSanitizer failure in the nightly. This one has not surfaced
yet, which is the argument for chasing it before it does rather than after.
make test-hiddenis the only suite that sees this class at all -test-runandtest-allshard the binary and report the Catch2 summary, so a crash after that summaryprints still reads green.
Needs
Find the owner of the thread, give it a join site that actually runs, and confirm the
listener's count returns to its baseline. If the thread is deliberately detached, say so
where the code creates it so the next reader does not re-chase this.
Seen while sweeping CI failures on 2026-09-08.