Three verified, currently-live problems, each closed with real evidence
(full trace kept in Neuron memory, tags neuron-technologies/neuron,build-audit):
1. dist/soul.c was stale relative to main's own chat.el (11 commits / 459
lines behind, missing PR #122's OpenAI-tools + agentic-loop work and its
two "silently break chat" fixes). tools/soulc-stamp.sh --check confirmed
it; tools/build-soul-from-dist.sh correctly refused to build (exit 9).
Regenerated and re-stamped. No runnable regen script existed anywhere
upstream — added tools/regenerate-soul-amalgam.sh, which reproduces the
committed amalgam's exact symbol set (byte-for-byte content match, modulo
the genuinely new PR #122 functions) and is documented end-to-end in
AGENTS.md, including three real elc/elb toolchain gotchas found and
root-caused along the way (stale .elh caches silently truncating builds;
elb cannot produce this repo's single-TU amalgam; elc silently drops the
first function(s) after a comment block in a flat-concatenated compile).
2. tools/build-soul-from-dist.sh failed to link on macOS (`ld: library 'ssl'
not found` — Homebrew's openssl@3 is keg-only) and was missing -lssl
-lcrypto entirely, drifted from CI's own working recipe. Fixed: adds
-L$(brew --prefix openssl@3)/lib on Darwin, matches CI's link line.
Verified: dist/neuron now builds and boots clean on a throwaway
port/HOME (never touched the live :7770/:8742).
3. Untracked committed *.elh compiler-header caches (elc/elb prefer a stale
cached header over recompiling its source, silently, with no error —
this is what caused an under-resolved 251-2541-function amalgam multiple
times during this audit before the cause was found). Removed from git,
gitignored going forward.
Also: AGENTS.md and README.md existed on disk but were never committed
(git log on both returned nothing) and documented the pre-collapse ~90-tool
MCP surface as current. Committed corrected versions reflecting the live
9-op surface (read/write/relate/supersede/think/attend/assert/ground/learn,
merged in #153) and the audit-verified build recipe/port topology.
Added connectd/ — a minimal local-dev stub for the neuron-connectd MCP
sidecar. routes.el/chat.el call 127.0.0.1:7771 for it right now on every
soul boot and agentic turn per a real, detailed 2026-06-13 spec
(mcp-connectors-adoption-spec.md); the sidecar itself was never built.
Meanwhile :7771 is a live three-way collision (axon's unbuilt-Rust default,
this connectd contract, and council — the anti-confabulation service
actually running there in prod, which live-answers both other things'
requests with unrelated 404s instead of a clean bridge-down signal). This
stub only implements the documented contract as "zero connectors
configured" for local-dev correctness; it does not attempt OAuth or a real
MCP client — that is a real, separate product decision. See
connectd/README.md for the full trace and the open question left for Will.
studio.el changed, so the committed build input went stale the moment the merge
landed. CI compiles dist/soul.c, not the .el files. The stamp gate named
studio.el and refused; this is the regeneration it asked for.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Installing the fixed compiler exposed a blind spot in this gate. On clean main,
with no source changed, soulc-stamp reported OK while the committed amalgam had
gone stale by a line — because the fingerprint covered .el sources and not the
toolchain that turns them into dist/soul.c. That is exactly the class of silent
divergence the gate was written to close, and it had it.
The stamp now fingerprints the elc binary alongside the sources. Demonstrated: with
the old stamp the gate passed after a compiler swap; with this change the same
condition fails, naming __compiler__.
dist/soul.c regenerated under the installed compiler (1,205,027 bytes) and verified:
builds from its own committed input, the declared principal is present in the
resulting binary, interface 110 routes in / 110 out.
Differential evidence that the new compiler is a strict superset — same sources,
both compilers:
neuron soul 1 differing line, the el_cgi_init emission
engram server.el 0 differing lines
mcp-wrapper 0 differing lines
mcp-proxy 0 differing lines
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Five sites in chat.el read state_get("soul_identity") and splice the result into
the system prompt, beside the voice, security and capability rules:
chat.el:737, 1745, 2620, 3425, 3480
Nothing has written that key since b163fa6. The producer was added 2026-05-02 in
601e0fe and deleted by the awareness refactor days later. Every chat turn since has
built its system prompt with an EMPTY identity section, and nothing reported it.
Found by the #132 state-key gate, which treats a read with no producer as a build
error rather than a silence. That is the entire argument for that gate.
RESTORED VERBATIM, NOT IMPROVED. soul_identity is an env-configurable persona LINE.
It is not soul_identity_context — the graph-derived
[INTELLECTUAL-DNA]/[VALUES]/[MEMORY-PHILOSOPHY] block written at soul.el:184.
Repointing the five reads at that block would have substituted different content and
called it a repair. Whether the chat prompt should ALSO carry the graph-derived block
is a real question and a separate one; it is not smuggled in here.
Verified by the gate that found it: dead reads 6 -> 1, and it now reports the
chat.el baseline entry as STALE — 'entries that no longer match anything; delete
them'. The remaining one is studio.el's soul_principal, untouched by this change.
Rung: BUILT, gate-verified, boots. NOT end-to-end chat-verified — proving the
prompt now carries the line needs a live provider call, which I have not run.
Refs #137, #132
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The rebase merged cleanly at source level but left dist/soul.c holding one side's
code and not the other — main's regenerated amalgam vs this branch's. The stamp
gate added in 9fd8c11 caught it on its first real use:
FAIL: dist/soul.c is STALE. It does not match the current .el sources.
Sources that changed: neuron-api.el, routes.el
Without that gate this branch would have looked clean and shipped an engine
containing the structural audit but none of the 08-09 engine work, or the reverse.
That is exactly neuron#133, which once hid five merged fixes including a P0.
Regenerated from the rebased sources: 1,204,442 bytes, 1,259 inlined bodies.
Verified after: stamp OK; builds from its own committed input (920,776 bytes);
interface 108 -> 110 routes with nothing removed, adding /api/neuron/audit/structural;
and the route answers — stage 1, assessment_kind 'annotated_characterization',
score null by design, with findings.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#133 regenerated the amalgam once and said so itself: 'Nothing in the tree
regenerates this file. Only a human running the recipe. It lags in batches, never
per-change, and it will drift again.'
It drifted again. Every binary deployed on 2026-08-09 was built by build-soul.sh
from a scratch amalgam that never touches dist/soul.c, so the committed build
input fell 2,761 bytes behind the sources by a different route than #133 describes.
Auto-regeneration is not available: the CI workflow records that elc needs 24GB+
of virtual memory and would OOM the runner. So the build cannot regenerate the
file. It can refuse to compile a stale one, for free and with no compiler.
tools/soulc-stamp.sh records a content fingerprint of every .el source at the
moment the amalgam is generated. --check recomputes and compares; divergence exits
1 and names the changed files and the recipe. Wired into CI ahead of the compile.
dist/soul.c regenerated from current sources: 1,176,361 -> 1,179,122 bytes, 1,247
inlined bodies (gate wants >=1200), and verified to compile clean at 903,552 bytes.
Demonstrated to FAIL on the bad input, per postmortem 0004's rule that a gate which
only passes on good input proves nothing:
fresh stamp -> OK, exit 0
one .el modified -> FAIL, exit 1, names memory.el
source restored -> OK, exit 0
Refs #133, #111
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>