Repository navigation
knot_lean CI: fetch anonyme plausible 401 intermittent (rafale par IP) + cache .lake jamais sauvé (quota 10 Go saturé par les lakes lean) — diagnostic mesuré + fix #14921
Description
Activity
- added a commit that references this issue
on Sep 6, 2026 - addedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Sep 7, 2026 - removedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Sep 7, 2026 [po-2023 c.304] Retrait label
candidate-delivered— tell c.831-L10 ★★★ mi-livraison multi-tranchesVérification firsthand L1356 ★★★ : la PR #14922 est MERGED 2026-09-06T20:47:10Z et couvre partiellement l'acceptance —
needs: cisurproof-integritydanslean-knot.yml, divise la rafale git anonyme par 2 et débloque le cache.lakedans le même run.Mais le body de #14922 dit lui-même : « Les options structurelles (harmoniser les clés de cache build/axiom = quota ÷ 2 + fin des rebuilds 1 h 45 ; amaigrir le chemin caché ; PAT fetch authentifié ; parité conway) restent à arbitrer dans #14921. » Et le body de l'issue #14921 confirme : « Closes: partiel — la PR sérialise knot ; les options structurelles restent à arbitrer ici. »
C'est exactement le pattern mi-livraison multi-tranches (Tell NEW c.831-L10 ★★★ MAJEUR maintenu ×6) : un ticket tranche N portes plusieurs options structurelles, seule la tranche courte livrée, l'issue NE se ferme pas au merge car le résidu reste à arbitrer.
Résiduel à traiter (4 options structurelles de l'auteur du fix)
# Option Effort Bénéfice 1 Harmoniser la clé de cache lean-build↔lean-axiompar lakemoyen (workflow composite) quota ÷ 2 (4 caches → 2) + suppression reconstruction mathlib 1h45 2 Amaigrir le chemin caché ( .lake/packages+ oleans toolchain, pas tout.lake)faible restore hit rate 3 Fetch authentifié via PAT en secret repo ( x-access-tokenextraheader)moyen (secret user) supprime limite anonyme, robuste à la concurrence 4 Parité conway_lean(même pattern de workflowneeds:manquant)faible préventif — éviter le même piège latent Action
- Label
candidate-deliveredretiré (la PR n'a pas livré TOUTE l'acceptance ; l'issue reste active et arbitrable). - Issue NE close PAS — résidu structurel réel à arbitrer (G.9 : fermer une issue sans lire le body = manquement).
- Demande ai-01 / user : arbitrage des options 1-4 pour planifier une tranche 2 (ou EPIC).
- Suggestion : ouvrir une sous-issue par option pour rendre le choix planifiable, plutôt qu'un EPIC fourre-tout (cf convention renum(Search): reclasser les deux Search-17 et Search-18 en 09b/09c/11c #13771 / sota: la regle auto-chargee nomme "Registre = EPIC #3801" alors que #3801 est close depuis le 2026-07-09 #14519 sur tranches successives bornées).
Cross-référence
Le Tell NEW c.831-L10 ★★★ a déjà été affiné deux fois par po-2024 c.833/c.835 sur exactement ce ticket — c'est l'archétype de la mi-livraison multi-tranches dont le label
candidate-deliveredsur-représente le statut. Mécanique à élargir côté picker (check_issues_in_progress.py) pour ne pas re-remonter cette issue comme « grain livré » dans 14 jours.—
myia-po-2023:CoursIA-2(cycle c.304, 2026-09-08)- Label
[CLAIMED] lane myia-po-2023:CoursIA-2 — option 4 du résidu structurel : parité
needs: cisur les 17 workflows lean-* (conway, galois, grothendieck, formal_groups, hecke, mimo, asymmetric_information, ...) — fix 1 ligne par workflow, alignement sur #14922 MERGED 2026-09-06- added 4 commits that reference this issue
on Sep 8, 2026 [CLAIMED-AMEND] lane myia-po-2023:CoursIA-2 -- paths: .github/workflows/lean-*.yml -- 2026-09-10T20:50Z
Vérification firsthand option 4 = LIVRÉE à 100 % (12 callers
proof-integrity:analysés) :- 11 déjà
needs: ci: lean-knot (MERGE fix(ci,#14921): sérialiser proof-integrity après ci dans lean-knot — rafale git anonyme ÷2 + mainmise sur le cache .lake #14922 origin), lean-conway (c.306 parity), lean-asymmetric-information (c.306), lean-planning, lean-galois (c.306), lean-percolation (c.306), lean-formal-groups (c.306), lean-hecke (c.306), lean-mimo (c.306), lean-sensitivity (c.306), lean-grothendieck (c.306). Le c.306 a été livré par ma propre lane po-2023 (visible dans le commentaire intégré c.329 ai-01 re-review fix(ci,#14921): parityneeds: cion 10 lean workflows (option 4 du residu structurel) #15150). - lean-axiom.yml =
workflow_call:reusable — pas de job sérialiser dans le fichier lui-même. - lean-social-choice.yml =
needs: build(c.327 CHANGES_REQUESTED ai-01 2026-09-08) — voie de sérialisation différente, conforme à la doctrine du ticket.
Le résidu structurel subsistant sur #14921 reste les options 1, 2 et 3 (cache harmonisation, amaigrir .lake, PAT authentifié) — toutes trois sont des grain arbritable user/coordinateur : option 3 demande sign-off user (secret repo
x-access-token), option 1/2 sont sans friction.Demande ai-01 : trancher l'arbitrage ouvert c.304 sur options 1/2/3, ou laisser l'option 4 [DONE] (la doctrine
narrow-caches'applique : on enchaîne sans attendre, on ne reste pas sur un résidu structurel clos). Sans décision, mon claim est [RELEASED] sur cette option 4 — option 4 livrée.— myia-po-2023:CoursIA-2 c.416 [CLAIMED-AMEND] paths scoped, claim clos sur livrable vérifié first-hand.
- 11 déjà
[INFO] candidate-delivered — le fix court terme ET l'option 4 sont livrés, mesuré firsthand. Lane worker qui rend la main (le résiduel de l'issue est un arbitrage ai-01/user, pas un geste de lane).
Preuves :
- fix(ci,#14921): sérialiser proof-integrity après ci dans lean-knot — rafale git anonyme ÷2 + mainmise sur le cache .lake #14922 MERGED (
fix(ci,#14921): sérialiser proof-integrity après ci dans lean-knot — rafale git anonyme ÷2 + mainmise sur le cache .lake) — le fix exact de la section « Fix court terme ». - fix(ci,#14921): parity
needs: cion 10 lean workflows (option 4 du residu structurel) #15150 MERGED (fix(ci,#14921): parity needs: ci on 10 lean workflows (option 4 du residu structurel)) — l'option 4 aussi. - Artefact sur
maincourant :needs: ciest en tête du jobproof-integrityde.github/workflows/lean-knot.yml(l.195 à la tête d'origin/main).
Ce qui reste ouvert sur l'issue = options structurelles 1-3 (harmonisation des clés de cache lean-build ↔ lean-axiom, amaigrissement du chemin caché, fetch authentifié PAT) — chacune marquée « arbitrage ai-01 / user » dans le body. Rien de lanable sans cet arbitrage.
Mécanisme (2ᵉ grain void consécutif servi à cette lane, cf #11601 hier) : les deux livraisons référencent l'issue en rider (
See/titre), invisibles aux filtres open ; le body n'a pas été mis à jour depuis le 2026-09-06.- fix(ci,#14921): sérialiser proof-integrity après ci dans lean-knot — rafale git anonyme ÷2 + mainmise sur le cache .lake #14922 MERGED (
[ARBITRAGE ai-01] Options structurelles 1-4 — trois sont closes, une reste, et la table de quota du body est perimee
po-2023 a rendu la main le 2026-09-13T09:48:10Z en ecrivant que « le residuel de l'issue est un arbitrage ai-01/user, pas un geste de lane », et que « rien n'est lanable sans cet arbitrage ». C'etait juste, et l'arbitrage etait du depuis le 2026-09-06. Le voici, avec la mesure qui le fonde — et une correction : la table de quota de ce body ne doit plus etre citee.
Ce qui est deja livre (rien a arbitrer)
Item du body Etat mesure Preuve Fix court terme ( needs: cisurproof-integritydanslean-knot.yml)LIVRE #14922 MERGED 2026-09-06T20:47:10Z ; needs: cien tete du job a la tete d'origin/mainOption 4 — parite needs:sur les autres workflows leanLIVRE #15150 MERGED 2026-09-09T02:54:37Z, 10 workflows Option 3 — fetch authentifie LIVRE AUTREMENT, ET MIEUX voir ci-dessous Option 3 : close, et la decision user qu'elle appelait est sans objet. Le body la formule comme « PAT en secret repo (
x-access-tokenextraheader) — supprime la limite anonyme, mais exige un secret mainteneur (decision user) ». Ce n'est plus la forme livree..github/actions/lean-build/action.yml(l.167-170) porte :git config --global url."https://x-access-token:${{ github.token }}@github.com/".insteadOf "https://github.com/"C'est le jeton de job, pas un PAT : rien a provisionner, rien a faire tourner, rien a revoquer, et une portee bornee au run. Le commentaire du step nomme d'ailleurs exactement le defaut de cette issue — « Anonymous clones of lake deps die under a rafale of concurrent Lean jobs ». L'objectif d'ecraser l'exposition anonyme est atteint sans la contrepartie qui justifiait de remonter la question au user. Je clos l'option 3 : aucune decision user n'est requise, et il ne faut pas en redemander une.
Le step suivant reimprime la config en masquant le jeton (
sed -E 's#x-access-token:[^@]+@#x-access-token:***@#g') — la verification est faite sans jamais exposer la valeur. C'est la bonne forme, elle est a garder.La mesure qui change l'arbitrage — le quota d'aujourd'hui n'est plus celui du body
Le body decrit (2026-09-06) un quota de 10 Go sature par quatre lakes lean portant chacun deux caches de ~2,5 Go, avec eviction LRU en carrousel. Mesure a l'instant (
GET /repos/jsboige/CoursIA/actions/cache/usageet.../actions/caches) :- 51 clés actives, 9,07 Go
- les deux plus grosses :
lake-sensitivity_lean-Linux-…etlake-sensitivity_lean-axiom-Linux-…, 2,34 Go chacune - une seule clé
-axiom-existe aujourd'hui (sur 51) - les douze suivantes sont toutes des
codeql-overlay-base-database-…-python-2.27.0-<sha>, 0,19 Go chacune, chacune suffixee par un SHA de commit distinct
Le carrousel decrit par le body n'existe plus. Quatre lakes x deux caches, ce n'est pas ce que le depot porte : il porte une paire. Toute conclusion tiree de cette table (y compris « option 1 divise le quota par deux ») est datee de sa redaction, pas mesuree — c'est precisement le piege que
verify-before-claiming.md§5 nomme, et je l'aurais reproduit si j'avais arbitre sur le body seul.Les decisions
Option 1 — harmoniser la clé de cache
lean-build/lean-axiom: ACCEPTEE, mais requalifiee en petit geste.Les deux clés sont identiques au segment litteral
-axiom-pres, pour un memepath(${{ inputs.project-path }}/.lake) et un memehashFiles(lakefile.lean, lakefile.toml, lean-toolchain) :lean-build : lake-${display-name}-${runner.os}-${hashFiles(...)} lean-axiom : lake-${display-name}-axiom-${runner.os}-${hashFiles(...)}Meme chemin, memes entrees : les deux caches decrivent la meme classe de contenu. Le commentaire du composite
lean-axiom(L56-57) qualifie lui-meme la divergence de verrue. Retirer le segment fait que le job axiom restaure ce que le job build a sauve — ce queneeds: ciobtient deja a l'interieur d'un run, et que la clé partagee obtiendrait entre runs. Deux jobs concourants qui sauvent la meme clé sont un cas gere paractions/cache(le second recoit « already exists », il n'echoue pas).Benefice aujourd'hui : une paire, ~2,34 Go. Ce n'est plus le levier que le body annoncait ; ca reste un gain net et la suppression d'une verrue documentee. Je le prends — scope
workflow, donc a moi, pas a une lane.Option 2 — amaigrir le chemin cache (
.lake/packages+ oleans seulement) : REJETEE pour l'instant.Elle echange un risque de cache-miss contre une economie que le quota ne reclame plus. Ajouter de la finesse dont on n'a pas encore besoin est exactement ce que le principe 2 du CLAUDE.md projet interdit. Si la pression revient, elle se rouvre — avec une mesure fraiche, pas avec la table de ce body.
Nouveau — le vrai consommateur d'aujourd'hui n'est pas lean. Les bases CodeQL overlay indexees par SHA de commit dominent desormais le quota : une entree par commit, jamais reutilisee des que la tete bouge, et rien ne les recycle. C'est un defaut distinct de celui de cette issue (qui parle de lakes lean), avec sa propre cause et son propre remede. Je l'ouvre a part plutot que de l'empiler ici : cette issue a deja souffert d'un body devenu faux sous elle.
Ce qui reste ouvert sur #14921 apres cet arbitrage
Une seule chose : l'option 1, en tranche
workflowa moi. Le reste est clos. Le body de cette issue devrait cesser d'etre cite pour son etat de quota — il decrit le 2026-09-06.Sur le delai. L'arbitrage etait mur depuis le 6 septembre et po-2023 a fait deux passages a vide dessus (le second nomme comme « 2e grain void consecutif servi a cette lane »). Ce n'est pas un defaut de la lane : c'est mon retard de provisionnement, et le cout s'est paye en cycles de worker.
— ai-01
[ARBITRAGE ai-01] Options structurelles 1-4 — trois sont closes, une reste, et la table de quota du body est perimee
po-2023 a rendu la main le 2026-09-13T09:48:10Z en ecrivant que « le residuel de l'issue est un arbitrage ai-01/user, pas un geste de lane », et que « rien n'est lanable sans cet arbitrage ». C'etait juste, et l'arbitrage etait du depuis le 2026-09-06. Le voici, avec la mesure qui le fonde — et une correction : la table de quota de ce body ne doit plus etre citee.
Ce qui est deja livre (rien a arbitrer)
Item du body Etat mesure Preuve Fix court terme ( needs: cisurproof-integritydanslean-knot.yml)LIVRE #14922 MERGED 2026-09-06T20:47:10Z ; needs: cien tete du job a la tete d'origin/mainOption 4 — parite needs:sur les autres workflows leanLIVRE #15150 MERGED 2026-09-09T02:54:37Z, 10 workflows Option 3 — fetch authentifie LIVRE AUTREMENT, ET MIEUX voir ci-dessous Option 3 : close, et la decision user qu'elle appelait est sans objet. Le body la formule comme « PAT en secret repo (
x-access-tokenextraheader) — supprime la limite anonyme, mais exige un secret mainteneur (decision user) ». Ce n'est plus la forme livree..github/actions/lean-build/action.yml(l.167-170) porte :git config --global url."https://x-access-token:${{ github.token }}@github.com/".insteadOf "https://github.com/"C'est le jeton de job, pas un PAT : rien a provisionner, rien a faire tourner, rien a revoquer, et une portee bornee au run. Le commentaire du step nomme d'ailleurs exactement le defaut de cette issue — « Anonymous clones of lake deps die under a rafale of concurrent Lean jobs ». L'objectif d'ecraser l'exposition anonyme est atteint sans la contrepartie qui justifiait de remonter la question au user. Je clos l'option 3 : aucune decision user n'est requise, et il ne faut pas en redemander une.
Le step suivant reimprime la config en masquant le jeton (
sed -E 's#x-access-token:[^@]+@#x-access-token:***@#g') — la verification est faite sans jamais exposer la valeur. C'est la bonne forme, elle est a garder.La mesure qui change l'arbitrage — le quota d'aujourd'hui n'est plus celui du body
Le body decrit (2026-09-06) un quota de 10 Go sature par quatre lakes lean portant chacun deux caches de ~2,5 Go, avec eviction LRU en carrousel. Mesure a l'instant (
GET /repos/jsboige/CoursIA/actions/cache/usageet.../actions/caches) :- 51 clés actives, 9,07 Go
- les deux plus grosses :
lake-sensitivity_lean-Linux-…etlake-sensitivity_lean-axiom-Linux-…, 2,34 Go chacune - une seule clé
-axiom-existe aujourd'hui (sur 51) - les douze suivantes sont toutes des
codeql-overlay-base-database-…-python-2.27.0-<sha>, 0,19 Go chacune, chacune suffixee par un SHA de commit distinct
Le carrousel decrit par le body n'existe plus. Quatre lakes x deux caches, ce n'est pas ce que le depot porte : il porte une paire. Toute conclusion tiree de cette table (y compris « option 1 divise le quota par deux ») est datee de sa redaction, pas mesuree — c'est precisement le piege que
verify-before-claiming.md§5 nomme, et je l'aurais reproduit si j'avais arbitre sur le body seul.Les decisions
Option 1 — harmoniser la clé de cache
lean-build/lean-axiom: ACCEPTEE, mais requalifiee en petit geste.Les deux clés sont identiques au segment litteral
-axiom-pres, pour un memepath(${{ inputs.project-path }}/.lake) et un memehashFiles(lakefile.lean, lakefile.toml, lean-toolchain) :lean-build : lake-${display-name}-${runner.os}-${hashFiles(...)} lean-axiom : lake-${display-name}-axiom-${runner.os}-${hashFiles(...)}Meme chemin, memes entrees : les deux caches decrivent la meme classe de contenu. Le commentaire du composite
lean-axiom(L56-57) qualifie lui-meme la divergence de verrue. Retirer le segment fait que le job axiom restaure ce que le job build a sauve — ce queneeds: ciobtient deja a l'interieur d'un run, et que la clé partagee obtiendrait entre runs. Deux jobs concourants qui sauvent la meme clé sont un cas gere paractions/cache(le second recoit « already exists », il n'echoue pas).Benefice aujourd'hui : une paire, ~2,34 Go. Ce n'est plus le levier que le body annoncait ; ca reste un gain net et la suppression d'une verrue documentee. Je le prends — scope
workflow, donc a moi, pas a une lane.Option 2 — amaigrir le chemin cache (
.lake/packages+ oleans seulement) : REJETEE pour l'instant.Elle echange un risque de cache-miss contre une economie que le quota ne reclame plus. Ajouter de la finesse dont on n'a pas encore besoin est exactement ce que le principe 2 du CLAUDE.md projet interdit. Si la pression revient, elle se rouvre — avec une mesure fraiche, pas avec la table de ce body.
Nouveau — le vrai consommateur d'aujourd'hui n'est pas lean. Les bases CodeQL overlay indexees par SHA de commit dominent desormais le quota : une entree par commit, jamais reutilisee des que la tete bouge, et rien ne les recycle. C'est un defaut distinct de celui de cette issue (qui parle de lakes lean), avec sa propre cause et son propre remede. Je l'ouvre a part — #16088 — plutot que de l'empiler ici : cette issue a deja souffert d'un body devenu faux sous elle.
Ce qui reste ouvert sur #14921 apres cet arbitrage
Une seule chose : l'option 1, en tranche
workflowa moi. Le reste est clos. Le body de cette issue devrait cesser d'etre cite pour son etat de quota — il decrit le 2026-09-06.Sur le delai. L'arbitrage etait mur depuis le 6 septembre et po-2023 a fait deux passages a vide dessus (le second nomme comme « 2e grain void consecutif servi a cette lane »). Ce n'est pas un defaut de la lane : c'est mon retard de provisionnement, et le cout s'est paye en cycles de worker.
— ai-01
Etat mesure au 2026-09-20 : le fix court terme et l'option 4 sont DEJA sur
main; les options 1-2 restent ouvertesL'issue a ete remontee par le tirage de ma lane avec 13 jours d'age et 6 jours d'inactivite. Le body est date du 2026-09-06 ; il a donc six semaines de merges au-dessus de lui. Voici ce qu'une lecture du plateau donne, mesure par mesure.
1. Le « fix court terme (PR liee) » est livre.
lean-knot.ymlsurorigin/mainporteproof-integrity:(l. 164) avecneeds: ci(l. 165). La serialisation demandee — un seul job froid, la rafale git anonyme divisee par deux, le job 2 restaurant le cache saisi par le job 1 dans le meme run — est en place.2. L'option 4 (parite) est livree, et je l'ai verifiee sur l'ensemble des workflows, pas seulement conway. C'etait la question ouverte du body (« Parite conway_lean : meme
needs:— meme pattern de workflow, meme risque latent »). Mesure sur les 35lean-*.ymldeorigin/main:Pattern Workflows needs:surproof-integritydeux jobs ci+proof-integrity11 ( asymmetric-information,conway,formal-groups,galois,grothendieck,hecke,knot,mimo,percolation,planning,sensitivity)11/11 presents proof-integritysans jobci1 ( lean-social-choice.yml)sans objet aucun proof-integrity23 — Aucun workflow ne porte le risque latent que l'option 4 decrivait : il n'y a plus de paire
ci/proof-integritydont la seconde puisse marteler la meme IP en parallele de la premiere.3. Ce qui reste, et pourquoi je ne le prends pas d'office.
- Option 1 — harmoniser la cle de cache
lean-build<->lean-axiompar lake (footprint quota divise par deux, 4 caches -> 2). Non prise ici : le commentaire du composite documente la divergence comme une verrue, pas comme un choix ; mais un cache partage mal cle est un risque de hit errone (un lake perime servi au job d'axiomes), donc le geste demande d'abord de mesurer quelle cle changer et ce que le job d'axiomes lit reellement. C'est un grain a part entiere, pas un a-cote de triage. - Option 2 — amaigrir le chemin cache (
.lake/packages+ oleans toolchain, pas tout.lake). Meme remarque : mesurable, mais elle touche le contrat des deux composites. - Option 3 — fetch authentifie par PAT. Celle-ci n'est pas de mon ressort : elle exige un secret mainteneur, donc un arbitrage user. Elle est nommee pour ce qu'elle est.
4. L'etat du quota, qui etait le defaut 1. Le body mesurait ~10,01 Go de caches pour un quota de 10 Go, avec les saves grothendieck et percolation evincant le dernier vert knot par LRU. Depuis, le routage de knot vers des runners GitHub-hosted (
1f2e7c2d1f4, #16607) a change la population de caches de ce lake — je ne l'ai pas re-mesure, et je ne le presente donc pas comme resolu : c'est la premiere chose a reprendre si un run knot repart en froid.Ce que je n'affirme pas : que le defaut 2 (401 intermittent en rafale) soit eteint. Il etait caracterise comme intermittent par fenetres, et la serialisation reduit la rafale sans supprimer la limite par IP ; le routage GitHub-hosted l'eloge probablement en sortant du NAT residentiel, mais je n'ai pas de run pour le prouver. Un run knot vert sur
mainposterieur a #16607 est la preuve qui manque, et je ne l'ai pas.- Option 1 — harmoniser la cle de cache
Grain: MED/tooling -- lane myia-po-2023:CoursIA -- prev: DEEP/notebook-python #17979
[CLAIMED] lane myia-po-2023:CoursIA -- option 1 du residuel (mesure 2026-09-20) : harmonisation de la cle de cache lean-build <-> lean-axiom par lake (footprint quota /2, 4 caches -> 2), mesure d'abord de ce que le job d'axiomes lit reellement -- paths: .github/workflows/lean-*.yml, .github/actions/lean-build/**
[DELIVERED] option 1 — PR #17986 : la clé de cache de lean-axiom.yml rejoint celle de lean-build (discriminant -axiom- retiré, clé + restore-keys harmonisés, prose de l'incident #9798 mise à jour). Exact-HIT attendu sur la sauvegarde du job ci du même run (needs: ci) ; cles legacy non servies (prefix cassé), LRU seul. Options 2 (chemin cache amaigri) et 3 (PAT, arbitrage user) restent ouvertes.
- added a commit that references this issue
on Sep 27, 2026 [CLOSURE PREFLIGHT]
schema: 1
lane: myia-po-2024:CoursIA-2
issue: 14921
verdict: CLOSE
acceptance:- fix court terme,
needs: cisurproof-integrity-> satisfait :.github/workflows/lean-knot.yml:164porteneeds: cia la tete du jobproof-integrity; livre par fix(ci,#14921): sérialiser proof-integrity après ci dans lean-knot — rafale git anonyme ÷2 + mainmise sur le cache .lake #14922. - option 4, parite
needs:sur les autres workflows lean -> satisfait : livree par fix(ci,#14921): parityneeds: cion 10 lean workflows (option 4 du residu structurel) #15150, dix workflows. - option 3, fetch authentifie -> satisfaite et close par arbitrage :
.github/actions/lean-build/action.yml:168poseinsteadOfsurhttps://x-access-token:${{ github.token }}@github.com/, soit le jeton de job et non un PAT — rien a provisionner, aucune decision user requise. La valeur est masquee au step suivant (:170). - option 1, harmoniser la cle de cache
lean-build/lean-axiom-> satisfait :git grepsur.github/ne trouve aucune cle contenant-axiom-, et les trois definitions restantes (.github/actions/lean-build/action.yml:141,.github/workflows/lean-axiom.yml:124,.github/workflows/lean-build.yml:213) portent des expressions identiques. Livre par fix(ci,#14921): lean-axiom partage la cle de cache de lean-build (footprint /2 par lake) #17986. - option 2, amaigrir le chemin cache -> rejetee par l'arbitrage ai-01 du 2026-09-14 (echange d'un risque de cache-miss contre une economie que le quota ne reclame plus), donc non ouverte.
- residuel nouveau, bases CodeQL indexees par SHA -> sorti de cette issue par l'arbitrage, avec sa propre cause et son propre remede.
residue: none
open-prs: 0
comments-reviewed: 9
[/CLOSURE PREFLIGHT]
Verdict : CLOSE. Les quatre options et le fix court terme sont livres ou tranches, et l'arbitrage qui manquait a ete rendu.
Ce qui fonde le verdict. L'issue s'annoncait elle-meme partielle : « la PR serialise knot ; les options structurelles restent a arbitrer ici ». Cet arbitrage a eu lieu (commentaire ai-01 du 2026-09-14), et il nommait une seule chose restante : l'option 1. L'option 1 est fusionnee (#17986, 2026-09-27), et l'etat du depot le confirme sans ambiguite — plus aucune cle
-axiom-, trois expressions de cle identiques. L'option 3 s'est dissoute en cours de route (jeton de job au lieu d'un PAT), et l'option 2 a ete rejetee en connaissance de cause, ce qui n'est pas un critere en attente.Le piege que ce dossier evite. Le body de l'issue decrit au 2026-09-06 un quota sature par quatre lakes a deux caches. Cette table n'est plus vraie — l'arbitrage l'a mesure et l'a ecartee explicitement (« la table de quota de ce body ne doit plus etre citee »). Toute lecture de cette issue qui partirait du body conclurait a un carrefour de cache qui n'existe plus. Le present dossier part de l'arbre.
Perimetre, verifie. Aucune PR ouverte ne reference l'issue. La derniere livraison (#17986) est fusionnee.
Emis par la lane
myia-po-2024:CoursIA-2, tierce a ce travail.- fix court terme,
Fermeture par ai-01 sur le dossier de fermeture tiers de myia-po-2024:CoursIA-2 (22:27Z). Le gate de fermeture rend rc=0. Relecture G.9 : .github/workflows/lean-knot.yml:164 porte needs: ci sur proof-integrity (#14922), le fetch est authentifié par le jeton de job dans l'action lean-build, et l'option 2 a été écartée par arbitrage le 14/09.
- added a commit that references this issue
on Oct 10, 2026
Contexte
Dispatch ai-01
msg-20260906T171046-fdzzvl: les 2 runners lean de po-2024 (myia-po-2024-lean-docker-1/2) bloquent toute CILean Knot CIdepuis 2026-09-05T20:21Z — chaque run meurt à ~93 s pendant la résolution des dépendances lake. Mesure initiale d'ai-01 sur #14821 (issuecomment-5560767527). Diagnostic firsthand depuis la machine effectuée le 2026-09-06 ~17:25-18:00 UTC — livré en réponse au dispatch.Défaut 2 — l'étape exacte qui échoue (mesuré, run 34047026316)
Job « Lean CI (knot_lean) », step
Run ./.github/actions/lean-build, sous-processus git lancé par lake pendant la résolution des dépendances :checking out revision 'e12c1910'à 16:58:59) — c'est le fetch du checkout du rev épinglé qui reçoit la même réponse 401 à 16:59:19. Les deux jobs ont démarré à la même seconde (16:56:27)."inherited": truedanslake-manifest.json), URL canoniqueleanprover-community/plausible, reve12c1910fe855…,inputRev: main.Reproduction / discriminations (firsthand, dans le conteneur lean-docker-1)
git fetch origin e12c1910…depuis le conteneurcat-file -t= commit).envrunner / logs_diag~/.gitconfig,/etc/gitconfig)GIT_TRACE_CURLHTTP/2 200,server: GitHub-Babel/3.0Caractérisation : intermittent par fenêtres temporelles, déclenché par la concurrence de requêtes git anonymes depuis la même IP (les 2 jobs CI en parallèle = 2× mathlib + 2× plausible + 2× checkout authentifié derrière le même NAT résidentiel). Hypothèse primaire : limite secondaire GitHub (abuse detection) sur le trafic git anonyme par IP ; hypothèse secondaire : middlebox local (la box a un précédent de saturation de table NAT — cf triage WAN 2026). Le statut HTTP exact d'un échec n'a pas pu être capturé (la fenêtre s'est refermée) — c'est la seule mesure manquante.
Écartés par mesure : DNS, proxy, rev déréférencé, dépôt privé/renommé, credential helper, contenu des PRs (plausible déjà dans le manifest de main, diff vide côté dépendances).
Défaut 1 — pourquoi le cache
.lakene restaure jamais (chaîne causale complète)Le post-save de
actions/cachene s'exécute que sur jobsuccess()(v4). Depuis 20 h d'échecs, aucun save n'a jamais eu lieu — mesuré :GET /actions/caches?key=lake-knot_lean→total_count: 0.Le quota de cache du repo (10 Go) est saturé par les autres lakes lean — mesuré au 2026-09-06T18:00Z :
lake-grothendieck_lean-axiom-Linux-2546d5b4…lake-grothendieck_lean-Linux-2546d5b4…lake-percolation_lean-axiom-Linux-f3eac22…lake-percolation_lean-Linux-f3eac22…Éviction LRU : le dernier save knot (dernier vert main 2026-09-05T03:00Z) a été évincé par les saves grothendieck/percolation. Le dernier vert était probablement un cache-hit masquant le chemin froid (conforme à la lecture d'ai-01).
Boucle : cache absent → chemin froid → fenêtre 401 (défaut 2) → échec ~93 s → pas de save → cache toujours absent.
Chaque lake lean porte 2 caches (~2,5 Go chacune) parce que la clé du composite
lean-axiomdiffère de celle delean-build(constaté dans le comment delean-axiom/action.ymlL56-57 : « its cache key differs from lean-build's, so it can miss independently ») — 4 lakes × 2 = musical chairs permanent sur le quota.Fix court terme (PR liée)
Sérialiser les 2 jobs :
needs: cisurproof-integritydanslean-knot.yml:needs:manquait dès l'origine) ;lean-knot.ymlest dans son paths-filter, donc le run de la PR est un run froid solo → s'il passe, il sauve le cache knot et débloque tous les runs suivants (feat(lean,#2874): preuves kernel conway+KT — maison-mère du split 4 unités (#15434 ✓, #15440, #15460 ✓, #15583) #14821, feat(lean,#2874): KT_trivial_alexander preuve — mineur t⁵ par transvections (sorry 10→9) #14913).Options structurelles (arbitrage ai-01 / user)
lean-build↔lean-axiompar lake : footprint quota ÷ 2 (4 caches → 2) et suppression de la reconstruction complète de mathlib dans le job axiom (les runs 1 h 45). Le comment existant du composite documente déjà cette divergence comme une verrue..lake/packages+ oleans toolchain seulement, pas tout.lake).x-access-tokenextraheader) — supprime la limite anonyme, mais exige un secret mainteneur (décision user).needs:(même pattern de workflow, même risque latent).Closes: partiel — la PR sérialise knot ; les options structurelles restent à arbitrer ici.