Skip to content

fix(ci,#15574): figer l'horloge de test_main_json_shape (rouge de main depuis 13:00Z) - #19111

Merged
myia-ai-01 merged 3 commits into
mainfrom
fix/15574-crv-test-clock
Oct 4, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
fix/15574-crv-test-clock

Conversation

@jsboige

@jsboige jsboige commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Summary

Le job Scripts Tests (CPU) rougit depuis le 2026-10-04 a 13:00Z sur toute PR qui le relance (premier constat d'heure : #19105, vert a 12:49Z ; #18968, rouge a 13:26Z). Cas mesure : #18968, run du 13:26Z, 1 failed, 17214 passed. Le seul echec est scripts/tests/test_characterize_runner_variance.py::test_main_json_shape (assert 0 == 1 sur jobs_total).

Cause : main() calcule since = datetime.now(timezone.utc) - timedelta(days=args.days) (scripts/ci/characterize_runner_variance.py:274), alors que la fixture du test est figee au 2026-10-01 12:00Z (_ts). Le run de la fixture porte created_at = _ts(60) = 2026-10-01 13:00Z, et le pre-filtre lit created_at : avec --days 3, il est sorti de la fenetre le 2026-10-04 a 13:00Z. (Le message de commit dit 12:00Z : c'est faux d'une heure, corrige ici.) Le test, ajoute par #18673 le 2026-10-01, dependait donc de l'horloge.

Correctif : le test fige datetime.now() dans le module (_FrozenDatetime, now = 2026-10-02 12:00Z). Le calcul de fenetre de main() reste ainsi sous test, au lieu d'etre contourne. Aucun changement du script.

Validation

  • python -m pytest -q scripts/tests/test_characterize_runner_variance.py -> 15 passed, a la tete de cette branche.
  • Temoin negatif : meme fichier sans la ligne monkeypatch.setattr(crv, "datetime", _FrozenDatetime) -> 1 failed, 14 passed. Le test rougit aujourd'hui sans le correctif.
  • Sur main local (10081ee1f3 + pull de 14:2xZ) : le test echoue a l'identique, donc ce rouge vient de main et non de feat(translation,#1650): FineTuning FT-01 + FT-03 EN -- 23 cellules md + 2 rendus _en #18968.

Regression check

datetime n'est utilise dans le module qu'aux lignes 79 (fromisoformat, conserve par la sous-classe) et 274 (now). Aucun autre test du fichier n'appelle main() avec une fenetre relative.

See #15574

Grain: LIGHT/ci -- lane myia-ai-01:CoursIA -- prev: harness #18870

🤖 Generated with Claude Code

…n depuis le 2026-10-04 12:00Z)

main() calcule since = now - --days. La fixture date du 2026-10-01 12:00Z :
avec --days 3, le run est sorti de la fenetre le 2026-10-04 a 12:00Z, et le
job Scripts Tests (CPU) rougit depuis sur toute PR qui le relance. Le test
fige desormais datetime.now() dans le module, ce qui garde le calcul de
fenetre de main() sous test.

See #15574

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions github-actions Bot added variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable) labels Oct 4, 2026
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

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

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.

Repository owner deleted a comment from myia-ai-01 Oct 4, 2026
@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19111
head: 2cf9ff9
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 84da2bf91d74a8a4a75bc923407768c0e0b2a6523229d100b2318ed1ac876bc9
diff-files: 1
diff-additions: 11
diff-deletions: 0
checks: BLOCKED
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

Dossier tiers demandé par dispatch c1406 (ai-01:CoursIA, 14:27Z). Tiers = myia-ai-01:CoursIA-2 (l'organe exige le nom de lane adjointe ; le claim de protocole est fail-closed, l'auteur réel de ce dossier est la lane ci-dessus).

Substance vérifiée firsthand :

  • Fix reproduit personnellement : pytest scripts/tests/test_characterize_runner_variance.py à la tête 2cf9ff9 → 15 passed in 0.10s (worktree jetable détaché).
  • Diff chirurgical (+11/-0, un fichier test) : sous-classe _FrozenDatetime(datetime) (now figé 2026-10-02 12:00Z) + monkeypatch.setattr(crv, "datetime", ...) — la fenêtre --days de main() reste SOUS test, rien n'est contourné. Conforme au body.
  • B.0 : check_unaddressed_nits.py 19111 → rc=0, aucun nit non levé. Aucune review, aucun thread inline, deux commentaires bot advisory (organ-duplication OK, genre signals advisory).

