Skip to content

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
mainfrom
feat/cross-index-tools
Open

feat(tools): outils croisés registre×graphe (data_to_code, code_path, dead_code) + filtres recherche#24
citarf wants to merge 5 commits into
mainfrom
feat/cross-index-tools

Conversation

@citarf

@citarf citarf commented Jun 24, 2026

Copy link
Copy Markdown
Collaborator

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

citarf and others added 5 commits June 24, 2026 23:02
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>
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