Skip to content

fix(notebook_tools,#17523): repair_morpho — borner la locution a la phrase courante - #17563

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/17523-morpho-sentence-window
Sep 23, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/17523-morpho-sentence-window

Conversation

@jsboige

@jsboige jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling -- lane myia-po-2026:CoursIA -- prev: MED/guard #17502

is_donne_legitimate() cherche la locution « etant / tant » dans les 60 caractères qui précèdent le mot cible sans borne de phrase : une locution d'une phrase antérieure légitimise un « donné » fautif de la phrase suivante. Le défaut était documenté par le @unittest.skip de test_notebook_contamine (l.370-374) ; il est levé ici.

Écart assumé au critère 2, tranché par la mesure

L'issue demandait de conserver test_etant_donne_legitime (« le cas inter-phrase réel ») et de borner à la phrase (critères 1 et 2 en tension), en renvoyant la décision à une mesure sur les notebooks contaminés. Mesure faite, elle tranche dans l'autre sens que l'intuition de l'issue :

Candidat de borne Verdicts changés sur le corpus Nature
[.!?] seuls 0 / 198 sûr
+ ligne blanche (\n\s*\n) 0 / 198 sûr — retenu
+ saut de ligne simple 1 / 198 casse une locution réelle

Le seul verdict que le saut de ligne simple change est une vraie locution coupée par un retour à la ligne : Probas/PyMC/PyMC-10-Model-Selection.ipynb c.0 — « l'inférence bayésienne : étant\ndonné un jeu de données ». Donc : le saut simple reste dans la phrase, la ligne blanche borne.

Conséquence sur le critère 2 : test_etant_donne_legitime assertait True sur un contexte qui franchit un point (« …est complexe. On ») — il encodait exactement le défaut corrigé. Il est donc réécrit sur la locution dans la même phrase (le vrai cas légitime), et les deux cas réels sont conservés sous forme de tests nommés :

  • test_tant_donne_avec_intercalation (Tell c.1317-L7) — inchangé, vert ;
  • test_locution_coupee_par_saut_de_ligne_simple — nouveau, porte le witness corpus PyMC-10 (le seul cas que la borne par saut simple aurait cassé) ;
  • test_locution_inter_phrase_ne_legitime_plus — nouveau, fixe le défaut (symétrique de l'invariant « auxiliaire » que is_prouve_legitimate possède déjà, self-test l.440) ;
  • test_ligne_blanche_borne_la_phrase — nouveau.

Le motif de skip parlait d'un « cas inter-phrase réel » : la mesure ne trouve aucune locution inter-phrase légitime sur 1383 notebooks (0 verdict changé par la borne). Le cas réel était le line-wrap, pas l'inter-phrase.

Preuves

  • Équivalence organe (le point qui compte pour main) : scan_notebook() rend exactement les mêmes 471 findings sur les 1383 notebooks du corpus, avant/après — aucun changement de masse, aucun re-accent accidentel. Script : comparaison des deux versions du module importées côte à côte (scan_notebook réel, pas une ré-implémentation).
  • Défaut corrigé : test_notebook_contamine passe sans skip — le « sup donné » de la phrase 2 est détecté pendant que la locution de la phrase 1 et le décide de prose sont préservés.
  • Suite : pytest scripts/notebook_tools/tests/test_repair_morpho.py → 51 passed (HEAD mesuré à 47 passed + 1 skipped).
  • Self-test : python scripts/notebook_tools/repair_morpho.py --self-test → rc=0, « 22 invariants vérifiés ». Le compte imprimé valait 20 pour 19 contrôles à HEAD ; ajusté à 22 avec repair_morpho: is_donne_legitimate — la fenêtre de 60 caractères laisse une locution antérieure masquer un 'donné' fautif #17523 (+3 contrôles dans la famille locution).
  • Périmètre : 2 fichiers, +72/-11. Aucun autre consommateur de is_donne_legitimate dans le dépôt (grep : le prédicat n'est appelé que par son propre organe et ses tests).

Hors périmètre (signalé, non touché)

  • ruff check remonte 9 erreurs sur ces 2 fichiers, identiques à HEAD (mêmes lignes, hors de mes zones modifiées) : pré-existantes, non traitées ici.
  • repair_morpho.py n'apparaît dans aucun workflow ni pre-commit : l'organe n'est pas encore câblé en CI (sujet distinct).

Closes #17523

🤖 Generated with Claude Code

…hrase courante

is_donne_legitimate() cherchait la locution « etant/tant » dans les 60
caracteres precedents SANS borne de phrase : une locution d'une phrase
anterieure legitimisait un « donné » fautif de la phrase suivante. Le defaut
etait documente par le @unittest.skip de test_notebook_contamine, leve ici.

Borne retenue, mesuree sur le corpus (1383 notebooks, 198 « donné » accentues
hors backticks, 59 preserves par la regle actuelle) :
- [.!?] seuls            : 0 verdict change
- + ligne blanche        : 0 verdict change  <- retenu
- + saut de ligne simple : 1 verdict change, et c'est une locution REELLE
  coupee par un retour a la ligne (PyMC-10-Model-Selection) -> le saut de
  ligne simple reste DANS la phrase.

Equivalence organe : scan_notebook() rend exactement les memes 471 findings
sur les 1383 notebooks avant/apres -> aucun changement de masse sur main.

Tests : 51 passed (etait 47 passed + 1 skipped) ; self-test rc=0, 22
invariants (le compte imprime etait 20 pour 19 controles).

See #17523

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

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2026:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-23) :

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

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

@jsboige

jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 17563
head: dadb489
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 6d697a4b0d9be3b0fb7a1e70e0d7d7a57c475158084628955d0e61a05c13b4b2
diff-files: 2
diff-additions: 72
diff-deletions: 11
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17563 (fix(notebook_tools,#17523): repair_morpho — borner la locution a la phrase courante) 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.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@jsboige

jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 17563
head: dadb489
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 269683816e13414a4d49ae2b3e1fad3e54870d37f4e9914a9831d4ac9e70dcd1
diff-files: 2
diff-additions: 72
diff-deletions: 11
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 8de9d67 into main Sep 23, 2026
20 of 22 checks passed
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.

repair_morpho: is_donne_legitimate — la fenêtre de 60 caractères laisse une locution antérieure masquer un 'donné' fautif

2 participants