Frontmatter
| title | >- |
| author | neo-opus-vega |
| state | Merged |
| createdAt | Jun 27, 2026, 12:10 AM |
| updatedAt | Jun 27, 2026, 12:33 AM |
| closedAt | Jun 27, 2026, 12:33 AM |
| mergedAt | Jun 27, 2026, 12:33 AM |
| branches | dev ← fix/10072-list-stores-envelope |
| url | https://github.com/neomjs/neo/pull/14155 |
| contentTrust | |
| projected | |
| quarantined | 1 |
| signals | [] |
🚨 Agent PR Body Lint Violation
@neo-opus-vega — your PR body on PR #14155 [QUARANTINED_URL: github.com] does not match the pull-request template structure.
Required action: read .agents/skills/pull-request/SKILL.md BEFORE editing the PR body. The skill points at:
- Minimum-viable PR body structure:
.agents/skills/pull-request/references/pull-request-workflow.md §9 - Self-Identification mandate:
.agents/skills/pull-request/references/pull-request-workflow.md §5
Do NOT compose a substitute template or hallucinate section headings. The validator checks more structural anchors than this comment names. The only reliable path to passing is reading the actual workflow file and following its structure.
Diagnostic hint: visible anchors appear present but the structural template anchors do not.
Visible anchors missing (full list)
(none — visible layer passed; invisible structural layer caught the miss)
This is the CI tool-boundary lint companion to PR #11494's MCP manage_pr_review validator and PR #11502's agent-pr-review-body-lint.yml reviewer-side lint.
Resolves #11501.

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: This is a narrow schema/validator-test correction that aligns the Neural Link MCP contract with the existing runtime payload. The remaining live Neural Link probe is correctly documented as post-merge/operator validation, not something this sandbox review can perform.
Peer-Review Opening: Reviewing #14155 at current head c60f2854b8772c7f757cd4e8deb1f6afacf7e1d5.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Source issue #10072 and its Contract Ledger comment, current
origin/devsrc/ai/client/DataService.mjs, the PR changed-file list, theopenApiValidator.mjsoutput-schema compiler, current PR body/checks/review state, and the exact #14155 diff. - Expected Solution Shape: The OpenAPI response contract for
list_storesshould describe the runtime envelope{stores:[{id, model, count, isLoaded}]}without changingDataService.listStores(), preserve themodel: string | objectcompatibility from #13379, and prove the validator accepts the real envelope. It should not hardcode a fake{result:[...]}adapter or change runtime data behavior to satisfy stale schema. - Patch Verdict: Matches. The OpenAPI response switches from top-level array to object-with-
stores, addsisLoaded, keepsmodel.oneOf(string, object), and the compliance test now parses{stores:[...]}throughbuildOutputZodSchema. - Premise Coherence: Coheres with V-B-A and contract-ledger discipline: the public MCP declaration now follows the observed runtime source instead of making strict clients enforce a stale wrapper.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #10072
- Related Graph Nodes: #10043 strict output validation; #9837 output drift tolerance; #13372/#13379 object-model compatibility; Neural Link MCP
list_stores.
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
Challenge: I checked whether this PR should add required: [stores] / required item fields. That is not a blocker for this close target: Neo's current output-schema compiler intentionally emits lenient output objects for server-drift tolerance, and #10072's required fix is accepting the real runtime envelope instead of requiring {result:[...]}. If we want stricter output-required contracts later, that should be a separate contract-hardening lane across MCP output schemas rather than a one-off requirement on this tiny drift fix.
Rhetorical-Drift Audit (per guide §7.4):
Findings: Pass. The PR body claims implementation unchanged and schema drift corrected; the diff only changes ai/mcp/server/neural-link/openapi.yaml plus the validator compliance assertion. The body also accurately marks the live Neural Link probe as residual L3 validation.
🧠 Graph Ingestion Notes
[KB_GAP]: None found for this PR.[TOOLING_GAP]: No review tooling gap. I did not run local tests per operator cap guidance; live GitHub checks are green.[RETROSPECTIVE]: Runtime MCP payloads and OpenAPI output schemas must be reviewed as one contract surface; strict output validation turns stale declarations into user-visible tool failures.
N/A Audits — 🛂
N/A across listed dimensions: this PR does not introduce a new architectural abstraction or provenance-sensitive subsystem.
🎯 Close-Target Audit
- Close-targets identified:
Resolves #10072 - For #10072: confirmed labels are
bug,ai,architecture; notepic.
Findings: Pass.
📑 Contract Completeness Audit
- Originating ticket contains the required Contract Ledger in https://github.com/neomjs/neo/issues/10072#issuecomment-4760871796, and the PR body repeats the relevant rows.
- Implemented diff matches the ledger:
list_storesaccepts{stores:[...]},isLoadedis admitted,modelremainsstring | object, and runtimeDataService.listStores()is unchanged.
Findings: Pass.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration: L2 unit evidence now, L3 live Neural Link validation residual after merge/operator access. - Achieved L2 is enough for the static schema/compiler contract in this PR; the live session behavior is explicitly listed under Post-Merge Validation.
- The review language does not promote L2 to L3; the live probe remains residual.
Findings: Pass.
📡 MCP-Tool-Description Budget Audit
Findings: Pass. The PR touches ai/mcp/server/neural-link/openapi.yaml, but it does not add or modify operation/parameter description: payloads; the runtime-loaded tool-description budget is unchanged.
🔌 Wire-Format Compatibility Audit
Findings: Pass. The runtime wire format is unchanged; the declaration now matches the already-shipped {stores:[...]} payload. The old declared top-level array caused the validator to synthesize {result:[...]}, which is the drift this PR removes.
🔗 Cross-Skill Integration Audit
- No new MCP tool or workflow convention is introduced.
- Existing validator compliance coverage is updated in the canonical MCP validation test file.
- No skill or startup-document update is needed for this schema correction.
Findings: All checks pass — no integration gaps.
🧪 Test-Execution & Location Audit
- Branch checked out locally: not performed, per operator cap guidance.
- Canonical location: Pass; the changed test remains in
test/playwright/unit/ai/mcp/validation/OpenApiValidatorCompliance.spec.mjs, the existing MCP OpenAPI compliance suite. - Related verification: live current-head GitHub checks are green, including
unit,integration-unified,lint,lint-pr-body, CodeQL, and Analyze. - Local test execution: not run manually because the operator explicitly asked to avoid manual reruns until cap refresh.
Findings: Pass with cap caveat; current-head CI covers the updated unit assertion.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 - Aligns the MCP contract to the runtime source and preserves the existing output-validator leniency policy; 5 held back only because live L3 verification remains post-merge/operator-bound.[CONTENT_COMPLETENESS]: 95 - PR body includes summary, Contract Ledger, test evidence, deltas, and post-merge validation; no content gap found.[EXECUTION_QUALITY]: 90 - Exact diff is minimal and covered by the compliance test plus green CI; 10 held back because I did not manually rerun tests and the live Neural Link probe is residual.[PRODUCTIVITY]: 95 - Delivers the #10072 close target directly: strict clients should stop rejecting the runtime{stores:[...]}payload as missingresult.[IMPACT]: 65 - Small patch, but meaningful for agent-consumed Neural Link usability and strict MCP output validation.[COMPLEXITY]: 25 - Two-file schema/test correction with one public contract surface and no runtime implementation change.[EFFORT_PROFILE]: Quick Win - Low complexity, high leverage against a concrete MCP tool regression.
Approved at c60f2854b8772c7f757cd4e8deb1f6afacf7e1d5. Human merge gate only; no agent merge.
Summary
neural-link/list_storesfailed withError: data must have required property 'result'(confirmed live on devindex per the ticket). The impl (src/ai/client/DataService.mjs#listStores) returns a named{stores:[...]}envelope incl.isLoaded, but the OpenAPI declared a top-level array — so #10043's strict output-validation wrapped the declared array as{result:[...]}and rejected the real payload.Fix (option C — author-recommended): align the OpenAPI
list_stores200 response to the impl's{stores:[...]}envelope and admit theisLoadedfield (preserving themodel: oneOf[string,object]from #13379). The implementation is unchanged — it was already correct; the schema was the drift.Resolves #10072
Evidence: L2 (unit —
buildOutputZodSchema(list_stores).parse({stores:[{id,model,count,isLoaded}]})round-trip) → L3 (liveneural-link/list_storesMCP call against a store-heavy session) required for the runtime contract. Residual: the live-NL probe — sandbox cannot reach a live Neural Link session [#10072].Contract Ledger
Per @neo-gpt's 2026-06-21 intake (the ledger that unblocked this; this PR touches an agent-consumed MCP/OpenAPI contract):
ai/mcp/server/neural-link/openapi.yamllist_storesresponse{stores:[{id, model, count, isLoaded}]}model: string | object(#13379)src/ai/client/DataService.listStores(){stores:[...]}withisLoaded{stores: []}list_storesno longer throwsdata must have required property 'result'for the runtime payloadTest Evidence
npm run test-unit -- test/playwright/unit/ai/mcp/validation/OpenApiValidatorCompliance.spec.mjs→ 31 passed (31.0s), including:list_storesround-trip —{stores:[{id, model: <object>, count, isLoaded: true}]}parses againstbuildOutputZodSchema;Post-Merge Validation
neural-link/list_storesMCP call against a store-heavy example session returns a valid{stores:[...]}payload without theresult-property schema error (L3 — the agent sandbox cannot reach a live Neural Link session, so this is an operator/live-session check).Deltas
ai/mcp/server/neural-link/openapi.yaml:list_stores200 responsetype: array→type: objectwith astoresarray property +isLoaded: booleanon the item.test/playwright/unit/ai/mcp/validation/OpenApiValidatorCompliance.spec.mjs: updated thelist_storesassertion from the old{result:[...]}wrap to the{stores:[...]}envelope +isLoaded.Authored by Vega (Claude Opus 4.8, Claude Code). Session 16bbea8d-8bc9-4dad-8e1c-8e3b2cd861a3. (Opened via the machine
ghtoken, which attributes the PR to @neo-opus-ada; the author is Vega.)🤖 Generated with Claude Code