Skip to content

feat(genai,#22699): TV-00d -- encodeur seul et encodeur-decodeur from scratch - #22708

Open
jsboige wants to merge 5 commits into
mainfrom
feature/22699-tv00d-encodeurs
Open

jsboige wants to merge 5 commits into
mainfrom
feature/22699-tv00d-encodeurs

Conversation

@jsboige

@jsboige jsboige commented Oct 26, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2025:CoursIA — prev: MED/test #22285

Closes #22699 · Part of #18220 (pli 3, bloc NLP/LLM — « Encodeur seul et encodeur-décodeur from scratch »)

Livrable

TV-00d-Encodeurs-from-scratch.ipynb (37 cellules, bloc A, contrat CPU de la série) — les deux familles Transformer absentes du corpus : encodeur seul (BERT, MLM 80/10/10) et encodeur-décodeur (T5, attention croisée). 3 exercices stubbés sans erreur volontaire (C.1), sorties réelles commitées (C.2). Ligne Parcours ajoutée au README de la série.

Organ-first — les 5 questions

  1. Série possédant la sémantique : TransformerVariants/tv/ (organe extrait de TV-00b) possède l'attention multi-tête vectorisée et le bloc pré-norm.
  2. Organe réel invoqué : oui — le carnet importe VariantAttn, Bloc, attn_masked, selfcheck_attn_equivalence depuis tv ; l'attention multi-tête de base n'est pas re-dérivée.
  3. Export/refactor dans la série source : tv/model.py étendu additivement — attn_pleine, AttnCroisee, BlocDecodeur, PetitEncodeur, EncodeurDecodeur, selfcheck_encodeurs, tous exportés dans tv/__init__.py. Aucune signature existante modifiée ; selfcheck_attn_equivalence inchangé et repassé dans le carnet (1.79e-07).
  4. Témoin négatif : §3.4 — les mêmes poids bidirectionnels basculés en causal s'effondrent sans réapprentissage (43,1 → 24,7 % à 15 %) ; le causal ré-entraîné à budget égal plafonne sur la position dont la preuve est à droite (sujet : 31,6 % contre 63,7 %) — et le contrôle symétrique (verbe, preuve à gauche) inverse l'avantage (90,0 % contre 41,9 %) : la fenêtre de lecture coupe dans les deux sens, la bidirectionnalité est un échange, pas un sur-ensemble gratuit.
  5. Vérification indépendante : §2 — attn_pleine et AttnCroisee contre une boucle par tête écrite à la main (écarts 1.19e-07 / 5.96e-08) ; §4 — exact-match jeton par jeton contre les cibles canoniques.

Mesures clés (toutes mesurées dans ce run, graines fixées)

Mesure Valeur
MLM précision globale (bi) à 5/15/30 % 53,6 / 46,6 / 36,9 %
sujet (preuve à droite) bi vs causal à 15 % 63,7 % vs 31,6 %
verbe (preuve à gauche) bi vs causal à 15 % 41,9 % vs 90,0 %
transfert bi→causal sans réapprentissage 24,7 % (depuis 43,1 %)
seq2seq dates : exact-match glouton / faisceau k=3 (pas 400) 43,2 % / 42,0 %
alignement croisé : jeton de mois émis lit « novembre » 78 %

Création du carnet — exception documentée

Nouveau carnet construit par script (round-trip json + nbformat.validate, ids stables tv00d-NN) puis exécuté via papermill CLI --cwd <dir du carnet> — l'exception documentée par la fiche mémoire mcp-kernel-cwd-outputs-persistence (point 6). Le script de construction vit hors commit (.tmp/, gitignoré).

Bug trouvé et corrigé pendant le développement

Les jeux de test initiaux étaient dégénérés : torch.Generator().manual_seed(s) recréé dans la compréhension de liste → 512 phrases de test identiques. Toutes les métriques d'évaluation des premières exécutions mesuraient une seule phrase. Corrigé : générateur créé une seule fois hors de la compréhension + assert de distinctité (> 400 éléments distincts) laissés dans le carnet comme garde.

Validation

  • Papermill end-to-end, kernel python3, 37/37 cellules, 0 erreur, ~80 s. Deux exécutions complètes successives : sorties identiques (déterminisme — CUBLAS_WORKSPACE_CONFIG, cudnn deterministic, graine 20261026).
  • Gates locaux : check_output_failure_text origin/main rc=0 · check_output_collapse 0 flagged · check_source_collapse 0 flagged · check_prose_quantitative_claims --diff rc=0 · check_activity_leak --diff rc=0 · pre-commit H.3 passed.
  • C.1 : 0 raise NotImplementedError / assert False / 1/0 (grep sur carnet + organe).
  • Non-régression organe : selfcheck_attn_equivalence (TV-00b) repassé vert dans le carnet.

🤖 Generated with Claude Code

… scratch

Encodeur BERT (MLM 80/10/10) et encodeur-decodeur T5 (attention croisee)
depuis l'organe tv/ etendu additivement (attn_pleine, AttnCroisee,
BlocDecodeur, PetitEncodeur, EncodeurDecodeur, selfcheck_encodeurs).
Ablation par position : sujet (preuve a droite) 63,7% bi vs 31,6% causal,
controle verbe (preuve a gauche) inverse 41,9% vs 90,0% -- la fenetre de
lecture coupe dans les deux sens. Transfert de masque : 43,1 -> 24,7%.
Seq2seq dates : exact-match 43,2% glouton, 42,0% faisceau k=3, courbe au
fil de l'entrainement, alignement croise lu position par position.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.8s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.7s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.2s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.2s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.5s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 19.4s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.6s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 11.6s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 28
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

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

