Prime Radiant receipts · All receipts
PR-10: The Seven Seas, and a closer machine serves
In plain language: Two computers on one home network found each other with no central server, each picked the nearest holder of a file by its address, checked every byte against that address, and when a copy was wrong (on purpose, for the test) they caught it and used the other holder. The notice board for computers on different networks is written and tested, not deployed.
The full receipt follows, as written: method, every limit and incident, and the SHA-256 of every input and output file. File locations are shown by file name only.
Built 2026-10-05T05:00Z by a W005 build helper (Claude, seat BM07) on M0. Live run 2026-10-05T04:51:11Z to 04:53:09Z (2026-10-04 23:51 Central). The Founder's words, relayed by W005: "we have the Seven Seas, so turn it on"; "a closer machine serves it instead"; no central database ("will cost me millions"); about $5 a month for a Cloudflare Worker as a bootstrap, on his existing account; M2 treated as if on a different network, joining voluntarily, reached by Socceri addressing. "MiB" means 1,048,576 bytes.
What was proven, in plain language
Two machines found each other with no central database, and the closer copy of a file was used, checked, and replaced when it was bad.
- Finding each other. Neither machine was told the other's address. Each one sent a signed "here I am" card on the home network, and each one also posted that card on a small notice board (the code for the Cloudflare Worker, run on M2 for the test). Each machine found the other both ways: on the network and on the notice board. Every card was checked against the key that signed it before it was used.
- Joining is voluntary. For the first 8 seconds M2 had not joined. In that time it sent nothing, posted nothing and ignored the 6 messages M0 sent it. M0 first saw M2 only after M2 joined.
- Who has this file? M2 asked, by address, who holds each of 50 public files. For all 50, two holders answered: M2 itself and M0.
- (i) Closest first. M2 used its own copy every time (50 of 50), and every copy was byte-exact.
- (ii) When M2's copy was not there, M0 served it instead: 10 of 10 byte-exact, including the 10.6 MB signed Windows launcher (0.64 s).
- (iii) Bad copies were caught. When M2's own copy had one bit changed, the check caught it and M0's copy was used. When M0 was made to send one wrong bit on purpose, the check caught it and M2's own copy was used. Both times the right bytes arrived.
- Every connection between the machines started with the Thorax handshake (both keys checked) and was encrypted. 14 of 14 real connections passed it; 1 connection with a wrong key on purpose was refused.
- Everything outside the rules was refused, 6 of 6: a wrong key, a call-back address the requester had not signed, a stranger, a forged signature, and (asked two ways) a file M0 holds but did not offer.
The line that is safe to publish: two computers on one home network found each other with no central server, each picked the nearest holder of a file by its address, checked every byte against that address, and when a copy was wrong (on purpose, for the test) they caught it and used the other holder. The notice board for computers on different networks is written and tested, not deployed.
Condition (the caveat wins)
- Scale. One pair of machines, M0 (M0) and M2 (M2), on one home LAN, in one run of about 60 seconds, with 50 files totaling 18,690,102 bytes. M3 was off.
- "Different network" was by rule, not by wire. No shared drive, no WinRM in the data path, no address of M0 in M2's settings, and M2 joined by its own consent. Physically both are on the same LAN. Nothing crossed the internet.
- The Cloudflare Worker was NOT deployed. The notice board in this run was the unchanged
worker.jsrunning under plain Node on M2 (a temporary port), with a memory stand-in for Workers KV and the rate limiter. It has never run on Cloudflare. - "Closest" here means "same machine first, then lowest measured round trip". With one remote holder there was no contest between two remote holders. M0's round trip was 1.3 to 2.3 ms (median 1.6 ms over 50 asks).
- Trust model. A node's key comes from its signed card (trust on first verified card), not from a list made ahead of time. A stranger with a valid card on the same topic would be accepted as a peer. What protects the person: content is checked by its address (SHA-512) and sha256, and each holder serves only its own signed consent list. There is no membership check in this test; the Conduit's real Seven Seas uses a signed membership attestation (see "The switch" below).
- Forward secrecy: none, same as PR-8 (Thorax relay v2 is static-to-static with a fresh salt per frame).
- This is not the Conduit app and not the Founder's Conduit (its port was not touched). It is test code built from the estate's own pieces.
The switch: why the Seven Seas is off in the Conduit, and what this test did instead
Read first: Conduit seven_seas.cjs, seven_seas_mount.cjs, conduit_public.cjs lines 235 to 253, net_reach.cjs, card_share.cjs line 887.
- In the Conduit, the Seven Seas starts only when both are true: (1) the Conduit holds a membership attestation signed by the production key pinned in the build (handed out by the
seven-seas-attestfunction after a paste of a request code on the membership page), and (2) the meeting network (HyperDHT,reach) is allowed (settings.meetingNetwork !== falseandCONDUIT_NO_MEETING_NETWORKnot1).CONDUIT_TEST_DHT_BOOTSTRAPpoints it at a loopback test network only. - Turning that on for M2 would have needed a real member attestation from the live function. I did not do that, and I did not edit the frozen release candidate
CONDUIT_WT_W005_034. - Instead, this test proves the pieces the Conduit's Seven Seas does not have yet, with test keys: LAN discovery, a bootstrap list, "who has address X" with several holders, closest first, and fall back on a bad copy. The Conduit's own design says there is no relay and no server carrying cards; the Worker here keeps that rule: it carries signed cards about nodes, never content.
- Prior art reused or followed: Thorax relay v2 and the PR-8 handshake glue (unchanged, same hashes as PR-8); Conduit
connector.cjsSocceri addressing (unchanged); the LAN beacon idea from mnemosyneconstellation_discovery.ts(UDP beacon, signed frames). Searches for existing bootstrap, rendezvous, Kademlia, multicast and Cloudflare Worker code (disk grep andpheromone_query) found no rendezvous board; the only "Cloudflare Worker" yoke (BP085) is marked SUPERSEDED.
Nodes and keys
| item | value |
|---|---|
| M0 | host M0, M0, Node v24.11.0, free RAM 6,381 MB at start |
| M2 | host M2, M2, Node v24.16.0, free RAM 24,043 MB at start |
| M0 test key, Hex Connector | d6372eecb172249a0e22e7a5284e95cb (full Socceri in m0_keygen_stdout.json) |
| M2 test key, Hex Connector | 5c0aaa84c5cabb09e4a10833c24a3675, made on M2; the private key stayed on M2 |
| keys pinned out of band | none. Each side learned the other's key from the signed card it discovered. Both are new test keys, not the Founder's MnemosyneC keys and not the PR-8 keys. |
| topic | pr10-seven-seas-test |
| M0 consent manifest | 50 records, 18,690,102 bytes, seal 846756d8...87e6f2, file sha256 0de39ab7...7dd503, signed by M0's key |
| M2 consent manifest | the same 50 addresses (same seal 846756d8...87e6f2), signed by M2's own key, file sha256 1fe7a0ad...6524d |
Where the 50 files came from
m0_build_stores.cjs took them from tonight's PR-8 signed consent manifest (its signature was verified first): the 20 largest records plus the 30 lowest-address records between 1 KB and 200 KB. Each file was re-hashed against the PR-8 manifest (Socceri, sha256, size) and scanned again for secret patterns (0 hits, 0 dropped). The copies went to M2 over the WinRM setup channel, not the data path. After the run, all 50 files in M2's store still matched the selection by sha256.
Test sets (picked by code before the run): W, 10 records whose local copy M2 moved aside (the 5 largest and 5 small ones); Y, 1 record whose M2 copy was corrupted; Z, 1 record M0 was told to corrupt when serving.
How it works (the protocol)
- Node card. Each node signs a card: key, Socceri address, Thorax X25519 announcement, reach list (UDP address; for M2 also its TCP listener; M0 says "dial-out only"), the sha256 and seal of its own consent manifest,
consent.joined: true, and a 5-minute expiry (seas_record.cjs). A card is used only if the Socceri address derives from the key, the signature holds, it has not expired, andjoinedis true. - Discovery (a): LAN. Every 2 s each joined node sends HELLO with its card to multicast a local multicast group on a temporary port and to the subnet broadcast. A node that hears a valid HELLO answers the sender with its own card (HELLO_ACK).
- Discovery (b): bootstrap list. Every 2 s each joined node posts its card to each bootstrap address and reads the newest cards back (
worker.js). - Who has X. The requester sends a signed WHO_HAS to every peer it knows; a holder answers with a signed HAVE (sha256, size) only if X is in its own consent manifest. The requester adds itself if it holds X, measures each remote holder's round trip (signed PING/PONG, median of 3), and tries holders in order: own copy first, then lowest round trip.
- Transfer. The requester sends a signed CALL_ME naming a TCP listener from its own signed card. The holder dials back only to that address, and only if it is also the UDP source of the request. Then the Thorax handshake runs with both keys taken from the verified cards, and the file travels sealed.
- Check on arrival. SHA-512 of the bytes must equal the address; sha256 and size must match; the holder's signature over {address, sha256, size, holder} must verify. Any failure: next holder.
Results
Discovery
| LAN multicast | LAN broadcast | LAN answer (HELLO_ACK) | bootstrap list | |
|---|---|---|---|---|
| M2 found M0 | 04:51:30.828Z | 04:51:30.829Z | 04:51:30.830Z | 04:51:30.836Z |
| M0 found M2 | 04:51:31.738Z | 04:51:31.739Z | 04:51:31.743Z | 04:51:33.756Z |
- M2 joined at 04:51:30.836Z. Before that (04:51:22.807Z to 04:51:30.822Z) M2 sent 0 messages, saw 0 peers, and ignored 6 incoming messages. M0 first saw M2 after the join: true.
- M2's settings file (
m2_config.json) contains no192.168address: checked by code. The only address in it is its own loopback notice board. M0's only configured address is the notice board's (the stand-in for the Worker's URL); every node-to-node address came from a signed card. - Bootstrap only: M2 fetched one file from M0 using ONLY the card that came from the notice board (UDP address taken from that card): 5,354 bytes, byte-exact, holder signature verified, Thorax session bff447c2...89d2b4.
(i) Closest holder first: 50 of 50
| measure | result |
|---|---|
| addresses asked | 50 |
| two holders answered (M2 itself and M0) | 50 of 50 |
| M2's own copy chosen | 50 of 50 |
| byte-exact (sha256 equals the selection) | 50 of 50 |
| M0 round trip | min 1.288 ms, median 1.597 ms, max 2.305 ms |
(ii) Local copy withheld: M0 serves, 10 of 10
| path | bytes | sha256 | ms | MiB/s | byte-exact |
|---|---|---|---|---|---|
| public_release/0.3.2/MnemosyneC-Conduit/Start Conduit.exe (signed launcher) | 10,626,440 | 895ea642d29346244954455919f66b2b092fb19677fa49050eb56a48bd648fa5 | 636.3 | 15.93 | yes |
| src/hard_mode_pool.gz.hex | 4,413,038 | 7f1328582e7af0012eef500d3135b1323773efead75ecd3050cf271cc8aae58a | 161.2 | 26.10 | yes |
| public_release/0.3.2/.../recall_package_700/questions_300_nogold.json | 500,363 | 2eebe4acdda6130436f54ce5a0442de709c0798996b61da9a451ed92bf3e199d | 25.8 | 18.53 | yes |
| src/showme/showme_cards.jsonl | 322,487 | c99cdc935504a31bba250edcd91e8dd9664d27fa677e6689602f20803ccd91f4 | 23.4 | 13.15 | yes |
| public_release/0.3.2/.../proof/CARD_INDEX.json | 293,437 | 6c090fea3a2f2497a84aca1cc8bdab961d0d222cfd5bb0890da9a8647d5bf071 | 19.6 | 14.25 | yes |
| src/liana_cycle.cjs | 5,354 | 53e591837f0290b8342d53ad50079710f03f186dabfbf0ecac9ec2b9607b9a4c | 24.5 | 0.21 | yes |
| public_release/0.3.2/.../cards/maze_qid7917_b4_maze_input.json | 2,257 | 3ed75867aa501073900888244edd5cb956b44dfa604473b881de6c1bdefcf34f | 10.9 | 0.20 | yes |
| test/prove_it_ui.test.cjs | 25,162 | 197c661a3b5c66cae0e0dcb9dc6111630782c3b0cc7204cbe1566fdb7a7a4ffc | 11.3 | 2.12 | yes |
| public_release/0.3.1/.../cards/maze_qid2950_b4_maze_input.json | 3,944 | 7c6f234a3a6bb240e6f7953f4f3fb9061f15491a04e1cb74926ae33aae864acc | 10.9 | 0.34 | yes |
| public_release/0.3.2/.../cards/maze_qid3493_b4_maze_input.json | 3,145 | f97f8dcac8ebda89739ef3c0ee0464ca74a04c093d894e395f99b3f977c3f303 | 9.9 | 0.30 | yes |
Each row: one holder answered (M0 only), the holder's signature verified, a fresh Thorax session (ids in checks.json). The "ms" counts the whole fetch: CALL_ME, dial back, handshake, sealed transfer and checks. For small files that set-up time (about 10 ms) is most of it, so MiB/s for small files is not a transfer rate.
(iii) Tamper tests: 2 of 2 caught, right bytes delivered both times
| test | first try | caught by | fallback | result |
|---|---|---|---|---|
| (iii-a) M2's own copy of Y (2,693 B) had one bit flipped on disk | M2 itself (local first) | SHA-512 is not the address; sha256 59e10ce3...29a240 is not 511208d2...dcf66 | M0, Thorax session 3d50b110...354264 | byte-exact, 511208d2a70d5ee1d7c0593d3957fc4f02f1fde25872035abe331582ae7dcf66 |
| (iii-b) M0 was told to flip one bit when serving Z (6,153 B); M2 tried M0 first for this test | M0 | SHA-512 is not the address; sha256 0b2ae659...efbf3f is not the manifest's. Note: M0's signature over its honest-looking claim still verified. The signature alone does not catch a lying holder; the hash does. | M2's own copy | byte-exact, 2245ee356641cae367e9e7b45274a607062584564b3f6f6489881d0ced190d3b |
The corrupted and original copies of Y are kept on M2 in evidence (sha256 59e10ce3... and 511208d2...).
Refusals: 6 of 6 correct
| asked | answer |
|---|---|
| M2 pins a wrong key for M0 (Thorax) | refused on M2: "identity key is not the pinned key for this peer"; M0 logged the refusal |
| CALL_ME naming a port that is not in M2's signed card | M0 refused: "callback address is not in the requester's signed record" |
| CALL_ME from a stranger key that never announced a card | M0 refused: "unknown node (no verified record)" |
| CALL_ME claiming to be M2, signed by another key | M0 refused: "bad signature or stale" |
| WHO_HAS for an address M0 has on disk (in PR-8's consent set) but did not put in its PR-10 manifest | no holder answered |
| Thorax FETCH of that address anyway | M0 refused: "not in the consent manifest" |
What crossed the wire (checked by code, m0_check_results.cjs)
- M0 served 13 files and M2 received 13, in the same order, same sizes. 12 honest, 1 tampered on purpose (Z). Every served address is in M0's consent manifest. File payload 16,209,827 bytes.
- M0 dialed out 15 times, all to M2 (the address in M2's signed card): 14 Thorax handshakes passed, 1 refused (the wrong-key test). Plain TCP frame types from M0: only
hello,readyandsealed; no file content in a plain frame. TCP bytes out 28,878,961, in 42,155. - UDP from M0: 64 HELLO, 52 HELLO_ACK, 62 HAVE, 191 PONG, 3 CALL_REFUSED; 267,197 bytes. A HELLO with the full signed card is 1,622 bytes; a HAVE is 488 bytes.
- UDP into M0: 52 HELLO, 50 HELLO_ACK, 63 WHO_HAS, 191 PING, 18 CALL_ME.
- Notice board (stand-in on M2): 115 requests, all status 200: from M0 32 posts and 31 reads, from M2 (loopback) 26 posts and 26 reads.
- M2's listener accepted only the connections it was expecting; unexpected connections: 0.
Cloudflare Worker (written, tested, NOT deployed)
worker.js: POST/v1/announce(signed card, at most 4,096 bytes, signature and Socceri checked with WebCrypto Ed25519 and SHA-512, stored in Workers KV with a 60 to 900 s expiry, an older card cannot replace a newer one), GET/v1/records?topic=(at most 16 newest), GET/v1/health. Per-IP rate limits: 10 posts and 60 reads per minute.wrangler.toml: KV namespace binding plus two Rate Limiting bindings.- Workers KV, not Durable Objects, because it fits the $5 plan for the bootstrap phase (about 100 always-on nodes; numbers and the crossover in
DEPLOY_FOR_FOUNDER.md). - No wrangler or miniflare was installed (none found on M0; nothing was installed). The handler was unit-tested under plain Node 24: 20 of 20 pass (
worker_unit_test.json), including: changed field refused, swapped address refused, wrong key refused, not-joined refused, expired refused, oversize refused, older card refused (409), rate limit at the 11th post (429) and per IP, at most 16 records, and the Worker's verifier agrees with the Node verifier on 30 of 30 good and broken cards. - Then the same unchanged file served as the notice board in the live run (above).
DEPLOY_FOR_FOUNDER.md: the clicks for Workers Paid and a Workers-only token, the one deploy command (npx wrangler deploy, after a one-timenpx wrangler kv namespace create SEAS_KV), and the expected monthly cost from Cloudflare's public pricing page: $5.00 a month up to about 100 always-on nodes posting every 5 minutes, about $117 at 1,000 nodes unless the board moves to a Durable Object or nodes post less often.
Incidents and honest notes
- Hook gates hit, all followed, none routed around. The inline-code blocker refused one
node -ecommand; I wrote the code to a file as it instructs. The prior-work gate stopped 12 new files; each time I opened or named the candidates (membership attestation files, Electron workers, the site deploy button, generic names), found none that does this, and wrote the same path again as the gate allows. The Rule 66 gate required a sibling before I editedseas_node.cjs; the siblingseas_node.superseded.20261005T044648Z.cjsholds the earlier version. The bedrock and substrate gates ran in warn mode; I ranpheromone_querybefore the edit. - A dry run happened first, on M0 only (scratchpad, bootstrap channel only, different ports, fresh keys, topic
pr10-dry-run): remote fetch of the 10.6 MB launcher, tamper fallback, local first and the wrong-key refusal all behaved. It briefly opened TCP on a temporary port on M0 for a few seconds. It is not counted here.seas_node.cjswas not changed after it; the driver, M0 main and orchestrator were first run live. - The secret re-scan used stricter patterns than PR-8's (for example
AKIAfollowed by 16 characters instead ofAKIAalone). The 50 files had already passed PR-8's broader scan, so this is a second check, not the only one. - The check script
m0_check_results.cjswas written after the run and is not in the pre-run seal. It only reads the result files; every number in this receipt comes from it or from the result files directly. - Notice board count: the stand-in logged 32 posts from M0; M0's own log has 31. The last post was in flight while M0 was stopping, so M0 did not log its answer. Not a data-path issue.
- M0 free RAM was 6,381 MB at the start, above the 6 GB floor but close. The test processes are small.
- Existing M0 firewall rule, not changed: an older "Node.js JavaScript Runtime" inbound allow rule for
Program node.exeon the Private profile lets M0 hear UDP on a temporary port. I made no firewall change on M0. M0 opened no TCP listener in the live run. - Canon conflict about Cloudflare: BP085 canon says the Founder does not use Cloudflare; tonight he says his Cloudflare account hosts mnemosynec.org, and the domain's name servers are Cloudflare's. Flagged in
DEPLOY_FOR_FOUNDER.mdfor him to confirm.
Changes on M2 (and their removal)
- One folder, left in place:
CROSS_NODE_TEST_PR10_20261005withscripts(driver, keygen, 7 lib files),worker(worker.js, local_server.mjs, package.json),config.json,store(50 files, all matching the selection),evidence(Y original and corrupted),m2_pr10_ed25519_priv.pem(test key, never left M2),out(results.json 023fe262..., wire_log_m2.jsonl 8df1761b..., manifest_m2.json 1fe7a0ad..., bootstrap_log.jsonl 771e2f65...; copies inm2with the same hashes). - Three temporary firewall rules, all inbound, remote M0 only:
CROSS_NODE_TEST_PR10_20261005_TCP47809,_UDP47810,_TCP47811. Opened 04:51:19Z, removed 04:52:24Z by the script's own cleanup. - After cleanup: rules left 0; TCP listeners on 47809 and 47811: 0; UDP endpoints on 47810: 0; test processes: 0. A TCP probe from M0 afterwards to 47809 and 47811: False and False.
- Nothing was installed. Node v24.16.0 was already on M2.
- Not touched: the Founder's Conduit, his MnemosyneC keys, the frozen release candidate
CONDUIT_WT_W005_034, his Cloudflare account.
Evidence (sha256)
Folder: D-BP223-W005-PR10-SEVEN-SEAS
| path | sha256 | what it is |
|---|---|---|
| seas_record.cjs | 170d0879c36e17ef705562e0190448a14900bf0f51d33e062b79a1e01e5e866d | signed node card and signed UDP messages |
| seas_node.cjs | b3736a9573d2865a46a4e93dcffd29d9b9e3ea9be0658b6b60fa5b2fabb8217f | the node: discovery, WHO_HAS, closest first, CALL_ME, Thorax, checks |
| thorax_session.cjs | ab20ea703f1f136d7af2dfe884200dc09910a0fa7ac15e28ceff4268d90c2a61 | PR-8 glue, unchanged |
| relay_x25519.cjs | bab9385f0dbb01288e526b31e7749f4bea0af1fcffd83820a81e082630fda77c | Thorax relay v2, unchanged |
| connector.cjs | f9487cbc3b79d9a68fc440235314e8c6816fe74220f8be5bc7143c3947e4abb7 | Conduit Socceri addressing, unchanged |
| card_format.cjs / card_chain.cjs | 20421b37... / 9908ec9e... | dependencies, unchanged |
| m0_build_stores.cjs | 82e7576201eb1d696aa4589ec5d2c28250177a7e1ee75dbba27902403376388c | picks and checks the 50 files |
| m0_make_config.cjs | 21c546d7aed0d226bde24868deb4b4d57d8edcba9813bd69ec7ed6e0e87f36e2 | M2 settings (no M0 address) and the tamper list |
| m0_node_main.cjs | 6ec4578a36020cfa6c0feb0a86e6c575c83b22ee9fb52fd40545ec46f982c04d | M0 node |
| m2_driver.cjs | 8df3002767048a39a8c6adb3abe3d38f5ebaba1d31ff3206da90fa92f638d7ab | M2 node and test phases |
| keygen.cjs | cb7c794c69a33001f8282eeae26d8594d02cce19de13bdc4014241d2d77fe612 | test keys |
| m0_run_pr10.ps1 | 1352c88876b0956caa084272c9646aaa44816d1a12161381066291f4b7a3fa9a | orchestrator AS RUN |
| m0_check_results.cjs | 013da2d7a6f1ba8952374c1a5f00d7742c0f880d77cef7648d86bdc27822c70c | checks (written after the run) |
| worker.js | 4ed8b7b4b19d14dd40dd7a380916632fa02b2628dfcdb65df9075c6cb0ce7cba | the bootstrap Worker |
| wrangler.toml | cbbf534ebc98548c27c03a37ce97940369ddfef41437611a8b5c1471d829ae56 | Worker settings |
| worker.test.mjs | 11c54c498f3b1e2968e9084148e26bb3dca3192421ff42a1aad23bc3aa13d703 | 20 unit tests |
| local_server.mjs | 6fbfc4ee8545a678e06f206a96f90686c5bed06260108fb179f9721ad0232aec | runs worker.js under Node (KV and rate-limit stand-ins) |
| SCRIPTS_AND_INPUTS_BEFORE_RUN.txt | 0668bf53342e38ed68078e6ee91ddd4d6cffca022e7afab96d835c9e44458030 | 20 script and input hashes, sealed 04:51:11Z |
| selection.json | a4780188d643335db6de9b2da0bfe73275fb667095ffe3d7170f2d35e25f6eae | the 50 files and the W, Y, Z sets |
| m2_config.json | 4aa1dc250c707710468a6ccbfd991efda613443b0c20532171d248f30d1d07e2 | M2 settings as sent |
| results.json | 023fe262df83779b256cb20904803a727042885dab42d6e44f0023d1e356524d | M2's full results (same hash on M2) |
| wire_log_m2.jsonl | 8df1761bd243d82d5e8680d272d1394f7aa062d5bf8d239f8f29dc83b6a54745 | M2 wire log (same hash on M2) |
| manifest_m2.json | 1fe7a0add307da84f94bd46c27d54b5101eb4240ac93e37436f2412df12506cc | M2's signed consent manifest |
| bootstrap_log.jsonl | 771e2f65adddfe96ac8635b4409d2830a8d30ff9692435b6752684c4fe6fc013 | notice board request log |
| m0_state.json | d9b61e74c779e7f513f3f511a4c2b0e261be9f066861aba79728edd6655a671a | M0's peers, served, refused, events |
| wire_log_m0.jsonl | 9e09d6ba83c5364af3fd2d53ff5cd312be8ec2611c3d3a2e618da44a587dd503 | M0 wire log |
| manifest_m0.json | 0de39ab7243732ae9b283830204e7906511f449999fb6a68e75f6d4b3eeebe87 | M0's signed consent manifest |
| checks.json | 3064d1a47ad85b02cb9027f8a7cd2c8254c640208d578bc1510d8fd5d70deee2 | every check above |
| worker_unit_test.json | fdaf158e1da305ced5a91b3a879e5e054fa375082e24d2cc8faa85c2cec24126 | Worker unit test output |
| orchestrator_log.txt | 6e0a640dc2b0b99e9287e65472a4d3d9e53380a65d25ccd52ea74d034e9bfa89 | timeline |
| m2_after_cleanup.json | 9347ffe8ce0398d6905b73a9dc6f94e326b971630e606b13cd990308102b0e39 | M2 state after cleanup, file hashes |
| m0_keygen_stdout.json / m2_keygen_stdout.json | cefa31c4... / eb68a048... | public key facts |
Copyable. Node built-ins plus the estate files above, no npm installs. To run again on two other machines: copy scripts and worker; give each node a store folder of files named by their Socceri address; run keygen.cjs on each; run m0_node_main.cjs on one and m2_driver.cjs on the other (with config.json), or call createNode from seas_node.cjs directly.
What is next (not done)
- Deploy the Worker (his hands:
DEPLOY_FOR_FOUNDER.md), then repeat this test with M2 on a phone hotspot so the two machines are truly on different networks. Across the internet the call-back needs a reachable listener or the meeting network's hole punch (net_reach.cjs); this test did not cover that. - Fold LAN discovery and "closest holder" into the Conduit's real Seven Seas after the 0.3.4 audit, behind the membership attestation it already requires.
- Partial fetch from several holders at once (chunks with per-chunk hashes) and racing two remote holders: not built.
Filed. Not done. The Founder decides.