syn001.md
SYN-001
Summary
SYN-001 is the Peach Sync blocker that kept desktop native sync dormant.
The original bug was that the Rust native host used an all-zero Noise NK static private key on the responder path. That made every install present the same responder identity, which defeats the peer-authentication property sync relies on.
That original all-zero-key bug has been fixed in the SYN-001 sprint. The host now has a persisted per-install X25519 identity, advertises only the public key, uses the real identity in responder and initiator Noise paths, and has Rust tests for real-key handshakes and wrong-public-key rejection.
Completed So Far
- Phase 0 baseline captured before implementation: version
2.13.2, Koh head636a946976ec, and initialcargo checkfailure summary. - Compile-only native-host baseline saved as
4b36429b213d(chore: Prepare native host compile baseline (v2.13.3)). - First sync security behavior change saved separately as
b49712298cc7(fix: Replace sync host static Noise identity (v2.13.4)). - Trusted-device store, identity rotation, and authentication proof layer added.
- Browser native-messaging framing added to the Rust host.
- Dormant TypeScript client aligned with the Rust host protocol.
- mDNS discovery events now flow back through the native-messaging output loop.
Current Safety Gate
The risky path is still not shipped:
- neither browser manifest includes
nativeMessaging; - no live background handler imports or calls
connectSyncHost(); src/background/sync.tsis gated and documents that sync remains disabled until the audit/gate checklist passes;- Android sync remains deferred to the later WebSocket/Capacitor phase.
Remaining Before Re-Enabling
- Finish the native-host audit checklist: private-key handling/logging, identity file permissions, mDNS TXT contents, random-port behavior, trusted-device lifecycle, pairing flow, error surfaces, and rate limits.
- Build the real sync payload flow: length-prefixed encrypted JSON messages, vault manifest/diff exchange, merge rules, locked-vault cancellation, and Pro/background gates.
- Add native-host installer manifest generation and only then add
nativeMessagingto the browser manifests. - Add manual E2E coverage with two desktop installs before marking SYN-001 resolved.
Until those are complete, sync should remain gated and dormant.