Skip to content

fix(ci,#17747): cliquet split-reading -- une revision en place n'est plus comptee comme un ajout - #17749

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/17747-split-reading-rewrite
Sep 25, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/17747-split-reading-rewrite

Conversation

@jsboige

@jsboige jsboige commented Sep 25, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling -- lane myia-po-2026:CoursIA -- prev: MED/notebooks #17745

Le garde bloquant punissait le geste prescrit

Split-reading ratchet (base vs PR) est bloquant (fast lane, 35 gardes). Il rougissait une PR qui n'ajoute aucune cellule : sur un carnet sans id, la révision en place d'une cellule markdown non classée lecture était comptée comme un ajout, puis signalée en READING_BEFORE_CODE.

C'est le geste que le mandat user prescrit (« si on rajoute une lecture, on modifie le paragraphe de lecture existant, on n'en rajoute pas un deuxième ») — et que l'organe documente lui-même, en clair dans son code : « La règle user dit « fusionner / réécrire, pas empiler » : la réécriture EST l'action prescrite. Ne pas la signaler. »

Mesure fondatrice (PR #17745, tranche SymbolicAI de #17498)

Fait mesuré Valeur
OR-tools-Stiegler.ipynb — cellules base vs tête 38 / 38
Cellules dont la source diffère 4 (indices 5, 15, 31, 33)
Cellules ajoutées aucune
Ce que la cellule 31 a changé 39,66 $/an → 39,66 \$/an (échappement prescrit par #17498)
Verdict du cliquet REGRESSED … READING_BEFORE_CODE cellules [31]

Les trois signaux is_rewrite (#17044) manquaient tous : (a) source modifiée — c'est l'objet de la PR ; (b) pas d'id (1 des 3 cellules sans id du carnet) ; (c) is_reading_cell faux — le titre est ### Exercice 3 : ….

Le correctif

Le signal topologique (c) passe de « les deux cellules sont des lectures » à « les deux sont markdown, au même index ». Il ne dépend donc plus de la classification lecture/exercice, et il reste exact — aucun seuil de similarité : un empilement réel arrive toujours à un index où la base portait autre chose (ou rien), et c'est là que le compte de paires monte.

Ce point compte pour la revue : la tentation était un seuil de similarité (ratio ≥ 0.8), c'est-à-dire un robinet à régler. Le signal retenu est positionnel, donc indéréglable.

Falsification mesurée (organe de main restauré puis remis par cp, jamais git checkout --)

État Résultat
Avant le correctif 1 failed / 89 passed / 1 xfailed — l'échec est le seul test ajouté
Après le correctif 90 passed / 1 xfailed
test_fast_lane.py 76 passed

Contre-preuve : le signal n'est pas un robinet ouvert

Deux contrôles négatifs tiennent, dont un nouveau :

  1. Empilement réel avec révision du voisin (nouveau) : la cellule du dessus est révisée en place (exemptée) et une lecture est empilée au slot où la base portait du code → 1 finding, sur ce slot. Le signal ne couvre que le slot qu'il occupe.
  2. test_cliquet_mord_si_la_lecture_arrive_APRES (guard(notebooks): cabler check_split_reading_cells.py en cliquet bloquant — l'organe existe, 91 findings deja sur main, et la prose du STOP n'a pas tenu 42 minutes #17044, inchangé) : l'empilement après une lecture existante reste rouge.

Exposition mesurée (pourquoi ce n'est pas un cas isolé)

Sur MyIA.AI.Notebooks/ : 229 carnets sur 1409 portent au moins une cellule markdown sans id — 1978 cellules au total. Toute PR qui en réécrit une en place est exposée. La tranche SymbolicAI est la première d'une série (#17498 : GenAI 13, GameTheory 5, résiduel 3 restants) : sans ce correctif, la même classe de faux positif attend les tranches suivantes.

Portée et périmètre

Closes #17747 — débloque aussi le rouge de #17745, dont la tête devra reprendre main après ce merge pour voir le garde vert (la CI utilise l'organe du méta-commit de la PR).

🤖 Generated with Claude Code

…plus comptee comme un ajout

Le garde BLOQUANT `Split-reading ratchet (base vs PR)` rougissait une PR qui
n'ajoute aucune cellule : sur un carnet SANS id, la revision en place d'une
cellule markdown non classee lecture etait comptee comme un ajout, et le bucket
READING_BEFORE_CODE la signalait -- soit exactement le geste que le mandat user
PRESCRIT (« si on rajoute une lecture, on modifie le paragraphe de lecture
existant »), et que l'organe documente lui-meme comme a ne pas signaler.

Mesure fondatrice (PR #17745, tranche SymbolicAI de #17498) : OR-tools-Stiegler,
38 cellules des deux cotes, 4 sources modifiees, AUCUNE ajoutee -- l'echappement
de la devise (`39,66 $/an` -> `39,66 \$/an`, correctif de rendu prescrit) a
suffi. Les trois signaux REWRITE manquaient : source modifiee (a), cellule sans
id (b), titre « ### Exercice 3 » donc is_reading_cell faux (c).

Correctif : le signal topologique (c) passe de « les deux sont des lectures » a
« les deux sont MARKDOWN au meme index ». Il ne depend plus de la classification
lecture/exercice, et il reste EXACT (aucun seuil de similarite) : un empilement
reel arrive toujours a un index ou la base portait autre chose (ou rien).

Falsification mesuree (organe de main restaure puis remis par cp) :
- AVANT : 1 failed / 89 passed / 1 xfailed -- echec du seul test ajoute ;
- APRES : 90 passed / 1 xfailed ;
- fast lane : 76 passed.

Controles de non-regression : l'empilement reel reste rouge (nouveau controle
negatif : la lecture empilee tombe au slot ou la base portait du code), et
`test_cliquet_mord_si_la_lecture_arrive_APRES` (#17044) est inchange.

Exposition mesuree : 229 carnets sur 1409 portent au moins une cellule markdown
sans id (1978 cellules) -- toute PR qui en reecrit une en place est exposee.

Perimetre : 2 fichiers (organe + tests). Closes #17747.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@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

Path-collision (organ #13359/#13615)

Cette PR #17749 (fix(ci,#17747): cliquet split-reading -- une revision en place n'est plus comptee comme un ajout) 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 25, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2024:CoursIA
pr: 17749
head: 6ac796b
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: a3e2619695a653d5bd787f39730104221f80482c786a1fff59be0b3932cc4aac
diff-files: 2
diff-additions: 66
diff-deletions: 8
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/ADJOINT PREFLIGHT]

Dossier READY, aucune reserve a lever :

Surfaces a la tete exacte 6ac796b : 0 review, 0 commentaire inline, 2 commentaires bot — organ-duplication advisory (clean) et path-collision advisory (verdict terminal : les 5 PRs partageant les chemins check_split_reading_cells sont toutes DEJA sur main, aucune collision vivante ; l'organe ne compare pas le contenu, l'arbitrage reste au coordinateur — ici les tranches #17498 sont disjointes par design). Rien ne requiert de levee.

B.0 : check_unaddressed_nits.py 17749 rc=0, relance depuis un main a jour (d2de378) a l'instant d'ecrire b0:.

Etat mecanique : check_run_state.py --pr 17749 rc=0, pli latest-wins, aucune jambe rouge residuelle — PR gate success @2026-09-25T07:34:35Z, Split-reading ratchet (base vs PR) success @04:46:23Z (l'organe corrige par cette PR est vert sur elle-meme : la PR ne touche AUCUN notebook, le cliquet n'a rien a mordre), Scripts Tests (CPU) success, CodeQL success. mergeStateStatus: CLEAN / mergeable: MERGEABLE (premiere sonde UNKNOWN transitoire, re-sonde CLEAN).

Scope : 2 fichiers exactement — scripts/notebook_tools/check_split_reading_cells.py (+18/-8) et son test (+48/-0). Coherent avec l'annonce : correctif du detecteur + falsification. Aucun notebook, aucun catalogue, aucune dependance.

Substance verifiee au body : la falsification declaree (1 failed / 89 passed avant -> 90 passed apres ; test_fast_lane.py 76 passed) est la preuve portee par la lane ; le signal retenu est positionnel (markdown au meme index), pas un seuil de similarite reglable ; deux contre-preuves (empilement reel avec revision du voisin -> 1 finding sur le slot ; #17044 inchange). Le diagnostic complet vit dans #17747 (OPEN, verifie).

Effet attendu du merge : debloque le rouge de #17745 (la tranche SymbolicAI de #17498 devra reprendre main pour voir le garde vert — note dans le body de la PR).

Hors perimetre merge_ready.py : non — la PR ne touche ni .claude/, ni CLAUDE.md, ni .github/. Decision finale et signature restent a ai-01.

@myia-ai-01
myia-ai-01 merged commit 05c1844 into main Sep 25, 2026
20 of 21 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.

2 participants