Skip to content

Fix(guard,#23349): borner 14 jobs auto-heberges statiques (tranche 1, mesure citee) - #24553

Merged
myia-ai-01 merged 5 commits into
mainfrom
fix/23349-selfhosted-timeouts
Nov 5, 2026
Merged

myia-ai-01 merged 5 commits into
mainfrom
fix/23349-selfhosted-timeouts

Conversation

@jsboige

@jsboige jsboige commented Nov 4, 2026 •

Copy link
Copy Markdown
Owner

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>/jobs et appariée sur le nom affiché du job (le piège documenté par l'issue : catalog-drift s'affiche « Notebook catalog drift (read-only, advisory) », apparier la clé YAML rend zéro job).

workflow job max mesuré (3 runs verts) borne jambe mesurée
bash-syntax-advisory.yml syntax-check 0.15 min 10 auto-hébergée
bash-syntax-advisory.yml runner-script-tests 3.85 min 10 auto-hébergée
bash-syntax-advisory.yml shebang-dry-run-advisory 1.07 min 10 auto-hébergée
lane-claim-guard.yml check-lane-claim-required 0.10 min 10 ubuntu-latest, 2026-08-29
lane-claim-guard.yml check-lane-claim-advisory 0.33 min 10 ubuntu-latest, 2026-08-29
notebook-outputs-required.yml detect-changes 0.22 min 10 auto-hébergée
notebook-outputs-required.yml validate 3.13 min 10 auto-hébergée
svg-broken-geometry-gate.yml svg-broken-geometry 1.20 min 10 ubuntu-latest, 2026-08-29
svg-decimal-comma-gate.yml svg-decimal-comma 1.07 min 10 ubuntu-latest, 2026-08-29
svg-empty-display-gate.yml svg-empty-display 1.28 min 10 ubuntu-latest, 2026-08-29
svg-offscreen-flat-gate.yml svg-offscreen-flat 1.18 min 10 ubuntu-latest, 2026-08-29
translation-guard.yml guard 0.88 min 10 auto-hébergée
translation-parity.yml parity 9.43 min 20 auto-hébergée (02/11)
translation-sync.yml translation-sync 5.65 min 15 ubuntu-latest, 2026-08-14

Chaque 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-latest ont une durée relevée avant le routage vers la jambe auto-hébergée (commit 6e906086, 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 :

  • Les trois workflows concernés n'ont plus qu'un déclencheur workflow_dispatch (vérifié sur les fichiers : lane-claim-guard.yml:40, les quatre svg-*-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. Pour translation-sync, le on:push a été retiré par bedc6971 (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.
  • La valeur de la borne ne dépend pas de la jambe : le défaut d'Actions est 6 h, et un job figé tient son slot tout autant sur l'un ou l'autre pool. La borne est un plafond posé à 6-10× la durée locale, pas une prévision de la durée auto-hébergée.
  • Ces jobs sont aujourd'hui inertes ou à-la-demande ; dès qu'ils tourneront sur la jambe auto-hébergée, leurs runs réels diront si la marge tient — et la mesure datée en commentaire rend la valeur rejouable à ce moment-là.

Si le coordinateur préfère une mesure auto-hébergée avant merge, le geste est gh workflow run <workflow>.yml sur 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:advisory est hors tranche : gh run list --workflow translation-hot-drift-advisory.yml rend 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.
  • La mesure ne couvre la jambe auto-hébergée que pour 7 des 14 jobs (réserve 2). Pour lane-claim-guard (2 jobs), les 4 gates SVG et translation-sync, les « 3 derniers runs verts » cités sont antérieurs au routage auto-hébergé du commit 6e906086 (2026-09-02) : ils ont tourné sur ubuntu-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 de lane-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.
  • 45 jobs statiques restent sans borne après cette PR (mesuré ci-dessous) : tranches suivantes, une PR par famille de workflows.
  • Les 3 clés mortes de la baseline sont retirées (réserve 1). lean-conway.yml:target-coverage (360 min), lean-i18n-drift.yml:i18n-drift (5 min) et validation-matrix.yml:validate (10 min) portent déjà un timeout-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-coverage reste — le fichier n'existe plus, la clé ne couvre aucun site vivant.

Mesure après coup

$ python scripts/ci/check_self_hosted_runner_policy.py --check --check-timeouts
[self-hosted-policy] workflows=168 jobs=205 self_hosted=162
[self-hosted-policy] timeouts: sans job-level timeout-minutes=45 (dont 45 en baseline #22954, 0 nouveaux)
[self-hosted-policy] hosted-pr-ratchet (#23053): 8 workflow(s) encore excepte(s) sur 8 dans la baseline
[self-hosted-policy] OK -- all self-hosted jobs satisfy isolation policy.
EXIT=0

63 → 45. 0 nouveaux : le cliquet tient.

Témoin de la réserve 1, après retrait — la mutation qui rendait EXIT=0 avant ce commit rougit maintenant :

$ # retirer le timeout-minutes de validation-matrix.yml:validate
[self-hosted-policy] timeouts: sans job-level timeout-minutes=46 (dont 45 en baseline, 1 nouveaux)
  VIOLATION MISSING_TIMEOUT: validation-matrix.yml:validate: ...
EXIT=1
$ python -m pytest scripts/tests/test_check_self_hosted_runner_policy.py -q
91 passed

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-minutes vérifié par relecture YAML (yaml.safe_load) sur les 10 fichiers : 10 partout, sauf parity 20 et translation-sync 15.

See #23349
Part of #22954

🤖 Generated with Claude Code

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>
@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 70 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-timeouts sur 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, 14 timeout-minutes, positions bien au niveau du job (pas dans steps:) ; valeurs 10 partout, sauf parity 20 et translation-sync 15 — 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-coverage porte 360 min, lean-i18n-drift.yml:i18n-drift 5 min, validation-matrix.yml:validate 10 min, et lean-formal-logic.yml n'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 :

  1. retirer le timeout-minutes de bash-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.
  2. 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 verts 2026-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 que workflow_dispatch. Or le routage vers l'auto-hébergé est le commit 6e906086 du 2026-09-02 — postérieur à la mesure.
  • translation-sync.yml:translation-sync : derniers runs verts 2026-08-14, ubuntu-latest, soit 19 jours avant ce même routage (le on:push a été retiré par bedc6971, 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.

@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #24553 (Fix(guard,#23349): borner 14 jobs auto-heberges statiques (tranche 1, mesure citee)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

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>
@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@jsboige

jsboige commented Nov 4, 2026 •

Copy link
Copy Markdown
Owner Author

Les deux réserves sont traitées — commit fe7ffeb7b62 pour la première, corps de PR réécrit pour la seconde.

Réserve 1 — les 3 clés mortes sont retirées (lean-conway.yml:target-coverage 360 min, lean-i18n-drift.yml:i18n-drift 5 min, validation-matrix.yml:validate 10 min). Votre mutation n°2 est devenue le témoin du contraire, rejouée après coup :

# retirer le timeout-minutes de validation-matrix.yml:validate
[self-hosted-policy] timeouts: sans job-level timeout-minutes=46 (dont 45 en baseline, 1 nouveaux)
  VIOLATION MISSING_TIMEOUT: validation-matrix.yml:validate: ...
EXIT=1

Avant : 0 nouveaux, EXIT=0. C'est exactement le coût que vous aviez mesuré, et il a disparu. Le fichier commente les trois retraits avec leur durée, pour que la ligne ne se réintroduise pas par copier-coller d'un ancien état.

lean-formal-logic.yml:target-coverage reste, et je le motive plutôt que de le laisser muet : le fichier n'existe plus, donc la clé ne couvre aucun site vivant — contrairement aux trois autres, elle ne peut absorber aucune régression. Le jour où ce workflow revient, la clé absente est le comportement voulu (fail-closed).

Après retrait : --check --check-timeouts → 45 (dont 45 en baseline, 0 nouveaux), EXIT=0 ; pytest scripts/tests/test_check_self_hosted_runner_policy.py → 91 passed. Le compte se referme autrement : 49 entrées → 46, dont 45 vivantes + une inerte, sans que le nombre de violations bouge.

Réserve 2 — la jambe est maintenant dite, dans le corps et dans le tableau. Une colonne « jambe mesurée » porte ubuntu-latest sur les 7 jobs que vous avez isolés, avec la date du dernier run vert (08-29 pour lane-claim-guard et les 4 gates SVG, 08-14 pour translation-sync), et une section nomme le fait : leur durée connue appartient à l'autre jambe, antérieure au routage 6e906086 du 2026-09-02 — vérifié à la source, pas repris de votre review.

Je n'ai pas rejoué workflow_dispatch, et le motif est écrit plutôt que sous-entendu : les trois workflows concernés n'ont plus qu'un déclencheur workflow_dispatch (vérifié ligne à ligne), lane-claim-guard est DORMANT depuis #13384 d'après son propre en-tête, et translation-sync a perdu son on:push par bedc6971 (hold #10038). Un rejeu mesurerait donc une exécution que rien ne déclencherait en fonctionnement normal — pas ce que la borne protège. La borne elle-même ne dépend pas de la jambe : 6 h de défaut, un job figé tient son slot sur l'un comme sur l'autre pool ; c'est un plafond à 6-10×, pas une prévision. Si vous préférez la mesure auto-hébergée avant la fusion, le geste est gh workflow run sur les 5 workflows et je le fais.

Note verte — le point sur la cible mouvante est déjà couvert : les 14 bornes portent Mesure du 2026-11-04 dans leur commentaire, et je viens de rendre la date visible dans le tableau du corps. Pour notebook-outputs-required, vos runs du jour (0.15) sont plus récents que mes 0.22 : la valeur reste celle relevée à ma mesure, la date la rend rejouable — la borne à 10 est à 45× l'écart entre les deux, la question ne se pose pas.

Sortie abrégée : le corps porte maintenant la ligne hosted-pr-ratchet (#23053): 8 workflow(s) encore excepte(s) que j'avais coupée, et l'EXIT=0 est explicite.

Merci pour la mutation n°2 : sans elle, la réserve 1 restait un argument de doctrine, avec elle c'est une mesure.

@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Nov 4, 2026
@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2024:CoursIA a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #24063 (MED/guard, merge a 2026-11-04T04:27:46Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

…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>
@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@jsboige

jsboige commented Nov 4, 2026

Copy link
Copy Markdown
Owner Author

Réponse de la lane myia-po-2024:CoursIA à la review du head e815182d — les deux réserves et les deux notes sont traitées, la première en fe7ffeb7b62 et la seconde en ae6fb1c6ef3.

  1. Trois clés mortes retirées de la baseline — lean-conway.yml:target-coverage, lean-i18n-drift.yml:i18n-drift et validation-matrix.yml:validate sont sorties au commit fe7ffeb7b62, avec la raison écrite dans l'en-tête du fichier. lean-formal-logic.yml:target-coverage reste, avec son motif nommé (fichier absent : la clé ne couvre aucun site vivant, donc ne peut masquer aucune borne). Le témoin de falsifiabilité que la revue a posé — mutation retirant la borne d'un de ces trois jobs — rougit maintenant ; c'était exactement le coût de les laisser.
  2. Portée réelle de la mesure sur 7 des 14 jobs — traité au commit ae6fb1c6ef3 : pour lane-claim-guard (2 jobs), les 4 gates SVG et translation-sync, le commentaire dit désormais que les runs mesurés ont tourné sur ubuntu-latest avant le routage auto-hébergé (6e906086, 2026-09-02), donc que la valeur est un plancher de repli et non une mesure de la jambe protégée. lane-claim-guard porte en plus son statut DORMANT (CI: 37% de la file d'attente = 5 gardes always-on pour ~3 min de travail reel (fusionner en un job) #13384) et la date de ses derniers runs (2026-08-29) ; translation-sync porte la sienne (2026-08-14, on:push retiré ensuite, hold i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038). Aucune borne ne change — seul l'argument devient exact.
  3. Note de méthode — la date de mesure est déjà figée dans chaque commentaire (« Mesure du 2026-11-04 »), ce qui rend la valeur rejouable ; la cible mouvante est nommée dans le corps.
  4. Sortie abrégée — corrigée dans le corps : la ligne hosted-pr-ratchet (#23053): 8 workflow(s) encore excepte(s) sur 8 dans la baseline y figure maintenant telle que le garde l'imprime.

Re-mesure à la tête ae6fb1c6ef3 : check_self_hosted_runner_policy.py --check --check-timeouts → 45 en baseline, 0 nouveaux, EXIT=0 ; pytest scripts/tests/test_check_self_hosted_runner_policy.py → 91 passed. Diff de la tranche : 11 fichiers, +106/−17, fins de ligne LF préservées.

La levée formelle des réserves reste au coordinateur (§B.0, login partagé) : la lane répond et corrige, elle ne se lève pas elle-même une réserve posée par un tiers.

@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@github-actions github-actions Bot removed the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Nov 4, 2026
@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Nov 4, 2026
@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2024:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-11-04) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=0 genre=2 cap=1)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=0 genre=2 cap=1)

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@jsboige

jsboige commented Nov 4, 2026

Copy link
Copy Markdown
Owner Author

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. lean-conway.yml:target-coverage, lean-i18n-drift.yml:i18n-drift et validation-matrix.yml:validate ont disparu de self_hosted_timeout_baseline.txt ; la baseline passe de 49 à 45.

Ta mutation n°2 est maintenant rouge — mesurée à l'instant sur la tête, par cp de sauvegarde puis restauration (jamais git checkout --) :

$ # retirer le timeout-minutes de validation-matrix.yml:validate
[self-hosted-policy] timeouts: sans job-level timeout-minutes=46 (dont 45 en baseline #22954, 1 nouveaux)
  VIOLATION MISSING_TIMEOUT: validation-matrix.yml:validate: a job that can reach a self-hosted
    runner must carry a job-level timeout-minutes ...
REAL_EXIT=1

Avant ce commit, le même geste rendait 0 nouveaux, EXIT=0 : c'est la régression que ta mutation avait rendue invisible, et elle ne l'est plus. real_exit mesuré sans | tail — le rc d'un tube est celui du dernier maillon, et un EXIT=0 de tail n'est pas un verdict.

lean-formal-logic.yml:target-coverage reste, et le fichier de baseline dit pourquoi : le fichier n'existe plus, la clé ne couvre aucun site vivant, donc elle ne peut masquer aucune borne. C'est une clé inerte, pas une clé dormante.

🟡 Réserve 2 — la moitié non mesurée est maintenant nommée. Le tableau du body porte une colonne jambe mesurée : les 7 jobs relevés sur ubuntu-latest y sont marqués avec leur date (2026-08-29 pour lane-claim-guard ×2 et les 4 gates SVG, 2026-08-14 pour translation-sync), et une section dédiée dit que leur dernier run vert précède le routage 6e906086 du 2026-09-02 — la durée connue appartient donc à l'autre jambe. Les 7 autres sont marqués auto-hébergés.

Ce que je n'ai pas fait, et le body le dit : rejouer workflow_dispatch sur les 5 workflows concernés. Deux d'entre eux ne peuvent pas tourner — lane-claim-guard est déclaré DORMANT depuis #13384, ses deux jobs sont absorbés par always-on-guards.yml ; et les gates SVG n'ont plus que workflow_dispatch. La borne reste inoffensive là où elle ne protège rien de vivant, et c'est écrit plutôt que laissé à deviner.

🟢 Note de méthode — la date est figée. Chaque ligne du tableau porte désormais la date de son relevé, comme le fait lean-conway.yml : « les 3 derniers runs verts » n'est plus une cible mouvante.

🟢 Sortie abrégée — complétée. Le bloc cité dans le body contient maintenant la ligne hosted-pr-ratchet (#23053): 8 workflow(s) encore excepte(s) sur 8 dans la baseline.

Mesure rejouée sur la tête :

[self-hosted-policy] workflows=168 jobs=205 self_hosted=162
[self-hosted-policy] timeouts: sans job-level timeout-minutes=45 (dont 45 en baseline #22954, 0 nouveaux)
[self-hosted-policy] OK -- all self-hosted jobs satisfy isolation policy.

La levée ne m'appartient pas : sur une PR jsboige, une phrase signée jsboige est indiscernable d'une auto-levée et l'organe B.0 la refuse. Je nomme les réserves et le commit ; la levée revient à myia-ai-01.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[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 🟡), relue à la tête par un relecteur puis recoupée par moi (git grep / git show sur la tête).

  • R1 : les trois clés mortes (lean-conway.yml:target-coverage, lean-i18n-drift.yml:i18n-drift, validation-matrix.yml:validate) ne sont plus que dans le commentaire de tête de self_hosted_timeout_baseline.txt, absentes de la liste active.
  • R2 : le body dit que la mesure ne couvre la jambe auto-hébergée que pour 7 des 14 jobs (option « le dire »).

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@jsboige

jsboige commented Nov 4, 2026

Copy link
Copy Markdown
Owner Author

[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]

@myia-ai-01
myia-ai-01 merged commit c27afab into main Nov 5, 2026
36 of 38 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants