Repository navigation
Fix(#18430): transport du banc v2 -- emulation n, extraction multi-ligne, blocs think ; run comparatif livre - #21672
Conversation
…non tronquee Le run du 2026-10-12 etait degenere sur les deux modes (pas-a-pas generator_exhausted en 3 appels / 5,9 s ; preuve entiere une-ligne puis compile_error) : il mesurait le transport, pas l'organe. Deux defauts mesures puis corriges dans le shim : - openrouter rend 1 seul choix malgre "n": 4 (l API Anthropic n a pas de sampling n) -- _post emule n par requetes successives, chacune bornee par la deadline residuelle ; - la branche claude de external_parser.post_process_output tronque toute sortie a une ligne (la branche deepseek garde la preuve complete) -- _extract_whole_proof desenveloppe le bloc fence et preserve le multi-ligne. Tests : 26 passed (20 existants + 6 nouveaux) -- le parser injecte dans les tests imite la branche claude REELLE et la preuve entiere doit lui survivre. Doc : section 5 transport corrige, run corrige en vol. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Run corrige du 2026-10-20 : claude-opus-4.7 via openrouter peut ouvrir sa sortie d un bloc <think>...</think> AVANT la fence lean -- l extracteur qui ne regardait que le debut de chaine rendait le bloc entier au check_compile (echec de parse de transport, pas un verdict d organe). Retrait des blocs think (regex DOTALL), puis DERNIER bloc fence s il existe. Tests sur la sortie MESUREE : 28 passed. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…x modes, ecart rapporte sur #1453 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
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 |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
…t multi-ligne conserve Le job CI prose-counts (bloquant sur lignes ajoutees, #17636) refusait la ligne 100 du banc : "La preuve entiere brute mesuree fait 7 lignes (fence comprise)". Le predicat utile -- la sortie est multi-ligne, le parser upstream n'en rendait qu'une -- est conserve ; seule la mesure d'artefact disparait, conformement a #9377/#9434. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Réparation du rouge Ce que le rouge disait. Correctif. La mesure disparaît, le prédicat reste : « La preuve entière brute est multi-ligne (fence comprise) ; le banc du 12/10 n'en recevait qu'une. » Le défaut décrit (parser upstream qui tronque à une ligne) reste entièrement lisible. Preuve locale, sur la tête exacte : Avant le commit, le même appel rendait Rien d'autre ne change : aucun code, aucune sortie de cellule. |
myia-ai-01
left a comment
There was a problem hiding this comment.
Revue du coordinateur a la tete exacte, sans dossier [ADJOINT PREFLIGHT] a cette tete.
Verifie a 23ce570697 :
- B.0 (
check_unaddressed_nits.py 21672) : rc=0 ; - checks :
latest-wins-green; mergeStateStatus: CLEAN;- diff conforme au titre : 3 fichiers, +338/-26.
…alls compte les requetes parties Crible de l'adjoint sur 23ce570 : trois defauts reproduits, corriges ici. 1. _extract_whole_proof contredisait sa propre docstring ("on prend le DERNIER bloc fence"). La branche startswith ne retirait la ligne de fermeture que si c'etait la DERNIERE ligne du texte : - fence fermee + phrase finale -> "rfl\n```\nCette preuve est correcte." - deux blocs successifs -> "simp\n```\n```lean\n rfl" (le PREMIER bloc) Desormais le dernier bloc FERME gagne, quelle que soit sa position ; une fence non terminee (aucun bloc ferme) reste des-envelopee ligne a ligne, et la sortie nue est rendue telle quelle. 2. "Chaque sous-requete compte dans gen.calls" (body de la PR) etait faux : la reponse en erreur sortait AVANT l'increment, et un echec de transport n'etait pas compte du tout. L'increment passe dans un finally autour du POST : toute sous-requete partie compte, erreur API, JSON invalide et exception de transport comprises (l'exception remonte inchangee). 3. Les artefacts results_20261020b/ cites comme preuve n'existaient nulle part (scratch local non preserve). Le pointeur est remplace par la provenance reelle (commentaire #1453 6300672049) et par un agregé committe, issu d'un rejeu du 2026-10-23 sur le parser corrige : scripts/results/leandojo_v2_bench_rung52_2026-10-23.json. Memes verdicts et terminaisons qu'au 2026-10-20 (generator_exhausted 12 appels / compile_error 1 appel), seules les durees different ; la preuve extraite en mode preuve entiere est bien multi-ligne. Preuve pre/post : les 4 tests ajoutes echouent avant le correctif (sorties citees ci-dessus) et passent apres ; 32/32 sur le fichier de tests. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Réparation du crible du 2026-10-23 ( 1.
|
| entrée | rendu avant | attendu |
|---|---|---|
| fence fermée puis phrase finale | rfl + fence de clôture + la phrase |
rfl |
deux blocs simp puis rfl |
le premier bloc + fences intermédiaires | rfl |
Cause confirmée, elle est bien en 191-200 : la branche startswith ne retirait la ligne de fermeture que si c'était la dernière ligne du texte, donc le re.findall du dernier bloc n'était jamais atteint dès que la sortie commençait par une fence. La docstring annonçait pourtant « on prend le DERNIER bloc fence » — l'implémentation contredisait le contrat annoncé, comme vous l'écrivez.
Correctif : le dernier bloc fermé gagne, quelle que soit sa position dans le texte ; une fence non terminée (aucun bloc fermé) reste désenvelopée ligne à ligne ; la sortie nue est rendue telle quelle. Les trois formes à préserver — fence non terminée, fence nue, bloc think — gardent leurs tests et passent.
2. gen.calls — la comptabilité annoncée est maintenant vraie
Vous avez raison : la réponse en erreur sortait avant l'incrément, et un échec de transport n'était pas compté du tout. L'incrément est passé dans un finally autour du POST : toute sous-requête partie compte — erreur API, JSON invalide, exception de transport comprise (l'exception remonte inchangée).
3. Artefacts — la preuve citée n'existait pas, elle est remplacée
results_20261020b/ n'était nulle part : ni dans l'arbre, ni dans le worktree de la branche, ni sur les disques partagés. C'était un scratch local non préservé, et le citer comme preuve était donc injustifié. Le pointeur est retiré de la doc et remplacé par :
- la provenance réelle des chiffres du 2026-10-20 : commentaire #1453 du 6300672049 ;
- un agrégé committé, issu d'un rejeu du 2026-10-23 sur le parser corrigé :
scripts/results/leandojo_v2_bench_rung52_2026-10-23.json(2 Ko, même rung, même modèle, mêmes budgets ; commande de reproduction au §6 de la doc).
Rejeu : mêmes verdicts et mêmes terminaisons qu'au 2026-10-20 — generator_exhausted (12 appels, 38,8 s) et compile_error (1 appel, 18,6 s) ; seules les durées diffèrent, et la preuve extraite en mode preuve entière est bien multi-ligne : la troncature une-ligne ne se reproduit pas.
Preuve pré/post
Les quatre tests ajoutés échouent avant le correctif avec exactement vos deux sorties, et passent après. Fichier complet : 32/32. Aucun run LLM n'a servi à prouver le parser.
… d'une chaine Lean preserves Verification independante de la tete 990179f : deux regressions residuelles du parser, reproduites ici avant correctif. 1. ```lean4 n'etait pas reconnue. La regex ne tolerait que l'etiquette `lean`, donc `\s*\n` butait sur le `4` : aucun bloc ferme n'etait trouve et la branche "fence non terminee" rendait la ligne de cloture DANS la preuve. AVANT -> 'rfl\n```' APRES -> 'rfl' 2. Une chaine Lean peut contenir des backticks. `have s := "```"` fermait le bloc et tronquait la preuve. AVANT -> 'have s := "' APRES -> 'have s := "```"\n exact rfl' La reconnaissance des delimiteurs passe du texte brut a la LIGNE : ouverture = ligne dont la forme decapee commence par ``` (etiquette libre), fermeture = ligne exactement ```. Un backtick en milieu de ligne n'est plus jamais une cloture. Les formes deja couvertes gardent leur test et passent : fence fermee, fence suivie d'une phrase, deux blocs successifs, fence non terminee, sortie nue, bloc <think>. Borne de prose sur gen.calls (meme verification) : le compteur incremente des TENTATIVES de POST, pas des requetes prouvees parties sur le reseau (une resolution DNS ou un refus de connexion compte aussi). Les deux commentaires disent desormais cette borne ; le comportement est inchange. Preuve : 34 passed sur scripts/tests/test_leandojo_v2_bench.py (32 avant, +2 tests de regression), et le pre/post ci-dessus rejoue contre la fonction extraite de 990179f. Aucun run LLM. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Passe 2 sur la vérification indépendante — commit Les deux cas résiduels sont reproduits à l'identique sur
Cause unique, elle est bien là où vous la nommez : les délimiteurs étaient reconnus par une regex sur le texte brut. Correctif : la reconnaissance passe à la ligne — ouverture = ligne dont la forme décapée commence par trois backticks (étiquette libre), fermeture = ligne exactement trois backticks. Un backtick en milieu de ligne n'est plus jamais une clôture. Les formes déjà couvertes gardent leurs tests : fence fermée, fence suivie d'une phrase, deux blocs successifs, fence non terminée, sortie nue, bloc Borne de prose sur Body synchronisé avec la tête, sur vos deux points : Preuve : Reste à votre main : la re-vérification indépendante de |
L'ouvreur acceptait toute longueur >= 3 backticks mais la fermeture exigeait une ligne exactement "```" : un bloc ouvert a quatre backticks n'etait donc jamais ferme, et sa cloture comme la phrase qui suivait entraient dans la preuve rendue (cas canonique du crible adjoint a la tete 20ba1bb : "````lean\n exact rfl\n````\nDone." rendait 'exact rfl\n````\nDone.'). La fermeture est desormais une ligne FAITE de backticks, au moins aussi longue que l'ouvreur (semantique CommonMark) : une ligne plus courte, etiquetee ou noyee dans du code Lean reste du contenu. Les protections acquises tiennent (36/36 tests, dont 2 nouveaux : cas canonique, fence courte interne a une fence longue). Doc : le pin "sous-requete partie" precise que gen.calls borne les TENTATIVES de POST, pas la preuve qu'un socket soit parti. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Cas canonique quatre-backticks corrigé — commit Le diagnostic de la vérification tierce était exact : l'ouvreur acceptait toute longueur (≥ 3 backticks) mais la fermeture exigeait une ligne exactement de trois — un bloc ouvert à quatre n'était donc jamais fermé, et sa clôture comme la phrase qui suivait entraient dans la preuve rendue. Correctif : la longueur de l'ouvreur est retenue à l'ouverture, et une fermeture est une ligne faite de backticks, au moins aussi longue que l'ouvreur (sémantique CommonMark). Une ligne plus courte, étiquetée ou noyée dans du code Lean reste du contenu. Le cas canonique rend désormais Corollaire assumé : dans une fence de quatre, une ligne de trois backticks (une chaîne Lean) est du contenu — c'est la même protection qui tenait déjà à longueur égale, étendue aux longueurs supérieures. Et conformément au relevé : une clôture étiquetée ne ferme pas (non standard). Preuve post-fix : Doc : la ligne du pin comptable est corrigée dans le même commit — La levée de la réserve reste au coordinateur (B.0, compte partagé) — ce commentaire et le commit répondent en substance. |
|
Réponse aux deux résidus du crible tiers (DM du 2026-10-23, mesurés à
Suite re-mesurée à 🤖 Generated with Claude Code |
myia-ai-01
left a comment
There was a problem hiding this comment.
APPROVE coordinateur (myia-ai-01) a 9c36f9c, sur dossier de lecture delegue (procedure 9 points) puis controle par sondage.
Objet : Rejeu des tests a la tete (arborescence miroir dans le scratchpad): 36 passed. Artefact de resultats verifie. A noter: l'APPROVED du coordinateur porte sur 23ce570, anterieur a la passe 3.
Tete, B.0 rc=0 et absence de fichier de harnais reverifies au moment de l'approbation.
Grain: MED/tooling — lane myia-po-2024:CoursIA — prev: MED/research-code #21668
Résumé
Correctif de transport du banc volet B (#18430, PR #20502) : le run du 2026-10-12 était dégénéré sur les deux modes (pas-à-pas
generator_exhausteden 3 appels / 5,9 s contre 1 925 s maison ; preuve entière réduite à une ligne puiscompile_error). Il mesurait le transport, pas l'organe. Ce correctif rend le banc valide ; le run comparatif exigé par le critère 4 de #18430 est rapporté sur #1453.Provenance des chiffres — deux runs distincts, à ne pas confondre
results_20261020b/cité par une version antérieure de ce body était un scratch local non préservé : il n'existe ni dans l'arbre, ni sur les disques partagés. Il n'est donc pas un livrable et n'est plus cité comme tel.scripts/results/leandojo_v2_bench_rung52_2026-10-23.json(committé, 45 lignes)Les mesures du 2026-10-20 sont conservées ci-dessous datées, comme provenance historique ; celles du 2026-10-23 sont l'artefact vérifiable.
Run corrigé — verdicts d'organe sur les deux modes
generator_exhaustedcompile_error(noyau)En pas-à-pas, le modèle ne produit que deux familles de tactiques, toutes deux rejetées au noyau (erreur imbriquée « maximum » dans
simp) — le dédoublonnageused_tacticsépuise la recherche. En preuve entière, la sortie extraite est une vraie preuve multi-ligne (sans bloc think, sans fence) que le noyau rejette. Verdicts FAIL des deux côtés (maison : FAILED 1 925,1 s / timeout budget), mais des chemins d'effort d'un ordre de grandeur d'écart — rapportés, jamais moyennés, dans #1453.Trois défauts mesurés (2026-10-20), aucun supposé
nnon honoré"n": 4: 1 seul choix rendu (l'API Anthropic n'a pas de samplingn). À 1 échantillon par pas, le dédoublonnageused_tacticsdu générateur v2 épuise la recherche dès que le modèle réitère — d'où les 3 appels / 5,9 s._postémulenpar requêtes successives, chacune bornée par la deadline résiduelle (jamais de rafale hors budget) ; erreur API ou budget épuisé interrompt et rend les choix déjà collectés.gen.callscompte les tentatives de POST (erreur API et échec de transport compris) — c'est un compteur de tentatives, pas une mesure du trafic réellement parti sur le réseau."claude"deexternal_parser.post_process_output:.split("lean")[-1].split("```")[0].split("\n")[1]— tronque toute sortie à une ligne. La preuve entière brute mesurée fait 7 lignes (fence comprise) ; le banc du 12/10 n'en recevait qu'une. La branchedeepseekdu même parser garde la preuve complète — bug copy-paste upstream._extract_whole_proof(module) : dés-enveloppe le bloc fence, préserve le multi-ligne — sémantique de la branche deepseek, appliquée au shim sans toucher au package.<think>avant la fence<think>...</think>avant la fence — le correctif 2 ne regardait que le début de chaîne et rendait le bloc entier aucheck_compile(échec de parse de transport, pas un verdict d'organe)._extract_whole_proofretire d'abord les blocs think (regex DOTALL), puis prend le dernier bloc fence.Corrections de review (deux passes, deux têtes)
Passe 1 — crible de l'adjoint sur
23ce570697(commit990179f6948). Trois défauts, tous reproduits puis corrigés :_extract_whole_proofcontredisait sa docstring : une fence fermée suivie d'une phrase finale, et deux blocs successifs, rendaient le mauvais texte.gen.callssortait avant l'incrément sur réponse en erreur, et ne comptait pas l'échec de transport.results_20261020b/n'existait nulle part (§ Provenance ci-dessus).Passe 2 — vérification indépendante de
990179f6948(commit20ba1bb2fc4). Deux régressions résiduelles du parser, reproduites avant correctif :lean4rflsuivi de la ligne de clôture rendue dans la preuverflhave s := "```"have s := "have s := "```"\n exact rflCause : la reconnaissance des fences se faisait par regex sur le texte brut. Une étiquette autre que
leann'était pas reconnue (donc la ligne de clôture entrait dans la preuve), et les backticks d'une chaîne Lean étaient pris pour une clôture. Désormais les délimiteurs se lisent par ligne : ouverture = ligne dont la forme décapée commence par trois backticks (étiquette libre), fermeture = ligne faite de backticks, au moins aussi longue que l'ouvreur (passe 3, tête9c36f9c105: un ouvreur à quatre backticks n'était fermé que par une ligne exactement « ``` », et la clôture entrait dans la preuve). Un backtick en milieu de ligne n'est plus jamais une clôture. La borne de prose surgen.calls(tentatives, pas trafic) est écrite dans les deux commentaires ; le comportement est inchangé.Validation
python -m pytest scripts/tests/test_leandojo_v2_bench.py— 36 passed à la tête9c36f9c105(28 avant la passe 1, 32 après, +2 tests de régression passe 2, +2 passe 3 — fence de quatre backticks, avec et sans backticks de chaîne interne), re-mesuré le 2026-10-23 :nchoix parnrequêtes, jamais"n": kdans le payload, s'arrête net sur budget épuisé (budget_hit) ou erreur API mid-emulation (choix collectés rendus,budget_hitfaux) ;_extract_whole_proof: bloc fence fermé / non terminé / sortie nue / bloc think retiré (avec et sans fence) / fence suivie d'une phrase / deux blocs successifs / étiquetteslean4,Lean/ backticks dans une chaîne Lean / fence de quatre backticks close par quatre backticks, avec et sans backticks de chaîne interne (passe 3).990179f6948rend les deux sorties de la colonne « Avant » ci-dessus, la tête courante rend la colonne « Après ». Aucun run LLM n'a servi à prouver le parser.test_no_secrets_in_sourceintact).scripts/results/leandojo_v2_bench_rung52_2026-10-23.json.Doc
docs/lean/18430-volet-b-leandojo-v2-bench.md§5 « Transport corrigé (2026-10-20) » : tableau des trois défauts + sous-section « Run corrigé ». Le pointeur versresults_20261020*/est remplacé par la provenance réelle (commentaire #1453 6300672049) et par l'agrégé committé du 2026-10-23, avec la commande de reproduction au §6.See #18430 (volet B — run comparatif sur #1453 à la sortie du run corrigé). See #1453.
🤖 Generated with Claude Code