Skip to content

feat(taxonomy): #498 Fallacies AIF — serialize §7 I/RA/CA into 2 new columns (AIF_attackType + AIF_attackedNode) [reassigned from po-2023] - #753

Merged
jsboige merged 1 commit into
masterfrom
feat/498-fallacies-aif-columns
Jul 8, 2026
Merged

feat(taxonomy): #498 Fallacies AIF — serialize §7 I/RA/CA into 2 new columns (AIF_attackType + AIF_attackedNode) [reassigned from po-2023]#753
jsboige merged 1 commit into
masterfrom
feat/498-fallacies-aif-columns

Conversation

@jsboige

@jsboige jsboige commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Implements the #498 Fallacies AIF column contract (#707§4 Option a) — serializes the §7 I/RA/CA decomposition from the 12 docs/taxonomy/498-aif-*-cluster.md cluster docs into 2 new columns on Cards/Fallacies/Argumentum Fallacies - Taxonomy.csv.

Reassigned by ai-01 (dispatch 1pgunw): po-2023 dead-channel ~2j → I take the contract as [primaire]. Fallacies CSV ≠ Virtues CSV → 0 collision if po-2023 returns. First prod CSV write of chantier #498. Gated: review ai-01 + veto jsboige (structural reassignment). I do NOT self-merge.

What changed

2 new columns inserted AFTER AIF_skosMappingType (col idx 94), before shape (idx 95) — i.e. they join the existing AIF block (cols 91-96):

New col Enum Meaning
AIF_attackType undermine / undercut / rebut the fallacy's AIF attack type
AIF_attackedNode I-node / RA-node / CA-node the node attacked (deterministic from attackType per ratified contract)

Placement note: the dispatch said "trailing APRÈS les colonnes AIF existantes". AIF_skosMappingType (col 94) is followed by 7 utility cols (shape…depth_max4), so I inserted right after col 94 (true trailing-of-AIF-block), NOT at file end. shape shifts 95→97. If ai-01 prefers true file-end append (cols 103-104) instead, trivial to change — flag it.

Derivation

Source: §7 ("Mapping to jsboige's enriched DoD") of the 12 cluster docs. Each §7 has ### pk NNN — Title → **attack-type** headers. attackType = the bolded token. attackedNode is deterministic per the ratified contract: undercut→RA-node, undermine→I-node, rebut→CA-node (no per-leaf prose derivation needed for this column).

Distribution (46 of 1408 rows filled)

attackType attackedNode count PKs
undercut RA-node 44 801-807, 826-828, 830-831, 836, 841-842, 844-845, 849-852, 854-855, 857-860, 862-867, 875, 877-886
undermine I-node 2 838, 843 (fabricated premise — faulty-comparison)
rebut CA-node 0 — (consistent with rebut-rarity: Fallacies §7 has no rebut, like Virtues)

