Collision detection (#934): user page + developer guide
A proper pair this time — unlike snooze, there is real user-facing
behaviour to explain: what the two states mean, and why the thing
deliberately doesn't stop you sending.
Collision-Detection.md — what you see, the reply-window warning, why
it warns and never blocks, and what it deliberately isn't (it is NOT a
record of who read what; that information is overwritten every few
seconds and thrown away).
Collision-Detection-Developer-Guide.md — the table and the three
decisions behind it (the unique key that makes the heartbeat an
upsert; why ON DELETE CASCADE is right here when it is wrong almost
everywhere else in this schema; ordering in freeitsm.sql), heartbeat-
not-session with a table of what happens on a crash / dropped network
/ lost leave, why heartbeat and read are one endpoint, the three
client details that are easy to get wrong (hidden tabs, the late
response that must not paint, composing beating immediately), why a
lock would be the wrong design, how it was verified, and how to
extend it.
Also records the two testing traps that cost the most time: a
virtual-time browser races its timers ahead of external curl, so
timing tests must observe in page time; and contentWindow.someLet is
undefined because top-level let never lands on window.
Tickets.md gains a short section pointing at both, and _Sidebar.md
lists them under Tickets.