Raise / ack / resolve all rendered with the same title and body on
ntfy and SMTP, so a recovery looked identical to the original alert.
Webhook was already fine because the JSON envelope carries 'event'.
ntfy:
Title '[raised · warning] dev backup_failed' (was '[warning] …')
Tags 'raised,warning,backup_failed' (was 'warning,backup_failed')
Body 'Resolved · <message>' / 'Acknowledged · <message>' on those events
SMTP:
Subject '[restic-manager] [raised · warning] dev: backup_failed'
Plus: cmd/_fake_alert now accepts the ref as a positional argument
(go run ./cmd/_fake_alert steve-001) instead of silently ignoring
unknown positional args. Refuses ambiguous '-ref X positional Y'.
Fixes flagged in spec review of f0a323e: ntfy POSTs need explicit
Content-Type: text/plain (the spec calls for it; ntfy works without
but explicit beats inferred); trim trailing slashes from server URL
to avoid double-slash when operators paste 'https://ntfy.sh/'.