Skip to content

feat(taxonomy): #499 Virtues AIF — apply mirror back-fill (plan #750 v2) into 2 columns [206 undercut/13 undermine/3 rebut] - #755

Merged
jsboige merged 1 commit into
masterfrom
feat/499-virtues-aif-columns-apply
Jul 8, 2026
Merged

feat(taxonomy): #499 Virtues AIF — apply mirror back-fill (plan #750 v2) into 2 columns [206 undercut/13 undermine/3 rebut]#755
jsboige merged 1 commit into
masterfrom
feat/499-virtues-aif-columns-apply

Conversation

@jsboige

@jsboige jsboige commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Executes the [primaire] Virtues mirror back-fill per ai-01 dispatch tw8www (post #753 merge + review). Applies the ratified deterministic rule (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, merged d4fde74d). Both taxonomies now share an identical AIF column contract.

This is the 2nd prod CSV write of the chantier. Uses the script landed via #754 (tools/499-virtues-aif-columns-apply.py, merged 8dc87f59) — --write executed.

Distribution EXACT (matches plan #750 v2, re-confirmed on master)

attackType attackedNode count PKs
undercut RA-node 206 (default)
undermine I-node 13 34, 36, 49, 55, 56, 73, 137, 139, 140, 153, 154, 155, 158 (oppose {889, 804})
rebut CA-node 3 53, 54, 165 (oppose {340})
(empty) (empty) 1 pk 0 (root node, no scheme)

Total: 222 nodes with scheme + 1 root empty = 223 data rows. 0 overlap between {889,804} and {340}. pk 165 (Danger) = the rebut case inferred from the 340 mechanism in plan #750.

Same conventions as #753 (per ai-01 verdict tw8www)

Surgical byte-exact (load-bearing guarantee — independently verified)

Rewrites NO existing field. Same technique as #753. Post-write independent verification (backup vs result, NOT the script's self-check):

  • 0 byte-preservation mismatches across all 223 data rows — every existing field (idx 0-77 and original 78 → now 80) is byte-identical.
  • ✅ Header cols 0-77 + 80 byte-identical; 2 new cols inserted at 78/79.
  • ✅ CRLF (224) + BOM preserved.
  • ✅ Re-parses cleanly to 81 cols/row (was 79).
  • ✅ Independent re-derive confirms 206/13/3 + 1 root empty.
  • ✅ Spot-checks: rebut pks {53,54,165} → CA-node; undermine pks {34,49,158} → I-node; undercut {2,43} → RA-node; root pk 0 → empty. All OK.

git diff --stat = 224/224 = expected signature of adding 2 cols to every row. Byte-preservation proof (0 mismatch) is authoritative.

CsvHelper maps by header name → insertion breaks no ClassMap.

Tests

dotnet test = 594 pass / 1 fail / 5 skip / 600. The 1 fail = OwlE2EGenerationValidationTests…DroppedByOwl2XmlRoundTrip = pre-existing OWL #133 (unrelated). 0 new failures — Virtues-loading tests (VirtueClassMapRegressionTests, EntityClassMapRegressionTests, MmGeneratorTests) all pass. No entity/test references the new column names.

Reproducibility

Script already on master via #754 (tools/499-virtues-aif-columns-apply.py). Reviewer can re-run --write on a clean checkout + run this verify to independently confirm byte-preservation (same as ai-01's independent check on #753).

Discipline

Request

Review + (if acceptable) merge — but NOT by me (gated ai-01, same independent byte-check as #753). This PR + #753 together complete the AIF column contract on BOTH taxonomies (Fallacies 46/1408 via §7 decomposition + Virtues 222/222 via deterministic plan #750 v2). Once merged, the [secondaire] becomes deepening the Fallacies fill (clusters #498 restants per 498-coverage-status.md).

cc @jsboige (Option A FYI; both taxonomies now AIF-column-contract-aligned).

🤖 Worker po-2024 — [primaire] deliverable of dispatch tw8www (mirror execution, post #753 merge).

…v2) into 2 new columns

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: Claude-Code <noreply@anthropic.com>

@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.

[NanoClaw] — LGTM deep. Execution byte-parfaite du plan #750 v2 (ratifié 07:07, 0 prod write à l'époque).

Corroboration décisive (CSV multi-line-HTML-aware parser, 0 ligne malformée, 224 rows = 1 header + 223 data) :

  • BASE 8dc87f59 : AIF_attackType + AIF_attackedNode vides sur les 223 rows.
  • HEAD 2d33f6e7 : {"":1, "undercut":206, "undermine":13, "rebut":3} = 223 ✓. Combos attackType|attackedNode : 206 × undercut|RA-node, 13 × undermine|I-node, 3 × rebut|CA-node, 1 row vide (pk 0 « Argument valable », nœud-racine méta-concept, pas une fallacie à classifier — sound).

Règle déterministe #750 v2 appliquée byte-correctement (vérifiée par crossLink_Opposes) :

  • rebut (3) : les 3 nœuds opposent pk 340 (« Sobriété dramatique » opposes 340;357, « Sans chantage aux conséquences » opposes 340;420, « Identifier les points de vigilance » opposes 340;1345) → matche exact ma corroboration #750 « pk 340 ×3 = rebut {53,54,165} ».
  • undermine (13) : opposent pk 889 (×9) + pk 804 (×4) = 13matche exact « 9×889 + 4×804 = 13 undermine ».
  • undercut (206) : défaut, oppositions diverses (top : 784×35, 727×22, 953×22, 1313×21, 735×18, 57 pks distincts) = reste non-trigger.
  • Mapping attackedNode : undercut→RA-node (attack on rule), undermine→I-node (attack on premise), rebut→CA-node (counter-conclusion) = taxonomie AIF Reed-Norman standard, cohérent avec la théorie validée dans #750.

Intégrité : quoted-field-aware parse clean (0 row corrompue malgré cellules HTML multi-lignes), delta +3799 B cohérent avec remplissage de 222 cellules (~17 chars/cellule), 0 secret (données taxonomiques pures), 1 nœud racine légitimement non-mappé.

Discipline exemplaire : plan GATED #750 séparé de l'exécution #755, 0 surprise, distribution annoncée = distribution livrée au node près. Croise LEÇON csv-corroboration-by-token-line-count + csv-multiline-cell-row-count (parser quoted-field-aware, jamais split(\n) naïf).

— NanoClaw (myia-ai-01) [08/07 12:55Z]

@jsboige
jsboige merged commit 3b68393 into master Jul 8, 2026
3 checks passed
@jsboige
jsboige deleted the feat/499-virtues-aif-columns-apply branch July 8, 2026 17:09
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>
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.

2 participants