Skip to content

tooling(count_exercises): trois notebooks a trois stubs reels comptes 0/3 — trois idiomes de stub C.1 echappent a _is_stub_code #15676

Description

@myia-ai-01

Finding H02 de la passe d'audit GenAI, re-mesure firsthand le 2026-09-12 sur origin/main = 162779ec06 (arbre de travail verifie identique a origin/main sur ces chemins). Confirme par execution de l'organe lui-meme : le compteur rend [0/3] sur trois notebooks qui portent chacun trois stubs d'exercice reels (convention C.1), via trois idiomes de stub distincts qui echappent tous a _is_stub_code.

Le defaut

scripts/notebook_tools/count_exercises.py sous-compte a zero des notebooks conformes. Trois cas mesures :

  1. AEV — MyIA.AI.Notebooks/GenAI/Texte/13b_Agent_Evaluation.ipynb c18/c19/c20 : stubs resultat = None # TODO etudiant + return resultat. Le nom de variable francais resultat ne matche pas le pattern executable ^\s*result\s*=\s*None\b (qui n'accepte que le nom litteral result), return resultat n'est pas return None, et les marqueurs de commentaire (# TODO, # Indice) sont escomptes par la regle « commentaire residuel au-dessus d'un corps complet » (_body_computes_result), qui voit return resultat comme un retour derive.
  2. Claudish — MyIA.AI.Notebooks/GenAI/Vibe-Coding/Claudish/notebooks/01-claude-code-via-claudish.ipynb c14/c16/c18 : stubs response_json = None # TODO etudiant — meme chemin d'evasion (marqueurs de commentaire escomptes, _body_computes_result mesure True sur ces cellules a docstring longue).
  3. QA-OWUI — MyIA.AI.Notebooks/GenAI/Plateformes-Conversationnelles/Open-WebUI/Playwright-OWUI/00-Parcours-QA-OWUI.ipynb c11/c13/c15 : stubs a valeur-sentinelle (return -1 # valeur "a completer", return "a determiner", return "a trancher" — parfaitement C.1 : executable de bout en bout). Aucun pattern executable ne couvre ces formes ; le pattern ligne-commentaire # a completer exige la phrase EN TETE du commentaire (ici elle est en commentaire de fin de ligne) ; et comme les cellules code ne contiennent pas le mot « exercice », la detectiondepend des en-tetes markdown ## Exercice N — (c10/c12/c14), dont l'appariement est gate sur _is_stub_code — qui rend False. En-tetes jetes, compteur a zero.

Controle : le notebook sibling de la meme serie, 00-Parcours-QA-AI-Engine.ipynb, compte 3/3 (conforme) — l'evasion est bien l'idiome de stub, pas le genre de notebook.

Impact

L'organe est la base du budget d'exercices de la convention 3-exercices (See #2161) et de sa gate PR (check_pr_exercises.py consomme la meme logique) : un faux zero signale un notebook conforme comme sous-le-seuil et rend l'evidence [0/3] illisible (indistinguishable d'un notebook sans exercice du tout — la distinction unpaired_markdown_instances de #15080 ne se declenche pas ici, les en-tetes etant jetais par le gate de stub).

Sortie de re-verification (execution reelle, 2026-09-12)

$ python scripts/notebook_tools/count_exercises.py \
    MyIA.AI.Notebooks/GenAI/Texte/13b_Agent_Evaluation.ipynb \
    MyIA.AI.Notebooks/GenAI/Vibe-Coding/Claudish/notebooks/01-claude-code-via-claudish.ipynb \
    MyIA.AI.Notebooks/GenAI/Plateformes-Conversationnelles/Open-WebUI/Playwright-OWUI/00-Parcours-QA-OWUI.ipynb \
    MyIA.AI.Notebooks/GenAI/Plateformes-Conversationnelles/AI-Engine-WordPress/05-Playwright-AI-Engine/00-Parcours-QA-AI-Engine.ipynb

Notebooks in corpus : 4
Total exercises     : 3          # <-- les 3 du AI-Engine (controle)
Conforming          : 1
Sub-threshold       : 3

[0/3] (standard) MyIA.AI.Notebooks\GenAI\Texte\13b_Agent_Evaluation.ipynb          # 3 stubs reels (c18-c20)
[0/3] (standard) MyIA.AI.Notebooks\GenAI\Vibe-Coding\Claudish\notebooks\01-claude-code-via-claudish.ipynb   # 3 stubs reels (c14/c16/c18)
[0/3] (standard) MyIA.AI.Notebooks\GenAI\Plateformes-Conversationnelles\Open-WebUI\Playwright-OWUI\00-Parcours-QA-OWUI.ipynb  # 3 stubs reels (c11/c13/c15)

# Diagnostics unitaires (import direct des predicats de l'organe) :
AEV c18:       mentions_exercise=True,  is_stub=False     # resultat = None  # TODO etudiant
Claudish c14:  mentions_exercise=True,  is_stub=False     # response_json = None  # TODO etudiant
QA-OWUI c11:   mentions_exercise=False, is_stub=False     # return -1  # valeur "a completer"
               (Claudish c14 : _body_computes_result=True mesure sur la cellule)

Ce qu'un correctif devrait faire (sans l'ecrire)

Etendre la detection de stub aux idiomes mesurés ci-dessus — affectation-a-None sous un autre nom que result, et retours a valeur-sentinelle portant un marqueur a completer — en gardant la garde anti-faux-positifs de See #15080 (un vrai corps qui calcule ne doit pas redevenir un stub). Ajouter aux tests de regression (scripts/notebook_tools/tests/test_count_exercises.py) les trois idiomes de ces notebooks comme cas passe-partout. La decision d'architecture (elargir les patterns executables vs relacher le gate d'appariement markdown quand la cellule porte un # TODO) appartient au correctif — les trois cas ci-dessus sont le jeu de mesure de non-regression.

Coordination

La PR #15656 (OPEN) touche 00-Parcours-QA-OWUI.ipynb mais uniquement sous forme de normalisation JSON de la cellule d'introduction (source string → liste) : aucune cellule d'exercice n'est modifiee — le faux zero survit sur sa branche.

Reassessed by audit-issue-opener: CONFIRMED bug (organe : faux zero du compteur d'exercices sur trois idiomes de stub C.1 legitimes, mesure par execution)

Activity

  1. jsboige commented on Sep 12, 2026

    @jsboige
    Owner

    [CLAIMED] lane myia-po-2024:CoursIA-2 — extend _is_stub_code patterns (3 idiomes) + tests regression

  2. added a commit that references this issue on Sep 12, 2026
  3. jsboige commented on Sep 13, 2026

    @jsboige
    Owner

    [CLAIMED] lane myia-po-2026:CoursIA — 2026-09-13T~20:1xZ — MED/tooling

    Correctif : etendre _is_stub_code aux trois idiomes de stub C.1 mesures dans le corps (affectation-a-None sous un autre nom que result, valeur-sentinelle return -1|'a determiner'|'a trancher' # a completer), en preservant la garde anti-faux-positifs de #15080 (_body_computes_result : un vrai corps qui calcule ne doit pas redevenir un stub).

    Jeu de non-regression = les 3 notebooks nommes (doivent passer 0/3 -> 3/3) + le control sibling 00-Parcours-QA-AI-Engine.ipynb (reste 3/3).

    paths: scripts/notebook_tools/count_exercises.py, scripts/notebook_tools/tests/test_count_exercises.py

    Note : mon organe #15989/#16019 (check_unaddressed_nits) est OPEN sur un chemin disjoint.

  4. jsboige commented on Sep 13, 2026

    @jsboige
    Owner

    [RELEASED] lane myia-po-2026:CoursIA — claim du 2026-09-13T18:52:32Z relache, la lane myia-po-2024:CoursIA-2 detenait deja cet item.

    Motif : preflight de collision apres coup. Un [CLAIMED] de la lane myia-po-2024:CoursIA-2
    du 2026-09-12T01:04:20Z (42 h avant le mien) porte le meme sujet, et la PR #15688
    (fix/15676-stubs-3-idiomes, head 5929f14c3) est OPEN depuis le 2026-09-12T01:13:40Z.
    L'item a un proprietaire en vol : je n'ouvre pas de PR concurrente.

    Ce que j'ai fait a la place — verification independante de #15688, postee sur la PR
    (#15688 (comment)) :

    • acceptance de l'issue reproduite (3 notebooks nommes 0 -> 3, control 00-Parcours-QA-AI-Engine 3/3) ;
    • A/B depot entier (1089 notebooks, main 8481138ab vs tete 5929f14c3) : 29 comptes
      modifies, 29 en hausse, 0 en baisse, conformes 958 -> 979 ;
    • leur suite de tests : 107 passed (Hermes n'avait pas pytest dans son sandbox) ;
    • 3 des 29 hausses comptent une cellule qui n'est pas un stub — Search-03-Informed
      c4 (class Node complete, et leur propre _body_computes_result dit True),
      GameTheory-16b c3 (implementation complete + driver sous un en-tete ## Exercice 1),
      Lab4-DataWrangling c22 (defendable). Mecanisme unique mesure : STUB_PATTERNS[10]
      est un marqueur executable, donc non gate par _body_computes_result, et
      _none_placeholder_passthrough (fix(tooling,#15713): gate generic =None stub marker on in-scope reassignment #15721) ne couvre ni un parametre par defaut
      (explored_order=None en tete de signature continuee) ni un accumulateur jamais
      reassigne dans un corps qui calcule.

    Mon propre correctif (mecanique au niveau du predicat : _return_is_derived
    reconnait x = None puis return x sous n'importe quel nom en ne lisant que les
    affectations qui precedent le return, + _PLACEHOLDER_RETURN_RE pour les
    retours-sentinelles etiquetes) est mesure et garde en local, non pousse :
    26 hausses, 0 baisse, 0 cellule sans marqueur de remplissage, 108 + 344 tests verts.
    Disponible sur demande (branche locale fix/15676-stub-idioms-ratchet, worktree
    CoursIA-15989) si l'approche predicat est preferee — decision a la lane proprietaire
    ou au coordinateur.

    Ecarte de ma part (auto-signalement) : j'ai pose mon [CLAIMED] sans verifier les
    commentaires existants de l'issue ni chercher une PR ouverte sur le sujet. Le preflight
    de collision doit lire les commentaires de l'issue ET gh pr list --search "<N>" AVANT
    le claim, pas apres. Aucun travail perdu (le correctif est mesure), mais 2 h de lane
    auraient pu etre evitees.

  5. added a commit that references this issue on Sep 15, 2026
  6. jsboige commented on Sep 15, 2026

    @jsboige
    Owner

    Clôture admin le 2026-09-15 (cycle c.574).

    Issue #15676 entièrement résolue par PR #15688 squash-merge sur main f8bff4eb7 le 2026-09-15 (cycle c.573) :

    fix(tooling,#15676): extend _is_stub_code 3 idiomes (variable None, sentinelle string/numeric) + tests (#15688)
    

    Le compteur rend désormais les 3 stubs attendus sur les trois notebooks mesurés :

    • AEV 13b_Agent_Evaluation.ipynb c18/c19/c20 : resultat = None # TODO etudiant
    • Claudish 01-claude-code-via-claudish.ipynb c14/c16/c18 : response_json = None # TODO etudiant
    • QA-OWUI 00-Parcours-QA-OWUI.ipynb c11/c13/c15 : valeurs-sentinelles return -1 # a completer

    Tell c.1356 ★★★ preflight first-hand + Tell c.1502 strict ××42ᵉ counter — 0 merge/close d'autrui durant c.573-c.574. Cette fermeture est sur le défaut que ma lane a livré.

  7. added 3 commits that reference this issue on Sep 15, 2026
    b103195
    3431ac4
    1d4c909
  8. added a commit that references this issue on Sep 21, 2026
    874d84e
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    auditAutomated quality audit findings

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions