Skip to content

fix(lean,#16970): REPAIR-3 morphologique map REACCENT (5 donne + 0 prouve fautifs) - #16999

Closed
jsboige wants to merge 209 commits into
feature/16638-deaccent-lean16afrom
fix/c1319-repair3-morpho-pr16970
Closed

jsboige wants to merge 209 commits into
feature/16638-deaccent-lean16afrom
fix/c1319-repair3-morpho-pr16970

Conversation

@jsboige

@jsboige jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-lean — lane myia-po-2024:CoursIA-2 — prev: MED/notebook-lean #16994-REPAIR-3-merge

Résumé

REPAIR-3 morphologique de la PR #16970 Lean-16a Conway Man and Work : map REACCENT sub-grain #16638 a transformé donne (verbe) en donné (participe) et prouve (verbe) en prouvé (participe) en prose markdown. 5 donne + 0 prouve corrections cellules [0].

Diagnostic Tell c.1319-L1 ★★★★ fondateur NEW

Batch REPAIR-3 final sur les 8 PRs sub-grain #16638 restantes non REPAIRed c.1315-c.1318. Total : 5 corrections c.1319 + 35 corrections c.1318 + 82 c.1315-c.1316 + 33 c.1317 = 155 corrections totales REPAIR morphologique sub-grain #16638.

Voie canonique Tell c.1315-L4 ★★★ fondateur NEW (étendue c.1317)

Script repair_morpho_c1318.py avec heuristiques complètes (Tell c.1318-L2 ★★★★).

Intégrité C.2

Vérif Résultat
Cells totales inchangées
Cells code inchangées (REPAIR ne touche que markdown)
Corrections réelles 5 (5 donne + 0 prouve)

🤖 Generated with Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

Base != main (advisory, #10918)

Cette PR ne livre pas sur main : son contenu attend le merge de feature/16638-deaccent-lean16a. 1 PR ouverte(s) de feature/16638-deaccent-lean16a vers main existe(nt) a cet instant -- c'est un stack legitime, le contenu est en vol. Verifier au moment du merge que la base est effectivement reliee a main.

jsboige and others added 8 commits September 20, 2026 18:00
…testee (tranche 3, branche d'integration) (#15799)

* Add: batterie d'intervention #15480 — la chaine etat -> comportement testee

Tranche 3 (critere 3 de l'acceptance) : la chaine intervention -> changement
d'etat -> changement comportemental SELECTIF est testee sur le banc
synthetique Mess3xRRXOR, pas seulement racontee.

Deux bras d'intervention (cibles en coordonnees, primitives du moteur causal
deja sur main) : sae (features latentes dediees au facteur A) et flens
(coordonnees belief du support du readout de A). Familles de controles du
moteur : sham, aleatoire apparie en norme/frequence, intact. Axe de dose =
prefixe du classement de selectivite.

Verdicts par maillon (jamais de score omnibus) : la comparaison PRINCIPALE de
chaque maillon est la selectivite A vs B ; l'effet vs sham est rapporte comme
controle de manipulation, hors famille Holm (sa null est "aucun effet causal",
pas de la selectivite) ; vs_random se joue sur la DIFFERENTIELLE de
selectivite (A - B). Test exact de permutation a signes 2^n, vectorise par
blocs (n=16 : 29,6 s -> 1,9 s), Holm sur les quatre tests substantifs.

Paysage mesure (16 seeds, n=700) : 7/8 tests substantifs SUPPORTED apres
Holm. L'unique INCONCLUSIVE est flens/comportement vs aleatoire apparie
(mediane +0,007, 10/16) — finding honnete et documente : a d=12 l'espace
produit porte A sur presque toutes les coordonnees, le controle apparie n'y
est pas A-aveugle ; c'est la motivation du bras latent, ou la selectivite vs
aleatoire tient sur les deux canaux. Ce null est gele dans les tests.

Tests : 12 gates falsifiables (identite sham/intact prouvee par les
empreintes, record = spec appliquee, chaines etat/comportement selectives
>= 75 % des seeds, controle apparie (mecanisme + substantif), dose monotone,
enum de verdicts + p_holm < 0.05, determinisme). 12/12 sous le venv local
(py3.13) ET sous python 3.9.25 sans torch (forme de l'env CI).

Floors ict-tests.yml : tests/ 1071 -> 1107 (drift main posterieur a l'epoch
de la floor ; 1107 sur origin/main COMME sur la branche, mesure sous py3.9.25
sans torch — le venv local avec torch collecte 1111 a cause de
tests/test_sae_traces_layout.py, importorskip module-level) ; ict/tests/
708 -> 755 (+47 = les quatre couches de la branche).

La mesure anterieure du 2026-09-12 annoncait 692 -> 739 : elle portait sur un
main LOCAL PERIME, anterieur a l'arrivee de ict/tests/test_attention_schema.py
(PR #15547) sur origin/main. La base etait fausse de 16 et le total avec elle ;
le floor 739 aurait laisse 16 items disparaitre en silence. Re-mesure le
2026-09-13 sur l'arbre rebase, env CI reconstruit (py3.9.25 + numpy 1.26.4 +
scipy + matplotlib, sans torch), verifie fidele a la CI : le job 103632939140
(main@5772d72dc7) porte "Collected: 692 tests (floor: 692)", identique a la
mesure locale.

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

* Fix: #15799 floor ict/tests 763 -> 775 apres rebase sur main courant

Re-mesure firsthand sur l'arbre rebase (origin/main@1ce6d47b, py3.9.25 sans
torch, deux collectes identiques) : 775 = 763 (main porte des lors les tranches
1/2a/2b) + 12 items test_intervention_battery. Label 44 -> 45 package.

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

* fix(ci,#15799): header ict-tests.yml aligne sur la re-mesure 858/52

Le matrix portait deja ict/tests/ (52 package) / test-floor 858 ; le bloc
« conventions de compte » du header reclamait encore 806 items, un label
57/50 et "50 fichiers". Prose alinee sur l'etat mesure (provenance
re-mesure 2026-09-16 ci-dessous), aucune valeur de floor modifiee.

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: myia-po-2027 <po-2027@coursia.lan>
…ble (#16025)

4e surface de #15726 : un `PR gate` FAILURE par DWELL (plancher 120 min,
aucun constituant en echec) est un MINUTEUR -- seul l'ecoulement du temps
le leve. Le picker le comptait comme un rouge de lane : mesure fondatrice
2026-09-13 (lane po-2024), les PRs 15888/15895/15902 toutes vertes hors
gate ont fait basculer le P0 « reparer ses propres PRs » par le seul seuil
count, la lane brulant son cycle a chercher dans son diff un defaut qui
n'y etait pas. Et faute de banniere d'organes, il etait en plus imprime
« organe non lisible -- le rouge RESTE a la lane » : litteralement vrai,
semantiquement faux (l'absence de banniere EST le signal).

Le verdict DWELL vit dans l'ANNOTATION du check-run (scripts/ci/
merge_dwell.py), jamais dans sa conclusion ni son nom. La lecture rend
desormais les DEUX axes : fetch_check_annotation -> (organes, echeance
DWELL) ; un seul appel API par check-run, le meme qu'avant, cache pareil.

- blocking_causes(dwell_by_name=...) : un verdict DWELL lu n'est pas une
  cause -- aucun geste de lane n'avance un minuteur.
- red_backlog : PR DWELL-seule -> ni red, ni seuil count ; l'echeance est
  rendue (print_dwell_pending) pour que l'attente soit lisible. Un point
  de review non leve ou un constituant reel prime toujours (fail-closed).
- impute_base_reds : un DWELL ne corrobore rien et n'est pas un illisible.

Fail-closed a chaque etage : pas d'id de run, annotation illisible, ou
banniere d'organes -> jamais de dispense. Une dispense de reparation ne
s'acquiert pas par une panne de mesure.

Controle sur donnees reelles : gate FAILURE courant de la PR 16018 (tete
c2ad6bc, check-run 103776736518) -- organs=[], echeance DWELL exacte
2026-09-13T21:12:02Z, lue dans l'annotation, pas dans la conclusion.

Tests : 126 passed sur test_pick_idle_grain.py (+6) ; 964 passed sur la
grappe dependante (15 fichiers picker/perimeter/lane-claim/light-cap).

Sequencement : le fichier est tenu par les PRs 15764/15778/15813 encore
ouvertes -- diff porte par le titulaire du claim, ce que la note de
l'issue sanctionne explicitement.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…rdue (#16281)

* fix(guard,#16194): l'advisory BASE-NOT-MAIN nomme la couverture CI perdue

L'advisory disait la CIBLE de livraison (« cette PR ne livre pas sur main ») et
jamais ce que la base empilee a COUTE en couverture. Un reviewer attentif en a
tire l'inverse sur #15940 : « le body declare la base empilee, ce n'est donc pas
un defaut ». C'est la lecture correcte du texte d'alors ; le trou restait
invisible la ou on le regarde.

L'organe mesure desormais le manque et le nomme. Pour chaque workflow du depot :
sa conjonction (filtre de branche cible, filtre de chemins) est-elle satisfaite
pour `main` ET pas pour la base de la PR ? Si oui, il est perdu -- et il n'est
compte que dans ce cas, pour ne pas annoncer au reviewer une perte qui n'en est
pas une (c'est le point precis que #15751 documente : les deux fichiers
matchent `paths: scripts/**` terme a terme, c'est `branches: [main]` qui a tout
eteint).

Arbitrage des trois pistes de l'issue : piste 2 retenue (faire dire la verite a
l'advisory). Piste 1 (elargir le filtre de branche) rejetee : elle multiplie les
runs sur les piles profondes pour un gain d'affichage. Piste 3 (gate de merge)
rejetee ici : design plus lourd, et un gate qui refuse un check ABSENT merite sa
propre issue.

Mesure firsthand (arbre a 2699ebd) :
  - 162 fichiers workflow, 90 declarent un trigger `pull_request` ;
  - 80 d'entre eux portent `branches: ['main']` -> jamais declenches sur une
    base empilee ; 9 sans filtre de branche ; 1 `branches-ignore: ['main']`.
  - L'issue annonce « 80 des 148 ». Le NUMERATEUR reproduit exactement (80).
    Le DENOMINATEUR ne reproduit pas : 90 declarent `pull_request`, et le depot
    compte 162 fichiers workflow (chiffre corrobore independamment par
    `check_self_hosted_runner_policy.py`, qui imprime `workflows=162`).
    `148` ne correspond a aucune des deux populations mesurees.

Verification end-to-end sur les DEUX PR empilees ouvertes a cet instant :
  - #16160 (base `feature/15666-t2-lean-exec-admission`) -> 7 workflows perdus
    nommes, dont `scripts-tests.yml` et `pr-gate.yml` ;
  - #16251 (base `feature/16057-focal-loss`) -> 28 perdus (12 nommes + repli).
  Corroboration sur #16160 : sa tete `e871e193e8` ne porte que 2 check-runs
  (`Always-on metadata guards`, `prose-counts`). `PR gate`,
  `Scripts Tests (CPU)` et `Always-on guards` sont ABSENTS -- exactement les
  workflows que la mesure annonce perdus.

Controle avant/apres sur le COMPORTEMENT (meme scenario, instance fondatrice
#15751) : la source d'origine ne porte aucune mesure (« l'advisory ne peut pas
nommer les workflows perdus ») ; la source corrigee en nomme 5. Source
restauree byte-identique apres le controle (sha256 db427a337876fb4b...).

Robustesse : `gh pr view --json files` rend la premiere page (100 max) sans
dire qu'il a coupe ; sous-compter les fichiers sous-compterait la couverture
perdue, soit un silence qui relache -- le defaut meme que cette issue mesure.
`fetch_changed_files` pagine donc via l'API REST quand `changedFiles` depasse
ce qui a ete rendu.

`build_comment` reste retro-compatible (4e argument par defaut) : le corps sans
mesure est byte-identique a l'ancien, donc l'appel a 3 arguments est intact.

Signale, non repare (autre sujet, aucune PR ni issue ouverte a ma connaissance) :
un workflow porte `branches-ignore: ['main']` -- defaut miroir, il ne tourne
jamais pour une PR visant `main`.

Tests : 37 passed (`test_base_not_main.py` 15 dont 13 nouveaux + le lock test de
l'umbrella + `test_variation_tag_required.py`), `check_self_hosted_runner_policy`
vert, YAML de l'umbrella reparsee.

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

* docs(guard,#16194): les enonces de contrat de l'organe disent ce que l'organe fait

La PR #16281 a change le contrat de l'organe -- il lit desormais
`.github/workflows` du checkout pour mesurer la couverture CI perdue sur une
base empilee -- mais trois enonces du depot affirmaient encore l'ancien, et un
quatrieme propageait un chiffre que ce meme body rejette.

  - `scripts/tests/test_base_not_main_no_paths_filter.py`, docstring :
    « reads PR-level metadata via the gh API ONLY [...] and never inspects the
    working tree ». Les deux moities sont fausses depuis #16194 -- l'organe
    lit aussi `files`/`changedFiles` et l'arbre de travail.
  - meme fichier, message d'assertion de
    `test_no_paths_filter_under_pull_request` : « Organ reads PR METADATA only
    via gh api (baseRefName, title) ».
  - `scripts/base_not_main.py`, commentaire de tete de la section : « 80 des
    148 workflows du depot ». C'est le DENOMINATEUR de l'issue, que le body de
    #16281 ecarte explicitement (le numerateur reproduit, le denominateur non :
    80 des 90 declarants, dans un depot de 162 fichiers). Un lecteur du source
    apprenait donc exactement le chiffre que le body refusait de propager.
  - `_glob_to_regex` : le sous-ensemble traduit est desormais nomme, avec ce
    qui n'est PAS traduit (`+`, `[...]`, `!` initial). Verifie firsthand :
    aucun des 162 workflows du depot ne les emploie dans `paths`/`branches`.
    La semantique exacte du `?` GitHub n'a pas ete verifiee firsthand ; elle
    est signalee comme non verifiee plutot que supposee.

Aucun changement de comportement : docstrings, un message d'assertion et deux
commentaires. Les 18 tests des deux suites concernees sont inchanges et verts.

Tests : 37 passed (`test_base_not_main.py` 15, son lock test 3,
`test_variation_tag_required.py` 19).

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

* fix(guard,#16194): le repli pagine de fetch_changed_files etait mort -- `--slurp` refuse `--jq`

Le repli ecrit dans 30f8237 passait `--paginate --slurp` ET `--jq` a la
MEME commande. gh refuse ce couplage (verifie sur 2.81.0 : « the --slurp
option is not supported with --jq or --template ») : l'appel sortait en
erreur, `_gh_json` rendait None, et la fonction repartait sur la PREMIERE PAGE
TRONQUEE. Le repli n'a donc jamais pu reparer la troncature qu'il annoncait
reparer -- le silence qui relache, soit exactement le defaut que ce module
mesure.

`--slurp` rend un tableau de PAGES (un tableau par page) ; l'aplatissement se
fait desormais dans le code, sur `filename` (champ de l'API REST ; le `files`
de GraphQL nomme le meme champ `path`). Un repli qui rendrait moins que la
premiere page est refuse : il doit ameliorer la mesure, pas la degrader.

Controle AVANT/APRES sur le COMPORTEMENT, pas sur les sources (meme fixture :
PR de 3 fichiers servie en 2 pages, gh refusant `--jq`) :

  AVANT -> ['a.py']                  SOUS-COMPTE
  APRES -> ['a.py', 'b.py', 'c.py']  OK

La branche n'etait mesuree par AUCUN test : elle ne s'arme que sur les PRs de
plus de 100 fichiers, qu'aucune des 200 dernieres n'atteint. Trois tests la
tiennent desormais -- aplatissement + absence de `--jq` dans la commande,
non-degradation, et aucun appel supplementaire quand la premiere page suffit.

Tests : 40 passed (`test_base_not_main.py` 18, son lock test 3,
`test_variation_tag_required.py` 19).

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

* fix(guard,#16194): base_not_main fail-closed quand l'acquisition gh pr view rend vide (CR #16281)

Une sortie stdout vide ou un JSON illisible sur `gh pr view` rendait un
`or {}` : fetch_changed_files publiait files=0 (faux `ci_skipped=0` --
un silence qui relache, le defaut meme que #16194 mesure), et main()
lisait base='' puis imprimait "pas un defaut, rien a faire" comme si
la PR visait main. Les deux points rendent desormais None -> rc 2 avec
verdict UNMEASURED refuse, tests de regression None ajoutes (24 passes).

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…16058) (#16312)

* Add: notebook TV-02 MoE SOTA OLMoE routing reel (bloc B item 6, See #16058)

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

* Fix: TV-02 cell0 lien 3.4c delie - le notebook cible n'existe que sur la PR #16152 (ouverte), le lien etait mort sur toute branche sans elle

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…e Consensus (R11 companion) (#16899)

* docs(safety,#16757): audit du cluster selon les 10 principes du Singapore Consensus

Grille P1-P10 du companion report R11 (arXiv 2608.14611, sha8 134E9DA8)
confrontee au harnais reel : etats RENFORCE/PARTIEL ancre sur regles,
incidents documentes et pratiques vecues (preflight/DWELL/#16846 du jour).
P6 en profondeur (cascades sorry/collisions/catalogue), P7 en profondeur
(protocole anti-condensation), lecture critique inverse dans les deux sens,
recommandations bornees par la gouvernance l.87. +1 ligne index docs/README.

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

* docs(safety,#16899): align the 3 harness claims with the current rules

Claim 1 -- force-push: the audit propagated the old global interdit;
git-workflow.md 31-41 forbids it on main but allows --force-with-lease
(preferred, merge first when possible) on a single-lane PR branch
(lines 35, 99, 128, 153).

Claim 2 -- "3 PRs en flight" is a NEW proposal (G.5 caps deep tracks at
2, proactive-coordination.md requires 2 tracks min; nothing caps PRs in
flight), submitted for sign-off, not a G.5 implication (line 185).

Claim 3 -- workers-do-not-merge is an operational authority bound
(CLAUDE.md section A / coordinator-discipline.md), not a permissions
measurement of their accounts (line 35).

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…e tierce, et un dossier suivi de sa prose (#16907)

* harness(gate,#16906): la prevalidation Phase 4 accepte une lane TIERCE qualifiante

Le gate n'acceptait un dossier que de `ADJOINT_LANE` code en dur. Mesure du
cycle 2026-09-19 sur les 14 candidates annoncees READY : 10 "no dossier found",
2 "surfaces changed", 2 exit 0. Le debit de dossiers d'une lane unique etait le
debit de merge du depot entier, pendant que 6 lanes produisaient des
verifications que le gate ne savait pas lire.

Ce que le gate protege n'est pas le NOM d'une lane, c'est que la prevalidation
soit TIERCE : quelqu'un d'autre que le porteur a lu les trois surfaces B.0 a
head exact et l'a atteste dans un contrat machine-lisible.

- `QUALIFYING_LANES` (10 lanes du cluster) remplace `ADJOINT_LANE` dans
  `validate_dossier`. Une lane inconnue ou malformee echoue toujours ferme.
- Refus de l'auto-prevalidation : `carrying_lane()` lit le tag
  `Grain: ... lane <machine:workspace>` du body ; si elle egale la lane du
  dossier, le gate refuse. Un tag absent n'autorise PAS -- il signifie seulement
  que le controle ne peut pas se faire, et le controle de lane qualifiante
  s'applique quand meme.
- `render_template(snapshot, lane)` + option `--lane` : une lane rend son PROPRE
  nom. Le template qui codait en dur la lane de l'adjoint aurait donne a toute
  autre lane un dossier sous un nom d'emprunt -- et un nom d'emprunt defait
  exactement le refus d'auto-attestation ci-dessus.
- SKILL.md coordinate mis en coherence (le texte disait l'inverse du code).

Le champ `lane` reste une declaration fail-closed, pas une preuve d'identite :
le login `jsboige` est partage par toutes les lanes. Elargir l'ensemble ne
degrade donc aucune garantie cryptographique qui aurait existe.

Tests : 27 passed (5 nouveaux sur les lanes, 2 sur le rendu du template).
`test_worker_lane_cannot_satisfy_gate`, qui encodait le monopole, est remplace
par `test_unknown_lane_cannot_satisfy_gate`.

Gate non regresse sur PRs live (#16218, #16802 : rc=1 sur motifs de fond).

Changement normatif substantiel du harnais (CLAUDE.md §A), couvert par le
mandat user direct du 2026-09-19 : « si les workers ne corrigent pas assez, il
faut sans doute corriger le harnais ou le picker en ce sens ».

See #16906

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* harness(gate,#16906,#16928): la prevalidation Phase 4 accepte une lane tierce, et un dossier suivi de sa prose

Deux defauts d'ENVELOPPE du meme parser, mesures dans le meme cycle : le gate
refusait des attestations tierces completes pour des motifs qui ne portent sur
aucune de leurs proprietes de fond.

1. Lane unique (#16906). `ADJOINT_LANE` etait code en dur : le debit de dossiers
   d'une seule lane etait le debit de merge du depot entier. `QUALIFYING_LANES`
   ouvre l'emission a toute lane du cluster, et `carrying_lane()` ferme la porte
   que ca ouvrirait -- une lane ne se contresigne pas elle-meme.

2. Prose apres le marqueur (#16928). `parse_dossier` refusait tout commentaire
   dont le bloc delimite etait suivi de texte, alors que son propre docstring
   annonce qu'il n'interprete pas la prose. Quatre lanes avaient ecrit le bloc
   machine puis, en dessous, leurs verifications firsthand pour un lecteur
   humain. Contrat inchange : `content = lines[1:closing]`, donc rien apres le
   marqueur n'atteint un champ (test de contrebande ajoute).

Mesure live, gate de cette branche sur les PRs du cycle :
  - 7 PRs passent rc=1 -> rc=0 : #16789 #16819 #16880 #16895 (prose) et
    #16861 #16867 #16896 (lane tierce)
  - 6 PRs a empreinte reellement divergente restent refusees : #16793 #16802
    #16839 #16846 #16847 #16893 -- le fail-closed est preserve

Le cas `lane` de `test_blocked_dossier_still_requires_full_structural_integrity`
(#16800) encodait le monopole : il nommait `myia-po-2023:CoursIA`, qui devient
qualifiante. Re-pointe sur une lane hors `QUALIFYING_LANES`, intention preservee.

See #16906. See #16928.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* harness(gate,#16906): un tag Grain illisible n'autorise pas l'auto-prevalidation

Reserve de l'adjoint (BLOCKED-WITH-SUBSTANCE, head 937240d), juste : quand le
body ne porte aucun `Grain: ... lane ...` lisible, `carrier is None` et aucune
erreur n'etait ajoutee. Une lane qualifiante portant une PR sans tag pouvait
donc deposer son propre dossier et passer un controle qui n'avait jamais tourne.

`carrier is None` devient un refus explicite. Un controle qui ne PEUT pas se
faire n'est pas un controle qui passe.

Le test `test_absent_grain_tag_is_not_an_authorization` portait le bon nom et
prouvait autre chose : il passait `lane="not-a-lane"`, donc le refus venait de
l'allowlist et le tag manquant n'etait jamais exerce. Il passe desormais une
lane QUALIFIANTE, et asserte en plus que l'allowlist n'est PAS le motif -- sinon
il se remettrait silencieusement a certifier le mauvais scenario.

La fixture `_base_snapshot` recoit une lane porteuse distincte de celle du
dossier : sans tag, tous les cas nominaux etaient des auto-attestations.

Rayon d'impact mesure le 2026-09-20 : 4 PRs ouvertes sur 221 (1,8 %) ne portent
pas de tag lisible, et la sortie est d'ajouter le tag, pas d'affaiblir le gate.

44 tests passent.

See #16906. See #16928.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: jsboige <jsboige@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…0 = socle from-scratch explicitee (#16622)

- Parcours recommande restructure : FT-01 point d'entree (demande user
  sur #16147 : « le 1 doit venir avant »), bloc socle from-scratch distinct
- Table progression scindee parcours principal / socle 00a-00c
- Note de numerotation honnete : FT-00x = exception locale (ailleurs dans
  le depot 00 = environnement), renumerotage eventuel trace par #16231
- Rule E : FT-00c (existant sur disque depuis #16072) ajoute a la structure,
  la table de progression et la table VRAM — stale avant cette PR
- Aucun fichier renomme (references entrantes 3.9a + intra-serie intactes),
  marqueur CATALOG-STATUS byte-identique

Closes #16151

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…uee + 2.7c, mermaid corrige (#16854)

Audit fichier-entier (regle E) : 27 notebooks sur disque, 24 liens dans la table.
Ajoute 2.11c/2.11d/2.7c (table + prose mesuree + mermaid + references), deplace
2.11b dans sa famille, remplace le libelle faux "2.7c proximal" du mermaid.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
@jsboige

jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA
pr: 16999
head: d024ed1
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 16ff2f8f8d619631894f42d1e79349f335e80e6828ba42cc4661746f3ffc69ab
diff-files: 1
diff-additions: 5
diff-deletions: 164
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Dossier READY — la PR est propre sur la classe morphologique qui bloque ses sœurs de vague.

Vérifié firsthand au head exact d024ed1 (19:00-19:10Z) :

  • Checks : latest-wins-green, 0 fail / 0 in_progress. Diff : 1 fichier (Lean-16a-Conway-Man-and-Work.ipynb), +5/−164, consolidation JSON mono-ligne ; 0 output / 0 execution_count modifié ; Grain tag ligne 1 lu ; 0 reviews, 0 thread, commentaire bot BASE-NOT-MAIN lu (stack feature/16638-deaccent-lean16a).
  • Les 5 « donné »→« donne » sont TOUS des présents verbaux corrects, classés un à un : « Conway donne son nom au noeud de Conway » ; « Conway en donne une construction limpide a partir du code de Golay » ; « Conway donne aussi son nom a un noeud celebre a 11 croisements » ; « la rotation a 180 degres de $B$ autour de ce milieu donne $C$ » ; « la première fraction de la liste qui donne encore un entier ». Les anciens « donné » étaient fautifs (présent accentué).
  • Le « prouvé » ×1 est conservé intact des deux côtés.
  • Note de méthode : le motif de dépistage souple (est|sont|a|été|ont)…donne signalait 4 suspects, tous classés faux positifs par lecture contextuelle (le « a » matché était celui de « a la fonction modulaire », etc.) — aucune forme passive réelle au head.
  • 0 sorry en code.

Aucune réserve. B.0 clear.

— adjoint preflight, lane myia-po-2026:CoursIA (tierce)

myia-po-2023 and others added 19 commits September 20, 2026 19:22
…the full-tree checkout (#16209)

* fix(ci,#16207): restore PR-time markdown table scan without its cost

pull_request trigger (paths-filtered) is back on markdown-table-guard.yml;
the 2.22 Go full-tree checkout that killed it (#12817 tranche 1) is replaced
by a blob:none partial clone + dynamic `git sparse-checkout add --no-cone`
of the changed files only. Founding incident #16177: CODE_SPAN_PIPE merged
with no review-time signal. Arbitrage consigne: re-housing in
always-on-guards rejected (blast radius on the critical path).

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

* fix(ci,#16207): label description must fit the 100-char API limit

ensure_label's 422 (description too long) was swallowed by 2>/dev/null,
so the markdown-table-syntax label never existed and set_label failed
with "not found" on the very first PR-time run. Shortened description,
stderr no longer buried.

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

* fix(ci,#16207): CR 12:35Z -- lossless scan paths (NUL-safe argv), no false "Clean." on scanner failure, whitespace-filename positive control

Repond aux 3 exigences de la CR ai-01 2026-09-16 12:35Z sur #16209 :

1. Passage lossless des chemins : git diff -z + grep -z + mapfile -d ''
   (argv octets-exacts). L'ancien "$(cat changed.txt)" splitait chaque nom a
   espaces du depot ('Créateur de mail personnalisé.ipynb', 'Conférence Tech
   2025', 'Correction  Activités GenAI.md', ...) en argv orphelins -> le
   scanner rendait exit 2 ("rien a scanner") -> payload vide -> faux "Clean."
   + retrait du label. Reproduit localement (exit 2, payload 0 octet, TOTAL=0).

2. Payload manquant/invalide != 0 : RC explicite du scanner + garde sur le
   parse (case numerique). Sur panne de mesure : ::error:: + label LAISSE
   EN PLACE (jamais d'unset sur un etat non mesure).

3. Controle positif live : fichier "$RUNNER_TEMP/md-table controle.md"
   (NO_SEP) scanne a chaque run -- un split whitespace le casserait en 2 argv
   -> exit 2 -> controle rouge. Ne nourrit pas le label (scan separe) : il
   gate la fiabilite de la mesure. Coordonne avec #16266 : hunks disjoints
   (leur ligne de description du label est deja satisfaite sur ce head).

Coordonne avec #16266 (markdown-table-guard.yml partage); verifie par
lecture des 2 diffs: aucun overlap textuel.

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

* fix(ci,#16207): positive control runs on EVERY run (not only when the PR has in-scope files)

Le controle positif d'abord sautait par l'early-exit COUNT==0 : sur une PR
workflow-only (le cas de la PR elle-meme) il ne s'executait jamais -> la
preuve live n'existait qu'en smoke local. Deplace en amont de l'early-exit,
il tourne a chaque run (PR-time ET nocturne) : preuve permanente du passage
argv lossless sur l'infra reelle.

Drapeau SCAN_RC porte la panne de mesure (controle ou scan reel ou parse
non numerique) jusqu'a la decision de label ; l'early-exit COUNT==0 est
lui-meme fail-closed (unset conditionne a SCAN_RC==0).

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

---------

Co-authored-by: jsboige <jsboige@gmail.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
… hommages 2026 (#16218)

* docs(search,sudoku): rewrites 8 notebook credits to match 2026 hommage pattern

Refs #16214. Replaces the minimalist "### Source" sections in 8 notebooks
that adapted student projects from EPITA PPC 2024/2025/2026 and ECE 2026
with a full "## Hommage a un travail etudiant" section, aligned to the
2026 hommage pattern established by PR #13323 and reused in App-22, App-26.

For each notebook: authors with GitHub handles, URL to tree/main/<sub-project>,
commit SHA, licence (MIT verified or "non specifiee -- utilisee avec
attribution" per user confirmation 2026-09-15), plus an explicit "ce notebook
distille..." sentence that places the student work in a wider pedagogical
frame (Munkres-style hommage gesture, cf. user 2026-09-15 note).

The credit "jsboigeEpita/2025-PPC" (404 GitHub) was replaced everywhere
with the actual repo "jsboigeEpita/2025-Epita-Programmation-par-Contraintes".

Only markdown cells touched -- code cells and execution_count preserved on
all 174 code cells. nbformat 4.5 intact, kernelspec python3 intact.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(#16218): corrige liens profils GitHub translitteres + registre twin DRIFT

21 remplacements URL dans les cellules markdown d'Hommage de 8 notebooks
Python (App-3, App-4, App-6, App-7, App-11, App-14, App-19, Sudoku-16) :
chaque lien `prenom.nom` (404 verifie) est remplace par le login reel
`.author.login` du commit EPITA source (ex. `leo.lopes` -> `Lazyyx`,
`gabriel.monteillard` -> `CornFlexxxxxxx`, `yahya.ahachim` -> `qghrjf646`,
`timothe-le-bronec` -> `thorgal27`). 4 logins non resolubles (404, ANON,
Organization) : nom garde en gras, lien retire. 7 paires DRIFT Python/C#
attestees via `check_twin_parity.py --update --pair` avec entree
`known_differences` factuelle par paire. Cellules code intactes, le
twin C# n'est pas touche. Resolution de la reserve NanoClaw #16218 +
CONTRIBUTING attestation.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(twin-parity,#16218): rebaseline 7 paires DRIFT (App-3/4/6/7/11/14/19)

Suite au re-ecriture des credits (#16218, commits 9b84dd3 + 2d1c9e7),
les paires App-3/4/6/7/11/14/19 passent en DRIFT cote Python uniquement :
la prose d'index a ete re-ecrite pour matcher le patron 2026 hommage,
le SHA Python bouge ; le cote C# reste inchange (credits differents par
construction, asymetrie documentee). Le rebaseline atteste la nouvelle
parite pedagogique (meme socle theorique, prose d'index distincte) ;
les twin_pairs.d/<slug>/*.yaml ajoutes (file-per-audit #14911) suivent
le pattern append-only avec index sequentiel + by: lane.

7 paires traitees dans cette passe :
- App-3 NurseScheduling (Search/Applications/CSP)
- App-4 JobShopScheduling (Search/Applications/CSP)
- App-6 Minesweeper (Search/Applications/CSP)
- App-7 Wordle (Search/Applications/CSP)
- App-11 Picross (Search/Applications/CSP)
- App-14 ConnectFour Adversarial (Search/Applications/CSP)
- App-19 ProceduralGeneration WFC (Search/Applications/PCG)

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(docs,#16218): rebuild 3 hommages avec verite upstream (.author.login + LICENSE)

Grain: MED/notebook-python -- lane myia-po-2027:CoursIA-2 -- prev: MED/notebook-python #16180

Trois CHANGES_REQUESTED ai-01 sur PR #16218 (head 3ca9976) adresses :

1. Sudoku-16 : Gautier Gally=Bl44nc (verifie), Virgile=Zar-meyo (Virgile Hermant
   verifie), ReoZ=Paul-abi (Paul Abi Saad, distinct de Virgile upstream),
   Matis=VyrtualL, Theophile=theophilestourbe, BinaryAlien=Binary,
   Florine=floflokie (Florine Kieraga), Nael=Naelja02 (Nael El Janati),
   Akaagi, Clovis=ClovisDyArx (Clovis Lechien), Alex=TopAgrume,
   FlorianSegard, Gaspard-s=Gaspard Saliou. Les liens fabriques par
   translitt. "gautiergally"/"virgile" corriges. La fusion Virgile+ReoZ
   en "Virgile Reoz" corrigee (deux comptes distincts upstream).
   Florian sans login verifie conserve en mention sans lien.

2. App-14 : Leo Sambrook=petitwhito (auteur PR #39), Arthur
   Hamard=reg1um (Connect4 board/Minimax/Notebook/DQN), Arthur
   Guelennoc=AntitheticalElysium (Negamax/MonteCarlo). Licence non
   specifiee -> MIT (Copyright (c) 2025 jsboigeEpita, verifie firsthand
   via raw.githubusercontent.com/.../LICENSE).

3. App-19 : Timothe Le Bronec=thorgal27 (commit 08dfe96 etudiant +
   cherry-pick 621f1cc jsboigeEpita), licence heritee du repo parent
   MIT (verifie 2026-09-17, pas de LICENSE locale).

Methodologie : gh api users/<login> pour resolution nom reel ;
gh api repos/<repo>/commits pour auteur et SHA ;
gh api repos/<repo>/pulls/<N>/commits pour liste complete des
contributeurs du sous-projet. Tous les identifiants consignes ici sont
verifies firsthand au worktree courant.

Cellules code preservees (22 code cells Sudoku-16 / 18 App-14 /
16 App-19), execution_count intact. Pre-commit hook H.3 et #13326
PASSED, fix newline final applique automatiquement.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(twin-parity,#16218): rebaseline App-14/App-19 post hommages rebuild c.1217

DRIFT_INTRODUCED par commit eb277ce (rebuild hommages upstream-first) :
- App-14 ConnectFour Adversarial : Python content_sha 26c0580a -> bba8c2fd (C# intact)
- App-19 ProceduralGeneration WFC : Python content_sha 9329db42 -> 8bb14d89 (C# intact)

Cause : ré-écriture de la cellule 1 markdown (hommage upstream-first) qui
déplace le content SHA twin parity (#8057). Pas un strip outillé, le contenu
calculé reste byte-identique (22+18+16 cellules code préservées).

Méthodologie Tell c.1217 stricte : update en DERNIER (cf #8957 anti-invalidation
attestation après strip).

Tell c.10332 pas applicable : pas de hand-edit translation-owned ici.

Grain: MED/notebook-python -- lane myia-po-2027:CoursIA-2 -- prev: MED/notebook-python #16218

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(twin-parity,#16218): rename 0011-09-15 -> 0010-09-15 to dedupe twin audit prefix

Grain: LIGHT/guard -- lane myia-po-2027:CoursIA-2 -- prev: MED/notebook-python #16218

Scripts Tests (CPU) FAILURE on PR #16218 head 0e4decb:
AssertionError: prefixe NNNN duplique dans une paire
(l'index est la cle de sort du journal, #14911/#15345) :
['app-14-connectfour-adversarial: 0011-2026-09-15-...yaml
  et 0011-2026-09-17-...yaml']

Cause : commit 6bf3e43 (c.609 'fix(twin-parity,#16218): rebaseline 7 paires DRIFT')
a cree 0011-2026-09-15 sans verifier que 0011 etait deja pris (le test
test_audit_index_unique_and_no_identical_duplicates_per_pair #15345 a
ete renforce posterieurement). Commit 8bea9df (c.611) a ensuite
cree 0011-2026-09-17 sans deduger non plus.

Fix : renommer 0011-09-15 -> 0010-09-15 (prefixe 0010 libre). Git mv
preserve le blob SHA, le journal reste coherent. Le 09-17 reste en
0011 comme audit le plus recent du rebaseline c.611 (content_python_sha
bba8c2fd = source post-hommages-2026).

Test verifie local : pytest scripts/notebook_tools/tests/test_twin_registry_integrity.py
-> 46 passed, 0 failed. Le doublon est dedupe, aucun test casse.

Tell c.564 strict (lane-repairable, fix poste) · c.566 strict (no gh run
rerun) · c.1180 strict (commit sur worktree dedie).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* ci: trigger No notebook plan loss re-evaluation after marker correction c.641

- Apostrophe droite ASCII corrigée ligne 51 marker App-14 'objectifs d apprentissage' -> 'objectifs d'apprentissage'
- Validation locale via detect_notebook_plan_loss.py: 5 LOST_SECTION -> 5 JUSTIFIED_BY_BODY
- Pas de modification de code, juste re-trigger du job plan-loss après amend body PR

* fix(16218): restaurer les cellules intro ecrasees par les hommages -- plan-loss

Le garde 'No notebook plan loss' rougissait sur 3 notebooks : la cellule
d'intro pedagogique (titre # + navigation + objectifs + prerequis + duree,
et Architecture/Contexte pour App-19/Sudoku-16) avait ete REMPLACEE par la
cellule hommage au lieu de lui etre ajoutee. Restauration : cellule intro
de la base reinserdee telle quelle avant l'hommage (chirurgie raw, CRLF
preserve au worktree, 128 insertions pures, 0 suppression).

Validation post-fix : detect_notebook_plan_loss.py --check --base origin/main
rc=0 sur les 3 notebooks (STRUCTURE_DRIFT informatif attendu : +1 cellule
markdown). Code cells 16/18/22 inchangees, outputs et execution_count
intacts (preuve zip-compare par script).

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

* fix(16218): attest twin parity (2 paires) + re-indexer entree arXiv 2102.09544 (51->52) apres restauration intro

L'insertion des cellules intro deplaçait les blob SHA des jumeaux Python et
decalait la cellule citation Cappart de Sudoku-16. Rebaseline des 2 paires
(note known_differences), cell_index registre arXiv corrige depuis le diff reel.

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

---------

Co-authored-by: myia-po-2027 <po-2027@coursia.lan>
Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
…tente (roo-extensions#3677) (#16325)

Convergence inverse roo-ext -> CoursIA (Epic roo-extensions#3111 candidat n°5,
GO user 15/09). Portage du registre open-questions roo-ext (roo-extensions#3656/#3657)
augmente de la liste re-parcourue par cycle : les escalades coord -> user ne meurent
plus a la condensation du dashboard. Non-but respecte : l'auto-arbitrage coordinateur
reste la norme (Regle 5.3).

- coordinator-discipline.md : Regle 7 (3 invariants + test de fin de cycle R2 etendu)
  + renvoi sortant depuis la Regle 2
- secrets-and-coord-detail.md : §2.7 (preuve mesuree passe 3, format d'entree,
  frontiere exacte, verification N cycles)
- .gitignore : .claude/local/ (registre machine-local ai-01)
- claude-code-config.md : inventaire R1-R5 -> R1-R7 (drift preexistant R6 corrige)

See roo-extensions#3677

Co-authored-by: Claude-Code <noreply@anthropic.com>
…es pour _has_strong_scope (#15950) (#16630)

Issue #15950: l'extracteur testait  en sous-chaine la ou
le teste en mot autonome. Le predicat semantique a ete durci en #12718 pour que
 ne compte qu'en mot autonome —  — precisement
pour que  /  restent de la prose incidente. L'extracteur
a ete corrige en #15873 (commit 815b3ce).

Ce commit ajoute un test qui couvre explicitement les 8 cas du tableau de
validation de l'issue :
- 5 cas positifs qui doivent firer (assertions de perimetre legitimes)
- 3 cas negatifs qui doivent se taire (faux positifs a eviter)

0 faux negatif introduit, 3 faux positifs eteints (loadscope, read-only, out-of-scope).

See #15950, #15833, #15846, #12718, #11800.

Generated by Mistral Vibe.

Co-authored-by: Mistral Vibe <vibe@mistral.ai>
…ve reproductible (#16803)

Trio deterministe a la cellule seed (CUBLAS_WORKSPACE_CONFIG avant
import torch, cudnn.deterministic/benchmark, use_deterministic_algorithms
warn_only) + prose veridique. Re-exec complete sur le kernel documente
(coursia-ml-training, GPU) : 72/72 cellules, 0 erreur. Preuve
falsification : 2e execution GPU → metriques bit-identiques (RMSE
0.302835 / 1.408279). DLinear cross-device stable ; TimeMixer derive
avec le changement de device CPU→GPU (1.3667→1.9832), prose
resynchronisee sur les sorties mesurees (12 remplacements, 0 residu,
assert). Repare aussi la desynchro preexistante prose/outputs
(1.9128/54.24 cites vs 1.3667/55.72 commits).

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…U locale + resync narrative (#16811)

Cellule 7 (site du seed 42) : CUBLAS_WORKSPACE_CONFIG avant import torch,
puis cudnn.deterministic=True / benchmark=False / use_deterministic_algorithms(True,
warn_only=True). Re-execution complete kernel coursia-ml-training (RTX 3080 Ti,
16/16 cellules, 0 erreur). Ancienne execution = stack etrangere PyTorch 2.11.0+cu128 ;
le run PPO derive completement : meilleur Sharpe +0.645 -> +1.191 (step 25,600),
backtest OOS +57.24% / 16.38% annuel / Sharpe 1.191 / MaxDD -15.23% / win rate
43.09%, distribution d'actions inversee (94% Buy -> 99.5% Hold). Prose
resynchronisee : 24 remplacements scriptes dont reecriture honnete de la cellule
verdict (la comparaison DQN/PPO s'inverse : PPO devant partout — la lecon
"seed unique != verdict" survit, magnitudes recalculees 0.97 interne vs 0.53
inter-algorithmes). Ancres DQN Py-32 (0.657/22.94/31.3) intactes. Zero-residu
assertion avant ecriture. best_ppo_model.pt regenere avec le notebook.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…6900)

Ajoute un moteur Horn pédagogique, un checker indépendant et des certificats falsifiables, puis les confronte au binaire open-ontologies v1.4.0 épinglé et exécuté réellement.

Co-authored-by: Claude Code <noreply@anthropic.com>
…frees (1063 -> 1261) (#16463)

* docs(game-theory,#13410): densite GameTheory-02 Part2 - lectures chiffrees (1063 -> 1261)

3 lectures chiffrees des sorties jamais interpretees (esperances 0.0000,
banc Gauss x=1.0000 y=1.0000, paires {0,1},{0,2},{1,2}). Md-only : +21/-0,
0 cellule code touchee. Voir #13410.

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

* fix(16463): rebaseline twin pair gametheory-2 normalform part 2 after markdown-only density tranche

Pair attested: GameTheory-2 NormalForm Part 2 (Support Enumeration).

Paraphyte-preservant verification (python-compare vs origin/main): all code
cells byte-identical (source + outputs + execution_count) — 14/14; changes
are markdown-only additions (+3 cells).

Command run:
python scripts/notebook_tools/check_twin_parity.py --update --pair "GameTheory-2 NormalForm Part 2 (Support Enumeration)" --by "myia-po-2026:CoursIA"

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…achine, jonction Shapley (P4) (#16632)

* feat(probas,#16620): Do-Calculus-Bridge — 4 taches data-fusion + CHT + jonction Shapley (P4)

Trois nouvelles sections (6-8) dans le notebook-pont, sections 6-11
renumerotees 9-14 :

- Taches prototypiques du data-fusion (Bareinboim-Pearl, PNAS 2016
  Fig 1) : tache 3 selection corrigee par IPW (essai randomise biaise
  +1.029 -> +0.808, verite 0.800, E[Z|S=1]=+0.578) ; tache 4
  transportabilite par strates reponderees (source +0.396, cible 0.760,
  transport K=20 = +0.750) ;
- Causal Hierarchy Theorem (Bareinboim 2026, Thm 2.3.1) rendu machine :
  deux SCM gaussiens a loi jointe identique (cov 0.803/0.798, marginales
  std 1.0) et interventions opposees (do(X=1) : +0.800 vs +0.002) ;
- Jonction XAI <-> Pearl : baseline d'attribution do vs voir sur monde
  lineaire a confondeur (+0.5006 TE vs +0.8438 TV, ecart +0.3432 =
  chemin spurieux facture a la feature).

Exercice 4 ajoute (biais-variance du transport stratifie), objectifs
1-7, synthese et README serie mis a jour. Papermill 43/43, exec 1-15
consecutifs, 0 erreur, validator PASS, catalogue intact.

See #16620

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

* feat(probas,#16620): section 8bis — valeurs de Shapley L3 (Thm 6.2.6 Bareinboim)

Reponse a la reserve user (jsboige 18/09) : le notebook s'arretait a
l'interventional SHAP (L2), Bareinboim va plus loin avec les L3 SV
("counterfactual SHAP").

3 cellules inserees apres la section 8 :
- l3sv-intro-8bis : theorie — GDE (Def 6.2.5, p. 494), decomposition du
  NTE en GDEs (Thm 6.2.1, p. 496), definition des L3 SV (Def 6.2.6,
  p. 496), desiderata (Thm 6.2.6, p. 502 + Table 6.3).
- l3sv-demo-8bis : implementation sur le SCM lineaire-gaussien du
  notebook — abduction/action/prediction par unite (draw_unit,
  Y_cf(u, do), NTE par tirages naturels conjoints m=400_000, GDE, l3_sv
  avec assertion d'efficacite Thm 6.2.1). Deux unites u_A1 (A=1, Z>0.5)
  et u_A0 (A=0, Z<-0.5) :
  u_A1 : phi_L3(Z)=+0.2388, phi_L3(A)=+0.2000, phi_L3(W)=+0.7665,
         Somme=+1.2052 | NTE=+1.2043 (efficacite)
  u_A0 : phi_L3(Z)=-0.6147, phi_L3(A)=-0.2000, phi_L3(W)=-0.4672,
         Somme=-1.2820 | NTE=-1.2830 (efficacite)
  phi_L3(A)=+-0.2000 unit-specifique vs TE moyen (do)=+0.5006 constant :
  la distinction L2/L3 est visible dans la sortie.
- l3sv-lecture-8bis : lecture L3-unite vs L2-moyenne + limite honnete
  (abduction triviale en lineaire-gaussien, u observe => bruits connus).

Execution complete papermill (kernel coursia-ml-training) : 46 cellules,
16/16 code executees, 0 erreur, 0 fuite de chemin (scan), metadata
papermill normalisees au basename.

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…ourcis CDE corrigés (P5a) (#16639)

* feat(probas,#16620): Infer-5 effets naturels NDE/NIE calcules + correction raccourcis CDE (P5a)

Nouvelle cellule : NDE = 0,280 et NIE = 0,180 par enumeration sur le SCM
de mediation (X formation -> M competences -> Y promotion), NDE + NIE =
0,460 = TE exactement -- identite algebrique de telescopage.

Correction (G.1) : le markdown affirmait NDE = CDE(M=0) = 0,300 et
NIE = TE - NDE = 0,160 avec une verification tautologique (NIE defini
comme TE - NDE). Mesure : NDE = 0,280 != CDE(0) = 0,300 et part mediee
vraie 0,180 != 0,160 -- l'interaction X*M (CDE(1) = 0,200 vs CDE(0) =
0,300) casse les raccourcis via CDE, pas l'identite NDE + NIE = TE.

exec_dotnet_persist 16/16 cells, 0 erreur, exec counts consecutifs,
validator PASS, catalogue intact.

See #16620

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

* chore(twin-parity,#16639): attest Probas-5 Causal-Inference pair at current head (Infer-5 P5a)

Guard-demanded rebaseline (selector --pair, lessons L963/L974): 1 pair updated.
Entry index 0014; the posterior twin PR (#16640 P5b) takes 0015 to avoid
concurrent index collision (memory twin-registry-concurrent-index-collision).

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

* fix(infer,#16639): strip kernel-injected probeAddresses banner (9 lines, output-only)

Rule-6 exception (kernel-bootstrap noise, #2733/#6312 precedent): source
byte-identical, stream outputs + execution_count preserved. Re-exec cannot
cure (re-injects). Strip precedes twin re-attestation per #8957.

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

* chore(twin-parity,#16639): re-attest Probas-5 Causal-Inference AFTER banner strip (#8957)

The strip moved the committed blob SHA; the 0014 entry attested the
pre-strip state. 0015 records the post-strip blob. Posterior twin (#16640)
moves to 0016.

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
… findings on main (4 named_split) (#16786)

* feat(notebook-tools,#16762): census tool for split reading cells (Lecture/Lecture chiffree)

Instrument du recensement demande par le parapluie user #16762 : paires de
cellules d'interpretation consecutives (signal structurel : en-tetes
Lecture/Interpretation/Analyse) + mesure de recouvrement (Jaccard mots
pleins + containment mots rares intra-notebook, mecanique reutilisee de
detect_repeated_prose.py signal B). Sous-classes named_split (defaut user),
generic_pair, separated_by_code (variante secondaire).

Recensement main (c818f6a) : 84 findings -- 4 named_split, 72 generic_pair,
8 separated_by_code. Distribution C (generic_pair) : 38 < 0.10, 26 [0.10,0.20),
8 >= 0.20 -- la structure seule sur-accuse (~53% de paires benignes, lectures
de signaux differents) ; un garde futur doit coupler structure + seuil C.

7 tests (pytest) dont le controle FP different-signaux.

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

* Fix: propage --fail-on-findings en mode dossier (reserve adjoint #16786)

scan_root(root, as_json) retournait toujours 0 : le total de findings etait
calcule puis droppe, et le flag --fail-on-findings n'etait pas transmis par
main() (seul le mode fichier l'honorait, l.209). Reproduction adjoint
confirmee avant fix : dossier findings+flag rc=0.

Fix : scan_root(root, as_json, fail_on_findings=False) retourne
2 si findings et flag ; main() transmet args.fail_on_findings.
Parametre default -> aucun changement pour les appelants existants
(grep : aucun autre appelant de ce scan_root).

Tests : +2 (dossier positif rc=2, dossier clean rc=0) -- la reserve
notait qu'aucun des 7 tests ne couvrait main/scan_root. 9/9 pass.

Matrix verifiee : dossier findings+flag 2 / dossier clean+flag 0 /
fichier findings+flag 2 / dossier sans flag 0 (mode recensement inchange).

See #16786

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…Lens tête-à-tête) (#16814)

* docs(ledger,#11690): strand 5 tranche 1 — famille SAE (21/21b/21c + JLens tete-a-tete)

Consignation de la lecture complete (contenu + outputs committes) de la
tranche 1 du rang 5 : ICT-21 (gates 10/11 PASS, echelle 4-echelles FVU
0.28-0.85, decroisement generation x taille, ablation dictionnaire),
ICT-21b (calibration croisee FVU/variance par echelle et registre), ICT-21c
(contrastes trained/control 3 echelles + cascade d'ablation : overlap_diff64
2-3/64 stable pendant que FVU passe 0.28->0.82 = "inoculation absente"),
ICT-SAE-JLens-TeteATete (non-numerote, divergence semantique des deux
lentilles : Pearson +0.08 malgre alignement token-a-token True). Rangs
matrice 107/113 confirmes. Findings : garde-fous institutionnalises,
preuve partagee != repliquee (ablation identique au millieme dans 21 et
21c), JLens non-numerote porteur de substance (candidat renumerotation
#7260), axe J-lens d'ICT-21b titre une question sans reponse committee.
Greffe5 exclu (rework actif #16787). Perimetre = ledger uniquement,
arbitrage 21/08 inchange.

See #11690

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

* fix(ledger,#11690): resolve strand-5 merge markers -- SAE tranche 1 before tranche 3

Le commit de merge precedent embarquait les marqueurs de conflit bruts
(chaine bash executee malgre l'echec du script de resolution). Resolution
reprise par arithmetique de lignes exacte : en-tete strand 5 ajuste
(LU 2/3 tranches -- 1 SAE + 3 non-numerotes ; tranche 2 GWT = PR #16821),
section SAE (tranche 1) inseree AVANT la tranche 3 (non numerotes, main).

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…explicites + re-exec bit-identique (#16815)

Cellule 3 (import torch) : CUBLAS_WORKSPACE_CONFIG avant import, puis
cudnn.deterministic=True / benchmark=False / use_deterministic_algorithms(True,
warn_only=True) — les seeds de la boucle walk-forward multi-seed (cellule 15)
ne suffisent pas seuls. DEVICE reste CPU comme pinné par l'auteur. Re-execution
complete kernel coursia-ml-training (11/11 cellules, 0 erreur) : les 23 valeurs
numeriques 3+ decimales des outputs sont BIT-IDENTIQUES a l'ancien run —
preuve de reproductibilite du pipeline walk-forward 5 folds x 4 seeds x 2
modeles, verdict INCONCLUSIVE (|z| < 2) inchange. Prose sans ancrage stale.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
… verbatim fixes (#16817)

* feat(genai,#13410): releve densite pedagogique notebooks 00-Parcours-QA-OWUI et 03-Claude-CLI-References

- 00-Parcours-QA-OWUI.ipynb: passe de 1056/1200 a >1200 avec 4 lectures ancrees
- 03-Claude-CLI-References.ipynb: passe de 844/1200 a >1200 avec 10 lectures ancrees
- Lectures explique les sorties des cellules de demonstration
- Respect des garde-fous editoriaux: UTF-8, accents, source en liste, markdown-only

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>

* fix(vibe,#13410): g14 relay — dedup 4 exact triplets, correct spec-file count, drop unanchored retry claim, grammar + verbatim alignment

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

---------

Co-authored-by: Mistral Vibe <vibe@mistral.ai>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…explicites + re-exec + resync narrative (#16820)

Trio determinisme (CUBLAS avant import torch, cudnn deterministic,
use_deterministic_algorithms warn_only) en cellule 3 (imports).
Re-execution papermill 13/13, 0 erreur. Micro-drift : MSE 0.1784->0.1793
/ 0.1090->0.1091, classement inchange ; en direction accuracy PatchTST
passe SOUS la baseline (-0.0035) et iTransformer double son edge
(+0.0100) — 11 remplacements scriptes sur 2 cellules narratives
(assertions zero-residu avant ecriture).

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
… (volet 5, tranche 1) (#16882)

* fix(symbolicai,#16795): determinism flags + fresh re-executions for Planners-12, SL-13 x2, ICT-22b

Same fix as previous volets. Planners-12 anchor lives inside a try block,
block inserted indented there. All metrics identical vs committed except:
Planners embedding sample (cross-build 2.11+cpu->2.8+cu126), SL-13 TPR
binding shapes flip between equivalent factorizations (numpy 2.4.3->2.3.5,
acc/R2 identical), ICT-22b damage-clamp ratio inf (last-bit residual).
0 non-deterministic-op warning. Sudoku-16 running, rattrapage to follow.

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

* fix(symbolicai,#16795): SL-13 — from_numpy sur copie writable, fuite MACHINE_PATH fermee (x2 fichiers)

Ratchet Output-failure : MACHINE_PATH 1->2 sur cell[11] des DEUX fichiers
(SL-13 + artefact -output). Cause : "UserWarning: The given NumPy array
is not writable" — reconstruct_tpr/surgery_swap_roles retournent des vues
broadcast read-only, et torch.from_numpy(H_tpr_init) sur un array non
writable emet un warning dont la LOCALISATION est le fichier temp
ipykernel (C:\Users\jsboi\AppData\Local\Temp\ipykernel_<pid>\NNN.py).

Fix a la source (cellule 9, fonction accuracy_with_tpr_init) :
torch.from_numpy(H_tpr_init.copy()) — copie bitwise identique, toujours
writable, warning disparu. Jamais de scrub de sortie (secrets-hygiene 6).

Re-execution complete (kernel python3, 38 s) :
- cell[11] : table surgery propre, metriques IDENTIQUES a la run
  precedente (copy 0.132/0.132/0.115, reverse, interleave — seeded)
- 10/10 cellules code ec 1..10, 0 erreur, 0 chemin machine
- artefact -output.ipynb regenere, metadata.papermill normalisees au
  basename (exception autorisee)
- unique diff source vs HEAD : +4 lignes commentaire/copie dans la
  cellule 9 (cellule Parameters papermill retiree avant commit)

NB : le WIP rattrapage Sudoku-16 (8 lignes, non commis) reste hors de ce
commit — re-review en delta demandee par Hermes.

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

* fix(sl,#16795): re-execute SL-13 TPR twins on fresh kernel (ratchet NOT_FROM_1)

Both committed runs started at execution_count=2 (resumed-kernel
artifact). Fresh end-to-end re-execution: counts 1..9 contiguous,
0 errors, 0 machine-path occurrences.

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

* fix(sl,#16795): untrack MNIST data sweep + revert Sudoku-16 WIP from previous commit

git add -A swept two unrelated things into 08f5d11: (a) 8 torchvision
MNIST data files (binary dataset artifacts under 03-DeepLearning/data,
regenerable, never repo material), (b) a Sudoku-16 notebook carrying
un-re-executed determinism flags (pre-existing WIP from an earlier
session; belongs to the blocked Sudoku-16 sub-track, not this PR).

This restores PR scope: SL-13 twins only. Local MNIST copies deleted.

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

* fix(sl,#16795): actually untrack MNIST data files (follow-up)

dbe42cb intended to untrack the 8 torchvision MNIST artifacts but a
stray 'git add' in the same chain re-staged them unchanged, so only the
Sudoku-16 revert landed. This commit removes them from the index for
real (disk copies already deleted, files regenerable by any exec).

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…ntext_Strategies au-dessus de 1200 (#16885)

* feat(genai,#13410): relever densite pedagogique au-dessus de 1200 chars/cellule

- 02-2-FLUX-1-Advanced-Generation.ipynb: ajoute 10 cellules markdown de lecture ancree
- 10c_Long_Context_Strategies.ipynb: ajoute 18 cellules markdown de lecture ancree
- Lectures expliquent les resultats des cellules DEMONSTRATION (outputs commites cites)
- Aucune lecture pour cellules EXERCICE (detect_solution_leaks reste a 0)
- Respect des garde-foux: UTF-8, source en liste, markdown-only, pas de re-execution

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>

* fix(g24-genai-9,#13410): relever densite pedagogique au-dessus de 1200 c/cell

Relais humain du run g24-genai-9 : 24 correctifs sur FLUX-1-Advanced-Generation
et 10c_Long_Context_Strategies.

FLUX : temps "proportionnels/quasi-lineaires" aux steps FABRIQUES (b[13] =
786.4s/84.0s/35.8s/36.7s — echauffement du premier appel, quasi-constant
ensuite) ; ratio "21:9" jamais teste (serie = 1:1/16:9/9:16/4:3) ; "plusieurs
inferences simultanees" sans mesure ; exemples de generation inventes
("paysages naturels, scenes urbaines" — une seule image en base) ; 3 styles
cites sur 4 (ANIME oublie) ; lisibilite du texte des images non affiches
affirmee -> rencree sur les 4 prompts verbatim + la reputation citee par le
notebook lui-meme.

LongContext : "fenetre de 32768 tokens du modele servi" x2 — 32768 est le
BUDGET de travail choisi, la fenetre reelle est 262144 (b[4] distingue les
deux) ; troncation "perdrait" -> perd (map-reduce retrouve 5, troncation 1,
perte relative 80%) ; "plus de 60%" -> 60% exact (verbatim) ; pattern paires
par fait en recidive (g23) : 12 cellules redondantes reecrites sur le materiel
verbatim non cite (decomposition 6349/6240/6089, DOC-1/DOC-2, reponses brutes
'749', 6 essais TTFT individuels, reserve 512 tokens, verdict creux/bords).

Validation : multiset full-JSON 0 perdu, anti-dup exact/prefix-380/source-level
0, densite 2/2 >= 1200 re-mesuree, scan newlines vide, git status 2 notebooks.

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

---------

Co-authored-by: Mistral Vibe <vibe@mistral.ai>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…ics au-dessus de 1200 (#16894)

* fix(density,#13410): relever ICT-03 et IIT-02 au-dessus de 1200 chars/cell

Ajout de lectures ancrées pour expliquer les résultats des cellules de démonstration :
- ICT-03-RobustnessDelayedGratification-Python.ipynb : 5 lectures ajoutées
- IIT-02-AdvancedTopics.ipynb : 9 lectures ajoutées

Densité avant/après :
- ICT-03 : 1105 → 1201 chars/cell (seuil 1200)
- IIT-02 : 1097 → 1202 chars/cell (seuil 1200)

Respect des garde-foux éditoriaux : UTF-8, source en liste, markdown-only,
aucune re-exécution, pas de narration d'exercices, chiffres cités tels quels.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>

* fix(g26-iit-2,#13410): 5 correctifs relais ICT-03 + IIT-02

- IIT-02: Big Phi != somme des small phi (1.875 != 1.5, verbatim b[22]) x2
- IIT-02: EMD 0.0000 = aucune information specifiee pour le purview (0,)
- IIT-02: anneau 4 noeuds 0.2569 < XOR 3 noeuds 1.8750 (non-linearite != integration)
- ICT-03: grammaire 'son progression' -> 'sa progression'

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

---------

Co-authored-by: Mistral Vibe <vibe@mistral.ai>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…b au seuil densite pedagogique (#16902)

- Ajout de 8 cellules markdown de LECTURE ANCREE apres les cellules DEMONSTRATION
- Cellules concernees: 2 (config), 4 (morphogenese), 6 (ablation), 10 (mondes contrefactuels),
  12 (scores), 16 (contraste), 18 (controle variance), 22 (balayage)
- Respect des garde-foux: UTF-8 preserve, source en liste, pas de re-execution
- Densite passe de 1160 a >=1200 chars/cellule (seuil atteints)
- Aucune lecture ajoutee pour les cellules EXERCICE (8, 14, 20)

Generated by Mistral Vibe.

Co-authored-by: Mistral Vibe <vibe@mistral.ai>
This was referenced Sep 22, 2026
@jsboige

jsboige commented Sep 22, 2026

Copy link
Copy Markdown
Owner Author

Tell c.1374-L1 ★★★★ narrow strict 1:1 + Tell c.1086 strict fail-CLOSED -- CLOSE w/stale batch (5 PRs)

Tell c.974 §G.9 strict fondateur vérif first-hand (lecture git diff origin/main origin/<branch> --stat + gh pr view <N> --json files) :

Toutes les 5 PRs (#16991 #16992 #16994 #16999 #17001) ont le MÊME pattern composite mal empilé :

PR Branch Fichiers +Lignes -Lignes Titre narrow Titre narrow OK ?
#16991 fix/c1318-repair3-morpho-pr16978 710 20268 99884 REPAIR-3 (8 donne + 2 prouve) Lean-X NON, 710 fichiers
#16992 fix/c1318-repair3-morpho-pr16975 710 20346 99946 REPAIR-3 (4 donne + 5 prouve) Lean-X NON, 710 fichiers
#16994 fix/c1318-repair3-morpho-pr16966 710 20299 99946 REPAIR-3 (4 donne + 4 prouve) Lean-X NON, 710 fichiers
#16999 fix/c1319-repair3-morpho-pr16970 227 4019 23589 REPAIR-3 (5 donne + 0 prouve) Lean-16a NON, 227 fichiers
#17001 fix/c1319-repair3-morpho-pr16943 710 20930 100687 REPAIR-3 (2 donne + 2 prouve) Lean-X NON, 710 fichiers

Tell c.1374-L1 ★★★★ ★★★ red-flag G.4 composite trop large ★★★ : TOUTES dépassent les seuils (3000 lignes / 15 fichiers / 4 features / 1 domaine). Aucune cohérence avec le titre « REPAIR-3 narrow strict 1:1 ».

Tell c.1086 strict fail-CLOSED ★★★ : le rebase produirait des branches qui RE-SUPPRIMENT du code / fichiers de retour sur main (work de #17140, #17440, etc.). Pas safe.

Décision : CLOSE w/stale batch. Le contenu narrow strict pertinent (corrections REACCENT sur fichiers Lean-X spécifiques) est ailleurs dans les PRs canoniques EPIC #16638 (feature/16638-deaccent-lean*).

Leçon c.1413 ★★★ Tell c.898 ★★★ collision guard généralisée : avant tout rebase, TOUJOURS vérifier le scope narrow strict 1:1 par git diff origin/main origin/<branch> --stat. Si le scope dépasse le titre, CLOSE w/stale plutôt que rebase.

Tell c.594 strict fondateur respecté : closes de MES PRs.

Suivi adjoint po-2025 (DM adjoint-dispatch-po2024c2-dirty-20260922T2153) : « 8 PRs DIRTY de ta lane, par ancienneté : ..., #16991, #16992, #16994, #16999, #17001 » — Vérifié first-hand c.1413, 5 PRs closes w/stale (composites mal empilés, narrow strict ailleurs).

— myia-po-2024:CoursIA-2, c.1413

@jsboige

jsboige commented Sep 22, 2026

Copy link
Copy Markdown
Owner Author

Tell c.1374-L1 ★★★★ narrow strict 1:1 + Tell c.1086 strict fail-CLOSED — close w/stale, voir commentaire détaillé cid 5785184795.

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