@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

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

[Hermes] Carnet lu intégralement (37 cellules) et rejoué : les 15 cellules de code s'exécutent dans un seul namespace, 0 erreur, et la table MLM principale se reproduit au chiffre près. Deux rouges CI au head, dont un seul imputable.

Vérifié par exécution, pas par la prose

  • Authenticité papermill : duration 81,123726 s (fractionnaire), start_time 13:35:30.042922Z / end_time 13:36:51.166648Z (µs distinctes), soit ~4 min avant le push — 37/37 cellules portent leur bloc per-cell. Le --cwd annoncé est cohérent avec les imports (sys.path.insert(0, ".") + from tv import …).
  • Table MLM §3.2 reproduite à l'identique : 53.6 / 46.6 / 36.9 %, sujet 83.3 / 58.2 / 51.3 %, verbe 54.8 / 41.9 / 20.1 % ; pertes 3.422 → 1.206 identiques ; témoin de transfert identique à l'identique (28.9 / 24.7 / 21.4 %, depuis 53.6 / 43.1 / 34.6 %).
  • Non-régression de l'organe : selfcheck_attn_equivalence repasse (écart 1.19e-07 chez moi, 1.79e-07 committé), selfcheck_encodeurs passe ; l'extension de model.py est bien additive (aucune signature existante modifiée, __init__.py élargi).
  • Bug du générateur : confirmé corrigé — torch.Generator().manual_seed(555) créé une seule fois hors compréhension + assert … > 400 présent dans la cellule.
  • §4.3 alignement : la sortie committée porte bien « novembre (78 %) » pour le jeton de mois, et les deux exemples de faisceau qui perdent montrent une transposition de chiffres d'année (1 8 6 2 → 1 8 2 6), exactement ce que la prose décrit.

🔴 Imputable au diff — check-nav-chain FAILURE (bloquant)

[orphan_entry] …/TransformerVariants/TV-00d-Encodeurs-from-scratch.ipynb
[orphan_entry] …/TransformerVariants/TV-04-DiscoLoop.ipynb

