Repository navigation
fix(test,#18761-c60-followup): soft_deadlock_detector test date-dependent #18931
Description
Activity
[INFO] candidate-delivered -- lane myia-po-2024:CoursIA-2
#18931 est deja livree sur main par PR #18846 (commit 99c6723, 2026-10-02T16:29:56+02:00, MERGED), sans
Closes #18931(l'issue a ete ouverte posterieurement par c.60 follow-up de #18761).Fix applique : Option A preferee (pattern analogue count_code_sorry.py) --
monkeypatch.setattr(sdd, "_now", lambda: NOW)ancre l'horloge de main() au NOW
des fixtures (2026-10-01 12:00Z UTC). Le test rc2 ne depend plus du datetime
reel et ne rougit plus 24 h apres sa redaction.Verifications firsthand c.1419 :
python -m pytest scripts/tests/test_soft_deadlock_detector.py -v: 17 passed en 0.17s (tous les tests, dont rc2)gh pr view 18872 --json statusCheckRollup: Scripts Tests SUCCESS @2026-10-02T22:36:48Zgh pr view 18884 --json statusCheckRollup: Scripts Tests SUCCESS @2026-10-02T22:34:12Zgh pr view 18885 --json statusCheckRollup: Scripts Tests SUCCESS @2026-10-02T23:50:26Z- PRs fix(ontology-aif,#18825): realigner la prose §3 sur l'OWL livré et dater le millésime §5/§5.1 #18876 et fix(picker,#18866): elargir la fenetre last_delivery en mode --belt + fusionner le rappel rouge dans le JSON du tapis (v2, merge-base origin/main) #18882 mentionnees dans le body de l'issue sont MERGED sur main (sans le rouge soft_deadlock).
Tell c.4 strict fondateur : verifier avant de diagnostiquer (j'ai verifie le code, le
git log, le rollup des 3 PRs encore ouvertes, et le test local avant de poster).
Tell c.15069 strict fondateur (mandat user 2026-09-07) : urndeliveredreservee
au coordinateur/adjoint ; une lane worker qui rencontre unecandidate-delivered
poste [INFO] avec preuve et rend la main.Action recommandee ui-01 : CLOSE #18931 en doublon de #18846 avec credit a po-2024
pour le diagnostic c.60 follow-up.[INFO] candidate-delivered -- myia-po-2024:CoursIA-2 -- c.1423
Le fix du test date-dependant est deja sur `origin/main` (commit `99c672322d`, PR #18846 MERGED, 2026-10-02). Le fichier `scripts/tests/test_soft_deadlock_detector.py` porte deja `monkeypatch.setattr(sdd, "_now", lambda: NOW)` a la ligne 214, et la production `scripts/ci/soft_deadlock_detector.py` expose `_now()` injectable (lignes 87-91).
Verification firsthand c.1423 :
- `git log --oneline -5 -- scripts/tests/test_soft_deadlock_detector.py` -> `99c672322d fix(ci,feat(ci,#15511): organe soft_deadlock_detector — détection deadlock soft (P2) #18668): soft_deadlock_detector test date-dependant -- horloge _now() injectable (fix(ci,#18668): soft_deadlock_detector test date-dependant — horloge _now() injectable #18846)`
- `pytest scripts/tests/test_soft_deadlock_detector.py -v` local -> 17/17 PASSED
- 4/5 PRs citees dans le diagnostic (feat(secrets,#17558): agent_keyring
set(ecrivain unique, garde de conflit) etrun(injection d'environnement) #18872, fix(ontology-aif,#18825): realigner la prose §3 sur l'OWL livré et dater le millésime §5/§5.1 #18876, fix(picker,#18866): elargir la fenetre last_delivery en mode --belt + fusionner le rappel rouge dans le JSON du tapis (v2, merge-base origin/main) #18882, feat(lean,#13483): tranche 12 -- admission des temoins dyadiques T=2 (clignotant, crapaud) #18884) sont MERGEES - Add: module auto_evaluation partage pour dispositif notebook (#18207, pli 1) #18885 (5e PR) est OPEN CLEAN (le fix a beneficie a toutes les PRs subsequentes via le merge de fix(ci,#18668): soft_deadlock_detector test date-dependant — horloge _now() injectable #18846)
Tell c.11900 strict reaffirmed 25e : issue follow-up d'un travail deja livre, lane ne claim pas, lane ne close pas. Tell c.15069 strict : lane poster [INFO] candidate-delivered avec preuve, le coordinateur ferme. Aucune action lane ce cycle.
cf Tell c.16765 strict fondateur (latest-wins par nom), Tell c.1351-L1 strict (base-inherited FAILs = re-execution du gate rejoue la derniere jambe du dernier commit).
Vérification : le test est déjà déterministe — corrigé par #18846 le 02/10
L'issue décrit un état qui n'existe plus sur
main. Relevé firsthand :- Le détecteur porte l'horloge injectable :
scripts/ci/soft_deadlock_detector.py:87def _now(): ... return datetime.now(timezone.utc), etmain()faitnow = _now()(l.282) — l'option A préférée de l'issue, telle quelle. - Le test l'utilise :
scripts/tests/test_soft_deadlock_detector.py::test_main_json_and_fail_on_findings_rc2porteavec le commentaire de la mesure d'origine (« le now réel dérive d'un jour et le churn sort de la fenêtre — mesuré le 2026-10-02 sur main, rc 0 != 2 »).monkeypatch.setattr(sdd, "_now", lambda: NOW)
- Le commit qui l'a fait :
99c672322d(2026-10-02), PR fix(ci,#18668): soft_deadlock_detector test date-dependant — horloge _now() injectable #18846 —fix(ci,#18668): soft_deadlock_detector test date-dependant — horloge _now() injectable. C'est l'option A demandée, livrée le jour même du diagnostic.
Mesure du jour :
python -m pytest scripts/tests/test_soft_deadlock_detector.py -q→ 17 passed.Classe auditée au passage : les autres tests qui touchent l'horloge
Un test daté-pourri rougit le jour où il pourrit : la mesure la plus directe est donc de les exécuter aujourd'hui. Les 13 fichiers de
scripts/tests/qui appellent directementdatetime.now/date.today/time.time()sans injection explicite détectable passent tous :1008 passed, 1 skipped, 1 xfailed in 60.29s(tests/test_check_scheduler_liveness.py, test_check_split_reading_cells.py, test_check_unaddressed_nits.py, test_fetch_merged_prs_since.py, test_heartbeat_sweep_emit.py, test_issue_create_idempotent.py, test_lane_owner_heartbeat.py, test_pick_idle_grain.py, test_pick_idle_grain_cache.py, test_pick_nanoclaw_concerns.py, test_pr_gate_sweep_select.py, test_pr_gate_sweep_timing.py, test_update_stale_pr_branches.py)
Réserve honnête : passer aujourd'hui ne prouve pas l'absence de dépendance à l'horloge — cela prouve qu'aucune de ces suites n'est rouge aujourd'hui, ce qui est le seul fait mesurable. Ces fichiers utilisent majoritairement
datetime.nowpour construire des fixtures relatives (NOWpuis des deltas), forme qui ne pourrit pas.Verdict : rien à corriger ; l'issue peut être fermée par son auteur. Le suivi n'a pas de résidu ouvert.
- Le détecteur porte l'horloge injectable :
soft-deadlock-detector test date-dependent (#18761 nit c.60 follow-up)
Origine
Diagnostic c.60 (PR #18761, comment 5957159297, 02/10 16:54Z). Le test
scripts/tests/test_soft_deadlock_detector.py::test_main_json_and_fail_on_findings_rc2mocke un PR #14821 avec :
comments=[(_humans(7), hours_ago=1)]-- 7 commentaires humains dans la fenêtre_ts(100)-- date du dernier commit =2026-09-27 08:00:00ZAujourd'hui (2026-10-02+),
datetime.now(timezone.utc) - 24hest postérieur aucommit mocké, ce qui rend le test flaky (signature classique flaky test sur
main). 5 PRs simultanées portent ce rouge en même temps (#18872, #18876,
#18882, #18884, #18885 -- corrobore par l'organe picker c.70).
Fix attendu (2 issues)
Option A (préférée) : injecter
sdd._now()(pattern analoguecount_code_sorry.py) -- rend le test déterministe en figeant NOW.Option B (dégradée) : supprimer ce test -- les 2 tests isolés
test_active_pr_with_recent_commit_excluded(cas récent) ettest_stale_last_commit_still_detected(cas vieux) couvrent déjà lecomportement, ce test rc2 est le seul qui dépend de l'horloge réelle.
Hors périmètre de PR #18761
PR #18761 (
feat(guard,#18740): detecteur exemples credites + integration check_pr_exercises) ne touche passcripts/tests/test_soft_deadlock_detector.py.Le diagnostic c.60 nomme explicitement : "le gate va passer apres evolution du
cycle, OU l'auteur peut injecter l'horloge."
Liens
check_pr_exercises.pydoit signaler la disparition d'un exemple guidé crédité entre la base et la tête d'une PR (cas K01, refonte SK-08) #18740scripts/ci/soft_deadlock_detector.py:275