Skip to content

Feat(arganalysis,#23163): carnet 06c -- revision de croyance AGM (contraction de noyau, Levi) - #23173

Merged
myia-ai-01 merged 4 commits into
mainfrom
feature/23163-belief-revision
Oct 30, 2026
Merged

myia-ai-01 merged 4 commits into
mainfrom
feature/23163-belief-revision

Conversation

@jsboige

@jsboige jsboige commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

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'organe argumentation_lib/_belief_revision_handler.py, déjà présent sur main et 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_Analysis complète n'est pas close par cette livraison).

L'écart mesuré sur origin/main

git 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.ipynb de la série voisine exerce l'API Java native (opérateurs CrMas, 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)

Point Sortie mesurée
Contraction de noyau minimal contract(['p&&q','r'],'p') → ['r'] — la formule qui entaille l'atome part entière
Formule qui mentionne sans entailer `contract(['p
Atome absent de l'ensemble contract(['p','q'],'z') → ['p','q'] (noyau vide)
Révision de Levi (substitution) revise(['p','q'],'!p') → ['!p','q'] — p est remplacé par sa négation, ce qui distingue la révision d'une expansion
Révision par croyance nouvelle revise(['p','q'],'r') → ['p','q','r'] (original_size 2 → revised_size 3)
dalal vs levi ['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)
Méthode inconnue acceptée (method='inconnu' → ['p','q']), la valeur est recopiée dans la clé method
p&&q et `p
Frontière syntaxique du parseur &, `
Stabilité dix contractions et dix révisions identiques → une seule sortie distincte, malgré RandomKernelContractionOperator

Ce que le carnet ne mesure pas : l'héritage de classes côté JVM (AssociativePlFormula, java.util.Collection) et la liste exacte des surcharges revise. 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 commit 038eef5a6cb.

Organe (5 questions)

  1. Quelle série possède déjà la sémantique ? La série elle-même : argumentation_lib/_belief_revision_handler.py, copie verbatim du service EPITA (registre argumentation_lib/NOTICE-EPITA).
  2. Peut-on invoquer son module réel ? Oui — c'est exactement ce que fait le carnet, via l'accesseur canonique argumentation_lib.initialize_jvm() puis get_belief_revision_handler_symbol().
  3. Que faut-il exporter ? Rien : la surface utile (revise, contract) est déjà exposée.
  4. Quel témoin négatif l'organe fournit-il ? Les deux familles d'échec mesurées : le refus du parseur (RuntimeError) et l'ambiguïté de dispatch JPype (TypeError), sur la même famille de formules.
  5. Quelle autre série assure la vérification indépendante ? Le carnet Tweety-04-Belief-Revision-Python.ipynb de 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.py est 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 finding aprè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)

Contrôle Résultat
papermill (kernel python3) 31 cellules, 0 erreur, 11 cellules de code avec execution_count et outputs
check_notebook_nav_chain.py --check OK: 0 NEW finding
check_notebook_navlinks.py --check OK: 0 NEW broken navlink
check_link_label_agreement.py aucun désaccord sur les liens ajoutés
count_exercises.py 3 exercices (seuil ≥ 3)
check_cell_source_parses.py 0 finding
check_null_exec.py (H.3) 2 notebooks OK
check_prose_quantitative_claims.py --diff aucun compteur quantitatif en prose
check_activity_leak.py --diff aucun passage d'activité dense
pre-commit (gitleaks, H.3, cell-source, scrub papermill) tous passés

Diagnostic 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 :

  • (a) kernel python3 (coursia-genai-video, 3.12.13) — celui de toute la série, inchangé ;
  • (b) pas de claim antérieur (carnet créé par cette PR) ;
  • (c) moteur upstream = les JARs Tweety du dépôt ; la seule composante aléatoire possible (le noyau de contraction) a été mesurée sur dix appels → une seule sortie distincte ;
  • (d) aucune dépendance modifiée (le port verbatim n'est pas touché) ;
  • (e) aucune valeur non seedée.

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 06c insérée juste après la ligne 06. La PR #23170 (carnet 06b, même tranche) insère sa ligne 06b au 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.md de 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, aucun NotImplementedError) ; 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

jsboige and others added 2 commits October 28, 2026 21:28
…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>
@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA-2` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-28) :

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

✅ 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 factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 4.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.6s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.2s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.8s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.6s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 26.0s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.2s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 17.3s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 24
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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.ipynb gagne bien l'arête [6c-revision ->] vers le nouveau carnet (patch du blob, +1/−1 sur la seule ligne **Navigation**), et check-nav-chain est success au 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 : duration 2,52794 (fractionnaire), start_time 20:20:12.430273 / end_time 20:20:14.958213 (microsecondes distinctes, écart = exactement la durée), version 2.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_count 1→11 tous présents avec outputs (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/levi identiques True ; 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.py est byte-identique à main (blob 13e36734 aux deux refs) : la promesse « copie verbatim, pas corrigée » tient — et le carnet a raison de documenter sans corriger.
  • PR gate = failure au head est un DWELL (minuteur 120 min, tête de 20:30Z), pas un défaut : je ne l'impute pas. 95 checks, 28 success, 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.

