Repository navigation
fix(z3,#18519): garde-fou de completude du corpus RecipeML C# + cache reconstruit - #19932
Conversation
…he reconstruit sur corpus complet Le carnet 07 (C#) ne verifiait que l'EXISTENCE du dossier RecipeML (`Directory.Exists`) : un corpus tronque passait pour complet et le cache derive etait ecrit quand meme. Le telechargement Wayback refuse parfois des batches, et `download_meal_data.py` les ignore en silence en concluant [ok] -- mesure du 2026-10-08 : 89/110 batches portant des XML a la premiere passe, `[ok] RecipeML -> 8888 recettes` imprime quand meme. Deux consequences mesurees : 1. le cache epingle (#8901) etait construit sur un corpus tronque : 8286 recettes brutes / 3717 solveur-usables, la ou le corpus complet en donne 10850 / 4934 ; 2. l'ensemble des titres epingles n'est le PREFIXE d'aucun decoupage du corpus (aucun N tel que les N premiers batches contiennent les 3351 titres) -- il n'est donc reproductible par aucune procedure declaree, ce qui vide le pin de son sens. Geste : miroir du garde-fou du jumeau Python Z3-16b (#18520) -- comptage des batches PORTANT des XML, pin declare (`RML_BATCHES_PIN = 110`), refus explicite sous le pin avec le geste de reprise. Le cache est reconstruit sur le corpus complet et les consommateurs 08/09 re-executes (C.2/C.3) : leurs sorties citaient les chiffres de l'ancien cache (418 Ko, 8286 brutes, R=3717). Diagnostic derive (C.4) : cause (d), dependance de donnees mise a jour -- le corpus mesure aujourd'hui est complet la ou celui du pin etait tronque ; les sorties des trois carnets changent en consequence (555 Ko, 10850 brutes, R=4934). Aucune cellule source de 08/09 n'est modifiee : seule leur execution suit le cache. See #18519
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
Golden-Set Execution (H.7 P3)✅ 9/9 notebooks passed (certified reproducible)
Pinned lockfile: |
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
|
Scope = notebooks CHANGED in this PR, not the whole corpus. The |
|
✅ 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 |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
|
Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine. Le label Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans Seuil, historique et exceptions : cf. |
…STALE_BLOCK) Le bloc top-level decrivait le run du 2026-07-01 (duration 13.8s) alors que la PR a change les outputs/execution_count (corpus RecipeML complet) : le ratchet le classait STALE_BLOCK REGRESSION. Retrait du bloc, remede prevu par l'organe, meme etat final que les siblings 08/09 (BLOCK_REMOVED) -- rejeu local : regressions 0, rc 0. Chirurgie 12 deletions, 0 insertion, aucune cellule touchee, metadata final = kernelspec + language_info. See #19932 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
[ADJOINT PREFLIGHT] |
|
[ADJOINT PREFLIGHT] Dossier de domaine — PR #19932 (
|
| Carnet | kernel | cellules code | execution_count nul |
outputs vides | sorties error |
motifs C.1 |
|---|---|---|---|---|---|---|
| 07 | .net-csharp (C# 13.0) |
10 | 0 | 0 | 0 | 0 |
| 08 | .net-csharp (C# 13.0) |
14 | 0 | 0 | 0 | 0 |
| 09 | .net-csharp (C# 13.0) |
14 | 0 | 0 | 0 | 0 |
execution_count suit exactement 1..10 / 1..14 / 1..14, sans trou. Aucun raise NotImplementedError / assert False / 1/0. Les cellules d'exercice gardent un unique output (le message d'invite), ce qui est le comportement attendu d'un stub conforme.
3. L'artefact epingle est coherent avec ce que le body revendique
Le PR reecrit l'artefact epingle (#8901). Compteurs internes du JSON committe, lus des deux cotes :
main (pin du 2026-10-01) |
tete du PR | |
|---|---|---|
n_total |
8 286 | 10 850 |
n_usable |
3 717 | 4 934 |
len(recipes) |
3 717 | 4 934 |
| taille | 428 211 o (418 Ko) | 568 597 o (555 Ko) |
Les quatre nombres de chaque colonne sont exactement ceux du tableau du body, n_usable == len(recipes) des deux cotes, et les tailles tombent sur les 418 Ko / 555 Ko annonces.
4. La garde de completude : positive ET negative, exercee en .NET reel
Le predicat de la cellule 3 de 07 est copie verbatim dans un banc C# (dotnet SDK 10.0.400, cible net9.0) et exerce sur des corpus synthetiques, en differentiel contre l'ancien predicat (Directory.Exists) :
| cas | ancien predicat | nRml/pin |
nouveau predicat | attendu |
|---|---|---|---|---|
| complet : 110 dossiers, 110 XML | True | 110/110 | PASSE | PASSE |
| tronque XML : 110 dossiers, 21 XML | True | 21/110 | REFUSE | REFUSE |
| tronque en taille : 21 dossiers, 21 XML | True | 21/110 | REFUSE | REFUSE |
RecipeML absent |
False | 0/110 | REFUSE | REFUSE |
Ciqual absent (110/110 XML) |
True | 110/110 | REFUSE | REFUSE |
Divergences au modele attendu : 0/5. La troisieme ligne est le defaut meme que le PR corrige : un dossier present suffisait a l'ancien predicat, qui laissait donc ecrire le cache epingle sur un corpus tronque ; le nouveau compte les batches portant des XML et refuse sous le pin 110. La premiere ligne est le contre-temoin : sur un corpus sain, la garde ne refuse pas — le predicat n'est pas un refus permanent.
5. Perimetre et gouvernance
diff-files: 4 / +401 / -373 : les trois carnets cites par le body plus l'artefact derive qu'ils produisent — aucune fuite de perimetre, aucun fichier hors sujet. Le PR ne modifie aucune cellule source de 08/09 (leur changement est une consequence d'execution du cache, ce que le body declare explicitement en C.4 avec la cause « (d) dependance de donnees mise a jour »).
6. Limite de ce dossier
Je n'ai pas re-execute les carnets moi-meme : la verification d'execution porte sur les sorties committees (coherence execution_count/outputs/erreurs) et sur la coherence de l'artefact, pas sur une re-execution independante des 3 900 s de solveur. La garde, elle, est exercee pour de bon (banc C# ci-dessus). Le dossier atteste donc ce que j'ai mesure ; il ne se substitue pas au gate H.4 de la PR.
Grain: DEEP/notebook-dotnet — lane myia-po-2024:CoursIA — prev: LIGHT/tooling #19790
Ce que la PR fait
Le carnet 07 (C#) acceptait n'importe quel corpus RecipeML : sa cellule 3 ne testait que
Directory.Exists(Path.Combine(BASE, "RecipeML")). Un corpus tronque passait donc pour complet,et le cache derive — un artefact epingle (#8901) — etait ecrit quand meme.
Le defaut n'est pas theorique : il s'est produit pendant cette session.
download_meal_data.pya refuse 21 batches sur 110 (
WinError 10061, Wayback) et a conclu[ok] RecipeML -> 8888 recettes— les batches manquants sont ignores en silence.C'est le defaut que #18520 a corrige sur le jumeau Python
Z3-16b(cellule 1), dont le messagede commit dit : « un corpus tronque (Wayback refusant des batches, ignores en silence) passait
pour complet ». Le port C# n'avait pas recu ce garde-fou.
Ce qui est mesure
(N = 1..110) ne contient les 3 351 titres epingles : le corpus de 2026-10-01 etait un
sous-ensemble arbitraire (les batches que Wayback servait alors), pas un sous-ensemble
declare comme le
--recipeml-limit 15du jumeau Python.Le geste
sa completude), pin declare
RML_BATCHES_PIN = 110, refus explicite sous le pin avec le gestede reprise.
l'original etant irrecuperable.
(418 Ko, 8 286 brutes, R=3 717).
Diagnostic derive (C.4)
Cause (d) — dependance de donnees mise a jour. Le corpus mesure aujourd'hui est complet la
ou celui du pin etait tronque. Aucune cellule source de 08/09 n'est modifiee : seule leur
execution suit le cache. Les sorties des trois carnets changent en consequence.
Verification
jupyter nbconvert --execute(kernel.net-csharp), rc=0execution_countnul : 0 · erreurs : 0 · bannerprobeAddresses: retire (post-traitement .NET)Residuel
RML_BATCHES_PIN = 15, serie Z3-API) reste intact : cette PR netouche pas la serie Z3-API. La parite des deux caches n'est pas retablie — elle ne l'a jamais
ete, les deux corpus etant distincts.
See #18519(partiel) : la moitie Python de l'issue etait deja livree (fix(z3,#18519): re-execute Z3-16c au cache mealplan deterministe (#17869) #19202/fix(z3,#18519): re-execute Z3-16d au cache mealplan deterministe (#17869) #19205/fix(z3,#18519): re-execute Z3-16e au cache mealplan deterministe (#17869) #19206) ;ceci couvre la moitie C#.
🤖 Generated with Claude Code