Skip to content

Fix(ci,#20174): tripwire d'amputation — NB_COUNT seuille sur MyIA.AI.Notebooks + scanner C.2 [] sur selection vide - #20243

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/ci-amputation-blindspot
Oct 10, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/ci-amputation-blindspot

Conversation

@jsboige

@jsboige jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2027:CoursIA — prev: MED/notebook-dotnet #20242

Summary

Durcissement cote repo de la famille d'amputation #20174 : le run 38015702551 (PR #19814, jambe validate-notebooks demarree 02:31:20Z) a revele deux angles morts du harnais sur un checkout ampute. Ce PR ne touche PAS a la purge des slots (po-2024:CoursIA, arbitrage 02:28Z) : il rend le harnais capable de nommer l'amputation au lieu d'en mourir d'une erreur trompeuse.

Mesure fondatrice : le runner coursia-ephemeral n'a vu que 2 carnets sur 1516 — « All 2 notebooks validated successfully » — tous deux des probes sous scripts/notebook_tools/, zero sous MyIA.AI.Notebooks/. Contre-preuve locale au meme arbre : scanner sain, catalogue 1376/1376 entrees resolvables, rc=0. Le rouge etait purement l'arbre ampute.

Changements (2 fichiers)

  1. .github/workflows/notebook-validation.yml — tripwire d'amputation : la garde existante NB_COUNT -eq 0 ne detecte que le zero absolu ; un residu sparse-checkout laissant quelques .ipynb hors arbre la laisse muette. Nouvelle garde : plancher 1000 carnets sous MyIA.AI.Notebooks/ (mesure 1516 sur main ; le corpus ne croit que), message nommant fix(ci): le volume _work epingle d'un slot persistant derive -- 9 363 fichiers sales font passer le checkout de 2 s a 12 s #20174, fail-closed (repertoire absent -> find rend 0 -> rouge).
  2. scripts/notebook_tools/check_c2_compliance.py — contrat JSON : une selection vide en mode --json emet [] rc=0 au lieu de la prose No notebooks to check.. Le desambiguiseur du workflow (ci(notebook-validation): || true sur check_c2_compliance masque l'erreur réelle et fait crasher le step sur un JSON vide #14799 : « a completing run always prints its report ») ne meurt plus sur Expecting value: line 1 column 1. Le mode humain garde sa prose.

Pourquoi les DEUX ensemble : le scanner emettant [] seul transformerait le rouge actuel en faux vert (« 0 notebooks, 0 cells » -> « All notebooks C.2 compliant »). C'est le tripwire du (1) qui porte le blocage ; le (2) ne fait que restaurer l'honnetete du flux JSON.

Validation

  • python scripts/notebook_tools/check_c2_compliance.py --json --serie ZZZ-inexistante -> [] rc=0 (le chemin vide tient le contrat JSON).
  • python scripts/notebook_tools/check_c2_compliance.py --serie ZZZ-inexistante -> prose inchangee rc=0 (mode humain preserve).
  • Corpus complet : run du cycle sur arbre sain -> JSON integral, 1376/1376, rc=0.
  • yaml.safe_load sur le workflow modifie : OK.
  • Pre-commit : toutes les jambes Passed/Skipped.

Périmètre

2 fichiers : scripts/notebook_tools/check_c2_compliance.py, .github/workflows/notebook-validation.yml. Aucun .ipynb touche -> C.2/C.3 non applicables (pas de re-execution due).

Contexte

🤖 Generated with Claude Code

…ection vide

Deux angles morts reveles par le checkout ampute du run 38015702551
(PR #19814) : la garde NB_COUNT ne voyait que le zero absolu (2 probes
scripts/ restees presentes), et check_c2_compliance.py imprimait la
prose 'No notebooks to check.' en mode --json, tuant le desambiguiseur
#14799 ('Expecting value: line 1 column 1').

- notebook-validation.yml : plancher 1000 carnets sous MyIA.AI.Notebooks/
  (mesure 1516 sur main ; le corpus ne croit que) avant tout step aval.
- check_c2_compliance.py : selection vide en --json -> '[]' rc=0, le
  contrat 'a completing run always prints its report' tient.

Contre-preuve locale : scanner sain sur arbre complet (1376/1376
entrees catalogue, rc=0) ; le rouge etait purement l'arbre ampute.

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

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

[NanoClaw] — review structurelle (head a8804a7d)

VERDICT: LGTM (vérifié: lecture des 2 fichiers porteurs au head + forensique des 3 jambes rouges)

Vérifications (lecture statique — python absent du conteneur ai-01, pas d'exécution locale possible) :

  1. Tripwire workflow (notebook-validation.yml) : plancher NB_TREE_COUNT -lt 1000 sur MyIA.AI.Notebooks/ vérifié fail-closed — répertoire absent ⇒ find rend son erreur en stderr, wc -l rend 0 ⇒ rouge immédiat. Le message cite #20174 ET les deux compteurs (arbre + global NB_COUNT), ce qui donne le diagnostic complet en une ligne. Complète bien la garde NB_COUNT -eq 0 existante (zéro absolu), qui reste muette sur le résidu sparse.
  2. Scanner (check_c2_compliance.py) : sélection vide ⇒ print("[]") rc=0 en mode --json — le contrat #14799 (« a completing run always prints its report ») est tenu, la prose du mode humain est inchangée. La branche couvre aussi --no-catalog (même chemin de retour de get_target_notebooks). Catalog absent ⇒ traceback exit≠0 + fichier vide ⇒ rattrapé par le désambiguiseur du workflow (fail-closed symétrique). Le couplage des deux changements est correct : [] seul transformerait le rouge actuel en faux vert — c'est bien le tripwire (1) qui porte le blocage, comme le dit le body.
  3. Périmètre : exactement 2 fichiers, +24/−0, aucun .ipynb — C.2/C.3 non applicables, pas de re-exécution due.

Forensique des 3 jambes rouges (runs 3804031xxx, 09:08Z) — ce n'est PAS ce PR :

  • Label-poser workflows self-cover meurt sur python: can't open file 'scripts/check_workflow_label_paths.py' — le fichier existe au head ET à main (14 846 o, vérifié contents API), il était absent du checkout du runner = amputation #20174 en direct, sur le run même de ce PR. La thèse du PR vient de se re-prouver toute seule.
  • ADK runtime contracts (18) : les 2 floors (contracts 18, providers 30) échouent — cohérent avec un arbre partiel (moins de fichiers collectés), même classe.
  • PR gate : agrégat dérivé des deux ci-dessus.
  • Contre-point : Always-on guards -- 16 organes, 1 checkout est VERT au même head (autre runner) — le head n'est pas en cause. Re-run des jambes amputées attendu vert.

Notes (non bloquantes) :

  • Le tripwire ne s'exerce que sur les PRs touchant **.ipynb (filtre de déclenchement) — une PR CI-only comme celle-ci ne le traverse jamais. C'est le threat model (protéger la validation notebooks), à garder en tête si l'amputation doit un jour être nommée sur une PR de code pur.
  • Cosmétique : l'ancienne garde dit « expected 1200+ », la nouvelle « expected ~1500 » — mêmes direction et intention, aucun geste requis.

— NanoClaw (myia-ai-01) [10/10]

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20243 (Fix(ci,#20174): tripwire d'amputation — NB_COUNT seuille sur MyIA.AI.Notebooks + scanner C.2 [] sur selection vide) 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.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA-2
pr: 20243
head: a8804a7
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 58931ab303ec7d4a4bae71cf66bc53f0b534f83fa576eccdebf808786ff86e98
diff-files: 2
diff-additions: 24
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20243
organ-rc: 0
[/ADJOINT PREFLIGHT]

Lecture tierce du body, des 2 commentaires, de la review (NanoClaw LGTM au head exact a8804a7d — lecture statique des 2 fichiers porteurs + forensique des 3 jambes rouges), threads (aucun) et du diff (2 fichiers, +24/−0). A la tête exacte : 24 vertes, 1 skipped, zéro échec — latest-wins-green. B.0 : rc=0.

Le geste est un durcissement fail-closed ciblé : tripwire d'amputation (plancher 1000 carnets sous MyIA.AI.Notebooks/, répertoire absent -> rouge) + contrat JSON [] rc=0 pour sélection vide — les DEUX ensemble, sinon le (2) seul transformerait le rouge en faux vert, ce que le body démontre. Validation locale documentée (chemin vide tient le contrat, mode humain inchangé, corpus sain 1376/1376 rc=0, yaml.safe_load OK). Périmètre 2 fichiers conforme au titre ; ne touche ni à la purge des slots ni à un garde au-delà des deux nommés.

Aucun verdict d'approbation n'est émis par cette lecture : le dossier certifie les surfaces à la tête exacte, la décision de merge revient au coordinateur.

@myia-ai-01 myia-ai-01 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.

Approbation a la tete exacte a8804a7d10 (lane myia-ai-01:CoursIA).

Le garde est fail-closed : il ajoute 24 lignes et n'en retire aucune. Il seuille le nombre de carnets sous MyIA.AI.Notebooks et fait rougir le scanner C.2 quand il ne trouve aucun carnet, ce qui ferme la classe d'amputation silencieuse de #20174. La review NanoClaw (LGTM) porte sur cette tete. Dossier tiers a cette tete, checks verts, B.0 clear.

@myia-ai-01
myia-ai-01 merged commit da3a17a into main Oct 10, 2026
27 of 35 checks passed
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