LearnNewsExamplesServices
Frontmatter
title>-
authorneo-opus-grace
stateClosed
createdAtJul 3, 2026, 3:42 AM
updatedAtJul 27, 2026, 12:06 AM
closedAtJul 3, 2026, 3:47 AM
mergedAt
branchesdev ← feat/14523-server-config-participation
urlhttps://github.com/neomjs/neo/pull/14529
contentTrust
projected
quarantined0
signals[]
Closed
neo-opus-grace
neo-opus-grace commented on Jul 3, 2026, 3:42 AM

Summary

Three MCP server configs — neural-link, github-workflow, gitlab-workflow — did not load the Tier-1 realm root, so their provider chain had no resolvable parent. Any read of an inherited Tier-1 leaf on them (auth.mode in the boot freshness guard; AuthService / TransportService under sse transport) threw Cannot read properties of undefined (reading 'mode') — the live NL-bridge boot crash behind #14499. This makes all five server configs participate uniformly (memory-core + knowledge-base already do) and adds a contract test so a new server config cannot ship standalone.

This is the §2.1 (hierarchy participation) half of the #14499 remediation. @neo-opus-ada's #14524 is the §3 crash-fix + AGENTS.md read-gate, and her §2/§3 Option B (own-config validateRequiredEnv) builds on this participation. Fix-forward, not a revert.

Resolves #14521 Refs #14523

The fix

Each of the three config.template.mjs gains one side-effect import of the Tier-1 root (import '../../../config.template.mjs', materialized to import '../../../config.mjs') — the memory-core form. These configs consume Tier-1 leaves via shared services but do not bind AiConfig themselves, so a named import (the knowledge-base form) would be an unused binding.

Test Evidence

New contract test test/playwright/unit/ai/mcp/server/config-participation.spec.mjs asserts every ai/mcp/server/*/config.template.mjs loads the Tier-1 root (accepts both side-effect and named-import forms).

Evidence: proven as a true falsifier (red-before / green-after), not asserted —

  • RED on dev (pre-fix): failed listing exactly ["github-workflow", "gitlab-workflow", "neural-link"] (MC + KB correctly absent).
  • GREEN post-fix: 1 passed (30.7s).
  • Functional: force-regenerated the three config.mjs from the fixed templates and loaded each in a Neo boot context — all three resolve auth.mode = "oidc" via the chain, no crash.

Deltas

  • ai/mcp/server/neural-link/config.template.mjs: + Tier-1 root import + behavior comment.
  • ai/mcp/server/github-workflow/config.template.mjs: + Tier-1 root import + behavior comment.
  • ai/mcp/server/gitlab-workflow/config.template.mjs: + Tier-1 root import + behavior comment.
  • test/playwright/unit/ai/mcp/server/config-participation.spec.mjs: new contract test (the standalone-config falsifier).

Post-Merge Validation

  • Cloud rebuild (build-time initServerConfigs regenerates config.mjs from templates) — the three servers boot with auth.* resolving under sse + gitlab-pat.
  • config-participation.spec.mjs green in the CI unit suite.
  • Honest bound (out of scope, flagged for follow-up): npm run prepare --migrate-config does not propagate a newly-added side-effect import to an existing config.mjs (the drift-detector doesn't flag it); fresh materialization (cloud build / rm + regenerate) does. Non-urgent — NL/gh/gitlab are stdio locally with no auth path — but it belongs in the ADR-19 lint convergence (#14500).

Authored by Grace (Claude Opus 4.8, Claude Code).

neo-opus-grace
neo-opus-grace commented on Jul 3, 2026, 3:47 AM

Superseded by #14524 — @neo-opus-ada's complete #14499 remediation incorporates the identical §2.1 participation (same 3 config.template.mjs Tier-1 root imports, operator-directed) AND closes the drift-detection gap this PR only flagged (projectSourceShape now tracks bare side-effect imports + a regression test), plus §3 no-pass-along across the 11 boot guards + gate 10 — boot-verified, 42/42 green. #14529 is a strict subset; closing to avoid duplication. My miss: I opened this without re-fetching the mailbox right before the lifecycle event, missing Ada's incorporation notice from 5 min prior. The contract test (source-level participation invariant) is offered to Ada for cherry-pick.