| … | … | @@ -11,8 +11,14 @@ this session was flaky-link/concurrency-specific — see the session memories). |
| 11 | 11 | indexer topology (keet-correct) · revocation · firehose (`#commit` frames + `subscribeRepos`). But it |
| 12 | 12 | was built with SIMPLIFICATIONS that must close before it can replace StateBaseV3 for a REAL co-owned DID. |
| 13 | 13 | |
| 14 | | ## PHASE 0 — close the atproto-base gaps (all OFFLINE, extend the test suite). BLOCKING. |
| 15 | | Grounded in atproto-room/lib/state-base.js (the god-class being replaced): |
| 14 | ## PHASE 0 — close the atproto-base gaps (all OFFLINE, extend the test suite). ✅ COMPLETE (2026-07-23). |
| 15 | All five closed + tested (28 tests / 121 asserts green): #1 deterministic base key (roomSeed election, |
| 16 | forceCreator/forceNonCreator), #2 members-only encryption (roomSeed-derived), #3 keet-attestation |
| 17 | admission (injectable attest/verifyAttest), #4 repo-for-bridge projection (getRepo/repoKey via inline |
| 18 | RepoProjection — atproto-store RepoStore instanceof fails across duplicated corestore copies), #5 |
| 19 | migration reader (importRepo+adoptHead, chain continues unbroken past the adopted head). atproto-base |
| 20 | can now stand in for a real co-owned StateBaseV3 DID. Next entry point = PHASE 1. |
| 21 | Original grounding notes (atproto-room/lib/state-base.js, the god-class being replaced): |
| 16 | 22 | 1. **Deterministic base key.** StateBaseV3 derives the autobase base key from a members-only |
| 17 | 23 | `roomSeed` (`deriveGsKeyPair(roomSeed, GS_NAMESPACE)` → `deriveBaseKey`) so every co-owner opens the |
| 18 | 24 | SAME base. atproto-base currently uses corestore-derived keys + explicit `bootstrap`. Port the |