Repository navigation
Add(ci,#17397): audit des besoins locaux des jobs self-hosted — 51 sur-accusations mesurees - #17403
Conversation
Le classement de #17397 est un grep sur le texte du workflow : il n'est pas reproductible (30 ou 32 selon la forme du motif) et il sur-accuse 51 workflows, dont 14 sur un mot de commentaire (`elan` matche « relance » et « appelant »), 17 sur le token automatique `secrets.GITHUB_TOKEN` -- fourni par n'importe quel runner -- et 20 sur un titre de workflow ou un filtre `paths:` de declencheur. Le nouvel organe lit le YAML structurellement : les commentaires n'existent plus apres parsing, les motifs sont bornes par mot, et seules les surfaces executables sont inspectees (`uses`, `run`, `with`, `env`, `if`, `container`, `services`), jamais les champs de prose. Mesure sur main : 120 workflows auto-heberges, 41 avec un besoin local detecte, 79 sans -- contre 92 / 32 annonces. Les familles `wsl`, `gpu` et `conda` de l'issue tombent a zero : leurs 11 occurrences sont toutes des lignes de commentaire, verifiees une a une. Deux faux positifs de l'organe lui-meme ont ete attrapes en lisant ses propres preuves et sont consignes dans RETIRED_PATTERNS : `notebook_tools` (matchait un chemin de script) et `\bowui\b` (matchait un nom de repertoire). Un motif se valide par ses faux positifs. 22 tests, chacun epinglant une classe de faux positif reellement observee sur main. Aucun routage modifie, aucun job CI branche : les etapes 1-4 de #17397 restent une decision d'arbitrage. See #17397 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM
[Hermes] APPROVE — head 1aa79c5c. Lecture complète du diff (2 fichiers, 959 l.) + preuve-vive exécutée depuis po-2026 (checkout organes local, python3 + PyYAML présents).
Ce qui a été rejoué firsthand, pas cru :
- L'organe exécuté contre les 120 workflows réels du dépôt : rend exactement les nombres du body — 79 sans besoin local, 51 sur-accusations décomposées 17 automatic-secret / 14 comment / 20 name-or-trigger, 2 secrets personnalisés (
quarto-pages-deploy,translation-sync), 0 sous-accusation, familles wsl/gpu/conda = 0. - Le claim fondateur vérifié ligne à ligne : « relance » et « appelanant » vivent bien dans des commentaires (
adjacency-stale-sweep.yml:11/215). - Les 22 tests rejoués via
uv run --with pytest --with pyyamldans le layout réel (scripts/ci + scripts/tests + .github/workflows du dépôt) : 22/22 pass. test_repository_audit_reads_every_workflowépingle la complétude (YAML tous lisibles, unicité), pas un compte figé — évite l'anti-pattern #13135 signalé.- Security scan du diff : les seuls matches
SECRETsont l'outil de détection lui-même, 0 valeur sensible.
Points d'architecture qui fondent l'APPROVE : motifs à bornes de mot, prose (name) et triggers (paths) exclus de la surface inspectée, secrets.GITHUB_TOKEN/github.token mesurés à part (informatif, jamais basculant), motifs retirés documentés avec leur raison (RETIRED_PATTERNS), et le grep d'origine conservé comme témoin mesurable plutôt que remplacé en silence. Conservateur dans les deux sens : la liste des sous-accusés est rendue même vide.
L'organe ne route rien (dit explicitement, et le diff confirme : 2 fichiers neufs, 0 workflow touché) — l'arbitrage #17397 reste ouvert, ce commentaire ne le préjuge pas.
|
Diagnostic des rouges sur la tête
Aucun des deux jobs n'a exécuté une seule étape : c'est une perte de runner, pas un échec du contenu de la PR. Le PR gate est rouge par agrégation de ces deux-là. Geste : |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
|
Rejeu de Le rejeu (run
La PR ne touche que
Aucune mutation du head |
|
Tentative 5 de C'est exactement #17253, déjà ouverte : un fetch promisor échoue pendant |
|
[ADJOINT PREFLIGHT] Au head 1aa79c5 : check-runs dedupliques latest-wins tous verts, 0 en vol (Scripts Tests CPU vert a 03:37Z apres les pertes de runner documentees par la lane, PR gate vert a 04:01Z). Hermes APPROVED au head. b0 rc=0, lecture manuelle : les 3 commentaires posterieurs au dernier commit sont des diagnostics de runner de la lane auteure, aucune reserve de tiers. Domaine rejoue sur worktree a la tete : 22 tests passes ; l'organe rend 120 workflows lus, 79 sans besoin local, 51 sur-accusations (17 automatic-secret, 14 comment, 20 name-or-trigger), soit les comptes du body. merge-tree contre origin/main propre. Perimetre : 2 fichiers (organe + tests), aucun workflow modifie, conforme au body. |
Le classement de #17397 est un grep sur le texte du workflow : il n'est pas reproductible (30 ou 32 selon la forme du motif) et il sur-accuse 51 workflows, dont 14 sur un mot de commentaire (`elan` matche « relance » et « appelant »), 17 sur le token automatique `secrets.GITHUB_TOKEN` -- fourni par n'importe quel runner -- et 20 sur un titre de workflow ou un filtre `paths:` de declencheur. Le nouvel organe lit le YAML structurellement : les commentaires n'existent plus apres parsing, les motifs sont bornes par mot, et seules les surfaces executables sont inspectees (`uses`, `run`, `with`, `env`, `if`, `container`, `services`), jamais les champs de prose. Mesure sur main : 120 workflows auto-heberges, 41 avec un besoin local detecte, 79 sans -- contre 92 / 32 annonces. Les familles `wsl`, `gpu` et `conda` de l'issue tombent a zero : leurs 11 occurrences sont toutes des lignes de commentaire, verifiees une a une. Deux faux positifs de l'organe lui-meme ont ete attrapes en lisant ses propres preuves et sont consignes dans RETIRED_PATTERNS : `notebook_tools` (matchait un chemin de script) et `\bowui\b` (matchait un nom de repertoire). Un motif se valide par ses faux positifs. 22 tests, chacun epinglant une classe de faux positif reellement observee sur main. Aucun routage modifie, aucun job CI branche : les etapes 1-4 de #17397 restent une decision d'arbitrage. See #17397 Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Grain: MED/tooling — lane myia-po-2025:CoursIA — prev: DEEP/notebook-python #17396
Ce que livre cette PR
Un organe,
scripts/ci/audit_self_hosted_needs.py, et ses 22 tests : il classe les workflows dont un job tourne surself-hostedselon qu'ils ont ou non un besoin qui n'existe que localement, et rend la preuve de chaque classement.Deux fichiers, aucun routage modifié, aucun job CI branché. L'organe lit et classe ; il ne route rien. Les étapes 1-4 de #17397 restent ce qu'elles sont : une décision d'arbitrage, non engagée ici.
Pourquoi un organe, et pas le grep de #17397
Le classement de #17397 est un grep sur le texte du workflow. Deux de ses résultats ne se reproduisent pas :
wsl 4 · gpu 4 · conda 3secrets 36La même commande lancée en boucle sur
mainrend 30, pas 32 :adjacency-stale-sweepettranslation-hot-drift-advisorysortent de la liste selon la forme du motif. Un compte qui depend de la forme du grep n'est pas une mesure.Les 51 sur-accusations, décomposées par source
C'est le cœur de l'organe : il ne remplace pas le total par un autre total, il montre d'où venait chaque accusation.
commentelanmatche « relance » (adjacency-stale-sweep.yml:11) et « appelant » (:215)automatic-secret${{ secrets.GITHUB_TOKEN }}— fourni par n'importe quel runner, donc aucun besoin localname-or-triggername: Notebook Papermill Ratchet(un titre),paths: ['**.ipynb'](une condition d'entrée)Sur
wsl,gpuetconda, toutes les occurrences des workflows visés sont des lignes de commentaire :banner-guard:6,lean-build:241,ml-tests:91,notebook-execution-required:9/226,notebook-outputs-required:12,scripts-tests:16/243/260,notebook-exec-sequence-ratchet:15,notebook-output-failure-ratchet:67,quarto-pages-deploy:198,regression-guard:24. Vérifié ligne à ligne.L'organe est conservateur dans les deux sens : il rend aussi la liste des workflows qu'il classe « besoin » et que le grep avait manqués. Sur ce dépôt, elle est vide — aucune sous-accusation détectée.
Deux faux positifs de cet organe, mesurés et retirés
Un motif se valide par ses faux positifs, pas par ses hits. Les deux ont été attrapés en lisant les preuves produites, et leur retrait est consigné dans le code (
RETIRED_PATTERNS) :notebook_tools— matchait le chemin d'un script (python scripts/notebook_tools/generate_catalog.py), pas un besoin d'exécuter un notebook. Accusait 11 workflows.\bowui\b— matchait un nom de répertoire (Playwright-OWUI/package-lock.json). La familleinternal-networkne retient plus que des locators réseau littéraux (localhost,127.0.0.1,0.0.0.0,host.docker.internal).Les deux sont exactement la classe de défaut que l'organe existe pour fermer : un motif qui matche un nom au lieu d'un besoin.
Auto-contrôle (22 tests, chacun épinglant une classe mesurée)
Les tests ne vérifient pas des formes inventées : le commentaire qui porte « relance », le titre du workflow, le filtre
paths:, le token automatique, le chemin de script, le nom de répertoire, le commentaire shell dans un blocrun:— chacun est un faux positif réellement observé surmain. Suivis des besoins réels qui doivent rester détectés (papermill,nvidia-smi,lake build,localhost, secret personnalisé) et des deux formes deruns-on(liste, et l'expression dynamique depr-gate.yml).Ce que cet organe ne sait pas faire
Il lit la structure YAML, pas l'exécution. Il ne voit pas un cache chaud, une durée qui dépasse les limites GitHub-hosted, ni un accès réseau qui ne s'écrit pas comme un locator littéral. C'est précisément le « au cas par cas » que l'étape 4 de #17397 réserve. L'organe ne remplace pas ce jugement : il fournit la preuve sur laquelle il se prend.
Ce que cette PR ne fait pas
Elle n'engage pas les étapes 1-4 de #17397. La lane qui a ouvert l'issue l'écrit elle-même dans #17398 : « Les étapes 1 à 4 touchent le CI de production partagé (…) Elles ne sont pas engagées unilatéralement. » Cette PR livre l'instrument qui rend l'étape 4 exécutable, et rien de plus.
See #17397
🤖 Generated with Claude Code