feat(ontology): #499 Phase 2 — Virtue ClassMap + OWL generator (mono-corpus, aif:goodTenorOf) - #592
Conversation
…e entity Phase 2 ClassMap: map the 12 columns appended to the Virtues prod CSV in #590 (66->78) onto Virtue / VirtueClassMap -- the entity that loads the prod CSV (CsvType = typeof(Virtue), AssetConverterConfig.cs) and feeds the OWL/mindmap pipeline (ParallelVirtueDocumentCreatorConfigBase<Virtue>). Entity-target correction: ai-01's dispatch named ArgumentVirtueClassMap, but ArgumentVirtue is only the AutoMapper ArgumentVirtue->Fallacy projection target (MappingProfile.cs) -- it is NOT a CSV loader. The prod Virtues CSV + downstream pipeline operate on Virtue. Flagged to ai-01 (the two entities are near-identical; the naming conflates them in the dispatch and in CLAUDE.md). All 12 columns .Optional() -- 9 structurally empty by design, 3 populated for the 222 real Virtue nodes (pk=0 root left empty): crossLink_PredatesOn..IsRelatedTo (x8) -- only crossLink_Opposes populated (semicolon list of prevented Fallacy PKs) AIF_skosDirectRef/ExceptionRef/Other/MappingType (x4) -- DirectRef + MappingType populated (Walton scheme label + FR-prose critical question) Tests (+2 in VirtueClassMapRegressionTests): - Maps499RelationalAndAifColumns: populated row mirrors prod pk=71 (crossLink_Opposes=681;690, AIF_skosDirectRef=Argument from Sign, AIF_skosMappingType=FR prose RFC4180-quoted for its internal comma); 9 structural empties map to "" (CsvHelper empty-cell behavior, not null). - 499ColumnsAbsent_DoesNotThrow: Optional contract -- a header missing the relational block loads without throwing (property null, not throw). Suite: 533 -> 535 passed, 0 failed, 5 skipped. Phase 2 part 2 (OwlAdapter Virtues OWL pass) follows in this branch once the 2 flagged design adaptations are confirmed with ai-01: 1. AIF: Virtue AIF_skosMappingType is FR prose (not a skos:*Match enum token), so the Fallacies switch cannot fire -> adapt to skos:relatedMatch + annotation. 2. crossLink_Opposes is cross-corpus (Virtue->Fallacy PKs); Fallacy concept URIs derive from TextEn, not PK -> the Virtues pass must load the Fallacies corpus to resolve PK->URI for the 0-dangling DoD. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw] #499 Phase 2 Part 1 — reviewed at e0be8911a6. Small, clean ClassMap/entity diff (32 LOC) + 2 regression tests.
Scope note for future readers: the PR title says "OWL pass" but this branch ships only Part 1 (the 12 crossLink_* / AIF_skos* properties on Virtue + VirtueClassMap mappings, all .Optional()). The OwlAdapter pass itself is deferred to Part 2 pending the two design decisions flagged in the PR body (FR-prose skos:relatedMatch vs. enum token; cross-corpus PK→URI resolution for crossLink_Opposes). That's a reasonable split — nothing broken is hidden behind the WIP tag.
Correctness verified by hand: in Maps499RelationalAndAifColumns the 12 newCols headers align 1:1 with the 12 RFC4180-parsed newRow values (I counted — the four ,,,, segments plus 681;690, Argument from Sign, and the quoted FR-prose field land in the right slots; the internal comma in "Les résultats…cohérents ?" parses as a single field). The two tests together correctly pin CsvHelper's .Optional() contract: present-but-empty cell → "" (BeEmpty), absent column → null (BeNull) — a good regression pair. The entity-target correction (prod loader is Virtue, not ArgumentVirtue) is right; ArgumentVirtue is the AutoMapper projection target, not a CSV loader.
No path/secret leaks, no stubs/TODOs in the shipped code. Trivial nit: Virtue.cs ends without a trailing newline (pre-existing, not introduced here). Looking forward to Part 2 — the cross-corpus PK→URI resolution is the architecturally interesting piece.
…corpus OWL pass) Create the Virtues OWL/SKOS generator from scratch (mirroring OwlGeneratorConfig / OwlDocumentConfig for Fallacies) and wire it into the pipeline alongside the Fallacies pass. Emits argumentum_virtues.owl: a concept scheme with the 7-family hierarchy (skos:narrower via Path/Depth, same GetParent shape as Fallacies), one concept per Virtue node (prefLabel/description FR+EN on Title*/Description*), and a custom AIF object property aif:goodTenorOf linking each Virtue to its Walton argumentation scheme. Design decisions (jsboige interactive 2026-06-24): - AIF predicate = custom `aif:goodTenorOf` (DeclareObjectProperty), NOT a skos:*Match token. The Virtue AIF_skosMappingType column holds the FR-prose critical question, not a skos enum token, so the Fallacies switch over AIFSkosMappingType cannot fire (design adaptation 1). The prose is carried as an rdfs:comment annotation. - The AIF namespace already exists in the Fallacies pass (ExternalReferenceOntologyNamespaceURI = http://www.arg.dundee.ac.uk/aif#) — no new namespace introduced; aif:goodTenorOf resolves in the Dundee AIF ontology. - Cross-corpus Virtue↔Fallacy links (crossLink_Opposes PK→URI resolution) DEFERRED to Phase 3. Resolving Fallacy PKs requires loading the Fallacies corpus (concept URIs derive from GetId(TextEn), not PK) — new architecture beyond this single-dataset pass. This pass is strictly mono-corpus Virtues. Wiring (AssetConverterConfig.cs): - new VirtueOwlGeneratorConfig property (instantiated, default Enabled=true). - invoked in the OwlGenerator mode block (both sync + async branches), parallel to OwlGeneratorConfig.Apply. Tests (+5 in VirtueOwlGenerationContractTests): GetId mirrors the Fallacies IRI transform (byte-identical, asserted on the same proven inputs A-B/A, B/Appel à l'autorité); generator defaults lock the ontology identity (document name / VirtuesTaxonomy dataset / namespace / AIF namespace); aif:goodTenorOf URI construction pinned for Phase 3 reuse. Verified: build 0 errors, 0 new warnings; suite 535 → 540 passed / 0 failed / 5 skipped. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…proven + Virtues FR-gap §3.2: + reproductibilité byte-proven (régên 8-lang 2026-06-24, Fallacies_zh.svg cmp IDENTICAL) + gap structurel honnête (Virtues .content.svg FR-figés, non-bloquant). §3.4: #499 Phase 2 OWL — 'en cours po-2024' → MERGED (#592, 8d5d275). §5.5: RELEASE-NOTES-v0.9.0.md créé dans cette PR (n'existait pas sur master). §5.6: #499 Phase 2 OWL — livré avant ce dossier, conservé pour traçabilité. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…5 post-#595 (vraiment) §3.3: 'RAPPORTÉ régén 12 juin' → ✅ régên fraîche 2026-06-25 (bef3bc6). PDFs Virtues re-rendered post-#595 (clobber targeted, Chromium invoqué, labels familiaux localisés vérifiés : zh 有效论证, ar حجة_معتبرة). i18n distinct anti-leak #216 OK. Régén headless. §5.2: décision 'régén fraîche ?' → FAITE. Risque résiduel '16 commits depuis 12 juin' levé. §7: risque 'régén 12 juin non reproduite' → LEVÉ (régén fraîche reproduit counts + #592/#595). + note de procédure stale-harvest honnête (oubli clobber corrigé ce cycle). §8: reco point 3 (régén fraîche) → FAITE. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ualisés (relecture) Header note de méthode : 'RAPPORTÉS non re-vérifiés ce jour' → régén fraîche 2026-06-25 re-vérifiée ce jour (résout contradiction header vs §3.3 refresh tick préc.). §4 tests : 533 pass (22eb5f3) → 540 pass (bef3bc6, test run Release 22s), +7 = tests OWL Virtues #592. 0 fail, 5 skip (GUI/Freeplane). Relecture cohérence read-only (pas de polish) : 1 contradiction header/corps résiduelle trouvée + facts actualisés vs bef3bc6. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ale + mineurs FINDING principal (po-2024 cross-verify, gate go-live) : - ligne 6 (Master de référence) : 22eb5f3/533 → bef3bc6/540 (j'avais corrigé ligne 14 mais manqué la 6 — contradiction header/corps résiduelle). Mineurs : - ligne 3 (date) : 2026-06-23 → 2026-06-25 (refresh). - ligne 95 (attribution) : '+7 = tests OWL Virtues #592' → précisé +5 VirtueOwlGeneration +ContractTests + +2 VirtueClassMapRegressionTests (#592 = 8d5d275). +7 confirmé correct vs doute po-2024 (message commit #592 liste explicitement +5 et +2). Dossier cohérent bout-en-bout après cross-verify indépendant po-2024. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…-NOTES régên date Coherence cross-check RELEASE-NOTES + dossier §3.2 (extension relecture po-2024 qui n'avait vérifié que RELEASE-VALIDATION). 2 nombres faux vs assets réels : - Taille Fallacies_zh.svg : '17.2 MB (18 075 919 B)' → '5.45 MB (5 451 309 B)' (fichier réellement commité, byte-proven régên 2026-06-25). Aucun SVG zh n'est à 17.2 MB (content/links = 4.0 MB, main = 5.45 MB). Corrigé dans RELEASE-NOTES l.23 + dossier §3.2 table zh. - RELEASE-NOTES l.22 : 'régên 12 juin 2026' → 'régên fraîche 2026-06-25 bef3bc6 post-#592/#595' (cohérent dossier §3.3 refresh). CHANGELOG '21 SVGs FR/EN/RU/PT' l.47 = section historique recovery (commits avril 2026), pas contradiction avec l.16 Added '8 languages' = laissé intact. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ANGELOG SVGs 8-lang (#591) * docs(release): v0.9.0 validation dossier + fix CHANGELOG SVGs 8-lang Add the v0.9.0 release validation dossier (go-live GATE for #134): - scope (8 languages, jsboige decisions), verified asset inventory (CSV 8-lang, MindMap SVGs 8-lang via #565, OWL 5.4MB, PDFs reported from 12-Jun regen 64/64), toolchain state (zero-warning CS+NU, 533/0/5), residual risks, and the decision points that need jsboige before the tag (pixel RTL/CJK eyeball, fresh regen, DNN coupling, tag v0.9.0). Fix CHANGELOG line 16: it stated "ES/AR/FA/ZH SVG regeneration pending" but #565 (merged 2fff84c) shipped those 12 SVGs. Wording now reflects the delivered 8-language set including RTL + CJK. Dossier built on committed assets + the reported 12-Jun release regen (64/64 PDFs, 9834 images, exit 0); no fresh regen run this session (bin/ empty post-crash, no RDP GO). Co-Authored-By: Claude <noreply@anthropic.com> * docs(release): #591 address NanoClaw review notes on v0.9.0 dossier - Byte-verify asset sizes: OWL 5.4MB→5.13MB (5,378,765 bytes), zh SVG 18MB→17.2MB (18,075,919 bytes). - Add §3.1 source pointer for the 1408/223/167 taxonomy counts (issues #335/#499 spec / Scenarii commits, not re-derived this day). - Clarify §5 point 5: CHANGELOG already fixed in this PR; docs/RELEASE-NOTES-v0.9.0.md does NOT exist on master (verified 22eb5f3) — only CHANGELOG.md documents the release. Non-blocking review notes from ai-01/NanoClaw; no content change to the 6 gate decisions. Co-Authored-By: Claude <noreply@anthropic.com> * docs(release): #591 update coupling reco + draft v0.9.0 release notes Per ai-01 jalon dispatch (review-ready WE): - Update dossier §5 point #3 with po-2023 recommendation: DE-COUPLE (tag assets-only; DNN upgrade as post-release ops milestone), with effort estimate pointer to UPGRADE-ASSESSMENT §10 (#593). - Add docs/RELEASE-NOTES-v0.9.0.md (draft, did not exist on master) — GitHub Release body auto-built from CHANGELOG + dossier, for jsboige to validate/paste. Covers 8-language scope, assets, pipeline infra, recovery fixes, quality (533 tests, zero-warning build), and a security note (DNN CVEs → post-release, target 10.3.2). Co-Authored-By: Claude <noreply@anthropic.com> * docs(release): #591 refresh dossier — #592 OWL merged + MindMap byte-proven + Virtues FR-gap §3.2: + reproductibilité byte-proven (régên 8-lang 2026-06-24, Fallacies_zh.svg cmp IDENTICAL) + gap structurel honnête (Virtues .content.svg FR-figés, non-bloquant). §3.4: #499 Phase 2 OWL — 'en cours po-2024' → MERGED (#592, 8d5d275). §5.5: RELEASE-NOTES-v0.9.0.md créé dans cette PR (n'existait pas sur master). §5.6: #499 Phase 2 OWL — livré avant ce dossier, conservé pour traçabilité. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs(release): #591 refresh §3.3/§5.2/§7/§8 — régên fraîche 2026-06-25 post-#595 (vraiment) §3.3: 'RAPPORTÉ régén 12 juin' → ✅ régên fraîche 2026-06-25 (bef3bc6). PDFs Virtues re-rendered post-#595 (clobber targeted, Chromium invoqué, labels familiaux localisés vérifiés : zh 有效论证, ar حجة_معتبرة). i18n distinct anti-leak #216 OK. Régén headless. §5.2: décision 'régén fraîche ?' → FAITE. Risque résiduel '16 commits depuis 12 juin' levé. §7: risque 'régén 12 juin non reproduite' → LEVÉ (régén fraîche reproduit counts + #592/#595). + note de procédure stale-harvest honnête (oubli clobber corrigé ce cycle). §8: reco point 3 (régén fraîche) → FAITE. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs(release): #591 cohérence — header note de méthode + §4 tests actualisés (relecture) Header note de méthode : 'RAPPORTÉS non re-vérifiés ce jour' → régén fraîche 2026-06-25 re-vérifiée ce jour (résout contradiction header vs §3.3 refresh tick préc.). §4 tests : 533 pass (22eb5f3) → 540 pass (bef3bc6, test run Release 22s), +7 = tests OWL Virtues #592. 0 fail, 5 skip (GUI/Freeplane). Relecture cohérence read-only (pas de polish) : 1 contradiction header/corps résiduelle trouvée + facts actualisés vs bef3bc6. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs(release): #591 fix FINDING relecture po-2024 — header ligne 6 stale + mineurs FINDING principal (po-2024 cross-verify, gate go-live) : - ligne 6 (Master de référence) : 22eb5f3/533 → bef3bc6/540 (j'avais corrigé ligne 14 mais manqué la 6 — contradiction header/corps résiduelle). Mineurs : - ligne 3 (date) : 2026-06-23 → 2026-06-25 (refresh). - ligne 95 (attribution) : '+7 = tests OWL Virtues #592' → précisé +5 VirtueOwlGeneration +ContractTests + +2 VirtueClassMapRegressionTests (#592 = 8d5d275). +7 confirmé correct vs doute po-2024 (message commit #592 liste explicitement +5 et +2). Dossier cohérent bout-en-bout après cross-verify indépendant po-2024. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs(release): #591 fix taille SVG zh fausse (17.2→5.45 MB) + RELEASE-NOTES régên date Coherence cross-check RELEASE-NOTES + dossier §3.2 (extension relecture po-2024 qui n'avait vérifié que RELEASE-VALIDATION). 2 nombres faux vs assets réels : - Taille Fallacies_zh.svg : '17.2 MB (18 075 919 B)' → '5.45 MB (5 451 309 B)' (fichier réellement commité, byte-proven régên 2026-06-25). Aucun SVG zh n'est à 17.2 MB (content/links = 4.0 MB, main = 5.45 MB). Corrigé dans RELEASE-NOTES l.23 + dossier §3.2 table zh. - RELEASE-NOTES l.22 : 'régên 12 juin 2026' → 'régên fraîche 2026-06-25 bef3bc6 post-#592/#595' (cohérent dossier §3.3 refresh). CHANGELOG '21 SVGs FR/EN/RU/PT' l.47 = section historique recovery (commits avril 2026), pas contradiction avec l.16 Added '8 languages' = laissé intact. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs(release): #591 refresh dossier v0.9.0 — régén 2026-07-01 + verdict visuel PASS ai-01 The validation dossier was last refreshed 2026-06-25 and flagged the PDF counts as "RAPPORTÉS" and the visual verdict as "remaining (ai-01, règle HARD)". Both are now resolved as of the 2026-07-01 cycle: - Régén Release 8-lang executed 2026-07-01 on 18b4d02 + #614 (serial, EnableParallelism=false, isolated worktree) — 0 échec, 64/64 PDFs, 1229 img/lang ×8, "Generation finished.", bundle on GDrive review-v0.9.0-2026-06-28/ with sha256 manifest. - Verdict visuel ai-01 = PASS représentatif (2026-07-01 08:50): spot-check Fallacies_Web_Thumbnails p1 across zh/ar/fa/ru/es covering CJK + RTL + cyrillic + latin; bug #216 (FR contamination) held, structure complete 8 types × 8 languages. - DNN migration full-IIS now CLOSED (dnn.argumentum.myia.io LIVE) — coupling no longer an assets blocker. Refreshed sections: header (date/status/master-ref), §1 (méthode), §3.3 (PDFs counts + verdict PASS), §4 (tests 549/0/5), §5 (decisions: verdict FAIT/PASS, régén 07-01, DNN LIVE, new §5.7 params Debug-vs-Release), §7 (risks lifted), §8 (recommendations). content-only, 0 write Cards/, 0 runtime change. CHANGELOG + RELEASE-NOTES untouched. Co-Authored-By: Claude-Code <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
… scope (#637) The committed argumentum.owl dated 2026-03-28 (d206e59) — stale ~3 months, BLOQUEUR TAG. Regenerated fresh 2026-07-02 on master c2a9b76 (Mode.OwlGenerator, no Playwright/harvest — OWL reads CSV directly). Scope reported honestly (not 8 languages — downgrade claim): - argumentum.owl: 5,314,381 B (5.07 MB, -64 KB vs stale), 1408 fallacies, BILINGUE EN/FR literals (5558 EN + 4861 FR), 2816 prefLabel, 1408 broader. - argumentum_virtues.owl: 862,709 B (842 KB), NEW (#592) — 223 Virtues, 223 aif:goodTenorOf, 7 families, FR/EN literals. The OWL generator only embeds EN+FR (OwlGeneratorConfig is mono DefaultLanguage) — the 6 other release languages (RU/PT/ES/AR/FA/ZH) are NOT in the OWL. OWL = bilingual reference ontology, NOT 8-language. CSV/PDF/SVG = 8 languages; OWL = EN+FR. RELEASE-VALIDATION §3.4 updated to reflect this (was claiming 5.13 MB stale size, no Virtues file). Relates #134 #592 #634. Co-authored-by: Claude-Code <noreply@anthropic.com>
…rified, no regen) (#672) Primaire dispatch l0wt63 (ai-01). Verifies the Virtues OWL Phase 2 (inverse paradigm aif:goodTenorOf) is generated, committed, and content-current. Verified (code=truth, master a41cbda): - argumentum_virtues.owl committed (862 KB), PR #592, fresh-regen #637 batch - aif:goodTenorOf = 223 (ObjectProperty + AnnotationProperty + AnnotationAssertions on the 7 family schemes) — inverse paradigm wired - Bilingual FR 884 / EN 641 literals, 223 Virtues, 7 families Freshness check (the #634-prevention): OWL mtime (02:30) predates the last Virtues CSV touch (#650 at 14:59). Column-level diff proves this is NOT a #634 repeat: - 223 nodes before/after #650 (structure unchanged) - 0 OWL-relevant column changes (title/desc/remark/family x 26 cols) - Only print_and_play flag changed (16 rows) — OWL generator doesn't read it Committed OWL is content-current. No regen warranted (would be byte-identical). Reporting confirmed-done per dispatch 'si deja fait -> INFO' branch rather than fabricating a redundant pipeline run. Relates #499 #592 #637 #634 #650. Base a41cbda. Co-authored-by: Your <your.email@example.com> Co-authored-by: Claude-Code <noreply@anthropic.com>
…tability fixes) (#134) (#689) The v0.9.0 entry predating bundle v3 missed the print-production and late-cycle stability work. This refresh brings it in line with master `21e2c666`, cross-checked against the release-validation dossier v4 (docs/RELEASE-VALIDATION-v0.9.0.md §3.3) and dashboard decisions #26-69. Added: - "Print Production (CMYK & Print&Play)" section: Ghostscript post-process (#632), `--pdf-cmyk` entry-point (#652), bundle v3 = 80 PDFs DeviceCMYK + SWOP OutputIntent (6.18 GB RGB -> 5.30 GB CMYK), P&P Standard/Light (#645/#648-650, 64 -> 80 PDFs), GS timeout 180->900s (#670) - "OWL Ontology (Bilingual EN/FR)" section: Fallacies OWL 5.07 MB (#634 regen), Virtues OWL (#592/#499 Phase 2), honest scope note (EN+FR only, not 8-lang) - "Fixed - Pipeline Stability (Jun-Jul 2026)" section: harvest deadlock #651, serial retry #613/#676, logger Spectre #630/#655, CMYK oxymore, Johnny 6.1.3 #653, Rules i18n refonte #640, CSV hygiene #579/#581/#584, OWL staleness #634 Corrected (code=truth): - Magick.NET 14.13.1 -> 14.14.0 (verified in .csproj) - Test count 548 -> 578 pass / 1 known-fail #133 / 5 skip / 584 total (empirical `dotnet test` on Argumentum.AssetConverter.Tests, 2026-07-04, .NET 9). Previous counts in docs (548/549/570) were all stale No existing content regressed; all prior sections preserved. Co-authored-by: Your <your.email@example.com> Co-authored-by: Claude-Code <noreply@anthropic.com>
#499 Phase 2 — Virtue ClassMap + OWL pass ✅ READY (Part 1 + Part 2)
Status: READY — Part 1 (ClassMap) + Part 2 (Virtue OWL generator) both delivered.
Base
6e029a6f(#590 merged). Dispatch:msg-20260623T151404-vjbzs9.Part 1 — ClassMap ✅ (commit
e0be8911)Virtue/VirtueClassMap— the entity that loadsthe prod CSV (
CsvType = typeof(Virtue)) and feeds the pipeline. All 12.Optional().ArgumentVirtueClassMap, butArgumentVirtueis only the AutoMapper projection target — not a CSV loader. The prodVirtues CSV operates on
Virtue.VirtueClassMapRegressionTests(suite 533 → 535).Part 2 — Virtue OWL generator ✅ (commit
d5ce3228)Discovery:
OwlGeneratorConfigonly emittedargumentum_fallacies.owl— no OWL passexisted for Virtues. Part 2 therefore creates the generator from scratch, mirroring
OwlGeneratorConfig/OwlDocumentConfig(Fallacies):VirtueOwlGeneratorConfig+VirtueOwlDocumentConfig(Ontology/, new file) — emitsargumentum_virtues.owl: a concept scheme with the 7-family hierarchy (skos:narrowervia
Path/Depth, sameGetParentshape), one concept per Virtue node (prefLabel /definition FR+EN on
Title*/Description*), and a custom AIF object property.AssetConverterConfig.cs): new property + invoked in theOwlGeneratormode block (sync + async), parallel toOwlGeneratorConfig.Apply.Design decisions (jsboige interactive 2026-06-24)
aif:goodTenorOf(DeclareObjectProperty), not askos:*Matchtoken. The VirtueAIF_skosMappingTypecolumn holds the FR-prose criticalquestion, not a skos enum, so the Fallacies
switch(AIFSkosMappingType)cannot fire.The prose is carried as an
rdfs:commentannotation. The AIF namespace already existsin the Fallacies pass (
http://www.arg.dundee.ac.uk/aif#) — no new namespace.crossLink_Opposes(PK→URI) DEFERRED to Phase 3. Resolving Fallacy PKsrequires loading the Fallacies corpus (concept URIs derive from
GetId(TextEn), not PK) —new architecture beyond this single-dataset pass. This pass is strictly mono-corpus.
Tests +5 (
VirtueOwlGenerationContractTests)GetIdmirrors the Fallacies IRI transform (byte-identical; asserted on the same proveninputs
A-B/A, B/Appel à l'autorité).argumentum_virtues.owl/VirtuesTaxonomydataset / namespace / AIF namespace).aif:goodTenorOfURI construction pinned for Phase 3 reuse.Verified: build 0 errors, 0 new warnings; suite 535 → 540 passed / 0 failed / 5 skipped.
Honesty note — E2E not yet exercised⚠️
The generator compiles, is wired, and is covered by pure contract tests (transform /
defaults / URI). The actual end-to-end
.owlfile emission has NOT been run — thatneeds the compute-heavy pipeline (CardPen harvest is not my lane solo). Flagged explicitly:
concept count, hierarchy depth, and
aif:goodTenorOftriples should be byte-checked againstthe 222 populated Virtue nodes on the next coordinated pipeline run. Cross-corpus Phase 3 +
E2E validation are the open tails.
DoD #499 coverage
argumentum_virtues.owl(this PR, mono-corpus)🤖 Worker po-2024 · #499 Phase 2 · Part 1 (ClassMap) + Part 2 (OWL gen) delivered · 540/0/5