cross-impl: live Python-publishes -> TS-restores relay round trip

Phase F starts the in-process NIP-01 relay, has the real Python NostrClient
publish a chunked snapshot to it, then restores that snapshot with the TS
CLI on a clean profile and checks the secrets survive.

It immediately caught a genuine restore bug: Python's index files wrap the
ciphertext in a kdf/ct JSON envelope, and a published snapshot carries
whatever the local file held. TS decrypted the fetched bytes directly, so
it failed on anything Python published -- invisible to the TS-only tests
because TS writes bare ciphertext. Restore (and delta replay) now parse the
wrapper first, exactly as decrypt_and_save_index_from_nostr does.

Regression test in relay.test.ts publishes a wrapper-format payload through
a live relay and restores it.

Cutover plan updated: gate 4 (sync protocol) now cites this end-to-end
evidence, and gate 5's remaining list drops SSH and migrations.

171 core + 46 CLI tests green; 19/19 cross-implementation checks green.

Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
thePR0M3TH3ANandClaude Fable 5 committed 2026-08-14 16:24:56 -04:00
1 parent 1eee053ff0
commit 3ebaced2e3
5 files changed
+173 -11

No files matched your search

+9 -8
View File
@@ -42,19 +42,20 @@ P0 gate is green, Python remains the normative reference
4. **Sync protocol is compatible.**
Evidence: event ids cross-verified against rust-nostr fixtures; snapshot
chunking/manifest/delta parity; live relay round trip in
`js/packages/core/test/relay.test.ts`. **Green.**
Remaining: a live Python-publishes → TS-restores test through one relay
(currently each side is tested against the shared protocol, not against
the other end to end).
`js/packages/core/test/relay.test.ts`, plus a live end-to-end round trip
in cross-impl phase F: Python publishes a snapshot through a real relay
and the TS CLI restores it with secrets intact. **Green.**
5. **Feature parity for real daily use.** **Partial.** Missing:
- SSH and PGP key material (entries round-trip; derivation not ported)
5. **Feature parity for real daily use.** **Partial.** Remaining:
- PGP key material (entries round-trip; derivation not ported — highest
parity risk, PGPy serialization)
- document import/export commands
- index schema migrations 0→3 (TS refuses old indexes rather than
migrating them — safe, but a Python user with an old profile is stuck)
- `semantic` and `api` command groups (deliberately deferred; decide
whether they block cutover or ship post-cutover)
Done since this list was written: SSH key derivation (PEM byte-for-byte)
and schema migrations 0→4, so legacy Python profiles now open in TS.
6. **Packaging and distribution exist.** Not started. Needs: an installable
artifact (npm bin, single-file build, or both), checksums and signatures
matching the release-integrity workflow, and updated install docs.
+1 -1
View File
@@ -51,7 +51,7 @@ until a later milestone.
| Environment | Status |
|---|---|
| Node 22 (vitest) | green — 170/170 core + 44 CLI |
| Node 22 (vitest) | green — 171/171 core + 44 CLI |
| jsdom browser-like env | green — 148/148 core (3 transport tests Node-only) |
| Real Chromium/Firefox (vitest browser mode) | todo — lands with Milestone 6 web app CI |