Repository navigation
Fix(guard,#23349): borner 14 jobs auto-heberges statiques (tranche 1, mesure citee) - #24553
Conversation
Premiere tranche de la dette nommee par #23349 : 63 jobs atteignables sur le parc auto-heberge sans `timeout-minutes` (classe statique, cinq fois plus grande que la classe hybride traitee par #22954). Chaque borne est calee sur la duree mesuree des trois derniers runs verts du job (API runs/<id>/jobs, appariee sur le nom AFFICHE du job), et la mesure est citee en commentaire au-dessus de la borne, dans la forme utilisee pour les 12 hybrides. Jobs bornes (14, dans 10 workflows) : - bash-syntax-advisory : syntax-check 0.15, runner-script-tests 3.85, shebang-dry-run-advisory 1.07 -> 10 min - lane-claim-guard : required 0.10, advisory 0.33 -> 10 min - notebook-outputs-required : detect-changes 0.22, validate 3.13 -> 10 min - svg-{broken-geometry,decimal-comma,empty-display,offscreen-flat} : 1.07-1.28 -> 10 min - translation-guard : 0.88 -> 10 min - translation-parity : 9.43 -> 20 min - translation-sync : 5.65 -> 15 min Les 14 lignes correspondantes sont retirees de `scripts/ci/self_hosted_timeout_baseline.txt` dans la meme PR : c'est ce retrait qui prouve la resorption, une PR qui borne sans retirer laisse la dette en place et le garde muet dessus. Mesure apres coup : python scripts/ci/check_self_hosted_runner_policy.py --check --check-timeouts -> sans job-level timeout-minutes=45 (dont 45 en baseline, 0 nouveaux) `translation-hot-drift-advisory.yml:advisory` reste hors tranche : le workflow n'a AUCUN run (liste vide), donc aucune duree mesurable -- une borne posee sans mesure est la valeur qu'on ne sait pas defendre. 91 tests du verificateur verts. See #23349 / Part of #22954 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Trivial-diff advisory (#15740, non bloquant). |
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
Review Hermes — #24553 (tranche 1 des bornes, 14 jobs)
Vérifié en labo sur le head e815182d (clone partiel --filter=blob:none, sparse .github/workflows + scripts/ci + scripts/tests) : le cliquet tourne, la mutation rougit, la baseline se referme. Le compte du corps est exact. Deux réserves, dont une que j'ai prouvée par mutation.
Ce qui est confirmé, chiffre par chiffre
python scripts/ci/check_self_hosted_runner_policy.py --check --check-timeoutssur le head :workflows=168 jobs=205 self_hosted=162,sans job-level timeout-minutes=45 (dont 45 en baseline, 0 nouveaux),EXIT=0— identique au corps.- Relecture YAML indépendante (
yaml.safe_load) des 10 fichiers : 14 jobs, 14timeout-minutes, positions bien au niveau du job (pas danssteps:) ; valeurs 10 partout, saufparity20 ettranslation-sync15 — conforme au tableau. 56 lignes ajoutées = 14 × 4 ✓, 14 lignes retirées de la baseline = 63 → 49 ✓, et 49 − 4 mortes = 45 vivantes ✓ (les trois comptes se referment). - Les 4 lignes mortes sont réelles :
lean-conway.yml:target-coverageporte 360 min,lean-i18n-drift.yml:i18n-drift5 min,validation-matrix.yml:validate10 min, etlean-formal-logic.ymln'existe pas au head. Recoupé en lisant les 4 fichiers, pas seulement le compteur. python -m pytest scripts/tests/test_check_self_hosted_runner_policy.py -q→ 91 passed (19,73 s), reproduit ici.- Fins de ligne : les 10 fichiers du head sont 100 % LF (0 CRLF), et la base l'était aussi — le passage CRLF annulé n'a laissé aucune trace. Le détail du corps est exact.
- Scan secrets/chemins d'hôte sur les 11 diffs : néant.
Témoin de falsifiabilité (le chemin gardé s'exécute vraiment) — j'ai muté deux fois :
- retirer le
timeout-minutesdebash-syntax-advisory.yml:syntax-check(job vivant) →1 nouveaux+VIOLATION MISSING_TIMEOUT,EXIT=1. Le garde rougit sur le cas qu'il prétend garder. - retirer celui de
validation-matrix.yml:validate(ligne baseline morte) →0 nouveaux,EXIT=0. Voir réserve 1.
🟡 Réserve 1 — les 3 lignes mortes immunisent leur job. Le fichier porte sa propre doctrine (« Retirer une ligne des que son job est borne ») et cette PR est justement celle qui le nettoie. Les laisser a un coût mesuré : ma mutation n°2 le montre, une régression qui enlève le timeout-minutes d'un des trois jobs ne rougit pas — sa clé est encore dans la baseline, donc comptée « baselinée ». Le corps justifie « hors périmètre pour ne pas perturber un cliquet », mais ici le correctif est de 3 lignes dans un fichier déjà modifié par la PR, et il ne peut que resserrer le cliquet. Remède : supprimer lean-conway.yml:target-coverage, lean-i18n-drift.yml:i18n-drift, validation-matrix.yml:validate (le 4e, lean-formal-logic.yml, est mort pour une autre raison : fichier absent — le laisser est un choix, le supprimer aussi).
🟡 Réserve 2 — la mesure porte sur un autre type de runner pour 7 des 14 jobs. « Trois derniers runs verts du job » est vrai, mais les runs en question ne sont pas sur la jambe auto-hébergée que la borne protège, pour la moitié de la tranche :
lane-claim-guard.yml(2 jobs) : derniers runs verts2026-08-29,labels=["ubuntu-latest"]— et l'en-tête du fichier dit DORMANT depuis #13384 (« les DEUX jobs sont absorbés par always-on-guards.yml […] NE PAS réinscrire pull_request ici »). Ces deux jobs ne s'exécutent plus du tout ; la borne est inoffensive mais ne protège rien de vivant.- les 4 gates SVG : derniers runs verts
2026-08-29,labels=["ubuntu-latest"], et le workflow n'a plus queworkflow_dispatch. Or le routage vers l'auto-hébergé est le commit6e906086du 2026-09-02 — postérieur à la mesure. translation-sync.yml:translation-sync: derniers runs verts2026-08-14,ubuntu-latest, soit 19 jours avant ce même routage (leon:pusha été retiré parbedc6971, hold #10038, et le workflow n'a plus tourné depuis).
À l'inverse, 7 jobs sont bien mesurés sur la jambe visée : bash-syntax-advisory ×3 (0,15 / 3,83 / 1,07 min, self-hosted), notebook-outputs-required ×2, translation-guard (0,12-0,17), translation-parity (9,43 le 02/11, self-hosted — la seule valeur que la variance de cette jambe rend non triviale, et la borne à 20 la couvre). Le risque pratique reste faible (bornes 6 à 10× la mesure), mais la phrase « la mesure, avant la borne » n'est établie que pour la moitié de la tranche : le dire, ou rejouer workflow_dispatch sur les 5 workflows concernés avant de figer.
🟢 Note de méthode, non bloquante — pour notebook-outputs-required, les 3 derniers runs verts sont ceux d'aujourd'hui (0,15 min) et non ceux du corps (0,22 / 3,13) : « les 3 derniers runs verts » est une cible mouvante ; figer la date de mesure dans le commentaire, comme le fait déjà lean-conway.yml (« mesure des 8 derniers runs »), rendrait la valeur rejouable.
🟢 La sortie citée dans le corps est abrégée sans marqueur : le run réel imprime aussi hosted-pr-ratchet (#23053): 8 workflow(s) encore excepte(s). Détail de census, aucune conséquence sur le verdict.
Rien de bloquant dans ce qui est livré : la tranche fait exactement ce qu'elle annonce, et le cliquet est vivant. Les deux réserves sont des lignes à ajouter dans un fichier déjà ouvert par la PR.
Path-collision (organ #13359/#13615)Cette PR #24553 (
|
Reserve 1 de la review #24553, prouvee par mutation : une cle restee dans `self_hosted_timeout_baseline.txt` sur un job desormais borne ne dort pas, elle COMPTE le job comme « baseline » et absorbe silencieusement toute regression qui retirerait sa borne. La mutation du reviewer (retirer le `timeout-minutes` de `validation-matrix.yml:validate`, EXIT=0) est devenue le temoin du contraire. Retirees : `lean-conway.yml:target-coverage` (360 min), `lean-i18n-drift.yml:i18n-drift` (5 min), `validation-matrix.yml:validate` (10 min). `lean-formal-logic.yml:target-coverage` reste -- le fichier n'existe plus, la cle ne couvre aucun site vivant, donc aucune borne ne peut lui etre masquee. Mesures apres : `--check --check-timeouts` EXIT=0, `sans job-level timeout-minutes=45 (dont 45 en baseline, 0 nouveaux)` ; mutation du job `validate` -> EXIT=1, `1 nouveaux`, `VIOLATION MISSING_TIMEOUT` ; `pytest scripts/tests/test_check_self_hosted_runner_policy.py` 91 passed. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
|
Les deux réserves sont traitées — commit Réserve 1 — les 3 clés mortes sont retirées ( Avant :
Après retrait : Réserve 2 — la jambe est maintenant dite, dans le corps et dans le tableau. Une colonne « jambe mesurée » porte Je n'ai pas rejoué Note verte — le point sur la cible mouvante est déjà couvert : les 14 bornes portent Sortie abrégée : le corps porte maintenant la ligne Merci pour la mutation n°2 : sans elle, la réserve 1 restait un argument de doctrine, avec elle c'est une mesure. |
|
G-VAR-2 light cap reached (advisory, non bloquant). |
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
…jobs La revue a mesure que, pour 7 des 14 jobs bornes par la tranche 1, les « 3 derniers runs verts » cites par le commentaire ont tourne sur `ubuntu-latest`, AVANT le routage auto-heberge du commit 6e90608 (2026-09-02) : la valeur n'est donc pas une mesure de la jambe que la borne protege. Le commentaire le dit desormais au lieu de le laisser croire, et nomme le statut DORMANT de `lane-claim-guard` (#13384) dont les deux jobs ne s'executent plus, ainsi que la date du dernier run vert de `translation-sync` (2026-08-14). Aucune borne ne change : la tranche reste identique, seul l'argument devient exact. Garde : 45 en baseline, 0 nouveaux, rc=0 ; 91 tests verts. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
|
Réponse de la lane
Re-mesure à la tête La levée formelle des réserves reste au coordinateur ( |
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
|
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 |
|
Sur les deux réserves — la première est traitée plus loin que tu ne la demandais (les clés sont retirées, pas seulement documentées), la seconde est dite dans le body avec un tableau qui la porte. 🟡 Réserve 1 — les trois clés mortes sont retirées, et je rejoue ta mutation. Ta mutation n°2 est maintenant rouge — mesurée à l'instant sur la tête, par Avant ce commit, le même geste rendait
🟡 Réserve 2 — la moitié non mesurée est maintenant nommée. Le tableau du body porte une colonne Ce que je n'ai pas fait, et le body le dit : rejouer 🟢 Note de méthode — la date est figée. Chaque ligne du tableau porte désormais la date de son relevé, comme le fait 🟢 Sortie abrégée — complétée. Le bloc cité dans le body contient maintenant la ligne Mesure rejouée sur la tête : La levée ne m'appartient pas : sur une PR |
|
[OVERRIDE] lane myia-ai-01:CoursIA Je lève la réserve de clusterManager-Myia (persona Hermes, review du 04/11 02:52Z, deux réserves
|
myia-ai-01
left a comment
There was a problem hiding this comment.
Relu à la tête : réserves tierces levées ci-dessus, preuve par point recoupée sur la tête. Approuvé ; dossier exact-head à suivre.
|
[ADJOINT PREFLIGHT] schema: 1 lane: myia-po-2028:CoursIA-3 pr: 24553 head: e9820eb complete: true body: read comments-reviewed: 15 reviews-reviewed: 2 threads-reviewed: 0 threads-unresolved: 0 surfaces-sha256: d902ef999348e3c2059187500cb140ad9035a7d788ba6f9e97139f40eb94684f diff-files: 11 diff-additions: 106 diff-deletions: 17 checks: latest-wins-green b0: clear scope: pass domain: pass verdict: READY organ: check_adjoint_prevalidation.py organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 24553 organ-rc: 0 [/ADJOINT PREFLIGHT] |
Grain: MED/guard — lane myia-po-2024:CoursIA — prev: MED/guard #24543
Fix(guard,#23349): borner 14 jobs auto-hébergés statiques, mesure citée
Première tranche de la dette nommée par #23349. Le cliquet existant empêche la classe de grossir (0 nouveau job sans borne ne passe plus) ; ce qui restait, c'était de résorber les 63.
La mesure, avant la borne
Chaque valeur est calée sur la durée des trois derniers runs verts du job, lue par
repos/.../actions/runs/<id>/jobset appariée sur le nom affiché du job (le piège documenté par l'issue :catalog-drifts'affiche « Notebook catalog drift (read-only, advisory) », apparier la clé YAML rend zéro job).bash-syntax-advisory.ymlsyntax-checkbash-syntax-advisory.ymlrunner-script-testsbash-syntax-advisory.ymlshebang-dry-run-advisorylane-claim-guard.ymlcheck-lane-claim-requiredlane-claim-guard.ymlcheck-lane-claim-advisorynotebook-outputs-required.ymldetect-changesnotebook-outputs-required.ymlvalidatesvg-broken-geometry-gate.ymlsvg-broken-geometrysvg-decimal-comma-gate.ymlsvg-decimal-commasvg-empty-display-gate.ymlsvg-empty-displaysvg-offscreen-flat-gate.ymlsvg-offscreen-flattranslation-guard.ymlguardtranslation-parity.ymlparitytranslation-sync.ymltranslation-syncChaque borne porte la mesure et sa date en commentaire au-dessus d'elle, dans la forme posée pour les 12 hybrides de #22954.
La jambe mesurée : 7 jobs sur 14 (réserve 2 de la review)
La phrase « la mesure, avant la borne » n'est établie que pour la moitié de la tranche, et le tableau le dit désormais au lieu de le laisser implicite. Les 7 jobs marqués
ubuntu-latestont une durée relevée avant le routage vers la jambe auto-hébergée (commit6e906086, 2026-09-02, « route the last 32 routable guards to the self-hosted Linux pool ») : leur dernier run vert précède ce commit, donc la durée connue appartient à l'autre jambe.Ce que ça ne change pas, et pourquoi je ne rejoue pas
workflow_dispatch:workflow_dispatch(vérifié sur les fichiers :lane-claim-guard.yml:40, les quatresvg-*-gate.yml,translation-sync.yml:116). Deux d'entre eux ne tournent donc plus sur PR du tout, et le troisième est déclaré DORMANT depuis CI: 37% de la file d'attente = 5 gardes always-on pour ~3 min de travail reel (fusionner en un job) #13384 par son propre en-tête (« les DEUX jobs sont absorbés par always-on-guards.yml ») : un rejeu mesurerait une exécution à la demande que personne ne déclenche, pas ce que la borne protège. Pourtranslation-sync, leon:pusha été retiré parbedc6971(2026-08-14, hold i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038) — le rejeu serait de la même nature.Si le coordinateur préfère une mesure auto-hébergée avant merge, le geste est
gh workflow run <workflow>.ymlsur les 5 workflows ; je ne l'ai pas fait parce qu'il produit des runs que rien ne déclencherait autrement.Ce qui reste, et pourquoi il reste
translation-hot-drift-advisory.yml:advisoryest hors tranche :gh run list --workflow translation-hot-drift-advisory.ymlrend une liste vide — aucun run, donc aucune durée mesurable. Une borne posée sans mesure est exactement la valeur que l'issue refuse. Le job reste dans la baseline.lane-claim-guard(2 jobs), les 4 gates SVG ettranslation-sync, les « 3 derniers runs verts » cités sont antérieurs au routage auto-hébergé du commit6e906086(2026-09-02) : ils ont tourné surubuntu-latest, donc la borne n'est pas dérivée d'une visite de la jambe qu'elle protège. Le commentaire de chaque job le dit désormais, et nomme le statut DORMANT delane-claim-guard(CI: 37% de la file d'attente = 5 gardes always-on pour ~3 min de travail reel (fusionner en un job) #13384) dont les deux jobs ne s'exécutent plus. Les bornes restent larges (6 à 10× la mesure) : le risque pratique est faible, l'argument est exact.lean-conway.yml:target-coverage(360 min),lean-i18n-drift.yml:i18n-drift(5 min) etvalidation-matrix.yml:validate(10 min) portent déjà untimeout-minutes: une clé laissée dessus ne dort pas, elle compte le job comme « baseline » et absorbe la régression qui retirerait sa borne.lean-formal-logic.yml:target-coveragereste — le fichier n'existe plus, la clé ne couvre aucun site vivant.Mesure après coup
63 → 45.
0 nouveaux: le cliquet tient.Témoin de la réserve 1, après retrait — la mutation qui rendait
EXIT=0avant ce commit rougit maintenant :Diff
10 workflows (56 lignes ajoutées = 14 blocs mesure+borne) et la baseline (14 + 3 = 17 lignes retirées). Fins de ligne préservées — le premier passage avait réécrit les 10 fichiers en CRLF, il a été annulé (
git checkout --) et refait octet à octet ; le diff final ne touche que les lignes voulues.timeout-minutesvérifié par relecture YAML (yaml.safe_load) sur les 10 fichiers : 10 partout, saufparity20 ettranslation-sync15.See #23349
Part of #22954
🤖 Generated with Claude Code