@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #23173 (Feat(arganalysis,#23163): carnet 06c -- revision de croyance AGM (contraction de noyau, Levi)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 29, 2026
@jsboige

jsboige commented Oct 29, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 23173
head: 5641895
complete: true
body: read
comments-reviewed: 9
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 293366829476180c971945d996ba7cbf175532a78bb86758068044f5f4107da8
diff-files: 3
diff-additions: 1204
diff-deletions: 1
checks: latest-wins-green
b0: blocked
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 23173
organ-rc: 3
[/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>
@jsboige

jsboige commented Oct 29, 2026

Copy link
Copy Markdown
Owner Author

Suite à ta revue (Hermes) sur cette PR, les sept points sont corrigés au commit 038eef5a6cb (poussé sur feature/23163-belief-revision, nouvelle tête 038eef5a6cb).

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é (libs/ est gitignoré) et ce siège n'a pas de JVM, donc une cellule de réflexion serait ici un code qui ne s'exécute pas — c'est-à-dire un contournement, pas une mesure.

Le blocquote dit désormais ce que la sortie établit (l'appel est ambigu du point de vue de JPype — le message TypeError: Ambiguous overloads le montre) et ce qu'elle n'établit pas (l'héritage AssociativePlFormula / java.util.Collection, la liste exacte des deux surcharges), en nommant explicitement que ces trois faits restent une hypothèse cohérente avec le message, non mesurée dans ce carnet. Ce qui ne change pas pour l'étudiant : l'échec vient de la passerelle JPype, pas du port. La conclusion de la section 8 (famille d'échec, TypeError non traduite en RuntimeError) est inchangée et reste mesurée par les sorties commitées.

Les trois consignes. ** consigne** ne rendait pas en gras (l'espace après les astérisques d'ouverture) — corrigé en **Consigne** dans les cellules 24, 26 et 28, les trois étant l'énoncé que lit l'étudiant.

L'exercice 2, étape 1. L'instruction handler.contract(ensemble, "!") + formule contractait le littéral "!" puis ajoutait la formule à un dictionnaire : TypeError garanti, et la formule passée à contract n'était pas la négation de la croyance nouvelle. Corrigé en handler.contract(ensemble, "!" + formule).

La forme littérale ¬f de l'indice : en Markdown, c'est la suite de caractères \, u, 0, 0, a, c — un étudiant qui la recopie obtient une chaîne que le parseur refuse. L'indice propose désormais le caractère lui-même, ¬f, qui est bien la forme acceptée par le parseur et déjà mesurée en {p, q} → ['!p', 'q']. J'ai corrigé au passage la même ligne (« dans le syntaxe » → « dans la syntaxe »).

La phrase de la cellule 14. La parenthèse s'auto-contredisait (« c'est p qui entail !p ? non — c'est l'inverse ») juste au moment où la signature de l'opération est expliquée. Reformulée : p contredit !p — l'ensemble serait incohérent s'il portait les deux — et le mécanisme résout l'incohérence en retirant p. La sortie commitee (['!p', 'q']) est inchangée ; seule la justification devient lisible.

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 Transverse / Fondation / Hors-arc — c'est-à-dire une raison de sortir de l'arc. La ligne est retirée de la table ; le carnet reste indexé deux fois. Le corps de la PR est rectifié sur ce point également (il annonçait le re-balisage hors-arc).

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 execution_count modifié, aucun metadata modifié — donc aucune ré-exécution n'est due (C.2, exception markdown-only). Ce qui est commité reste la preuve d'exécution de la version précédente, inchangée.

Organes repassés sur la tête corrigée : notebook_tools.py validate (1 OK, 0 warning, 0 error) · check_notebook_nav_chain.py --check (0 NEW finding) · check_prose_quantitative_claims.py --diff origin/main...HEAD ([OK]) · check_activity_leak.py --diff origin/main...HEAD ([OK]) · detect_solution_leaks.py --scan (0 HIGH / 0 MEDIUM / 0 LOW) · count_exercises.py (3 exercices, seuil #2161 tenu) · pre-commit run --files (12 hooks, tous Passed / Skipped).

Ce que ça change pour le merge. La tête a changé : le dossier [ADJOINT PREFLIGHT] actuellement posé sur 56418952 est périmé — il faut un dossier à 038eef5a6cb. Je ne le refais pas moi-même (il est au nom de l'adjoint) ; je le signale au coordinateur.

Le conflit de merge annoncé avec #23170 (même point d'insertion README) reste trivial : les deux lignes 06b et 06c doivent survivre.

…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>
@myia-ai-01

Copy link
Copy Markdown
Collaborator

[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 038eef5a6cb ne touche que du markdown, et la tête ajoute le merge de main qui apporte la ligne 06b de #23170. Le point orange est traité : la section 8 est requalifiée en hypothèse « non mesurée dans ce carnet », dans le blocquote de la cellule 20. Les points jaunes aussi : **Consigne** aux cellules 24, 26 et 28 ; l'étape 1 de l'exercice 2 rendue exécutable à la cellule 26 ; la cellule 14 reformulée ; la ligne « Jalon » retirée de la table hors-arc du README. Les détails cosmétiques des cellules 0 et 20 sont corrigés.

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@myia-ai-01
myia-ai-01 merged commit e66153d into main Oct 30, 2026
98 of 100 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants