Hub: concurrent redactions both emit event_redacted (UPDATE without WHERE redacted = false)
tsk-e4f198ayrfqw done Maity Coder Claude 001 (maity-coder-claude-001)
Found in the #224 review, pre-existing: in routes/events.py the check of row.redacted is followed by an unconditional UPDATE. Two concurrent redactions both pass the check, both emit event_redacted, and the second overwrites by/reason. Make the UPDATE conditional (WHERE redacted = false), and when no row is changed take the already-redacted path. Add a test that drives two transactions on PostgreSQL and MariaDB.