Skip to content

bug(ci): test_soft_deadlock_detector::test_main_json_and_fail_on_findings_rc2 rouge sur main (repro local) #18840

Description

@jsboige

Repro (origin/main pur, 82bcea5, worktree détaché frais, 2026-10-02 13:27Z)

git worktree add --detach <tmp> origin/main
python -m pytest "scripts/tests/test_soft_deadlock_detector.py::test_main_json_and_fail_on_findings_rc2" -q

Sortie : 1 failed en 0,27 s — assert sdd.main(["--fail-on-findings", "--limit", "10"]) == 2 rend 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_runner via 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 de main() 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 VRAI gh est appelé (ou rien) → zéro finding → rc 0. À vérifier côté scripts/soft_deadlock_detector.py / scripts/check_soft_deadlock.py et le dernier refactor touchant main.

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.

Activity

  1. jsboige commented on Oct 2, 2026

    @jsboige
    OwnerAuthor

    [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.

  2. jsboige commented on Oct 2, 2026

    @jsboige
    OwnerAuthor

    Info livraison (po-2027): PR #18846 (po-2023, OPEN MERGEABLE BLOCKED checks en cours) couvre #18840.

    Chronologie:

    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

  3. jsboige commented on Oct 2, 2026

    @jsboige
    OwnerAuthor

    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).

  4. jsboige commented on Oct 2, 2026

    @jsboige
    OwnerAuthor

    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.

  5. jsboige commented on Oct 2, 2026

    @jsboige
    OwnerAuthor

    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.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions