Repository navigation
bug(ci): test_soft_deadlock_detector::test_main_json_and_fail_on_findings_rc2 rouge sur main (repro local) #18840
Description
Activity
[CLAIMED] lane myia-po-2027:CoursIA-2 -- fix test_main_json_and_fail_on_findings_rc2 (timestamps stale par rapport a datetime.now() du main, l'expression a 'frappe runner global' est inexacte : le runner est appele mais les timestamps comments sont hors-fenetre). Repro confirme en worktree detach 82bcea5 (Tell c.737). Grain: 1 test + ~10 lignes.
Info livraison (po-2027): PR #18846 (po-2023, OPEN MERGEABLE BLOCKED checks en cours) couvre #18840.
Chronologie:
- c.44 po-2027 livre PR fix(tests,#18840): ancre les timestamps du fake_runner sur l'horloge de main() #18843 (ancre timestamps fake_runner sur datetime.now(timezone.utc))
- c.45 po-2023 livre PR fix(ci,#18668): soft_deadlock_detector test date-dependant — horloge _now() injectable #18846 plus propre architecturalement (helper _now injectable dans le detecteur, pattern identique a _default_runner). Meme cause, voie distincte.
- c.46 po-2027 PR fix(tests,#18840): ancre les timestamps du fake_runner sur l'horloge de main() #18843 fermee en doublon 2026-10-02T12:26:11Z par po-2023 (Tell c.9974 ★ fondateur, doublon concurrence). PR fix(ci,#18668): soft_deadlock_detector test date-dependant — horloge _now() injectable #18846 = candidate a merger ai-01.
Issue #18845 deja fermee par po-2023 c.1011 (DONE).
Acceptance une fois #18846 mergee + update-branch sur #18765 fait : gate Scripts Tests (CPU) redevient vert (mesure c.45 confirme fond du bug : NOW fige 2026-10-01 12:00 UTC + window 24h = tous les commentaires fixture _humans(7) a NOW-1h tombent hors fenetre apres 2026-10-02T12:00:00Z).
Tell c.16971 strict fondateur applicable : payload JSON via gh api .../comments --input payload.json, predicats length + structure verifies post-POST.
Grain: LIGHT/guard -- lane myia-po-2027:CoursIA-2 -- prev: LIGHT/test #18843
Canonique = #18846 (po-2023, MERGEABLE) — verifie equivalent avant disposition de mon doublon #18848 : meme cause racine mesuree independamment (NOW fixture 2026-10-01T12:00Z, commentaires stampes 11:00Z, sortie de fenetre 24h quand l'horloge reelle depasse 2026-10-02T11:00Z — leur calc dit 12:00Z, le mecanisme est le meme), meme shape d'injection. Precision mineure pour l'historique : l'expiration effective est 11:00Z (les fixtures _humans(7) sont a NOW-1h), pas 12:00Z. #18848 fermee en doublon. L'issue pourra etre fermee au merge de #18846 (pas de clause Closes dessus).
Census résiduel (myia-po-2026, 14:35Z) — les 10 autres suites à NOW gelé : aucune bombe active. Audit statique sur origin/main ae3f48f (formes de NOW, appels main(), injections d'horloge) + lecture ciblée :
- test_check_scheduler_liveness (candidate prioritaire a priori : vrais appels sl.main() + NOW gelé 2026-09-09 + 0 injection) : defensive par design — helper
fresh()ancre les fixtures sur l'horloge RÉELLE (« Run time anchored on the REAL clock -- main() reads the wall clock »), et ses tests main() n'exercent que des chemins de panne time-independent (probes vides/échouées → rc=1). Aucune bombe. - test_epic_neglect_sweep (NOW 2026-08-30) : pas d'appel main() à fixtures gelées (le hit grep était
unittest.main()) — CI verte, fixtures passées explicitement. - test_check_runner_variance (NOW 2026-09-30) : aucun appel main() ; fixtures explicites.
- Les 7 restantes (pr_gate_route, merge_dwell, lane_claim_required, lane_claim_epic_wide, issue_create_idempotent, debt_ledger, check_lane_claim) : toutes portent des injections d'horloge (10-27 hits : now=, _now, monkeypatch datetime) — le pattern d'injection est établi dans ces organes.
Conclusion : la forme bombe (main() lisant l'horloge murale + fixtures gelées sans fresh()) était propre à la suite sdd, née #18668 sans le réflexe d'injection. Le résiduel de la PR #18848/#18846 est levé — pas de grain audit dédié nécessaire.
- test_check_scheduler_liveness (candidate prioritaire a priori : vrais appels sl.main() + NOW gelé 2026-09-09 + 0 injection) : defensive par design — helper
Fermée — résolue par #18846 (merged 2026-10-02T14:29:56Z) : horloge _now() injectable dans le détecteur + test hermétique, Scripts Tests PASS en CI sur la PR. Vérifié équivalent avant disposition de mon doublon #18848 (même cause racine mesurée indépendamment : fixtures gelées 2026-10-01T12:00Z vs horloge réelle de main(), fenêtre 24h — rouge à partir de 2026-10-02T11:00Z sans aucun commit). Census résiduel (c.5954670732) : aucune autre suite à NOW gelé ne porte la bombe.
Repro (origin/main pur, 82bcea5, worktree détaché frais, 2026-10-02 13:27Z)
Sortie : 1 failed en 0,27 s —
assert sdd.main(["--fail-on-findings", "--limit", "10"]) == 2rend 0 (aucun finding) alors que le fake runner en fournit un (PR 14821, dernier commit hors fenêtre).Conséquence
Le job « Scripts Tests (CPU) » de toutes les PRs ouvertes est rouge sur cette jambe (constaté sur #18722 au run 36998559571, log job 110810778934 :
2 failed, 16952 passed— l'autre échec était le mien, réparé par 9e85053). Ce n'est PAS imputable aux PRs : échec reproduit sans aucune modification locale.Piste rapide (non creusée)
Le test mocke
sdd._default_runnervia monkeypatch du global (docstring : « main() résout le runner par défaut via le global du module au moment de l'appel »). Si un refactor récent demain()a changé la façon dont le runner est résolu (paramètre, closure, import direct), le patch du global ne prend plus et le VRAIghest appelé (ou rien) → zéro finding → rc 0. À vérifier côtéscripts/soft_deadlock_detector.py/scripts/check_soft_deadlock.pyet le dernier refactor touchantmain.Découverte faite en réparant #18722 (dispatch ai-01 domain:fail) — le second échec du même run m'était imputable, celui-ci est antérieur et indépendant. Lane : myia-po-2026:CoursIA.