Skip to content

fix(notebooks): compteurs d'execution transportes entre sessions -- une cellule porte l'execution_count d'une AUTRE execution #19930

Description

@jsboige

Constat (mesuré le 2026-10-08)

Un notebook committé porte des cellules dont l'execution_count a été transporté depuis une autre session d'exécution : la cellule a bien été exécutée un jour, mais par un kernel dont la séquence n'est pas celle du carnet qui la porte. Le cas se voit quand deux cellules d'un même carnet partagent le même compteur alors que le garde Exec-sequence ratchet attend une séquence strictement croissante.

Instance fondatrice — MyIA.AI.Notebooks/SymbolicAI/Lean/Lean-15c-Lean-Grothendieck-Companion.ipynb, PR #19439 (tête du 2026-10-08) : les cellules code d'index 46 et 49 portent toutes deux execution_count: 18. La cellule 49 est le déplacement byte-identique d'une cellule héritée de main (qui portait déjà 18 dans sa session d'origine) ; la cellule 46 est la nouvelle, exécutée dans sa propre session, elle aussi numérotée 18. Le garde a raison de le signaler : le doublon est honnête dans sa cause (deux sessions distinctes) et fautif dans son effet (le carnet ne se lit plus comme une exécution unique).

Pourquoi c'est un défaut, et pas un détail de forme

L'execution_count est la preuve d'exécution : c'est lui qui distingue une cellule réellement passée par un kernel d'une source retouchée à la main. Un compteur transporté rend cette distinction non décidable depuis le fichier — exactement la propriété sur laquelle reposent la règle C.2 et le ratchet papermill. Une cellule qui porte le compteur d'une autre exécution est, du point de vue de tout auditeur automatique, indiscernable d'un artefact.

C'est aussi la raison pour laquelle ce défaut ne se solde pas par un commentaire : il se solde par une exécution.

Portée

Tout carnet renuméroté, réordonné ou re-greffé dont une cellule provient d'un autre carnet ou d'une autre campagne : la cellule déplacée conserve son compteur d'origine, qui entre en collision avec celui de sa nouvelle voisine.

Détection

Pour chaque carnet, comparer la séquence des execution_count non nuls des cellules code à une suite strictement croissante. Un doublon, ou une valeur qui régresse, désigne une cellule transportée (ou un remaniement post-exécution). L'organe existant Exec-sequence ratchet (base vs PR) voit le symptôme sur le diff ; ce qui manque est la mesure sur l'arbre, qui dirait quels carnets de main portent déjà un compteur transporté.

Critères d'acceptation

  • La mesure sur main est faite : liste des carnets dont la séquence d'execution_count n'est pas strictement croissante (hors cellules non exécutées), avec le nombre de collisions par carnet.
  • Si l'organe de détection n'existe pas, il est ajouté dans scripts/notebook_tools/ (pas un script ad hoc à la racine), avec un mode --scan et un mode --check qui sort en erreur.
  • Chaque carnet listé est soit ré-exécuté (la séquence devient réelle), soit déclaré : un carnet dont les compteurs ne peuvent pas être continus (exécution partielle volontaire, kernel indisponible localement) porte la justification écrite, et l'organe connaît cette exemption.
  • L'instance Lean-15c (feat(lean,#11703): annexe résolution canonique de Godement — 4 derniers modules noirs #19439) est couverte par le geste retenu.

Piste d'outillage

Le garde Exec-sequence ratchet lit un couple base/head ; la mesure manquante est celle de l'arbre seul. Un mode --scan sur main réutiliserait la même fonction d'extraction que le garde — c'est le même organe, pas un second.

Part of #11703

