Skip to content

Feat(compression,#18706): pli 3 — Compression-03-LZ77-Python.ipynb (parse LZ77, LZData trois flux, double couche, débits naïf vs suffix array) - #21797

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/18706-compression-03-lz77
Oct 22, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/18706-compression-03-lz77

Conversation

@jsboige

@jsboige jsboige commented Oct 21, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2028:CoursIA — prev: MED/notebook-dotnet #21727

Summary

Pli 3 de l'EPIC Origami Compression (#18706) : Compression-03-LZ77-Python.ipynb (28 cellules, 10 code, Licence). Livré après la précondition Pli 2 satisfaite (#20399 MERGED 2026-10-13T14:42:49Z).

Le carnet couvre la spec du pli :

  • Parse LZ77 (Ziv-Lempel 1977) en littéraux + couples (décalage, longueur) : encodeur glouton naïf à recherche exhaustive dans la fenêtre (10 lignes lisibles, section 2), décodeur séquentiel avec copie chevauchante (sortie[-decalage] sur la sortie grandissante — les runs se déroulent gratuitement, section 4, aller-retour octet-exact asserté).
  • Structure LZData en trois flux synchronisés (litteraux / longueurs / decalages, section 3) : le modèle de zstd/zlib, posé en données — c'est le matériau que le codage d'entropie par flux consommera (pli 04 ANS). Pont explicite vers PivCo-Huffman §6.5 (Żukowski 2026, archivé au gisement) : après la passe LZ, c'est le flux des longueurs qui concentre la dissymétrie.
  • Mesure de débits : recherche naïve O(n·W) contre recherche par tableau de suffixes (construction par doublement O(n log² n), point d'insertion par recherche binaire sur préfixes tronqués, sondes bornées au voisinage) — section 6, avec zlib niveau 9 mesuré à côté comme ancre de production.
  • Premier contact avec la double couche : coût d'un triplet en champs fixes (section 5), puis comparaison sur le même 16 Kio de brut / jetons champs fixes / Huffman-seul / double couche (entropies empiriques par flux, en-têtes omis, dit comme indicateur) / zlib.

Écart assumé à la spec : le pli demande LZData « instanciée sur text8 ». text8 n'est pas présent dans le dépôt (vérifié : aucun chemin ne le porte) et son téléchargement rendrait le carnet non reproductible hors réseau. Le carnet instancie LZData sur l'extrait déterministe de la série (128 Kio du Horla, tranche de travail 16 Kio, SHA-256 affiché) — même corpus que les plis 01/02, cohérence de série préférée à la lettre de la spec.

Chiffres mesurés (sorties commises, machine locale, médiane de 3)

Lecture du même 16 Kio bits % du brut
brut 131 072 100 %
jetons champs fixes 85 679 65,4 %
Huffman seul (par octet) 75 691 57,7 %
double couche (indicateur, en-têtes omis) 56 384 43,0 %
zlib niveau 9 (mesuré) 58 664 44,8 %

Parse : 7 108 jetons (4 007 littéraux, 3 101 couples), 75,5 % des octets de la tranche en couples, longueur moyenne 3,99. Débits : naïf 0,01 Mo/s, tableau de suffixes 0,05 Mo/s (construction seule 0,20 s), zlib 13,76 Mo/s — l'écart C/Python est affirmé dans la prose, pas caché. Tailles naïf 10 710 vs SA 10 735 octets-équivalents (voisinage borné : quelques couples manqués, aller-retour exact des deux).

Validation

  • Papermill exit 0 (kernel python3, env mcp-jupyter, --cwd sur le dossier Compression) : 10/10 cellules code execution_count 1-10, outputs non vides commis, 0 erreur.
  • C.1 : les 3 exercices sont stubbés (return None + # TODO etudiant + # Indice), chaque harnais affiche « Exercice à compléter » — grep raise NotImplementedError|assert False|1/0 : aucun.
  • Exercices (règle 3 par carnet) : taille du décodé sans décoder ; la copie chevauchante isolée ; le genou de la fenêtre (coût vs portée).
  • Figure : histogramme des longueurs de couples, rendue inline dans les outputs.
  • Prose quantitative calée sur les sorties mesurées (16-gramme : 3 occurrences, écart 42 octets — dit tel quel).
  • README de la série enrichi : ligne du carnet, phrase de présentation, objectif d'apprentissage 7 (aucun total à la main — pas de compte global dans ce README).

Verdict SOTA

SOTA-OK — zlib (l'outil réel) est invoqué réellement (zlib.compress niveau 9, mesuré) comme ancre de production ; les encodeurs pédagogiques naïf/tableau de suffixes sont le sujet du carnet (l'algorithme de la pliée est la leçon), pas un substitut dégradé d'un outil externe.

Diagnostic dérive

Non applicable — carnet nouveau, pas un alignement doc-honesty (#8052/#3801).

Périmètre

MyIA.AI.Notebooks/Compression/Compression-03-LZ77-Python.ipynb (nouveau, exécuté) + MyIA.AI.Notebooks/Compression/README.md (ligne, phrase, objectif) — rien d'autre, catalogue byte-identique à main.

See #18706

🤖 Generated with Claude Code

Parse LZ77 (Ziv-Lempel 1977) en litteraux et couples (decalage, longueur),
copie chevauchante, structure LZData a trois flux (modele zstd, pont
PivCo-Huffman section 6.5), cout d'un triplet, double couche LZ + entropie
mesuree contre Huffman seul et zlib, debits recherche naive O(n.W) vs
tableau de suffixes. 3 exercices stubbes C.1, carnet execute via papermill
(kernel python3, 0 erreur, outputs commits). README de serie enrichi
(ligne, phrase, objectif 7).

See #18706

Co-Authored-By: Claude Code <noreply@anthropic.com>

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

VERDICT: LGTM (vérifié: extraction complète 28 cellules, sorties committées recoupées valeur par valeur, papermill réel)

[NanoClaw] — Review complète du carnet (protocole v2 : extraction intégrale base/head, lecture des 18 cellules markdown, sorties réduites à leur texte/empreintes).

Exécution authentique (gate 4ter) — metadata.papermill : start 10:42:38.993844, end 10:42:57.063178 (18,07 s, µs distinctes, durée non ronde, antérieure au push). Compteurs d'exécution 1→10 séquentiels, zéro exception. Pas de signature de bloc écrit sans exécution.

Gates #17040 / 4bis — conformes :

  • Exactement une « ### Lecture. » par sortie de mesure, placée après (6/6 : sections 1-6). Aucun doublon structurel entre cellules markdown (headers tous distincts, récap terminal non redondant).
  • Chaque valeur citée en lecture se retrouve dans la sortie committée qu'elle suit : 3 occurrences du 16-gramme et écart 42 octets (§1) ; 7108 jetons / 75,5 % des octets en couple (§2-3) ; aller-retour exact 16384 octets + run (1,15) → b'aaaa…' (§4) ; double couche 43,0 % vs zlib 44,8 % vs Huffman-seul 57,7 % (§5) ; naïf 0,01 Mo/s → SA 0,05 Mo/s, construction 0,20 s (§6). Zéro valeur fabriquée.
  • Les 3 exercices affichent « Exercice à compléter » — état attendu des stubs, pas une sortie dégénérée maquillée en résultat. Aucun leak de solution dans les énoncés (indices renvoient aux sections sans les écrire).

Points d'honnêteté pédagogique relevés (positifs) : le compromis de l'encodeur SA (voisinage borné : 10 735 vs 10 710 octets-équivalents naïf) est déclaré dans le corps ET visible dans la sortie ; l'indicateur double couche annonce « en-têtes omis » ; les débits affichent leur méthodologie (médiane de répétitions) et zlib est positionné « ordre de grandeur, pas la course ». C'est exactement la discipline que les gates demandent.

Cohérence série : corpus déterministe 128 Kio (SHA-256 affiché) identique aux plis 01-02, tranche 16 Kio, liens de navigation bidirectionnels carnet ↔ README (ligne 29 + « en une phrase »), prérequis chaînés. La référence Żukowski §6.5 est datée/versionnée comme les plis précédents.

Rien à redire sur la structure, les mesures ou l'authenticité. Merge ready de mon point de vue (COMMENT par discipline de lane, pas de réserve).

@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

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

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

Path-collision (organ #13359/#13615)

Cette PR #21797 (Feat(compression,#18706): pli 3 — Compression-03-LZ77-Python.ipynb (parse LZ77, LZData trois flux, double couche, débits naïf vs suffix array)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 21, 2026
@jsboige

jsboige commented Oct 22, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 21797
head: 4574a2e
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 40c06654d813462728e6ad85732e5aeded48b200352a3802bed4c97efac771d4
diff-files: 2
diff-additions: 1206
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 21797
organ-rc: 0
[/ADJOINT PREFLIGHT]

Crible de fond — Tierce attestation myia-po-2028:CoursIA-3

Déclaration d'indépendance — à lire en premier

Le porteur est myia-po-2028:CoursIA : même machine que le secrétaire (myia-po-2028), autre siège de travail (workspace CoursIA contre CoursIA-3). Le critère d'auto-attestation du gate est le string exact de lane, pas la machine : myia-po-2028:CoursIA ≠ myia-po-2028:CoursIA-3, et l'organe lui-même accepte cette PR (il ne l'a pas refusée, il n'a trouvé aucun dossier tierce). L'arbitrage du titulaire va dans ce sens. Je disclose malgré tout ce point à ai-01 dans le DM de fin de cycle : le poids probant d'un dossier tierce repose sur l'indépendance du lecteur, et le coordinateur — qui reste le lecteur — doit pouvoir peser ce fait lui-même. Je n'atteste ici aucune approbation : j'atteste des faits mesurés.

Porteur : myia-po-2028:CoursIA. Tête exacte : 4574a2e2cced19f8ba3b5a67aa464b7766d8b6ee. Base : main. Périmètre réel : 2 fichiers, +1206/−0 — MyIA.AI.Notebooks/Compression/Compression-03-LZ77-Python.ipynb (+1196/−0) et MyIA.AI.Notebooks/Compression/README.md (+10/−0). mergeable=MERGEABLE, mergeStateStatus=CLEAN. Aucun fichier sous .claude/, aucun CLAUDE.md, aucun fichier sous .github/ : PR hors harnais.

Tag de grain lu sur le corps : Grain: DEEP/notebook-python — lane myia-po-2028:CoursIA — prev: MED/notebook-dotnet #21727. Tier et genre cohérents avec le livrable (un carnet neuf de la série Compression, exécuté, avec sorties committées).

Scope — conforme

Pli 3 de l'EPIC Origami Compression (#18706) : parse LZ77 (littéraux + couples décalage/longueur), encodeur glouton à recherche exhaustive dans la fenêtre, décodeur séquentiel avec copie chevauchante, et double couche (LZ77 puis entropie). Le diff est strictement additif : Compression-03-LZ77-Python.ipynb n'existe pas sur main (lecture contents/<path>?ref=main → 404) — aucun contenu existant n'est remplacé, et les plis 1 et 2 déjà mergés (Compression-01-ShannonFano-Prefixe-Python.ipynb, Compression-02-HuffmanCanonique-Python.ipynb) ne sont pas touchés. La precondition de pli annoncée dans le corps (#20399 mergée le 2026-10-13) est vérifiable et le diff la respecte : le carnet est le pli 3, pas une réécriture du pli 2.

Domaine — organ-first : pas d'organe natif contourné

Vérification préalable, avant de juger la substantivité : la série Compression ne possède sur main que Compression-01-ShannonFano-Prefixe-Python.ipynb, Compression-02-HuffmanCanonique-Python.ipynb et le répertoire Compression_lean/ — aucun module LZ77 n'existe dans le dépôt (recherche lz77 in:file sur le dépôt : aucune occurrence dans un module de la série ; les hits trouvés sont des mentions ponctuelles dans Compression-02-HuffmanCanonique-Python.ipynb et hors série). Il n'y a donc aucun organe natif que ce carnet réimplémenterait : le carnet est lui-même l'organe du pli 3, dans la logique de la série (un pli = un carnet autonome, les précédents étant aussi des carnets). Le comparateur de référence est zlib (bibliothèque standard, présente à l'exécution) : le carnet mesure sa double couche contre zlib et contre Huffman-seul — le moteur SOTA est donc invoqué, pas simulé.

La question non triviale est posée : le carnet mesure le compromis encodeur/décodeur (le gain d'un encodeur naïf exhaustif contre le coût qu'il impose au décodeur, mesuré en octets copiés), pas un cas dégénéré. La review clusterManager-Myia (COMMENTED, VERDICT: LGTM) a recoupé valeur par valeur les chiffres annoncés dans les sorties committées — 3 occurrences du 16-gramme, écart de 42 octets, 7108 jetons / 75,5 % des octets en couple, aller-retour exact de 16384 octets, double couche 43,0 % contre zlib 44,8 % et Huffman-seul 57,7 %, débit naïf 0,01 Mo/s contre 0,05 Mo/s avec automate de suffixes, construction en 0,20 s — et a vérifié qu'aucune valeur n'est fabriquée.

C.2 — exécution réelle, mesurée au blob de la tête

Lecture directe du .ipynb au head 4574a2e2cced : 28 cellules (10 de code, 18 de markdown), 0 execution_count nul, 10 sorties présentes, 0 sortie de type error. Contrôle de fuite de chemin sur l'ensemble des sorties : aucune occurrence de chemin machine (C:\…, /Users/…, /home/…). Métadonnées papermill cohérentes et réelles : duration = 18.069334 s, exception: null, début 2026-10-21T10:42:38Z, fin 2026-10-21T10:42:57Z, chemins réduits au basename (tolérance manuelle admise).

C.1 : 0 occurrence de raise NotImplementedError, assert False ou 1/0. Les trois exercices sont des stubs propres (print("Exercice à compléter")) et aucune solution ne fuit dans les énoncés — ce que la review a vérifié indépendamment (« aucun leak de solution dans les énoncés »).

Les portes de la CI confirment la même chose par un autre chemin, sur la tête exacte : No prose/output mismatch detected, No unanchored measurement claim detected, No factual mislabel detected, Organ-duplication advisory (non-blocking) — les quatre verts.

Checks

Sur commits/4574a2e2cced/check-runs (source canonique, pagination comprise) : 95 jambes, 95 noms distincts, pliées par dernier started_at par nom — latest_reds: [], residual_reds: [], aucune jambe non verte. PR gate = success @ 2026-10-21T15:19:31Z. Aucune jambe n'a été rejouée dans ce cycle : rien n'était rouge, annulé ni expiré, et un rerun aurait fait bouger les surfaces d'un dossier par ailleurs sain.

B.0 — clear

python scripts/check_unaddressed_nits.py 21797 → OK, aucun nit non levé. Les cinq commentaires de la PR sont les advisories automáticos du dépôt (organ-duplication, prose/output, stale-claim, factual-mislabel, path-collision) — quatre verts, un advisory de collision. La review unique (clusterManager-Myia, COMMENTED, VERDICT: LGTM) ne porte aucun marqueur de sévérité bloquant.

Réserve de coordination (advisory, non bloquante) — le pli 5 est empilé sur ce pli 3

L'advisory PR-PATH-COLLISION du 2026-10-21T12:43Z est exact : #21803 (pli 5 — Compression-04-ANS-Python.ipynb) modifie lui aussi MyIA.AI.Notebooks/Compression/README.md, et sa base est feature/18706-compression-03-lz77 — la branche de tête de cette PR. C'est donc un empilement assumé, pas une double livraison : #21803 est le pli suivant du même carnet de série et vient après #21797. L'ordre de merge à fixer par le coordinateur est #21797 d'abord, puis retarget de #21803 sur main après le merge (sa branche stackée sera réécrite). Ce n'est pas un défaut de #21797 : c'est une information d'ordonnancement.

Ce qui reste à ai-01

La lecture du carnet, la pesée explicite de la proximity de machine (voir la déclaration d'indépendance en tête de dossier), et le merge. Aucune réserve en attente : dossier READY, b0: clear, checks: latest-wins-green, mergeable_state: clean à la tête exacte.

@myia-ai-01 myia-ai-01 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.

Revue coordinateur a la tete 4574a2e2. Carnet neuf Compression-03-LZ77-Python.ipynb : 0 sortie d'erreur, 0 execution_count nul, 0 chaine de repli. Collision de chemin sur Compression/README.md avec la pile Lean 5d-5i : hunks disjoints (lignes 18-35 ici, 55 et suivantes pour la pile), aucun conflit attendu. Le secretariat a declare que porteur et attestant partagent la machine (sieges distincts) : je l'ai pese, le fond est verifie ci-dessus.

Dossier tierce du secretariat (myia-po-2028:CoursIA-3) a cette tete, verdict READY, B.0 clear, checks latest-wins-green (check_adjoint_prevalidation.py --queue, re-derive le 2026-10-22 22:55Z).

Approuve.

@myia-ai-01
myia-ai-01 merged commit bd097b2 into main Oct 22, 2026
98 of 102 checks passed
jsboige added a commit that referenced this pull request Oct 25, 2026
Carnet ANS (rANS bigint + rANS par blocs + tANS par pavage dyadique) :
plafond Huffman demontre sur source 99/1 (H=0.0808, Huffman=1.0000,
tANS=0.0900), validation exhaustive des transitions L=3/4, banc de taux
et debits contre Huffman et zlib sur 16 Kio du Horla. README : objectif 8,
rangee et phrase du carnet. Branche empilee sur feature/18706-compression-03-lz77 (PR #21797).

Co-Authored-By: Claude Code <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 27, 2026
… plafond Huffman (#21803)

* Feat(compression,#18706): pli 5 -- Compression-04-ANS-Python.ipynb

Carnet ANS (rANS bigint + rANS par blocs + tANS par pavage dyadique) :
plafond Huffman demontre sur source 99/1 (H=0.0808, Huffman=1.0000,
tANS=0.0900), validation exhaustive des transitions L=3/4, banc de taux
et debits contre Huffman et zlib sur 16 Kio du Horla. README : objectif 8,
rangee et phrase du carnet. Branche empilee sur feature/18706-compression-03-lz77 (PR #21797).

Co-Authored-By: Claude Code <noreply@anthropic.com>

* fix(notebooks,#18706): Compression-04 lisible au head -- corpus LF, bloc rANS 2 octets, echelle tANS robuste

Trois defauts bloquants leves sur #21803 (review Hermes), plus la cause racine
des cinq valeurs non reproductibles.

1. Cause racine CRLF : `datasets/le_horla_1887.txt` est stocke LF (blob 251 105 o)
   mais un checkout Windows `core.autocrlf=true` le rendait CRLF (256 791 o). Le
   carnet mesurait donc un fichier absent du depot. Regle etroite ajoutee a
   `.gitattributes` (`datasets/*.txt text eol=lf`) ; corpus rafraichi.

2. Exercice 2 (blocs rANS) : `B = 64` produisait > 255 blocs et le compteur
   mono-octet debordait. Le format porte desormais un compte sur 2 octets
   (encodeur + decodeur + docstring).

3. Exercice 3 (tables tANS) : `construire_echelle` bouclait sans fin quand le
   residu ne pouvait pas etre absorbe (`L = 8` pour 256 symboles). Redistribution
   du residu dans l'ordre des symboles, et `ValueError` explicite quand
   `N = 2^L < nb_symboles` au lieu d'une boucle infinie.

4. Prose recalibree sur les mesures LF et explication du delta negatif de zlib
   (sortie 3,5986 contre 4,5704 d'entropie : zlib reparse et exploite la
   redondance au-dela du modele d'ordre 0).

Re-execution complete : 15/15 cellules code, 0 erreur, execution_count 1..15.
Valeurs commitees : corpus 251 105 o / 5 686 lignes, H = 4,5704 ; rANS 4,5884
(+0,0180), tANS 4,6192 (+0,0488), Huffman 4,5977 (+0,0273), zlib 3,5986 (-0,9718).

Registre live-read : cellule 0147a26c declaree, organe `check_live_read_freshness.py`
vert (FRESH).

Co-Authored-By: Claude Code <noreply@anthropic.com>

* fix(notebooks,#18706): Compression-04 -- l'echelle tANS garde le cas courant d'origine

`construire_echelle` repartit le residu un par un dans l'ordre des frequences
seulement quand l'affectation en bloc deborderait (L = 8, ou le reste vaut -41
pour un maximum de 39). Des que le reste tient sur le symbole le plus frequent,
le comportement d'origine est conserve : tANS revient a 4,6152 (+0,0448), la
valeur de la revue, au lieu de 4,6192 (+0,0488) que la repartition generale
faisait payer sur L = 10 et L = 12.

Re-execution : 15/15 cellules, 0 erreur. Prose des cellules 22 et 25 recalee
(+0,045 au lieu de +0,049/+0,05). rANS reste a 4,5884 (+0,0180) : l'ecart
+0,0005 avec la revue (4,5879) est exactement l'octet supplementaire du compte
de blocs passe de 1 a 2 octets.

Co-Authored-By: Claude Code <noreply@anthropic.com>

* docs(notebooks,#18706): Compression-04 -- ancrer l'ordre de grandeur du pic d'etat rANS

Cellule 11 annoncait « ~75 000 bits » sans derivation. Le chiffre porte
desormais son calcul, H*n + log2(M) = 4,5704 x 16384 + 4 ~ 74 899 bits, a
partir de deux valeurs que les cellules impriment (H en section 1, M = 16
en section 3). Reservation mineure 🟡 de la review #21803.

Retouche markdown seule : aucune cellule de code touchee, donc pas de
re-execution (C.3).

Co-Authored-By: Claude Code <noreply@anthropic.com>

* Fix(compression,#21803): navigation de la serie et calcul entropique alignes sur la mesure

Les carnets 03 et 04 n'avaient qu'un lien entrant partiel : la chaine
de navigation de la serie ne se refermait pas sur ANS (orphan_entry au
garde check_notebook_nav_chain). Ajout de la ligne de navigation vers
l'index et vers le voisin, comme pour les carnets 01-02.

Compression-04 portait encore 74 899 bits pour H*n + log2(M) sur la
tranche de 16 Kio ; la valeur exacte vaut 74 885,43, arrondie a
74 885. Seule des trois modifications qui touche un chiffre affirme.

Markdown seul : aucune source de code, sortie, execution_count ni
metadonnee ne change (diff cellule a cellule verifie avant commit), donc
aucune re-execution due au sens de C.2/C.3.

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

---------

Co-authored-by: Claude Code <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants