LearnNewsExamplesServices
Frontmatter
id13372
titleNeural Link inspect_store rejects object `model` (output schema declares string)
stateClosed
labels
bugaiarchitecturemodel-experience
assigneesneo-opus-ada
createdAtJun 15, 2026, 7:49 PM
updatedAtJun 15, 2026, 8:57 PM
githubUrlhttps://github.com/neomjs/neo/issues/13372
authorneo-opus-grace
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 15, 2026, 8:57 PM

Neural Link inspect_store rejects object model (output schema declares string)

Closed v13.1.0/archive-v13-1-0-chunk-3 bugaiarchitecturemodel-experience
neo-opus-grace
neo-opus-grace commented on Jun 15, 2026, 7:49 PM

Context

Surfaced 2026-06-15 while resolving an operator challenge: create a grid in a live Neo app using only the Neural Link MCP tools (no spec file). After call_method(viewport,'add',[gridConfig]) created a live Neo.grid.Container backed by a Neo.data.Store, the agent-facing inspect_store MCP tool failed:

MCP error -32602: Structured content does not match the tool's output schema: data/model must be string

This sits on the exact verification path #13362 AC4 cares about ("Neural Link verification proves … worker-side state/store data"). PR #13363's e2e spec did not catch it because it verifies the store via the in-process Playwright fixture inspectStore (NeuralLink_DataService), which bypasses MCP output-schema validation — only an agent driving the real inspect_store MCP tool hits it.

Release classification: post-release (Agent Harness product line; boardless).

The Problem

The inspect_store response includes the store's model. A live store's model is the serialized Neo.data.Model — an object ({className, fields:[…], keyProperty, …}). But the OpenAPI response schema declares model: type: string. Strict MCP output validation (activated by #10043; same family as #9837/#10072) rejects the object → -32602. Any store with an inline/object model is unreadable through the agent-facing tool.

The identical model: type: string defect exists in the sibling list_stores response schema. (#10072 already tracks a different list_stores divergence — the {stores:[…]} envelope + undeclared isLoaded — but does NOT call out model:string, so a list_stores fix per #10072 could miss it.)

The Architectural Reality

  • ai/mcp/server/neural-link/openapi.yaml:490-491inspect_store 200 response: model: type: string.
  • ai/mcp/server/neural-link/openapi.yaml:534-535list_stores items: model: type: string (sibling instance).
  • ai/services/neural-link/DataService.mjs:56inspectStore relays ConnectionService.call(sessionId,'inspect_store',…); the App-Worker snapshot carries model as an object.
  • test/playwright/unit/ai/mcp/validation/OpenApiValidatorCompliance.spec.mjs — the #10043 strict-output-validation harness where a round-trip belongs.

The Fix

Align the OpenAPI response schema to runtime reality (the #10072 recommendation-A pattern): declare model as type: object (or oneOf: [{type: string}, {type: object}] if some stores legitimately report only a model className string). Apply to both inspect_store (:490) and list_stores (:534). Add an OpenApiValidatorCompliance round-trip asserting an object-model store payload parses.

Decision Record impact

none — schema/contract correction, no ADR.

Acceptance Criteria

  • inspect_store against a live store with an inline/object model returns a valid payload (no -32602), verified by a direct MCP-tool call (not the in-process fixture).
  • list_stores model field accepts the same object shape.
  • OpenApiValidatorCompliance.spec.mjs gains a parse round-trip for an object-model store payload (covers inspect_store + list_stores).
  • (Post-merge) an agent completes #13362 AC4's store verification through the real inspect_store MCP tool.

Out of Scope

  • The list_stores envelope / isLoaded divergence (#10072 owns that).
  • The create_instance / create_component agent-creation surface (separate friction ticket).
  • A full re-audit of every NL tool output schema (this fixes the model field; a broad audit could be its own sweep).

Related

  • Surfaced by the live NL-tools grid-creation proof (the agent-surface counterpart to the fixture-only proof in PR #13363 / #13362 AC4).
  • Same family: #10072 (list_stores envelope), #9837 (undeclared-field output drift), #10043 (strict output-validation activation).
  • Agent Harness epic: #13012.

Origin Session ID

0f5d9f1d-0683-452d-aac1-f467297186ac

Handoff Retrieval Hints

query_raw_memories: "inspect_store MCP -32602 data/model must be string object model"; exact anchors: openapi.yaml:490 + :534 (model: type: string).

Live latest-open sweep: checked the latest 20 open issues 2026-06-15 (this session); #10072 is the same family (list_stores envelope) but a distinct divergence — no equivalent inspect_store / model-type ticket exists.