17 FAIL-LOUD/gap leaves left EMPTY (0 fabrication #677) + 1345 not-yet-decomposed leaves empty.

⚠ OPEN QUESTION for review (the FAIL-LOUD interpretation)

I took the strict-conservative reading: serialize a value ONLY where the §7 header explicitly bolds an attack-type; where §7 marks FAIL-LOUD/gap, leave BOTH cells empty. This makes 17 leaves empty:

  • CA-token-missing (5): 829, 840, 847, 848, 853 — RA-node exists, attack-type is hedged "would be an undercut" in the prose, but the modeler did NOT write a clean → **undercut**. → empty.
  • RA-node / gap (12): 832, 834, 835, 837, 861, 868-874 — no RA-node to attack / "no I/RA/CA decomposition at all". → empty (genuinely underivable).

If you (ai-01/jsboige) prefer the generous reading — promote the 5 CA-token-missing leaves to undercut/RA-node (their attack-type IS derivable, the FAIL-LOUD was only about the conflict-token column AIF_skosOther, already documented) — that's a 1-line change in tools/498-fallacies-aif-columns-apply.py (FAIL_LOUD set). I left them empty to err toward fail-loud on a first prod write. Your call.

Surgical byte-exact (the load-bearing guarantee)

Rewrites NO existing field. Each logical row is split into byte-exact field-segments (CSV-aware splitter: respects doubled-quote escapes + the 144 LF embedded inside quoted cells); 2 new segments inserted at idx 95/96; rejoined.

Independently VERIFIED (post-write, backup vs result):

  • 0 byte-preservation mismatches across all 1408 data rows — every existing field (idx 0-94 and original 95-101 → now 97-103) is byte-identical.
  • ✅ Header cols 0-94 + 97-103 byte-identical; 2 new cols inserted at 95/96.
  • ✅ CRLF (1409) + 144 embedded-LF + BOM all preserved.
  • ✅ Re-parses cleanly to 104 cols/row (was 102).
  • ✅ Independent re-derive confirms 46 filled (44 undercut + 2 undermine) + 1362 empty.

git diff --stat shows 1409/1409 — that is the expected signature of adding 2 columns to every line (git diffs whole lines). The byte-preservation proof above is the authoritative "nothing existing changed" guarantee.

CsvHelper maps by header name, so the insertion breaks no existing ClassMap (new cols are simply unmapped).

Tests

dotnet test = 594 pass / 1 fail / 5 skip / 600. The 1 fail is OwlE2EGenerationValidationTests…DroppedByOwl2XmlRoundTrip = pre-existing OWL #133 (OWLSharp round-trip bug, documented in CLAUDE.md, unrelated to this change). 0 new failures — Fallacies-loading tests (CsvBaseStrictContractTest, FallacyClassMapRegressionTests, FallaciesPullTests, MmGeneratorTests) all pass. No entity/test references the new column names; no test hardcodes the Fallacies col count.

Audit / reproducibility

tools/498-fallacies-aif-columns-apply.py — re-runnable: embeds the §7-derived PK sets, performs the surgical byte-exact insertion, re-validates. Run --write to apply (dry-run by default). Reviewer can re-run to independently confirm byte-preservation.

Discipline

Request

Review + (if acceptable) merge — but NOT by me (gated ai-01 + veto jsboige per the reassignment). Two decisions for the reviewer:

  1. FAIL-LOUD interpretation (strict-empty vs generous-undercut for the 5 CA-token-missing leaves) — see open question above.
  2. Column placement (after-col-94 AIF-block as implemented, vs true file-end cols 103-104).

cc @jsboige (structural reassignment — FYI, your veto). cc @jsboigeEpita (po-2023 owner — if you revive that lane, flag any conflict).

🤖 Worker po-2024 — [primaire] deliverable of dispatch 1pgunw (reassigned from po-2023, dead-channel).

…columns AIF_attackType + AIF_attackedNode

Reassigned by ai-01 (po-2023 dead-channel ~2j, dispatch 1pgunw). First prod CSV
write of chantier #498. Adds 2 trailing-AIF-block columns to
Cards/Fallacies/Argumentum Fallacies - Taxonomy.csv, inserted AFTER
AIF_skosMappingType (col idx 94), before `shape` (idx 95) — new cols join the
existing AIF block (cols 91-96).

Derivation: §7 of the 12 docs/taxonomy/498-aif-*-cluster.md cluster docs.
attackType = bolded token in each `### pk NNN -> **type**` header.
attackedNode DETERMINISTIC per ratified contract #707§4 Option (a):
undercut->RA-node, undermine->I-node, rebut->CA-node.

Distribution (46 filled of 1408): 44 undercut/RA-node + 2 undermine/I-node
(838, 843). 0 rebut (consistent with rebut-rarity). 17 FAIL-LOUD/gap leaves
left EMPTY (0 fabrication #677): CA-token-missing {829,840,847,848,853} +
RA-node/gap {832,834,835,837,861,868-874}. Remaining 1345 leaves (not decomposed
in §7) empty.

SURGICAL byte-exact: rewrites NO existing field. Byte-preservation VERIFIED
independently — 0 mismatches: every existing field (idx 0-94 and 95-101) is
byte-identical between backup and result; only 2 new fields inserted per row.
CRLF (1409) + 144 embedded-LF + BOM preserved. CsvHelper maps by header name,
so insertion breaks no existing mapping.

Tests: dotnet test = 594 pass / 1 fail (#133 OWL pre-existing, unrelated) /
5 skip — 0 new failures; Fallacies-loading tests all pass.

Audit: tools/498-fallacies-aif-columns-apply.py (re-runnable derivation +
surgical apply + verify).

Gated: review ai-01 + veto jsboige (structural reassignment). Does NOT self-merge.
Does NOT touch #674/#666/#596 (HOLD).

Co-Authored-By: Claude-Code <noreply@anthropic.com>
@jsboige
jsboige merged commit d4fde74 into master Jul 8, 2026
3 checks passed
@jsboige
jsboige deleted the feat/498-fallacies-aif-columns branch July 8, 2026 11:11
jsboige added a commit that referenced this pull request Jul 8, 2026
…ll prep, gated execution (#754)

Consolidated tools/499-virtues-aif-columns-apply.py — the MIRROR of the Fallacies
contract (PR #753, #498/#707§4a). Applies the ratified deterministic back-fill
(plan #750 v2) to Cards/Fallacies/Argumentum Virtues - Taxonomy.csv, adding the
same 2 columns (AIF_attackType + AIF_attackedNode) so both taxonomies share an
identical AIF column contract (anti-drift).

Derivation (plan #750 v2, re-confirmed programmatically on master):
  default  undercut/RA-node
  override undermine/I-node  if opposes {889, 804} (fabricated premise)
  override rebut/CA-node     if opposes {340} (counter-conclusion)
Distribution EXACT: 206 undercut + 13 undermine + 3 rebut = 222 nodes with scheme;
1 root node (pk 0, no scheme) = empty.

Technique: byte-exact surgical (same as Fallacies script, memory
[[csv-byte-exact-column-insertion]]). Re-writes NO existing field.
Verified dry-run: 0 byte-preservation mismatch; placement after
AIF_skosMappingType (idx 77), print_and_play shifts to 80.

⚠ GATED EXECUTION: dry-run by default. Apply ONLY after the Fallacies contract
(PR #753) is merged + reviewed (ai-01 + jsboige veto). 0 write to Virtues prod
CSV in this PR — script only. Placement constant (INSERT_AFTER_IDX=77) stays
anti-drift with whatever the Fallacies PR #753 open-question-#2 decision lands.

This is [secondaire] prep work — reduces post-unblock cycle time: once the
contract merges, the mirror is 1 PR (run --write). No blocker removed, no gate
crossed.

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 8, 2026
…v2) into 2 new columns (#755)

Executes the [primaire] mirror per ai-01 dispatch tw8www (post #753 merge).
Applies the ratified deterministic back-fill (plan #750 v2) to
Cards/Fallacies/Argumentum Virtues - Taxonomy.csv as the same 2 columns
(AIF_attackType + AIF_attackedNode) — anti-drift with the Fallacies contract
(#753). Both taxonomies now share an identical AIF column contract.

Derivation (plan #750 v2, re-confirmed programmatically on master):
  default  undercut/RA-node
  override undermine/I-node  if opposes {889 Mensonge, 804 Acception arbitraire}
  override rebut/CA-node     if opposes {340 Appel aux conséquences}
Distribution EXACT: 206 undercut + 13 undermine {34,36,49,55,56,73,137,139,140,
153,154,155,158} + 3 rebut {53,54,165} = 222 nodes with scheme; 1 root node
(pk 0, no scheme) = empty.

SURGICAL byte-exact (same technique as #753, tools/499-...-apply.py on master
via #754): rewrites NO existing field. Independently VERIFIED post-write
backup-vs-result: 0 byte-preservation mismatch across all 223 data rows
(fields idx 0-77 and 78 original -> 80 after byte-identical); CRLF (224) + BOM
preserved; re-parse clean 81 cols (was 79). CsvHelper maps by header name -> 0
ClassMap break.

Placement: after AIF_skosMappingType (idx 77), before print_and_play (->80).
Same convention as #753 (per ai-01 verdict: keep after-AIF-block).

Tests: dotnet test = 594 pass / 1 fail (#133 OWL pre-existing, unrelated) /
5 skip -- 0 new failures; Virtues-loading tests (VirtueClassMapRegressionTests,
EntityClassMapRegressionTests) all pass. 0 entity/test references new cols.

Gated: review ai-01 (independent byte-check, same as #753). Does NOT self-merge.
Does NOT touch #674/#666/#596 (HOLD).

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 8, 2026
…stic — backs ASK ai-01) (#756)

* chore(taxonomy): #498 phase 1-3 serialization audit (read-only diagnostic, backs ASK ai-01)

Read-only diagnostic that reports what serializing the scaleup phase 1-3 gated
proposals (50 depth-3 leaves, 5 families) into the AIF_attackType/AIF_attackedNode
columns WOULD do — without writing anything.

Finding (backs the ASK to ai-01):
- 45 NEW fills (27 undermine / 15 undercut / 3 rebut — the FIRST rebut cases in
  the Fallacies CSV: 1282 Relativisme abusif, 1313 Évasion, 1361 Procès en incohérence)
- 2 CONFLICT: pk 834/847 — #753 left them FAIL-LOUD (strict-conservateur verdict
  "garde tel quel"); phase 1 classifies them undercut. Override decision = ai-01.
- 3 CONFIRM: pk 826/844/855 already serialized undercut by #753 (no-op).
- Dry-run byte-exact apply proof: 0 preservation mismatch, delta 696 bytes,
  CRLF+BOM preserved, 104 cols/row. CSV would go 46 -> 93 filled.

Gating: the phase docs self-gate on jsboige content nod ("No production CSV change
until jsboige approves") + closure §6.1 lists it as the prod-write gate for the 50
generative leaves. #753 scoped them out deliberately. This audit crosses NO gate
(read-only). Two decisions surfaced for ai-01: (D1) lift phase 1-3 content gate?
(D2) 834/847 override #753 FAIL-LOUD?

0 prod write. 0 fabrication (the 50-leaf map is verbatim from the phase doc tables).

Co-Authored-By: Claude-Code <noreply@anthropic.com>

* chore(taxonomy): #498 audit — cross-check 50-leaf map vs annotation CSVs (byte-faithful proof)

Extends the read-only audit with an independent verification: the 50-leaf
PHASE_MAP (verbatim-from-table extraction) is cross-checked against the 3
machine-readable annotation CSVs (498-scaleup-phase{1,2,3}-annotations.csv)
that the phase docs reference as source-of-truth.

Result: 50/50 match on both PK set and attack_type. The extraction is
byte-faithful — ai-01 can trust the map without manual re-reading of the
phase doc tables. This strengthens the D1/D2 ASK: when ai-01 lifts the gate,
the 45 NEW + 2 CONFLICT (834/847) are provably exact, so execution is 1-tick.

Also fixes a BOM gotcha: the annotation CSVs have a UTF-8 BOM, so the header
reads with a  prefix — use utf-8-sig to strip it (file-writing.md
discipline, BOM-aware read).

0 prod write. Read-only diagnostic only.

Co-Authored-By: Claude-Code <noreply@anthropic.com>

---------

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige pushed a commit that referenced this pull request Jul 9, 2026
#757)

Add the INDEPENDENT byte-preservation verifier for the phase 1-3 apply
script (PR #757). Same independence discipline as #753/#755 (ai-01's
independent byte-check): re-declares PHASE_MAP + FAIL_LOUD_753 (NOT
imported from the apply script — independence guarantee), and proves:
  - 0 byte-preservation mismatch (every field except AIF_attackType/
    AIF_attackedNode of the apply_set PKs is byte-identical)
  - independent re-derive of the distribution (count + assert vs expected)
  - spot-checks: 3 rebut PKs -> rebut/CA-node; undermine -> I-node;
    undercut -> RA-node; 3 CONFIRM PKs unchanged; 834/847 per flag

Also adds the pre-write backup block to the apply script (saves ORIGINAL
bytes to tmp/Fallacies-backup-pre-phase13.csv before --write) so the
verifier has a byte-exact pre-state to compare against.

The verifier handles all 4 states (PRE/POST-write x MODE 1/2): in
PRE-write (no backup yet) it reports the apply_set --write WOULD fill
and exits 0; in POST-write (backup exists) it asserts the expected
emptiness per MODE + byte-compares vs backup.

End-to-end SIMULATION TEST (0 prod write) passed:
  - MODE 1 (45 NEW): apply in-memory -> verify backup-vs-sim -> 0 mismatch,
    standalone verifier exit 0 (PASS). CSV 46->91, delta 666 B.
  - MODE 2 (47 +834/847 override): dry-run -> 0 mismatch. CSV 46->93, delta 696 B.
  - All spot-checks OK; 834/847 empty in MODE 1 (FAIL-LOUD kept).

At the verdict (ai-01 relays jsboige nod):
  python tools/498-phase13-apply.py --write [--with-overrides]
  python tools/498-phase13-verify.py [--with-overrides]
  dotnet test
  -> PR review byte-check ai-01.

0 prod write in this commit. GATE (jsboige content nod) NOT crossed.

Co-Authored-By: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 9, 2026
…tionnelles #753/#754/#755 + master 81a9e4e (#758)

Refresh v5 of the release validation dossier (2026-07-09). Integrates the 4 PRs merged
between d90ce61 and 81a9e4e — notably the AIF relational columns chantier:
- #753 Fallacies AIF: 2 new columns AIF_attackType/AIF_attackedNode (46/1408 filled)
- #754 Virtues AIF mirror script (dry-run)
- #755 Virtues AIF mirror executed (222/223 filled, 206/13/3 distribution)
- #756 serialization audit (read-only diagnostic)

Added §3.1bis (new artifact inventory: AIF relational columns on both taxonomies).
Header refreshed: master 81a9e4e, tests 594 pass / 1 known-fail #133 / 5 skip / 600 total
(empirical dotnet test 2026-07-09, +16 vs v4.1's 578). Tag still unposéd.

Key invariant: AIF columns are CSV metadata-only (additive layer, 0 impact on card
rendering / CardPen / harvest / PDF) -> verdicts #140 (content) and #632 (CMYK) unchanged,
bundle v3 remains the reference bundle.

Companion index RELEASE-VERIFICATION-INDEX updated: §1 now points to v5 + delta AIF.

Docs-only. No prod code. No DB write. No CSV prod mutation.

Co-authored-by: Claude <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 9, 2026
…-paramétrable) (#757)

* chore(taxonomy): #498 phase 1-3 apply script (prep, gated --write, D2-paramétrable)

Companion APPLY script to #756 (the read-only audit, merged `81a9e4e6`).
#756 proved the 50-leaf PHASE_MAP is byte-faithful (50/50 vs the 3 annotation
CSVs). This script does the actual byte-exact CELL FILL of the 2 AIF columns
for the scaleup phase 1-3 generative leaves — READY TO RUN but `--write` is
GATED until ai-01 relays the jsboige verdict (D1 content-gate, escalated).

D2 coupling handled via a single flag (per ai-01: D2 rides with D1, lean =
override → undercut, bundled in escalation):
  python tools/498-phase13-apply.py            # dry-run, 45 NEW (834/847 FAIL-LOUD)
  python tools/498-phase13-apply.py --write    # APPLY 45 NEW  (GATED — jsboige nod)
  python tools/498-phase13-apply.py --write --with-overrides   # APPLY 47 (+ 834/847 undercut)

Dry-run (both modes) proves byte-preservation:
  - MODE 1 (45 NEW): 27 undermine / 15 undercut / 3 rebut, CSV 46→91, 0 mismatch, delta 666 B
  - MODE 2 (47 +override): 27 undermine / 17 undercut / 3 rebut, CSV 46→93, 0 mismatch, delta 696 B
  - The 3 CONFIRM PKs (826/844/855, already undercut by #753) are correctly
    detected as no-op (excluded from apply_set — fill, never overwrite).
  - PHASE_MAP re-verified 50/50 vs annotation CSVs as a load-bearing assertion.

At the verdict: 1 command (write + verify + tests) → PR review byte-check ai-01.
Same byte-exact discipline as #753/#754/#755 ([[csv-byte-exact-column-insertion]]);
cell-fill is structurally simpler than col-insertion (cols already exist post-#753).

0 prod write in this PR (dry-run only). GATE (jsboige content nod) NOT crossed.

Co-Authored-By: Claude-Code <noreply@anthropic.com>

* chore(taxonomy): #498 phase 1-3 independent verifier + apply backup (PR #757)

Add the INDEPENDENT byte-preservation verifier for the phase 1-3 apply
script (PR #757). Same independence discipline as #753/#755 (ai-01's
independent byte-check): re-declares PHASE_MAP + FAIL_LOUD_753 (NOT
imported from the apply script — independence guarantee), and proves:
  - 0 byte-preservation mismatch (every field except AIF_attackType/
    AIF_attackedNode of the apply_set PKs is byte-identical)
  - independent re-derive of the distribution (count + assert vs expected)
  - spot-checks: 3 rebut PKs -> rebut/CA-node; undermine -> I-node;
    undercut -> RA-node; 3 CONFIRM PKs unchanged; 834/847 per flag

Also adds the pre-write backup block to the apply script (saves ORIGINAL
bytes to tmp/Fallacies-backup-pre-phase13.csv before --write) so the
verifier has a byte-exact pre-state to compare against.

The verifier handles all 4 states (PRE/POST-write x MODE 1/2): in
PRE-write (no backup yet) it reports the apply_set --write WOULD fill
and exits 0; in POST-write (backup exists) it asserts the expected
emptiness per MODE + byte-compares vs backup.

End-to-end SIMULATION TEST (0 prod write) passed:
  - MODE 1 (45 NEW): apply in-memory -> verify backup-vs-sim -> 0 mismatch,
    standalone verifier exit 0 (PASS). CSV 46->91, delta 666 B.
  - MODE 2 (47 +834/847 override): dry-run -> 0 mismatch. CSV 46->93, delta 696 B.
  - All spot-checks OK; 834/847 empty in MODE 1 (FAIL-LOUD kept).

At the verdict (ai-01 relays jsboige nod):
  python tools/498-phase13-apply.py --write [--with-overrides]
  python tools/498-phase13-verify.py [--with-overrides]
  dotnet test
  -> PR review byte-check ai-01.

0 prod write in this commit. GATE (jsboige content nod) NOT crossed.

Co-Authored-By: Claude-Code <noreply@anthropic.com>

---------

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 9, 2026
…leaves, MODE 2 override) (#760)

GO jsboige (interactif, relayé par ai-01 dispatch 6eo7cb 2026-07-09 12:06):
D1 LEVÉE + D2 OVERRIDE = MODE 2. Serialize the 47 scaleup phase 1-3
generative leaves into the 2 AIF columns (45 NEW + 834/847 override →
undercut). Cell-fill byte-exact into Cards/Fallacies/Argumentum Fallacies
- Taxonomy.csv (columns exist post-#753; this is cell-fill, not insert).

Apply: python tools/498-phase13-apply.py --write --with-overrides
  - apply_set: 47 PKs -> 27 undermine / 17 undercut / 3 rebut
    (NEW=45, conflict-overridden=2 [834/847], CONFIRM no-op=3 [826/844/855])
  - PHASE_MAP re-verified 50/50 vs annotation CSVs (load-bearing assert)
  - pre-state check: all 47 apply_set PKs empty (fill, no overwrite)
  - byte-preservation: 0 mismatch; 1409 rows x 104 cols; CRLF+BOM preserved
  - CSV filled total: 46 -> 93 (delta 696 bytes)

Independent verify (backup-vs-result, tools/498-phase13-verify.py):
  - 0 byte-preservation mismatch (every field except AIF_attackType/
    AIF_attackedNode of the apply_set byte-identical)
  - PHASE_MAP PKs filled: 50 -> 27 undermine / 20 undercut / 3 rebut
  - DoD distribution 93 = 61 undercut / 29 undermine / 3 rebut
    (pre 46 [44u/2m from #753] + 47 written [27m/17u/3r])
  - spot-checks OK: 3 rebut -> rebut/CA-node (1282/1313/1361, FIRST Fallacies
    rebut); undermine -> I-node; undercut -> RA-node; 3 CONFIRM (826/844/855)
    unchanged; 834/847 -> undercut/RA-node (MODE 2 override); non-phase
    PK 2 untouched.
  - CRLF 1409, BOM preserved, delta 696 B

dotnet test: 594 pass / 1 fail (#133 OWL pre-existing, unrelated) / 5 skip /
600 total. 0 regression (metadata-only additive layer, 0 render/CardPen/
harvest/PDF impact — verdicts #140/#632 unchanged, bundle v3 stays ref).

Same byte-exact discipline as #753/#755 ([[csv-byte-exact-column-insertion]]).
0 fabrication #677 (50-leaf map verbatim from phase docs, re-verified 50/50
vs the 3 machine-readable annotation CSVs).

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 10, 2026
…t rebut cluster, gated proposal) (#766)

First dedicated cluster doc for a rebut family (Obstruction / Relativisme
abusif). Opens 4 unmapped leaves (1283-1286) under anchor 1282 (serialized
rebut/CA-node by #760). Proposition only — GATED, 0 prod CSV write.

Deliverables (docs/taxonomy/):
  - 498-aif-relativisme-abusif-cluster.md (prose §1-7 + gate boundaries)
  - 498-relativisme-abusif-annotations.csv (12-col machine-readable, 5 rows)

Model (first rebut cluster = attack-columns-only pattern):
  - All 4 leaves: AIF_attackType=rebut + AIF_attackedNode=CA-node
    (deterministic map #707§4 option a: rebut -> CA-node).
  - AIF_skosExceptionRef=Commitment_Inference (native) for 1283 only
    (self-exemption honestly rebuts the arguer's own commitment); the
    other 3 have no clean native rebutted scheme -> ExceptionRef empty,
    fail-loud in AIF_skosOther.
  - AIF_skosDirectRef empty for all 4 (bare relativist rebut = structural
    conflict, no native Walton CQ-conflict token).

#677 discipline (0 fabrication, code=truth verified):
  - CounterConclusionConflict_Conflict / IssueAvoidance_Conflict /
    TuQuoque_Conflict verified NOT native (absent from all filled skos
    cols) -> correctly excluded (as #760 did for the 3 merged rebuts).
  - Commitment_Inference verified native.
  - Annotation CSV uses honest structural descriptor in AIF_CA_node
    (no fabricated token) — improvement over phase-3 placeholder practice.

Honest per-leaf boundary flags: 1284 undermine-flavor, 1285
undercut-flavor, 1286 false-equivalence — documented in prose +
why_not_others, not silently forced.

Coverage: 93/1408 mapped (code=truth rescan) -> 97 projected once
applied; rebut population 3 -> 7 (Relativisme abusif becomes the rebut
nucleus, 5 of 7). Gated review ai-01; jsboige ratifies -> gated apply.

Relates #498 #760 #757 #753 #755 #763 #707 #677.

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 10, 2026
…conciliation trajectory (#768)

Refresh the stale coverage-status.md (2026-07-05, master 70bd160) with a
code=truth scan at master 7796c12. Docs-only proposition (gated) — 0 prod
CSV write.

Central finding — the AIF mapping has TWO layers, never reconciled:
  - attack layer (AIF_attackType+attackedNode): 93 rows (6.6%) — #753+#760
  - skos layer (AIF_skosDirectRef/ExceptionRef/MappingType): 70 rows (5.0%)
    — pre-chantier baseline
  - overlap = only 18 rows. Fully-modeled (both layers) = 18/1408 (1.3%).
  - union (any AIF signal) = 145/1408 (10.3%).

The previous "70/1408 (5.0%)" was NOT wrong — it measured the skos layer,
which predates the attack columns. "93" measures the attack layer. Two
distinct counters, resolved here.

Cross-tab (code=truth, 1408 rows):
  - 52 rows skos-only (vetted native tokens, NO attack columns) — highest-ROI
    back-fill, 0 fabrication risk (tokens already exist). Family spread:
    Cheating 13, Insufficiency 10, ML 9, Faulty logics 8, Math 6, Influence 3,
    Obstruction 3.
  - 75 rows attack-only (typed, NO skos): 44 ML (skos already proposed+ratified
    in merged cluster docs PR-5..12, awaiting deep serialization) + 31 scaleup
    (need skos modeling, fail-loud #677).

Trajectory reprioritized (§5): reconcile the two layers (P1: 52 skos->attack;
P2: 44 ML attack->skos) BEFORE opening new clusters ex-nihilo — the half-done
rows carry vetted tokens and lift 2-layer completeness 1.3% -> ~7-8% for bounded
effort. New clusters (P3) on the small clean residuals (Complication exageree 6u,
Operation inappropriee 5u) + Obstruction rebut nuclei (Evasion, Proces en
inconsistance).

Distribution 61 undercut / 29 undermine / 3 rebut (RA/I/CA map exact). 3 rebut
(1282/1313/1361) = first Fallacies rebut, all Obstruction.

VERIFIED: all figures from CSV scan + git log. RAPPORTE: PR effects (git log).
PENDING: #766 (Relativisme abusif rebut cluster, not merged — Relativisme abusif
still shows 4 unmapped in code=truth).

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 10, 2026
…ows typed (gated proposal + dry-run apply) (#769)

Réconciliation P1 (skos-only -> attack columns), GO ai-01
`msg-20260710T180845-5i1v03`, couvert par le pilote GO #498. Proposition
gated : docs + apply-script dry-run, 0 write prod CSV dans ce diff.

Correction load-bearing du cadrage #768 : il n'existe PAS de sous-ensemble
"inherit mécanique" parmi les 52 skos-only. La classif initiale "19 inherit
du sous-sous anchor" est un artefact — 0/19 ont une signature skos alignée
sur leur anchor (les anchors du même sous-sous sont skos-VIDES : couche
attack-only #753/#760, arguments différents). Hériter leur attackType serait
une fabrication. L'attackType est un jugement neuf : 0-risque token (les
tokens skos existent), pas 0-risque modélisation. Raffine le "0 fabrication
risk" de #768.

Méthode : attackType dérivé de la propre signature skos de chaque ligne,
ancré sur les 18 lignes fully-modeled (ground truth token->attackType).
attackedNode déterministe #707§4 (a) : undercut->RA-node, undermine->I-node,
rebut->CA-node.

Tiering des 52 :
  - 14 PRECEDENT (token exact d'un précédent fully-modeled + contrôle
    sémantique) -> tranche 1, distribution 11 undermine / 2 undercut / 1 rebut.
  - 2 PREC-TIE (777 Inconsistance, 633 Relation infondée — votes divergents).
  - 36 SUFFIX-ONLY (aucun précédent ; le prior de suffixe vers undermine est
    non fiable — contre-ex. pente glissante 705/677 penchent undercut) ->
    modélisation Walton au cas par cas, sous-lots aux prochains ticks.

Livrables :
  - docs/taxonomy/498-reconciliation-p1.md — proposition (correction, méthode,
    tranche 1 avec justif par ligne, reste scopé, bornes du gate).
  - docs/taxonomy/498-reconciliation-p1-annotations.csv — 12 cols, 14 lignes,
    BOM+CRLF (factuel lu du CSV master, raisonnement authored).
  - tools/498-p1-apply.py — apply gated (--write dry-run par défaut), mirroir
    de 498-phase13-apply.py (#757). Re-vérifie 14/14 vs annotation CSV,
    splitters byte-exact, preuve byte-preservation. Dry-run : 0 mismatch,
    93 -> 107 attack-typed, delta 207 bytes, CRLF+BOM préservés, 0 write prod.

Sérialisation prod = étape suivante gated (relais ai-01), pas dans ce PR.

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 11, 2026
…NLY, famille Erreur de raisonnement) attack 114->121 (#779)

Prod serialization of tranche-1c (proposition #775, merged 3d6dcf3). Fills the
2 AIF attack columns (AIF_attackType / AIF_attackedNode) for the 7 skos-only
rows of the whole "Erreur de raisonnement" family — all typed undercut/RA-node.

Rows: 696 Erreur de raisonnement, 697 Causalite douteuse, 705 Pente glissante,
719, 726, 758, 759 (all SUFFIX-ONLY; family signature verified in-set via
707/727/858, NOT a suffix default — suffix prior proscribed, in-set disproof
pk804 _Conflict->undercut, #770).

attack-typed 114 -> 121, fully-modeled 39 -> 46. Executed via
`python tools/498-p1c-apply.py --write` (flow #753/#760, ai-01 GO
msg-20260711T110157-8c8wnh, GO scoped tranche-1c only).

Byte-exact verified 2x:
- script self-proof (load-bearing re-verify P1C_MAP vs annotation CSV 7/7,
  pre-state targets empty + carry skos, only ATI/ANI of the 7 PK may differ):
  0 mismatch, +105 B, 1409x104, CRLF+BOM preserved.
- independent backup-vs-prod cell-by-cell (tmp/Fallacies-backup-pre-p1c.csv):
  exactly 14 cells changed (7 rows x 2 cols), changed PKs == {696,697,705,719,
  726,758,759}, 0 stray (nothing outside AIF attack cols / target PKs), all
  empty->value, node/type 7/7 consistent, delta +105 B, PASS.

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 19, 2026
…ations (read-only, 0 write) (#828)

Export the EXISTING AIF modelling (dispatch ai-01 msg-eltaoz) into consumable
artefacts for CoursIA ICT #7289 + Layer C #790. Read-only on CSV/OWL, post-tag-safe.

Honest verdict (no fabrication): the AIF attack graph is BIPARTITE — each of the
145 fully-modeled fallacies is an attacker targeting an abstract AIF node-TYPE
(RA/I/CA-node), NOT another fallacy. There is no inter-fallacy attack adjacency
in the data; AIF_attackedNode encodes node-type, not a target PK (145/145 axiom,
0 violations). A separate inter-fallacy graph exists in the OWL (isRelatedTo,
mirrors, etc., 1734 edges) but those are generic semantic relations, not typed
AIF attack-edges — exported and labelled separately.

Artefacts (docs/ontology/aif-export/):
- aif-attack-edges.csv       145 bipartite attack-edges (CSV, PK-keyed, primary)
- aif-canonical-concepts.csv 60 AIF canonical concepts (skos refs)
- taxonomy-tree-edges.csv    1408 hierarchical tree edges
- aif-owl-attack-edges.csv   142 attack-edges from OWL (cross-view, individual-keyed)
- aif-relations-graph.csv    1734 inter-fallacy relations (NON-AIF)
- README.md                  column-to-adjacency mapping + verdict

tools/aif-attack-graph-export.py: reproducible (Python stdlib, ~3s, 0 write to sources).

Refs: dispatch ai-01 msg-eltaoz, AIF tranches 1-1d (#498/#753/#769/#776/#779),
CoursIA ICT #7289, Layer C #790.

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 21, 2026
…07 edges, post-tag) (#834)

Re-run du générateur 497-grappe-substrate.py (ai-01 lane, unchanged) contre
le CSV Fallacies courant (master b442c65), pour actualiser le substrat de
curation grappe-à-grappe. Le doc initial mesurait 22 crossLinks (état
pré-modelling) — stale de ~6 semaines. Ce refresh quantifie la densité
réelle post-tranches AIF/crosslinks (#753/#760/#763 + P1).

Delta coverage:
- Bubble-up grappe-edges: 16 -> 107
- Σ crossLink feuilles: ~22 -> ~1179 (cohérent README ontology 844 fallacies
  59.9%, 1985 raw / 1734 distinct OWL)
- Per-grappe cl explosé: 2.3 Manipulation mentale 7->195, 6.3 Raisonnement
  biaisé 0->204, 6.1 0->84, 2.1 0->81...

Finding central: la densification est concentrée INTRA-grappe (top edges
sont 2.3->2.3 137x, 6.3->6.3 134x...). Les ponts inter-familles restent
clairsemés malgré la croissance brute -- c'est là que la curation #497 a le
plus de ROI, pas dans les intra (2.3/6.3 déjà saturées).

Recommendation: ne pas densifier intra (ROI faible), cibler les ponts
inter-familles (ancre 2.3<->6.3 PredatesOn + 2 pistes lexicales défendables:
causales Interprétation-quant<->Causalité-douteuse, attaque-affect
Appel-émotion<->Ad-hominem).

Read-only, 0 fabrication (re-agrégat de crossLink_* existants). Post-tag-safe
(contenu sous review T&A, 0 écriture prod CSV). Artefacts régénérables
(497-grappe-inventory.csv + 497-responding-grappes.csv, script idempotent).
Verdict QA = ai-01.

Deliverable primaire du dispatch ai-01 msg-ucdwi7 (#497/#498/bridge deep-queue,
strate-6 CoursIA #7289).

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 26, 2026
…e unreproducible numbers rectified (#950)

The release dossier is the publication GATE (#134), so its byte-exact figures have
to be reproducible by whoever verifies the tag. §3.4 had three that were not.

Measured on master `accfeeab` (`git cat-file -s` on the committed blob):

1. Size. §3.4 printed 5,314,381 B. That matches NO committed blob: `c2a9b761`
   (its own reference) and `d206e59c` are both 5,378,765 B, master is 6,030,505 B.
   The gap to `c2a9b761` is exactly 64,384 B -- the "-64 KB" claimed in the same
   sentence, i.e. the delta looks subtracted twice. Corrected to 6,030,505 B, with
   the commit and the representation named (blob == worktree here; the blob already
   carries CRLF, so `core.autocrlf` creates no discrepancy).

2. Provenance. §3.4 credited the "régén fraîche" #634 / `c2a9b761`. That commit
   left NO change in `docs/ontology/`: `argumentum.owl` has the identical blob
   `3c76b691…` at `d206e59c` (March) and at `c2a9b761` (July), and
   `argumentum_virtues.owl` is absent from `c2a9b761` entirely although the section
   claims it was committed there. Both files come from #787 / `6fdf5726`
   (2026-07-12): +651,740 B, +9,733 lines, +1,977 crossLinks, +290 AIF assertions.
   Two readings remain possible from git alone (regen reproduced byte-identically,
   or its output was not committed) and the doc now says so rather than picking one
   -- the missing Virtues file leans toward the second. Either way the freshness the
   tag gate requires is satisfied by #787: the citation was wrong, not the conclusion.

3. Unit. "1 408 broader" is a raw grep count (identical at every commit, so
   reproducible as printed) but it counts 1,407 hierarchy edges plus the property
   declaration. 1,407 edges / 1,408 concepts -- the root has no parent. Same class
   of confusion just fixed in #948 for crossLinks (1,081 CSV cells / 1,977
   assertions / 1,985 with declarations).

Confirmed exact and left alone: 1,408 fallacies, 2,816 prefLabel, 5,558 EN
literals, 862,709 B for the Virtues OWL. Flagged as mixed-provenance: the 4,861 FR
count is post-#787 (it was 4,867 at the commit the section named).

Also added: a property inventory that reconciles three documents which had been
counting separately -- crossLink 1,977 (#763/#948), AIF attack 145 (#498 P1 closure),
skos Walton mappings 70. It also corrects a near-miss of my own: `grep attackType`
returns 0 because the properties are `aifAttackType`/`aifAttackedNode`, so the AIF
layer IS serialized; the inventory is the only reliable measurement.

And in §3.1bis: the "OWL can be regenerated post-tag" line is now done (#787), and
the 46/1408 figure is marked as #753's deliverable rather than the current 145/1408.

No verdict, status, arbitration or editorial content touched -- figures only, in the
document's own dated-refresh style (v4, v4.1, v5, v5.1 → v5.2).

Method rule recorded in the section: a byte-exact figure must name its commit AND
its representation, a count must name its pattern. Otherwise the same object reads
1,407 or 1,408, and 1,081 or 1,977 or 1,985.

Refs #134, #133, #763, #948

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant