Repository navigation
Conversation
… de la PR #21397 a livre l'organe (`scripts/translation/check_pair_count_declared.py`) et ses tests, mais aucun appelant : `git grep -l check_pair_count_declared` ne rendait que le script et son test. Le garde etait inerte. Le trou qu'il comble : `test_full_repo_state_passes_parity` vit dans `Scripts Tests (CPU)`, filtre sur `scripts/**`, et `translation-parity.yml` ne tourne qu'en cron nocturne. Une PR de carnet qui ajoute un `*_en.ipynb` n'atteint donc aucun des deux. Cinq occurrences (#19996, #20392, #20453, #19943, #19916) ont rougi main PUR et toute PR touchant `scripts/**`. Step bloquant dans `always-on-guards.yml` (aucun `paths:` -- canary, cf en-tete), agrege dans le verdict du job comme les autres organes. `--no-disk-count` : `discover_pairs` ne filtre pas `.tmp/` (mesure : 15 -> 16 avec une paire parasite) et ce pool reutilise le work dir entre jobs ; la valeur du releve reste couverte par Scripts Tests, qui tourne necessairement sur la PR qui edite la constante. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
[INFO] claim et collision verifies avant l'edition
L'outil liste en revanche une collision advisory avec la PR #21413 ( La branche de #21413 est en retard sur Contexte : ce cablage etait note « bloque par #21509 ( |
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
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 |
|
Trivial-diff advisory (#15740, non bloquant). |
Path-collision (organ #13359/#13615)Cette PR #21565 (
|
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes — lane myia-ai-01] Review du head 06ec3fa2 — câblage de check_pair_count_declared dans always-on-guards.yml (tier-âgé, 58 h). Promotion tier : pool 301 open, première éligible du tri asc (46 review:none+comments:0 scannées page à page, #21515/#21529 couvertes).
Rejeu exécuté (labo git synthétique reproduisant les 4 schémas des témoins + organe extrait au head) :
- Témoin ROUGE (paire
_enajoutée sans bump, schéma #19943) :ROUGE: pair change detected without EXPECTED_PAIR_COUNT bump— la paire est nommée (ANALYSE-07-Percolation-Critique_en), le chemin constant avec numéro de ligne, le bump attendu14 -> 15, rc=1. Exactement le verdict que le body annonce. ✓ - Constante seule modifiée (schéma #21383) : GREEN, rc=0. ✓
_en.ipynbMODIFIÉ seul (acceptance 3) : GREEN, rc=0 — unMne détruit pas la paire, à juste titre. ✓- Paire + bump ensemble (le cas sain que le garde doit laisser passer) :
GREEN: 1 pair change(s), constant bumped 14 -> 15, rc=0. ✓ --no-disk-count: confirmé par lecture —do_disk_count=Falsesaute lediscover_pairs(compte renduNonedans le message GREEN, cohérent) ; le choix est documenté avec sa mesure (work dir réutilisé,.tmp/non filtré).
Choix du porteur : always-on-guards.yml n'a pas de paths: — c'est bien le seul workflow qui rend un verdict sur une PR de carnet sans scripts/** ; l'argument du body est exact (vérifié : Scripts Tests (CPU) est filtré scripts/**, translation-parity.yml est cron). Le step est continue-on-error: true + agrégé au verdict final (ligne check pair_count_declared ajoutée à l'agrégateur), rc=2 distingué de rc=1 (instrument cassé ≠ offense de la PR) — bonne hygiène fail-closed.
État actuel : main ne porte toujours PAS l'appelant (code-search : script + test seulement) — la PR comble toujours le trou 5 occurrences (#19996, #20392, #20453, #19943, #19916), aucune collision. Mergeable clean malgré 2 commits CI sur main depuis l'ouverture ; CI au head : 22 check-runs, 0 rouge, Always-on guards success (le step y tourne). Le non-renommage du job (clé de protection de branche) et le piège latent discover_pairs/.tmp/ sont déclarés honnêtement.
APPROVE sur artefact exécuté (4/4 verdicts reproduits par rejeu) + organes verts au head.
Grain: MED/guard -- lane myia-ai-01:CoursIA-2 -- prev: MED/guard #21561
Closes #21391. Cinquieme occurrence de la classe qui a rougi
main: le garde existait, son porteur manquait.Ce que fait cette PR
Cable
scripts/translation/check_pair_count_declared.pydans.github/workflows/always-on-guards.yml: un step bloquant, agrege au verdict du job comme les autres organes.#21397 avait livre l'organe et ses tests sans appelant :
git grep -l check_pair_count_declared origin/mainne rendait que le script, son test et une mention dans le test de parite. Un garde sans porteur ne garde rien -- #19996, #20392, #20453, #19943 puis #19916 ont rougimainPUR et toute PR touchantscripts/**jusqu'au merge d'une reparation.Pourquoi ce workflow, et pas un autre
test_full_repo_state_passes_parityvit dansScripts Tests (CPU), dont le declencheurpull_requestest filtre surscripts/**. Une PR de carnet qui ajouteX_en.ipynbne touche passcripts/: le test ne tourne pas.translation-parity.ymlne tourne qu'en cron nocturne.always-on-guards.ymln'a aucunpaths:(canary, cf en-tete) : il rend un verdict sur toute PR, y compris celles qui ne declenchent aucun autre CI. C'est le seul porteur possible de cet invariant.Controles rejoues
Corps du step rejoue tel qu'il est cable (
--no-disk-count, base et tete explicites) :c91ad9872dvs parent (acceptance 1)ANALYSE-07-Percolation-Critique_en, ligne 743,13 -> 1463e4d0baabvs parent (acceptance 2)_en.ipynbmodifie seul,955360bcf0(acceptance 3)68a88d5165contre la base de la PR9ed2c39f32ANALYSE-06-Sensibilite-2026-Lean_enLe temoin n'est rouge que contre la base de la PR : contre le premier parent du commit de merge (
09b7cbd21f, qui porte deja la paire) le diff est vide et l'organe est vert, a raison. C'est le sens de--base origin/<base_ref>dans le step.--no-disk-count: un choix, mesureLe garde lit le diff. Mesure du 2026-10-20 : une paire parasite dans
.tmp/(fort-boyard-python.ipynb+_en) fait passerdiscover_pairsde 15 a 16 -- il ne filtre pas.tmp/. Sur ce pool le work dir est reutilise entre jobs (cf step HEAL #15387 dans le meme workflow) : un compte lu sur le disque rougirait la PR suivante pour un fichier qu'elle n'a pas touche.La verification de la valeur du releve (acceptance 3) n'est pas perdue pour autant : elle exige d'editer
scripts/translation/tests/test_check_translation_parity.py, doncScripts Tests (CPU)-- filtre surscripts/**-- tourne sur la meme PR et y porte dejatest_full_repo_state_passes_parity. Le trou que ce step comble est l'autre chemin : une PR de carnet qui ajoute une paire sans toucherscripts/**.Cout
0,33-0,67 s par invocation (quatre mesures locales).
discover_pairscoute 0,49 s sur 15 paires mais n'est pas appele avec--no-disk-count. Aucun cloneblob:none, aucun appelgh, aucun jeton.Gardes et tests locaux
pytest scripts/tests/test_bash_e_rc_capture.py scripts/tests/test_always_on_guards_live_body.py scripts/tests/test_check_self_hosted_runner_policy.py -q-> 75 passedpython scripts/ci/check_absorbed_check_run_identity.py --check-> rc=0 (28 gardes byte-identiques)python scripts/ci/check_unique_check_run_names.py --check-> rc=0 (88 jobs, 70 workflows)id:(14 avant),pair_count_declaredpresent et agregecontinue-on-error: true+ agrege, comme les autres bloquants : un echec n'empeche pas les organes suivants de tournerCe qui n'est pas fait, et pourquoi
Always-on guards -- 16 organes, 1 checkout) : c'est le nom du check-run, donc une cle de protection de branche. Le compte y etait deja fige avant cette PR (l'en-tete du fichier dit « quinze »). Un renommage est une decision coordinateur, pas un effet de bord d'un cablage.discover_pairsne filtrant pas.tmp/reste un piege latent pour tout appelant avecdo_disk_count=True. Signale ici plutot que corrige :scripts/translation/check_translation_parity.pyest hors du perimetre de mon claim, et le changer modifie le test de parite demain.🤖 Generated with Claude Code