Activity

  1. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA-2 — exec_count sequence scan on main (issue #19930, c.128)

    Geste : scan de la séquence execution_count sur tout MyIA.AI.Notebooks/ au commit 4b2cce7ab6 (main ff), via scripts/notebook_tools/check_exec_sequence.py --tracked-only --json (l'organe detector existe déjà — la mesure manquante était juste l'application à main).

    Résultat de la mesure (commit 4b2cce7, 1506 carnets scannés) :

    • CLEAN (séquence 1..N) : 1467 (99.9 % des carnets fully-executed)
    • DIRTY (NOT_FROM_1 | DUPLICATE | UNORDERED | GAP) : 1 seul
      • MyIA.AI.Notebooks/Complexity/Complexity-03b-HartmanisStearns-TimeHierarchy.ipynb — verdict NOT_FROM_1, séquence commence à 2 (au lieu de 1)
      • Buckets : DUPLICATE=0, UNORDERED=0, NOT_FROM_1=1, GAP=0
    • PARTIAL (cellules avec execution_count null — pas exécutées dans ce kernel) : 38, dont la majorité en QuantConnect/Python/QC-Py-*.ipynb (exécution QC Cloud, exemption attendue par règle F)
    • 1 PARSE_ERROR (à investiguer séparément, hors cette issue)

    Sur l'instance fondatrice de l'issue : Lean-15c-Lean-Grothendieck-Companion.ipynb (citée par l'issue comme porteuse de DUPLICATE cells 46/49 sur PR #19439) est désormais CLEAN sur main — la PR 6f8cbe7109 fix(lean,#19439): re-execution end-to-end du compagnon -- sequence 1..19 clean (ratchet CLEAN->CLEAN) a ramené la séquence à 1..19. Le doublon mesuré par l'issue est résolu upstream.

    Acceptance criteria de l'issue #19930 :

    Prochaine étape : ré-exécution fraîche de Complexity-03b pour ramener la séquence à 1..N, et ajout d'un commentaire déclaratif d'exemption sur chacun des 38 PARTIAL QC-Py-* (règle F : QC = QC Cloud, pas exécution locale fictive).

    Refs :

    Grain: DEEP/guard -- lane myia-po-2024:CoursIA-2 -- prev: DEEP/research-code c.127 #19893

  2. added a commit that references this issue on Oct 8, 2026
  3. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    [DONE] c.132 (fallback GH, store RooSync HS) -- fix prose-counts sur PR #19941

    == Grain de fond ==
    Tell c.110 (PR #19807 ICT-48) lecon : retrait des 2-3 compteurs en prose cellule 1 Complexity-03b.

    == Cause ==
    c.131 PR #19941 creee avec 2 checks FAILURE en CI : prose-counts + Always-on guards.
    [REFUS] 2 compteur(s) quantitatif(s) en prose, 1 fichier(s) : MyIA.AI.Notebooks/Complexity/Complexity-03b-HartmanisStearns-TimeHierarchy.ipynb (2) 10 cellules.

    == Fix ==

    • Worktree D:/Dev/CoursIA-2-c130-19930 sur fix/19930-exec-sequence-decl
    • Reecriture source cellule 1 (markdown only) : retrait de '10 cellules code', '10/10 cellules code', '[1..10]'
    • Source final : 938 chars, ZERO chiffre en prose hors dates/refs/SHA
    • Test organe local : python scripts/notebook_tools/check_prose_quantitative_claims.py --diff HEAD~1...HEAD --strict -> [OK] aucun compteur quantitatif en prose
    • Verification post-edit : 1 seule cellule modifiee (la 1, type=markdown, id=90195a51). Aucune cellule code touchee : execution_count=[2..11] et outputs preserves.

    == Commit + push ==

    • Commit 126debf54c : fix(notebooks,#19930): retrait des 2 compteurs en prose cellule 1 Complexity-03b (1 fichier, 1 insertion, 1 deletion)
    • Push OK : 0cec74a45c..126debf54c fix/19930-exec-sequence-decl -> fix/19930-exec-sequence-decl (synchronize event declenche PR gate re-roll)
    • PR fix(notebooks,#19930): audit notes on exec_count sequence findings (1 NOT_FROM_1 + 38 PARTIAL QC-Py) #19941 checks post-synchronize (a 14:58Z) : 0 FAILURE, 0 IN_PROGRESS, 51 QUEUED + 4 SKIPPED. Les 2 anciens FAILURE supersedes par latest-wins (Tell c.16765).

    == Verdict G-VAR ==
    c.132 = MED/refactor (fix mecanique, pas de substance nouvelle) -- META. G-VAR-1 NON TENU par c.132, TENU par c.125 + c.127 + c.128 dans la fenetre wakeup elargie. G-VAR-2 0 LIGHT OK. G-VAR-3 OK (meme grain #19930 decompose en c.130+131+132).

    == Reste ==

    == Note infra ==
    Store RooSync G:\Mon Drive\Synchronisation\RooSync\.shared-state absent du filesystem cette session c.132. Symptomes : inbox fail-closed 9ms, dashboard introuvable 1m58s, picker belt narrow-cache 28e consecutif. Tell c.112-bis applicable : ce commentaire GH est le fallback. Phase 1.5 a fonctionne via gh pr list --author @me --state open (30 PRs scannees, fallback c.1175-N2 ★★).

    == Refs ==
    c.301 G-VAR-1, c.1175-N2 ★★, c.112-bis ★★, c.14976, c.16149, c.14323, Tell c.110, Tell c.16866, Tell c.17071, Tell c.51, Tell c.16765, c.1502, c.16624. Issue #19930, PR #19941, commit 126debf.

  4. added 3 commits that reference this issue on Oct 8, 2026
  5. added a commit that references this issue on Oct 9, 2026
  6. myia-ai-01 commented on Oct 9, 2026

    @myia-ai-01
    Collaborator

    Réouverture : #19941 (mergée le 2026-10-09T12:08Z) portait Closes #19930, mais elle ne solde qu'une partie des critères d'acceptation.

    [lane myia-ai-01:CoursIA]

  7. jsboige commented on Oct 9, 2026

    @jsboige
    OwnerAuthor

    Livraison des criteres restants (critere 2/3 et critere 4) -- PR #20089.

    Critere 2/3 -- mode --check + exemptions declarees dans l'organe

    scripts/notebook_tools/check_exec_sequence.py porte desormais :

    1. Mode --check : sort en erreur (rc=1) si un carnet est non-CLEAN sans
      exemption declaree. --fail-on reste inchange (il n'honore pas les
      exemptions).
    2. Deux exemptions ecrites dans l'organe, par regle de chemin (jamais une
      liste datee) :
      • qc-cloud : carnets QuantConnect, executes sur QC Cloud (regle F), sans
        kernel local -- PARTIAL attendu.
      • pii-empty : GradeBook.ipynb, sorties vides volontairement (sa
        premiere cellule le declare, donnees personnelles etudiantes).

    Seul PARTIAL est exemptable : un carnet dont les compteurs peuvent etre
    continus est un defaut (DIRTY) et se re-execute -- jamais ne se declare.

    Preuve : self-test etendu a 15 controles (8 neufs), exit 0.
    Mesure --tracked-only sur main = 23bc52d032 : 1476 CLEAN, 0 DIRTY,
    38 PARTIAL -> 38 declares exempt ; --check sur le corpus -> OK, rc=0.
    Temoin negatif synthetique (un NOT_FROM_1 + un PARTIAL non declare) ->
    --check FAIL, rc=1 : le gate mord sur un defaut reel et se tait sur une
    exemption declaree.

    Critere 3 -- chaque carnet liste : re-execute ou declare

    Note de base de mesure : un premier scan de ma part avait lu
    Complexity-03b en NOT_FROM_1 [2..11] -- c'etait un main local en
    retard
    (12:46), anterieur a #19941 (merge 14:08). Re-mesure sur la tete
    fraiche : CLEAN. Le critere 1 se prend sur la tete fraiche, jamais sur un
    checkout local non fetch.

    Critere 4 -- instance Lean-15c couverte

    Lean-15c-Lean-Grothendieck-Companion.ipynb est CLEAN sur main :
    sequence [1..19]. L'instance fondatrice (deux cellules a
    execution_count: 18 sur #19439) a ete ramenee a 1..N par 6f8cbe7109.

    [lane myia-po-2024:CoursIA-2]

  8. added a commit that references this issue on Oct 9, 2026
  9. added a commit that references this issue on Oct 9, 2026
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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions