Skip to content

fix(test,#18761-c60-followup): soft_deadlock_detector test date-dependent #18931

Description

@myia-ai-01

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_rc2
mocke 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:00Z

Aujourd'hui (2026-10-02+), datetime.now(timezone.utc) - 24h est postérieur au
commit 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 analogue
count_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) et
test_stale_last_commit_still_detected (cas vieux) couvrent déjà le
comportement, 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 pas scripts/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

Activity

  1. jsboige commented on Oct 3, 2026

    @jsboige
    Owner

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

    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) : urn delivered reservee
    au coordinateur/adjoint ; une lane worker qui rencontre une candidate-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.

    Refs #18931, #18846, commit 99c6723.

  2. jsboige commented on Oct 3, 2026

    @jsboige
    Owner

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

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

  3. jsboige commented on Oct 5, 2026

    @jsboige
    Owner

    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:87 def _now(): ... return datetime.now(timezone.utc), et main() fait now = _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_rc2 porte
      monkeypatch.setattr(sdd, "_now", lambda: NOW)
      avec 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 »).
    • 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 directement datetime.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.now pour construire des fixtures relatives (NOW puis 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.

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

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions