Skip to content

Audit #18390 — Ontology_CrossLinks : sorties exactes au 10/07, commitées le 24/09 contre une épingle du 25/09 (dé-curation #1247 non ré-exécutée) #18656

Description

@jsboige

Constat (mesuré sur le carnet Argument_Analysis_Ontology_CrossLinks.ipynb, 26 cellules, 11 de code — toutes avec sorties)

Le carnet caractérise la matrice crossLink du CSV canonique des Fallacies (104 colonnes, 1408 sophismes) : densité de cellules, couverture par sophisme, et le pont CSV ↔ OWL pour les deux couches AIF (types d'attaque, mappings SKOS Walton). 40 états du CSV ont été balayés (2026-06-05 → HEAD) pour dater chaque chiffre committé.

Résultat en une ligne : les cinq chiffres du carnet sont exacts — au bit près, CSV et OWL — pour un seul commit du submodule, 053257c7 (2026-07-10), et pour aucun autre. Or le carnet est entré au dépôt le 2026-09-24, et le submodule est épinglé au 2026-09-25.

Correction de périmètre (avant tout jugement)

Contrairement aux autres carnets audités dans cette série, le sujet n'est pas le tronc EPITA mais le submodule tiers Argumentum (ArgumentumGames/Argumentum, CSV canonique + OWL généré). L'absence de citations du tronc n'est donc pas un défaut ici — il n'y a rien à ancrer au tronc. Le critère d'audit pertinent est la reproductibilité contre l'état épinglé du submodule, et c'est sur ce critère que le carnet tombe.

Ce qui vérifie (mesuré, à créditer)

chiffre committé au carnet mesuré à 053257c7 (10/07) verdict
« 1553 lignes physiques » 1553 exact
crossLink : 1081 cellules / 11264 (1408 × 8 colonnes) 1081 exact (l'arithmétique 1408 × 8 = 11264 tient)
couverture : 844 / 1408 = 59,9 % 844 / 59,9 % exact
AIF attack (CSV & OWL) : 93 (undercut 61 / undermine 29 / rebut 3) CSV : 93 = 61/29/3 · OWL (<Literal> exacts) : 93 = 61/29/3 exact, et la double source CSV/OWV est réelle
AIF SKOS Walton (CSV & OWL) : 70 (broadMatch 57 / closeMatch 10 / narrowMatch 3) CSV : 70 = 57/10/3 · OWL : 70 = 57/10/3 exact, double source réelle

À créditer également :

  • Le critère de comptage est le bon : df[col].notna() & (df[col].astype(str).str.strip() != '') (cellule 12) — traite les cellules blanc-only comme vides. L'audit a utilisé le même critère et retrouve les mêmes chiffres.
  • La réconciliation CSV ↔ OWL n'était pas une assertion : aux deux états mesurés (10/07, 25/09), les compteurs exacts coïncident entre les deux sources — la méthode du carnet était saine au moment de son exécution.
  • Le carnet est daté en prose : « ⚠️ Mise à jour 2026-07-10 (Argumentum PR feat(qc): ESGF kit transitoire - 3 ML/Framework strategies #763) » — ce qui permet précisément à cet audit de dater le snapshot. Peu de carnets de la série offrent cette prise.

Le défaut : un snapshot du 10 juillet, commité le 24 septembre contre une épingle du 25

Le submodule a bougé trois fois sous les sorties committées :

couche état 10/07 (053257c7) mouvement état épingle 9e79e88 (25/09)
lignes physiques 1553 (cosmétique) 1546
crossLink 1081 cellules / 844 = 59,9 % 05/09 e5191816 (#1247/#1286) : dé-curation délibérée — 399 crossLinks siblings Mirrors/Inverts retirées (« restatent l'arbre »), corpus 1255 → 581, OWL régénéré ; 31/08–02/09 : passage éphémère à 1106 539 / 487 = 34,6 % (−50,2 % de cellules)
AIF attack 93 = 61/29/3 11–12/07 (5 commits) : 93 → 137 → 145 145 = 87/53/5 (CSV et OWL)
AIF SKOS 70 = 57/10/3 30/08 49ef5fad : 70 → 116 116 = 64/33/19 (CSV et OWL)

Et côté carnet :

Cause racine

Un artefact à sorties committées (légitime pédagogiquement — il montre le résultat attendu) a été produit contre un état de submodule non enregistré dans l'artefact, puis commité 81 jours plus tard, dans un commit au sujet sans rapport, sans ré-exécution contre l'état qui l'accompagne. Rien dans le carnet ne dit à l'étudiant contre quel état du submodule ses sorties ont été produites — la prose du 10/07 est la seule horloge, et elle est fausse par 81 jours au moment du commit.

C'est la même classe de défaut que #18435 (07c — snapshot périmé) mais au deuxième degré : là, un chiffre avait dérivé ; ici, les cinq chiffres du carnet contredisent l'état épinglé, et le plus visible d'entre eux a été divisé par deux délibérément pendant que le carnet voyageait vers le dépôt.

Portée

  • L'étudiant qui clone CoursIA reçoit l'épingle 9e79e88 et un carnet dont aucune sortie n'est reproductible : il mesurera 539 cellules là où le carnet affiche 1081, 34,6 % là où il affiche 59,9 %, 145 attaques là où il affiche 93, 116 mappings là où il affiche 70.
  • Le pire cas n'est pas l'échec visible mais la conclusion fausse absorbée : la densité crossLink « 59,9 % » était déjà la moitié d'un bruit délibérément retiré (siblings qui restatent l'arbre taxonomique). Le carnet enseigne comme matière première un chiffre que l'amont a jugé artefactuel — alors que cette dé-curation est précisément, de son sujet, le fait pédagogique le plus intéressant.
  • Les couches attack/SKOS ont grandi (93→145, 70→116) : les chiffres du carnet sous-comptent des couches vivantes.

Réparation (proposition)

  1. Ré-exécuter contre l'épingle et mettre à jour les cinq sorties.
  2. Dater l'exécution en machine : une cellule qui imprime git -C Argumentum rev-parse HEAD (et idéalement l'empreinte/ligne-count du CSV) en tête des sorties — le carnet devient auto-datable, et le prochain audit lit l'état au lieu de le reconstituer par archéologie.
  3. Enseigner la dé-curation : une note de lignée « 10/07 : 1081 cellules (59,9 %) → 05/09 : 539 (34,6 %), feat(audio): P3 prosodic annotation — FishAudio expressive tags (Epic #1028) #1247/feat(prover): Director context injection — proved lemmas (#1224) #1286 — retrait des crossLinks siblings qui restatent l'arbre » transforme l'écart le plus déroutant du carnet en sa meilleure section.

Vérification (reproductible)

cd MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/Argumentum
CSV="Cards/Fallacies/Argumentum Fallacies - Taxonomy.csv"

# 1. les cinq chiffres du carnet au commit du 10/07 (et à aucun autre — balayer
#    git log --format=%h -- "$CSV" pour le vérifier sur les 40 états)
git show 053257c7:"$CSV" | wc -l        # 1553
git show 9e79e88:"$CSV" | wc -l         # 1546 (épingle)

# 2. les compteurs (critère de la cellule 12 du carnet, appliqué au CSV extrait)
python - <<'EOF'
import csv, io, subprocess, collections
for ref in ("053257c7", "9e79e88"):
    raw = subprocess.run(["git","show",f"{ref}:Cards/Fallacies/Argumentum Fallacies - Taxonomy.csv"],
                         capture_output=True).stdout.decode("utf-8-sig")
    rows = list(csv.reader(io.StringIO(raw))); hdr = rows[0]
    data = [r for r in rows[1:] if len(r) > 3]
    cross = sum(1 for r in data for i,c in enumerate(hdr)
                if c.startswith("crossLink_") and r[i].strip())
    cov = sum(1 for r in data if any(r[i].strip() for i,c in enumerate(hdr)
                if c.startswith("crossLink_")))
    ia, im = hdr.index("AIF_attackType"), hdr.index("AIF_skosMappingType")
    at = collections.Counter(r[ia].strip() for r in data if r[ia].strip())
    mt = collections.Counter(r[im].strip() for r in data if r[im].strip())
    print(ref, "cross:", cross, "cov:", f"{cov}/{len(data)}",
          "attack:", sum(at.values()), dict(at), "skos:", sum(mt.values()), dict(mt))
EOF
# 053257c7 → cross: 1081, cov: 844/1408, attack: 93 {61/29/3}, skos: 70 {57/10/3}
# 9e79e88 → cross: 539,  cov: 487/1408, attack: 145 {87/53/5}, skos: 116 {64/33/19}

# 3. l'OWL confirme aux deux états (compte des Literal exacts)
git show 053257c7:docs/ontology/argumentum.owl | grep -o "<Literal>undercut</Literal>" | wc -l   # 61
git show 9e79e88:docs/ontology/argumentum.owl | grep -o "<Literal>undermine</Literal>" | wc -l   # 53

# 4. la dé-curation délibérée
git show --stat e5191816

# 5. le carnet est entré au dépôt le 24/09, dans un commit d'audit README, sans ré-exécution
cd .. && git log --follow --format="%h %ad %s" --date=short -- Argument_Analysis_Ontology_CrossLinks.ipynb
git show --name-status --format= 8849ce1e27 | grep -i crosslink   # A

# 6. l'épingle du submodule côté CoursIA
git -C <racine CoursIA> ls-tree HEAD MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/Argumentum

# 7. le carnet ne date pas son exécution en machine
python -c "import json; s=''.join(''.join(c['source']) for c in json.load(open('Argument_Analysis_Ontology_CrossLinks.ipynb',encoding='utf-8'))['cells']); print('rev-parse' in s)"

Liens

Activity

  1. jsboige commented on Oct 1, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2026:CoursIA -- jumeau de #18658, meme PR de reparation (re-exec contre epingle + datation rev-parse)

  2. added a commit that references this issue on Oct 1, 2026
  3. jsboige commented on Oct 2, 2026

    @jsboige
    OwnerAuthor

    Erratum (02/10) — le cadrage d'entrée du carnet est un artefact de clone shallow ; le cœur mesuré tient

    Ce qui est rétracté. L'audit écrivait : « le carnet est entré au dépôt le 2026-09-24 » (8849ce1e27, statut A, +1214, « à bord d'un commit d'audit README sans lien de sujet »), et en tirait le motif « lot intégré sans ré-exécution ». C'est un artefact de mesure : le checkout local de CoursIA est un clone shallow (.git/shallow, 4 greffes) — 8849ce1e27 y apparaît comme racine sans parent, donc tout fichier préexistant semble « entrer » dans ce commit. Rejoué contre l'historique complet du dépôt distant (API GitHub, commits?path=…), le vrai historique du carnet est :

    date commit nature
    09/07 890669151 (#5782) entrée réelle — PR-B Ontology_CrossLinks (avec PR-A AIF)
    10/07 a93a08e21 (#5885) refresh du snapshot Argumentum post-#763 + re-fondation des carnets
    31/07 5efb2f7ac (#9007) fix : le recap citait 22 relations, la sortie en compte 1081
    03/08 5384096a6 (#9122) fix : Limitations stale 1,5 % → 59,9 % post-#763
    31/08 59f7f79fa (#13606) hygiène newline finale
    17/09 02f2c6307 (#16270) normalisation des headings publiés
    25/09 47b7c0e26 (#17547) renumérotation de la série

    Ce qui tient, inchangé. Les cinq chiffres committés sont exacts pour 053257c7 (10/07) et pour aucun autre état balayé — cohérent avec une dernière ré-exécution complète au refresh du 10/07, les deux fixes de juillet-août ayant aligné la prose sur ces sorties-là sans les régénérer. L'épingle a bougé 7 fois depuis (15/07 0529c3c63, 28/08, 03/09, 05/09, 17/09, 25/09, et un bump 30/09 b772450e5 que l'audit n'avait pas vu non plus). Le carnet ne date toujours pas son exécution en machine (aucun rev-parse/SHA dans son code).

    Downgrade du défaut. Pas « un lot intégré sans passe de ré-exécution » : un carnet maintenu (7 commits), dont la dernière exécution date du 10/07 et que 7 mouvements d'épingle ont dépassé — le défaut réel reste l'absence de datation d'exécution + l'écart grandissant sorties/épingle.

    Cause racine de l'erreur : dater une entrée de fichier depuis le log d'un clone shallow. Le protocole d'audit est corrigé : toute datation passe par l'API du dépôt distant.

  4. added a commit that references this issue on Oct 6, 2026
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