perf: defer unused pipeline hook imports (W2-1a) - #482
Merged
Merged
Conversation
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.
Symptôme
W2-1 / F2, première PR : le hook pipeline importe le store à la fermeture de
chaque processus, y compris pour les outils qu'il ne traite pas. PR empilée
sur #481 ; les matchers seront traités dans la seconde PR de W2-1.
Cause racine
Le scope de
close_shared_store_on_exitentourait tout le programme et sonfinallyimportaitmemory_storemême si aucun store n'avait été utilisé.Les helpers de recherche du graphe importaient aussi le client MCP amont dès
leur chargement. Le checkout actuel n'importe déjà plus
mcp_server.__main__sur ce chemin : les références de la revue ont été vérifiées sur la base réelle.
Changement
Le scope de fermeture commence après les gardes outil/fichier/cooldown. Le
teardown consulte
sys.moduleset ferme les stores déjà chargés sans créerle graphe d'imports qu'il doit seulement nettoyer. Le client et son limiteur
amont sont importés uniquement quand
call_upstreamest réellement appelé.La résolution canonique des graphes, y compris leurs chemins personnalisés,
et la fermeture sur succès/erreur/SystemExit sont conservées.
Une sonde stdlib documente les mesures directes de module. Son environnement
isole aussi les paramètres libpq hérités : une chaîne vide sélectionnerait les
paramètres locaux par défaut, donc elle utilise un répertoire de socket inexistant
encodé dans l'autorité du DSN.
Source : PostgreSQL — URI de connexion.
Les mesures d'acceptation ci-dessous utilisent le véritable launcher.
Preuve
Base exacte
d0f7c19bf64a2d994b2e9a2a9818244c994bc972, avant en checkout détaché,après avec le diff de cette PR, sans rebase ultérieur. Python 3.13.7 identique,
macOS ARM64 / 10 cœurs, SQLite jetable, dépendances du launcher préparées hors
mesure, aucun téléchargement ni serveur MCP lancé.
Commandes exactes :
Le driver exécute
/usr/bin/time -l -o <log> <python> <checkout>/scripts/launcher.py mcp_server.hooks.pipeline_impact_bump < <payload>, quatre processus par payload,premier exclu ; les traces
-X importtimesont séparées. Tous les processusterminent avec le code 0, sans erreur de lookup dans leurs journaux.
Payloads identiques avant/après : Read
example.py, Bashpython -m unittest example,Edit
example.pysans graphe, dans/private/tmp/cortex-green-hook-fixture/project.Les payloads JSON complets et environnements sont conservés dans les deux reports.
Valeurs CPU
user+sysaffichées par BSD time (précision du journal conservée).Read/Bash après : aucun
memory_store,_store_lifecycle,mcp_client_pooloumcp_server.__main__dans les traces d'import. Edit sans graphe après : le clientamont disparaît ; store et lifecycle restent nécessaires à la recherche canonique.
Limite d'acceptation : la borne stricte CPU <0,05 s n'est pas démontrée pour
chaque échantillon Read et ne tient pas pour l'Edit sans graphe (0,13–0,14 s).
Le script ne remplace pas la recherche canonique par une hypothèse sur le chemin
du graphe pour atteindre ce seuil. L'optimisation des sorties Read/Bash est
mesurée ; l'acceptation complète « sans graphe » de W2-1a reste partielle.
Avant : charge 3,57→3,44 / 10, disque61→62 GiB. Après : charge3,91→3,83 /10,
disque61→61 GiB. Un seul travail local lourd. Rapports, mesures et traces :
/private/tmp/cortex-green-w2-1a-launcher-{before,after}/, agrégation/private/tmp/cortex-green-w2-1a-launcher-comparison.json.16 tests ciblés passent : sorties anticipées, absence/vidage du graphe,
chemin de graphe personnalisé, appel amont, fermeture après exception/SystemExit,
isolation de l'environnement et quatre répétitions avec première exclue.
Gates locaux ordonnés terminés avec le code 0 : Ruff/format 1 418 fichiers,
craftsmanship, Pyright zéro diagnostic ; couches hooks+scripts 1 121 passed,
17 skipped, 292 subtests en 22,33 s ; suite complète 7 593 passed,
221 skipped, 292 subtests en 142,00 s. PostgreSQL explicitement indisponible
au socket inexistant ; aucun skip présenté comme un test PG exécuté.
Charge initiale 3,61 / 10 cœurs, disque 61 GiB avant/après.
Le driver suit les deux
uv sync --lockedet les extras/groupes du contrat,puis Ruff, craftsmanship, Pyright
mcp_server/, couches affectées et pytestcomplet dans l'ordre. Log :
/private/tmp/cortex-green-w2-1a-gates.log.Commit final :
1f4196ef20ee0c52c18990924a2c3d1be80a76bf. CI externe 34043261590 terminée verte sur ce SHA.Conformité
Aucune entrée baseline ajoutée. Nouveaux fichiers sous 300 lignes, fonctions
sous 40 lignes et quatre paramètres ; aucun import de couche supplémentaire.
Comportement du graphe et du teardown conservé, aucun fallback silencieux.
La mesure ne touche ni une base de production ni un modèle. La nouvelle sonde
ne mélange pas launcher et module direct dans ses chiffres.
Candidats issues
Le seuil « Edit sans graphe <0,05 s » nécessiterait un contrat distinct pour
trouver les graphes sans charger le store, tout en conservant les chemins
personnalisés. Dette préexistante des fichiers touchés inchangée ; aucun
refactoring général ni nouveau ticket. Les bornes cumulées des quatre hooks
seront mesurées dans W2-1b, en conservant le coût réel de la capture.
Runbook
Aucune opération de données. Le propriétaire décide de la fusion. Les fichiers
et bases de mesure sont temporaires, le mode de capture n'est pas modifié ici.