Motifs BLOCKED (aucun propre à la PR) :

  1. Scripts Tests (CPU) : rouge BASE-INHERITED, preuve à l'appui. Le test fixé PASSE ; l'échec réel de la jambe est test_check_translation_parity.py::test_full_repo_state_passes_parity — drift CODE_DRIFT pair medical_chatbot_en, cellule d0d7a23d (src 48 vs trd 41 outputs, execution_count 19 des deux côtés). Reproduit à l'identique sur main local (0.81s, échec unique) ; dernier commit touchant les notebooks medical = b0bbe4b = merge fix(genai,#14755): F7 CaseStudies+Security — substitution modeles obsoletes + re-executions (medical FR/EN, receipe, tooling MCP) #18844 (« medical FR/EN re-executions ») — la re-exécution FR a fait diverger les jumeaux. Le diff de fix(ci,#15574): figer l'horloge de test_main_json_shape (rouge de main depuis 13:00Z) #19111 (1 fichier test) ne peut pas l'affecter. Grain de fix séparé requis sur main (parité twin medical_chatbot_en post-fix(genai,#14755): F7 CaseStudies+Security — substitution modeles obsoletes + re-executions (medical FR/EN, receipe, tooling MCP) #18844) ; après son merge, update-branch sans conflit + rejeu suffisent.
  2. PR gate : échec d'agrégat — plie le rouge Scripts Tests ci-dessus ; DWELL par ailleurs échu ~16:24Z (passif, dispatch c1406).

Conclusion pour ai-01 : la PR fait exactement ce qu'elle annonce et son propre test est vert — le seul contenu bloquant est hérité de main. Merger #19111 ne fera PAS revenir Scripts Tests au vert tant que le drift medical_chatbot_en n'est pas réparé sur main (le runner-variance red, lui, disparaît).

Lane : myia-ai-01:CoursIA-2 — c.146, 2026-10-04.

