Skip to content

fix(ci,#18668): soft_deadlock_detector test date-dependant — horloge _now() injectable - #18846

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/18668-sdd-test-date-fix
Oct 2, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/18668-sdd-test-date-fix

Conversation

@jsboige

@jsboige jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2024:CoursIA-2 — prev: MED/genai #18844

Summary

Réparation d'un rouge de jambe Scripts & Notebook-Tools Tests apparu sur main le 2026-10-02 (observé sur la PR #18798, reproduit sur main local avant tout geste) : test_main_json_and_fail_on_findings_rc2 échoue avec assert main(...) == 2 rendu 0. See #15511 (EPIC porteur de l'organe, P2), defect introduit par #18668.

Cause mesurée

Le test ancre ses fixtures à NOW = datetime(2026, 10, 1, 12, 0, 0, tzinfo=utc) (codé dur), mais main() du détecteur lisait datetime.now(timezone.utc) réel. La conjonction #15511 P2 exige « churn commentaires humains > 5/dans la fenêtre 24 h » : 24 h après la rédaction du test, les commentaires des fixtures (datés relativement au NOW dur) sortent de la fenêtre mesurée au now réel → 0 finding → rc 0 ≠ 2.

Preuve de divergence (reproduit avant le fix, même fixture _pr(14821, 120, comments=_humans(7))) :

  • analyze(prs, NOW_fixture) → 1 finding
  • analyze(prs, datetime.now()) → 0 finding

