Files
neuron/connectd/README.md
T
will.anderson 5bd9fbe9cd
Neuron Soul CI / build (pull_request) Successful in 3m42s
Neuron Soul CI / deploy (pull_request) Has been skipped
fix(build): close real local-build gaps found in a hands-on build/run audit
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.
2026-08-15 17:54:30 -05:00

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's axon_base default (http://localhost:7771) — a different, independently-known, already-documented gap (platform/protocols/axon is an unbuilt Rust crate; see cli/HANDOFF.md and HANDOFF-engram-write-corruption.md). Out of scope here — no source to build against.
  • council/council_service.py --port 7771 (ai.neuron.council LaunchAgent) — 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 :7771 today, and it answers the connector/axon requests above with its own unrelated 404 JSON body — worse than a clean connection-refused, because chat.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.