Skip to content

fix(memory): schémas de sortie complets, et --features http compile enfin#1617

Merged
cyberlife-coder merged 2 commits into
developfrom
fix/mcp-every-tool-declares-output-schema
Jul 27, 2026
Merged

fix(memory): schémas de sortie complets, et --features http compile enfin#1617
cyberlife-coder merged 2 commits into
developfrom
fix/mcp-every-tool-declares-output-schema

Conversation

@cyberlife-coder

Copy link
Copy Markdown
Owner

Deux boucles d'un même audit, la seconde ayant révélé une régression que j'avais introduite.

Les dix derniers schémas de sortie

Dix outils sur dix-neuf n'en déclaraient aucun : context_savings, feedback, forget, load_working_context, relate, remember, remember_extracted, retrieve_context_source, save_working_context, suggest_budget.

rmcp en dérivait un automatiquement, qui échappait à tout post-traitement — inliner compris — et gardait des $ref qu'un client aveugle aux $defs ne résout pas. Les SDK MCP validant structuredContent contre le schéma annoncé, un $ref irrésolvable est un résultat correct que le client peut rejeter.

Coût mesuré : 107 803 → 107 837 octets, soit +34 octets pour dix schémas. L'élagage des $defs absorbe l'ajout, et le total reste sous les 108 162 d'avant tous ces correctifs.

Le contrat précédent vérifiait la forme des schémas présents, pas leur présence — d'où dix outils passés au travers. Le nouveau exige que tout outil en annonce un.

--features http ne compilait plus

Étendre la matrice CI à mcp et http a immédiatement trouvé deux défauts.

Une régression que j'ai introduite (PR #1611, sur develop, jamais sur main — donc rien de publié) : mcp.rs référençait context_tools::wire_safe_output_schema en neuf endroits, or mod context_tools est gaté sur context. Avec --features http, qui active mcp sans context, la résolution échouait.

Correctif structurel plutôt que rustine : le helper remonte dans schema.rs, gaté sur mcp, avec ses clés d'id — puisque les outils de mcp.rs en ont besoin sans context.

Un défaut préexistant : DEFAULT_COMPILE_STDIN_BUDGET est morte dès que context est absente. Gatée sur son consommateur réel, pas masquée par un allow(dead_code).

http n'était pas un choix arbitraire : il agrège treize dépendances et c'est le transport du démon en production. Ne pas le tester isolément laissait la combinaison la plus utilisée hors couverture.

Vérification

Six features vertes isolément sous RUSTFLAGS=-Dwarnings, comme la CI : mcp, http, context, persistence, ollama, extract. 20 suites de tests, clippy pedantic propre.

Dix outils sur dix-neuf n'en declaraient aucun : context_savings, feedback,
forget, load_working_context, relate, remember, remember_extracted,
retrieve_context_source, save_working_context, suggest_budget. rmcp en
derivait alors un automatiquement, qui echappait a tout post-traitement —
inliner compris — et conservait des $ref qu'un client aveugle aux $defs ne
resout pas. Or les SDK MCP valident structuredContent contre ce schema : un
$ref irresolvable est un resultat correct que le client peut rejeter.

Cout mesure, pas suppose : 107 803 -> 107 837 octets pour les 19 outils, soit
+34 octets. L'inlining recursif suivi de l'elagage des $defs absorbe l'ajout,
et le total reste sous les 108 162 octets d'avant tous ces correctifs.

Nouveau contrat : tout outil doit ANNONCER un schema de sortie. Le precedent
verifiait la forme des schemas presents, pas leur presence — d'ou dix outils
passes au travers.
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.
@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.

@cyberlife-coder
cyberlife-coder merged commit 8edfc01 into develop Jul 27, 2026
39 checks passed
@cyberlife-coder
cyberlife-coder deleted the fix/mcp-every-tool-declares-output-schema branch July 27, 2026 06:11
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