Skip to content

docs(taxonomy): #499 Virtues AIF mirror script — [secondaire] back-fill prep, gated execution (anti-drift with PR #753) - #754

Merged
jsboige merged 1 commit into
masterfrom
docs/499-virtues-aif-mirror-script
Jul 8, 2026
Merged

docs(taxonomy): #499 Virtues AIF mirror script — [secondaire] back-fill prep, gated execution (anti-drift with PR #753)#754
jsboige merged 1 commit into
masterfrom
docs/499-virtues-aif-mirror-script

Conversation

@jsboige

@jsboige jsboige commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

[secondaire] prep work — 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 as the same 2 columns, so both taxonomies share an identical AIF column contract (anti-drift).

Script only — 0 write to the Virtues prod CSV in this PR. Execution is GATED (dry-run by default) until the Fallacies contract (PR #753) is merged + reviewed (ai-01 + jsboige veto). This PR just lands the ready-to-run mirror so the [secondaire] becomes 1 PR once unblocked — reduces post-unblock cycle time. No gate crossed, no blocker removed.

Per ai-01 direction (1pgunw): "Ne reste pas en stand-by, ouvre des PRs en mode autonome." This is the highest-value unblocked [secondaire] work.

What it does (dry-run validated)

$ python tools/499-virtues-aif-columns-apply.py
distribution: undercut=206, undermine=13, rebut=3, empty(root)=1
  undermine pks (13): [34, 36, 49, 55, 56, 73, 137, 139, 140, 153, 154, 155, 158]
  rebut pks     (3): [53, 54, 165]
total with scheme=222 (expect 222), +root empty=1 (expect 1)
new cols at idx 78/79; print_and_play shifted to 80; delta=3799 bytes; all 224 rows 81 cols
byte-preservation mismatches: 0 (must be 0)
>>> DRY-RUN (pass --write; GATED until Fallacies contract PR #753 merged + reviewed)

Derivation (plan #750 v2, ratified; re-confirmed programmatically on master c43bd7b5):

  • default undercut/RA-node
  • override undermine/I-node if the virtue opposes {889 Mensonge, 804 Acception arbitraire} (fabricated premise)
  • override rebut/CA-node if the virtue opposes {340 Appel aux conséquences} (counter-conclusion)

Distribution EXACT: 206 undercut + 13 undermine + 3 rebut = 222 nodes with scheme; 1 root node (pk 0, no scheme) = empty. Matches plan #750 v2's 206/13/3 exactly. 0 overlap between the {889,804} and {340} override sets.

Technique = byte-exact surgical (same as Fallacies PR #753)

Re-writes NO existing field. Byte-exact field-segment splitter (CSV-aware: doubled-quote escapes + embedded newlines), inserts 2 new field-segments, rejoins. Memory lesson [[csv-byte-exact-column-insertion]]. Dry-run self-verifies 0 byte-preservation mismatch (existing fields idx 0-77 + 78-78 original → 81-81 after are byte-identical).

Placement note (anti-drift with Fallacies PR #753)

Inserted AFTER AIF_skosMappingType (idx 77), before print_and_play (idx 78 → shifts to 80). This mirrors the Fallacies placement (PR #753). If the Fallacies open-question-#2 (placement) decision lands as true-file-end instead, change INSERT_AFTER_IDX here — it's a single constant, stays anti-drift.

Discipline

Request

Review + (if acceptable) merge. This is low-risk prep: a script that doesn't touch any prod file until its gate lifts. Once PR #753 merges + ai-01/jsboige review it, the [secondaire] mirror is 1 PR (python tools/499-virtues-aif-columns-apply.py --write + byte-preservation verify + tests).

cc @jsboige (Option A FYI; anti-drift with Fallacies PR #753).

🤖 Worker po-2024 — [secondaire] prep, dispatch 1pgunw deep-queue.

…ll prep, gated execution

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: Claude-Code <noreply@anthropic.com>
@jsboige
jsboige merged commit 8dc87f5 into master Jul 8, 2026
3 checks passed
@jsboige
jsboige deleted the docs/499-virtues-aif-mirror-script branch July 8, 2026 11:11
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 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>
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