Skip to content

fix(ci,#18840): horloge injectable dans sdd main() — désamorcer la time-bomb 24h du test rc2 - #18848

Closed
jsboige wants to merge 1 commit into
mainfrom
feature/18840-sdd-hermetic-clock
Closed

jsboige wants to merge 1 commit into
mainfrom
feature/18840-sdd-hermetic-clock

Conversation

@jsboige

@jsboige jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner

Grain: CI/repair -- lane myia-po-2026:CoursIA -- prev: #18831

Résumé

test_main_json_and_fail_on_findings_rc2 est une time-bomb calendrier, pas une régression de code : le test gelait ses fixtures au NOW du module (2026-10-01T12:00Z, commentaires stampés 11:00Z) mais main() lisait l'horloge réelle. La conjonction exigeant les commentaires dans la fenêtre 24h glissante, le test est passé rouge à l'instant exact où l'horloge murale a dépassé 2026-10-02T11:00Z — sans aucun commit, sur toutes les PRs ouvertes (jambe Scripts Tests).

La piste « refactor du runner » de l'issue était fausse : le fake runner est utilisé (la sortie du repro montre 1 PRs ouvertes scannées — le patch du global prend) ; c'est analyze() qui rejetait la candidate, commentaires hors fenêtre.

Fix

  • scripts/ci/soft_deadlock_detector.py : main(argv, now=None) — seam d'horloge injectable, même pattern que le runner injectable documenté dans le module. now=None → horloge réelle (comportement inchangé pour tout appelant CLI).
  • scripts/tests/test_soft_deadlock_detector.py : les trois appels sdd.main(...) du test rc2 passent now=NOW ; docstring documente l'incident.

Historique : module + test nés ensemble en #18668 (4c55f3a) — le test était vert au merge tant que l'horloge réelle restait sous NOW+24h (les timestamps fixture légèrement futurs passent le check >= window_start), puis a explosé au calendrier.

Preuves

  • python -m pytest scripts/tests/test_soft_deadlock_detector.py -q → 17 passed (0.10s), sur base origin/main 82bcea5 où le test était rouge.
  • Contrôle positif de l'injection (l'horloge injectée pilote réellement la fenêtre, pas un paramètre décoratif) : now=NOW → rc 2 (finding détecté) ; now=NOW+30h → rc 0 (fenêtre expirée = reproduction exacte du mode de défaillance d'origine).
  • Smoke CLI (chemin now=None intact) : main(['--repo', '<repo-inexistant>', ...]) sans now → [PANNE] gh pr list failed rc 1 — l'horloge réelle et le vrai gh sont bien appelés sans injection.
  • Aucun autre consommateur : grep workflows + scripts = 0 appelant ; seul consommateur = la suite de tests (organe harness: plafond commentaires-pompage vs actions réparatrices (cas #14821 — 31 commentaires / 5 jours / toujours OPEN) #15511 P2 « mesure, pas gate », pas encore câblé en cron).

Périmètre

2 fichiers : scripts/ci/soft_deadlock_detector.py (+3/−1 : signature + branch default), scripts/tests/test_soft_deadlock_detector.py (+10/−5 : now=NOW ×3 + docstring incident).

Résiduel

10 autres suites scripts/tests/ gelent un NOW et leurs modules lisent datetime.now — aucune n'est rouge aujourd'hui (la flotte CI ne montre que rc2), mais l'audit same-shape (fixtures gelées vs horloge réelle dans les autres organes CI) mérite un grain dédié si l'une redevient rouge au calendrier. Non inclus ici : one-subject-per-PR.

Closes #18840

🤖 Generated with Claude Code

…me-bomb 24h du test rc2

Le test main rc2 gelait ses fixtures au NOW du module (2026-10-01T12:00Z)
mais main() lisait l'horloge reelle : les commentaires fixture sortaient de
la fenetre 24h des que le mur depassait 2026-10-02T11:00Z — rouge au
calendrier, sans aucun commit, sur toutes les PRs ouvertes (Scripts Tests).

main(argv, now=None) : seam d'injection identique au runner injectable ;
le test passe now=NOW et devient hermetique. Signature retro-compatible
(argv seul = horloge reelle, prouve par smoke CLI rc=1 sur PANNE gh).

Validation : 17/17 passed ; controle positif now=NOW -> rc2,
now=NOW+30h -> rc0 (l'injection pilote reellement la fenetre).

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 variation-tag-malformed Tag Grain present mais TIER != DEEP|MED|LIGHT variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable) labels Oct 2, 2026
@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2026:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-02) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Collision de lane sur une reference fermante (#10223).

#18840: lane myia-po-2027:CoursIA-2 holds an active claim (since 2026-10-02T12:03:08Z). Release with [RELEASED], have the coordinator post [OVERRIDE] lane myia-po-2026:CoursIA, or wait 48h for staleness. See #10223.

Une autre lane detient un claim actif sur une issue que cette PR ferme par mot-cle (Closes/Fixes/Resolves #N). Le detecteur ne regarde que les references fermantes -- un See #N / Part of #N sur une epic multi-lane ne declenche jamais ce gate.

Les trois sorties pour passer ce gate :

Voir #10223 et lane-claim-protocol.md.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

Doublon concurrence — fermeture volontaire au profit de #18846 (precedent Tell c.9974).

Chronologie complete : (1) 12:03Z po-2027:CoursIA-2 pose le claim sur l'issue (c.5951912118) ; (2) po-2027 livre #18843 ; (3) 12:26Z #18843 fermee en doublon au profit de #18846 (po-2023, plus propre architecturalement) ; (4) 12:31Z cette PR arrive 3e — mon preflight a rate le claim d'issue ET le check open-PRs (venant de ma propre diagnosis de l'issue que j'avais ouverte, faute classique).

Verifie avant de disposer : #18846 diagnostique la meme cause racine (fixtures gelees au NOW 2026-10-01T12:00Z vs horloge reelle de main(), fenetre 24h glissante — rougie au calendrier sans commit), fix equivalent par injection (_now() monkeypatche vs mon parametre now=), memes 2 fichiers, +13/-1. Rien a salvager : la preuve du controle positif (horloge future -> rc 0) est reproductible depuis le body de #18846 si souhaite.

Note pour le linkage : #18846 ne porte pas de clause Closes sur #18840 — penser a fermer l'issue au merge (ou je la ferme moi-meme au prochain cycle une fois #18846 merged, elle documente le bug constate independamment par les deux lanes).

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

Labels

variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 variation-tag-malformed Tag Grain present mais TIER != DEEP|MED|LIGHT variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

1 participant