Reproduit en labo avec l'organe du head (check_notebook_nav_chain.py, graphe reconstruit sur les 7 blobs de la série, repo git réel) : base = 0 finding, head = 2. Le nouveau carnet n'a aucune arête .ipynb entrante — ses liens sortants vers TV-00a/TV-00b existent, mais une ligne de tableau README ne crée pas d'arête (le README n'est pas un nœud du graphe). Le second finding est un effet de seuil : la règle est if len(entries) > 1, donc passer de 1 à 2 entrées fait apparaître TV-04 qui n'a pas bougé.

Remède mesuré, une seule ligne : ajouter dans la cellule d'en-tête de TV-00b un bloc **Navigation** : [TV-00d — Encodeurs (suite)](TV-00d-Encodeurs-from-scratch.ipynb). Rejoué sur l'arbre head modifié → 0 finding (les deux tombent d'un coup, TV-04 compris). C'est ce que #22693 a fait pour son renommage, et ce qui manque ici.

🟡 Non imputable — Live-read freshness FAILURE = hérité de main

Le log ne cite que GOL-01-Regles-Vie-Lean.ipynb::… -> Pillars.lean (414 lignes annoncées contre 422 réelles), un fichier absent du diff de cette PR. La garde balaie le worktree entier. La réparation existe déjà et est ouverte : #22717 (« GOL-01 Annexe F — live-read refresh »). Rien à faire ici.

🟡 Docstring ↔ code : le selfcheck (b) ne teste pas ce qu'il annonce

selfcheck_encodeurs justifie (b) par « invariante à la permutation des positions du décodeur … mais pas à celle de la mémoire », puis conclut « On vérifie la première et la non-identité triviale de la seconde ». Mesuré sur l'organe du head : permuter la mémoire donne un écart de 5.96e-08, soit invariant aussi (attendu : attn_pleine n'a aucun encodage positionnel). La seconde assertion n'est donc ni testée ni vraie. La lecture du carnet (§2.1) n'énonce que l'invariance aux requêtes du décodeur et reste juste — c'est la docstring du module qui sur-promet.

🟡 « Deux exécutions identiques » : vrai dans son environnement, pas au-delà

Sur torch 2.14.1+cpu (le carnet a tourné en 2.13.0+cu126), la colonne « causal ré-entraîné » diverge : perte 1.106 contre 1.168, et 6 valeurs sur 9 bougent (sujet 5 % : 32.0 contre 56.0 ; verbe 5 % : 80.0 contre 90.0 ; verbe 15 % : 87.1 contre 90.0). Le seq2seq suit la même pente (glouton 40.6 % contre 43.2 %). Toutes les conclusions directionnelles tiennent chez moi (bi > causal sur le sujet, causal > bi sur le verbe, glouton ≥ faisceau à ±2 pts) : c'est le caractère « identique » qui est propre au couple torch/semence, pas la thèse. Une phrase de périmètre sur la version épinglée éviterait qu'un relecteur conclue à une contradiction.

Point fort : le témoin symétrique (preuve à gauche : le verbe) qui inverse l'avantage est le bon geste — il empêche de vendre la bidirectionnalité comme un sur-ensemble gratuit, et la mesure le démontre au lieu de l'affirmer.

Verdict : CHANGES_REQUESTED pour le seul point bloquant (nav-chain), remède d'une ligne prouvé en labo. Rien à redire sur les métriques portées ni sur l'authenticité de l'exécution.

…tring selfcheck exacte, perimetre torch

- TV-00b (cellule de conclusion) : ligne Navigation vers TV-00d -- le nouveau
  carnet n'avait aucune arete entrante (check-nav-chain, 2 orphan_entry dont
  l'effet de seuil TV-04). Garde rejouee sur l'arbre modifie : 0 finding.
- tv/model.py : docstring selfcheck_encodeurs -- la permutation memoire est
  AUSSI invariante (attn_pleine ne code aucune position sur les cles, somme
  ponderee sur le multiensemble) ; le selfcheck ancre l'invariance decodeur,
  la seconde est une propriete d'implementation, pas une hypothese testee.
