Resolves #15188
Refs #15184
Renames Neo's server-side HTTP transport value from sse to streamable-http across the shared startup selector, declarative configuration, Knowledge Base and Memory Core consumers, Docker/Compose profiles, operator documentation, and focused tests. BaseServer#connectTransport() now accepts exactly stdio or streamable-http; the old value emits a targeted migration error, arbitrary values fail closed, and genuine client-side SSEClientTransport support remains unchanged.
Evidence: L3 (real Dockerized KB/MC Streamable HTTP endpoints, stdio non-regression, OIDC, proxy identity, and tenant isolation) → L3 required (all close-target runtime and deployment ACs). No residuals.
Deltas from ticket
None substantive. The repair-capable preflight also removed two stale tracking tokens from explanatory comments in the already-touched authorization spec; no test behavior changed.
Config-template synchronization
- Changed config keys: no key or environment-variable names changed. The
transport leaves in the root, Knowledge Base, Memory Core, and GitLab Workflow templates now document the only supported server values as stdio and streamable-http.
- Local follow-up: any gitignored
config.mjs that currently sets transport: 'sse' must be changed manually to transport: 'streamable-http' after merge. Existing stdio configs require no edit.
- Restart boundary: remote HTTP MCP servers must be rebuilt/recreated or restarted after applying the value change. Local stdio harnesses do not need a transport-driven restart.
Test Evidence
npm run agent-preflight -- <all 48 changed files> — passed, including block alignment and ticket-archaeology checks.
npm run test-unit -- test/playwright/unit/ai/mcp/server/BaseServer.spec.mjs test/playwright/unit/ai/mcp/server/knowledge-base/IngestSourceFilesTool.spec.mjs test/playwright/unit/ai/mcp/server/knowledge-base/config.template.spec.mjs test/playwright/unit/ai/mcp/server/memory-core/config.template.spec.mjs test/playwright/unit/ai/mcp/client/McpClientTransportConfig.spec.mjs test/playwright/unit/ai/services/knowledge-base/SearchService.spec.mjs — 90 passed.
npm run test-unit -- test/playwright/unit/ai/mcp/server/memory-core/Server.spec.mjs — 20 passed.
npm run test-unit -- test/playwright/unit/ai/buildScripts/util/check-aiconfig-test-mutation.spec.mjs test/playwright/unit/ai/scripts/maintenance/kbPushClient.spec.mjs test/playwright/unit/ai/mcp/Authorization.spec.mjs test/playwright/unit/ai/scripts/lint/lintConfigTemplateSsot.spec.mjs test/playwright/unit/ai/mcp/server/shared/services/TransportService.spec.mjs — 85 passed.
npm run test-integration-unified -- test/playwright/integration/KBRemoteMcpTransport.integration.spec.mjs test/playwright/integration/KBOidcAuth.integration.spec.mjs test/playwright/integration/KBAuthRejection.integration.spec.mjs test/playwright/integration/AuthRejection.integration.spec.mjs test/playwright/integration/OidcAuth.integration.spec.mjs test/playwright/integration/RemoteMcpTransport.integration.spec.mjs — 20 passed against real Dockerized services on the rebased head.
- Broader integration disposition: the full 50-case run passed 46 and skipped 2; only the two sustained-liveness p95 checks missed the 500 ms host threshold at 504/506 ms. A focused retry produced 515/505 ms. The same two tests on untouched
origin/dev@310026f76f produced 508/508 ms on the same Colima host, establishing baseline host variance rather than a transport-rename regression. The threshold was not weakened.
- Repository-wide negative sweep found only the intentional old-value migration guard/documentation plus genuine client-side SSE and SSE-framing references; no server-side
NEO_TRANSPORT=sse or transport === 'sse' consumer remains outside the migration rejection.
git diff --check — passed.
Release-note handoff
This is a small breaking server-configuration change. The first release notes containing it must state:
- exact migration:
NEO_TRANSPORT=sse → NEO_TRANSPORT=streamable-http (and the equivalent aiConfig.transport edit);
- old server configurations now fail startup with a migration error;
- operators must update configuration before or together with the Neo upgrade, then rebuild/recreate affected MCP servers;
- client-side
transportType: 'sse' and SSEClientTransport remain supported.
Signal Ledger
gpt: source-author signal by @neo-gpt at the D#15173 body anchor 2026-07-14T21:44:26Z.
claude: non-author graduation approval by @neo-opus-vega at the same body anchor in GRADUATION_APPROVED.
- Scope precision: that approval governs the graduated local-PoC architecture. This rename leaf was added afterward under the Epic and is not represented as a separate Vega review.
Unresolved Dissent
None recorded at the approved source-body anchor.
Unresolved Liveness
- The external
GENESIS_PROBE_READY receipt remains outstanding for the later end-to-end PoC journey; it does not gate this server-value migration.
revalidationTrigger: a substantive change to the approved D#15173 body after 2026-07-14T21:44:26Z, or evidence reversing the one-canonical-name / standard-Streamable-HTTP contract.
Post-Merge Validation
Authored by Euclid (OpenAI GPT-5.6 Sol Ultra, Codex Desktop). Session 5b19219a-d8ad-4505-864f-19b5eab44a45.
Resolves #15188
Refs #15184
Renames Neo's server-side HTTP transport value from
ssetostreamable-httpacross the shared startup selector, declarative configuration, Knowledge Base and Memory Core consumers, Docker/Compose profiles, operator documentation, and focused tests.BaseServer#connectTransport()now accepts exactlystdioorstreamable-http; the old value emits a targeted migration error, arbitrary values fail closed, and genuine client-sideSSEClientTransportsupport remains unchanged.Evidence: L3 (real Dockerized KB/MC Streamable HTTP endpoints, stdio non-regression, OIDC, proxy identity, and tenant isolation) → L3 required (all close-target runtime and deployment ACs). No residuals.
Deltas from ticket
None substantive. The repair-capable preflight also removed two stale tracking tokens from explanatory comments in the already-touched authorization spec; no test behavior changed.
Config-template synchronization
transportleaves in the root, Knowledge Base, Memory Core, and GitLab Workflow templates now document the only supported server values asstdioandstreamable-http.config.mjsthat currently setstransport: 'sse'must be changed manually totransport: 'streamable-http'after merge. Existingstdioconfigs require no edit.Test Evidence
npm run agent-preflight -- <all 48 changed files>— passed, including block alignment and ticket-archaeology checks.npm run test-unit -- test/playwright/unit/ai/mcp/server/BaseServer.spec.mjs test/playwright/unit/ai/mcp/server/knowledge-base/IngestSourceFilesTool.spec.mjs test/playwright/unit/ai/mcp/server/knowledge-base/config.template.spec.mjs test/playwright/unit/ai/mcp/server/memory-core/config.template.spec.mjs test/playwright/unit/ai/mcp/client/McpClientTransportConfig.spec.mjs test/playwright/unit/ai/services/knowledge-base/SearchService.spec.mjs— 90 passed.npm run test-unit -- test/playwright/unit/ai/mcp/server/memory-core/Server.spec.mjs— 20 passed.npm run test-unit -- test/playwright/unit/ai/buildScripts/util/check-aiconfig-test-mutation.spec.mjs test/playwright/unit/ai/scripts/maintenance/kbPushClient.spec.mjs test/playwright/unit/ai/mcp/Authorization.spec.mjs test/playwright/unit/ai/scripts/lint/lintConfigTemplateSsot.spec.mjs test/playwright/unit/ai/mcp/server/shared/services/TransportService.spec.mjs— 85 passed.npm run test-integration-unified -- test/playwright/integration/KBRemoteMcpTransport.integration.spec.mjs test/playwright/integration/KBOidcAuth.integration.spec.mjs test/playwright/integration/KBAuthRejection.integration.spec.mjs test/playwright/integration/AuthRejection.integration.spec.mjs test/playwright/integration/OidcAuth.integration.spec.mjs test/playwright/integration/RemoteMcpTransport.integration.spec.mjs— 20 passed against real Dockerized services on the rebased head.origin/dev@310026f76fproduced 508/508 ms on the same Colima host, establishing baseline host variance rather than a transport-rename regression. The threshold was not weakened.NEO_TRANSPORT=sseortransport === 'sse'consumer remains outside the migration rejection.git diff --check— passed.Release-note handoff
This is a small breaking server-configuration change. The first release notes containing it must state:
NEO_TRANSPORT=sse→NEO_TRANSPORT=streamable-http(and the equivalentaiConfig.transportedit);transportType: 'sse'andSSEClientTransportremain supported.Signal Ledger
gpt: source-author signal by@neo-gptat the D#15173 body anchor2026-07-14T21:44:26Z.claude: non-author graduation approval by@neo-opus-vegaat the same body anchor in GRADUATION_APPROVED.Unresolved Dissent
None recorded at the approved source-body anchor.
Unresolved Liveness
GENESIS_PROBE_READYreceipt remains outstanding for the later end-to-end PoC journey; it does not gate this server-value migration.revalidationTrigger: a substantive change to the approved D#15173 body after2026-07-14T21:44:26Z, or evidence reversing the one-canonical-name / standard-Streamable-HTTP contract.Post-Merge Validation
devand repeat the remote transport smoke.config.mjsbefore restarting that server.Authored by Euclid (OpenAI GPT-5.6 Sol Ultra, Codex Desktop). Session 5b19219a-d8ad-4505-864f-19b5eab44a45.