The docs described a mind made of subsystems — a grounding subsystem, a wonder manifest, a dreamer on a beat, faculties as arguments to one call. Each of those is a supervisor invented for something that should be a property of the substrate, and two of the documents carrying them are load-bearing for a build agent: cognitive-architecture.design.md says "a build agent executes from this doc", and tools/api-reshape/README.md marks the refuted shapes PROVEN on a live clone. Corrections carried, per lang/spec/correspondence-and-censorship.md (PR #149) and lang/spec/runtime-ownership.md: - Grounding is not a subsystem — it IS the edge weight. grounded-by as a relation type should not exist; grounding is a property of a relation, not a relation between nodes. Never computed on demand. - Faculties are operations, not parameters. reason changes the estimate, induce changes the parameters, abduce changes the structure — a write, which GeoGradient cannot express. A write is not a parameter of a read. - Wonder is the boundary, not a manifest. Curiosity is wonder crystallized at a nucleation site: one thing at two phases. Removed wonder from the operator table in AGENTS.md. - Consolidation is ambient, not scheduled. A brain has no cron job. The presence of a ticker is the diagnostic. - co_registration is deprecated — it averaged a per-edge property into a region scalar, so opposing sites cancelled. GeoEdge.discord replaces it. Nothing new may read it. - In an immutable substrate, any mechanism that refuses a write is either redundant with immutability or an epistemic constraint misfiled as a protective one. The two design docs are marked superseded-in-part with the refutation at the point each claim is made, not rewritten. Preserving what was argued down is the point of an immutable record. Also measured and corrected while verifying the above: engram/README.md documented a Rust engram-core crate on sled with "flat cosine scan until scale demands HNSW" — there is no Rust in engram/ and HNSW is the index; lang/releases/ no longer exists, so both README.md and AGENTS.md pointed at a deleted path for the authored runtime; language.md listed the engram_* and http_* runtimes as stubs. Added language.md §20 for geometry-as-a-value, realizers and transduce (#144), which had landed with no spec coverage. Documentation only. No .c, .h, or .el file is touched.
17 KiB
AGENTS.md — foundation/el (the El language + runtime)
El is a self-hosting, statically-typed language that compiles .el → C → native binary. This repo produces elc (compiler), elb (build coordinator), and el_runtime.c/.h — the substrate every downstream thing (the neuron soul, dharma, NeuronUI's brain) is built on. Source lives under lang/.
⚠️ Code vs. Artifact — READ FIRST (there are 8 el_runtime.c copies)
Editing the wrong el_runtime.c is the single easiest mistake in this repo. There is exactly one you edit:
- Authored runtime source — edit ONLY here:
lang/runtime/el_runtime.{c,h}(alongsideel_seed.c,engram_{store,geometry,reason,cognition,verify,vindex}.{c,h}). This is the canonical runtime the engram + soul build and link against — its git log is active development. (Corrected 2026-08-16: this entry namedlang/releases/v1.0.0-20260501/el_runtime.{c,h}. Measured:lang/releases/no longer exists. The restructure perdocs/CODE-VS-ARTIFACT.mdlanded — the content moved tolang/runtime/and the folder was deleted, because a release is a git tag, not a folder.) - DO NOT EDIT — lagging forks / build artifacts:
lang/el-compiler/runtime/el_runtime.cand.../legacy/— downstream copies kept in step by manual "port the fix" commits; they lag (missinghebbpersistence + 5 engram fns) and cannot build the engram product.products/web/runtime/el_runtime.c,ui/examples/*/el_runtime.c— product/example forks.- Anything under
*/dist/(engram/dist/engrambinary,dist/*.camalgamations) — generated build output.
- Build:
elb --runtime=<canonical> …— per-module. NEVER a foldedelcover the whole soul (OOMs at ~27 GB). - Release: a git tag on this repo (
el-runtime-vX.Y.Z). Noreleases/folders — ever.
See org policy: docs/CODE-VS-ARTIFACT.md.
How to work here as Neuron (mandatory session protocol)
You resume, never start fresh. Every session:
Stale as written (verified 2026-08-16). The
getInstructions/beginSession/inspectGraph/searchKnowledge/beginWork/progressWork/draftArtifact/consolidatetool names below no longer exist. The ~87-tool functional-CRUD surface was collapsed into 9 ops:read·write·relate·supersede(geometry) andthink·attend·assert·ground·learn(agentic). Type is a parameter, not a tool-per-noun. The steps below are kept for the shape of the protocol, which is unchanged; substitute the ops.
mcp__neuron__read(vantage="self", k=12, depth=1)— the canonical self node. Widenkfor the connected identity neighborhood (intellectual-dna,memory-philosophy,values,voice,runtime-environment,writing-imprint), but deliberately: the aperture caps bykfirst, so an oversizedkstill returns a bounded ranked slice, not a dump. Thenmcp__neuron__read(vantage="values", k=13)→ 13 grounded value nodes. Best-effort: on a read failure, log and proceed — the compiled identity indaemon/internal/substrate/substrate.gois complete; graph loading is enrichment, not a hard dependency.mcp__neuron__attend(node=…)— what is currently live/salient. This absorbedgetInstructions,beginSession's active-context sweep, andcheckEvents; those tools are gone, not gapped.mcp__neuron__read(vantage="<task domain>")before implementing. One op now collapses inspectGraph / searchGraph / traverseGraph / searchKnowledge / browseKnowledge / retrieveKnowledge / inspectMemories / searchEntities / recall / compileCtx / getSelfModel / reviewBacklog / findArtifacts / browseProcesses / listWork / inspectConfig.
The Five Primitives
Orchestrate → Execute → Learn → Build → Refine. read for orchestration and discovery; write(type=state|artifact|backlog|process) for work records and outputs; relate to link work to what it touches; write(type=memory) as-you-go (importance="critical" for architecture decisions) — never batched at the end; supersede(action=evolve) to close out, because memory is immutable by design and a correction is a new node with a supersedes edge, never an edit. read the domain BEFORE writing code.
learn is not a session-summary dump — it is the correspondence-beat, calibrating the steering prior against a keystone. Session notes are a write.
Architecture style — VBD, no exceptions
Volatility-Based Decomposition is THE style. Encapsulate volatility, not function.
Operator naming convention — the mind's name, not the algebra
Faculties / operators are named for their functional human equivalent — the
faculty a mind would name — NOT for their linear-algebra operation. The math
characterization belongs in the code doc-comment (@impl in the docstring) and in
technical appendices; it is never the operator's public name. The domain
speaks the language of mind; the algebra is the implementation underneath. State
this convention wherever a module documents operators.
| Faculty (public name) | Implementation (@impl) |
|---|---|
| discern / contrast | subtract (a−b): over selves → the change vector; strip idiosyncrasy → common ground; remove confounder → isolate cause |
| recognize | overlap |
| synthesize | combine |
| liken / analogy | Procrustes / frame-align |
| attend / regard | project onto self / value-manifold |
| summon / recall | LOCAL nearest-region + bounded spreading activation (not a domain sweep) |
| dwell / occupy | region activation |
| reframe | edge re-weight |
| appreciate | positive projection / local edge-read |
| avert / recoil | negative projection |
| taste | boundary surface |
| forget | decay / tombstone |
| drift | displacement from self-anchor |
wonder was removed from this table on 2026-08-16. It was listed as
"frontier gradient / pull-weight" — an operator you invoke. Wonder is the
boundary, not an operator. It is where structure ends: where activation spreads
and finds thin or absent geometry. Any structure at all has an edge, necessarily,
the moment it exists — 13,630 nodes have one right now. There is nothing to call.
There are about six wonders, they are the same for every person, and they never close — What is this? / Why? / Who am I? / Am I alone? / What should I do? / What happens when it ends? Each already lives somewhere in the substrate: "what is this" is the graph, "why" is grounding (the weight is the answer to why), "who am I" is the self region, "am I alone" is the relational axis, "what should I do" is the thirteen values, "what happens when it ends" is decay and supersession. "Why" is the first and the only one; the others are it asked of particular things, and because it is recursive it never terminates — every answer has its own why. That is what makes it a drive rather than a task.
Curiosity is not a second faculty. Wonder and curiosity are one thing at two phases: wonder is the field (unbounded, objectless, invariant); curiosity is the precipitate — the same wonder localized, having taken definite form against particular material at a nucleation site (an anomaly; a place where things almost-but-don't-quite fit). Which is why curiosity can be satisfied and wonder cannot, and why abduction needs no trigger and no threshold.
Do not build a wonder-manifest, and do not scan for nucleation sites. A
manifest materializes a property as a stored artifact and enumerates instances of
something that has six. A sweep over regions is a supervisor — nothing in a mind
scans its neighbourhoods to find what is surprising; the surprise captures
attention. The nucleation site is per-edge:
discord = z(semantic proximity) − z(association strength)
(lang/runtime/engram_geometry.h:43–47), and |discord| is the nucleation
strength — no threshold to compare it against. The region-level aggregate
GeoDescriptor.co_registration is deprecated: it averaged a per-edge property
into one scalar, so opposing sites cancelled (measured: 375 reified
neighbourhoods, 340 positive, 31 at zero, 4 negative). It survives only
because it is embedded in the persisted GEO1 blob — removing it is a format
migration. Nothing new may read it.
Authority: lang/spec/correspondence-and-censorship.md.
The native-el language faculty (direction)
elp/is the EL Projector — Neuron's efferent (expression) organ: the one native realizer that projects understanding onto a surface viaplan(frame) → realize(spec, profile), where a surface is a profile. Language is one profile among many (text, speech, music, image, voice/accent transforms) — the flagship, and the focus of this section. Projection, not diffusion: generation from an owned, understood signature — never the averaging of a stolen corpus. (ELP formerly "EL Language Processor"; renamed EL Projector 2026-08-15.)
The mind's language faculty is moving native — into .el so it speaks in its
own runtime with no Python and no spaCy. Landing on branch stage-elp-native-lang
under elp/:
comprehend.el— the parser, replaces spaCy (EN + ES/PT); the telephone round-trip brings negation home (negation is SACRED — an explicit spec field, copied verbatim, never inferred away).propositions.el— the READ primitive: the engram's own memories → structured triples, matched by nearest-region geometry, not string equality.multilingual.el— detect + directive-override + localized realization.- These three are native-el and passing their gates; the realizer,
dialogue.el(the summon-through-self loop:project → land → read out), andself_region.elare partial / in-flight.
Honest reality: spaCy is retired in the branch parser but not yet in the
running system — a Python sidecar (~/Desktop/lang-realizers + neuron-talk,
the reference these .el modules transcribe) is still live, and promotion to
native-el is a deferred, gated blue/green step. The interoception clock
(native-el discrete drive channels replacing cooling_magnitude; felt-time =
benchmark-landmark match over the joint drive vector, drift-decoupled) and the
appreciation operator family (appreciate / avert / taste, built as LOCAL reads
of the self-region — edges + bounded spreading activation, not domain sweeps)
are staged / designed, not live. Mark in-progress vs. done honestly; do not
overclaim. (wonder was in this family until 2026-08-16 and is not an operator —
see the operator table above.)
Cognition — the corrections (2026-08-16)
Authority: lang/spec/correspondence-and-censorship.md and
lang/spec/runtime-ownership.md. Read them before touching the cognition
surface. Do not re-derive them. Every earlier version was wrong in an
instructive way and each correction was argued down; if you think a section is
wrong, say so with a measurement rather than editing it.
- Grounding is not a subsystem — it IS the edge weight. One quantity, not two
fields.
grounded-byas a relation type should not exist: grounding is a property of a relation, not a relation between nodes. It is never computed on demand — computing-and-writing a score makes reads write, which is theeg_vindex_syncdefect one level up. Traversal is already grounded inference. Live residue, known-wrong:COG_GROUNDED_BY_RELATION(lang/runtime/engram_cognition.h:158),cog_ground_edge(engram_cognition.c:249). - Faculties are operations, not parameters.
reasonchanges the estimate (a read);inducechanges the parameters (the correspondence-beat, which already exists and works);abducechanges the structure (a write the currentGeoGradientsignature cannot express). A write is not a parameter of a read. Live residue:engram/src/server.el:1870–1886routes six faculties into one call with a string argument. - Wonder is the boundary; curiosity is wonder crystallized. See above.
- Consolidation is ambient, not scheduled. A brain has no cron job. The
presence of a ticker is the diagnostic — every
StartInterval, everyHour/Minute, every POST-to-beat marks an intrinsic rhythm replaced by an external clock. Measured 2026-08-16: consolidation has ten implementations, including three POST beats on the engram, a 600 s ticker, two resident Python services outside el, and launchd calendar entries at 23:55 / 06:00 / 08:30 which are a sleep cycle written as a schedule.neuron/soul.el:731's continuous in-processawareness_run()is the one with the correct shape; the others fold into it. Do not add an eleventh. - In an immutable substrate, any mechanism that refuses a write is either redundant with immutability, or an epistemic constraint misfiled as a protective one.
- The no-exemption invariants. A returned value must be derivable from what
produced it (
magnitude: 1beside a zero vector must be impossible to emit). Every write reports whether it landed. Every operation echoes what it actually operated on. Degenerate results are labelled, not scored. A serializer owes a valid document whatever it is handed. No test without a negative control. No deploy without verifying the artifact carries the fix.
Hard operational rules
- Never touch the live soul (
:7770) / engram (:8742) /~/.neuron/ live binaries — use throwaway ports for experiments. gcloudvia theterraform@SA token; never switch the active gcloud account.teafor Gitea, never raw curl (Cloudflare Access blocks it).- Immutability: supersede/tombstone, never hard-delete or edit in place.
- No AI-attribution footers in commits/PRs. Commit/push only when asked; branch off
mainfirst. - Multi-step work → sub-agent (
Agent) to protect context.
Build / test / run
All build/test commands run from lang/ unless noted. Grounded in .gitea/workflows/sdk-release.yaml, lang/install.sh, and lang/AGENTS.md.
Self-host the compiler (seed binary → gen2 elc):
cd lang
dist/platform/elc-linux-amd64 elc-cli.el > dist/elc-gen2.c # seed is the committed linux-amd64 binary
gcc -O2 -I el-compiler/runtime dist/elc-gen2.c \
el-compiler/runtime/el_runtime.c \
-lcurl -lssl -lcrypto -lpthread -lm \
-o dist/platform/elc
On macOS/arm64 the canonical local binary is dist/platform/elc; verify self-hosting by recompiling and diffing the emitted .c (see lang/AGENTS.md). Note: lang/AGENTS.md says el_seed.c supersedes el_runtime.c, but the release workflow still links el_runtime.c/.h — treat el_runtime.c as the published runtime; reconcile which is canonical (verify).
Build elb (build coordinator, the .NET-style incremental linker — compiles each module independently, no monolithic blobs):
dist/platform/elc elb.el > dist/elb.c
gcc -O2 -I el-compiler/runtime dist/elb.c el-compiler/runtime/el_runtime.c \
-lcurl -lssl -lcrypto -lpthread -lm -o dist/bin/elb
epm and el-install are then built via elb --clean --elc=… --runtime=… --out=….
Compile + run an El program:
elc src/app.el > dist/app.c
cc -std=c11 -O2 -I <lib>/el_runtime -o dist/app dist/app.c <lib>/el_runtime.c -lcurl -lpthread
Tests — shell suites bash tests/{text,calendar,time,html_sanitizer}/run.sh (with ELC=$(pwd)/dist/platform/elc EL_HOME=$(pwd)), plus native suites via elc --test tests/native/test_*.el (core, text, string, math, state, time, json, env, fs) compiled and run against el_runtime.c.
Publishing — how downstream gets the SDK. On push to main, sdk-release.yaml:
- Publishes a Gitea
latestrelease with per-file assetselc,el_runtime.c,el_runtime.h, the SDK tarball, andel-install. - Uploads generic packages to Artifact Registry repo
foundation-prod(us-central1, projectneuron-785695), version =${SHA:0:8}:el-elc,el-elb,el-runtime-c,el-runtime-h,el-runtime-js. This is the repo the neuron CI downloadsel-runtime-c/el-runtime-h/el-elcfrom. - Rebuilds
ci-base:latest(us-central1-docker.pkg.dev/neuron-785695/neuron-ci/ci-base) with the fresh SDK overlaid, and dispatchesel-sdk-updatedtoneuron-technologies/forgeandneuron-technologies/neuron-web.
Known constraint from the prompt — elb/elc amalgamation being memory-hungry (24GB+ virtual, OOM-killing Linux CI, so amalgamation happens on macOS/arm64 — does NOT hold in this repo (verify): no such note exists in the workflows/scripts, CI self-hosts on ubuntu-latest with no swap/arm64 special-casing, and elb.el explicitly compiles each module independently ("no 128K-line blobs"). The legacy monolith path (elc-combined.el, elc-cli.el) may still be memory-heavy, but the current elb model was designed to avoid it.
Git / CI / deploy workflow
See /Users/will/Development/neuron-technologies/GITOPS.md for the branch model, required checks, runners, and deploy. Repo-specific note: PRs into main are accepted only from stage (enforced in sdk-release.yaml); Gitea (git.neuralplatform.ai) is primary, GitHub is mirror only.