Repository navigation
ci(lean,#22519): cabler le gate proof-integrity sur les 13 lakes matriciels qui n'en portaient pas - #23019
Conversation
… restants Le manifeste `ci_lakes.json` ne portait `axiom-target-modules` que sur 14 des 27 lakes servis par la matrice : pour les autres, le step `Proof integrity` de `lean-build.yml` s'interpole en chaine vide et se SAUTE -- un vert qui ne mesure rien (cas (b) de B.3). Decision par lake, mesuree avant cablage : les seules occurrences de `native_decide` dans ces lakes sont des docstrings (« Aucun `sorry`, aucun `native_decide` ») -- 0 usage en tactique sur les treize. Le jeu standard du composite (`propext`, `funext`, `Classical.choice`, `Quot.*`) etant accepte par defaut, la decision est uniforme : `"*"` (derivation runtime des modules, `_en` exclus). Exception mesuree : `decisiontheory` porte `sorry-baseline: 2`, donc `axiom-fail-on-sorry: "false"` -- le gate voit et rapporte les `sorryAx`, le ratchet sorry restant tenu par le build, et tout `native_decide` introduit rougit. L'organe porte desormais la decision : `ungated_without_justification` liste un lake sans gate ET sans ligne « sans gate » dans `docs/reference/lean-axiom-coverage.md`, et `--check --strict` en fait un exit 1. Un lake ajoute demain a la matrice doit etre cable ou justifie, jamais laisse en silence. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
…compteurs de prose du doc Le premier run matriciel de la PR a rougi sur `Proof integrity (lean_game_defs)` : le lake DECLARE `axiom arrow_impossibility` dans SocialChoice.lean au lieu de le prouver. Ma mesure de decision ne cherchait que `native_decide` et `sorry` -- une declaration `axiom` ecrite a la main est une troisieme classe, que `#print axioms` voit et que le compte de `sorry` ne voit pas. - `ci_lakes.json` : `axiom-allow-axioms: "arrow_impossibility"` sur l'entree `gamedefs`, nomme et non wildcard -- tout axiome nouveau rougit toujours. - `docs/reference/lean-axiom-coverage.md` §4.1 : la classe manquante est ecrite, la ligne du lake porte la decision, l'ecart de preuve est suivi par #23022. - Le meme fichier perd trois compteurs de prose que `prose-counts` refusait (« Lake a 2 fichiers », « Lake a 3 fichiers ») : la mesure reste dans le manifeste, la prose garde le predicat. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…vide Le premier run matriciel a rougi sur Proof integrity (conway_cgt_lean) et Proof integrity (mathlib_examples) avec, dans les deux cas, Build + sorry gate vert et le meme verdict du step d'axiomes : FAIL: lake-level non-vacuity -- all N module(s) enumerated zero declarations Le verdict est CORRECT, et les deux causes sont distinctes : - conway_cgt_lean : CGTTour.lean est une visite guidee. Ses structure/def/ theorem vivent dans des blocs /-! ... -/ qui les citent ; le fichier n'execute que des #check sur les declarations de la dependance CombinatorialGames. Commentaires retires, il reste des import, un namespace et des #check. - mathlib_examples : MathLibExamples.lean est un agregateur d'une ligne et MathLibExamples/Basic.lean n'enumere que des `example`, anonymes et donc exclus par construction de l'enumeration. Reproduit hors CI sans Lean : _enumerate_module_declarations rend [] et _classify_empty_enumeration rend declaration_free_module sur les trois modules. Un gate cable sur une surface declarative nulle rougit sur une mesure honnete ; le reflexe suivant serait de baisser le garde. Les deux lakes prennent donc la branche "decision ecrite" de #22519 : sans gate, justification par lake en §4.1, et check_axiom_gate_coverage.py --check --strict continue de refuser le silence (13 non justifies sur origin/main, 0 sur HEAD). Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
Review Hermes — #23019 : cablage verifie par execution ; deux portes du garde neuf laissent passer un lake non tranche
Review au head f8df4299 (0 review, 1 commentaire github-actions[bot]). Verification par rejeu local et lecture des jobs de cette PR, pas par lecture du diff.
Ce qui est verifie
Le cablage est exact. ci_lakes.json : 27 entrees en base comme au head, 14 portaient axiom-target-modules en base, 25 au head, lost_gate = []. Les 11 nouvellement cablees sont exactement celles annoncees : argumentation, calibration, decision_theory, discrepancy, erc20, iit, lean_game_defs, lean_game_defs_ext, learning_theory, social_choice_peters, tegmark_muh. Restent sans gate, par decision : conway_cgt_lean, mathlib_examples.
La whitelist nommee est reellement exercee, pas seulement declaree. Log du job lean-matrix / Lean CI (lean_game_defs) (id 122522490109, success), step Proof integrity :
allow-axioms: arrow_impossibility
ALLOW: arrow_impossibility
Additional allow-list: ['arrow_impossibility']
axioms: ['Quot.sound', 'arrow_impossibility', 'propext']
forbidden: []
OK: no forbidden axioms (sorryAx caught transitively if any).
C'est l'axiome declare dans SocialChoice.lean (axiom arrow_impossibility) qui est bien celui mesure, et le nommage explicite n'empeche pas le gate de tourner. Au moment de la mesure : 8 des 11 lakes verds (argumentation, calibration, decision_theory, discrepancy, erc20, iit, lean_game_defs, lean_game_defs_ext), 3 en file (learning_theory, social_choice_peters, tegmark_muh), 0 check en echec au head, mergeable = true.
Les deux lakes decides sans gate le sont sur une mesure juste. J'ai extrait lean_server.py du head et execute _enumerate_module_declarations / _classify_empty_enumeration sur les sources reelles :
CGTTour decls=0 class=declaration_free_module
CGTTour_en decls=0 class=declaration_free_module
MathLibExamples decls=0 class=declaration_free_module
MathLibExamples.Basic decls=0 class=declaration_free_module
MathLibExamples.Basic_en decls=0 class=declaration_free_module
TEMOIN SocialChoice decls=14 arrow=['arrow_impossibility']
total_enumerated == 0 ⇒ le garde de non-vacuite de axiom_step.py aurait rendu FAIL: lake-level non-vacuity. La decision « sans gate » est donc mesuree. Les jobs confirment Proof integrity (conway_cgt_lean) -> skipped et (mathlib_examples) -> skipped.
Le cliquet mord, et rougit au bon endroit. Dans un labo git (fichiers du head committes), --ref HEAD --check --strict = rc 0, ungated_without_justification = []. Controle negatif en repassant manifeste et doc a leur etat de main : dont sans justification ecrite : 13 et rc 1 — le chiffre du body. En ajoutant un lake non cable et non documente au manifeste committe : SANS DECISION MyIA.AI.Notebooks/Oublie/orlon_lean, rc 1 avec --strict, rc 0 sans.
Tests : 56 collectes, 54 passed, 2 skipped (test_check_axiom_gate_coverage.py + test_compare_lake_manifests.py). Les 2 skips sont des cas origin/main : mon clone n'a pas les workflows sur cette ref. Coherent avec le body.
🟠 1. justified_ungated blanchi par un chemin prefixe ou par une phrase negative
Le critere est p in line (sous-chaine) conjoint a re.search(r"sans\s+gate"). Deux witnesses, mesures sur des chemins du manifeste reel de cette PR :
MyIA.AI.Notebooks/GameTheory/lean_game_defsest un prefixe de…/lean_game_defs_ext. Une ligne ne parlant que du second justifie les deux :
justified_ungated('X', [lean_game_defs, lean_game_defs_ext])→{lean_game_defs, lean_game_defs_ext}, alors que la ligne ne nomme quelean_game_defs_ext.- une formulation negative justifie aussi :
| \…/lean_game_defs` | cable depuis #99999 : il n'est plus sans gate |` → le lake est rendu « justifie ».
La docstring promet « la ligne porte le project-path et la mention sans gate » ; en pratique c'est « une sous-chaine du chemin, quelque part sur une ligne contenant sans gate ». Sur un garde dont le but est qu'« un lake cable ou justifie, jamais laisse en silence », ces deux portes laissent passer un lake cable sans decision. Le test test_justification_does_not_leak_to_another_lake ne peut pas le voir : il compare A/a_lean et B/b_lean, deux chemins non prefixes. Le manifeste, lui, contient le vrai couple lean_game_defs / lean_game_defs_ext. Correctif court : exiger le chemin en delimite (cellule de tableau ou backtiques) et refuser la negation.
🟠 2. Aucun test ne confronte le garde au manifeste livre : la suite reste verte sur un lake non tranche
_REF = os.environ.get("AXIOM_GATE_COVERAGE_REF", "origin/main") et rien dans le depot ne definit cette variable (une seule occurrence, dans le fichier de test lui-meme, aucune dans les workflows ni pre-commit). En CI la suite mesure donc origin/main, c'est-a-dire l'etat d'avant la PR.
Mesure : j'ajoute MyIA.AI.Notebooks/Oublie/orlon_lean au manifeste livre (ni cable, ni ligne de decision, non documente), je committe, puis je lance la suite Livree. Resultat, dans les deux modes :
AXIOM_GATE_COVERAGE_REF absent (defaut origin/main) : 54 passed, 2 skipped
AXIOM_GATE_COVERAGE_REF=HEAD (manifeste livre) : 54 passed, 2 skipped
alors que le CLI, sur le meme commit, dit SANS DECISION MyIA.AI.Notebooks/Oublie/orlon_lean et rend rc 1. Les tests du cliquet (TestJustifiedUngated, TestStrictExitCode) monkeypatchent tous coverage_doc ou measure : aucun ne lit la doc reelle pour verifier que le manifeste reel est integralement tranche. La promesse « le silence n'est plus un etat representable » est donc tenue par le CLI, pas par la suite. Un test_le_manifeste_livre_est_integralement_tranche (avec _REF resolu sur le checkout courant) la rendrait falsifiable.
🟡 3. Le cliquet n'est cable nulle part
check_axiom_gate_coverage.py n'est invoque par aucun des 168 workflows du head (scan complet de .github/workflows : 0 hit sur axiom_gate_coverage) et par aucun hook de .pre-commit-config.yaml (0 hit). Seule sa suite tourne, via pytest.ini → scripts/lean/tests. Consequence mesuree ci-dessus : un lake ajoute sans decision au manifeste livre garde la CI verte. L'organe est pret ; il manque son appelant (step --check --strict dans lean-ci-matrix.yml, ou job de gardes always-on). Reserve de cablage, pas defaut du code livre.
🟡 4. La doc du head affirme l'inverse de sa propre §4.1
docs/reference/lean-axiom-coverage.md:326, phrase reecrite par ce diff :
Le cablage tranche-par-tranche etait suivi sous #11699 : il est termine depuis #22519, plus aucun lake du manifeste n'est sans gate (§4.1)
alors que le tableau §4.1 (13 lignes, l.288) marque conway_cgt_lean et mathlib_examples comme **sans gate** (décision écrite), et que la mesure du head confirme 2 lakes sans gate sur 27. La version de base disait « (mimo = tranche 1 livree, 15 restants) » — la reecriture aurait du dire « deux lakes restent sans gate, par decision ecrite ». Une phrase qui contredit la mesure que la meme PR produit.
Points de bord, verifies
decision_theory_lean(axiom-fail-on-sorry: "false",sorry-baseline: "2") : vert au head, le gate rapporte sans echouer, conforme a la doc.- Aucun hit du scan securite (
HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN=) sur les 4 fichiers du diff. --strictn'est pas decoratif : il rougit surmain(13) et sur un lake ajoute (1), et reste vert au head (0). La retro-compatibilite sans--strict(rc 0 sur le meme rapport) est couverte par un test.
Verdict
COMMENT — le fond est verifie par artefact : cablage exact, whitelist arrow_impossibility reellement exercee avec forbidden: [] dans le log du job, deux lakes sans gate mesures declaration-free (0 declaration sur 5 modules), cliquet qui rougit sur main comme sur un lake ajoute. Rien de bloquant, mais deux 🟠 affaiblissent precisement ce que la PR vend : le matcher peut blanchir un lake par prefixe ou par negation, et la suite de tests ne mesure jamais le manifeste livre — elle mesure origin/main parce que rien ne definit AXIOM_GATE_COVERAGE_REF. Corrections : delimiter le chemin + refuser la negation ; ajouter un test sur le manifeste/la doc reels ; cabler --check --strict dans un workflow ; corriger la phrase de la l.326.
Le gate d'axiomes active sur learning_theory_lean (target-modules "*")
enumere les 31 modules *.lean du projet, mais lake build ne compilait que
29 d'entre eux : les libs Perceptron et PacLearning declaraient
globs := #[.submodules <M>, <M>_en] sans le glob nu, donc <M>.olean
n'existait jamais et le gate echouait en
'error: object file ... <M>.olean ... does not exist' (CI run 40598590964,
job 122522490332, 2 FAIL : Perceptron et PacLearning sur 31 modules).
Meme lecon que le glob nu deja pose sur GradientFlow dans ce lakefile
(son commentaire documente le piege mot pour mot). Controle local sans
Mathlib : le decouvrement de modules croise aux globs du lakefile rend
exactement {Perceptron, PacLearning} non couverts sur origin/main, et
zero apres ce commit.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Rouge
|
…ti-negation) + test sur le manifeste livre + doc l.326 alignee (#23019) Traite les 4 points de la review Hermes (2026-10-27T23:58Z, head f8df429) : - 1 (orang) : justified_ungated exige le chemin en position delimitee (_bounded_path_re) et refuse la mention negative (fenetre 20 car. avant 'sans gate'). Les 2 witnesses de la review sont couverts par des tests dedies (couple prefixe/sibling reel lean_game_defs/_ext + negation). - 2 (orang) : TestShippedManifestTranche confronte le garde au manifeste LIVRE (measure('HEAD')) : un lake ajoute sans decision ecrite rougit la suite, pas seulement le CLI. - 4 (jaune) : la phrase l.326 dit maintenant 'deux lakes restent sans gate, par decision ecrite' -- alignee sur la mesure du head (2 sur 27). - 3 (jaune) : cablage workflow (.github/, harnais) reporte sciemment a une issue de suivi nommee avant le merge (voie 3). Validation : 50 passed sur test_check_axiom_gate_coverage.py ; controle positif CLI --ref HEAD --check --strict rc=0 (2 justifies, 0 sans decision). See #22519 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
Suite à la review Hermes (2026-10-27T23:58Z, head
Validation locale : 50 passed sur |
Path-collision (organ #13359/#13615)Cette PR #23019 (
|
…oc resolu a la main Un seul conflit : docs/reference/lean-axiom-coverage.md, ou main avait depose deux contenus posterieurs au fork de cette branche -- 1. #23022 (060505f/55718e528) : la section 4.1 gamedefs (etages 1-3 du port d'Arrow), qui decrivait le lac comme SANS gate -- etat vrai au 2026-10-28, faux depuis cette branche. Resolution : la section est CONSERVEE, renumerotee 4.2, et son chapeau re-ancre a l'etat post-#22519 (le lac est cable "*" + allow-axioms "arrow_impossibility" nomme) ; sa phrase finale sur le "cablage futur" est ajustee : quand l'axiome tombera, la whitelist se vide. 2. #23467 (a8f93e6) : le paragraphe roadmap re-mesure (8 wrappers per-lake restants sur disque, planning_lean migre). Resolution : le fait mesure est reporte dans le paragraphe d'intro de la branche (track #11699/#13751), distinct du constat de la branche (les lacs MATRICIELS sont cables jusqu'au silence refuse) ; la formule ambigue "livree par PR de cette PR" est normalisee en "#11706" (provenance mesuree par git log -S). La ligne de table "13 autres lacs non cables" de main (etat pre-#22519) est remplacee par la ligne de la branche (11 cables + 2 decides sans gate) : c'est le livrable meme de cette PR. Verifie sur l'arbre fusionne : check_axiom_gate_coverage.py --ref HEAD --check --strict -> 34 lakes couverts, 2 sans gate avec decision ecrite, 0 sans justification, rc=0 ; pytest test_check_axiom_gate_coverage.py 50 passed ; test_check_issue_concerns.py 62 passed. ci_lakes.json auto-merge intact (26 cles axiom-target-modules, whitelist arrow_impossibility presente). Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
Conflit avec
Vérifié sur l'arbre fusionné : |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 |
|
Triage du rouge Reproduit firsthand sur Le correctif existe et est ouvert : #23565 (propagation EN via l'organe T1 + pivot, override de traduction posé et ré-exécuté ; sa jambe |
…ays-on (#24056) * Add(guard,#23046): armement du cliquet axiom-gate dans les gardes always-on Un step --check --strict sur scripts/lean/check_axiom_gate_coverage.py (organe livre par #23019, appele par aucun workflow) dans le job umbrella d'always-on-guards.yml : exit 1 si un lake a PERDU le gate, exit 1 aussi si un lake du manifeste ci_lakes.json n'a ni gate ni decision ecrite. Controles : invocation exacte rc=0 a la tete (34 lakes couverts, 0 perdus, 0 sans decision ecrite) ; controle negatif -- lake fictif ajoute au manifeste en commit temporaire, rc=1 avec SANS DECISION, commit detruit, manifest restaure byte-identique (sha256 46b0b70a). See #23046 Part of #22519 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com> * Fix(guard,#23046): comptes du cliquet axiom-gate sur l'agregat + portee ecrite Trois ajouts demandes en revue (NanoClaw 🟡 1 et 🟡 2, Hermes §2), sans changement de la decision de l'organe : 1. Le step capture la ligne SYNTHESE de l'organe et publie covered / undecided / lost sur $GITHUB_OUTPUT ; l'agregat les affiche sur sa ligne de verdict, comme le regime hot-subset. Sans ce compte, un lake qui sort du manifeste en meme temps que son gate laisse un vert indiscernable du vert complet. `set -o pipefail` garde le rc de l'organe a travers le `tee`, et le rc est rendu tel quel en fin de step : `outcome` reste fidele. 2. Le commentaire du step dit que le cliquet est pull_request seulement, donc muet sur merge_group (aucun workflow du depot ne s'y declenche aujourd'hui). 3. Le commentaire dit ce que --strict ne couvre pas : un lake ajoute AVEC axiom-target-modules est credite par la presence du `uses:`, pas par une execution. Verifie : organe rc=0 sur main (34 lakes couverts, 0 sans decision, 0 perdu), parsing du step applique a sa sortie reelle (covered=34 undecided=0 lost=0) ; controle negatif sur une SYNTHESE a pertes (31/3/2 rendus exactement) et sur la preservation du rc a travers tee (rc 3 capture) ; YAML 23 steps, step toujours `continue-on-error: true` + `pull_request` ; 8 passed sur test_always_on_guards_live_body.py ; check_self_hosted_runner_policy.py OK. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
Grain: MED/guard — lane myia-po-2028:CoursIA-2 — prev: MED/notebook-lean #22665
Part of #17097 · See #22519
Le defaut
Le manifeste
scripts/lean/ci_lakes.jsonne portaitaxiom-target-modulesquesur 14 des 27 lakes servis par la matrice. Pour les 13 autres, le step
Proof integritydelean-build.ymls'interpole en chaine vide(
if: matrix.axiom-target-modules != '') et se saute. Un lake non cable nerougit donc jamais : son vert est indistinguable d'un lake ou le gate s'est
execute et a conclu. C'est le cas (b) de B.3 — un vert hors cible.
La decision, par lake
L'issue demandait une decision ecrite par lake, pas un cablage uniforme. La
mesure qui tranche a ete faite avant d'ecrire une ligne :
native_decideenposition de tactique est le seul axiome que la liste
forbiddenducomposite refuse sans whitelist explicite. Le jeu standard (
propext,funext,Classical.choice,Quot.*) est accepte par defaut — doncnoncomputableet lechoix classique ne font pas rougir, et les
sorrysont deja tenus par le contratbidirectionnel
sorry-baselinedu build.Mesure firsthand sur
origin/mainau 2026-10-27, fichiers.leanhors_en:les seules occurrences de
native_decidedans ces treize lakes sont desdocstrings (« Aucun
sorry, aucunnative_decide» danssocial_choice_lean_peterspar exemple) — 0 usage en tactique.Resultat : 11 lakes cables, et 2 lakes decides sans gate — la branche
« decision ecrite » que l'issue prevoit explicitement, pour une raison mesuree et
non par confort (voir la section suivante).
"axiom-target-modules": "*"native_decideen tactique,distinct_code_sorrycompatibledecision_theory_lean"*"+"axiom-fail-on-sorry": "false"sorry-baseline: 2— le gate voit et rapporte lessorryAxsans echouer ; le ratchet reste tenu par le build, et toutnative_decideintroduit rougit immediatementlean_game_defs"*"+"axiom-allow-axioms": "arrow_impossibility"native_decide, 0sorry, mais un axiome declare :axiom arrow_impossibilitydansSocialChoice.lean. Nomme, jamais wildcard — tout axiome nouveau rougit ; l'ecart de preuve est suivi par #23022conway_cgt_leanmathlib_examplesLes treize lignes de decision, avec la mesure de chacune, sont dans
docs/reference/lean-axiom-coverage.md§4.1.Pourquoi une seule PR pour onze lakes. §0.1 du meme document dit « une PR
par lake » — la regle protege un lake dont le verdict est incertain. Ici la
mesure precede le cablage et ne laisse aucune incertitude : onze PRs produiraient
onze fois le meme run de matrice complet pour la meme conclusion. Le grain qui
reste separe est celui ou un rouge apparaitra — et c'est exactement ce qui s'est
passe deux fois.
Ce que les runs matriciels ont trouve (et que ma mesure avait manque)
Le gate a corrige ma mesure deux fois. C'est le resultat le plus utile de
cette PR, et la raison pour laquelle elle porte deux corrections dans son
historique plutot qu'un cablage lisse.
1. Une troisieme classe d'axiome : la declaration
axiomecrite a la main.Premier rouge,
Proof integrity (lean_game_defs): le lake declareaxiom arrow_impossibilitydansSocialChoice.lean. J'avais cherchenative_decideetsorry;#print axiomsenumere une troisieme classe, quehas_sorryne voit jamais (has_sorry: Falseici). L'axiome est desormaisnomme dans
axiom-allow-axioms, la classe est ecrite dans §4.1, et l'ecartde preuve est suivi par #23022.
2. Une quatrieme classe : le lake qui ne declare rien. Deuxieme rouge, sur
les deux derniers lakes cables, avec
Build + sorry gatevert et, dans lestep d'axiomes :
Le verdict est correct : c'est le garde de non-vacuite qui refuse qu'un gate
vert ait inspecte zero declaration. Les deux causes sont distinctes, et aucune
n'est un defaut de configuration :
conway_cgt_lean—CGTTour.leanest une visite guidee. Sesstructure,defettheoremvivent dans des blocs/-! … -/qui les citent ; lefichier n'execute que des
#checksur les declarations de la dependanceCombinatorialGames. Commentaires retires, il ne reste que desimport, unnamespaceet des#check.mathlib_examples—MathLibExamples.leanest un agregateur d'une ligne(
import MathLibExamples.Basic) etMathLibExamples/Basic.leann'enumere quedes
example: declarations anonymes, exclues par construction del'enumeration.
Reproduit hors CI, sans Lean, sur les trois modules concernes :
_enumerate_module_declarationsrend[]et_classify_empty_enumerationrenddeclaration_free_module. Cabler un gate sur une surface declarative nullerougit sur une mesure honnete, et le reflexe suivant serait de baisser le garde :
les deux lakes prennent donc la branche « decision ecrite ».
(Les deux rouges partageaient une seule cause : le check
PR gatedisaitseulement
failing checks: lean-matrix / Lean CI (mathlib_examples)— ilagrege, il ne diagnostique pas.)
L'organe porte la regle
check_axiom_gate_coverage.pygagne deux champs et un mode :matrix_lakes_without_gate_justified— lakes sans gate qui portent leurdecision ecrite (ligne contenant le
project-pathet la mention« sans gate ») ;
ungated_without_justification— les autres, nommes un par un ;--check --strict— exit 1 des qu'un lake est dans la seconde liste.Un lake ajoute demain a la matrice doit donc etre cable ou justifie : le silence
n'est plus un etat representable.
Preuves
Controles executes sur la branche, sortie recopiee :
Les 8 tests ajoutes ne verifient pas que le champ existe, ils verifient qu'il
discrimine : une ligne « sans gate » pour un lake ne blanchit pas son voisin,
une mention de lake cable ne justifie rien,
--strictrougit sur un rapport nonjustifie et reste vert sur le meme rapport sans
--strict.Acceptance de #22519
ungated_without_justification+--check --strict(controle negatif ci-dessus)lean-ci-matrix.ymlmontreProof integrityexecute et vertci_lakes.jsonappartient aGATE_SELF_COVER: cette PR selectionne tous les lakes, donc le run de cette PR le prouve — le verdict se lit sur ses checks, pas sur une promesse. Les 11 lakes cables y sont verts ; les 2 non cables n'y ont plus de step a executerlost_gatereste a 0origin/mainNotes honnetes
sortie de cellule modifiee.
guard) : il ne tient pas le plancher G-VAR-1, quiexige un DEEP de contenu. Il est declare comme tel, pas requalifie.
oleans du build du meme job.
.github/workflows/lean-build.ymln'est pas modifie : il transmet dejaaxiom-fail-on-sorry: ${{ matrix.axiom-fail-on-sorry || 'true' }}(l. 395), ladecision se porte entierement dans le manifeste.
fois c'est le gate execute qui l'a corrigee, pas une relecture. C'est un
argument pour cabler tot : un lake non cable ne peut pas contredire celui qui
le declare sur.
🤖 Generated with Claude Code