The line references were correct but silently implied the code was on dev.
It is on design/correspondence-and-censorship (a8845e1). On dev,
co_registration is still at engram_geometry.h:79 with its original comment
and still unread by anything.
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), and |discord| is
the nucleation strength — no threshold to compare it against. Not on dev yet:
GeoEdge.discord is on branch design/correspondence-and-censorship
(a8845e1), at lang/runtime/engram_geometry.h:43–47. 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.