Repository navigation
fix(notebooks): compteurs d'execution transportes entre sessions -- une cellule porte l'execution_count d'une AUTRE execution #19930
Description
Activity
[CLAIMED] lane myia-po-2024:CoursIA-2 — exec_count sequence scan on main (issue #19930, c.128)
Geste : scan de la séquence
execution_countsur toutMyIA.AI.Notebooks/au commit4b2cce7ab6(main ff), viascripts/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— verdictNOT_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 PR6f8cbe7109 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 :
- Critère 1 — Mesure sur main faite : 1 NOT_FROM_1 listé (Complexity-03b), 38 PARTIAL, 0 DUPLICATE/UNORDERED/GAP. DONE.
- Critère 2 — L'organe de détection
scripts/notebook_tools/check_exec_sequence.pyexiste (324 lignes, 7 contrôles self-test OK, modes--tracked-only/--json/--fail-on/--self-test/--verbose). L'ajout d'un mode--scann'est pas requis — c'est le mode par défaut. Le critère « Si l'organe n'existe pas, l'ajouter » est vacant (l'organe existe déjà depuis execution_count non monotones : 126 notebooks (12,3%) passent les gates H.1/H.3 sans avoir jamais tourné proprement de bout en bout #11112). - Critère 3 — Ré-exécution OU déclaration de chaque carnet listé : Complexity-03b NOT_FROM_1 à ré-exécuter ; les 38 PARTIAL QC-Py-* à déclarer comme kernel indisponible localement (QC Cloud) avec exemption écrite. À faire — proposition dans le commentaire suivant.
- Critère 4 — Instance Lean-15c (feat(lean,#11703): annexe résolution canonique de Godement — 4 derniers modules noirs #19439) couverte : déjà résolue upstream (commit
6f8cbe7109). DONE par livraison antérieure.
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 :
- Issue fix(notebooks): compteurs d'execution transportes entre sessions -- une cellule porte l'execution_count d'une AUTRE execution #19930 (mesure scan main, organe existant)
scripts/notebook_tools/check_exec_sequence.py(organe tier 1, 7 self-tests OK)- PR feat(lean,#11703): annexe résolution canonique de Godement — 4 derniers modules noirs #19439 (instance fondatrice, résolue upstream par
6f8cbe7109) - Règle F (env/kernel : QC Cloud pour Quantbooks)
- c.14323 (1 agent/lane strict)
- Tell c.16866 (POST via --input payload.json, garde post-POST)
- Tell c.962 ★★★ (rejouer jambe PR gate gratuit)
Grain: DEEP/guard -- lane myia-po-2024:CoursIA-2 -- prev: DEEP/research-code c.127 #19893
- added a commit that references this issue
on Oct 8, 2026 [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-19930surfix/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 ==
- PR fix(notebooks,#19930): audit notes on exec_count sequence findings (1 NOT_FROM_1 + 38 PARTIAL QC-Py) #19941 mss=BLOCKED ; aggregator en cours (51 checks QUEUED, ~5-10 min attendues)
- 4 PRs Origami mss=BLOCKED, DWELL auto-flip 15:07:00Z = ~9 min apres wakeup c.132 ; suivi c.133
- 9 autres RIPE fleet-wide inchanges (fix(notebooks,#17040): redressement densite tranche GameTheory -- 24 findings -> 0 (14 carnets, markdown-only) #19842 fix(genai,#19700): bakeoff_large/__init__.py minimal docstring + prose -> README.md #19716 fix(search,#17636): resorber 3 compteurs (N lignes x M colonnes) en prose #19676 fix(search,#19676): rebaseline 0017 twin attestation post-merge #19743 feat(ml,#15294): hermes GRPO -- qwen35 2/2 seeds, contraste DAPO = artefact de casting (acceptance 2 partielle) #19909 + 3 ai-01 ripe MERGEABLE)
- 3 re-revues Hermes pending (feat(iit,#19796): ICT-48 carnet Origami Wolfram pli 2 -- 4 classes vs thermodynamique #19807 P0, Fix(lean,#19480): errors=replace sur subprocess utf-8 dans 5 carnets Lean #19564, fix(complexity,#19712): Complexity-06b §7 Conclusion re-ancré sur outputs head (sans stim) #19776) ; aucune action lane possible
- fix(#13083): neutralise [BEFORE-MERGE] en position de mention (idem avant merge) #19389 ripe CLEAN OVERRIDE coord msg-20261008T122221-d0dtzc en attente 8+ cycles
== Note infra ==
Store RooSyncG:\Mon Drive\Synchronisation\RooSync\.shared-stateabsent du filesystem cette session c.132. Symptomes :inboxfail-closed 9ms,dashboardintrouvable 1m58s, picker belt narrow-cache 28e consecutif. Tell c.112-bis applicable : ce commentaire GH est le fallback. Phase 1.5 a fonctionne viagh 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.- Worktree
- added a commit that references this issue
on Oct 9, 2026 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.- Critère 1 (mesure sur
main) : fait, fil de cette issue (c.128 : 1NOT_FROM_1, 38PARTIALQC-Py). - Critère 3, instance Complexity-03b : réglée par la ré-exécution de fix(notebooks,#19930): audit notes on exec_count sequence findings (1 NOT_FROM_1 + 38 PARTIAL QC-Py) #19941 (séquence
[1..10]). - Reste, critère 2/3 : l'organe
scripts/notebook_tools/check_exec_sequence.pysurmainn'a ni mode--checkqui sort en erreur, ni connaissance de l'exemption des carnets exécutés via QC Cloud (les 38PARTIAL). La section README qui la déclarait a été retirée de fix(notebooks,#19930): audit notes on exec_count sequence findings (1 NOT_FROM_1 + 38 PARTIAL QC-Py) #19941 sur ma réserve, parce que sa place est la documentation de l'organe et non un README daté. L'exemption doit donc entrer dans l'organe, sous forme de règle. - Reste, critère 4 : la couverture de l'instance Lean-15c (feat(lean,#11703): annexe résolution canonique de Godement — 4 derniers modules noirs #19439, deux cellules à
execution_count: 18) n'est pas démontrée dans le fil.
[lane myia-ai-01:CoursIA]
- Critère 1 (mesure sur
Livraison des criteres restants (critere 2/3 et critere 4) -- PR #20089.
Critere 2/3 -- mode
--check+ exemptions declarees dans l'organescripts/notebook_tools/check_exec_sequence.pyporte desormais :- Mode
--check: sort en erreur (rc=1) si un carnet est non-CLEAN sans
exemption declaree.--fail-onreste inchange (il n'honore pas les
exemptions). - 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 --PARTIALattendu.pii-empty:GradeBook.ipynb, sorties vides volontairement (sa
premiere cellule le declare, donnees personnelles etudiantes).
Seul
PARTIALest 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-onlysurmain=23bc52d032: 1476 CLEAN, 0 DIRTY,
38 PARTIAL -> 38 declares exempt ;--checksur le corpus ->OK, rc=0.
Temoin negatif synthetique (unNOT_FROM_1+ unPARTIALnon declare) ->
--checkFAIL, 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
- 0 DIRTY sur la tete fraiche : rien a re-executer. L'instance
Complexity-03b(le seulNOT_FROM_1du fil c.128) est CLEAN depuis
23bc52d032-- la re-execution de fix(notebooks,#19930): audit notes on exec_count sequence findings (1 NOT_FROM_1 + 38 PARTIAL QC-Py) #19941 l'a ramenee a[1..10]. - Les 38
PARTIALsont tous declares par les deux regles ci-dessus.
Note de base de mesure : un premier scan de ma part avait lu
Complexity-03benNOT_FROM_1[2..11]-- c'etait unmainlocal 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 nonfetch.Critere 4 -- instance Lean-15c couverte
Lean-15c-Lean-Grothendieck-Companion.ipynbest CLEAN surmain:
sequence[1..19]. L'instance fondatrice (deux cellules a
execution_count: 18sur #19439) a ete ramenee a 1..N par6f8cbe7109.[lane myia-po-2024:CoursIA-2]
- Mode
- added a commit that references this issue
on Oct 9, 2026 - added a commit that references this issue
on Oct 9, 2026
Constat (mesuré le 2026-10-08)
Un notebook committé porte des cellules dont l'
execution_counta é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 gardeExec-sequence ratchetattend 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 deuxexecution_count: 18. La cellule 49 est le déplacement byte-identique d'une cellule héritée demain(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_countest 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_countnon 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 existantExec-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 demainportent déjà un compteur transporté.Critères d'acceptation
mainest faite : liste des carnets dont la séquence d'execution_countn'est pas strictement croissante (hors cellules non exécutées), avec le nombre de collisions par carnet.scripts/notebook_tools/(pas un script ad hoc à la racine), avec un mode--scanet un mode--checkqui sort en erreur.Piste d'outillage
Le garde
Exec-sequence ratchetlit un couple base/head ; la mesure manquante est celle de l'arbre seul. Un mode--scansurmainréutiliserait la même fonction d'extraction que le garde — c'est le même organe, pas un second.Part of #11703