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.

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)

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.

Nodes and keys

itemvalue
M0host M0, M0, Node v24.11.0, free RAM 6,381 MB at start
M2host M2, M2, Node v24.16.0, free RAM 24,043 MB at start
M0 test key, Hex Connectord6372eecb172249a0e22e7a5284e95cb (full Socceri in m0_keygen_stdout.json)
M2 test key, Hex Connector5c0aaa84c5cabb09e4a10833c24a3675, made on M2; the private key stayed on M2
keys pinned out of bandnone. 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.
topicpr10-seven-seas-test
M0 consent manifest50 records, 18,690,102 bytes, seal 846756d8...87e6f2, file sha256 0de39ab7...7dd503, signed by M0's key
M2 consent manifestthe 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)

  1. 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, and joined is true.
  2. 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).
  3. 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).
  4. 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.
  5. 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.
  6. 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 multicastLAN broadcastLAN answer (HELLO_ACK)bootstrap list
M2 found M004:51:30.828Z04:51:30.829Z04:51:30.830Z04:51:30.836Z
M0 found M204:51:31.738Z04:51:31.739Z04:51:31.743Z04:51:33.756Z

(i) Closest holder first: 50 of 50

measureresult
addresses asked50
two holders answered (M2 itself and M0)50 of 50
M2's own copy chosen50 of 50
byte-exact (sha256 equals the selection)50 of 50
M0 round tripmin 1.288 ms, median 1.597 ms, max 2.305 ms

(ii) Local copy withheld: M0 serves, 10 of 10

pathbytessha256msMiB/sbyte-exact
public_release/0.3.2/MnemosyneC-Conduit/Start Conduit.exe (signed launcher)10,626,440895ea642d29346244954455919f66b2b092fb19677fa49050eb56a48bd648fa5636.315.93yes
src/hard_mode_pool.gz.hex4,413,0387f1328582e7af0012eef500d3135b1323773efead75ecd3050cf271cc8aae58a161.226.10yes
public_release/0.3.2/.../recall_package_700/questions_300_nogold.json500,3632eebe4acdda6130436f54ce5a0442de709c0798996b61da9a451ed92bf3e199d25.818.53yes
src/showme/showme_cards.jsonl322,487c99cdc935504a31bba250edcd91e8dd9664d27fa677e6689602f20803ccd91f423.413.15yes
public_release/0.3.2/.../proof/CARD_INDEX.json293,4376c090fea3a2f2497a84aca1cc8bdab961d0d222cfd5bb0890da9a8647d5bf07119.614.25yes
src/liana_cycle.cjs5,35453e591837f0290b8342d53ad50079710f03f186dabfbf0ecac9ec2b9607b9a4c24.50.21yes
public_release/0.3.2/.../cards/maze_qid7917_b4_maze_input.json2,2573ed75867aa501073900888244edd5cb956b44dfa604473b881de6c1bdefcf34f10.90.20yes
test/prove_it_ui.test.cjs25,162197c661a3b5c66cae0e0dcb9dc6111630782c3b0cc7204cbe1566fdb7a7a4ffc11.32.12yes
public_release/0.3.1/.../cards/maze_qid2950_b4_maze_input.json3,9447c6f234a3a6bb240e6f7953f4f3fb9061f15491a04e1cb74926ae33aae864acc10.90.34yes
public_release/0.3.2/.../cards/maze_qid3493_b4_maze_input.json3,145f97f8dcac8ebda89739ef3c0ee0464ca74a04c093d894e395f99b3f977c3f3039.90.30yes

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

testfirst trycaught byfallbackresult
(iii-a) M2's own copy of Y (2,693 B) had one bit flipped on diskM2 itself (local first)SHA-512 is not the address; sha256 59e10ce3...29a240 is not 511208d2...dcf66M0, Thorax session 3d50b110...354264byte-exact, 511208d2a70d5ee1d7c0593d3957fc4f02f1fde25872035abe331582ae7dcf66
(iii-b) M0 was told to flip one bit when serving Z (6,153 B); M2 tried M0 first for this testM0SHA-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 copybyte-exact, 2245ee356641cae367e9e7b45274a607062584564b3f6f6489881d0ced190d3b

The corrupted and original copies of Y are kept on M2 in evidence (sha256 59e10ce3... and 511208d2...).

Refusals: 6 of 6 correct

askedanswer
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 cardM0 refused: "callback address is not in the requester's signed record"
CALL_ME from a stranger key that never announced a cardM0 refused: "unknown node (no verified record)"
CALL_ME claiming to be M2, signed by another keyM0 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 manifestno holder answered
Thorax FETCH of that address anywayM0 refused: "not in the consent manifest"

What crossed the wire (checked by code, m0_check_results.cjs)

Cloudflare Worker (written, tested, NOT deployed)

Incidents and honest notes

  1. Hook gates hit, all followed, none routed around. The inline-code blocker refused one node -e command; 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 edited seas_node.cjs; the sibling seas_node.superseded.20261005T044648Z.cjs holds the earlier version. The bedrock and substrate gates ran in warn mode; I ran pheromone_query before the edit.
  2. 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.cjs was not changed after it; the driver, M0 main and orchestrator were first run live.
  3. The secret re-scan used stricter patterns than PR-8's (for example AKIA followed by 16 characters instead of AKIA alone). The 50 files had already passed PR-8's broader scan, so this is a second check, not the only one.
  4. The check script m0_check_results.cjs was 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.
  5. 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.
  6. M0 free RAM was 6,381 MB at the start, above the 6 GB floor but close. The test processes are small.
  7. Existing M0 firewall rule, not changed: an older "Node.js JavaScript Runtime" inbound allow rule for Program node.exe on 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.
  8. 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.md for him to confirm.

