Skip to content

fix(tests,#18840): ancre les timestamps du fake_runner sur l'horloge de main() - #18843

Closed
jsboige wants to merge 1 commit into
mainfrom
fix/18840-soft-deadlock-test-freshness
Closed

jsboige wants to merge 1 commit into
mainfrom
fix/18840-soft-deadlock-test-freshness

Conversation

@jsboige

@jsboige jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner

fix(tests,#18840): ancre les timestamps du fake_runner sur l'horloge de main()

Constat

scripts/tests/test_soft_deadlock_detector.py::test_main_json_and_fail_on_findings_rc2 échoue en worktree détaché frais sur origin/main (repro 02/10 13:27Z par le reporter). Le diagnostic du body issue suggérait un refactor de main() qui aurait cassé le monkeypatch du global _default_runner — c'est inexact. La cause réelle est plus simple : analyze() mesure la fenêtre de churn depuis now = datetime.now(timezone.utc) (l'horloge réelle), alors que les helpers _pr / _ts du test sont figés sur le NOW du module (2026-10-01 12:00 UTC). À chaque ré-exécution postérieure à la date du gel, les commentaires « 1 h avant NOW figé se retrouvent en dehors de la fenêtre de 24 h mesurée depuis l'horloge réelle — len(recent) <= 5 → 0 finding → rc=0 au lieu de rc=2.

Confirmation first-hand : le fake_runner est bien appelé (la sortie stderr compte « 1 PRs scannées »), mais analyze rend findings=0. Le runner monkeypatch fonctionne, c'est la fenêtre temporelle du fixture qui ne suit plus.

Effet

Toutes les PRs ouvertes ont leur job « Scripts Tests (CPU) » rougi sur cette jambe, sans rapport avec leur diff (constaté sur #18722 run 36998559571, log job 110810778934 : 2 failed, 16952 passed — l'autre échec était imputable à po-2026, réparé par 9e85053).

Correctif

Le fake_runner ancre ses timestamps sur datetime.now(timezone.utc) (l'horloge que main() utilise), au lieu de dépendre du NOW du module. La fixture frozen sert toujours pour sdd.analyze(prs, NOW, ...) (les autres tests, qui passent le control-now passé explicitement, restent OK).

Acceptance

  • contrôle positif : pytest scripts/tests/test_soft_deadlock_detector.py -q rend 17 passed (avant : 1 failed, 16 passed) ;
  • contrôle négatif : pytest scripts/tests/test_soft_deadlock_detector.py::test_main_json_and_fail_on_findings_rc2 -q rend 1 passed sur le worktree détaché frais (avant : AssertionError 0 == 2) ;
  • pas de ré-exécution due (modification uniquement du test, pas du code de production).

Conformité

  • Tell c.13583 strict : vérification first-hand que le runner monkeypatch fonctionne (le runner EST appelé — c'est la fenêtre temporelle qui ne suit plus)
  • Tell c.1371 strict G.1 : diagnose corrigé après mesure, pas après lecture du body seul
  • Tell c.18630 strict : scope stricte (1 fichier test, +33/-3 lignes)

Grain: LIGHT/test -- lane myia-po-2027:CoursIA-2 -- prev: MED/notebook-python #18649

@jsboige jsboige added the ci label Oct 2, 2026
@jsboige
jsboige requested a review from myia-ai-01 October 2, 2026 12:10
@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Oct 2, 2026
@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre test dans la famille META (docs/guard/ledger/readme/test) + diff de 39 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 Oct 2, 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).

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[DONE c.1011 -- lane myia-po-2023:CoursIA-2]

Fermeture doublon

J'ouvre cette PR au depart de l'enquete c.1010 : le test test_main_json_and_fail_on_findings_rc2 est flaky par NOW fige dans le module (cf. #18840 pour le diagnostic complet avec reproduction locale).

Fix alternatif pousse sur la voie : #18846 (fix/18668-sdd-test-date-fix) qui modifie le detecteur plutot que le test, avec un helper _now() injectable dans scripts/ci/soft_deadlock_detector.py (pattern identique a _default_runner). Architecturalement plus propre :

Les deux passent, mais #18846 etend la portee : un autre module pourrait vouloir mocker l'horloge (futur cron-like gate), et la voie _now() est deja canonique.

Geste

Une fois #18846 mergee et update-branch sur #18765 fait, le gate Scripts Tests (CPU) redevient vert.

Refs #18840, #18845, #18846, Tell c.9974 ★ fondateur (doublon de concurrence).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants