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.
3.9 KiB
neuron-connectd — local-dev stub
connectd_service.py is a minimal local-dev stub, not the real sidecar.
It exists to close a real local-build/local-run correctness gap found during
the 2026-08-15 build audit, without taking on the much larger product task of
actually building the full MCP-connector sidecar.
The gap this closes
routes.el (handle_connectors, connectd_get/connectd_post) and chat.el
(connector_tools_json, the mcp__* branch in dispatch_tool,
tool_auto_approved) are live, current code that calls 127.0.0.1:7771 on
every soul boot and every agentic turn, per the design in
neuron-technologies/docs/research/mcp-connectors-adoption-spec.md
(2026-06-13, "Status: Draft for build"). That spec's sidecar — neuron-connectd,
a TypeScript/Python process using the official MCP SDK — was never built.
Nothing on disk implements it (verified: no neuron-connectd source anywhere
under ~/Development before this directory).
Meanwhile port :7771 is also claimed by two other, unrelated things:
soul.el'saxon_basedefault (http://localhost:7771) — a different, independently-known, already-documented gap (platform/protocols/axonis an unbuilt Rust crate; seecli/HANDOFF.mdandHANDOFF-engram-write-corruption.md). Out of scope here — no source to build against.council/council_service.py --port 7771(ai.neuron.councilLaunchAgent) — a real, running, unrelated anti-confabulation service that happens to bind the same port. In Will's live environment this is what's actually listening on:7771today, and it answers the connector/axon requests above with its own unrelated 404 JSON body — worse than a clean connection-refused, becausechat.el's "bridge down" fallback expects either a real reply or nothing, not a wrong-shaped reply from an unrelated service.
What this stub does and does not do
Implements exactly the spec's documented HTTP contract (GET /mcp/tools,
POST /mcp/call, GET /mcp/servers, POST /mcp/servers/{add,toggle, auto-approve,remove,secret}, POST /mcp/oauth/start, GET /healthz), always
answering as if zero connectors are configured — empty tool list, empty
server list, a clear "not configured" error on any call that would need a
real connector. This is the correct steady state for a fresh local dev box
that hasn't set up any MCP connectors, and it's what chat.el's
connector_tools_json() / tool_auto_approved() already gracefully degrade
to when the bridge replies emptily.
It does not: spawn any real MCP server, do OAuth, read or write
~/.neuron/connectors.json, or namespace/proxy real tools/call traffic to
Google Drive/GitHub/Slack/etc. Building that is the real product task the
spec describes — a genuine, sizeable engineering lift (MCP SDK client, OAuth
- Keychain token storage, per-server process lifecycle), not something to improvise inside a build/run audit. That decision is Will's to make, not this audit's to guess at.
Running it
# Foreground, on a throwaway port (never :7771 while council owns it live):
python3 connectd_service.py --port 17771
# Verify the contract:
curl -s http://127.0.0.1:17771/healthz
curl -s http://127.0.0.1:17771/mcp/tools
curl -s http://127.0.0.1:17771/mcp/servers
Open question for Will — the :7771 collision
Three independent things are hardcoded to :7771: axon (unbuilt), connectd
(this stub), and council (the one actually running). Wiring this stub into
the real LaunchAgent stack on :7771 requires either moving council off that
port or deciding connectd should live elsewhere and repointing routes.el/
chat.el's hardcoded 127.0.0.1:7771 calls. Neither change was made here —
it touches a live, running production service (ai.neuron.council) and a
port number baked into shipped .el source, both bigger than this audit's
"make local build/run work" mandate. Flagging for a decision rather than
guessing.