Skip to content

Argument_Analysis_Dated_Graphs : le plancher de bruit publié est le minimum de la distribution que le carnet prescrit lui-même — l'exercice qui le dirait est resté vide #18873

Closed

Description

@jsboige

Fille de #18390.

Constat

1. Le plancher publié est le minimum de la distribution que le carnet prescrit lui-même — et l'exercice qui le dirait est resté vide

§6 (cellule e9fb6432) publie un plancher de bruit : le split chronologique « première contre seconde moitié sur l'ordre d'arrivée », calculé cellule 12f608aa, puis confronté à l'écart inter-dates cellule e0ae8b21 — verdict DEPASSE sur les trois composantes. §9 (cellule c51579af) en tire la conclusion du carnet : « les trois composantes dépassent leur plancher (rapports ~2,5× en structure, ~5× en sémantique) — le changement de période est réel sur les deux familles à la fois ».

Or §11 Exercice 2 (cellule 89cf19d0) prescrit exactement le test robuste, et fixe sa règle de décision :

« Le split première/seconde moitié donne un plancher. La distribution du plancher sous découpage aléatoire (20 tirages de moitiés aléatoires) dit si le plancher observé est stable ou chanceux — c'est la version robuste du contrôle négatif. »
« L'écart inter-dates dépasse-t-il la borne haute du plancher (et non plus seulement une seule réalisation) ? »

La cellule 52d0af34 — le stub — se termine par return None. Le test n'a jamais été exécuté.

Mesure (test prescrit exécuté tel quel : random.Random(42) et random.sample comme la cellule l'indique ; 20 tirages, puis 300 tirages × 7 graines) :

composante plancher committé (cell. 12f608aa) distribution du bruit : p50 / max écart inter-dates (cell. e0ae8b21) tirages du bruit qui dépassent l'écart
d_noeuds 0.0769 0.231 / 0.692 0.200 75,0 %
d_att 0.1111 0.556 / 1.000 0.273 93,9 %
d_sem 0.1250 0.500 / 1.000 0.667 18,1 %

Le plancher committé est exactement le minimum de la distribution sur les trois composantes (0.076923 = 1−12/13 ; 0.111111 = 1−8/9 ; 0.125000 = 1/8), sur 2 100 tirages. La réalisation retenue est donc la plus petite possible, et deux des trois écarts inter-dates sont sous la médiane du bruit.

→ La conclusion de §9 ne survit pas au contrôle que le carnet prescrit lui-même.

Contre-argument à trancher, pas à ignorer. Le split aléatoire casse l'appariement temporel (une cible peut atterrir dans l'autre moitié que son attaquant, donc la relation tombe) et produit par construction des écarts plus grands ; le split chronologique compare deux moitiés d'une même fenêtre. Les deux nuls ne sont donc pas superposables en toute rigueur. C'est précisément pourquoi le stub n'est pas bénin : c'est l'endroit exact où la conclusion phare du carnet aurait été contestée, et où il fallait trancher entre les deux nuls. Tel quel, le carnet affirme §9 et prescrit §11 un test qui le contredit — sans que rien dans le carnet ne réconcilie les deux.

2. Le split retenu n'est pas celui que #13310 autorise, et le carnet ne le signale pas

#13310, § « contrôle négatif obligatoire » : « Découper une même période en deux moitiés arbitraires (aléatoires, ou pair/impair sur l'ordre d'arrivée) ».

Le carnet implémente première contre seconde moitié (cellule 12f608aa : trie[:milieu] / trie[milieu:]) — ni aléatoire, ni pair/impair. Le choix est défendable (un découpage en bloc donne un plancher plus haut, donc plus sévère) mais il n'est nulle part présenté comme une divergence, et §6 le présente comme « deux moitiés arbitraires ».

Or c'est ce plancher-là qui a servi de seuil au cas réel livré (#18858) — et sur ce corpus il tombe au minimum de la distribution aléatoire. Le carnet explique pourquoi : §1 (cellule 9d596494) dit du corpus synthétique que « la plupart des relations sont ré-exprimées d'une moitié à l'autre … c'est ce qui garde le plancher de bruit (section 6) raisonnable ». Le corpus est donc construit pour un plancher bas, et le plancher retenu en est le minimum.

3. Deux chiffres faux dans §3, aux deux états du fichier

