Archived
forge: install genesis seeds at their declared node ids #1
Reference in New Issue
Block a user
Delete Branch "feat/genesis-seed-install"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
Adds a
seed_type: "genesis"branch toforge install. Seeds without aseed_typereach the identical persona code they always did.Why
A persona seed is generative: values and biography are prose, the installer mints an id per node, and the ids are incidental because nothing outside the graph refers to them.
A genesis seed is declarative. It ships
identity_nodes[]with explicit ids andedges[]written in terms of those ids, and the ids are the artifact —is_protected_node()inneuron-api.elkeys on exact ids, and all 214 declared edges reference them.install.elonly understood the persona schema. It never readidentity_nodesoredges, so installing Neuron's genesis seed minted 102 unrelated nodes. State in the live graph today:kn-10fa60db…30 bytes vs 4263 declared,kn-04368bee…22 vs 2590)How
Render the declared nodes and edges into a snapshot-format file and hand it to the engram, which honors the ids —
POST /api/nodes/reseedwhere available,POST /api/load-mergeotherwise. Both skip nodes already present and dedup edges by(from, to, relation), so a rerun is a no-op by construction, not by a flag.Three things this path does differently, each inherent to what a genesis seed is:
It never provisions. A persona seed gets a port and a launchd Engram; a genesis seed installs into an engram that already exists and is owned by something else. The
:8742refusal is inverted too — that guard stops a foreign soul landing in Neuron's engram, and Neuron's own identity graph is the one thing that belongs there.GENESIS_CONFIRMtakes its place, because rewriting the graph a running CGI reads itself out of should never happen because someone typed a familiar command with an unfamiliar file.It splices raw JSON tokens rather than decoding and re-escaping. The seed bodies are multi-KB markdown with newlines, quotes and
\uescapes. A round-trip throughstr_escape_jsonwould have to reproduce every escape the author wrote, and any it does not know about silently corrupts the body. Copying a token verbatim cannot corrupt what it never decodes.It verifies by re-reading. The bug this replaces reported success while delivering empty bodies, so success is not what the write call returned — it is what the graph now holds. Every declared id is re-read and audited against the hollow signature, and the manifest names the failing ids.
Hollow detection is deliberately conservative — under 40% of the declared body and under 400 bytes — so a node whose body legitimately grew in the graph is left alone. Genesis restores what is missing; it does not overwrite what the graph has learned.
Also
registry.json,installed:falseuntil the identity load is authorized.engram_api_keyis left empty on purpose: the key for a pre-existing engram belongs to that engram's launchd environment, not to a file in this repo.-DHAVE_CURLinCFLAGS. Without it the el-compiler runtime links fine and then answers everyhttp_get/http_post_jsonwith{"error":"not built with HAVE_CURL"}— forge is entirely HTTP, so it dies at the first engram call. No-op against the SDK release runtime CI pulls.Verification
Sandbox engram on a throwaway port with a throwaway data dir, seeded to mirror the live graph's state for this seed (15 resident declared nodes including the 2 hollow, plus all 694 of their real incident edges). No prod or stage writes.
absent: 0 hollow: 0 intact: 102, 0 nodes and 0 edges addedGENESIS_CONFIRMContent-length distribution after install: min 286, median 1728, max 4679, 0 nodes under 100 chars. A run that returns success while delivering empty content is the exact failure mode being fixed, so the audit is on the output distribution, not on the exit status.
Branch note
Branched from local
main, which carries 6 commits not yet on the remote. Those are pre-existing and untouched; they ride along in this PR becauseinstall_genesiscallsregistry_replace_slug, which one of them introduced.Depends on
neuron-technologies/elPR forPOST /api/nodes/reseed. Forge degrades gracefully without it — creates every absent node and lays every edge, then reports the 2 hollow nodes as failed rather than reaching for a destructive substitute.A persona seed is generative: values and biography are prose, the installer mints an id for each node, and the ids are incidental because nothing outside the graph refers to them. A genesis seed is declarative -- it ships identity_nodes[] with explicit ids and edges[] written in terms of them, and the ids are the artifact. is_protected_node keys on exact ids and every declared edge references them. install.el only understood the persona schema. It never read identity_nodes or edges, so installing Neuron's genesis seed minted 102 unrelated nodes and produced a graph structurally unrelated to the one the seed describes. The result in the live graph: 87 of 102 declared nodes absent, 2 present with only their label as content, 202 of 214 edges never laid. Branch on seed_type. Seeds without one reach the identical persona code they always did. Genesis seeds render their declared nodes and edges into a snapshot-format file and hand it to the engram, which honors the ids -- POST /api/nodes/reseed where available, POST /api/load-merge otherwise. Both skip nodes already present and dedup edges, so a rerun is a no-op by construction. Three things this path does differently, all inherent to what a genesis seed is: - It never provisions. A persona seed gets a port and a launchd Engram; a genesis seed installs into an engram that already exists and is owned by something else. The ":8742 refusal" is also inverted -- that guard stops a foreign soul landing in Neuron's engram, and Neuron's own identity graph is the one thing that belongs there. GENESIS_CONFIRM takes its place, because rewriting the graph a running CGI reads itself out of should never happen because someone typed a familiar command with an unfamiliar file. - It splices raw JSON tokens rather than decoding and re-escaping. The seed bodies are multi-KB markdown with newlines, quotes and \u escapes; a round-trip through str_escape_json would have to reproduce every escape the author wrote, and any it does not know about silently corrupts the body. Copying a token verbatim cannot corrupt what it never decodes. - It verifies by re-reading. The bug this replaces reported success while delivering empty bodies, so success is not what the write returned, it is what the graph now holds: every declared id is re-read and audited against the hollow signature, and the manifest reports created / filled / skipped / failed with the failing ids named. Hollow detection is deliberately conservative -- under 40% of the declared body and under 400 bytes -- so a node whose body legitimately grew in the graph is left alone. Genesis restores what is missing; it does not overwrite what the graph has learned. Also registers Neuron in registry.json (installed:false until the identity load is authorized) and defines HAVE_CURL in CFLAGS, without which the el-compiler runtime links fine and then answers every HTTP call with {"error":"not built with HAVE_CURL"}. Verified against a sandbox engram seeded to mirror the live graph's state for this seed: created 87, filled 2, skipped 13, failed 0; 102/102 nodes verified byte-exact against the seed where the seed is authoritative; 214/214 edges laid; 682/682 non-seed incident edges preserved through the two in-place replaces; rerun reports 102 skipped, 0 nodes and 0 edges added. Against an engram without the reseed route it creates the 87, fills none, and fails loudly naming the 2 it could not repair.