c6745da72b
Resolves the room-lifecycle class on top of the salvaged #89369 projection: - v3 projection keys rooms by immutable roomId (id:<roomId>) with name:<name> fallback for legacy rooms; v1/v2 envelopes are normalized on read so mixed-version fleets share one merge path - rename is now a same-key field update — no distributed delete+create, no old-name resurrection from lagging gateways - id tombstones are FINAL (ids are never reused), so a gateway that was offline during a disband can never resurrect the room, regardless of the revision its stale copy carries; same-name recreation is unaffected because it mints a fresh roomId - the projection fans out to EVERY reachable default-profile gateway (per-gateway job queues, CAS revision streams, backoff and retry caps), so rooms survive any single gateway dying and surface on gateway-only clients without waiting for a Desktop to foreground that gateway - cold hydrate follows a remote rename via roomId instead of duplicating the room under both names New tests: id-keyed rename continuity, final id-tombstones vs lagging high-revision copies, rename-job shape (changed+deleted same key), cold-hydrate re-keying, multi-gateway fan-out. Sabotage-verified: each new test fails against the pre-class behavior.