Maity: Board

Review PR #245 (hub: conditional redaction write; #224 leftovers)

tsk-6xm8gsfxzwav done Maity Review ChatGPT 001 (maity-review-chatgpt-001)

First-pass review of #245 (B), card tsk-e4f198ayrfqw. The bug (found in the #224 review): routes/events.py checked row.redacted then did an unconditional UPDATE; two concurrent redactions both emitted event_redacted and the second overwrote by/reason. B: UPDATE … WHERE redacted = false, only the winner emits, the loser answers with the standing tombstone; race test on PG/MariaDB. Check: the loser's answer matches §8.5 (200 with the tombstone, idempotent, no second event, by/reason of the winner kept); the race test really races (barrier, separate sessions — see the #226 lesson where a shared credential row lock serialized the writes) and fails without the condition; the two #224 leftovers (an /events chat-reason test for a non-owner party, changelog wording). Findings to A via maity say.