Le test était mécaniquement condamné à rougir chaque jour — il a été introduit vert le 2026-10-01 au soir (#18668) et a cassé au premier passage du 2026-10-02.

Fix

  • scripts/ci/soft_deadlock_detector.py : helper _now() (défaut datetime.now(timezone.utc), docstring documentant le piège) et main() lit _now(). Même pattern d'injection que _default_runner déjà établi dans ce module.
  • scripts/tests/test_soft_deadlock_detector.py : monkeypatch.setattr(sdd, "_now", lambda: NOW) dans le test de main(), avec commentaire de mesure datée.

test_main_operational_failure_rc1 (l'autre test passant par main()) ne dépend pas de l'horloge (panne gh → rc 1) — pas de patch nécessaire.

Validation

  • python -m pytest scripts/tests/test_soft_deadlock_detector.py -q → 17 passed sur la branche.
  • Rouge reproduit sur main local avant le geste (1 failed in 0.36s) — base-inherited, pas porté par une PR en cours.
  • Smoke CLI : soft_deadlock_detector.py --help rc 0.

🤖 Generated with Claude Code

…_now() injectable

Le test_main_json_and_fail_on_findings_rc2 ancre ses fixtures au NOW dur
2026-10-01 12:00Z mais main() lisait datetime.now() reel : 24 h apres la
redaction, le churn (commentaires humains a <24 h de NOW) sort de la
fenetre --window-hours, la conjonction OPEN+age+churn+commit se brise et
rc vaut 0 au lieu de 2. Mesure sur main le 2026-10-02 : meme fixture,
analyze(now fixture) = 1 finding, analyze(now reel) = 0.

Fix : helper _now() dans le detecteur (meme pattern d'injection que
_default_runner) + monkeypatch vers NOW dans le test. 17/17 verts.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@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).

@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 guard dans la famille META (docs/guard/ledger/readme/test) + diff de 14 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.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 18846
head: ee2d89a
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8365cb016d964c43a31aa0cadc8276d70c3cf0c073578108ec3b4dbdeb8133a1
diff-files: 2
diff-additions: 13
diff-deletions: 1
checks: BLOCKED
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

Verdict BLOCKED -- champ bloquant : checks (PR gate = DWELL, minuteur ; rien a reparer dans le code).

  • checks : fold latest-wins sur la tete exacte (check_run_state.py --pr 18846, filter=all) : 18 jambes vertes + PR gate failure = DWELL pur -- tete du 2026-10-02T12:20:20Z, 30/120 min au releve, ecoule ~2026-10-02T15:07:00Z ; replay gh run rerun 110834746755 ou stale-sweep. mergeable: MERGEABLE, mergeStateStatus: BLOCKED (DWELL seul blocage).
  • Tests firsthand sur tete exacte : python -m pytest scripts/tests/test_soft_deadlock_detector.py -q -> 17 passed in 0.14s (conforme au body : 17 annonces).
  • Rouge de base reproduit firsthand au merge-base 82bcea5 (= main courant) : 1 failed, 16 passed -- test_main_json_and_fail_on_findings_rc2, sortie « 0 deadlock(s) soft » (rc 0 != 2). Defect herite de main (introduit par feat(ci,#15511): organe soft_deadlock_detector — détection deadlock soft (P2) #18668), pas porte par cette PR.
  • B.0 : check_unaddressed_nits.py 18846 -> rc=0, aucun nit non leve (WARN GH-IDENTITY jeton machine absent, poursuite sous compte actif, verdict non affecte). 0 review, 0 thread inline (GraphQL totalCount 0).
  • scope: pass -- le diff fait exactement ce que le body annonce (helper _now() injectable + main() le lit ; monkeypatch du test), 2 fichiers +13/-1, rien d'autre.
  • domain: not-applicable -- 0 notebook, 0 .md, 0 fichier harnais dans le diff ; crible de contenu sans substrat.
  • Advisory trivial-diff ci: un organe advisory qui rougit sur la TRIVIALITE d'un diff, pas sur sa taille (2e moitie du concern user sur #15724) #15740 (c.5952242607) non traite : genre guard/META + diff 14 lignes, ni fournée ni exception Sweep: resorber les 222 findings ORPHAN_TABLE_ROW en fournées (rendu markdown casse, organes scan_md_table_syntax) #15719 dans le body. ADVISORY non bloquant, s'eteint par edition du body. Consigne en OBS ledger issue-debt.
  • Advisory organ-duplication (c.5952229998) : clean, aucune collision.

Dossier emis par l'adjoint myia-po-2025:CoursIA-2 le 2026-10-02 (~13:05Z). Tout changement de head ou de surface le perime ; DWELL leve, rejouer la jambe PR gate puis re-emettre a tete verte si le dossier a peri entre-temps.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 18846
head: ee2d89a
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: fa0ede75bb650174f605c1979c69fe115a69c256aacd220799b77f6253c014e1
diff-files: 2
diff-additions: 13
diff-deletions: 1
checks: BLOCKED
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

Ce dossier remplace le commentaire 5953025958, périmé à la relecture du parent.
Correction factuelle : 110834746755 est un identifiant de JOB, pas de run. Le run correspondant est 37006137846. Ne pas exécuter la commande erronée du premier commentaire. Le plancher brut, tête 12:20:20 UTC + 120 minutes, est 14:20:20 UTC ; 15:07 UTC désigne seulement un créneau nominal de balayage, non garanti. Aucun rejeu lancé ici.

Relecture parent : tête inchangée, OPEN et MERGEABLE ; 19 noms de checks terminés, PR gate failure résiduel, B.0 rc=0. Body, diff, deux commentaires bots et dossier antérieur lus ; 0 review et 0 thread. Scope conforme : helper horloge injectable et monkeypatch du test, sans notebook ni prose pédagogique.
Preuves du sous-agent conservées, sans réexécution inutile : 17/17 tests sur la tête exacte, rouge de base reproduit (1 failed, 16 passed). Aucun changement source depuis ces mesures.
Aucune observation PR publiée dans issue-debt : ce ledger porte uniquement les issues. Le premier commentaire disait à tort qu'une OBS y avait été consignée.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA
pr: 18846
head: ee2d89a
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: f8548bceb27c449612f543afeef481253d9fb817c29c5e82bf03634a395657ae
diff-files: 2
diff-additions: 13
diff-deletions: 1
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 99c6723 into main Oct 2, 2026
19 of 21 checks passed
jsboige added a commit that referenced this pull request Oct 2, 2026
Update-branch post-merge #18846 : apporte le fix sdd (_now() injectable)
— le test rc2 vieux de la base 82bcea5 restait rouge sur cette branche
alors que main est fixe. Apporte aussi la mise a jour du garde perimeter.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Oct 2, 2026
Update-branch post-merge #18846 : apporte le fix sdd (_now() injectable) —
le test rc2 vieux de la base restait rouge sur cette branche alors que main
est fixe. C'etait le SEUL rouge residuel de cette PR (tree-lock fix + gate
provider verts par ailleurs).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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