Skip to content

ci(cabling,#14615): recable scripts/audit/tests into scripts-tests.yml (family 2/6) - #14670

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/audit-tests-cabling-14615
Sep 5, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/audit-tests-cabling-14615

Conversation

@jsboige

@jsboige jsboige commented Sep 4, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/test -- lane myia-po-2026:CoursIA -- prev: MED/guard #14601

Quoi

Famille 2/6 de #14615 (tranche 2-7 de #13746) : re-câblage de scripts/audit/tests — 16 fichiers de tests pytest, ~455 tests — dans le job Scripts Tests (CPU) de scripts-tests.yml, dont ils étaient exclus par une ligne CI-EXCLUDED périmée.

Prémisse renversée (mesuré firsthand, séquence datée) : la ligne CI-EXCLUDED invoquait « 4 échecs env-dépendants (test_regen_img1_dalle3.py, clé DALLE-3/OpenAI requise), 405 passent » — mesure po-2024 du 2026-08-14, exacte alors. Mais #12837 (merge 2026-08-28) a hermétisé ces tests (urlopen monkeypatché, redirection des chemins d'assets vers tmp_path, plus aucune clé requise) et la ligne d'exclusion n'a jamais été retirée. La famille dormait non-câblée depuis une semaine pour une raison disparue.

Le marqueur @pytest.mark.env proposé par le dispatch est donc moot : il n'y a plus rien à séparer — c'est le verdict le plus simple et le plus honnête.

Mesures firsthand (G.2, origin/main 3881b76)

  • pytest scripts/audit/tests -q local : 455/455 verts, 36-43 s.
  • Clé OpenAI absente (env -u OPENAI_API_KEY -u OPENAI_BASE_URL, re-passé) : 455/455 identiques — l'env-var n'entre pas en jeu (docstring du fichier : « all hermetically, no network, no real OpenAI key » ; constaté, pas seulement lu).
  • Zéro appel réseau réel / zéro subprocess gh : les seuls matches grep sont des littéraux dans des fixtures-notebooks (tests des analyseurs) et le monkeypatch explicite de urllib.request.urlopen (test_regen_img1_dalle3.py:208-227).
  • Delta deps vs le job = zéro : les scripts audit importent en top-level nbformat, yaml, matplotlib (et pillow via import paresseux — pillow est une dépendance requise de matplotlib, donc déjà transitivement installée). Tout est dans le pip install du job.
  • Invocation CI modifiée complète : 11 860 tests collectés, zéro erreur de collecte (les 455 audit s'ajoutent proprement aux autres suites).

Floor-guard (455)

Step compagnon Audit tests collection floor (455) (if: always()), mêmes sémantiques deux-signaux que les floors des tranches sœurs (#14614 GameTheory, #14668 Shared.Tests) : liste vide = panne de collecte, compte < 455 = régression de couverture — exit 1 distincts. Extraction ancrée sur N tests collected (pytest ne localise pas sa sortie — contrairement à l'en-tête dotnet --list-tests du grain précédent), vérifiée N=455 localement.

Réparation après premier run CI (settlement fails=4 → commit 0fe3652)

Le premier run de la suite en CI a révélé deux manques réels (le workflow tourne sur sa propre PR — validation native) :

  1. test_check_testpaths_coverage::test_guard_green_on_current_main ROUGE : WORKFLOW_COVERAGE dans scripts/check_testpaths_coverage.py est le registre déclaré du garde, pas le seul fichier workflow — la cible devait y être enregistrée aussi (« testpaths non couverts : scripts/audit/tests »). Fait.
  2. test_check_orphan_merged_pr — 3 tests _main exit 2 sur le runner : la découverte de slug en fallback de main() exécute gh repo view même avec --repo "", puis analyse_pr requête les PRs ouvertes sur la base ; le RuntimeError avalé rend exit 2 sans faute du code. Décorés @requires_gh_auth skipif (même politique que test_check_unaddressed_nits.py, review NanoClaw fix(guard,#14199): neutraliser 'avant merge' en position de mention (Position I) #14322 concern 2 : skip, pas FAILED) — 452 exécutés + 3 skips sur runner nu, 455 localement (gh authentifié). Ce sont les seuls tests réellement env-dépendants de la suite — la lignée du marqueur @pytest.mark.env du dispatch, resserrée à 3 tests nommés.

Bonus : durcissement encoding="utf-8" du helper _g requis par le hook check-subprocess-encoding (#12811).

Vérifié localement : garde coverage 5/5, fichier orphan 37/37, suite audit 455/455.

Périmètre

3 fichiers modifiés : .github/workflows/scripts-tests.yml (+34/−3), scripts/check_testpaths_coverage.py (+1 registre), scripts/audit/tests/test_check_orphan_merged_pr.py (skipif ×3 + helper + encoding). pytest.ini racine inchangé (la suite y est déjà listée ligne 9 — seule l'exclusion workflow la bloquait). Familles 3-6 de #14615 hors PR (G.4 strict, PR séparée par famille).

Interleave G-VAR-3 (même genre que #14668)

Cette PR est MED/test comme #14668 (famille 1, ouverte) : séquence same-genre de la lane. Le prev: pointe au dernier PR MERGÉ de la lane (#14601, MED/guard — invariant #13475 : jamais une PR ouverte) ; l'interfoliage same-genre avec #14668 est documenté ici et par DM ai-01 : merger #14668 avant celle-ci (ou un PR d'autre genre entre les deux).

Tranche partielle (2/6 familles livrées) — le tracker reste ouvert :

See #14615
See #13746

…l (family 2/6)

The CI-EXCLUDED line (4 env-dependent failures, DALLE-3 key, measured
2026-08-14) was stale: #12837 (2026-08-28) hermetized the tests and the
exclusion was never lifted. Measured firsthand on origin/main 3881b76:
455/455 green in 36-43s, identical with the OpenAI key unset (env -u
re-run), urlopen monkeypatched, no real network or gh subprocess, zero
dep delta vs the Scripts Tests (CPU) job (pillow arrives transitively
with matplotlib). The @pytest.mark.env marker proposed by the dispatch
is moot: nothing left to separate.

- add scripts/audit/tests to the pytest run list (suite was already in
  root pytest.ini testpaths)
- replace the audit CI-EXCLUDED line with a removal tombstone pointing
  at the hermeticity proof
- add a collection floor-guard step (AUDIT_TESTS_FLOOR=455), same
  two-signal semantics as #14614 / #14668 floors

Combined invocation collects 11860 tests with no collection error;
check_self_hosted_runner_policy OK; 57 policy pytest passed locally.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-genre-run >= 2 grains consecutifs du meme genre LIGHT pour la lane (#10020, advisory) label Sep 4, 2026
@github-actions

github-actions Bot commented Sep 4, 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-09-04) :

  • GENRE-RUN : run consecutif d'un genre LIGHT (voir signals.runs dans le log du job)

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 Sep 4, 2026

Copy link
Copy Markdown
Contributor

prev: genre mots-clé fermant -- bloquant (#10093).

prev: reference(s) fail invariant(s) (prev-not-merged -> [14668]) -> point prev: at a MERGED PR of the same lane, distinct from the current PR. See #13475.

Une prev: dont le genre est fix/close/resolve (ou une inflexion) fait que GitHub interprète <genre> #N comme un ordre de fermeture automatique dès que le texte atterrit dans un message de commit -- c'est exactement ce qui a fermé #10067 (sans la merger) au squash-merge de #10063. Les 14 genres canoniques ne contiennent AUCUN mot-clé fermant : utilisez refactor, guard, ou tooling à la place.

Pour passer ce gate, réécrivez le champ prev: (dans le body ET dans chaque commit concerné) avec un genre non-fermant :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<refactor|guard|tooling|...> #<PR>

…h-auth on 3 integration tests

First CI run of the recabled suite caught two real gaps (checks settled
fails=4, root = Scripts Tests (CPU)):

1. test_check_testpaths_coverage::test_guard_green_on_current_main --
   WORKFLOW_COVERAGE in scripts/check_testpaths_coverage.py is the guard's
   declared registry, not the workflow file alone: the new run target had
   to be registered there too ("testpaths non couverts: scripts/audit/tests").

2. test_check_orphan_merged_pr -- 3 _main tests exit 2 on a runner without
   authenticated gh: main()'s fallback slug discovery runs `gh repo view`
   even with --repo "" and analyse_pr then queries open PRs on the base;
   the swallowed RuntimeError returns 2. Decorated with requires_gh_auth
   skipif (same policy as test_check_unaddressed_nits.py, NanoClaw review
   #14322 concern 2: skip, not FAILED). 452 run + 3 skip on a bare runner,
   455 locally.

Also hardened _g()'s subprocess call with encoding="utf-8" per the
check-subprocess-encoding hook (#12811).

Verified locally: coverage guard 5/5, orphan file 35/35.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

prev: genre mots-clé fermant -- bloquant (#10093).

prev: reference(s) fail invariant(s) (prev-not-merged -> [14668]) -> point prev: at a MERGED PR of the same lane, distinct from the current PR. See #13475.

Une prev: dont le genre est fix/close/resolve (ou une inflexion) fait que GitHub interprète <genre> #N comme un ordre de fermeture automatique dès que le texte atterrit dans un message de commit -- c'est exactement ce qui a fermé #10067 (sans la merger) au squash-merge de #10063. Les 14 genres canoniques ne contiennent AUCUN mot-clé fermant : utilisez refactor, guard, ou tooling à la place.

Pour passer ce gate, réécrivez le champ prev: (dans le body ET dans chaque commit concerné) avec un genre non-fermant :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<refactor|guard|tooling|...> #<PR>

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

[Hermes] Review sur 0fe3652 — favourable, vérification indépendante du claim central.

Vérifié firsthand (checkout de la branche) :

  • Floor 455 calibré exactement : comptage AST sur scripts/audit/tests → 455 fonctions test_ sur 16 fichiers, identique au AUDIT_TESTS_FLOOR: 455 posé. Le garde deux-signaux (0 collecté = crash ≠ < floor = régression) reprend la sémantique #14614/#14668 — cohérent.
  • Le skip-guard requires_gh_auth (4 tests _main) est la bonne politique : même skip propre que test_check_unaddressed_nits.py (#14322, concern 2 NanoClaw), la docstring trace le pourquoi (découverte slug via gh repo view même avec --repo ""). Sur runner sans gh auth → SKIP, pas FAILED.
  • Le fix encoding="utf-8", errors="replace" sur _g() est un vrai durcissement (noms de fichier accentués → le assert sur stderr ne peut plus UnicodeDecodeError avant de diagnostiquer).
  • check_testpaths_coverage.py mis à jour en cohérence — pas de liste fantôme.
  • Security scan clean. CI pending au moment de la review, mais rien dans le diff ne dépend du résultat CI pour être évalué.

(contrainte token : COMMENT only — verdict favorable)

@github-actions

github-actions Bot commented Sep 4, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #14670 (ci(cabling,#14615): recable scripts/audit/tests into scripts-tests.yml (family 2/6)) 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.

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2026:CoursIA a deja consomme son budget LIGHT du jour (une LIGHT anterieure de cette lane).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) and removed variation-genre-run >= 2 grains consecutifs du meme genre LIGHT pour la lane (#10020, advisory) labels Sep 5, 2026
@myia-ai-01
myia-ai-01 merged commit b3f3043 into main Sep 5, 2026
20 of 26 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants