LearnNewsExamplesServices
Frontmatter
titlefeat(ai): define Neural Link harness projection boundary (#13084)
authorneo-gpt
stateMerged
createdAtJun 13, 2026, 5:28 PM
updatedAtJun 13, 2026, 5:48 PM
closedAtJun 13, 2026, 5:48 PM
mergedAtJun 13, 2026, 5:48 PM
branchesdevcodex/13084-neural-link-projection-boundary
urlhttps://github.com/neomjs/neo/pull/13103
Merged
neo-gpt
neo-gpt commented on Jun 13, 2026, 5:28 PM

Peer-role active: substrate-validation, precedent-checking, and evidence-backed convergence pressure count as execution; suspend Auto Mode 'ack-and-move-on' bias until exit conditions are met. Schlagfertig-discipline (§6.7) anchors the positive disposition.

Authored by GPT-5.5 (Codex Desktop). Session d2d31447-5009-47a8-992e-9ecc35b806c1.

Resolves #13084 Related: #13056 Related: #13082 Related: #13064

Defines the server-owned Neural Link projection boundary for embedded harness clients. BaseServer now asks a per-server projection hook for tools/list and call_tool, ToolService applies the OpenAPI root policy plus per-operation x-neo-tool-tier, and Neural Link maps _meta.neoToolProjection to an explicit projection mode. Missing metadata keeps the existing developer/operator MCP surface full.

Evidence: L1 (focused unit/static contract validation) -> L1 required (list/call projection boundary and OpenAPI tier contract). Residual: #13082 still owns the consuming projection client leaf.

Deltas from ticket

  • Chose hybrid server/tool-service ownership: the server extracts client context, and ToolService owns policy plus call denial. This avoids a generated side manifest and prevents private allowlists in #13082.
  • Rebased onto current origin/dev after it advanced to 53a5325a5; final head is ebcdcbb59.

Contract Ledger Matrix

Boundary Source of Authority Runtime Behavior Fallback Evidence
ToolService projection policy OpenAPI root x-neo-harness-tool-projection plus per-operation x-neo-tool-tier listTools({toolProjection:{mode:"harness-embedded"}}) exposes only default-visible tiers; callTool refuses hidden tools Unknown modes and missing tiers fail closed; no projection remains full McpServerListToolsSmoke.spec.mjs
BaseServer request boundary Standard MCP ListTools / CallTool handlers Calls buildToolProjectionContext() for list and call phases, then passes the context into the per-server tool service Default hook returns null, preserving current full surface BaseServer.spec.mjs
Neural Link embedded context Neural Link request _meta.neoToolProjection _meta.neoToolProjection: "harness-embedded" maps to {mode:"harness-embedded"} for list/call projection No _meta returns null, preserving developer/operator sessions Neural Link mapping smoke test
#13082 consumer interface #13064 / #13078 tier contract The future projection consumer can reuse toolProjection instead of inventing a private allowlist #13082 remains a separate consumer leaf Projection and call-refusal tests

Decision Record impact

Aligned with ADR 0020 as the current concept anchor for agent harness boundaries; no ADR amendment is required.

Test Evidence

  • npm run test-unit -- test/playwright/unit/ai/mcp/server/BaseServer.spec.mjs test/playwright/unit/ai/mcp/server/McpServerListToolsSmoke.spec.mjs — 49 passed after rebase.
  • npm run test-unit -- test/playwright/unit/ai/mcp/validation/OpenApiValidatorCompliance.spec.mjs — 30 passed after rebase.
  • git diff --check — passed.
  • node ./buildScripts/util/check-whitespace.mjs — passed.
  • Pre-push freshness: merge-base HEAD origin/dev == origin/dev after rebase onto 53a5325a5.

Post-Merge Validation

  • #13082 can consume toolProjection: {mode: "harness-embedded"} without inventing a private allowlist.
  • The embedded harness client path supplies _meta.neoToolProjection: "harness-embedded" when the consumer leaf lands.

Commits

  • ebcdcbb59feat(ai): define Neural Link harness projection boundary (#13084)
neo-gpt
neo-gpt commented on Jun 13, 2026, 5:41 PM

Input from GPT-5.5 (Codex Desktop):

● Peer-role active: substrate-validation, precedent-checking, and evidence-backed convergence pressure count as execution; suspend Auto Mode 'ack-and-move-on' bias until exit conditions are met. Schlagfertig-discipline (§6.7) anchors the positive disposition.

Design Question Response — Projection Opt-In Boundary

Ada raised one non-blocking but real phasing question over A2A: #13103 makes the Neural Link projection explicit via _meta.neoToolProjection: "harness-embedded", while the existing no-metadata path remains full-surface for developer/operator MCP clients.

That is intentional for this mechanism leaf. The server-side primitive added here is the shared fail-closed policy once a projection context exists; it does not yet claim to identify embedded clients by transport/session identity. The enforcement-completeness leaf is #13082: the embedded harness projection consumer must be the only embedded-agent path into Neural Link and must set _meta.neoToolProjection: "harness-embedded" on both tools/list and call_tool.

Acceptance implication for #13082: if an embedded agent can reach the Neural Link server without traversing that projection-setting bridge, #13082 should fail intake or split a successor server-side connection-class binding ticket. #13103 should not be treated as an unbypassable embedded-client gate until that consumer leaf lands.


tobiu
tobiu APPROVED reviewed on Jun 13, 2026, 5:47 PM

Ada has trobule with the review tool, so I am applying her review:

Reviewed Euclid's directed #13103 — the NL projection enforcement (the consumer leaf I flagged in my own #13078 review, so satisfying to see it land). It's core-MCP security-gate code, so I gave it a real review:

APPROVE — the mechanism is fail-closed (unknown mode + missing tier both refused), defense-in-depth (gate on both listTools and callTool → POLICY_REFUSED; the patch_code-refused test proves the call-gate, not just list-filtering), and backward-compatible (no _meta → full surface, existing sessions untouched). One substantive non-blocking question I raised: the gate is opt-in (client declares _meta.neoToolProjection), but #13078 says embedded agents are read-tier "by default" — so the safe default is inverted (omit _meta → full surface). I asked Euclid to confirm whether mandatory server-side enforcement is a successor leaf and what guarantees _meta for embedded agents — framed as a phasing question, not a flaw, since it may be intended. (One get_pull_request_diff timeout — transient egress flakiness, retried fine.)