Skip to content

fix(probas,#15719): échapper les pipes des tables — tranche Probas (Percolation, PyMC-04, DoWhy-1, voi) — FINAL_RESIDUAL - #15849

Merged
myia-ai-01 merged 4 commits into
mainfrom
wt/vibe-f3r-probas-tables
Sep 14, 2026
Merged

myia-ai-01 merged 4 commits into
mainfrom
wt/vibe-f3r-probas-tables

Conversation

@jsboige

@jsboige jsboige commented Sep 12, 2026 •

Copy link
Copy Markdown
Owner

Grain: LIGHT/docs — lane myia-po-2023:CoursIA — prev: MED/guard #15850

Objet

Tranche Probas du sweep #15719 — 5 findings, tous des pipes nus dans des cellules de tableau.

Périmètre effectif : 5 fichiers — les quatre cibles pédagogiques du tableau ci-dessous + l'entrée de registre de parité scripts/notebook_tools/twin_pairs.d/probas-4-bayesian-networks/0011-2026-09-14-myia-po-2023-CoursIA.yaml (6+/0−, artefact posé par le run de la paire, aucune édition manuelle).

Fichier Findings base Catégorie Correction
Probas/Applications/Percolation/Percolation-Supercritique.ipynb 2 COL_MISMATCH |g| → \\|g\\| (la colonne fantôme venait du pipe nu de la notation |g|)
Probas/PyMC/PyMC-04-Bayesian-Networks.ipynb 1 CODE_SPAN_PIPE P(Cloudy | Rain=1) échappé
Probas/DecisionTheory/Causal-Bridges/DoWhy-1-Estimand-et-Intervention.ipynb 1 CODE_SPAN_PIPE P(Y|T=1), P(Y|T=0) échappés
Probas/DecisionTheory/voi/README.md 1 COL_MISMATCH P(pétrole|négatif) échappé — 4 colonnes vs 3, colonne fantôme

Champ prev de la chaîne de fournées : #15724.

Métriques du contrat de fournée (#15719)

  • changed_files : 5 (quatre cibles pédagogiques + l'artefact twin_pairs.d, cf. Périmètre effectif)
  • confirmed_before : 5 (3 COL_MISMATCH + 2 CODE_SPAN_PIPE)
  • findings_after : 0
  • fixed_count : 5

⚠️ FINAL_RESIDUAL — fixed_count (5) < plancher (10)

L'exception 1 du contrat est invoquée, chiffrée sur un re-scan frais et non sur l'inventaire initial.

Exception (forme #15719) — seulement le résidu final mesuré : le domaine Probas est intégralement alloué après déconfliction (28 findings = 23 portés par #15784 + 5 par cette PR), donc le résidu libre de cette branche est 0 fichier / 0 finding, chiffré sur le re-scan frais ci-dessous. Le grain n'est pas taillé court par choix : c'est le dernier fichier mesuré du domaine.

Re-scan frais (scan_md_table_syntax.py --json MyIA.AI.Notebooks, base 77575efeb, 43 s) :

Mesure Valeur
Findings totaux (zone active) 179
Domaine Probas 28 findings / 7 fichiers
Catégories du domaine CODE_SPAN_PIPE 25, COL_MISMATCH 3

Déconfliction des PR ouvertes sur #15719 (relevé à l'instant) :

PR Domaine Fichiers Probas couverts Findings
#15784 (myia-po-2023) Probas/Infer Infer-5-Causal-Inference, Infer-20-Quotients-et-Fibres, PyMC-05-Causal-Inference 23
#15849 (cette PR) Probas (résidu) Percolation-Supercritique, PyMC-04-Bayesian-Networks, DoWhy-1-Estimand, voi/README.md 5

28 = 23 + 5 : le domaine Probas est intégralement alloué. Le résidu libre de cette branche après déconfliction est 0 fichier / 0 finding. Le plancher de 10 est donc inatteignable dans ce domaine — non par paresse de sélection, mais parce que la tranche majoritaire est déjà portée par #15784, ouverte le même jour. Toute « agrégation » supplémentaire imposerait de modifier les fichiers de #15784 et créerait exactement la collision que l'anti-double-claim interdit.

Défaut structurel constaté, à l'attention des coordinateurs : l'inventaire sur lequel ce grain a été taillé était incomplet — « 83 findings / 65 fichiers » annoncés (inventaire d'origine, compte rapporté) contre 179 au re-scan frais. Le domaine Probas y apparaissait à 4 findings au lieu de 28. Les grains encore en file (f4r…f9r) sont taillés sur ce même inventaire périmé et sont donc sous-dimensionnés. Le body de #15719 sera mis à jour avec l'inventaire frais.

Preuve

python scripts/notebook_tools/scan_md_table_syntax.py --check sur les 4 fichiers :

  • avant (base 77575efeb) : Total: 5 defaut(s) sur 4/4 fichier(s)
  • après (tête de branche) : Total: 0 defaut(s) sur 0/4 fichier(s)

Le diff pédagogique est exactement 5 lignes modifiées — 5 insertions, 5 suppressions sur les quatre cibles, rien d'autre ; s'y ajoute l'entrée twin_pairs.d (6+/0−, cf. Périmètre effectif). Vérification structurelle cellule par cellule (base vs tête) :

Notebook Cellules code / md outputs Cellules md modifiées
Percolation-Supercritique 34 11 / 23 18 1
PyMC-04-Bayesian-Networks 47 12 / 35 43 1
DoWhy-1-Estimand-et-Intervention 27 11 / 16 18 1

cell_type, identifiants de cellule, metadata (notebook et cellule), source des cellules code, outputs et execution_count : identiques. La seule chaîne modifiée par notebook est la cellule markdown portant le pipe. Markdown-only : OK.

Note de production — normalisation de la sérialisation

Le contenu vient d'un run Mistral Vibe (vibe-acp-driver.py, 68,6 s, stop=end_turn, 0,214 $), premier run réussi après 13 h d'arrêt de la lane. Le run a trouvé les bonnes corrections.

En revanche il a ré-écrit les notebooks en JSON compact, ce qui produisait 3 insertions / 5124 suppressions — 5 000 lignes de pur bruit de mise en forme pour 4 caractères, un diff irreviewable et un git blame détruit.

La correction a donc été ré-appliquée sur la sérialisation d'origine (aller-retour json.dumps(indent=1) reproduit le fichier de base à l'octet, vérifié sur les 3 fichiers). Le commit brut du run est conservé sur la branche wt/vibe-f3r-probas-tables-raw (52f63bb5f).

Contexte lane

Ce run sert aussi de preuve de bout en bout du correctif de cwd (#3608) : le profil passait --cwd D:/dev/CoursIA (~3,2 M d'entrées, dont 127 worktrees imbriqués), où session/new ne répondait jamais — le run échouait en SESSION_NEW_FAILED:null. Le cwd est désormais résolu depuis le payload (worktree: <chemin>, 12 114 entrées) : session/new répond en 3,5 s et le run aboutit.

🤖 Generated with Claude Code

4 findings on 3 files, all from the md-table detector:
- Percolation-Supercritique.ipynb  2x COL_MISMATCH       |g| -> \|g\|
- PyMC-04-Bayesian-Networks.ipynb  1x CODE_SPAN_PIPE     P(Cloudy | Rain=1)
- DoWhy-1-Estimand-et-Intervention 1x CODE_SPAN_PIPE     P(Y|T=1), P(Y|T=0)

Cells, outputs, metadata and cell ids are untouched: the diff is the 4 changed
lines, nothing else.

Produced by a Mistral Vibe run (vibe-acp-driver.py, 68.6s, $0.214) that found the
right 4 corrections; the run re-serialized the notebooks compactly (~5.1k lines of
pure formatting noise), so the change was re-applied on the original serialization.
Equivalence was proven cell-by-cell before the rewrite (same cell count, same
outputs, same metadata, exactly one source string changed per file), and the raw
checkpoint is kept on the branch wt/vibe-f3r-probas-tables-raw (52f63bb5f).

Verification: scan_md_table_syntax.py --check -> 0 findings on all 3 files.

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

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

…able

The tolerances table declares 3 columns; row L56 carried an unescaped pipe
inside `P(pétrole|négatif)`, splitting the cell into 4 columns
(COL_MISMATCH, phantom column). Escaped as `\|`, the canonical fix for a
markdown-only table defect — no value invented, no wording changed.

Residual of the Probas domain after deconfliction: the domain holds 28
findings across 7 files at 77575ef; PR #15784 (myia-po-2023) already
covers 23 of them (Infer-5, Infer-20, PyMC-05). This branch holds 5 across
4 files, which is the free remainder — below the 10-finding fournée floor
with no further candidate left in the domain.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@jsboige jsboige changed the title fix(probas,#15719): échapper les pipes des tables — tranche Probas (Percolation, PyMC-04, DoWhy-1) fix(probas,#15719): échapper les pipes des tables — tranche Probas (Percolation, PyMC-04, DoWhy-1, voi) — FINAL_RESIDUAL Sep 12, 2026
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions github-actions Bot added the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 12, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Grain tag obligatoire (#10045, bloquant).

Grain tag absent (no Grain: / in body).

Pour passer ce gate, le body doit porter en tete une ligne de la forme :

Grain: <DEEP|MED|LIGHT>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<GENRE> #<PR>

Le <genre> doit figurer dans l'enumeration §1 de variation-protocol.md (lean, qc, training, genai, notebook-python, notebook-dotnet, notebook-lean, slides, docs, guard, refactor, ledger, readme, test, tooling, research-code). Les 3 formes tolerées par l'extracteur : Grain: TIER/GENRE, **Grain:** TIER/GENRE, ## Grain + tag sur la ligne suivante. La lane doit suivre le format <machine>:<workspace> (cf. lane-claim-protocol.md).

@github-actions

github-actions Bot commented Sep 12, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.9s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.2s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.6s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.6s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.1s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 14.8s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.5s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 3
  • Code cells validated: 34
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@jsboige

jsboige commented Sep 12, 2026

Copy link
Copy Markdown
Owner Author

Advisory (diagnostic only — la branche est à votre lane, je n'y touche pas).

Twin parity audit (#8057) est en échec sur cette PR. Le rapport de l'artefact donne, mesuré :

ok=153  drift_introduced=1  drift_pre_existing=3
INTRODUIT : Probas-4 Bayesian-Networks
  Python a drift (content) : 4e6752d5 -> f142fbca

Cause. La paire Probas-4 Bayesian-Networks est native-both et attestée par un SHA de contenu par côté. Votre échappement de pipes dans MyIA.AI.Notebooks/Probas/PyMC/PyMC-04-Bayesian-Networks.ipynb déplace légitimement le contenu du côté Python : l'attestation devient stale.

Remède mécanique (même classe, appliqué à l'instant sur #15845 pour ML-7 Recommendation) :

  1. python scripts/notebook_tools/check_twin_parity.py --update --pair "Probas-4 Bayesian-Networks" --by <votre lane> — après le commit des notebooks (_content_sha lit git show HEAD:<path>, l'arbre du commit, pas le worktree : lancé avant, il atteste le contenu pré-fix et crée un second drift).
  2. Vérifier que le nouveau fichier twin_pairs.d/probas-4-bayesian-networks/NNNN-*.yaml est bien l'ordinal le plus haut du répertoire (= audits[-1], l'entrée que le checker lit).
  3. Ajouter une entrée known_differences de re-baseline (markdown-only / parité-préservante) — il y a un précédent exact dans la même paire pour l'échappement de pipes.
  4. python -m pytest scripts/notebook_tools/tests/test_twin_registry_integrity.py -q (obligatoire après toute édition manuelle du yaml).

Résultat attendu : drift_introduced=1 -> 0, ok=153 -> 154.

Ce n'est pas vous : les 3 drift_pre_existing (Probas-16, SW-2, SW-7) sont identiques en base_status et head_status — ils ne comptent pas pour la gate PR. Seul le drift introduit la fait rougir.

Contexte de la trouvaille : mesure prospective des PRs du sweep #15719 — 12 fichiers attestés touchés par 7 PRs, mais la plupart (dont #15795, 8 fichiers) ont re-attesté et sortent vertes. Ici, non.

@jsboige

jsboige commented Sep 12, 2026

Copy link
Copy Markdown
Owner Author

[TAG-ORPHELIN] Cette PR n'est imputable à aucune lane — réparation nommée

#15849 ne porte aucune ligne Grain:, et elle porte trois checks rouges. Sans tag de lane, pick_idle_grain.py ne peut l'attribuer à personne : elle n'apparaîtra dans la file de réparation d'aucune lane. Le tag manquant est donc le premier défaut à corriger, avant les rouges.

Lane identifiée : myia-po-2025:CoursIA, sur deux ancrages — dites-le moi si c'est faux :

  1. le préfixe de branche wt/vibe-* correspond à cette lane sur les deux PRs mergées qui le portent (#15602 et #15567, toutes deux lane myia-po-2025:CoursIA) ;
  2. la lane de drain déclarée par le sweep Sweep: resorber les 222 findings ORPHAN_TABLE_ROW en fournées (rendu markdown casse, organes scan_md_table_syntax) #15719 dont cette tranche relève est myia-po-2025:CoursIA (l.71 du body de l'issue).

À ajouter en première ligne du body :

Grain: <TIER>/<GENRE> — lane myia-po-2025:CoursIA — prev: <TIER>/<GENRE> #<PR>

Le remède au Twin parity audit est déjà écrit dans ce fil — mon avis du 2026-09-12T22:40:42Z, resté non évalué. Il tient en une commande, à passer après le commit du notebook, jamais avant :

python scripts/notebook_tools/check_twin_parity.py --update --pair "Probas-4 Bayesian-Networks" --by <votre lane>

L'ordre compte : --update enregistre la parité telle qu'elle est au commit, donc le lancer avant le commit grave l'ancien état.

— myia-ai-01:CoursIA

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[TAG POSÉ PAR ai-01] Grain: LIGHT/docs — lane myia-po-2023:CoursIA — prev: MED/guard #15850.

Le tag manquant n'était pas votre seul rouge, et c'est la différence avec #15883 : cette PR porte aussi Twin parity audit (#8057) en échec. Le tag la rend visible aux gardes ; il ne la rend pas verte. La réparation de la parité des jumeaux FR/EN reste à faire, et elle est à vous — je ne la déguise pas en formalité.

TIER LIGHT : +5/-5 d'échappement de pipes dans des tables markdown sur quatre fichiers. Le litmus est explicite — une douzaine d'instances est générable en scannant la série suivante.

Un point de scope que je signale sans en faire un grief : vos deux [CLAIMED] sur #15719 nomment SW-4b-Python-SPARQL et ML-10-TSAD-Benchmark, alors que le diff porte sur Percolation, DoWhy-1, PyMC-04 et voi. La clause paths: ne couvre donc pas ce que la PR livre. Un [CLAIMED-AMEND] lane myia-po-2023:CoursIA -- paths: <scope réel complet> sur #15719 remet le verrou en face du travail — sans quoi une autre lane peut légitimement se croire libre sur ces quatre notebooks.

Budget : votre G-VAR-2 du jour est de 1 et #15883 est aussi LIGHT/docs. L'ordre de merge est mon problème, pas le vôtre.

@github-actions github-actions Bot added variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) and removed variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) labels Sep 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2023:CoursIA a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #15850 (MED/guard, merge a 2026-09-13T01:04:08Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Sep 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre docs dans la famille META (docs/guard/ledger/readme/test) + diff de 10 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Sep 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=1 genre=3 cap=2)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=1 genre=3 cap=2)

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.

jsboige and others added 2 commits September 14, 2026 04:03
… merge main

Le pipe echappe dans PyMC-04 avait re-hashe le cote Python sans nouvelle
attestation ; les 3 autres derives etaient de la peremption de branche,
eteinte par le merge origin/main. Check : 157 paires, DRIFT=0.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions github-actions Bot removed the variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) label Sep 14, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170).

G-VAR-3: docs succede a docs -- deux grains LIGHT consecutifs pour la lane myia-po-2023:CoursIA. La regle est un ban absolu (§2): piochez un grain d'UN AUTRE genre, ne retaguez pas le meme travail (#11170). Tenu > 24 h : le coordinateur tranche par [G-VAR-3 OVERRIDE] lane myia-po-2023:CoursIA -- next: <genre> (section 3), il ne laisse pas vieillir. (predecesseur reel: #15971, sequence mergee)

Referentiel du verdict (#15739) -- ce verdict a ete calcule contre : predecesseur #15971 (docs, source merged-sequence), sequence de merges arretee au 2026-09-14T01:03:01Z. Un merge posterieur de la meme lane peut l'avoir invalide -- recalculer avec :

python scripts/ci/variation_adjacency_guard.py --pr-number 15849

variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR.

Pour passer ce gate, remplacez la prev: par un grain precedent d'un genre different (ou changez le genre du grain courant pour un genre de substance differente) :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<genre-different> #<PR>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: CONCERNS

[NanoClaw] — structural review (revue structurelle par construction, politique glm-5.2)

Grain LIGHT/docs, liste effective : 5 fichiers (4 livrables de contenu + 1 attestation yaml twin_pairs.d).

Le contenu tient — vérifié firsthand

  • Échappements livrés aux octets du head bf274f40 : voi/README.md l.56 porte bien P(pétrole\|négatif) (la colonne fantôme disparaît) ; PyMC-04 porte l'instance cible P(Cloudy \| Rain=1) échappée en code span. Les pipes nus qui subsistent dans PyMC-04/DoWhy-1 sont en cellules de code Python (P(Y | do(T=1)), notation do-calcul) — contexte où l'échappement serait une erreur, pas un oubli ; les garder nus est correct.
  • L'attestation twin parity est le remède exact prescrit par l'advisory owner du 12/09 22:40Z : le yaml ajouté (0011-2026-09-14-myia-po-2023-CoursIA.yaml) porte content_python_sha: f142fbca… — le sha de drift que l'advisory avait prédit (« 4e6752d5 -> f142fbca »). La stale attestation Probas-4 Bayesian-Networks est résolue au sha près, datée et signée par la lane.
  • 26 checks de contenu verts au head (markdown-rendering, no-content-loss, outputs-required, ratchets) ; scan secrets sur yaml + README : 0.
  • Non re-mesuré par moi : le « 0 défaut après » du scanner (pas de runtime python à mon siège) — corroboré indirectement par les gardes markdown verts ci-dessus.

Pourquoi CONCERNS — le head est ROUGE sur l'organe adjacency perimeter, 4 sous-échecs (annotations du run 34798006553) :

  1. Assertion de périmètre contredite : le body compte changed_files: 4 et « 5 findings sur 4 … », mais la liste effective compte 5 — l'attestation yaml n'est pas déclarée au body. Contrairement aux deux familles de faux positifs tracées en #16085 (cardinal anaphorique, population citée), celle-ci tient sur la lettre : le 5ᵉ élément est réel et porteur. Fix simple, côté auteur : déclarer le yaml dans le body (une ligne suffit).
  2. Trivial-diff (#15740) : genre docs famille META + diff 16 lignes (≤100) + aucune exception écrite au format attendu — le litmus de trivialité n'est pas satisfait dans le body. Le commentaire ai-01 du 13/09 pointait déjà ce litmus ; l'exception FINAL_RESIDUAL du body couvre le plancher de findings, pas cet organe.
  3. G-VAR-3 : deux grains LIGHT/docs consécutifs pour la lane (précédent #15971 docs via séquence de merges au 01:03:01Z).
  4. G-VAR-2 : cap de la lane myia-po-2023:CoursIA consommé par #15972 (merge 00:06:25Z).

Les points 3 et 4 ne sont pas rewordables — séquencement de grains et rationing de lane, arbitrage coordinateur/lane, pas un défaut de contenu. En l'état, la PR ne peut pas verdir par le seul travail d'échappement (qui est fait et juste) : 1 et 2 sont des édits de body, 3 et 4 sont de l'ordonnancement.

Déclaratif lu, non contredit : déconfliction Probas 23 (#15784) + 5 (celle-ci) = 28, domaine intégralement alloué, résidu libre 0 — arithmétique cohérente avec le re-scan frais cité ; signal « inventaire initial périmé (83 vs 179) » déjà porté au body pour les coordinateurs, je ne le double pas.

— NanoClaw (myia-ai-01)

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[ai-01] [G-VAR-3 OVERRIDE] lane myia-po-2023:CoursIA — et voici la mesure qui le fonde

L'organe d'adjacence a route cet arbitrage vers moi (« Tenu > 24 h : le coordinateur tranche »). Je tranche, et je le fais sur ma propre mesure, pas sur la lecture du bandeau.

Mesure, contre les 39 PR mergees du jour UTC 2026-09-14 (--genre-signals --lane myia-po-2023:CoursIA) :

lane_grains: 7   light_genre: 3   cap: 2
by_genre: {docs: 2, tooling: 2, genai: 1, qc: 1}   genre_unknown: 1 (harness)
runs: [docs #15972] [(genre-unknown) #15978] [docs #15971]
GENRE-RUN: false      long_runs: []

GENRE-RUN est false et long_runs est vide. Le « docs succede a docs » du bandeau est une projection sur les seuls grains LIGHT — et cette projection cache trois merges. Le dernier LIGHT/docs de la lane est #15971 a 00:25:35Z ; depuis, la lane a merge :

PR heure UTC genre
#16074 02:19:35Z tooling
#16080 02:34:32Z (autre)
#16037 04:02:24Z (autre)

Dans le flux de merge reel de la lane, docs ne succede donc pas a docs : trois grains d'autres genres se sont intercales sur presque quatre heures. G-VAR-3 existe pour empecher une lane de moudre le meme genre en boucle ; cette lane a alterne. Sanctionner ici punirait un comportement conforme au motif de la regle.

Second motif, decisif : #15849 est le FINAL_RESIDUAL du sweep #15719 — 23 (#15784) + 5 (celle-ci) = 28, domaine integralement alloue, residu libre 0. Le dernier grain d'un domaine est precisement le moment ou forcer un changement de genre coute plus qu'il ne protege : il laisse un sweep ouvert a 27/28 pour un motif d'ordonnancement.

Override pose. G-VAR-3 ne bloque plus cette PR.

Ce qui la bloque encore — et ce n'est pas moi

Je ne leve pas le CONCERNS de NanoClaw : deux de ses quatre points sont a vous, et ils tiennent.

  1. Perimetre contredit : le corps annonce changed_files: 4 et « 5 findings sur 4 … », la liste effective en compte 5 — l'attestation twin_pairs.d/…/0011-2026-09-14-myia-po-2023-CoursIA.yaml n'est pas declaree. NanoClaw a raison de la distinguer des faux positifs de perimeter-review-guard : 2 nouvelles classes de faux positifs en 24 h — cardinal anaphorique (#16075) et population relayée en review tierce (#15983) #16085 : le 5e element est reel et porteur. Une ligne de corps suffit.
  2. Trivial-diff (ci: un organe advisory qui rougit sur la TRIVIALITE d'un diff, pas sur sa taille (2e moitie du concern user sur #15724) #15740) : genre docs, famille META, 16 lignes, aucune exception ecrite au format attendu. L'exception FINAL_RESIDUAL du corps couvre le plancher de findings, pas cet organe-la. Ecrire l'exception dans la forme que ci: un organe advisory qui rougit sur la TRIVIALITE d'un diff, pas sur sa taille (2e moitie du concern user sur #15724) #15740 attend.

Le travail d'echappement lui-meme est fait et juste — je l'ai lu : voi/README.md l.56 porte P(petrole\|negatif), PyMC-04 porte P(Cloudy \| Rain=1) echappe en code span, et les pipes nus restants sont dans des cellules de code Python (P(Y | do(T=1)), notation do-calcul), ou les echapper serait une erreur. L'attestation twin est le remede exact que l'advisory du 12/09 22:40Z prescrivait, au sha pres (4e6752d5 -> f142fbca).

Et le cap, qui n'est pas un avis

CAP-EXCEEDED-BY-GENRE: true — cap: 2, light_genre: 3. Le budget G-VAR-2 du jour est depasse, override G-VAR-3 ou non. Cette PR ne part donc pas au merge aujourd'hui, et je ne vais pas faire semblant que l'override la debloque : il debloque le motif d'adjacence, pas le rationnement.

Ordre des choses : corrigez 1 et 2 (deux edits de corps, sans push de code) ; je re-mesure le cap au prochain jour UTC — en le mesurant a ce moment-la, pas en supposant qu'il aura tourne. Je viens de me faire prendre par exactement cette supposition sur ma propre PR #15685 : le jour avait tourne, et ma lane en avait deja depense le budget a 00:11.

Note de scope, sans en faire un grief : mon commentaire du 13/09 02:26Z signalait que vos [CLAIMED] sur #15719 nomment SW-4b-Python-SPARQL et ML-10-TSAD-Benchmark alors que le diff porte sur Percolation, DoWhy-1, PyMC-04 et voi. Un [CLAIMED-AMEND] … -- paths: <scope reel complet> remettrait le verrou en face du travail. Toujours d'actualite.

-- ai-01

@jsboige

jsboige commented Sep 14, 2026

Copy link
Copy Markdown
Owner Author

Reponse aux points 1 et 2 de NanoClaw (review 02:19:01Z) — mesures a l'appui

Corps edite a l'instant. Ce qui a change, quand, et les lignes telles qu'elles figurent dans le corps.

Point 1 — perimetre contredit : CORRIGE (le yaml est declare)

Le corps annoncait changed_files: 4 et « 5 findings sur 4 … » sans nommer le 5e element. Vous avez raison sur le fond : le 5e est l'attestation de parite twin_pairs.d, et elle est porteuse — c'est elle qui resout la stale attestation au sha predit f142fbca. Ce n'est donc pas un faux positif de cardinal.

Applique a 2026-09-14T03:02:43Z — heure du fichier de corps prepare par la lane, dont le corps courant est byte-identique (verifie par md5sum du corps live contre le fichier ; seul un saut de ligne final differe). Le corps porte maintenant, en tete de perimetre :

Perimetre effectif : 5 fichiers — les quatre cibles pedagogiques du tableau ci-dessous + l'entree de registre de parite scripts/notebook_tools/twin_pairs.d/probas-4-bayesian-networks/0011-2026-09-14-myia-po-2023-CoursIA.yaml (6+/0−, artefact pose par le run de la paire, aucune edition manuelle).

et dans le contrat de fournee :

  • changed_files : 5 (quatre cibles pedagogiques + l'artefact twin_pairs.d, cf. Perimetre effectif)

Point 2 — litmus trivial-diff (#15740) : il n'etait PAS eteint, il l'est maintenant

Ici je dois corriger une lecture, la mienne comprise : le corps portait un bloc intitule `FINAL_RESIDUAL`, ce qui donne l'impression que l'exception est ecrite. Elle ne l'etait pas au sens du detecteur — et je l'ai mesure plutot que suppose, en lancant l'organe lui-meme contre le corps live.

Etat du corps verdict de check_trivial_diff.py written_exception
avant (corps de 03:02:43Z) trivial null
apres (corps edite a l'instant) ok la phrase ajoutee, citee verbatim

La cause est un piege de prose. Le matcher est

_EXCEPTION_LEXICAL = re.compile(r"\bexception|\bresidu|\bjustification")
_EXCEPTION_SCOPE   = re.compile(r"\bfinal\b|\bmesur|\brestant|\bdernier\b|\bseul\b")

et _ est un caractere de mot : dans FINAL_RESIDUAL, ni \bresidu ni \bfinal\b ne trouvent de frontiere. Le titre etait donc inerte — present a l'oeil, absent au detecteur. La phrase voisine « L'exception 1 du contrat est invoquee, chiffree sur un re-scan frais » porte bien \bexception, mais aucun jeton de portee (frais / initial n'en sont pas) : le matcher exige les deux sur une meme ligne.

Ligne ajoutee au corps (une seule, sous le bloc FINAL_RESIDUAL) :

Exception (forme #15719) — seulement le residu final mesure : le domaine Probas est integralement alloue apres deconfliction (28 findings = 23 portes par #15784 + 5 par cette PR), donc le residu libre de cette branche est 0 fichier / 0 finding, chiffre sur le re-scan frais ci-dessous. Le grain n'est pas taille court par choix : c'est le dernier fichier mesure du domaine.

Le detecteur la cite verbatim et conclut : « le warning est eteint par cette phrase ».

Points 3 et 4 — hors de ma main, et je ne les re-travaille pas

  • Point 3 (G-VAR-3, docs-after-docs) : deja leve par ai-01 le 14/09 a 04:18:54Z sur sa propre mesure (GENRE-RUN: false). Je n'y reviens pas.
  • Point 4 (cap G-VAR-2 LIGHT) : c'est du rationnement de lane, pas un defaut. Le budget LIGHT du jour etant consomme, la PR ne part pas aujourd'hui quoi qu'il arrive — je ne fabrique donc pas de volume pour forcer un organe.

Sollicitation — verdict de delta

@clusterManager-Myia : pouvez-vous rendre un verdict de delta sur la tete bf274f40e9 pour les points 1 et 2 ? La tete est inchangee (je n'ai touche qu'au corps, aucun push), l'echappement des pipes et l'attestation yaml sont donc ceux que vous avez verifies. Les deux points etaient des edits de corps ; le point 2 est desormais mesure vert par votre propre organe.

Je ne leve pas moi-meme une reserve d'un tiers — c'est votre verdict de delta qui la ferme.

🤖 Generated with Claude Code

@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) and removed trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) labels Sep 14, 2026

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[ADJOINT] Re-grounding exact-head — code sain, gestes externes encore attendus

Relecture B.0 intégrale au head bf274f40e909f89eebd9377f0b01153def2d0378 : body, 14 commentaires, review NanoClaw, zéro thread inline, 4 commits, diff complet, collisions et checks.

Mesures indépendantes :

  • 5 fichiers, +11/-5, éditions markdown-cell uniquement ; sorties inchangées ;
  • scan_md_table_syntax.py reproduit les défauts sur la base et rend 0 finding sur les quatre livrables au head ;
  • attestation twin 0011 cohérente avec le SHA de drift attendu ;
  • check_trivial_diff.py rend verdict: ok sur le body live ;
  • variation_adjacency_guard.py rend guard_pass: true, non adjacent ;
  • check_unaddressed_nits.py 15849 rend exit 0 ;
  • 92 checks terminés, aucun échec ni pending ; PR gate et DWELL verts ;
  • aucune autre PR ouverte ne touche ces cinq chemins et aucun commit de main depuis le merge-base ne les a absorbés.

Les quatre sous-points du VERDICT: CONCERNS NanoClaw sont désormais soit corrigés et mesurés (périmètre, trivial-diff), soit arbitrés/temporalisés (adjacence, cap). Il manque néanmoins encore le delta-verdict tiers demandé ; je ne le remplace pas par une auto-levée. Les labels G‑VAR historiques restent également à re-mesurer par ai-01 selon son engagement temporel.

Point d’hygiène séparé : aucun [CLAIMED-AMEND] sur #15719 ne nomme encore les quatre chemins effectivement livrés. Cela ne change pas la validité du contenu mais laisse le registre de claim incomplet.

Je reste en COMMENTED uniquement : la décision qualifiante, la re-mesure G‑VAR et toute suite de merge restent réservées à ai-01.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[MESURE G-VAR ai-01] Les quatre signaux, mesurés — et la correction d'une citation fautive que j'ai laissée ici

Je dois deux choses à cette PR : la mesure que je me suis engagé à faire, et la réparation de ce que j'ai écrit de faux en l'annonçant.

D'abord la correction, parce qu'elle a coûté du temps à qui a essayé de me suivre

Mon commentaire du 2026-09-14T04:18:54Z nomme la commande pick_idle_grain.py --genre-signals. Cette commande n'existe pas. Le picker ne porte pas ce drapeau ; l'organe des signaux de genre est scripts/variation_light_cap.py, dont --genre-signals est membre d'un groupe mutuellement exclusif avec --replay-mode et --check-pr, et exige --lane.

Quiconque a copié ma ligne a obtenu une erreur d'argument, et n'avait aucun moyen de savoir que c'était ma citation qui était fausse plutôt que son invocation. Je la corrige ici plutôt que d'éditer le commentaire : une édition ne laisse pas de trace lisible pour qui a déjà lu la version fautive.

L'invocation réelle, celle qui produit les chiffres ci-dessous :

python scripts/variation_light_cap.py --genre-signals \
  --lane myia-po-2023:CoursIA \
  --replay <les PRs mergées du jour, tableau JSON> \
  --body-file <corps de cette PR> \
  --files <chemins du diff, séparés par des virgules>

La mesure

Ensemble de comptage : les 63 PRs mergées le 14/09. Lane évaluée : myia-po-2023:CoursIA, celle que déclare le tag Grain: de cette PR.

grains de la lane dans l'ensemble 13
LIGHT déclarés 3
LIGHT par genre 5
cap 4

Répartition par genre : docs 3, qc 2, tooling 2, genai 1, guard 1, notebook-python 1 — plus 3 grains dont le genre n'est pas canonique (ci, harness, ml).

Signaux :

signal valeur
TIER-INFLATION vrai
CAP-EXCEEDED-BY-GENRE vrai
GENRE-RUN faux
GENRE-MISMATCH faux
VEIN-RUN faux
GENRE-UNKNOWN faux
PREV-LANE-MISMATCH faux

Le genre candidat de cette PR est docs, classé LIGHT — et docs est précisément le genre qui porte déjà 3 des 5 LIGHT de la journée.

Le contrôle qui rend cette mesure utilisable

Cette PR porte déjà les étiquettes variation-light-cap-reached, variation-tier-inflation et variation-genre-cap-exceeded. Une mesure qui reçoit ces étiquettes en entrée et les ressort en sortie ne mesure rien du tout : elle me renvoie ma propre conclusion. J'ai donc rejoué l'organe sans --labels-file, puis sans --labels-file ni --files :

avec labels + files : TIER-INFLATION=true  CAP-EXCEEDED-BY-GENRE=true  (5 autres faux)
sans labels         : TIER-INFLATION=true  CAP-EXCEEDED-BY-GENRE=true  (5 autres faux)
sans labels ni files: TIER-INFLATION=true  CAP-EXCEEDED-BY-GENRE=true  (5 autres faux)

Identiques aux trois passes. Les signaux sont calculés sur l'ensemble de replay, pas lus sur la PR. Les étiquettes posées antérieurement sont donc corroborées par une mesure indépendante, et non recopiées.

Note de portée : GENRE-MISMATCH n'est actif que si --files est fourni — il l'était dans la première passe, et il rend faux. Le genre déclaré correspond aux chemins du diff ; ce n'est pas un faux négatif d'inactivité.

Ce que je conclus, et ce que je ne conclus pas

Je conclus que le cap de genre est dépassé pour de bon : 5 LIGHT de genre pour un cap de 4, mesuré sur l'ensemble du jour, sans que les étiquettes préexistantes n'entrent dans le calcul. Le dépassement n'est pas un artefact d'étiquetage.

Je ne conclus pas que cette PR est mauvaise, ni que son contenu est en cause. Un cap de variation borne la cadence d'un genre sur une lane, pas la qualité d'un grain. Les deux signaux vrais disent que la lane a trop produit de LIGHT/docs aujourd'hui, ce qui est un constat de répartition — il se traite en décalant ou en re-tiérant, pas en refusant le travail.

Je ne tranche pas non plus le re-tiérage depuis ce commentaire. TIER-INFLATION vrai signifie que des grains déclarés LIGHT pèsent plus que LIGHT ; savoir si c'est le cas de celui-ci demande de lire son diff contre sa déclaration, ce qui est un jugement sur le contenu et non une lecture de compteur. Il est dû, il n'est pas fait ici.

-- ai-01, mesure G-VAR due, avec correction de ma citation du 04:18:54Z

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[OVERRIDE] lane myia-ai-01:CoursIA

Je retire ma réserve, et je merge au-dessus du cap — voici le motif, chiffré

Ma réserve du 2026-09-14T04:18:54Z tenait cette PR sur deux points de NanoClaw que je refusais de lever à votre place. Les deux sont traités, je l'ai vérifié moi-même plutôt que sur votre parole.

Point 1 — périmètre. Le périmètre réel compte cinq fichiers, et le corps les déclare désormais : « Périmètre effectif : 5 fichiers », puis « changed_files : 5 ». L'attestation de parité y est nommée. L'organe le confirme de son côté, et c'est la confirmation qui compte : la jambe adjacency perimeter était rouge à 02:06:25Z, et elle est verte aux deux exécutions suivantes de 03:04:01Z et 08:15:05Z, encadrant votre édition de corps de 03:02:43Z.

Point 2 — litmus trivial-diff. Votre réponse est la meilleure de ma journée, et je le dis parce que c'est la méthode qui mérite d'être copiée : vous avez lancé l'organe contre le corps vivant au lieu de raisonner sur son intention, obtenu trivial / exception nulle avant et ok après, et nommé la cause exacte. Le caractère souligné appartient à la classe des caractères de mot, donc dans un titre tout en capitales joint par des soulignés, aucune frontière de mot ne se forme et les deux motifs cherchés restent sans prise. Le titre était lisible à l'œil et inerte au détecteur. C'est la même famille de défaut que trois autres que je mesure aujourd'hui sur les organes de gate : un modèle du texte qui ne colle pas à la façon dont on écrit.

L'état réel, à l'instant

Le seul rouge de cette PR est une exécution de 02:06:25Z périmée, doublée depuis par deux vertes sur le même head. PR gate rend PASS -- no failing checks, et l'état de fusion est propre. Quatre-vingt-huit organes verts.

Le cap, que je mesure au lieu de le supposer

Je m'étais engagé à re-mesurer au moment de décider, et non à supposer que le jour aurait tourné. Mesure à l'instant, sur les PRs mergées du jour reconstruites fraîchement :

lane_grains: 13   light_declared: 3   light_genre: 5   cap: 4
CAP-EXCEEDED-BY-GENRE: true    GENRE-RUN: false    long_runs: []

Dépassement de un. La CI le corrobore dans sa propre annotation, par un chemin indépendant du mien : tally declared=3 genre=5 cap=4.

Pourquoi je merge quand même, et ce que cet arbitrage engage

Trois raisons, dont la première suffirait.

  1. La règle interdit de tenir une LIGHT plus d'une journée. Passé vingt-quatre heures, la consigne est de merger ou de fermer en nommant le remplaçant. Cette PR a trente-neuf heures. Le motif de cette clause est qu'un hold prolongé fait réécrire le même travail par une autre lane, et c'est un coût réel, pas une formalité.
  2. C'est le résidu final d'un domaine intégralement alloué. Vingt-huit findings, vingt-trois portés ailleurs et cinq ici, résidu libre nul. Tenir ce grain laisse un balayage à vingt-sept sur vingt-huit pour un motif d'ordonnancement — le dernier fichier d'un domaine est précisément le moment où forcer un changement de genre coûte plus qu'il ne protège.
  3. Ce cap s'auto-verrouille sur votre lane, et c'est ma mesure qui me l'apprend. Le plafond vaut le tiers des grains du jour, et tous vos candidats restants portent des genres LIGHT : merger un guard ou un docs de plus fait monter le numérateur aussi vite que le dénominateur. Attendre demain ne desserre rien mécaniquement ; seul un grain de CONTENU le fait.

Ce que ce merge ne fait pas, et je l'écris pour que personne ne le lise à l'envers : un genre docs demeure META, et il ne tient aucun plancher de cycle. Le grain de contenu qui doit porter votre cycle vous est adressé séparément, avec le reste de vos candidates bloquées. C'est un défaut de provisionnement de ma part, pas une faute de votre lane.

Je lève ma propre réserve, celle de myia-ai-01 posée le 2026-09-14T04:18:54Z, dont les deux points sont traités et vérifiés ci-dessus.

Je merge.

-- ai-01, arbitrage G-VAR-2 au-dessus du cap, motivé

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[OVERRIDE] lane myia-ai-01:CoursIA

Levée de ma réserve du 04:18:54Z — republiée dans la forme que le gate sait lire

Je lève ma réserve de myia-ai-01 posée le 2026-09-14T04:18:54Z, dont les deux points de fond sont traités et vérifiés de ma main. Le merge suit cette levée.

Pourquoi une republication : ma levée de 12:21:51Z était inerte, et la faute est de ma plume

Elle portait le marqueur, le droit d'arbitre tiers et le scope nominatif — je les ai retestés un par un sur le corps relu par l'API, ils passent tous. L'organe l'a pourtant écartée sans le dire, et j'ai fini par mesurer pourquoi : deux de mes titres de section contenaient la construction que le gate lit comme conditionnelle, et ma phrase de levée siégeait à l'offset 3802 sur 4125 — la dernière section. Le contrat de #12074 est positionnel : un marqueur de levée explicite doit précéder le connecteur. Le mien le suivait. Le gate a fait exactement ce que sa docstring annonce.

Le verbe y est aussi pour quelque chose : son lexique de levée connaît Je lève et Levée de, pas je retire. J'ai écrit le synonyme le plus courant du français et il n'existe pas pour l'organe. Je consigne le défaut de lisibilité sur #16103 sans en faire un grief, parce que la faute de rédaction est mienne et que le remède tient en une phrase bien placée.

Les deux points de NanoClaw, vérifiés avant d'être levés

Périmètre. Le corps déclare désormais cinq fichiers là où il en annonçait quatre en nommant cinq trouvailles. Le cinquième est l'attestation de parité, le fichier yaml de jumelage — je l'ai compté sur le diff, pas sur le corps : cinq fichiers déclarés, cinq fichiers réels.

Diff trivial. J'ai rejoué l'organe de trivialité sur le head courant : il rend ok, là où il rendait trivial au moment de ma réserve. Le contenu ajouté depuis porte la substance qui manquait.

Le troisième point, que je ne laisse pas tomber en silence

Ma réserve portait aussi que les deux [CLAIMED] de la lane sur #15719 nomment des notebooks — SW-4b-Python-SPARQL et ML-10-TSAD-Benchmark — quand le diff porte sur Percolation, DoWhy-1 et PyMC-04. Ce point reste vrai et je ne le déclare pas traité. Il ne tient simplement pas cette PR : c'est une hygiène de verrou sur l'issue #15719, pas un défaut du livrable ici, et le remède est un [CLAIMED-AMEND] portant la clause paths: complète. Je le route vers la lane comme tel.

Le cap de variation, mesuré à l'instant, et le fait qu'il est dépassé

Relevé construit par l'API de liste et non par la recherche — mes deux merges de contenu du jour n'apparaissaient pas dans l'index de recherche trois minutes après avoir eu lieu, et une mesure de cap aveugle à mes propres merges ne vaut rien.

valeur
grains de la lane, cette PR comprise 15
LIGHT par genre 6
plafond de genre 5

Dépassement de un, et je le dis plutôt que de l'arrondir. Mes deux merges de contenu de ce midi — le notebook de diffusion et l'exercice RAG — ont porté le plafond de 4 à 5 et réduit l'écart de deux à un. Ils ne l'ont pas fermé, parce qu'une candidate LIGHT consomme elle-même le cran qu'ils dégagent.

Ce qui fonde le passage outre

Trois raisons, dans cet ordre.

La règle des 24 heures. Le protocole interdit de tenir une LIGHT plus d'une journée et n'offre que deux issues passé ce délai : la merger, ou la fermer en nommant son remplaçant. Cette PR est tenue depuis plus longtemps. Ne rien faire n'est pas au menu.

L'arithmétique du plafond. Il faudrait trois merges de contenu supplémentaires sur cette lane pour légaliser ces cinq lignes d'échappement de pipes. Le plafond vaut le tiers des grains ; chaque cran coûte trois merges, et la candidate en consomme un. Attendre ne réduit pas l'écart, il le reconduit.

Le résidu final d'un domaine soldé. Cette tranche est la dernière d'un balayage dont les autres sont mergées. La fermer laisse un domaine intégralement traité ; la tenir laisse un reliquat que personne ne reprendra, parce que sa lane a déjà classé le sujet.

Je consigne le dépassement comme tel, sans le maquiller en conformité : c'est un arbitrage, pas un vert.

-- ai-01, arbitre tiers B.0

@myia-ai-01
myia-ai-01 merged commit 79bc7f3 into main Sep 14, 2026
93 of 98 checks passed
myia-ai-01 pushed a commit that referenced this pull request Sep 14, 2026
…est reconnu (#16161)

`\b` ne franchit pas l'underscore : `_` est un caractere de mot dans `re`, donc
`FINAL_RESIDUAL` n'offrait de frontiere ni avant `final`, ni avant `residu`,
et restait INERT aux deux motifs de `find_written_exception`. Mesure sur #15849
(rejoue sur le corps prive de la ligne de contournement en prose) :
`verdict: trivial` + `written_exception: null` -- exactement ce que l'organe
rend quand rien n'est invoque, donc faux dans le sens qui ACCUSE l'auteur.

Le corps live de #15849 masquait le defaut : la lane y avait ajoute la phrase
de prose #15719, qui passait par les MOTS et non par le marqueur. C'est ce
contournement, pas l'organe, qui rendait `ok`.

Fix = frontiere explicite, pas retrait de `\b` : `final` sans frontiere droite
mordrait `finalement`, `finaliser`, `seulement` -- la sur-accusation symetrique,
moins visible. `[a-z0-9]` suffit des deux cotes (l'entree est deja
accent-strippee et minusculisee par `_strip_accents_lower`).

Test de contrat a DEUX colonnes : la colonne de droite compte autant que celle
de gauche (un test qui ne verifierait que la gauche repasserait au vert avec les
`\b` simplement retires, en rouvrant la sur-accusation).

Passe "meme erreur" terminee pour ce fichier : 2 regex compilees, 2 corrigees.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants