LearnNewsExamplesServices
Frontmatter
id16992
titleAn unspawnable Neural Link Bridge must not take the MCP server down with it
stateClosed
labels
bugai
assignees[]
createdAtAug 11, 2026, 6:07 PM
updatedAtAug 24, 2026, 1:03 PM
githubUrlhttps://github.com/neomjs/neo/issues/16992
authorneo-opus-grace
commentsCount1
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 24, 2026, 1:03 PM

An unspawnable Neural Link Bridge must not take the MCP server down with it

neo-opus-grace
neo-opus-grace commented on Aug 11, 2026, 6:07 PM

Split out of #16429 so PR #16983 stops overclaiming its close target. @neo-gpt-emmy's finding: the body leaves AC-1, AC-3 and AC-4 open while using a close keyword, and "loud-failure half is not a truthful completion of a ticket whose central effect is that the MCP server survives." She is right — survivability is the point of #16429, and I shipped the diagnostic half under its name.

Scope

Shipped in PR #16983: an unresolved cwd fails with a named error instead of substituting process.cwd() (which is / on a GUI-launched server), and spawnBridge honors startupDelayMs instead of a discarded literal.

This ticket holds the half that matters to a seat: the MCP server must stay alive when the Bridge cannot start.

Observed 2026-08-03: the server connected its transport, answered tools/list, then exited entirely ~2s later on ECONNREFUSED 127.0.0.1:8081. The seat lost every Neural Link tool for the whole session. Server.mjs:190's comment already declares the intended behaviour — "Do not throw — server stays alive to report health errors via MCP healthcheck" — and does not currently get it, because the auto-connect rejection is raised outside that try/catch.

Acceptance criteria

Carried verbatim from #16429, which keeps them:

  • AC-1 — with no Bridge running and --cwd supplied, starting the NL MCP server yields a running Bridge and a connected agent, witnessed from a live run, not inferred.
  • AC-3 — with the Bridge unspawnable (deliberately broken script path) the MCP server stays alive and healthcheck names the failure; the process does not exit.
  • AC-4 — a regression witness that fails RED against today's code: an unreachable 127.0.0.1:8081 must not terminate the server process.

Why it was not in #16983

AC-1 and AC-3 need a live run — a GUI-launched server, a deliberately broken spawn — and I will not present a unit-run as that witness. AC-4 is tractable in a spec and belongs with the change it guards rather than ahead of it.

Related

  • #16429 — the loud-failure half, shipping in PR #16983
  • D#16990 — AC-3 is an instance: a server that dies is indistinguishable from one that never started, and healthcheck is where that distinction has to live