feat(tools): outils croisés registre×graphe (data_to_code, code_path, dead_code) + filtres recherche#24
Open
citarf wants to merge 5 commits into
Open
feat(tools): outils croisés registre×graphe (data_to_code, code_path, dead_code) + filtres recherche#24citarf wants to merge 5 commits into
citarf wants to merge 5 commits into
Conversation
Ajoute trois outils MCP qui relient le registre DATA et le graphe d'appels, plus des filtres gouvernance sur la recherche sémantique : - data_to_code(name) : pont registre→code. Helper _registry_code_refs() parse les MÊMES registres que lineage() (writers/readers de tables.yaml, repo+script et trigger.source des pipelines, sourceRepo/retroCompatLayer des contrats ODCS) avec la même normalisation (lower + tiret↔underscore, exclusion _ops/ en public), puis enrichit chaque fichier via resolve_file + code_impact (callers, depth=1). Dégradation gracieuse : graphe absent → refs registre seules ; ref hors graphe marquée « (hors graphe) » ; aucun match → ToolError. - code_path(source, target, max_depth=8) : plus court chemin d'appel (chaîne A→B→C, confiance par saut, note si sens inverse / racines ambiguës). - dead_code(repo, subsystem, top=30) : symboles à fan-in nul, caveat en tête. - search_code/search_docs : nouveaux kwargs optionnels status/source/since threadés tels quels vers code_index (comportement inchangé si tous None). Câblage des deux surfaces : SCHEMAS (descriptions FR + input_schema, doc des nouveaux filtres), _dispatch, et @mcp.tool() dans mcp_server (les 3 outils graphe gatés comme code_impact : GRAPH_INDEX_ENABLED ET CODE_INDEX_PUBLIC). Tests hermétiques (stub _load_graph) : nominal + erreur + gating par outil, extraction des refs registre, threading des filtres, routage _dispatch, et gating au niveau de l'enregistrement MCP. Suite complète verte (188). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
L'enrichissement d'impact appelait code_impact(g, f"{repo}/{path}"), mais son
résolveur de fichier (resolve_file) matche par endswith sur le path REPO-RELATIF
des nœuds → aucune racine, donc « 0 appelant » à tort. Détecté par un test
d'intégration contre le vrai graph.py (les stubs unitaires ignoraient l'argument).
Corrige l'appel en passant `path`, et renforce le test pour capturer l'argument
reçu (régression : jamais de préfixe repo).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Les modèles à function-calling faibles (agents externes OpenAI/DeepSeek observés en boucle sur search_code) suivent les descriptions d'outils. Rien ne les orientait vers l'étape spécialisée : on ajoute, sur les deux surfaces (SCHEMAS du bot + docstring @mcp.tool()), une consigne d'enchaînement — un extrait est un point d'entrée, confirmer via read_file, mesurer l'impact via code_impact (pas une nouvelle recherche), relier table↔code via data_to_code — et l'anti-pattern explicite « ne pas reformuler la même recherche en boucle ». Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…r LLM
data_to_code/code_path/dead_code émettent uniquement des métadonnées (chemins,
symboles, URLs), jamais de code brut à secrets. Or le scrubber LLM (make_llm_scrubber,
réservé à search_code/search_docs) HALLUCINE le contenu d'un fichier quand la sortie
est menée par un chemin — vérifié en prod : data_to_code('foudre') renvoyait du PHP
fabriqué au lieu des writers/readers. On retire l'appel secret_scrub de ces 3 outils
(le regex redact_secrets reste) + test de non-régression.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ussi Généralise le correctif à TOUS les outils de code à sortie métadonnées : code_impact (mode fichier) et code_hotspots émettent uniquement symboles/chemins/URLs, jamais de code brut, mais passaient par le scrubber LLM qui hallucine le contenu d'un fichier quand la sortie est menée par un chemin (travers pré-existant de code_impact, confirmé en prod). Seuls search_code/search_docs conservent le scrubber (ils renvoient du code source brut à secrets). Test de non-régression étendu + garde-fou inverse (source). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Trois outils MCP exploitant tous les index + filtres status/source/since sur search_code/search_docs. Câblés sur les deux surfaces (SCHEMAS bot + @mcp.tool() gate GRAPH_INDEX_ENABLED). Description de search_code enrichie pour orienter les modèles faibles vers l'étape suivante (read_file/code_impact/data_to_code). Bug data_to_code (repo/path) attrapé par test d'intégration réel + corrigé. 188 tests verts.
Dépend de AssociationInfoclimat/data-platform#9 (primitives graphe).
🤖 Generated with Claude Code