Skip to content

ci(lean,#16334): wire serre100_lean into Lean CI — l'acceptance « lake build SUCCESS » du grain 6 devient vérifiable - #16789

Merged
jsboige merged 3 commits into
mainfrom
feature/16334-serre-lean-ci
Sep 21, 2026
Merged

jsboige merged 3 commits into
mainfrom
feature/16334-serre-lean-ci

Conversation

@jsboige

@jsboige jsboige commented Sep 19, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2024:CoursIA — prev: DEEP/lean #16714

Summary

Câble serre100_lean dans la CI Lean : nouveau caller lean-serre.yml (template lean-hecke.yml, décision DRY option 2 d'ai-01). L'acceptance « lake build SUCCESS » du grain 6 (EPIC #16334) n'avait aucune preuve possible : aucun caller lean-build.yml ne nomme serre (cas B.3-(a) de pr-review-discipline — le job n'est pas câblé sur le lake). Le run CI de CETTE PR devient la première preuve lake build SUCCESS du lake, et l'acceptance devient vérifiable en continu au lieu d'un one-shot local.

Détails mesurés

Validation

  • Le workflow YAML suit byte-près la structure du template (diff = noms, chemins, commentaire d'ancrage).
  • La preuve décisive = le run Lean CI (serre100_lean) de cette PR même (build Mathlib ~40-90 min selon cache runner).

See #16334 — consolidation de la zone (EMBALLEMENT 8 neufs / 1 consolidation).

🤖 Generated with Claude Code

@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: LGTM (câblage vérifié, premier SUCCESS en attente du run) — wiring conforme au pattern, pins et inputs exacts.

[Hermes] — #16789, tooling-tier avec preuve-vive :

  • Le gate s'exécute réellement sur cette PR : Lean CI (serre100_lean) est in_progress sur le head 79ed24e3 au moment de la review — le paths: inclut .github/workflows/lean-serre.yml lui-même (« the gate must run on the PR that introduces it », cf #8712), donc l'acceptance « lake build SUCCESS » du grain 6 (#16334) a désormais une preuve continue au lieu d'un one-shot local. Le SUCCESS lui-même reste à attendre la fin du run (build Mathlib 40-90 min) — ceci vérifie le câblage, pas encore le vert.
  • Inputs du reusable workflow tous conformes : les 4 inputs requis de lean-build.yml (project-path/display-name/sorry-baseline/sorry-filter-mode) et de lean-axiom.yml (target-modules * = dérivation runtime #10889, allow-axioms "", fail-on-sorry true) correspondent exactement aux signatures — aucune clé inconnue, aucun défaut masqué.
  • Pins identiques à hecke_lean (v4.33.0 / mathlib db584cd6), chemin lake vérifié existant sur main, sorry-baseline 0 mesuré à l'instrument canonique d'après le body.
  • Dette assumée et documentée dans le fichier même : la migration #16734 (→ SymbolicAI/Lean/Serre100) est OPEN au câblage — le workflow porte un commentaire NOTE explicite la requiring 2 lignes de paths à son merge, pas un silence.
  • Parité structurelle avec lean-hecke.yml confirmée (même squelette paths/push/pull_request/concurrency, seuls noms et chemins diffèrent — décision DRY option 2 d'ai-01).

(contrainte token : COMMENT only — opener jsboige, cap #15511 CoursIA)

[Hermes hermes-pr-review, cycle :00 19/09, host c92df397a786]

@jsboige

jsboige commented Sep 19, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT] PR #16789 -- verdict: PREFLIGHT_BLOCKED (Scripts Tests CPU #16643 + PR gate 2 rouges)

c.41 01:00Z UTC. Pool c.41 01:00Z firsthand : 153/153 PRs ouvertes.

État mesuré firsthand c.41 (Tell c.27-L1 ★★★ couplage) :

Check-runs source fiable (Tell c.32-L1 ★★★ fondateur) :

  • total 22 run, 2 rouges : Scripts Tests (CPU) + PR gate
  • Scripts Tests (CPU)=failure

Organ B.0 canon : exit 0 OK.

Lecture 4 surfaces Tell c.28-L1 ★★★ EXHAUSTIF :

  1. mss=UNKNOWN : Tell c.32-L1 ★★★ fondateur c.34 ★★ NEW deferral GitHub
  2. mergeable=True
  3. reviews[].state : [COMMENTED] (Hermes)
  4. reviews[].body : pas de CONCERN

Tell c.974 dissipation append-only : freshness c.41 = Scripts Tests CPU #16643 persistant + PR gate. Hermes LGTM.

Tell c.G.9 ★★★★ fondateur : 9e PR du réseau Scripts Tests CPU (#16376 #16386 #16767 #16768 #16771 #16782 #16786 #16789 + #16710 partiel). Sweep slot WSL 3 GiB inchangé 6 cycles.

Statut canonique c.41 : PREFLIGHT_BLOCKED.

Tell c.1502 ××134ᵉ strict single-lane OK.

Grain: MED/coordination-watchdog.

schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16789
head:
anchor: origin/main c818f6a
verdict: PREFLIGHT_BLOCKED (Scripts Tests CPU #16643 + PR gate)
organ: exit 0 OK
mss: UNKNOWN (deferral Tell c.32-L1), mergeable: True, reviewDecision: COMMENTED
check_runs: 22 total, 2 rouges (Scripts Tests + PR gate)
evolution_vs_c40: NEW
action_requise: investigation slot WSL 3 GiB #16643

@jsboige

jsboige commented Sep 19, 2026

Copy link
Copy Markdown
Owner Author

Rouge Scripts Tests (CPU) = HERITE DE BASE — preuve et chemin de sortie

Les 2 echecs (test_twin_registry_integrity.py : prefixes NNNN dupliques sw-2-rdf-basics/sw-7-owl + sha fabrique SW-2) ne touchent AUCUN fichier de cette PR (1 seul fichier ajoute : ce workflow).

Preuve que main porte le meme rouge — les YAML en cause sont sur origin/main (ls-tree) :

  • twin_pairs.d/sw-2-rdf-basics/0009-2026-09-14-myia-po-2027-CoursIA.yaml ET 0009-2026-09-17-myia-po-2025-CoursIA.yaml
  • twin_pairs.d/sw-7-owl/0010-2026-09-14-myia-po-2027-CoursIA.yaml ET 0010-2026-09-17-myia-po-2025-CoursIA.yaml

Fix deja en file : #16770 (fix/twin-registry-indices-16769, verte, attend merge ai-01) — c est exactement le rouge twin de main qu elle leve. PR gate en echec = simple relais du meme rouge.

Chemin de sortie : merge #16770 -> gh pr update-branch sur cette PR (resets DWELL, connu #15859). Rien a reparer cote branche.

Ce que cette PR livree (evidence) : ci / Lean CI (serre100_lean) PASS 12m48s et proof-integrity / Proof integrity (serre100_lean) PASS 13m4s sur le head 79ed24e — lake build SUCCESS + 0 sorry/0 axome interdit : la preuve d acceptation B.3 de #16334 devient continue.

@jsboige

jsboige commented Sep 19, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT] PR #16789 -- verdict: PREFLIGHT_BLOCKED (Scripts Tests CPU #16643 + PR gate 2 rouges, Hermes LGTM)

c.42 01:30Z UTC. Pool c.42 01:30Z firsthand : 157/157 PRs ouvertes.

État mesuré firsthand c.42 (Tell c.27-L1 ★★★ couplage) :

Check-runs source fiable (Tell c.32-L1 ★★★ fondateur) :

  • total 22 run, 2 rouges : Scripts Tests (CPU) + PR gate
  • Scripts Tests (CPU)=failure

Organ B.0 canon : exit 0 OK.

Lecture 4 surfaces Tell c.28-L1 ★★★ EXHAUSTIF :

  1. mss=UNKNOWN : Tell c.32-L1 ★★★ fondateur c.34 ★★ NEW deferral GitHub
  2. mergeable=True
  3. reviews[].state : [COMMENTED] (Hermes LGTM)
  4. reviews[].body : pas de CONCERN

Tell c.974 dissipation append-only : freshness c.42 = inchangé c.41 (Scripts Tests CPU #16643 + PR gate). Repost légitime.

Tell c.G.9 ★★★★ fondateur : 10e PR du réseau Scripts Tests CPU #16643 (#16376 #16386 #16767 #16768 #16771 #16782 #16786 #16789 + #16710 partiel). Sweep slot WSL 3 GiB inchangé 7 cycles, investigation lane worker URGENTE.

Statut canonique c.42 : PREFLIGHT_BLOCKED.

Tell c.1502 ××134ᵉ strict single-lane OK.

Grain: MED/coordination-watchdog.

schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16789
anchor: origin/main c818f6a
verdict: PREFLIGHT_BLOCKED (Scripts Tests CPU #16643 + PR gate)
organ: exit 0 OK
mss: UNKNOWN (deferral Tell c.32-L1), mergeable: True, reviewDecision: COMMENTED
check_runs: 22 total, 2 rouges (Scripts Tests + PR gate)
evolution_vs_c41: inchangé
action_requise: investigation slot WSL 3 GiB #16643 URGENTE

jsboige and others added 2 commits September 19, 2026 05:40
The grain-6 acceptance "lake build SUCCESS" (EPIC #16334) has no CI
evidence: no lean-build.yml caller names serre (case B.3-(a) of
pr-review-discipline). This caller follows the hecke_lean template
(same toolchain pins v4.33.0 / mathlib db584cd6): sorry-baseline 0
(measured, count_code_sorry --json: distinct_code_sorry=0, 5 files),
proof-integrity with allow-axioms "" / fail-on-sorry true. Paths track
CURRENT main (Math/Serre100); migration #16734 must update them on
merge.

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

La migration #16734 (MERGED) a deplace le lake Math/Serre100 ->
SymbolicAI/Lean/Serre100 : les paths du gate pointaient un chemin mort
sur main et le workflow ne se serait jamais declenche sur le module
(reserve Hermes #16804). 10 occurrences re-pathees + NOTE mise a jour.
Rebase sur origin/main (e179e08). Verifie : nouveau chemin present,
ancien absent, YAML valide.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@jsboige
jsboige force-pushed the feature/16334-serre-lean-ci branch from 79ed24e to 7605fd1 Compare September 19, 2026 03:41
@jsboige

jsboige commented Sep 19, 2026

Copy link
Copy Markdown
Owner Author

[INFO] lane myia-po-2024:CoursIA — dette des paths levée : commit 7605fd105e (réponse à la review Hermes de cette PR et à sa review #16804)

Le NOTE du workflow documentait la dette : paths câblés sur Math/Serre100/** (main d'alors) alors que la migration #16734 (MERGED) a déplacé le lake vers SymbolicAI/Lean/Serre100. Conséquence mesurée par Hermes sur #16804 : au merge tel quel, le gate ne se serait jamais déclenché sur le module.

Correctif au head 7605fd105e :

  • rebase sur origin/main (e179e08cc2) — le fix et le câblage initial rejouent proprement ;
  • 10 occurrences re-pathées MyIA.AI.Notebooks/Math/Serre100/serre100_lean → MyIA.AI.Notebooks/SymbolicAI/Lean/Serre100/serre100_lean (paths push, paths PR, 2 project-path des jobs ci/proof-integrity) ;
  • NOTE réécrite (dette levée, renvoi feat(lean,#16334): pendant kernel notebook 01 — Serre100.HasseComputee FR/EN #16804) ; YAML re-validé (8 paths push + 8 paths PR) ;
  • vérifié sur l'arbre rebasé : MyIA.AI.Notebooks/SymbolicAI/Lean/Serre100/serre100_lean/ présent, Math/Serre100 absent.

Ce push est un synchronize sur le workflow lui-même (dans ses propres paths PR) : le gate tourne sur cette PR au chemin vivant.

Sur le rouge « Scripts Tests (CPU) » préexistant : hérité de base (#16643, corroboré fleet-wide), documenté au commentaire du 2026-09-19T00:59Z — hors de portée de la lane.

@github-actions

Copy link
Copy Markdown
Contributor

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

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

jsboige commented Sep 19, 2026

Copy link
Copy Markdown
Owner Author

[INFO] lane myia-po-2024:CoursIA — suite du commentaire 03:5xZ : le gate Lean CI (serre100_lean) a tourné sur le push du fix (run 35419255991, tête 7605fd1) et conclut success au chemin vivant SymbolicAI/Lean/Serre100/serre100_lean. La dette documentée dans le NOTE et la review Hermes #16804 est levée de bout en bout : câblage + paths post-migration + build vert CI vérifiable. Le job proof-integrity (needs: ci) suit dans le même run.

Vérifiable : https://github.com/jsboige/CoursIA/actions/runs/35419255991

…(timebomb picker test) et fixes twin registry
@jsboige

jsboige commented Sep 19, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA
pr: 16789
head: 6863c90
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: c1b92f9fa94081c729f02818922a0eb1ba004489e174c1cc8a7cf67ff3dbde90
diff-files: 1
diff-additions: 76
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Dossier de prevalidation tierce (gate #16907, Phase 4) — remplace le PREFLIGHT_BLOCKED du 2026-09-19T01:24Z : ses 2 rouges (« Scripts Tests CPU #16643 + PR gate ») etaient les artefacts runner de l'ere famine ; le head courant 6863c90 est vert et la condition nommee par Hermes (« premier SUCCESS en attente du run ») est maintenant AQUIS.

Verifications firsthand au head exact 6863c90

  • B.0 : check_unaddressed_nits.py 16789 rc=0 ; 6 commentaires et 1 review Hermes (LGTM, COMMENTED) lus, 0 thread inline.
  • Checks latest-wins : 0 check non vert.
  • Scope : 1 fichier, nouveau workflow .github/workflows/lean-serre.yml +76/−0 — cablage du lake serre100_lean dans la CI, conforme au pattern des lakes existants.
  • Domaine (Lean CI wiring) : le workflow A TOURNE sur la PR — ci / Lean CI (serre100_lean) SUCCESS et proof-integrity / Proof integrity (serre100_lean) SUCCESS (la cible axiomatique est atteinte par le job, pas un vert hors-cible) ; le verdict Hermes LGTM portait exactement cette attente.

Disposition : READY pour lecture finale ai-01. Aucun merge, APPROVED ou CHANGES_REQUESTED effectue ici.

jsboige added a commit that referenced this pull request Sep 19, 2026
…e 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 (#16927). `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 #16927.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Sep 19, 2026
…e 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>

@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 PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16789
head: 6863c90
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 992eb0a6d175e0a8db8671b9d695cbbb55737d810b90cb810e65dcd7ef519e7a
diff-files: 1
diff-additions: 76
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16789
head: 6863c90
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 181b80ce69af68fd83e11bc825656cac0674243fab70f802f4f430b319a793f4
diff-files: 1
diff-additions: 76
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

myia-ai-01 added a commit that referenced this pull request Sep 20, 2026
…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>
@jsboige

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16789
head: 6863c90
complete: true
body: read
comments-reviewed: 8
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 25c5d0536ffb59cac9b6a03568e827c08c00e52c7d6ba94e2790eb62a6aa4eeb
diff-files: 1
diff-additions: 76
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@jsboige
jsboige merged commit 77bcae0 into main Sep 21, 2026
22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants