feat(leveva): message redaction deletes the chat-history line — P11 slice 275
Wire IRCv3 message-redaction (REDACT) to the slice-274 chat-history store:
an accepted channel `REDACT <chan> <msgid>` now deletes the stored line so
CHATHISTORY can never replay it. Closes the gap left by slice 274, where REDACT
was a pure relay and command/redact.rs still claimed "leveva keeps no message
history".
- history.rs: new History::delete_by_msgid(target, msgid) -> usize (DELETE WHERE
folded-target + msgid; no-op when disabled/unknown). Unit tests + a proptest
fuzzing an arbitrary redacted subset.
- command/redact.rs: delete in the channel CanSend::Ok arm only; refresh the
stale "no history" docstring (still a stateless authorization relay, but the
storage side now deletes).
- s2s/redact.rs: delete in the plain-channel inbound branch of apply_encap_redact
so each server drops its own recorded copy.
Load-bearing boundary: deletion mirrors recording (full-delivery only). A +z
op-moderated REDACT — local opmod broadcast and inbound @<chan> op-redirect — is
"shown to ops", never recorded, so never deleted. Nick/DM targets aren't channel
history.
Gate: history/command::redact/s2s::redact units; golden_chathistory end-to-end
(learn a msgid, REDACT it, re-query -> gone, sibling survives); two new
redact_proptest command-path fuzzes (random subset via real Session +
rejected-non-member-deletes-nothing). cargo clippy -p leveva --tests clean;
full cargo test -p leveva green.