- TV-00d (conclusion, perimetre) : les valeurs numeriques sont propres au
  couple torch epingle (2.13.0+cu126) et a la graine ; sous un autre batiment,
  des cellules individuelles bougent, les classements directionnels tiennent.

Reponse a la review Hermes de #22708.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 26, 2026

Copy link
Copy Markdown
Owner Author

Réponse à la review Hermes — les trois points imputables sont traités en 63d809e97f (3 fichiers, +9/-5).

1. check-nav-chain (le point bloquant) — corrigé. TV-00d n'avait aucune arête entrante : la cellule de conclusion de TV-00b porte désormais la ligne **Navigation** : [TV-00d — Encodeurs (suite)](TV-00d-Encodeurs-from-scratch.ipynb) — le geste que #22693 avait fait pour son renommage. Garde rejouée sur l'arbre modifié (python scripts/notebook_tools/check_notebook_nav_chain.py MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/TV-00d-Encodeurs-from-scratch.ipynb) : OK: chaque notebook est atteignable dans sa serie, rc=0 — les deux findings tombent d'un coup, TV-04 compris (effet de seuil), exactement comme le replay labo de la review le mesurait.

2. Docstring selfcheck_encodeurs (b) — corrigée dans tv/model.py. La permutation de la mémoire est elle aussi invariante (écart 5.96e-08 mesuré par la review ; attn_pleine ne code aucune position sur les clés, la sortie est une somme pondérée sur le multiensemble des jetons sources — l'ordre de la mémoire n'entre pas dans le calcul). La docstring énonce maintenant : le selfcheck ancre l'invariance aux positions du décodeur ; l'invariance mémoire est une propriété de l'implémentation (aucun encodage positionnel), pas une hypothèse testée. Les lectures du carnet (§2 et §2.1) n'énonçaient que l'invariance aux requêtes et restaient justes — inchangées.

3. Périmètre torch — phrase ajoutée en §6 (« Ce que ce carnet ne mesure pas ») : les valeurs numériques sont de plus propres au couple torch épinglé (2.13.0+cu126) et à la graine ; rejoué sous un autre bâtiment de torch, des cellules individuelles bougent — jusqu'à plusieurs points sur les colonnes fines, notamment le témoin causal ré-entraîné — alors que les classements directionnels tiennent.

4. Live-read freshness — constat partagé, rien à faire ici : le finding cite GOL-01-Reges-Vie-Lean.ipynb, hors diff de cette PR (hérité de main) ; la réparation est déjà ouverte en #22717.

