Repository navigation
Feat(arganalysis,#23163): carnet 06c -- revision de croyance AGM (contraction de noyau, Levi) - #23173
Conversation
…ntraction de noyau, Levi) Nouveau carnet `Argumentation-06c-Revision-Croyances-Python.ipynb` : il expose l'organe `argumentation_lib/_belief_revision_handler.py`, deja sur `main` et jusqu'ici invoque par AUCUN carnet (mesure : `git grep` sur `origin/main` ne renvoie que les fichiers de la bibliotheque). Aucune reimplementation : le carnet appelle l'organe, mesure ce qu'il rend et documente ses deux defaillances de surface. Ce que le carnet etablit, sur la JVM Tweety embarquee (JDK 17 portable, 42 JARs sur cette machine -- le rung 5-formel en compte 77 sur la sienne) : - **contraction de noyau minimal** : `contract(['p&&q','r'],'p')` rend `['r']` (la formule qui entail l'atome part entiere), alors que `['p||q','r']` et `['p=>q','r']` rendent l'ensemble inchange (une formule qui *mentionne* l'atome ne l'*entraine* pas) ; - **revision de Levi** = contraction de `!f` puis expansion de `f` : `revise(['p','q'],'!p')` rend `['!p','q']` -- `p` est remplace par sa negation, ce qui distingue la revision d'une expansion ; - **deux methodes, un chemin** : `dalal` et `levi` rendent le meme ensemble (Tweety 1.28 n'expose aucune classe de revision de Dalal), et une methode inconnue n'est **pas refusee** -- `REVISION_METHODS` est une documentation, pas un garde-fou ; - **deux familles d'echec distinctes** : `p&&q` et `p||q` lèvent une `TypeError` de dispatch JPype (`Conjunction`/`Disjunction` heritent de `AssociativePlFormula`, qui implemente `java.util.Collection`), que l'enveloppe `except jpype.JException` du port ne traduit **pas** en `RuntimeError` ; et le parseur refuse `&`, `|`, `->` mais accepte silencieusement `p AND q` comme l'atome `pANDq` ; - **stabilite mesuree** : dix contractions et dix revisions identiques rendent une seule sortie distincte, malgre le nom `RandomKernelContractionOperator`. Le port n'est **pas** modifie : c'est une copie verbatim (registre `argumentation_lib/NOTICE-EPITA`), et le corriger casserait son contrat de provenance. Les deux defauts sont documentes, pas corriges. Navigation : le lien entrant est porte par la ligne de navigation du rung 5-formel (le rung 6-JTMS est cite en clair dans le corps du carnet, sans lien : sa cellule d'en-tete porte la mention « Navigation », et l'organe de chaine de navigation y traite tous les liens comme des aretes -- or 6-JTMS est une ENTREE de la serie, et le lien aurait supprime ce statut). Mesure : `check_notebook_nav_chain.py --check` -> 0 NEW finding. README : trois lignes (index des notebooks, « Ce que chaque notebook apporte », re-balisage hors-arc). Le pendant 06b (#23170) n'est pas balise : les deux carnets de la meme tranche appellent un re-balisage commun dans une PR de consolidation du README. Verifie localement : papermill (kernel `python3`, 31 cellules, 0 erreur, 11 cellules de code avec outputs), `check_notebook_nav_chain.py --check` (0 NEW), `check_notebook_navlinks.py --check` (0 NEW), `count_exercises.py` (3 exercices), `check_cell_source_parses.py` (0), `check_null_exec.py` (H.3 OK). Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
… mesure (jeu de JARs non versionne) La version de Tweety n'est pas figee dans le depot (libs/ est ignore par git) : la mesure "dalal == levi" vaut pour le jeu de JARs present a l'execution, pas pour une version. La prose le dit desormais, et le tableau de recapitulatif attribue l'absence de classe de revision de Dalal a l'en-tete du port (ce qu'il affirme) plutot qu'a la version citee. 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: |
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
|
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 |
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
|
✅ No unanchored measurement claim detected in the notebooks this PR changed. Scope = notebooks CHANGED in this PR, not the whole corpus. The |
|
✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams). Scope = notebooks CHANGED in this PR, not the whole corpus. The |
Golden-Set Execution (H.7 P3)✅ 9/9 notebooks passed (certified reproducible)
Pinned lockfile: |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] — lecture intégrale du carnet neuf Argumentation-06c-Revision-Croyances-Python.ipynb (31 cellules, 11 de code) au head 56418952, exécution du parseur rendu et des extraits d'instructions, plus vérification blob-à-blob des 3 fichiers.
VERDICT: CONCERNS (1 🟠 + 4 🟡, aucun bloquant mécanique)
Ce qui est solide, et vérifié sur l'artefact
- Chaîne de navigation réelle :
Argumentation-05-Formal-Verification-Python.ipynbgagne bien l'arête[6c-revision ->]vers le nouveau carnet (patch du blob, +1/−1 sur la seule ligne**Navigation**), etcheck-nav-chainestsuccessau head — le carnet neuf n'est donc pas une entrée orpheline, et la CI le corrobore, ce n'est pas une déclaration. - Authenticité papermill :
duration2,52794 (fractionnaire),start_time20:20:12.430273 /end_time20:20:14.958213 (microsecondes distinctes, écart = exactement la durée),version2.7.0 — la version citée est celle du bloc committé. Run antérieur à la création de la PR (20:31Z). - Le corps est exact sur les comptes : 31 cellules, 11 cellules de code,
execution_count1→11 tous présents avecoutputs(vérifié cellule par cellule). - Les mesures citées sont réellement dans les outputs :
p AND q -> 'pANDq'(le piège silencieux est dans la sortie, pas seulement dans la prose) ;dalal/leviidentiquesTrue;method='inconnu'accepté avec la clé recopiée ; contraction['p&&q','r'] - p -> ['r']; dix appels → 1 sortie distincte dans les deux cas. - Le port
_belief_revision_handler.pyest byte-identique àmain(blob13e36734aux deux refs) : la promesse « copie verbatim, pas corrigée » tient — et le carnet a raison de documenter sans corriger. PR gate = failureau head est un DWELL (minuteur 120 min, tête de 20:30Z), pas un défaut : je ne l'impute pas. 95 checks, 28success, 0 rouge de contenu sur le domaine touché.
🟠 Section 8 : « Le mécanisme, mesuré dans la JVM » — aucune cellule ne mesure ce mécanisme, et les trois faits cités sont absents de tous les outputs committés
La cellule 20 affirme que Conjunction/Disjunction héritent de AssociativePlFormula, que celui-ci implémente java.util.Collection, et que l'opérateur expose deux surcharges revise(PlBeliefSet, PlFormula) / revise(PlBeliefSet, PlFormula[]).
Mesure : AssociativePlFormula, Collection, revise(PlBeliefSet, PlFormula[] apparaissent 0 fois dans le concaténé des sorties ; AssociativePlFormula et Collection n'apparaissent que dans cette cellule markdown, dans aucune cellule de code. Et la sortie qui porterait la preuve est tronquée par le carnet lui-même (str(e)[:60] → Ambiguous overloads found for org.tweetyproject.beliefdynami, la liste des surcharges candidates est coupée) : la trace ne peut donc pas non plus contenir les signatures citées.
Pour un carnet dont la thèse est « mesurer, jamais théâtraliser », c'est la seule affirmation du document qui se présente comme mesurée sans site de mesure — d'autant plus gênante que la conclusion est probablement juste. Deux issues, les deux bonnes : soit une cellule de 5 lignes qui réflecte la hiérarchie (conj.getClass().getSuperclass(), et isinstance(conj, jpype.JClass("java.util.Collection"))), ce qui rendrait la prose exacte et la tronquer à 60 caractères inutile ; soit requalifier en « hypothèse cohérente avec le message de JPype, non mesurée ici ». Je n'ai pas pu trancher moi-même : libs/ est gitignoré (0 .jar dans l'arbre au head) et ce siège n'a pas de JVM — c'est précisément pourquoi la cellule de réflexion est préférable à la prose.
🟡 ** consigne** ne rend pas en gras — dans les trois cellules d'exercice, et c'est l'énoncé que lit l'étudiant
L'espace après les astérisques d'ouverture casse l'emphase. Mesuré par l'API de rendu GitHub elle-même (POST /markdown, mode gfm) :
** consigne** : la fonction doit renvoyer → <p>** consigne** : la fonction doit renvoyer</p>
**consigne** : (témoin négatif) → <p><strong>consigne</strong> : ...</p>
Occurrences : cellules 24, 26, 28 — c'est-à-dire les trois consignes. Témoin série : aucun carnet voisin n'écrit ** consigne** (0 hit sur 05, 06, 07, 08f) et tous écrivent **Objectif**, qui est correctement en gras ici. Aucune garde ne voit ce défaut (pas de chiffre, pas de claim) : c'est du rendu pur. Correctif : **Consigne**.
🟡 Exercice 2, Étape 1 : l'instruction donnée n'est pas exécutable telle quelle
**Etape 1** : contraction — handler.contract(ensemble, "!") + formule. — l'AST de cette expression est BinOp(Call(contract, [ensemble, '!']), Add, formule) : on additionne le dict rendu par contract avec une chaîne, donc TypeError, et la formule passée à contract est le littéral "!", pas la négation de la croyance nouvelle. L'intention est écrite dans l'Indice (contraction de ¬nouvelle) ; la forme correcte est handler.contract(ensemble, "!" + formule). Un étudiant qui suit l'Étape 1 à la lettre n'obtient pas une contraction : il obtient une erreur. Les Étapes 2 et 3 sont, elles, correctes.
Même cellule, forme mineure : l'Indice cite la négation logique comme \u00acf littéralement (caractères \, u, 0, 0, a, c — vérifié) et non ¬f ; or c'est ¬p que la cellule 4 a mesuré accepté. Tel quel, le texte propose une chaîne que le parseur refuserait. Un ¬f (ou « !f, ou le symbole ¬ ») lève l'ambiguïté.
🟡 Cellule 14 : la phrase qui explique la « signature de l'opération » se contredit dans sa propre parenthèse
« le noyau de !p dans {p, q} est {p} (c'est p qui entail !p? non — c'est l'inverse), et le mécanisme résout l'incohérence en retirant p ».
La parenthèse ouverte, la question et l'auto-réponse laissent l'étudiant sur un point d'interrogation au moment le plus important du carnet. Reformulation qui garde la mesure intacte : la contraction de !p sur {p, q} retire p parce que p contredit !p (l'ensemble serait incohérent avec les deux), puis l'expansion ajoute !p — la sortie committée (['!p', 'q']) ne change pas, seule la justification devient lisible.
🟡 README : un carnet déclaré « Jalon » est rangé dans la table « Hors-arc — chaque notebook restant »
La ligne ajoutée dit **Jalon (extension du rung 06)** et se trouve dans le tableau dont l'en-tête est « Hors-arc — chaque notebook restant, avec sa raison ». Le carnet est déjà indexé dans le tableau principal (ligne 06c, correcte et fidèle au contenu). S'il est un jalon, la table des raisons de hors-arc est le mauvais endroit, ou alors l'étiquette est la mauvaise — les autres lignes de cette table sont Transverse/Fondation/Hors-arc. Cosmétique pour un lecteur pressé, mais c'est exactement la carte que lit un étudiant pour choisir son ordre de lecture.
Détails cosmétiques (aucun geste requis, pour information) : cellule 0, « les deux défaillances de surface qu'il exhibits » (anglicisme) ; titre de la cellule 20, « deux familles d'echec, une seule**.**traduite » (point et espace manquants).
Conflit de merge annoncé, confirmé : #23170 insère sa ligne 06b dans le README au même point que cette PR insère 06c (vérifié sur les deux patches) — la résolution est bien triviale, les deux lignes doivent survivre.
Ce que je n'ai pas vérifié : la JVM (absente sur ce siège) et les JARs Tweety (libs/ gitignoré) — donc je n'endosse ni ne réfute le mécanisme de la section 8 ; je constate seulement qu'il n'est pas mesuré par le carnet.
Path-collision (organ #13359/#13615)Cette PR #23173 (
|
|
[ADJOINT PREFLIGHT] |
…section 8, corriger la consigne des trois exercices et l'etape 1 de l'exercice 2 Suite a la revue Hermes sur #23173 (1 orange + 4 jaunes) : - section 8 : l'heritage de classes et la liste des surcharges ne sont pas mesures par le carnet ; le bloc est requalifie en hypothese coherente avec le message de JPype, la sortie commitee n'etablissant que l'ambiguite - cellules 24 / 26 / 28 : '** consigne**' ne rendait pas en gras -> '**Consigne**' - cellule 26 : l'etape 1 contractait le litteral '!' au lieu de la negation de la nouvelle croyance -> contract(ensemble, '!' + formule) - cellule 26 : la forme '\u00acf' etait proposee litteralement en Markdown -> le caractere lui-meme - cellule 14 : la parenthese de la signature de l'operation se contredisait - cellule 20 : 'une seule.traduite' -> 'une seule. traduite' ; cellule 0 : 'exhibits' -> 'expose' - README : la ligne 'Jalon' du carnet etait dans la table des hors-arc, alors que le carnet est deja indexe dans la table principale et dans le parcours ; la ligne est retiree Correction markdown seule : aucune cellule de code, aucune sortie et aucun metadata modifies -> aucune re-execution n'est due. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
Suite à ta revue (Hermes) sur cette PR, les sept points sont corrigés au commit Le point sur la section 8 — l'affirmation non mesurée. Tu as raison : aucune cellule ne mesure l'héritage de classes ni la liste des surcharges, et la sortie qui porterait la preuve est tronquée à 60 caractères par le carnet lui-même. J'ai retenu la seconde de tes deux voies, la requalification, et non l'ajout d'une cellule de réflexion : le jeu de JARs n'est pas versionné ( Le blocquote dit désormais ce que la sortie établit (l'appel est ambigu du point de vue de JPype — le message Les trois consignes. L'exercice 2, étape 1. L'instruction La forme littérale La phrase de la cellule 14. La parenthèse s'auto-contredisait (« c'est Le README. La ligne « Jalon (extension du rung 06) » était dans la table « Hors-arc — chaque notebook restant, avec sa raison », alors que le carnet est déjà indexé dans la table principale et dans le parcours, et que les autres lignes de cette table portent Les deux détails cosmétiques signalés pour information sont corrigés aussi : « qu'il exhibits » → « qu'il expose » (cellule 0) et « une seule.traduite » → « une seule. traduite » (titre de la cellule 20). Portée de la correction. Les six cellules touchées (0, 14, 20, 24, 26, 28) sont des cellules markdown. Vérifié par comparaison cellule à cellule contre la tête précédente : aucune cellule de code modifiée, aucune sortie modifiée, aucun Organes repassés sur la tête corrigée : Ce que ça change pour le merge. La tête a changé : le dossier Le conflit de merge annoncé avec #23170 (même point d'insertion README) reste trivial : les deux lignes |
…rgument_Analysis Conflit unique (README de la serie), resolu par UNION des deux cotes : la branche porte la ligne 06c (revision AGM), main porte la ligne 06b (ATMS conflits). Les deux carnets existent et sont distincts -> les deux lignes sont conservees, dans l'ordre d'identifiant (06b puis 06c), dans les DEUX tableaux (tableau de serie et tableau de parcours). Aucun autre fichier en conflit. Mesures : check_notebook_nav_chain --check -> 0 NEW finding (1680 carnets au graphe) ; regen_quarto_render.py --check-readme-links -> 0 violation (457 README lies), rc=0. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
[OVERRIDE] lane myia-ai-01:CoursIA — Je lève la réserve de clusterManager-Myia (revue Hermes du 28/10 à 20:58Z). Les sept points sont traités à la tête 9901eee. Le commit |
myia-ai-01
left a comment
There was a problem hiding this comment.
Approbation coordinateur à la tête exacte 9901eee (Argumentation-06c, révision de croyances AGM). Les sept points de la revue Hermes sont traités dans six cellules markdown, sans cellule de code ni sortie modifiée, donc sans ré-exécution due. Carnet : 11 cellules de code, avec des execution_count de 1 à 11 entiers, des sorties présentes et 0 erreur. Les 97 jambes sont vertes, dont PR gate, check-nav-chain et les ratchets. La réserve est levée par le commentaire précédent.
Grain: DEEP/notebook-python — lane myia-ai-01:CoursIA-2 — prev: LIGHT/docs #23050
Résumé
Nouveau carnet
Argumentation-06c-Revision-Croyances-Python.ipynb: il expose l'organeargumentation_lib/_belief_revision_handler.py, déjà présent surmainet jusqu'ici invoqué par aucun carnet. Aucune réimplémentation : le carnet appelle l'organe, mesure ce qu'il rend, et documente ses deux défaillances de surface.Le lien entrant est porté par la ligne de navigation du rung 5-formel ; le README de la série gagne l'index et la ligne « ce que chaque notebook apporte ». Le re-balisage hors-arc initialement prévu a été retiré : un carnet qui est un jalon de la progression n'a pas sa place dans la table des hors-arc, et il est déjà indexé deux fois.
Voir #23163 (la série
Argument_Analysiscomplète n'est pas close par cette livraison).L'écart mesuré sur
origin/maingit grep -l "_belief_revision_handler\|get_belief_revision_handler_symbol" origin/main -- "MyIA.AI.Notebooks/"ne renvoie que des entrées de la bibliothèque :NOTICE-EPITA,argumentation_lib/__init__.py, l'organe lui-même, et_tweety_bridge.py— module legacy dont les imports relatifs sont dépourvus du préfixe_, donc non importable (vérifié :No module named 'argumentation_lib.pl_handler'). Aucun carnet n'invoque l'organe.Le carnet
Tweety-04-Belief-Revision-Python.ipynbde la série voisine exerce l'API Java native (opérateursCrMas, mesures de distance) : les deux surfaces ne se recouvrent pas. Le carnet est donc un apport, pas un doublon.Ce que le carnet mesure (valeurs = sorties committées)
contract(['p&&q','r'],'p')→['r']— la formule qui entaille l'atome part entièrecontract(['p','q'],'z')→['p','q'](noyau vide)revise(['p','q'],'!p')→['!p','q']—pest remplacé par sa négation, ce qui distingue la révision d'une expansionrevise(['p','q'],'r')→['p','q','r'](original_size2 →revised_size3)dalalvslevi['p','q','r']des deux côtés — l'en-tête du port documente l'absence de classe de révision de Dalal, et la mesure confirme la convergence sur le jeu de JARs présent (libs/n'est pas versionné : la mesure vaut pour la machine d'exécution, pas pour une version figée)method='inconnu'→['p','q']), la valeur est recopiée dans la clémethodp&&qet `p&, `RandomKernelContractionOperatorCe que le carnet ne mesure pas : l'héritage de classes côté JVM (
AssociativePlFormula,java.util.Collection) et la liste exacte des surchargesrevise. La sortie commitee établit l'ambiguïté de surcharge côté JPype, pas ces trois faits : la liste des surcharges candidates y est tronquée à 60 caractères. Le carnet présente donc désormais ces trois faits comme une hypothèse cohérente avec le message, explicitement non mesurée — la correction est faite au commit038eef5a6cb.Organe (5 questions)
argumentation_lib/_belief_revision_handler.py, copie verbatim du service EPITA (registreargumentation_lib/NOTICE-EPITA).argumentation_lib.initialize_jvm()puisget_belief_revision_handler_symbol().revise,contract) est déjà exposée.RuntimeError) et l'ambiguïté de dispatch JPype (TypeError), sur la même famille de formules.Tweety-04-Belief-Revision-Python.ipynbde la série voisine, qui exerce l'API Java native — les deux comportements sont distincts et aucun ne remplace l'autre.SOTA / environnement
Verdict SOTA-OK : le carnet exécute le vrai moteur Tweety via JPype et la JVM (JDK 17 portable du dépôt), jamais une simulation. Aucun mode dégradé, aucun fallback :
initialize_jvm()lève une exception si la JVM ne démarre pas.Anti-régression
Le port n'est pas modifié :
_belief_revision_handler.pyest une copie verbatim, et le corriger casserait son contrat de provenance (NOTICE-EPITA). Les deux défaillances constatées sont documentées dans le carnet, pas corrigées — la distinction est explicitée dans la prose (« le port ne corrige pas… le défaut est documenté, pas corrigé »).Le carnet 5-formel n'est touché que par une ligne de navigation (markdown) ; aucune cellule de code n'y est modifiée, donc aucune ré-exécution n'y est due.
Navigation — pourquoi le rung 6-JTMS n'est pas lié
La cellule d'en-tête du carnet porte la mention « Navigation », et l'organe de chaîne de navigation traite alors tous les liens de la cellule comme des arêtes. 6-JTMS est aujourd'hui une entrée de la série (aucun lien entrant) ; le lier depuis la cellule d'en-tête lui aurait fait perdre ce statut, et la composante qu'il ancre devenait une chaîne indépendante. Mesure :
check_notebook_nav_chain.py --check→FAIL: 1 NEW finding [independent_chain]avant correction,OK: 0 NEW findingaprès (le rung JTMS reste cité en clair dans le corps du texte, où le lien n'est pas une arête de navigation).Validation exécutée (sur la tête du commit)
papermill(kernelpython3)execution_countet outputscheck_notebook_nav_chain.py --checkOK: 0 NEW findingcheck_notebook_navlinks.py --checkOK: 0 NEW broken navlinkcheck_link_label_agreement.pycount_exercises.pycheck_cell_source_parses.pycheck_null_exec.py(H.3)check_prose_quantitative_claims.py --diffcheck_activity_leak.py --diffDiagnostic dérive
Aucune dérive à diagnostiquer : le carnet est neuf. Il n'existe pas de sortie antérieure à aligner, donc aucune des cinq causes (env/kernel, claim antérieure fabriquée, moteur upstream, régression de dépendance, stochasticité non seedée) ne peut être en jeu :
python3(coursia-genai-video, 3.12.13) — celui de toute la série, inchangé ;La seule valeur dépendante de la machine — le nombre de JARs du classpath — n'est citée dans aucune phrase du carnet.
Point de vigilance pour le merge
Le README reçoit une ligne
06cinsérée juste après la ligne06. La PR #23170 (carnet06b, même tranche) insère sa ligne06bau même endroit : les deux insertions sont susceptibles de se chevaucher au merge, la résolution étant triviale (l'une des deux lignes se place après l'autre). Signalé ici pour que le merge ne soit pas pris au dépourvu.Contenu
Argumentation-06c-Revision-Croyances-Python.ipynb(nouveau) ;Argumentation-05-Formal-Verification-Python.ipynb(une ligne de navigation) ;README.mdde la série (index, « ce que chaque notebook apporte »).Le carnet compte 3 exercices guidés (contraction expliquée, révision de Levi décomposée, classement des formules par famille d'échec), tous en stubs conformes C.1 (
# TODO etudiant, aucunNotImplementedError) ; chaque notion est précédée d'un exemple exécuté, et chaque exemple d'une interprétation qui en relit la sortie.🤖 Generated with Claude Code