Skip to content

perf: route PostToolUse hooks by handled tool names (W2-1b) - #483

Merged
cdeust merged 10 commits into
mainfrom
perf/green-hook-matchers
Sep 6, 2026
Merged

cdeust merged 10 commits into
mainfrom
perf/green-hook-matchers

Conversation

@cdeust

@cdeust cdeust commented Sep 6, 2026 •

Copy link
Copy Markdown
Owner

Symptôme

W2-1 / F2, seconde PR : chaque appel d'outil lance quatre processus Python,
alors que trois des hooks ne traitent que des noms d'outils déterminés.
PR empilée sur #482.

Cause racine

Un groupe PostToolUse sans matcher regroupait les quatre commandes. Les
gardes Python évitaient le traitement mais payaient le lancement et les imports.

Changement

Quatre groupes déclarent les outils réellement traités : capture *,
preemptive Edit|Write|Read, pipeline Edit|Write|MultiEdit, reindex Bash.
Les commandes et timeouts sont inchangés. Capture reste sur * pour conserver
la cadence globale réparée ensuite dans W2-4. Source :
Claude Code — matchers de hooks.

L'agrégateur stdlib valide les mesures contre chaque manifeste réel, refuse
les processus manquants/doublons/échecs ou le mélange launcher/module, et
conserve les quatre répétitions en excluant la première.

Preuve

Base 1f4196ef20ee0c52c18990924a2c3d1be80a76bf. Même code des hooks avant/après,
seul le routage diffère ; aucun rebase après mesure. Python 3.13.7, macOS ARM64,
10 cœurs. Dépendances préparées hors mesure ; modèle existant en cache, réseau
ML désactivé ; SQLite jetable et DSN PostgreSQL vers socket inexistant.

.venv/bin/python /private/tmp/cortex-green-launcher-measure.py /private/tmp/cortex-green-w2-1b-before /private/tmp/cortex-green-w2-1b-launcher-before all
.venv/bin/python /private/tmp/cortex-green-launcher-measure.py /Users/cdeust/Developments/anthropic-partnership/Cortex /private/tmp/cortex-green-w2-1b-launcher-after all
.venv/bin/python scripts/aggregate_hook_timings.py --before /private/tmp/cortex-green-w2-1b-launcher-before/report.json --after /private/tmp/cortex-green-w2-1b-launcher-after/report.json --plugin-before /private/tmp/cortex-green-w2-1b-launcher-before/plugin.json --plugin-after /private/tmp/cortex-green-w2-1b-launcher-after/plugin.json --output /private/tmp/cortex-green-w2-1b-launcher-comparison.json

Chaque mesure est /usr/bin/time -l -o <log> <python> scripts/launcher.py <hook>
avec le même JSON. Quatre répétitions, première exclue, traces d'import séparées.
Les Read mesurés sont rejetés par la porte (novelty 0.113, threshold 0.4), les Bash
sont capturés ; aucune erreur masquée à la place d'une capture. Les six lignes
résultantes portent embedding_model=neural ; ids, contenus et vecteurs sont
strictement identiques entre les deux bases isolées, vérifiés en lecture seule.
Preuve : /private/tmp/cortex-green-w2-1b-neural-proof.json.

Payload / métrique Trois valeurs avant (s) Trois valeurs après (s)
Read CPU total 3.01 / 2.90 / 2.94 2.82 / 2.91 / 2.87
Read CPU hors capture 0.15 / 0.15 / 0.17 0.09 / 0.09 / 0.09
Bash CPU total 3.14 / 2.91 / 2.88 3.11 / 2.92 / 2.82
Bash CPU hors capture 0.11 / 0.09 / 0.08 0.03 / 0.02 / 0.02

Les deux processus inutiles sont supprimés pour chaque payload. Le coût total
reste dominé par la capture (2,73–3,08 s CPU dans les échantillons après,
RSS maximal 492847104 octets). L'objectif cumulé ≤0,15 s n'est pas atteint.
Un dispatcher seul ne supprimerait pas l'inférence froide dans la capture ;
W3-1 traite ce coût. Aucune accélération globale n'est revendiquée pour Bash
(médiane 2,91→2,92 s) ; les imports/lancements évités sont la preuve locale.

Les sommes wall séquentielles sont conservées dans le rapport, sans être
présentées comme latence Claude, qui peut lancer ses hooks en parallèle.
Avant : charge 3,97→3,66 / 10 ; après 4,29→4,05 / 10 ; disque 61 GiB avant/après.
Les valeurs de BSD time sont publiées avec la précision de ses journaux.

13 tests ciblés passent : routage de tous les outils, commandes/timeouts,
payloads identiques, parser de mesures réelles, règles d'agrégation et refus
explicites. Gates locaux ordonnés, code final 0 : Ruff/format 1 420 fichiers,
craftsmanship, Pyright zéro diagnostic ; hooks+scripts 1 134 passed,
17 skipped, 292 subtests en 23,70 s
; suite complète 7 606 passed,
221 skipped, 292 subtests en 140,07 s
. Skips PG explicites, aucun accès production.

bash /private/tmp/cortex-green-local-gates.sh w2-1b tests_py/hooks/ tests_py/scripts/

Journal : /private/tmp/cortex-green-w2-1b-gates.log ; charge initiale 3,92 / 10,
disque 61 GiB avant/après. Le driver suit les sync/extras/groupes, Ruff,
craftsmanship, Pyright et pytest dans l'ordre du contrat.
SHA final 7ea80be4cbcbc8c0f54e5e2a2693c811a0a2e4a9. CI externe 34044438025 terminée verte sur ce SHA.

Conformité

Trois fichiers concernés, dont deux nouveaux fichiers Python sous 300 lignes,
fonctions sous 40 lignes/quatre paramètres ; baseline inchangée. Aucun import
mémoire ou algorithme modifié, aucune constante de performance inventée.
Un seul travail lourd local à la fois, données et dépendances de mesure privées.

Candidats issues

Le coût froid de la capture empêche le plancher cumulé visé ; il est traité en
W3-1, pas caché par un payload qui ne capture rien. Aucun nouveau ticket.
L'environnement de mesure avec PG indisponible ne mesure pas les scans d'une
base chargée ; ceux-ci relèvent des items cooldown/requêtes dédiés.

Runbook

Aucune opération de données. Le propriétaire décide de la fusion ; la capture
reste active sur tous les outils selon ses règles existantes.

@cdeust
cdeust changed the base branch from fix/green-lazy-hook-imports to main September 6, 2026 21:52
@cdeust
cdeust merged commit 521506e into main Sep 6, 2026
29 checks passed
@cdeust
cdeust deleted the perf/green-hook-matchers branch September 8, 2026 16:01
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