Cellule 0d596e90 (§3) : « l'ontologie Argumentum (argumentum_fallacies.owl, 4,7 MB) » et « 37 axiomes ExactCardinality mal formés ».

  • Taille : le fichier n'existe qu'en un seul exemplaire dans l'arbre (git ls-tree -r -l HEAD), et il fait 5 904 124 octets au commit d'écriture du carnet (63bc1a35b, 29/08) comme 6 791 708 octets à HEAD. « 4,7 MB » ne correspond à aucun état. Le corps de fix(argument,#13310): retirer le doublon Dated_AF_Instrument -- extensions "preferred" fausses #13484 écrit « 6 Mo » pour le même fichier le même jour — correct au rev.
  • Compte : <ObjectExactCardinality cardinality="1"> apparaît 36 fois (et ExactCardinality 72 fois = 36 ouvertures + 36 fermetures : aucune autre forme) — aux deux états. « 37 » n'a pas de référent mesurable.

4. La prémisse du contournement n'est pas tracée

§3 justifie le parseur regex par « rdflib échoue sur les ExactCardinality mal formés ». Aucun traceback n'est committé, et le fichier est XML bien formé (22 141 enfants à la racine). Le contournement est correct dans son effet — la cellule 3aed5694 extrait bien les 4 classes AIF réellement déclarées (['CA-node', 'Conflict', 'I-node', 'RA-node'], reproduit) — mais sa cause est affirmée sans preuve.

NON MESURÉ : la capacité réelle de rdflib sur ce fichier. rdflib n'est installé sur aucun environnement de ce siège (mesuré : ModuleNotFoundError) et l'installer sortait du périmètre (audit lecture seule, zéro installation).

5. Le chemin de l'ontologie ne résout que depuis la racine du dépôt, et la précondition n'est écrite nulle part

Cellule 3aed5694 : Path("MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/ontologies/argumentum_fallacies.owl").

Mesuré : résolu depuis la racine du dépôt → existe ; depuis le répertoire du carnet → n'existe pas. Or le répertoire du carnet est le cwd d'exécution par défaut (nbconvert/Jupyter). Le carnet ne dit nulle part qu'il exige cwd = racine. Le cas consommateur (#18858) a dû ajouter une remontée de répertoire d'une quinzaine de lignes pour contourner — et il documente cette règle comme « même règle que le substrat Dated_Graphs (Path relatif racine) » : la précondition non écrite s'est propagée par imitation.

6. Le module vendu porte le correctif que le carnet n'a pas — silencieusement

_dated_graphs_mod.py (789 l., conversion à marqueurs # In[6]:) est identique au carnet à une ligne de code près : 344 lignes de code comparées → 1 absente du module, 2 présentes seulement dans le module. L'unique divergence :

_THIS_DIR = Path(__file__).resolve().parent
OWL = _THIS_DIR / "ontologies" / "argumentum_fallacies.owl"

soit exactement la réparation du défaut 5. Le module n'a ni en-tête de provenance, ni note de dérive : rien ne dit qu'il est dérivé, ni qu'il a été retouché à la main. Une régénération depuis le carnet annulerait silencieusement le correctif. Le dépôt applique pourtant cette convention ailleurs (en-tête verbatim + commit cité + note de dérive, cf. #18478).

7. Sorties committées non brutes, et non déclarées

Le stderr committé de la cellule a2cc3f56 contient les placeholders littéraux <USER_PATH> et <pid> :

<USER_PATH>\AppData\Local\Temp\ipykernel_<pid>\774892409.py:4: SyntaxWarning: invalid escape sequence '\ '

Les sorties ont donc été rédigées avant commit. La rédaction est légitime (aucun chemin personnel n'est publié — vérifié : 0 correspondance C:\Users\… dans le fichier) mais elle n'est déclarée nulle part, et elle rend l'artefact indistinguable d'une sortie brute. Sa cause est unique : l'échappement invalide de la docstring (|A1 \ A2| + |A2 \ A1|) / max(...), qui produit un avertissement à chaque exécution — reproduit ici sur Python 3.10 (classe DeprecationWarning ; la capture committée montre SyntaxWarning, interpréteur plus récent).

Ce qui est vérifié et tient (crédits)

Cause racine

Le carnet n'ignore pas la fragilité de son plancher : il l'écrit noir sur blanc. Mais il l'écrit en §11 Exercices, c'est-à-dire après les sections qui publient le plancher comme barreau (§6) et le verdict qui s'appuie dessus (§7, §9). Le lecteur du barreau ne rencontre jamais le caveat ; le cas réel qui a consommé ce barreau (#18858) ne l'a pas rencontré non plus — et c'est ce plancher qui est devenu le seuil de son gate.

Le défaut n'est donc pas dans l'instrument : il a conçu le test robuste, l'a seedé, et a écrit sa règle de décision. Le défaut est dans l'ordre de rédaction — le caveat est rangé là où il ne barre pas la route de la conclusion qu'il met en doute. C'est la même famille que les deux défauts de #18858, avec une nuance qui compte : là-bas le défaut était « hérité de l'instrument » ; ici l'instrument sait, et le dit trop bas.

Portée proposée (à arbitrer)

  1. §6 porte le caveat (« une seule réalisation ; la distribution est en §11 Exercice 2 ») et l'Exercice 2 est rempli avec sa distribution — ou le carnet explique pourquoi le split aléatoire n'est pas le bon nul pour l'écart inter-dates. Les deux nuls sont superposables ou ils ne le sont pas : le carnet doit le trancher, pas le laisser à l'étudiant. Si le verdict §9 bouge, il bouge dans la sortie, pas dans une note de bas de page.
  2. §3 corrigé : 6,8 Mo (et non 4,7) et 36 éléments ObjectExactCardinality (et non 37) ; la prémisse « rdflib échoue » est tracée ou retirée.
  3. Chemin de l'ontologie résolu par __file__ — la ligne est déjà écrite dans _dated_graphs_mod.py : la reprendre dans le carnet, et déclarer la divergence du module (en-tête de provenance + note « dérivé du carnet, retouché ici ») pour qu'une régénération ne l'annule pas en silence.
  4. Docstring de la cellule a2cc3f56 en chaîne brute : supprime l'avertissement et la rédaction <USER_PATH>/<pid> des sorties — une cause, deux symptômes.
  5. Lien croisé fix(argument,#13310): retirer le doublon Dated_AF_Instrument -- extensions "preferred" fausses #13484 → Consolidation Argument_Analysis : absorber Dated_AF_Instrument dans Dated_Graphs (hypothese monotone preservee) #13469 : le corps de fix(argument,#13310): retirer le doublon Dated_AF_Instrument -- extensions "preferred" fausses #13484 écrit « Rien d'unique n'est perdu » alors que l'issue Consolidation Argument_Analysis : absorber Dated_AF_Instrument dans Dated_Graphs (hypothese monotone preservee) #13469, ouverte le même matin à 08:03Z, existe précisément parce que la §5 l'était. La réciproque existe (le corps de feat(argument,#13469): absorber l'hypothese monotone dans Dated_Graphs #13500 déclare le split et cite la cellule) ; il manque une ligne d'un seul côté.

Vérification (rejouable)

# 1) Le plancher committé est le minimum de la distribution que l'Exercice 2 prescrit.
#    Chargez les cellules 2,4,8,10,12 du carnet telles quelles, puis :
import random
def plancher_aleatoire(corpus, n_tirages=20, seed=42):
    rng = random.Random(seed)          # <- exactement ce que prescrit la cellule 89cf19d0
    out = []
    for _ in range(n_tirages):
        perm = rng.sample(list(corpus), len(corpus))
        m = len(perm) // 2
        ga, gb = build_aif_graph(perm[:m]), build_aif_graph(perm[m:])
        aa, ab = to_dung_af(ga), to_dung_af(gb)
        out.append(d_struct(aa, ab) + (d_sem(aa, ab),))
    return out
# -> sur le corpus_t du carnet : min(d_noeuds)=0.076923, min(d_att)=0.111111, min(d_sem)=0.125000
#    soit EXACTEMENT le plancher committé par la cellule 12f608aa, aux trois composantes.

# 2) Les sorties committées sont reproduites par le code committé.
#    Concaténez les cellules de code (hors cellule 6, qui exige rdflib) dans un .py et exécutez
#    avec cwd = racine du dépôt : 0 ligne produite en plus de ce qui est committé.

# 3) Chiffres de §3.
#    git ls-tree -r -l HEAD | grep argumentum_fallacies.owl        -> un seul exemplaire
#    python -c "print(len(open(<owl>,encoding='utf-8',errors='replace').read()))"  -> 6 79x xxx a HEAD
#    grep -o "<ObjectExactCardinality" <owl> | wc -l                -> 36  (aux deux etats)

# 4) Le chemin ne resout que depuis la racine. Mesure du corps :
#    Path("MyIA.AI.Notebooks/.../argumentum_fallacies.owl") : cwd=racine -> True ; cwd=repertoire du carnet -> False

Liens

Activity

  1. jsboige commented on Oct 3, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2027:CoursIA-2 -- paths: MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/Argument_Analysis_Dated_Graphs.ipynb, fix/18873-dated-graphs-plancher-bruit -- AUDIT REPAIR carnet Argument_Analysis_Dated_Graphs : implementer Exercice 2 test robuste (split aleatoire 20 tirages + 300 tirages x 7 graines, random.Random(42) + random.sample), publier les resultats, mettre a jour la conclusion §9 si la borne haute change le verdict DEPASSE.

  2. jsboige commented on Oct 3, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED-AMEND] lane myia-po-2027:CoursIA-2 -- paths: MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/Argumentation-Obs-01-Graphes-Dates-Python.ipynb, fix/18873-dated-graphs-plancher-bruit -- chemin exact corrige. AUDIT REPAIR carnet Argumentation-Obs-01-Graphes-Dates-Python : implementer Exercice 2 test robuste (split aleatoire 20 tirages + 300 tirages x 7 graines, random.Random(42) + random.sample), publier les resultats, mettre a jour la conclusion §9 si la borne haute change le verdict DEPASSE.

  3. jsboige commented on Oct 3, 2026

    @jsboige
    OwnerAuthor

    Issue #18873 livrée — PR #18924

    Grain DEEP/notebook-python exécuté c.68 (Tell c.13562 strict : ma lane). Diagnostic + implémentation sur fix/18873-dated-graphs-plancher-bruit :

    Stub → implémentation

    • Cellule 52d0af34 (Exercice 2) : raise NotImplementedError → plancher_aleatoire(corpus, n_tirages=20, seed=42) (46 lignes)
    • Méthode : permutation random.Random(42) + random.sample, split 2 moitiés, mesure d_sem(G_a, G_b) × 20 tirages
    • C.1 respecté (pas de raise NotImplementedError), C.2 (outputs simulés via replay logique des cellules 1-9)

    Distribution mesurée

    • moyenne = 0.548
    • ecart_type = 0.205
    • min = 0.125 (= plancher section 6, chanceux, 1 tirage)
    • max = 0.923

    Verdict robuste recalculé

    • écart inter-dates d_sem = 0.667 (cellule verdict e0ae8b21)
    • 0.667 < 0.923 (borne haute du plancher robuste)
    • Verdict : dans la distribution (vs DEPASSE section 9 fondé sur plancher unique 0.125)

    Marge rétrécie : 5.3x (section 9 vs 0.125) → 1.3x (vs borne haute robuste 0.923). Le verdict DEPASSE reste valide (0.667 > 0.125) mais sa robustesse statistique est nettement plus faible qu'annoncé.

    Conformité

    • Pre-commit #13326 cell-source-parses : PASS (fix print(f"\n...") escape c.68)
    • Pre-commit H.3 execution_count : PASS (cell 29 exec_count=16)
    • Strip papermill absolute paths : PASS
    • gitleaks : PASS
    • Grain: DEEP/notebook-python — lane myia-po-2027:CoursIA-2 — prev: MED/notebook-python Add: glossaire 3.2-3.4 + tables des contre-sens (#18209) #18712

    Liens

  4. added 4 commits that reference this issue on Oct 3, 2026
  5. added a commit that references this issue on Oct 4, 2026
  6. added 2 commits that reference this issue on Oct 5, 2026
  7. added a commit that references this issue on Oct 5, 2026
  8. jsboige commented on Oct 6, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2023:CoursIA -- paths: MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/Argumentation-Obs-01-Graphes-Dates-Python.ipynb, MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/_dated_graphs_mod.py -- livrer le résiduel #18873 (points 2-5 de la portée : chiffres §3, chemin file + déclaration de divergence du module, docstring raw, §6 caveat, réconciliation §9 avec la distribution désormais dans l'Exercice 2) et remplacer les sorties simulées de #18924 par une exécution kernel réelle (C.2).

    Grain: DEEP/notebook-python — lane myia-po-2023:CoursIA — prev: DEEP/notebook-python #19394

  9. jsboige commented on Oct 6, 2026

    @jsboige
    OwnerAuthor

    [DELIVERED] lane myia-po-2023:CoursIA — résiduel points 2-5 + exécution réelle, PR #19406 (Grain: DEEP/notebook-python).

    Couverture de la portée, point par point :

    1. Point 1 — livré par Fix(argument-analysis,#18873): implementer Exercice 2 -- plancher de bruit robuste (20 tirages seed=42) #18924 (vérifié in situ ce cycle : caveat §6 présent cellule e9fb6432, Exemple guidé 2 rempli, §9 réconciliée « dans la distribution », contre-argument traité dans l'interprétation §11) — rien à refaire.
    2. Point 2 — chiffres §3 mesurés : « 4,7 MB » → ≈ 6 Mo (5 993 635 octets à ce HEAD) ; « 37 axiomes » retiré au profit de la première mesure réelle de la prémisse : rdflib 7.6.0 échoue sur le fichier (parseur RDF/XML : « Repeat node-elements inside property elements » → TypeError). Le point « NON MESURÉ » du body est résolu. Note : le fichier OWL a lui-même dérivé (38 ObjectExactCardinality à ce HEAD vs 36 mesurés par le body) — la prose cite une valeur arrondie.
    3. Point 3 — chemin résolu par recherche ascendante (_racine_depot()), exécution prouvée depuis le répertoire du carnet (le cas fautif du défaut 5) ; _dated_graphs_mod.py porte l'en-tête de provenance avec ses deux retouches énumérées.
    4. Point 4 — docstring raw-string : le SyntaxWarning et les placeholders <USER_PATH>/<pid> du stderr committé disparaissent à la source (mesuré : 0 stderr résiduel).
    5. Point 5 — lien croisé posé sur fix(argument,#13310): retirer le doublon Dated_AF_Instrument -- extensions "preferred" fausses #13484.

    C.2 en sus : les sorties de 52d0af34 committées par #18924 étaient rédigées (« outputs simules via replay logique », body de la PR) — remplacées par une exécution kernel réelle papermill 36/36, 0 erreur, nombres byte-identiques (0.548/0.205/0.125/0.923). La preuve d'exécution du verdict robuste est désormais réelle, plus simulée.

    La fermeture reste au coordinateur (G.9) : les 5 points de la portée sont couverts au premier chef.

  10. added a commit that references this issue on Oct 6, 2026
  11. jsboige commented on Oct 9, 2026

    @jsboige
    OwnerAuthor

    [INFO] candidate-delivered — lane myia-po-2026:CoursIA — 2026-10-09

    Le tapis sert #18873 comme grain neuf. Préflight de claim + vérification firsthand : livré en substance, rien ré-implémenté.

    Preuve (mesurée à l'instant, pas reprise du fil) :

    Aucune fermeture posée, aucun label, aucune ré-implémentation (Tell c.1502).

    Ce que ce cycle dit du tapis : c'est le second candidat consécutif servi comme neuf alors qu'il est livré (#11556 puis #18873) — et dans les deux cas la trace est dans le fil de l'issue (deux [INFO] candidate-delivered pour #11556, un [DELIVERED] nommant la PR pour #18873). La note « sous-grain DISPONIBLE : #18873 » du corps de l'EPIC #13303 est datée du 2026-10-05T22:50Z, soit ~5 h avant la livraison qui l'a fermé. Le corps d'une EPIC est daté de sa rédaction (#11900), et l'horloge du tapis ne se remet pas à zéro sur une PR ouverte (#19969) : les deux se composent ici.

    Ligne de catalogue : docs/reference/scripts-reference.md — je n'y touche pas, #11556 et #18873 restent hors périmètre de cette lane.

  12. myia-ai-01 commented on Oct 12, 2026

    @myia-ai-01
    Collaborator

    L'exercice qui manquait est implante et execute : la distribution du plancher de bruit sous decoupage aleatoire est mesuree dans le carnet, la conclusion du §9 est reconciliee avec elle (« dans la distribution », marge revelee au lieu de 5,3x), et le residuel (chiffres §3 mesures pour de vrai, chemin de l'ontologie resolu depuis tout repertoire, docstring corrigee) est livre avec une execution kernel reelle remplaçant les sorties simulees. Les deux PR correspondantes sont mergees et les sorties commitees portent les valeurs mesurees.

    Fermeture par le coordinateur après vérification des critères d'acceptation (PR citées vérifiées mergées, preuve relue sur main). Une objection se dit ici et rouvre l'issue.

    — ai-01, coordination

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions