> **Audience:** Next session (you, Scarlett, Bishop, Neo, future Claude), and anyone resuming the iOS E2EE work
This memo captures the state of iOS↔Android end-to-end encryption parity as of the end of session 2026-06-28. It documents **what shipped, what's pending, and how to resume**.
---
## TL;DR
Eight iOS E2EE batches landed on `dev` between Batches 1–8 (commit `faac40a` → `763ca0c`). All iOS crypto primitives, the invite-pairing flow, sealed-answer path, keybox envelope, and the server-side `wrapReleaseKeyCallable` Cloud Function are in place. The schemaVersion 2 daily-answer path is **byte-compatible with Android** after the Batch 5 AAD fix. The Android instrument harness and `capture_android_canonical_vectors.sh` script are ready to fill the `TODO_ANDROID_RUN` fixture placeholders the moment a paired macOS + Android emulator + iOS simulator host is available.
The remaining work is **infrastructure-dependent** and cannot be completed from a Linux coordinator box. Runbook and rollback plan are documented in `iphone/Closer/Crypto/SPEC.md` §19.
After this completes, the `SealedAnswerCryptoTests.testCanonicalJSONByteStability` and `CoupleEncryptionManagerTests.testArgon2idKnownVector` tests will start asserting real cross-platform vectors instead of skipping.
### 2. Deploy `wrapReleaseKeyCallable`
**Purpose:** enable iOS↔Android sealed-answer key release (currently the keybox Path A gap).
- Both reveal atomically; commitment verifies; tamper is detected.
### 4. SchemaVersion 3 promotion (deferred per decision doc)
Currently schemaVersion 2 is the daily default on both platforms. SchemaVersion 3 (sealed/partner-proof) is implemented and tested, but only used for thread answers. Per `SCHEMA_VERSION_DECISION.md`, promotion to schemaVersion 3 as the daily default is **recommended after** items 1–3 above are complete. Migration path: per-doc `schemaVersion` field allows mixed-version couples (one on v2, one on v3) without migration.
### 5. Build verification on Mac
`swift build` cannot run on this Linux host (Apple frameworks + libsodium headers unavailable). The authoritative compile is macOS/Xcode. After items 1–3 land, run:
There is nothing useful to ship until Mac/CI is available. Suggest pivoting to:
- **Scarlett** for SwiftUI design polish on the iOS screens (`iphone/Closer/Theme/`, `iphone/Closer/Components/`, screen views).
- **Bishop** for build verification and CI scaffolding.
- A different workstream entirely.
---
## Known caveats
- **Single-device limitation** (matches Android): a user logging in on a new iOS device after deployment has no couple key until they re-enter the recovery phrase. This is documented in the recovery-phrase UI but may surprise testers.
- **Recovery phrase entry is irreversible** — wrong phrase = unrecoverable. Document in QA briefing.
- **Android `releaseKey.publicKey` read rule** was NOT verified by Neo or Ripley during this session. The Cloud Function reads `users/{recipientUserId}/devices/primary.publicKey` with Admin SDK (rules bypass), but the Android client-side read for the partner path was not confirmed. **Recommend a manual device check before relying on this in production.**
- **Linux cannot verify iOS builds.** All static review is best-effort; the authoritative compile is macOS/Xcode.