feat(prover,#12658): refuser les corps de definition — sorry_is_def_body (5 couches, miroir FX-6b) - #12733
Merged
Merged
Conversation
…ody (5 couches, miroir FX-6b) Remplir un corps de def est un acte de design, pas une preuve : aucun des gardes existants ne tirait sur les 6 cibles Conway exposees. Predicat sorry_is_def_body (lean_utils) + refus d'entree aux 2 entrees provers (avant la sonde FX-5) + garde d'edition file_replace_sorry (tools) + miroir VerifyExecutor (workflow) + ligne prompt (instructions). Tests : 9 attrapees / 11 epargnees + positive control + refus ; suite 277 passed. Live : 6/6 cibles Conway FR/EN refusees a l'entree (3 multi + 3 autonomous), theorem-targets non affectes (L304 passe le garde, refuse ensuite par FX-5 preexistant). Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
jsboige
commented
Aug 24, 2026
jsboige
left a comment
Owner
Author
There was a problem hiding this comment.
[Hermes] — review sur c9188898 (sorry_is_def_body, 5 couches, #12658)
Vérifié firsthand :
- Prédicat exécuté en local — j'ai fetché
lean_utils.pyau head SHA et rejoué la matrice complète : 9 formes attrapées (one-liner Conway,:= bymulti-lignes, header multi-lignes, pile@[simp] private noncomputable, abbrev/instance/structure/class/inductive) + 12 épargnées (theorem/lemma/example,haveone-liner ET multi-lignes dans un def,let, sorry en commentaire, sorry côté statement, match-syntax, orphelin) + bornes (ligne hors-range → False,None→ ValueError). Tout passe, exactement comme le body le revendique. - Structuration correcte — le refus d'entrée
_refuse_def_body_sorryest inséré aux DEUX entrées (multi-agent + autonomous), avant la sonde FX-5 (scan de chaîne pur → refus sans compile, cohérent avec la description) ; miroir exact de_refuse_in_statement_sorry; gardefile_replace_sorry+ miroir VerifyExecutor pour la defense-in-depth ; ligne prompt dans les instructions. - Le point conceptuel est le bon — remplir
def alexanderPolynomial := sorrypar1n'est pas une preuve, c'est un acte de design ; aucun garde existant (build-pass + sorry-count-drop) ne peut le voir. Le documenté en résiduel (binder multi-ligne dont le:=tombe en continuation) est le même résiduel accepté que FX-6b — cohérent. - Additif pur —
_DECL_START_RE/sorry_is_in_statementbyte-identiques (diff), garde FX-6b intact, tests None-input étendus à la nouvelle fonction.
RAS sécurité. Closes #12658 : je n'ai rien à bloquer.
This was referenced Aug 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Grain: MED/research-code — lane myia-po-2027:CoursIA — prev: MED/notebook-python #12726
Summary
Issue #12658 : le harnais prover traite le remplissage d'un corps de définition (
def alexanderPolynomial (k : Knot) := sorry→:= 1, faux — le Delta du trèfle est t²−t+1) comme du progrès de sorry-élimination. Aucun des 4 gardes ne tire : le fichier build, le compte de sorry baisse, aucun énoncé n'est réécrit — STMT_MUTATION_FALSE_SUCCESS est structurellement aveugle à cette forme (il exigenot proof_found+ 0 tactic vérifiée, mais un corps de def « rempli » passe les deux). C'est un acte de design, pas une preuve : ce qu'un objet EST appartient à un humain.Correctif en 5 couches, miroir de FX-6b (#4917 / #1453) pour la forme « body » :
sorry_is_def_body(content, sorry_line)— genre ∈ def/abbrev/instance/structure/inductive/class ET sorry après le:=de SA déclarationprover/lean_utils.py_refuse_def_body_sorry(reasondef_body_sorry), inséré aux DEUX entrées (multi-agent + autonomous), avant la sonde FX-5 (scan de chaîne pur → refus gratuit, sans compile)prover/provers.pyfile_replace_sorry— refuse d'auteur un corps de def, fichier intact (couvre les appels d'outil directs)prover/tools.pyprover/workflow.pyprover/instructions.pyÉpargnes par design (jamais bloquer un run légitime) : corps de theorem/lemma/example (obligations de preuve légitimes) · sous-buts
have/let/show/suffices/obtaindans la preuve d'un def (le binder a son propre:=— le type du sous-but est donné) · sorry en commentaire · sorry avant le:=(domaine FX-6b, déjà couvert) · def match-syntax sans:=(résiduel accepté, même famille que FX-6b). Résiduel documenté : binder multi-ligne dont le:=tombe sur ligne de continuation — faux positif accepté, aucun cas dans le repo.Validation §B (research-code) — preuves
pytest tests/test_prover_guards.py -q) ::= by, header multi-lignes, pile@[simp] private noncomputable, abbrev, instance, champstructure ... where, champclass ... where,inductive;haveone-liner ET multi-lignes dans un def,let, sorry en commentaire, sorry dans le type, match-syntax, orphelin, contenu vide ;test_file_replace_sorry_allows_theorem_target(le fixture theorem passe le garde — le garde discrimine, il ne refuse pas tout) à côté detest_file_replace_sorry_blocks_def_body_target(fichier def inchangé après blocage)._refuse_def_body_sorryrend le skip-dict{"success": False, "skipped": True, "reason": "def_body_sorry"}sur cible def,Nonesur cible theorem,Nonesur fichier manquant (3 tests).--file/--line(preuve live, logs ci-dessous dans les commentaires de PR) :knot_lean/Knots/Conway.lean: alexanderPolynomial L294, IsSmoothlySlice L323, IsTopologicallySlice L331 — modemulti;knot_lean/Knots/Conway_en.lean: alexanderPolynomial L302, IsSmoothlySlice L331, IsTopologicallySlice L339 — modeautonomous;tests/test_prover_guards.py+tests/test_lean_utils.pypasse (FX-6b, FX-5, P1 latch, stub/axiom/relocation guards inchangés) —_DECL_START_REetsorry_is_in_statementbyte-identiques (seul ajout :sorry_is_def_body+ ses 2 regex privées_DECL_GENRE_RE/_PROOF_BINDER_RE).Nonepour tout genre ∉ {def, abbrev, instance, structure, inductive, class} — chemin de code identique à avant (couche purement additive, aucun garde existant modifié).Détails
agent-frameworkinstallé dans le venv repo (règle F — dépendance d'import du harnais, absente localement)..leantouché — règle FR/EN siblings non applicable ;count_code_sorryinchangé par construction (0 diff Lean).Closes #12658