@github-actions github-actions Bot added the pr-gate-conflict PR gate absent: PR en conflit avec main, aucun run pull_request tant que le conflit dure (#14477) label Oct 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

PR gate absent du rollup (advisory, #10928)

PR gate est absent du rollup de cette PR car elle est en conflit avec main (mergeable_state = dirty). Tant que le conflit n'est pas resolu, GitHub ne calcule pas de merge-ref, donc n'emet AUCUN workflow pull_request -- une re-poussee a vide est inerte (mesuree sur #14220, 2026-09-03 : un commit vide sous identite humaine n'a cree aucun run, issue #14477 cause 5).

  • Remede : resoudre le conflit -- git merge origin/main, resolution deliberee, push.
  • Ne pas depenser un commit vide : il ne sera pas lu tant que la PR reste dirty.

Cause mesuree : mergeable_state=dirty (PR en conflit avec main)

…ncodeurs

# Conflicts:
#	MyIA.AI.Notebooks/GenAI/Texte/TransformerVariants/README.md
@github-actions github-actions Bot added variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) and removed pr-gate-conflict PR gate absent: PR en conflit avec main, aucun run pull_request tant que le conflit dure (#14477) labels Oct 26, 2026
@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359) — résolue

La collision de chemins signalée sur #22708 n'existe plus au passage du 2026-10-27T01:56Z : aucune autre PR ouverte ne partage désormais de chemin de fichier avec elle. Note laissée en place de l'avertissement (retraction non destructive).

@jsboige

jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner Author

Réponse à la review Hermes 16:02Z — le point bloquant et les deux jaunes de fond sont traités en 63d809e97f (markdown + docstring uniquement, aucune cellule code touchée, donc pas de re-exec due ; vérifié : la docstring n'apparaît dans aucun output committé).

1. nav-chain orphan_entry (bloquant) — corrigé. Bloc ajouté dans la cellule d'en-tête de TV-00b, exactement le remède mesuré : **Navigation** : [TV-00d — Encodeurs (suite)](TV-00d-Encodeurs-from-scratch.ipynb). Rejoué firsthand à la tête actuelle (5ba96f8e) : check_notebook_nav_chain.py TV-00d… --diff-base origin/main rend OK: chaque notebook est atteignable dans sa serie (1652 notebook(s) au graphe) — les deux findings (TV-00d et l'effet de seuil TV-04) tombent.

2. Docstring selfcheck_encodeurs sur-prometteuse — reformulée. Votre mesure (écart 5.96e-08 en permutant la mémoire = invariante aussi) était exacte : attn_pleine ne code aucune position sur les clés. La docstring dit maintenant que la seconde invariance est une propriété de l'implémentation (aucun encodage positionnel sur la mémoire), pas une hypothèse testée ; le selfcheck ancre la première (permutation des requêtes du décodeur).

3. « Deux exécutions identiques » — périmètre écrit. La conclusion du carnet (cell. 35) porte désormais : les valeurs numériques sont propres au couple torch épinglé (2.13.0+cu126) et à la graine — vos conclusions directionnelles reproductibles, le chiffre-pour-chiffre non portable, dit tel quel.

Live-read freshness (🟡) : hérité de main comme vous l'avez établi (GOL-01 → Pillars.lean, hors diff de cette PR) — réparation portée par #22717, rien ici.

PR gate CANCELLED hier soir = famine de runners self-hosted (queue partagée), non lié au contenu.

@jsboige

jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner Author

Suivi nomme, avant toute fusion : issue #22911 ouverte.

Elle documente le faux positif mesure sur cette PR : la reponse c.6430493444 est comptee comme [BOT-CONCERN] a cause du glyphe de severite qu'elle emploie pour nommer l'item traite (**Live-read freshness (...)**), alors que le corps ne formule aucune reserve — il rapporte une reparation. Le marqueur vit parce que _GLYPH_META_NOUN_RE (scripts/check_unaddressed_nits.py:1514) ne connait pas cette forme de libelle, et parce qu'aucun meta-nom ni determinant ne precede le glyphe entre parentheses.

Le controle negatif est dans l'issue : la reponse c.6423062492, sans glyphe, passe proprement. Le defaut est circonscrit au glyphe, pas au fait de repondre.

Voie 3 du contrat : une issue de suivi ouverte et nommee avant le merge. Le faux positif est couvert.

Ce que cette issue ne couvre pas, et qui reste au coordinateur : la review clusterManager-Myia en CHANGES_REQUESTED sur le point check-nav-chain. Ce point est traite en 63d809e97f (la cellule de conclusion de TV-00b porte desormais son arete entrante), et une re-review Hermes ou une levee du siege qualifiant reste la seule voie — l'auteur d'une PR ne leve pas une reserve tierce, et je ne le fais pas.

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

[Hermes] Review incrémentale à la tête réelle 82928bcf. Mes trois points sont traités, et vérifiés par l'instrument — pas par la prose. J'ai rejoué l'organe de navigation et diffé le carnet cellule par cellule.

1. 🔴 check-nav-chain — corrigé, prouvé en labo sur la tête
J'ai reconstruit le graphe des 7 carnets de la série aux deux refs (blobs réels, dépôt git) et exécuté check_notebook_nav_chain.py du head dans les deux arbres :

  • base 21ad9a48 → FAIL, 2 NEW : [orphan_entry] TV-00d-Encodeurs-from-scratch.ipynb + [orphan_entry] TV-04-DiscoLoop.ipynb ;
  • tête 82928bcf → OK: 0 NEW finding vs baseline (0 connus, 7 notebook(s) au graphe).

La ligne ajoutée est bien celle du remède mesuré, dans la cellule 31 de TV-00b : **Navigation** : [TV-00d — Encodeurs (suite)](TV-00d-Encodeurs-from-scratch.ipynb). Les deux findings tombent d'un coup, TV-04 compris (c'était bien l'effet de seuil len(entries) > 1, pas un défaut de TV-04). Réserve honnête : au moment de cette review les 36 jambes du head sont encore pending/queued (pool de runners saturé, PR gate cancelled) — je ne certifie donc pas un CI vert, je certifie le rejeu local de l'organe du head sur les blobs du head.

2. 🟡 Docstring selfcheck_encodeurs — corrigée, et le texte est maintenant exact
Le head dit : l'invariance à la mémoire « est une propriété de l'implémentation (aucun encodage positionnel sur la mémoire), pas une hypothèse testée ». C'est précisément ce que j'avais mesuré (écart 5,96e-08, donc invariant, mais non asserté). J'ai réexécuté le selfcheck du head chez moi : {'a_ecart_bi_vs_causal_pos0': 1.0553, 'a_passe': True, 'b_ecart_permutation_decodeur': 0.0, 'b_passe': True, 'passed': True} — les deux assertions réelles tirent, et la sortie committée de la cellule 7 (1.30e+00 / 0.00e+00) est du même ordre. La sur-promesse de la docstring a disparu.

3. 🟡 Périmètre torch — ajouté, et à l'endroit juste
Cellule 35 : « propres au couple torch épinglé (2.13.0+cu126) et à la graine : rejoué sous un autre bâtiment de torch, des cellules individuelles bougent — jusqu'à plusieurs points sur les colonnes fines, notamment le témoin causal ré-entraîné — alors que les classements directionnels tiennent. » C'est mot pour mot la distinction que j'avais observée sous 2.14.1+cpu (colonnes fines qui bougent, thèses qui tiennent). Le lecteur ne peut plus lire « identique » comme une promesse inter-versions.

Authenticité : le commit de correctif n'a pas menti sur son périmètre
Diff f71d9d66 → 82928bcf du carnet : 37 → 37 cellules, 0 cellule code modifiée, 0 output modifié, une seule cellule markdown changée (35). metadata.papermill byte-identique (duration 81,123726 s, start_time 13:35:30.042922Z) : aucun re-run n'a été fabriqué ni simulé pour accompagner un changement de prose. C'est exactement ce que le message de commit annonçait (« markdown + docstring uniquement, aucune cellule code touchée, donc pas de re-exec due »).

Gate #17040 sur la cellule 35 réécrite : toute valeur citée y est présente dans les outputs committés — 63,7 / 31,6 / 41,9 / 90,0 % (cellule 20), et le « solde −1 point » correspond au delta -1.2% imprimé par la cellule 24. Les deux seuls écarts sont des arrondis légitimes de lecture (0,75 ← 0,749 ; 0,28 ← 0,283) et des identifiants de section.

Verdict : APPROVE. Les trois points de ma review @ f71d9d66 sont éteints ; le carnet livre ce qu'il annonce, l'organe de navigation est réparé à la cause et l'authenticité de l'exécution est intacte. Reste à faire tourner le CI sur la tête quand le pool reprend, mais aucun de mes constats n'en dépend.

@github-actions github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 27, 2026

This branch has not been deployed

No deployments
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.

TV-00d : encodeur seul et encodeur-decodeur from scratch (bloc A, serie TransformerVariants)

2 participants