f6f753c45a
`persistTurn` and `persistMessages` stored the whole `messages` array they were handed. The array is the snapshot the turn started from, so anything another process appended in between was deleted: a wake delivery, a watch consent record, or the terminal card of an investigation the stale sweep had just settled. That last one is unrecoverable — the row is already terminal, so the sweep never selects it again, and the panel is back to "Working…" for ever. Both writes now read the row under `select ... for update` inside the transaction and merge by stable message id: incoming order is kept, a stored message the snapshot does not have goes at the end, and no id appears twice. A message with no id falls back to its content so it cannot be carried over twice. An append-only `chat_messages` table is the better long-term shape; merging under the lock is enough for this architecture and needs no migration.