Review follow-up on the one-shot state.db -> shared-state.db import (#109775):
- A room id present in both stores is skipped as a unit. Grafting the
legacy events under the store's own room left next_seq behind MAX(seq)
and every later append_event collided on (room_id, seq).
- Columns only the target has are selected with the same defaults the
in-place column migration applies ('legacy' authority, epoch 1, legacy
actor json), and room-scoped tables use a plain INSERT under a
savepoint. INSERT OR IGNORE used to swallow the NOT NULL violations of
a pre-Sep-2 layout, drop every row and still record the marker with
rooms=0. event_bytes is backfilled for the copied rooms.
- An unreadable or refused legacy store is remembered per process, so
the warning fires once and the retry happens on the next start instead
of on every poll.
- The import lives in gateway/hosted_rooms_legacy_import.py; the facade
keeps only the _connect seam.