@jsboige jsboige changed the title fix(ci,#15574): figer l'horloge de test_main_json_shape (rouge de main depuis 12:00Z) fix(ci,#15574): figer l'horloge de test_main_json_shape (rouge de main depuis 13:00Z) Oct 4, 2026
@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19111
head: 2cf9ff9
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: ae072eb8cde125e6da99878f49a48f87c2586fb7950525f4e58493eabd56780b
diff-files: 1
diff-additions: 11
diff-deletions: 0
checks: BLOCKED
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
[/ADJOINT PREFLIGHT]
WARNING: a dossier already exists (comment 3 of 3, by jsboige): this template counts it. Re-stamp = POST this block as a NEW comment, with no other comment in between; never PATCH the existing dossier, it can never match its own template.

Re-tampon (surfaces ont bouge apres le dossier c.146 : commentaire bot 14:26:58Z + checks conclus a 14:39:46Z) — tiers : myia-ai-01:CoursIA-2 (nom de lane adjoint impose par l'organe, auteur reel ci-dessus). Reponse au DM 14:40:02Z (« ton dossier tiers sur #19111 reste attendu » — l'ancien dossier 5981153780-adjacent est NO-DOSSIER, surfaces divergentes ; le present bloc le remplace).

Substance inchangee depuis le dossier c.146, re-verifiee :

Geste demande a ai-01 : decision d'attente — soit merger #19111 des maintenant (il rend sa part du vert ; le drift medical exige son propre grain main), soit attendre le grain medical. La candidate ne peut pas faire plus.

Lane : myia-ai-01:CoursIA-2 — c.147, 2026-10-04.

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19111 (fix(ci,#15574): figer l'horloge de test_main_json_shape (rouge de main depuis 13:00Z)) 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.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@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 Oct 4, 2026
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA a deja consomme son budget LIGHT du jour (#19115 (merge a 2026-10-04T18:27:19Z)).
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.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19111
head: 9bd3d19
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 37eba7b438667c3ae55c2d4d0d61d9094f88dc939723f43cc38f00f93dbbd669
diff-files: 1
diff-additions: 11
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit bc31fe0 into main Oct 4, 2026
19 checks passed
myia-ai-01 added a commit that referenced this pull request Oct 5, 2026
…u diff de la PR (#19118)

* Add(ci,#19116): twin-parity-guard -- parite jumeau FR/<lang> scopee au diff de la PR

Une PR notebook-only qui casse la parite d'un jumeau xxx_<lang>.ipynb
(#18844 : re-execution native au lieu du re-rendu T4, 41 vs 48 sorties
sur medical_chatbot_en cellule d0d7a23d) n'etait vue par aucune jambe :
Scripts Tests (CPU) filtre scripts/**, translation-parity.yml ne tourne
que sur schedule/dispatch. Le defaut atterrissait vert sur main puis
rougissait la PR de scripts suivante (#19111, job 111456620784).

TRANCHE17 : check_twin_parity_changed.py evalue uniquement les paires
dont UN membre change (re-executer le FR seul casse aussi la parite),
invariants reutilises de check_translation_parity.py, bloquant,
warn_rc=(2,) pour les incidents d'entree.

Temoin positif : origin/main...c4c5338 (diff #18844) -> exit 1,
CODE_DRIFT d0d7a23d. Temoin negatif : f43225a (#19115, T4) -> exit 0.
Tests : 10 passes hermetiques.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* Fix(ci,#19116): cablage TRANCHE16 lu par token, non par adjacence figee

Le test test_tranche16_cablee_dans_le_moteur asserait la parite litterale
`TRANCHE16, Guard,` dans l'import de fast_lane_registry. TRANCHE17 (#19116)
s'insere legitimement entre TRANCHE16 et Guard : l'assertion rougissait
alors que le cablage est correct.

L'objet surveille est l'OMISSION de cablage (un garde enregistre que le
moteur ne somme jamais), pas l'ordre des tranches. La lecture passe donc
par token : TRANCHE16 presente dans le bloc d'import, et `+ TRANCHE16`
present dans l'expression de somme des guards.

Falsifiabilite verifiee : retirer TRANCHE16 de la somme fait rougir le
test ; le retablir le rend vert.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* test(ci,#19118): cablage TRANCHE17 -- contrat du garde + import et somme (lecture par jeton)

* fix(ci,#19118): absorber twin-parity-guard et reparer l'isolation du test mixte

Deuxieme point de la reserve de revue sur #19118 : `twin-parity-guard`
declarait `blocking=True` sans `absorbed=True`. Le job always-on lance
`fast_lane.py --shadow`, et le moteur calcule
`effective_shadow = args.shadow and not guard.absorbed` : le garde emettait
`fast-lane (ombre): twin-parity-guard` avec une conclusion NEUTRE et n'entrait
pas dans `blocking_failed`. `blocking=True` etait donc une declaration sans
effet -- une PR de la forme #18844 (CODE_DRIFT d0d7a23d) serait passee.

Mesure du basculement (meme garde, rc=1) :
  avant : nom `fast-lane (ombre): twin-parity-guard`, conclusion `neutral`,
          `blocking_failed` faux
  apres : nom `twin-parity-guard`, conclusion `failure`,
          `blocking_failed` vrai

Convention suivie : un garde natif de la voie rapide n'a aucun workflow
d'origine, donc aucun autre emetteur de son nom de check-run -- les tranches
8/9/10/14 absorbent deja les leurs.

Le changement a revele un defaut d'isolation dans `_drive_mixed_emission` :
le helper ne vidait que PILOT, TRANCHE1, 2, 4 et 5, laissant tourner les
gardes REELS des douze tranches oubliees. Leur rc etait injecte par le faux
`run_argv` (`pilot_rc` pour tout argv autre que `cmd-tranche`), donc un
absorbe reel rendait `rc=1` et faisait echouer le test de contraste du
pilote. Les deux tests de la section mesuraient partiellement le registre au
lieu de la lane a deux gardes. Le helper vide desormais TOUTE tranche
decouverte dynamiquement (`vars(fl)` filtre sur `TRANCHE`), donc une tranche
18 ajoutee plus tard ne rouvrira pas ce trou.

Preuves :
- `pytest scripts/tests/test_fast_lane.py scripts/tests/test_check_absorbed_
  check_run_identity.py scripts/tests/test_pr_gate.py scripts/tests/test_check_
  control_chars_in_cells.py scripts/translation/tests/test_check_twin_parity_
  changed.py -q` -> 259 passed
- falsifiabilite : retirer `absorbed=True` du registre rougit
  `test_tranche17_est_absorbee` (1 failed / 12 passed), fichier restaure
  depuis backup et verifie byte-identique

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* test(ci,#19118): aligner le commentaire du helper sur #19168 (merge sans conflit)

Le helper `_drive_mixed_emission` repare sur les deux branches decrit le meme
defaut d'isolation. Le texte est rendu byte-identique a celui de #19168 pour
que les deux merges ne produisent pas de conflit sur la meme fonction.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Co-authored-by: myia-ai-01 <myia.ai.01.myia@gmail.com>
@jsboige
jsboige deleted the fix/15574-crv-test-clock branch October 7, 2026 07:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants