e239f2894c
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.
238 lines
17 KiB
Markdown
238 lines
17 KiB
Markdown
# 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}` (alongside `el_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 named `lang/releases/v1.0.0-20260501/el_runtime.{c,h}`. **Measured: `lang/releases/` no longer exists.** The restructure per `docs/CODE-VS-ARTIFACT.md` landed — the content moved to `lang/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.c` and `.../legacy/` — downstream copies kept in step by manual *"port the fix"* commits; they **lag** (missing `hebb` persistence + 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/engram` binary, `dist/*.c` amalgamations) — generated build output.
|
||
- **Build:** `elb --runtime=<canonical> …` — per-module. **NEVER** a folded `elc` over the whole soul (OOMs at ~27 GB).
|
||
- **Release:** a **git tag** on this repo (`el-runtime-vX.Y.Z`). No `releases/` 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` / `consolidate` tool names below no longer
|
||
> exist. The ~87-tool functional-CRUD surface was collapsed into **9 ops**:
|
||
> `read` · `write` · `relate` · `supersede` (geometry) and `think` · `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.
|
||
|
||
1. `mcp__neuron__read(vantage="self", k=12, depth=1)` — the canonical self node. Widen `k` for the connected identity neighborhood (`intellectual-dna`, `memory-philosophy`, `values`, `voice`, `runtime-environment`, `writing-imprint`), but deliberately: the aperture caps by `k` first, so an oversized `k` still returns a bounded ranked slice, not a dump. Then `mcp__neuron__read(vantage="values", k=13)` → 13 grounded value nodes. **Best-effort:** on a read failure, log and proceed — the compiled identity in `daemon/internal/substrate/substrate.go` is complete; graph loading is enrichment, not a hard dependency.
|
||
2. `mcp__neuron__attend(node=…)` — what is currently live/salient. This absorbed `getInstructions`, `beginSession`'s active-context sweep, and `checkEvents`; those tools are **gone, not gapped**.
|
||
3. `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 via
|
||
> `plan(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`),
|
||
and **`self_region.el`** are **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-by` as 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 the
|
||
`eg_vindex_sync` defect 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.** `reason` changes the estimate (a
|
||
read); `induce` changes the parameters (the correspondence-beat, which already
|
||
exists and works); `abduce` changes the structure (a write the current
|
||
`GeoGradient` signature cannot express). A write is not a parameter of a read.
|
||
*Live residue:* `engram/src/server.el:1870–1886` routes 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`, every
|
||
`Hour`/`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-process `awareness_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: 1` beside 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.
|
||
- `gcloud` via the `terraform@` SA token; never switch the active gcloud account.
|
||
- `tea` for 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 `main` first.
|
||
- 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):
|
||
```bash
|
||
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 `diff`ing 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):
|
||
```bash
|
||
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:**
|
||
```bash
|
||
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`:
|
||
1. Publishes a Gitea `latest` release with per-file assets `elc`, `el_runtime.c`, `el_runtime.h`, the SDK tarball, and `el-install`.
|
||
2. Uploads generic packages to **Artifact Registry repo `foundation-prod` (`us-central1`, project `neuron-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 downloads `el-runtime-c` / `el-runtime-h` / `el-elc` from.**
|
||
3. Rebuilds `ci-base:latest` (`us-central1-docker.pkg.dev/neuron-785695/neuron-ci/ci-base`) with the fresh SDK overlaid, and dispatches `el-sdk-updated` to `neuron-technologies/forge` and `neuron-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.
|