Changes on M2 (and their removal)

Evidence (sha256)

Folder: D-BP223-W005-PR10-SEVEN-SEAS

pathsha256what it is
seas_record.cjs170d0879c36e17ef705562e0190448a14900bf0f51d33e062b79a1e01e5e866dsigned node card and signed UDP messages
seas_node.cjsb3736a9573d2865a46a4e93dcffd29d9b9e3ea9be0658b6b60fa5b2fabb8217fthe node: discovery, WHO_HAS, closest first, CALL_ME, Thorax, checks
thorax_session.cjsab20ea703f1f136d7af2dfe884200dc09910a0fa7ac15e28ceff4268d90c2a61PR-8 glue, unchanged
relay_x25519.cjsbab9385f0dbb01288e526b31e7749f4bea0af1fcffd83820a81e082630fda77cThorax relay v2, unchanged
connector.cjsf9487cbc3b79d9a68fc440235314e8c6816fe74220f8be5bc7143c3947e4abb7Conduit Socceri addressing, unchanged
card_format.cjs / card_chain.cjs20421b37... / 9908ec9e...dependencies, unchanged
m0_build_stores.cjs82e7576201eb1d696aa4589ec5d2c28250177a7e1ee75dbba27902403376388cpicks and checks the 50 files
m0_make_config.cjs21c546d7aed0d226bde24868deb4b4d57d8edcba9813bd69ec7ed6e0e87f36e2M2 settings (no M0 address) and the tamper list
m0_node_main.cjs6ec4578a36020cfa6c0feb0a86e6c575c83b22ee9fb52fd40545ec46f982c04dM0 node
m2_driver.cjs8df3002767048a39a8c6adb3abe3d38f5ebaba1d31ff3206da90fa92f638d7abM2 node and test phases
keygen.cjscb7c794c69a33001f8282eeae26d8594d02cce19de13bdc4014241d2d77fe612test keys
m0_run_pr10.ps11352c88876b0956caa084272c9646aaa44816d1a12161381066291f4b7a3fa9aorchestrator AS RUN
m0_check_results.cjs013da2d7a6f1ba8952374c1a5f00d7742c0f880d77cef7648d86bdc27822c70cchecks (written after the run)
worker.js4ed8b7b4b19d14dd40dd7a380916632fa02b2628dfcdb65df9075c6cb0ce7cbathe bootstrap Worker
wrangler.tomlcbbf534ebc98548c27c03a37ce97940369ddfef41437611a8b5c1471d829ae56Worker settings
worker.test.mjs11c54c498f3b1e2968e9084148e26bb3dca3192421ff42a1aad23bc3aa13d70320 unit tests
local_server.mjs6fbfc4ee8545a678e06f206a96f90686c5bed06260108fb179f9721ad0232aecruns worker.js under Node (KV and rate-limit stand-ins)
SCRIPTS_AND_INPUTS_BEFORE_RUN.txt0668bf53342e38ed68078e6ee91ddd4d6cffca022e7afab96d835c9e4445803020 script and input hashes, sealed 04:51:11Z
selection.jsona4780188d643335db6de9b2da0bfe73275fb667095ffe3d7170f2d35e25f6eaethe 50 files and the W, Y, Z sets
m2_config.json4aa1dc250c707710468a6ccbfd991efda613443b0c20532171d248f30d1d07e2M2 settings as sent
results.json023fe262df83779b256cb20904803a727042885dab42d6e44f0023d1e356524dM2's full results (same hash on M2)
wire_log_m2.jsonl8df1761bd243d82d5e8680d272d1394f7aa062d5bf8d239f8f29dc83b6a54745M2 wire log (same hash on M2)
manifest_m2.json1fe7a0add307da84f94bd46c27d54b5101eb4240ac93e37436f2412df12506ccM2's signed consent manifest
bootstrap_log.jsonl771e2f65adddfe96ac8635b4409d2830a8d30ff9692435b6752684c4fe6fc013notice board request log
m0_state.jsond9b61e74c779e7f513f3f511a4c2b0e261be9f066861aba79728edd6655a671aM0's peers, served, refused, events
wire_log_m0.jsonl9e09d6ba83c5364af3fd2d53ff5cd312be8ec2611c3d3a2e618da44a587dd503M0 wire log
manifest_m0.json0de39ab7243732ae9b283830204e7906511f449999fb6a68e75f6d4b3eeebe87M0's signed consent manifest
checks.json3064d1a47ad85b02cb9027f8a7cd2c8254c640208d578bc1510d8fd5d70deee2every check above
worker_unit_test.jsonfdaf158e1da305ced5a91b3a879e5e054fa375082e24d2cc8faa85c2cec24126Worker unit test output
orchestrator_log.txt6e0a640dc2b0b99e9287e65472a4d3d9e53380a65d25ccd52ea74d034e9bfa89timeline
m2_after_cleanup.json9347ffe8ce0398d6905b73a9dc6f94e326b971630e606b13cd990308102b0e39M2 state after cleanup, file hashes
m0_keygen_stdout.json / m2_keygen_stdout.jsoncefa31c4... / 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)

Filed. Not done. The Founder decides.