Skip to content

fix(memory): typer aussi les schémas de SORTIE des outils MCP#1611

Merged
cyberlife-coder merged 2 commits into
developfrom
fix/mcp-output-schemas-typed
Jul 26, 2026
Merged

fix(memory): typer aussi les schémas de SORTIE des outils MCP#1611
cyberlife-coder merged 2 commits into
developfrom
fix/mcp-output-schemas-typed

Conversation

@cyberlife-coder

Copy link
Copy Markdown
Owner

Le correctif précédent n'avait traité que l'entrée. Dette identifiée à ce moment-là, refermée ici.

Le rouge

11 untyped `items` across 18 advertised output schemas: {
    "list_working_contexts: $.sessions.items = {"$ref":"#/$defs/WorkingContextSession"}",
    "recall: $.memories.items = {"$ref":"#/$defs/RecollectionDto"}",
    "why: $.edges.items = {"$ref":"#/$defs/MemoryEdgeDto"}",
    ...
}

Pourquoi ce n'est pas cosmétique

Les SDK MCP officiels valident structuredContent contre l'outputSchema annoncé. Un $ref que le client ne sait pas résoudre est un résultat qu'il peut rejeter — plus dur que le cas de l'entrée, où le serveur avait au moins pu répondre.

Deux causes, pas une

wire_safe_output_schema n'appliquait que widen_id_properties, jamais l'inliner récursif. Corriger ça a fait tomber 11 → 6.

Les 6 restants venaient d'ailleurs : cinq outils ne déclaraient aucun output_schema. rmcp en dérivait un automatiquement, qui échappait donc à tout post-traitement. recall, recall_fused, recall_where, why et list_working_contexts le déclarent maintenant explicitement.

Vérification

11 → 0. Le test générique parcourt tous les outils, donc le prochain qui rend un tableau d'objets est couvert par construction, pas parce que quelqu'un aura pensé à ajouter un cas.

20 suites vertes, clippy pedantic propre, fmt, version-sync et les contrats passés en local avant le push.

--features extract échoue encore sur cette branche : c'est la dette traitée par #1610, indépendante.

Le correctif precedent n'avait traite que l'entree. wire_safe_output_schema
n'appliquait que widen_id_properties, et cinq outils ne declaraient aucun
output_schema du tout : rmcp en derivait un, qui conservait des $ref qu'un
client aveugle aux $defs ne peut pas resoudre.

Ce n'est pas cosmetique. Les SDK MCP officiels valident structuredContent
contre le schema annonce : un $ref irresolvable est un resultat que le client
peut rejeter, ce qui est plus dur que le cas de l'entree ou le serveur avait
au moins pu repondre.

L'inliner recursif est applique cote sortie, et recall, recall_fused,
recall_where, why et list_working_contexts declarent desormais leur schema
explicitement.

Rouge prouve : 11 items non types sur 18 schemas de sortie avant, 0 apres.
Le test generique couvre TOUS les outils, donc le prochain a rendre un
tableau d'objets est couvert par construction.
@codacy-production

Copy link
Copy Markdown

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

🟢 Metrics 0 complexity

Metric Results
Complexity 0

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

Il affirmait « Scope is deliberately the INPUT schemas [...] Output schemas
keep their $ref-only items — a separate concern ». Le commit precedent de
cette meme branche traite les schemas de sortie : le commentaire etait devenu
faux, et un commentaire faux egare plus surement qu'une absence de commentaire.
@cyberlife-coder
cyberlife-coder merged commit 9f9f660 into develop Jul 26, 2026
39 checks passed
@cyberlife-coder
cyberlife-coder deleted the fix/mcp-output-schemas-typed branch July 26, 2026 19:25
cyberlife-coder added a commit that referenced this pull request Jul 27, 2026
Etendre la matrice a `mcp` et `http` a immediatement revele deux defauts.

1. REGRESSION QUE J'AI INTRODUITE (PR #1611, deja sur develop, jamais sur
   main) : mcp.rs referencait context_tools::wire_safe_output_schema en neuf
   endroits, or `mod context_tools` est gate sur `context`. Avec
   --features http — qui active `mcp` SANS `context` — la resolution
   echouait. Correctif structurel : le helper remonte dans schema.rs, gate
   sur `mcp`, avec ses cles d'id, puisque les outils de mcp.rs en ont besoin
   sans `context`. context_tools.rs le re-exporte.

2. DEFAUT PRE-EXISTANT : DEFAULT_COMPILE_STDIN_BUDGET est morte des que
   `context` est absente, tous ses consommateurs etant gates dessus. Gatee
   sur son consommateur reel, pas masquee par un allow(dead_code).

http n'etait pas un choix arbitraire : il agrege treize dependances et c'est
le transport du demon en production. Ne pas le tester isolement laissait
precisement la combinaison la plus utilisee hors couverture.

Matrice verifiee sous RUSTFLAGS=-Dwarnings, comme la CI : mcp, http, context,
persistence, ollama, extract — les six vertes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant