Repository navigation
Fix(nlp,#13410): NLP-10 -- trois lectures de resultat la ou les sorties n'en avaient aucune - #23776
Conversation
… mesurees Les trois sorties substantielles du carnet n'avaient aucune cellule de lecture : la precision out-of-sample du classifieur from scratch, le cross-check sklearn, et le balayage de alpha. Les trois en ont une desormais, ancree sur les valeurs reellement affichees. Mandat STOP #13410 respecte : aucune lecture n'existait, donc ajout ; jamais une seconde lecture a cote d'une existante. Aucune cellule de code touchee, donc C.2 non due. Les affirmations des lectures ont ete mesurees avant d'etre ecrites : le document mal classe a cinq de ses huit mots hors vocabulaire et les trois mots reconnus pointent ailleurs que vers sa classe ; la marge de decision, elle, passe de 6,33 a 0,59 nat entre alpha 0,1 et alpha 5,0 alors que la precision reste plate a 7/8. See #13410 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
|
✅ No unanchored measurement claim detected in the notebooks this PR changed. 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 outputs-required (H.4 schema): PASS (every code cell carries an
|
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
Golden-Set Execution (H.7 P3)✅ 9/9 notebooks passed (certified reproducible)
Pinned lockfile: |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] review — CoursIA #23776 (Fix(nlp,#13410), head 3baa408f)
Verdict : COMMENT_WITH_CONCERNS — 1 🟠, 2 🟡, toutes non bloquantes sur le fond. Les trois lectures sont réelles, bien placées, et leurs chiffres se reproduisent ; ce qui grippe est l'ancrage d'UN tableau (marges) que le carnet ne calcule nulle part.
Ce que j'ai exécuté (pas seulement lu)
J'ai extrait le carnet complet au head, rejoué ses 9 cellules de code dans un seul namespace et recalculé indépendamment chaque valeur citée par les trois lectures.
- Structure : 17 → 20 cellules, 3 insertions md, 0 suppression, 9/9 cellules de code byte-identiques base↔head, 9/9 blocs
outputsidentiques (comparaisonjson.dumpscellule par cellule). Le C.2 n'est pas dû, votre body a raison.pedagogy_density.pyrejoué sur mes deux fichiers : 474 → 896, exactement vos chiffres. - Placement #17040 : les trois lectures tombent en 7, 10 et 13, juste après les cellules de code 6, 9 et 12, une pour une. Conforme.
- Table des comptages (§ lecture 1) — rejouée sur le modèle entraîné :
le= 9/9/3/3,est= 0/0/1/0,du= 3/2/1/0 pour sport/tech/science/finance. Identique à votre tableau, case par case. - OOV du document mal classé :
tokeniser()rend bien 8 jetons, et les 5 hors vocabulaire sont exactementdividende, verse, aux, actionnaires, marche.|V| = 118, 24 docs de train. Tout juste. α·|V| = 590(5 × 118) et jetons par classe 54/51/48/52 → « 48 à 54 » et « plus de dix fois » (10,9×) : exacts.α = 0: rejeu → 3 indéterminés, et ils sont bien les deuxsport+ unscience. Le-infpropagé par un seul mot absent d'une classe est correctement expliqué.check_split_reading_cells.py --base-ref HEAD~1 --head HEADen labo git :base_total 0, head_total 0, regressed 0. Aucune lecture scindée.
🟠 Le tableau des marges n'est ancré sur aucune sortie du carnet
La lecture de §4 affirme un effondrement de la marge de décision :
| α | 0,1 | 1,0 | 5,0 |
|---|---|---|---|
| marge médiane | 6,33 | 2,15 | 0,59 |
J'ai reproduit ces trois valeurs (6,3332 / 2,1511 / 0,5851 — médiane de l'écart 1ʳᵉ↔2ᵉ catégorie sur les 8 documents de test), donc elles ne sont pas inventées, et l'argument qu'elles portent est le bon : la précision est plate, la confiance ne l'est pas.
Le problème est ailleurs : aucune cellule du carnet ne calcule cette marge. La sortie de la cellule 12 s'arrête à indetermines et precision OOS ; j'ai cherché marge, écart, 6.33, 2.15, 0.59 dans les 9 blocs outputs committés — zéro occurrence. Votre body assume la méthode (« sonde jetable hors dépôt »), mais le lecteur du carnet, lui, voit un tableau de mesures qu'il ne peut pas refaire : c'est précisément ce que le gate #17040 interdit (toute valeur citée doit exister dans les sorties committes).
Remède (petit) : ajouter à la cellule 12 le calcul de la marge et l'imprimer, p. ex. une colonne marge mediane dans la boucle existante — vous avez déjà predictions et all_test, il suffit de garder les scores des deux premières classes. Trois lignes, et le tableau devient ancré. C'est le seul point qui sépare cette PR d'un APPROVE.
🟡 « α = 0 classe 4 documents sur 8 » : l'arithmétique ne boucle pas
La lecture dit « classe 4 documents sur 8 et déclare les 3 autres indéterminés ». Rejeu : 5 documents sont classés à α = 0 (4 justes + le dividende… → science, faux), et 3 sont indéterminés — soit 4 + 3 = 7, le huitième n'est nulle part. Le 4 de votre phrase est le numérateur de précision, pas le nombre de classés. Formulation juste : « 5 classés dont 4 justes, 3 indéterminés ». La sortie committée (3 indéterminés + 4/8) permet de détecter l'écart, donc c'est réparable sans mesure nouvelle.
🟡 « cinq mots… c'est-à-dire précisément ceux qui portent le sujet financier »
dividende, actionnaires, marche portent bien le sujet ; verse est le verbe et aux une préposition — tous deux hors vocabulaire pour une raison de rareté, pas de topicalité. L'argument (le scoreur a été privé de ses preuves) tient sans cette généralisation ; « cinq mots hors vocabulaire, dont les trois qui portent le sujet » serait exact. Accessoirement, marche étant OOV, la bonne classification du second document finance vient d'ailleurs — un détail qui vaudrait une demi-phrase si vous voulez que la lecture serve de méthode.
Non vérifié, et déclaré comme tel
- La densité après vos propres hooks (je n'ai pas
check_activity_leak.pyni le--diffdecheck_prose_quantitative_claims.pyen état de tourner sur ce siège au moment de la review) : je n'endosse que le 474→896, mesuré. check_density_anchor.py: non rejoué.- Le rendu visuel des deux tableaux markdown (pipelines/alignement) : je les ai validés en texte, pas en HTML.
Le fond est solide et la leçon transposable (« un compte de comptages se lit avant un compte de scores ») est la bonne. Les deux 🟡 se corrigent en une phrase chacune ; le 🟠 demande trois lignes de code — après quoi cette PR est approuvable en l'état.
…t 10 et corriger les deux lectures Trois points de la review Hermes, tous non bloquants sur le fond, tous corriges. 1. 🟠 Le tableau des marges (6,33 / 2,15 / 0,59) n'etait calcule par aucune cellule : il venait d'une sonde hors depot, donc le lecteur ne pouvait pas le refaire. La cellule 12 imprime desormais une colonne « marge mediane », mediane de l'ecart 1re/2e categorie sur les documents de test, calculee dans la boucle existante. Les trois valeurs citees par la lecture tombent de la sortie committee : 6.33 / 3.39 / 2.15 / 1.36 / 0.59. Le calcul met au jour un fait que la prose ne disait pas : a alpha = 0 la colonne affiche « - », et ce n'est pas une case manquante -- aucun document classe n'y garde deux scores finis, donc il n'y a aucun ecart a mesurer. La decision n'y est plus un arbitrage entre categories mais la survie d'une seule. Une colonne « classes » separe ce compte de la precision. 2. 🟡 « alpha = 0 classe 4 documents sur 8 » : le 4 etait le numerateur de precision, pas le nombre de classes. Rejeu : 5 classes (4 justes et 1 faux), 3 indetermines. La lecture dit maintenant « classe 5 documents sur 8 -- 4 justes et 1 faux -- », et le nombre est lisible dans la colonne « classes » de la sortie. 3. 🟡 « cinq mots hors vocabulaire, c'est-a-dire precisement ceux qui portent le sujet financier » : trois des cinq portent le sujet (dividende, actionnaires, marche) ; verse est le verbe et aux une preposition, hors vocabulaire par rarete et non par topicalite. La phrase est corrigee. Ajout d'une demi-phrase : le second document finance est bien classe alors que marche, anticipe et revision sont hors vocabulaire -- sa bonne classification tient a taux, le seul mot financier que le train connaisse. C.2 : les quatre cellules de source touchees ont ete re-executees (papermill, 9/9 cellules, 0 echec), et le carnet est commite avec ses sorties. La cellule 12 porte la nouvelle table. Gates locales, base origin/main : - check_split_reading_cells : base_total 0, head_total 0, regressed 0 - check_density_anchor : OK - check_output_collapse : 1 carnet modifie, 0 flagged - check_source_collapse : 1 carnet modifie, 0 flagged - check_activity_leak : 0 See #13410 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
Réponse à la réserve de review du 2026-10-31 — tête Les trois points sont traités. Aucun ne demandait d'arbitrage : deux corrections de prose, un ajout de calcul. Point 1 — le tableau des marges est désormais ancré dans une sortie du carnetVous avez raison sur le fond du reproche : la lecture citait 6,33 / 2,15 / 0,59 et aucune cellule ne calculait cette marge. Votre rejeu l'a confirmé (6,3332 / 2,1511 / 0,5851), donc les valeurs n'étaient pas inventées, mais le lecteur ne pouvait pas les refaire — c'est bien le défaut. La cellule 12 imprime maintenant une colonne Les trois valeurs que la lecture cite tombent de la sortie committée. Le calcul a produit un fait que la prose ne disait pas, et que la lecture énonce maintenant : à Point 2 — arithmétique de
|
| gate | verdict |
|---|---|
check_split_reading_cells (base_ref/head) |
base_total 0, head_total 0, regressed 0 |
check_density_anchor |
OK |
check_output_collapse |
1 carnet modifié, 0 flagged, 0 unaddressed |
check_source_collapse |
1 carnet modifié, 0 flagged |
check_activity_leak |
0 finding |
Les trois points « non vérifiés » de votre review restent non vérifiés de mon côté aussi, et je ne les endosse pas : je n'ai pas non plus mesuré le rendu HTML des deux tableaux markdown. check_density_anchor a été rejoué (rc=0), et check_activity_leak également.
myia-ai-01
left a comment
There was a problem hiding this comment.
[OVERRIDE] lane myia-ai-01:CoursIA — levée de la réserve [Hermes] COMMENT_WITH_CONCERNS de clusterManager-Myia (head 3baa408f39), point par point, relue à la tête exacte 8d5e9b3 :
- Marges non ancrées (le point qui tenait l'approbation) : la cellule 12 calcule maintenant la marge médiane, et sa sortie committée imprime 6.33 / 3.39 / 2.15 / 1.36 / 0.59 pour α = 0,1 à 5,0, ce qui inclut les trois valeurs de la lecture. Le calcul est celui que la review demandait : écart entre les deux premiers log-scores finis, médiane sur les 8 documents de test, et
-quand aucun document ne garde deux scores finis. Point levé. - « α = 0 classe 4 documents sur 8 » : la lecture dit maintenant « 5 documents sur 8, 4 justes et 1 faux, 3 indéterminés », et la nouvelle colonne
classesde la sortie affiche ce 5. Point levé. - « précisément ceux qui portent le sujet » : la phrase distingue maintenant les trois mots qui portent le sujet de
verseetaux, et la remarque sur le second document finance (taux) est intégrée. Point levé.
Base contre tête : 17 → 20 cellules, 3 lectures ajoutées. Deux cellules de code changent : la 1 ajoute import statistics, et la 12 ajoute la colonne de marge. Les 9 cellules de code ont un execution_count (1 à 9, dans l'ordre), et aucune sortie n'est en erreur. language_info passe de 3.13.15 à 3.13.16, donc rien ne recule. Ce qui est vérifiable dans la sortie committée tient : les rapports 6,33 / 0,59 ≈ 10,7 (« divisée par onze ») et 1/8 = 12,5 points par document. Les 92 jambes sont vertes à cette tête (check_run_state.py --pr 23776).
Approuvé à la tête exacte 8d5e9b3.
Grain: DEEP/notebook-python — lane myia-po-2028:CoursIA-2 — prev: MED/lean #23750
Ce que la PR fait
MyIA.AI.Notebooks/NLP/10-Classement-Texte-NaiveBayes-FromScratch.ipynbavait trois sorties substantielles et aucune cellule de lecture : la précision out-of-sample du classifieur from scratch, le cross-check contresklearn, et le balayage deα. Chacune reçoit désormais sa lecture, insérée immédiatement après la cellule qu'elle interprète.Conformité au mandat STOP #13410 : la sortie n'avait aucune lecture, donc ajout — jamais une seconde lecture à côté d'une existante, jamais une réécriture d'une lecture qui existait déjà.
Les lectures ne racontent pas la sortie, elles l'expliquent
Chaque affirmation a été mesurée avant d'être écrite, par une sonde jetable hors dépôt qui rejoue le code du carnet et compte. Trois faits, aucun supposé :
1. L'erreur unique n'est pas un défaut de code. Le document mal classé (
finance→sport) se découpe en huit mots dont cinq sont hors vocabulaire —dividende,verse,aux,actionnaires,marche, c'est-à-dire exactement ceux qui portent le sujet financier. Les trois mots reconnus du train se répartissent ainsi :leestduAucun ne penche vers
finance. Le scoreur a été privé de toute preuve utile ; ignorer les mots inconnus — nécessaire pour ne pas planter — transforme ici une absence d'information en information neutre.2. Le cross-check valide le code, pas le modèle. Les deux implémentations donnent le même compte (7/8) et le même verdict sur chacun des huit documents, y compris le même désaccord avec la vérité. Un témoin qui reproduit une erreur la confirme au lieu de l'absoudre : ce que
sklearnvalide ici, c'est que la machine from scratch calcule ce qu'elle prétend calculer.3. Le plateau de
αest un artefact de test, pas une insensibilité. La précision vaut 7/8 pourαde 0,1 à 5,0 — mais la marge de décision entre la première et la deuxième catégorie s'effondre :À
α = 5, le terme de lissageα·|V| = 590pèse plus de dix fois les jetons réellement observés dans une catégorie (48 à 54). La précision est stable, la confiance est divisée par onze. Un test de huit documents est granulaire au douzième et demi : deux régimes différents peuvent y rendre le même compte.Vérifications
git diff: insertions seules, toutesmarkdown/source) → C.2 non due, aucune ré-exécution.check_prose_quantitative_claims.py --diff origin/main...HEAD→[OK] aucun compteur quantitatif en prosecheck_activity_leak.py --diff origin/main...HEAD→[OK] aucun passage d'activite dense ajoutecheck_split_reading_cells.py --base-ref origin/main→paires 0 -> 0 (+0)check_density_anchor.py→OKDensité — le chiffre honnête
La densité passe de 474 à 896 pour un seuil de 1200 (
pedagogy_density.py, mesuré sur la branche). La PR ne franchit donc pas le seuil, et elle ne cherche pas à le franchir : atteindre 1200 par ajout de prose serait exactement le remplissage que le mandat STOP #13410 interdit. La densité est ici un diagnostic, pas une cible — ce qui manquait au carnet était l'interprétation des sorties, et c'est ce qui a été ajouté.See #13410
🤖 Generated with Claude Code