Greptile r1 on #133283:
- #7: the "recovered" timer started an un-awaited send; if the store failed again while that
send waited on profile loading or its transport, the outage notice could land first and the
stale "recovered" last. Notices for a store now go through one asyncio.Lock in transition
order and re-check the store at delivery, so a notice that no longer matches is dropped and
the outage notice stays the last word.
- #6: t() ran before entering the owning profile's runtime scope, so a secondary profile's home
channel got the launch profile's display.language. The message is now rendered inside that
scope.
- #8: the notice test shortened the window to 0.05 s and slept 0.2 s, against tests/AGENTS.md
(no quiet-runner timing). It now uses a zero window and drains the loop until no timer or send
remains, holds a delivery open with an asyncio.Event to drive the flip-during-send case, and
asserts the full notice sequence.