Extract the status notification memo into a tested module

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>
5aed6fc12fSimone committed on 8/17/2026, 1:37:12 AMparent0671765
8 files changedLine totals unavailable