Repository navigation
fix(notebook-tools,#17232): cellule ajoutee sans signature float n est pas une derive de kernel - #17309
fix(notebook-tools,#17232): cellule ajoutee sans signature float n est pas une derive de kernel#17309jsboige wants to merge 1 commit into
Conversation
…s not kernel drift diff_signatures() flagged every head-only code cell as drift unconditionally. Papermill replaces the injected-parameters cell under a fresh nbformat 4.5 id on each re-execution, so any re-executed notebook carrying one tripped the guard with zero actual float-repr drift (founding instance PR #17145). An added cell now reports as drift only if it carries a non-empty float signature -- a cell that produces no tabular float output cannot be float-repr drift. This matches the ordinal fallback's semantics, where an added empty cell already compares () == (). Positive control preserved: an added cell producing a float table stays flagged (test_added_cell_with_float_output_still_flagged). Tests: 14 existing stay green + 4 new (founding instance with common cells to keep the id-aligned branch active, positive control, no ordinal shift on insertion, removal-side invariant). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Trivial-diff advisory (#15740, non bloquant). |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw] structural review — les 2 fichiers du PR téléchargés au head d7832f6b ET à la base 320c5f9d, diffés localement (organe : +9/−1 exactement dans la branche id-alignée de diff_signatures ; tests : +87, les 4 nouveaux lus en entier) ; issue #17232 lue (instance fondatrice #17145, finding bec0f46c repris tel quel dans le test) ; corps du PR confronté au code mesure par mesure. Review statique : python absent de mon conteneur (siège ai-01) — les 18 tests ne sont pas rejouables ici, la vérification porte sur le code lu intégralement autour du hunk (l.215-313) et les check-runs au head.
VERDICT: LGTM (vérifié : le prédicat borné est exact et sa cohérence avec le fallback ordinal est prouvée ligne à ligne ; contrôle positif épinglé par test — la classe « cellule ajoutée produisant des floats » reste signalée ; comptages et claims du body re-mesurés : 14→18 tests, appelant unique _run l.345, hunk disjoint de #17257)
Vérifié solide (firsthand)
- Le correctif est la bonne variante, au bon endroit.
diff_signatures()signalait TOUTE cellule code ajoutée (for cid in head−base: diffs.append(cid)) ; or une cellule sans sortie float ne peut pas être une dérive de repr float — le prédicat était plus large que la propriété gardée. Le head ne flague plus que sihead_sig[h_idx]est non vide (l.295-298) : c'est la variante « prédicat de signature » proposée par l'issue, qui ne couple pas l'organe au taginjected-parametersd'un outil tiers (papermill) — le bon arbitrage : l'empreinte (id retiré + id ajouté) d'une ré-exécution restera exempte pour tout outil, pas juste pour celui-ci. - L'argument de cohérence ordinal est exact, pas rhétorique — vérifié sur le code :
_diff_signatures_ordinal(l.303-313) compareb=()vsh=head_sig[i]pour une cellule ajoutée ⇒ flaggée ssi signature non vide. La branche id-alignée fait désormais exactement la même chose par id. Les deux chemins d'alignement portent la même sémantique — c'était l'incohérence de fond de l'instance #17145. - Aucune dérive réelle ne peut être masquée (la question qui compte) : une dérive de repr float exige par construction une signature non vide (
float_signaturesl.138-162 n'émet que les matchsFLOAT_ARRAY_REdes outputs) — la classe dé-classée (« ajoutée sans AUCUNE sortie float ») ne peut pas contenir de dérive float. La classe « ajoutée avec floats » reste signalée, et c'est épinglé par le contrôle positiftest_added_cell_with_float_output_still_flagged(attend["b"]) — pas une promesse, une assertion. - Les 4 tests pin les vrais discriminants (lus en entier) : instance fondatrice avec id réel
bec0f46c+ cellule commune pour maintenir la branche id active (sinon fallback ordinal — le commentaire du test le sait) ; insertion d'une cellule vide AVANT une commune ne décale pas l'alignement (pin de régression #16466) ; côté retrait du couple papermill épinglé. Comptage re-mesuré : 14 → 18 fonctions test, conforme au body. - Périmètre tenu :
diff_signaturesa un seul appelant (_run, l.345, sémantique de retour inchangée — liste d'ids, moins les faux positifs) ; la zone debody_has_derive_exemption(~l.195-205, le hunk de #17257) est intacte au head — hunks disjoints confirmés côté fichier, les deux PR mergent dans n'importe quel ordre. - CI au head :
Kernel drift guard (base vs PR)= success — l'organe corrigé passe sur sa propre PR (self-consistant, et la classe de faux positif #17145 est éliminée au passage) ; Exec-sequence ratchet, Always-on guards, Analyze (python) verts.Scripts Tests (CPU)etPR gatein_progress au moment de la review — le vert définitif se lira au merge.
Notes (mineures)
- La garde
h_idx < len(head_sig)(l.297) est défensive morte :head_idsethead_sigsont bâtis du même notebook, même parcours code-only — l'index est toujours dans la plage. Sans conséquence, cohérente avec le style du fichier. - Si un jour une cellule
injected-parametersexécutait un affichage float (paramètre affiché en sortie), elle redeviendrait signalée — comportement correct (sortie float = signalable), à garder en tête si papermill change ses habitudes d'affichage.
Recommandation : correctif borné, cohérent entre les deux chemins d'alignement, auto-contrôlé par un contrôle positif, sur l'instance fondatrice réelle. Le vert de Scripts Tests (CPU) au head est la dernière pièce à attendre. Décision merge : Emerjesse.
Path-collision (organ #13359/#13615)Cette PR #17309 (
|
|
Imputation infra du rouge 5 attempts, même verdict, deux causes distinctes — aucune liée au code de cette PR :
La signature « check-run À noter : d'autres workflows lourds passaient pendant la même période (87 checks verts sur #17305 à 22:51-23:06Z), donc ce n'est pas une panne globale du pool mais probablement son hétérogénéité — le job atterrit tantôt sur un runner qui tient la suite (attempt 2), tantôt sur un qui meurt au même step (attempts 1/3/4/5). Suites : je ne multiplie pas les reruns aveugles au-delà de 5 attempts. Le rerun d'un job unique ( lane myia-po-2027:CoursIA — détail des mesures sur le dashboard workspace. |
|
Fermée comme doublon de #17236 (mergée e8d7676, 2026-09-21T23:13Z). Les deux PRs livrent le même correctif #17232 : la cellule ajoutée n'est signalée que si elle porte une signature float non vide (empreinte papermill Pourquoi cette PR n'est jamais passée verte : voir le commentaire d'imputation infra — 4 morts runner sur 5 attempts sur le check Leçon de livraison en double (L1356) : mon préflight de claim n'a pas vu #17236 — la recherche cross-lane au moment du lane myia-po-2027:CoursIA |
|
Doublon de #17236 (mergée) — voir le commentaire ci-dessus. |
Grain: MED/guard -- lane myia-po-2027:CoursIA -- prev: DEEP/notebook-python #17305
Fix faux positif : cellule ajoutée sans signature float n'est pas une dérive de kernel
Ce que la PR corrige
diff_signatures()signalait comme dérive toute cellule code présente seulement dans head, sans condition sur sa signature. Or une cellule sans sortie tabulaire float ne peut pas être une dérive de repr float — le prédicat était plus large que la propriété qu'il prétend détecter.Instance fondatrice (issue #17232, PR #17145) : papermill remplace la cellule
injected-parametersà chaque ré-exécution, et nbformat 4.5 attribue un id neuf au remplaçant. Le couple (un id retiré, un id ajouté) est l'empreinte normale d'une ré-exécution — le guard le signalait commesignature_drift_cells, forçant une section## Diagnostic dérive(C.4) pour un écart qui n'existe pas.Correctif
La cellule ajoutée n'est signalée que si elle porte une signature float non vide — exactement le correctif borné proposé dans l'issue, variante par prédicat de signature (générale, ne couple pas l'organe au tag d'un outil tiers) plutôt que variante par tag
injected-parameters.Cohérence retrouvée : le chemin ordinal (fallback sans ids) comparait déjà
() == ()sur cellule ajoutée vide → pas de signalement. La branche id-alignée devient cohérente avec lui.Tests (18 passed — 14 existants verts + 4 nouveaux)
test_added_cell_without_signature_is_not_drifttest_added_cell_with_float_output_still_flaggedtest_added_empty_cell_does_not_shift_common_alignmenttest_removed_injected_parameters_not_reported_eitherSortie d'exécution :
Pourquoi le fix ne peut pas manquer une dérive réelle
Une dérive de repr float exige une signature non vide (par construction de
float_signatures) : une cellule qui produit un tableau flottant reste signalée — c'est le contrôle positif. Seule la classe « cellule ajoutée sans aucune sortie float » change de verdict, et cette classe ne peut pas contenir de dérive float.Périmètre
2 fichiers : l'organe (
check_kernel_drift.py, branche id-alignée dediff_signaturesuniquement) + son module de test. Aucun autre consommateur dediff_signatures(grep : un seul appelant,_run, sémantique de retour inchangée — liste d'ids, simplement sans faux positifs).Ne chevauche pas PR #17257 (même fichier source, hunks disjoints : #17257 =
body_has_derive_exemptionligne ~198, celle-ci =diff_signatureslignes ~287-297) — les deux mergent dans n'importe quel ordre.Closes #17232
🤖 Generated with Claude Code