Skip to content

fix(tooling,#15512): detect_paragraph_length mesure chaque item de liste seul (94 fichiers de-signales, 0 vrai positif perdu) - #16283

Merged
jsboige merged 1 commit into
mainfrom
fix/15512-paragraphs-probas
Sep 15, 2026
Merged

jsboige merged 1 commit into
mainfrom
fix/15512-paragraphs-probas

Conversation

@jsboige

@jsboige jsboige commented Sep 15, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/tooling — lane myia-po-2026:CoursIA — prev: DEEP/genai-content #16282

Ce que cette PR corrige

La tranche « Probas (5 fichiers) », que #15512 recommande de traiter en premier, n'a rien à corriger : ses 9 findings sont des faux positifs, et la cause est dans l'organe, pas dans les fichiers.

iter_paragraphs() définissait un paragraphe comme « une suite de lignes contiguës non-vides ». Dans un assets/readme/MANIFEST.md, six champs - **Source** : … / - **Poids** : … se suivent sans ligne vide : ils étaient donc additionnés. Mesure :

MANIFEST Probas Volume du plus long item Longueur du « paragraphe » annoncé
DecisionTheory/PyMC/… 1594 c 3457 / 3255 / 3117 / 3004 / 2894 / 2073 c
PyMC/… 1242 c 2588 / 2143 c
Probas/… 807 c 4220 c

Zéro item ne dépasse 2000 c — seul leur somme le fait. C'est en contradiction avec l'intention écrite du module (« un item de liste de 10k caracteres est un mur aussi » — un item) et avec le rendu : markdown produit six <li> distincts, qu'aucun lecteur ne parcourt d'un trait.

Conséquence évitée : « corriger » cette tranche aurait consisté à scinder des champs de provenance structurés et curés (Source / Poids / Verdict) — du churn sur des données auditées, sans gain de lisibilité. Aucune PR de sweep n'est donc produite sur ces fichiers (protocole de réévaluation d'audit #499 : pas de PR sur un finding faux).

Le correctif

Un item de liste ouvre désormais son propre bloc, y compris quand il suit une phrase d'introduction (la phrase ferme le bloc précédent). Le seuil 2000 est inchangé ; c'est la segmentation qui change, pas la barre.

Mesure corpus-entier (avant / après)

Sur le corpus suivi (git ls-files '*.md'), les deux versions du module chargées côte à côte puis comparées :

blocs fichiers
avant 375 124
après 157 30
  • Vrais murs de prose : ensemble de fichiers identique — 12 fichiers avant, 12 après, set == vérifié en chargeant la version origin/main du module. 0 vrai positif perdu, 0 fichier nouvellement signalé ;
  • 94 fichiers de-signalés, dont la totalité des assets/readme/MANIFEST.md de la flotte.

Le résidu restant est du signal réel, pas des faux positifs :

Contrôles (le point sensible : ne pas éteindre le détecteur)

Le risque d'un tel correctif est de rendre l'organe muet. Trois contrôles l'encadrent :

  1. Témoin fondateur (le paragraphe Probas de 3336 c sur une ligne physique, PR docs(probas,#14871): navigation Percolation + audit fichier-entier du README série (réconciliation prose/disque, pont causal développé) #15405) : tire toujours, 3251 c ;
  2. Contrôle de faux positif avec preuve d'appartenance : le run de test doit dépasser le seuil en somme et chaque item rester dessous — sinon le test serait vacuement vert (il passerait aussi sur un texte anodin). Les deux assertions sont dans le test ;
  3. Témoin positif de la segmentation : un item de liste unique de 2400 c tire toujours — borne le fix précédent.

--self-test embarque (6) et (7) ; la suite pytest passe de 12 à 16 tests.

Grounding

Les deux documents qui décrivent le signal portent la même précision, avec la re-mesure datée : scripts/notebook_tools/README.md et l'en-tête de .github/workflows/paragraph-length-advisory.yml (dont le texte citait déjà le signal « single run of non-empty lines »). Le workflow est advisory et inchangé fonctionnellement — seul son commentaire de calibration est réaligné, pour ne pas laisser une mesure périmée décrire la nouvelle sémantique.

Périmètre

4 fichiers, 1 sujet (la sémantique de segmentation de l'organe), 0 notebook, 0 catalogue.

See #15512 — la PR ne clôt pas l'issue : le sweep garde les 9 paragraphes de prose réels, et le comptage de l'issue (112 fichiers) demande à être re-scopé sur la mesure ci-dessus.

🤖 Generated with Claude Code

…ste seul

Un run d'items de liste contigus etait somme en un bloc unique : six champs
de provenance d'un `assets/readme/MANIFEST.md` (chacun <= 1600 c) totalisaient
3457 c et declenchaient un finding. Les 9 findings de la tranche « Probas »
recommandee par #15512 sont tous de cette classe -- aucun item du corpus ne
depasse le seuil, seul leur somme le fait.

Un item de liste ouvre desormais son propre bloc, y compris quand il suit une
phrase d'introduction. C'est l'intention deja documentee du module (« un item
de liste de 10k caracteres est un mur aussi ») : l'implementation la respecte
au lieu de mesurer la concatenation.

Mesure sur le corpus suivi (`git ls-files '*.md'`), versions pre/post chargees
et comparees : 375 blocs / 124 fichiers -> 157 blocs / 30 fichiers. L'ensemble
des 12 fichiers de vrais murs de prose est **identique** -- 0 vrai positif
perdu, 0 fichier nouvellement signale, 94 fichiers de-signales.

Controles : le temoin fondateur (paragraphe 3336 c sur une ligne physique)
tire toujours ; le controle de faux positif verifie d'abord que le run depasse
le seuil *en somme* (sinon il serait vacuement vert) ; un temoin positif
epingle qu'un item unique long tire encore.

Le residu est du signal reel : 12 transcripts `Roo-Code/**/roo_task_*.md`
(murs structurellement legitimes, deja hors scope de #15512) et 9 paragraphes
de prose multi-lignes. Le seuil 2000 est inchange.

Co-Authored-By: Claude Sonnet 5 <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-15) :

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

Path-collision (organ #13359/#13615)

Cette PR #16283 (fix(tooling,#15512): detect_paragraph_length mesure chaque item de liste seul (94 fichiers de-signales, 0 vrai positif perdu)) 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.

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.

1 participant