This repository has been archived on 2026-08-20. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
forge-retired/Makefile
T
will.anderson c3bba5676b forge: install genesis seeds at their declared node ids
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.
2026-08-10 16:44:35 -05:00

30 lines
935 B
Makefile

EL_ROOT ?= $(HOME)/Development/neuron-technologies/foundation/el
EL_LIB ?= $(EL_ROOT)/el-compiler/runtime
ELC ?= $(EL_ROOT)/dist/platform/elc
CC ?= cc
# -DHAVE_CURL: the el-compiler runtime guards its libcurl client behind this
# macro, so a build without it links fine and then answers every http_get /
# http_post_json with {"error":"not built with HAVE_CURL"} — forge is entirely
# HTTP, so it fails at the first engram call. The SDK release runtime CI pulls
# has no such guard; defining it is a no-op there.
CFLAGS := -std=c11 -O2 -DHAVE_CURL -I$(EL_LIB)
.PHONY: build clean install
dist/:
mkdir -p dist
dist/forge.c: src/forge.el | dist/
$(ELC) src/forge.el > dist/forge.c
dist/forge: dist/forge.c
$(CC) $(CFLAGS) -o dist/forge dist/forge.c $(EL_LIB)/el_runtime.c -lcurl -lpthread
build: dist/forge
install: dist/forge
install -m 755 dist/forge /usr/local/bin/forge
clean:
rm -rf dist/forge dist/forge.c