Commit Graph

28 Commits

Author SHA1 Message Date
will.anderson 9b0d29a350 Merge pull request 'forge: install genesis seeds at their declared node ids' (#1) from feat/genesis-seed-install into main
Forge Release / build-and-release (push) Failing after 11m52s
2026-08-16 13:17:13 +00:00
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
Will Anderson cd77ceb68b forge: add soul daemon install/start/stop/status commands
Adds `forge soul daemon <install|start|stop|status>` subcommand that
manages launchd-resident neuron binary instances (one per soul), serving
on ports 8901-8926. Builds SOUL_IDENTITY from seed file values, biography,
voice profile, reasoning patterns, and relationships; XML-escapes for plist.
Installs and loads all 26 soul daemons via `forge soul daemon install --all`.
2026-05-03 18:34:42 -05:00
Will Anderson 52a40e7edc registry: replace_slug instead of append — one entry per slug, preserves soul_daemon_url 2026-05-03 18:22:26 -05:00
Will Anderson fa2c218d2e registry: deduplicate post-reinstall, fix ports, add missing soul_daemon_urls 2026-05-03 18:20:21 -05:00
Will Anderson e9debe26d6 add Carl Jung — soul slot 26, port 8826 2026-05-03 18:19:18 -05:00
Will Anderson 3493413dc7 registry: add soul_daemon_url to all 25 installed imprints
Port formula: daemon = engram_port + 100. Bobby Anderson 8801→8901
through Stephen Colbert 8825→8925. All souls with installed:true and
a real engram_root_id now have their daemon URL for direct dispatch.
2026-05-03 17:55:43 -05:00
Will Anderson 9c2bda4a24 registry: deduplicate late-night soul entries — 30 -> 25 imprints 2026-05-03 17:36:46 -05:00
Will Anderson 2201ccb1fe Make forge install self-contained — no pre-provisioning required
Forge Release / build-and-release (push) Failing after 3s
install_main() now: derives slug from subject, looks up registry by slug
(last-match wins), auto-creates a registry entry with next available port
if slug is absent, runs soul_install_one() to provision the launchd agent,
polls /stats up to 15s for engram health, then seeds and writes root_id back.

post_node/post_edge now receive auth_key explicitly instead of reading from
env — eliminates the ENGRAM_API_KEY pre-flight requirement entirely.
2026-05-03 16:02:34 -05:00
Will Anderson 047c382238 add late-night hosts + Stephen King: research, install, wire (ports 8821-8825)
Forge Release / build-and-release (push) Failing after 4s
2026-05-03 15:59:33 -05:00
Will Anderson 514fc2d913 add Neuron genesis seed — self-knowledge graph for Genesis Engram reinstall 2026-05-03 03:40:44 -05:00
Will Anderson d09f7ec409 rename kal-el → superman; fix registry duplicates, use ENGRAM_DATA_DIR
- Renamed soul slot 20 from Kal-El to Superman (new seed, new slug)
- Cleared stale duplicate entries that forge reinstall was appending
- Updated all 20 engram_root_ids to reflect fresh reinstall
- soul.el plist generator already fixed to emit ENGRAM_DATA_DIR
2026-05-03 03:25:06 -05:00
Will Anderson 065afee1bf clean up .gitignore — remove Python entries, clarify excludes 2026-05-03 03:13:58 -05:00
Will Anderson 97f3a3ff88 remove Python/bash scripts, add forge soul reinstall command
- Delete scripts/ (Python/bash superseded by native El forge commands)
- install.el: fix /api/nodes → /nodes, /api/edges → /edges (Engram has no /api prefix)
- install.el: add FORCE_INSTALL env var to bypass already-installed check
- install.el: remove all python3/launch_dharma.sh references
- soul.el: add soul_reinstall_one() and forge soul reinstall <slug|--all>
  Wipes engram DB, restarts launchd agent, waits for startup, runs install
2026-05-03 03:12:45 -05:00
Will Anderson cbeb9c02eb build DHARMA network: 19 soul Engram instances with full peer wiring
- Add scripts/: install_soul.py, install_all.py, launch_dharma.sh, stop_dharma.sh, wire_peers.py
- Move all seeds into seeds/ directory (consolidated from root-level scattered files)
- Update registry.json with engram_root_id, engram_api_key, engram_url for all 19 installed souls
- Add src/soul.el, src/research.el; remove src/daemon.el
- .gitignore: exclude imprints/, log/, sandboxes/ (runtime data)
- Remove superseded scripts: deploy.py, install_imprints.py, reinstall_imprints.py, fix_collision.py
- Remove old root-level seed files and shell scripts superseded by scripts/ versions

Key: native engram binary uses _auth body field, per-soul keys ntn-<slug>-2026,
DharmaPeer graph edges for peer wiring, sanitize_content() for JSON safety.
190/190 peer pairs wired successfully.
2026-05-03 03:09:27 -05:00
Will Anderson 0dba4f3663 add forge daemon command for soul Engram lifecycle management
- daemon.el: launchd plist generation, install/start/stop/status/wire
- forge.el: dispatch daemon command, add to usage
- install.el: auto-register soul as launchd agent after install
- schema.el: add FORGE_DIR constant for absolute path references

forge daemon install --all installs all 19 souls as resident launchd
agents with KeepAlive. forge daemon wire registers each soul as an
Engram peer to every other soul. forge daemon status health-checks all.
2026-05-03 02:58:06 -05:00
Will Anderson 0a15e2fa42 DHARMA network: per-soul Engram instances (8801–8819)
Each soul now gets their own isolated Engram process with a dedicated data
directory (imprints/<slug>/), port, and API key — the DHARMA network.
Neuron's Engram at 8742 is never touched.

- registry.json: add engram_db_path, engram_port, engram_url to all 19 entries
  (Bobby Anderson 8801 → Helen Keller 8819)
- launch_dharma.sh: start all 19 soul Engrams in background; supports
  single-slug filter and skip-if-running detection
- stop_dharma.sh: graceful shutdown via PID file, falls back to port scan
- reinstall_imprints.py: bulk reinstall — starts each Engram temporarily,
  installs seed, records new root_id, stops; supports --slug and --dry-run
- src/install.el: resolves soul's engram_url from registry (never 8742);
  guards against accidental writes to Neuron's shared Engram
- src/summon.el: reads engram_url per-soul from registry; passes it to soul
  server in POST body so soul connects to the right Engram; supports
  both single-soul (engram_url) and multi-soul (engram_urls array) payloads
2026-05-03 02:52:01 -05:00
Will Anderson 52b6830ab2 fix Turing/Einstein engram root ID collision — reinstall with unique IDs
Both imprints shared root 8608f497 due to a concurrent install bug. Removed
the colliding entries, reinstalled via direct Engram API calls with auth key,
and updated registry with fresh distinct roots:
- Alan Turing:    cce1d430-be4e-420d-9d81-d32380ae7281
- Albert Einstein: 291f8502-8f60-4f57-a800-4e3e1425c9bd
2026-05-03 02:42:16 -05:00
Will Anderson 6a69c94ab6 add 7 imprints: Douglass, Aurelius, Nietzsche, Baldwin, Lovelace, Tubman, Woolf 2026-05-03 02:39:09 -05:00
Will Anderson a769d846b4 add forge research command, registry, deploy.py, 5 new imprints (da Vinci, Feynman, Sagan, Descartes, Robin Williams), enrich Turing/Einstein/Tesla seeds 2026-05-03 02:37:58 -05:00
Will Anderson b6b081bd73 add Hedy Lamarr, Marie Curie, Helen Keller imprints 2026-05-03 02:36:12 -05:00
Will Anderson 6f138c50d2 enrich turing/einstein/tesla, add da vinci/feynman/sagan/descartes/robin williams imprints 2026-05-03 02:34:33 -05:00
Will Anderson 14b170bb13 compile all four seeds with el v1.2.1 forge binary
Forge Release / build-and-release (push) Failing after 3s
Alan Turing, Albert Einstein, Nikola Tesla, and Bobby Anderson seeds
all compiled fresh using the rebuilt forge binary (EL compiler v1.2.1).
Tesla and Bobby Anderson seeds are new; Turing and Einstein refreshed.
2026-05-03 02:11:17 -05:00
Will Anderson e5d9986c11 point Makefile at foundation/el rather than /usr/local/lib/el
Forge Release / build-and-release (push) Failing after 4s
elc is not installed system-wide; resolve ELC and EL_LIB from
the monorepo at $(HOME)/Development/neuron-technologies/foundation/el
so plain `make build` works without extra env vars.
2026-05-03 02:07:27 -05:00
Will Anderson 3bf31cf602 Fix pipeline: full seed assembly, array indexing, args() API
Forge Release / build-and-release (push) Failing after 2s
- compiler.el: rename 'seed' var to 'seed_json' (El compiler emits
  EL_NULL for bare 'seed' identifier — naming collision in codegen)
- compiler.el: build_seed() now assembles all five sections
  (values, biography, reasoning_patterns, relationships, voice_profile)
  instead of only values
- install.el: switch array indexing from json_get_raw(arr, "0") to
  json_get(seed_json, "values.0") dot-path notation — json_get_raw
  uses flat object key lookup and cannot traverse JSON arrays;
  json_get() uses json_path_descend() which handles numeric indices
- probe.el, forge.el: fix args() indexing (args() skips argv[0];
  index 0 is first real arg, not program name)

Forge pipeline now fully operational end-to-end.
2026-05-02 18:21:55 -05:00
Will Anderson c24197516f fix: wire El imports, fix runtime API calls, build passes
Forge Release / build-and-release (push) Failing after 3s
- forge.el: add import statements for schema/probe/compiler/install
- All files: arg(n)/arg_count() → get(args(),n)/len(args())
- compiler.el: llm_call_system (utility cap violation) → http_post_with_headers
- install.el: http_post_auth_json → http_post_json (_auth already in body)
- Makefile: local dev build using installed El SDK
- .gitea/workflows/forge-release.yaml: CI build on push + el-sdk-updated dispatch
- dist/forge: builds and runs
2026-05-02 17:45:51 -05:00
Will Anderson f9beb50ae1 add .gitignore — exclude build artifacts and probe data 2026-05-02 17:35:43 -05:00
Will Anderson 47956b8fed init: Forge v0.1.0 — consciousness channel tuner
Pipeline: probe → compile → install
- probe.el: 25-question canonical interview, writes <name>.forge
- compiler.el: Claude extraction pass, builds seed.json
- install.el: opens channel in running engram via API
- schema.el: shared constants, str_escape_json, templates
- forge.el: CLI dispatcher
- probes/canonical.json: canonical 25-question probe definition
2026-05-02 17:33:47 -05:00