The status notify decision was inline in main.qml and covered only by static assertions that grep the source. That was enough to pin the shape of the code but not its behaviour, and twice in a row it let a wrong decision through: first an ongoing incident re-announced after a memo reset, then the opposite fault where an incident starting during a pending refresh was swallowed. NotificationMemo.js now owns the memo keys, the reset preservation rule, the carry-forward for a skipped provider, and the whole notify decision, as pure functions. main.qml keeps the memo property, the refresh-pending state, and the sendPlasmaNotification call, and delegates the rest. notificationRank and notificationStatusIncidentKey collapse into the module's severityRank and incidentKeyFromMemoValue. tests/tst_notification_memo.qml adds 17 behavioural tests, including the three end-to-end scenarios for a threshold change landing mid-refresh. Mutation-tested: wiping the memo on reset, dropping the silent first prime, and removing the carry-forward each fail named tests rather than a grep assertion. The static assertions that duplicated this logic now pin delegation instead, so a future reinline in main.qml still fails the suite. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Simone committed on 8/17/2026, 1:37:12 AMparent0671765
8 files changedLine totals unavailable