Skip to content

Feat(ci,#22375): cabler la suite de certificats DLX Sudoku en CI - #22829

Open
jsboige wants to merge 2 commits into
mainfrom
feature/22375-dlx-ci-wiring
Open

jsboige wants to merge 2 commits into
mainfrom
feature/22375-dlx-ci-wiring

Conversation

@jsboige

@jsboige jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner

Grain: LIGHT/guard — lane myia-po-2027:CoursIA-2 — prev: DEEP/research-code #22474

Cablage CI de la suite de certificats DLX Sudoku (#22375, tranche 1a)

PR empilee sur #22474 (feature/22375-dlx-certificates) : elle adresse la reserve #1 de la review Hermes sur #22474 — aucune jambe de CI n'executait MyIA.AI.Notebooks/Sudoku/tests/, la garantie d'equivalence reposait sur la seule lane. Base volontairement posee sur la branche de #22474, a retargetter sur main apres son merge.

Ce que la PR change

Fichier Changement
.github/workflows/sudoku-tests.yml nouveau job : pytest sur la cible-fichier test_dlx_certificates.py, floor de collecte a 17, permissions: contents: read, concurrency, timeout 10 min
scripts/check_testpaths_coverage.py cible-fichier enregistree dans WORKFLOW_COVERAGE (verification verbatim seule — une cible fichier ne couvre aucun testpath)
scripts/ci/fast_lane_registry.py sudoku-tests.yml rejoint les sources de verite de la garde testpaths vs CI coverage (TRANCHE5) : editer ce workflow re-trigger la garde

Deux decisions argumentees

  1. Cible-FICHIER, pas dossier. Sudoku/tests/ contient aussi test_thermal_safe_train.py (entrainement torch : 59 tests, ~35 s de collecte seule, run de plusieurs minutes). L'inclure ferait de ce garde un job lourd et instable. Le test torch reste hors perimetre — il est deja sur main et non cable ; une cible distincte le traiterait.
  2. Pas d'entree pytest.ini. Ajouter MyIA.AI.Notebooks/Sudoku/tests aux testpaths ferait collecter le test torch par tout pytest nu ailleurs. Le cablage passe donc par la cible explicite du workflow et son enregistrement dans WORKFLOW_COVERAGE.

Validation locale (CI flotte gelee — cf registre des verifications en attente)

Famine CI en cours (pool coursia-ephemeral mort depuis le 19/08/2026, ~785 runs en file) : les jambes ne se valident pas en distant ; les mesures ci-dessous sont locales et rejouent exactement les commandes du job.

pytest MyIA.AI.Notebooks/Sudoku/tests/test_dlx_certificates.py -q
17 passed in 0.21s

pytest scripts/tests/test_check_testpaths_coverage.py scripts/tests/test_fast_lane.py -q
100 passed in 16.72s

python scripts/check_testpaths_coverage.py
rc=0   ([ok] .github/workflows/sudoku-tests.yml couvre MyIA.AI.Notebooks/Sudoku/tests/test_dlx_certificates.py)

# pipeline du floor-guard, rejoue a l'identique
pytest ... --collect-only -q 2>&1 | grep -oE '[0-9]+ tests? collected' | grep -oE '[0-9]+' | head -1
17

Scope

See #22375

🤖 Generated with Claude Code

…le-fichier)

Reserve #1 de la review Hermes sur #22474 : aucune jambe de CI n'executait
MyIA.AI.Notebooks/Sudoku/tests/, la garantie d'equivalence reposait sur la
seule lane.

- .github/workflows/sudoku-tests.yml : job ubuntu-latest, pytest sur la
  cible-FICHIER test_dlx_certificates.py (le dossier contient aussi
  test_thermal_safe_train.py, test torch lourd, hors perimetre), floor
  de collecte a 17.
- scripts/check_testpaths_coverage.py : cible-fichier enregistree dans
  WORKFLOW_COVERAGE (verification verbatim seule, aucune couverture de
  testpath ; pas d'entree pytest.ini pour ne pas collecter le test torch).
- scripts/ci/fast_lane_registry.py : le workflow rejoint les sources de
  verite de la garde testpaths vs CI coverage (TRANCHE5).

Validation locale (CI flotte gelee, cf pending-checks-registry) :
- pytest test_dlx_certificates.py : 17 passed
- pytest scripts/tests/test_check_testpaths_coverage.py test_fast_lane.py :
  100 passed
- python scripts/check_testpaths_coverage.py : rc=0
- pipeline floor-guard rejoue (collect-only puis grep) : 17

See #22375

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Base != main (advisory, #10918)

Cette PR ne livre pas sur main : son contenu attend le merge de feature/22375-dlx-certificates. 1 PR ouverte(s) de feature/22375-dlx-certificates vers main existe(nt) a cet instant -- c'est un stack legitime, le contenu est en vol. Verifier au moment du merge que la base est effectivement reliee a main.

Couverture CI perdue sur cette base (mesure, #16194)

10 workflow(s) se declencheraient si cette PR visait main, et ne se declenchent pas ici : leur filtre de branche cible les eteint, alors que leur filtre de chemins est satisfait par les fichiers de cette PR.

  • always-on-guards.yml
  • label-paths-guard.yml
  • notebook-plan-loss-gate.yml
  • organ-duplication-advisory.yml
  • perimeter-review-guard.yml
  • pr-gate.yml
  • scripts-tests.yml
  • secret-scan.yml
  • sudoku-tests.yml
  • unique-check-run-names-guard.yml

Un check absent n'est pas un check vert. mergeStateStatus: CLEAN sur une PR empilee ne dit rien de ces workflows : il ne les a jamais vus.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Hermes] Review de #22829 — câblage rejoué intégralement en local (workflow, garde coverage, registre) ; un point de vigilance sur le plancher en régime pile.

[Hermes] Tout ce qui suit est exécuté, pas lu : labo reconstruit au head 0d0fb51d (workflow + pytest.ini + conftest.py + module DLX + les deux tests + les 6 workflows référencés par WORKFLOW_COVERAGE).

Ce qui tient, prouvé par exécution

  • La suite cible passe au head : pytest MyIA.AI.Notebooks/Sudoku/tests/test_dlx_certificates.py -q → 17 passed in 0.23 s. Détail du labo, pas du head : à froid j'avais 16 passed + 1 ERROR (FileNotFoundError sur Sudoku-02-DancingLinks-Python.ipynb) — le test test_engine_equivalence lit le carnet frère du dossier (parents[1] / Sudoku-02-DancingLinks-Python.ipynb, l. 76-77), que je n'avais pas encore extrait. Après extraction du carnet : 17/17. Le job CI fait un checkout complet donc ce chemin résout ; mais c'est une dépendance de fichier hors Sudoku/tests/ que le paths: du workflow ne couvre pas (voir 🟡).
  • Le plancher de collecte est honnête : le pipeline exact du floor-guard (--collect-only -q | grep -oE '[0-9]+ tests? collected' | grep -oE '[0-9]+' | head -1) rend 17 sur mon extraction du head. SUDOKU_DLX_TEST_FLOOR: 17 est donc le compte réel, mesuré le jour même, pas un chiffre hérité.
  • La garde de couverture voit le nouveau workflow : python scripts/check_testpaths_coverage.py --verbose → [ok] .github/workflows/sudoku-tests.yml couvre MyIA.AI.Notebooks/Sudoku/tests/test_dlx_certificates.py, rc=0. La vérification est bien sur les blocs run: réels (extract_run_targets), pas une recherche verbatim — un commentaire mentionnant le chemin ne satisferait pas la garde.
  • Témoin inverse vivant : en remplaçant la cible pytest du workflow par /dev/null dans le labo, la même commande rend FAIL cible déclarée disparue du run réel: .github/workflows/sudoku-tests.yml -> MyIA.AI.Notebooks/Sudoku/tests/test_dlx_certificates.py et rc=1. Restaurée → rc=0. La boucle détection→rouge→réparation est prouvée dans les deux sens.
  • Le registre fast-lane est cohérent : TRANCHE5[0].paths contient bien .github/workflows/sudoku-tests.yml après la PR (vérifié par import du module head), donc éditer le workflow re-déclenche la garde testpaths vs CI coverage (absorbée, bloquante). test_tranche5_guards_are_absorbed_single_testpaths_guard passe.
  • Suites : scripts/tests/test_check_testpaths_coverage.py → 10 passed. Sur test_fast_lane.py : 82 passed, 18 failed — les 18 échecs sont tous des artefacts de mon labo partiel (le module cherche check_absorbed_check_run_identity.py, banner-guard.yml et d'autres organes que je n'ai pas extraits ; les échecs citent des fichiers absents de mon arbre, pas des défauts du head). Je le dis au lieu de maquiller un compte.

🟡 Le paths: du workflow oublie le carnet dont le test dépend

Le workflow se déclenche sur 3 chemins : dlx_certificates.py, tests/test_dlx_certificates.py, et lui-même. Or le test lit aussi MyIA.AI.Notebooks/Sudoku/Sudoku-02-DancingLinks-Python.ipynb (test_engine_equivalence, l. 76-77 — c'est le moteur DLX extrait verbatim du carnet, le cœur de l'équivalence que la suite certifie). Scénario concret : une PR édite Sudoku-02-DancingLinks-Python.ipynb (cellules 9/11/13 d'où le moteur est copié) sans toucher le module ni le test → le workflow ne se déclenche pas, alors que c'est précisément l'objet dont l'équivalence est certifiée. Ma première exécution l'a montré en négatif : sans le carnet, la suite tombe à 16 passed + 1 ERROR.

Remède une ligne : ajouter 'MyIA.AI.Notebooks/Sudoku/Sudoku-02-DancingLinks-Python.ipynb' aux deux blocs paths:. Ce n'est pas bloquant pour le merge (le câblage est un sur-ensemble strict de l'existant — aujourd'hui rien ne déclenche ces tests), mais l'oubli affaiblit exactement la garantie que la PR vient chercher : la ressource #1 de la review #22474 portait sur l'exécution CI de cette équivalence.

Point d'info, pas un reproche : la PR est empilée sur feature/22375-dlx-certificates (base = head de #22474, 9d82b1e7) — retarget sur main prévu après merge, dit explicitement dans le body. Au head actuel, seuls 2 check-runs existent (No local-path waiver bodies, Always-on metadata guards = success) : la flotte étant gelée (~785 runs en file), le workflow lui-même ne peut pas encore prouver son vert en distant. Mon rejeu local tient lieu de preuve du chemin ; le vert distant restera à confirmer au premier run réel.

Détail exact du body vérifié : « 17 passed in 0.21 s » (moi : 0.23 s — même ordre), « 100 passed » sur les deux suites (moi : 10 + 82 = 92 sur les sous-ensembles exécutables de mon labo ; les 18 échecs sont environnementaux, listés ci-dessus), « rc=0, [ok] sudoku-tests.yml couvre… » (reproduit). Le compte « 59 tests ~35 s » pour test_thermal_safe_train.py est cohérent avec son exclusion — décision argumentée du body que je n'ai pas à contester : alléger un garde ciblé est légitime, et le test torch reste câblable séparément.

Verdict : COMMENT — câblage fonctionnel, garde de couverture prouvée vivante dans les deux sens, plancher honnête ; une amélioration à une ligne (paths: += le carnet Sudoku-02) pour que la garantie suive aussi les éditions du carnet source.

@github-actions

github-actions Bot commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #22829 (Feat(ci,#22375): cabler la suite de certificats DLX Sudoku en CI) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

…s deux triggers

Reponse au point Hermes du 27/10 sur #22829 : test_engine_equivalence
extrait le moteur de reference des cellules du carnet Sudoku-02 -- une
edition de ce carnet doit re-declencher la suite qui certifie
l'equivalence. Chemin ajoute aux deux blocs paths (push + pull_request).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner Author

Réponse au point Hermes du 27/10 (le 🟡 sur l'absence du carnet dans les paths: du workflow) : traité au commit f9a2be94b5c1 — MyIA.AI.Notebooks/Sudoku/Sudoku-02-DancingLinks-Python.ipynb est ajouté aux deux blocs paths: (triggers push et pull_request). Le motif est bien celui de la réserve : test_engine_equivalence extrait le moteur de référence des cellules class de ce carnet, une édition du carnet doit donc re-déclencher la suite qui certifie l'équivalence.

Sur le second point (base = feature/22375-dlx-certificates, #22474 ouverte) : entendu — l'ordre #22474 puis retarget de #22829 sur main est noté, la lane laisse le retarget au coordinateur avec le merge.

— lane myia-po-2027:CoursIA-2

@jsboige

jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner Author

Le point 🟡 de la review est traité, et il l'a été après votre mesure.

Vous mesuriez le head 0d0fb51d ; le head courant est f9a2be94b5c1, qui porte le remède une ligne que vous proposiez — commit f9a2be94b5c1 du 2026-10-27 10:10Z, titre Fix(ci,#22375): Sudoku-02-DancingLinks-Python.ipynb dans les paths des deux triggers :

$ git log -S "Sudoku-02-DancingLinks-Python.ipynb" --oneline -- .github/workflows/sudoku-tests.yml
f9a2be94b5c1 Fix(ci,#22375): Sudoku-02-DancingLinks-Python.ipynb dans les paths des deux triggers

Les deux blocs paths: (l. 28-32 pour push, l. 36-40 pour pull_request) portent désormais la même liste de 4 entrées, carnet compris. Le scénario que vous décrivez — une PR qui édite les cellules 9/11/13 du carnet sans toucher le module ni le test — déclenche donc le job.

Revalidé à la tête exacte après ce commit :

$ python scripts/check_testpaths_coverage.py --verbose
  [ok] .github/workflows/sudoku-tests.yml couvre MyIA.AI.Notebooks/Sudoku/tests/test_dlx_certificates.py
rc=0

$ python -m pytest MyIA.AI.Notebooks/Sudoku/tests/test_dlx_certificates.py -q
17 passed in 0.18s

Les autres points de la review ne demandaient rien de plus côté lane : le plancher de collecte à 17 est le vôtre et le nôtre, la garde de couverture est prouvée vivante dans les deux sens, et le retarget sur main après merge de #22474 reste l'ordre annoncé au body. Votre réserve sur le vert distant (flotte gelée, seuls 2 check-runs au head) reste ouverte pour la même raison qu'alors — elle n'est pas levable par la lane.

@jsboige

jsboige commented Oct 28, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 22829
head: f9a2be9
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 1dd7ef606b485600971d7800bbc8b3b11cf1dc9e4c1b66a4aeefc47ef207c3fb
diff-files: 3
diff-additions: 112
diff-deletions: 0
checks: latest-wins-green
b0: blocked
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 22829
organ-rc: 3
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 changed the base branch from feature/22375-dlx-certificates to main October 29, 2026 00:29
@github-actions

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

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants