Skip to content

fix(mindmap): #665 wire Virtue mindmap ar/fa/zh localization (was rendering French) + empirical native-script test - #715

Merged
jsboige merged 1 commit into
masterfrom
fix/665-virtue-mindmap-arfazh-localization
Jul 5, 2026
Merged

fix(mindmap): #665 wire Virtue mindmap ar/fa/zh localization (was rendering French) + empirical native-script test#715
jsboige merged 1 commit into
masterfrom
fix/665-virtue-mindmap-arfazh-localization

Conversation

@jsboige

@jsboige jsboige commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Objet

Corrige le bug signalé par jsboige : les mindmaps Virtues ar/fa/zh rendaient du français au lieu de la langue cible. Ce PR câble réellement la localisation ar/fa/zh du mindmap Virtues (le vrai #665), avec vérification empirique headless que le .mm généré porte le script natif — pas le fallback FR.

Root cause — un trou silencieux, pas un manque de traduction

La CSV taxonomie Virtues portait déjà les colonnes *_ar/_fa/_zh entièrement traduites (223/223, script natif). Le mindmap rendait pourtant du FR pour ces 3 langues parce que la localisation était à moitié câblée :

  • #636 §2 a câblé en/ru/pt/es et déféré le trio ar/fa/zh (extension entité requise).
  • #686 prétendait dans son body avoir câblé ar/fa/zh (commit c2e51192) — mais ce câblage n'a jamais atterri sur master. Vérifié code=vérité sur 204adc47 (tête au moment du fix) :
    • git show HEAD:Virtue.cs | grep -c "TitleAr\|TitleFa\|TitleZh"0 (aucune propriété ar/fa/zh)
    • les 2 blocs MindMapLocalization Virtue listaient en/ru/pt/es uniquement
    • le commentaire du code disait encore littéralement « Ar/Fa/Zh not yet mapped on the Virtue entity → deferred, render FR »
    • Le titre du merge #686 ne mentionnait que « refresh Virtues Batik SVGs fr/en/ru/pt + add es » — le câblage code du body n'y était pas.

Ce PR est donc l'implémentation réelle de ce que #686 déclarait à tort. (Pattern [[feedback_merge_cross_check_audit]].)

Le fix — 2 couches, miroir exact du pattern Fallacies (déjà 8/8 OK)

  • Layer A (entité)Virtue.cs : propriétés + bindings ClassMap .Optional() Title/Description/Remark/Link/Family/Subfamily/Subsubfamily × Ar/Fa/Zh → colonnes CSV *_ar/_fa/_zh existantes.
  • Layer B (config)AssetConverterConfig.MindMapLocalization : entrées ("ar"/"fa"/"zh") ajoutées aux 2 tables Virtue (titre/description + hiérarchie familles) → réécriture {item.TitleFr}{item.TitleAr/Fa/Zh} etc. pour les 8 langues. Commentaire périmé corrigé.

Vérification empirique — headless, AVANT tout SVG (la demande de jsboige)

Nouveau test VirtueMindMap_GeneratesNativeScript_ForArFaZh (ar/fa/zh) : génère un vrai .mm depuis la taxonomie CSV réelle, en appliquant la localisation de production exactement comme le pipeline, FreeMind GUI désactivé (FreeMindPath="" + IsInteractive=false → aucune fenêtre, aucun clic), et asserte que le bloc Unicode natif (Arabe U+0600–06FF / CJK U+4E00–9FFF) est présent dans le texte des nœuds. Il aurait attrapé exactement le défaut « mindmaps en français ». Les 3 cas PASSENT (>50 code points natifs par langue).

Exemples de contenu qui coule maintenant dans le .mm (source CSV → nœud) :

title_fr ar fa zh
Argument valable حجة معتبرة استدلال معتبر 有效论证

Le garde-fou de déferral #636 §2 (VirtueMindMapLocalizationTests) est basculé en place vers le contrat wired-all-8, conformément à son instruction explicite (« flip ... rather than silently deleting »).

Ce qui reste (hors ce PR code)

  • Régén SVG Batik ar/fa/zh : avec ce câblage, une régén Batik produira maintenant des content.svg/links.svg réellement localisés. Elle exige un desktop RDP interactif au premier plan (automation clavier FreeMind, cf #184 — XSLT proscrit). À faire dans une session live (jsboige présent). Ce PR est le prérequis code qui garantit que cette régén sortira du script natif et non du FR.

Validation

  • Build Debug vert (exit 0).
  • Suite mindmap ciblée : 85 pass / 1 skip / 0 fail.
  • Suite complète : 587 pass / 1 known-fail (#133 OWL round-trip, préexistant, sans rapport) / 5 skip. 0 régression (+9 tests vs baseline 578).

🤖 Generated with Claude Code

… rendering French)

The Virtues mind map rendered French node text for ar/fa/zh because the
localization was only half-wired. #636 §2 wired en/ru/pt/es and deferred the
ar/fa/zh trio pending a Virtue entity extension. #686's PR body claimed the
ar/fa/zh wiring (commit c2e51192) but it never landed on master: HEAD:Virtue.cs
had 0 ar/fa/zh properties, the MindMapLocalization Virtue blocks listed only
en/ru/pt/es, and the code comment still read "Ar/Fa/Zh not yet mapped ... render FR".

This completes the two-layer wiring, mirroring the working Fallacy pattern:
- Layer A (entity): Virtue.cs gains Title/Description/Remark/Link/Family/
  Subfamily/Subsubfamily x Ar/Fa/Zh properties + ClassMap .Optional() bindings
  to the CSV *_ar/_fa/_zh columns (already fully translated, 223/223 native script).
- Layer B (config): the two Virtue MindMapLocalization tables now carry ar/fa/zh
  entries, so {item.TitleFr} -> {item.TitleAr/Fa/Zh} etc. for all 8 languages.

Tests:
- Flipped the #636 §2 deferral guardrail (VirtueMindMapLocalizationTests) in place
  to the completed wired-all-8 contract, per its own explicit instruction.
- Added VirtueMindMap_GeneratesNativeScript_ForArFaZh: generates a real .mm from the
  taxonomy CSV (headless, FreeMind GUI disabled) and asserts the Arabic/Persian/CJK
  Unicode block is present in node text - the regression that would have caught
  "Virtues mind maps in French instead of the target languages".

Full suite: 587 pass / 1 known-fail (#133 OWL round-trip, pre-existing) / 5 skip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jsboige
jsboige merged commit 699580a into master Jul 5, 2026
3 checks passed
@jsboige
jsboige deleted the fix/665-virtue-mindmap-arfazh-localization branch July 5, 2026 23:27
jsboige added a commit that referenced this pull request Jul 6, 2026
…agick.NET deferred-bug) (#719)

Read-only inventory of the 5 skipped tests in the AssetConverter test suite. Dispatch ynv05a
idle-de-secours ("review #133-adjacent test skips"). Base master bdba45d. 0 code change (release
freeze), dotnet test + read sources only.

Empirical dotnet test on bdba45d: 593 total = 587 pass / 1 fail / 5 skip. The 1 fail = permanent
known-fail OwlE2E...XmlRoundTrip (OWLSharp round-trip, #133). The 5 skips split cleanly:

- 4/5 = GSheetSync tests, hardcoded [Fact(Skip="Manual only — requires OAuth + network access")],
  credentials at jsboige-machine-specific G:\Mon Drive path + GDrive network. Legitimate infra-gated
  skips (CLAUDE.md "Pending: OAuth credentials"). GSheet logic covered by 77 unit tests in CI. Minor
  post-tag suggestion: convert unconditional Skip to conditional (run iff creds file exists) — same
  test-hygiene window as #710.

- 1/5 = SvgConversionIntegrationTests.TryAutomateSvgConversion... [Fact(Skip="Temporairement
  désactivé pour isoler le crash Magick.NET")] — the ONLY skip hiding a real bug. Skipped 2025-08-01
  (commit 6bd802f, ~11 months ago) under a stale "temporary" label. Tests the Freeplane-process SVG
  path (TryAutomateSvgConversion, via reflection). Flag for post-tag: production switched to FreeMind
  Batik SVGs (PR #565, April 2026), so the Freeplane path may be (a) dead code post-Batik, (b) a still-
  used fallback with a latent Magick.NET crash, or (c) a test-isolation artifact. Un-skip + reproduce
  resolves it. Bundled with #710 nullable + SGEN/MSB3073 post-tag lane.

Test-count drift note: CLAUDE.md snapshots 584 total (578/1/5) at 2026-07-05; empirical on bdba45d
= 593 total (587/1/5) — 9 new passing tests from recent merges (#715 + others). Skip/fail unchanged.

Read-only: 0 code change, 0 Cards/ write, 0 build mutation, no skipped test executed. Reproducible
via dotnet test on bdba45d.

Dispatch ynv05a (idle-de-secours). Base bdba45d.

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 6, 2026
) (#724)

Regenerate the Arabic, Persian and Chinese Virtue mind maps as Batik SVGs
carrying native-script visible text, closing the "mindmaps rendered in French
instead of target language" gap for the three remaining languages.

Produced via Mode=Mindmapper + FreeMind GUI SendKeys export (no XSLT), on top
of the two-layer Virtue localization fix (#715: Virtue.cs ar/fa/zh properties +
ClassMap bindings, and MindMapLocalization StaticConversions).

Verified before commit (visible <text> node content, not just attributes):
  - ar content.svg / links.svg : 3116 Arabic codepoints, Batik, 0 XSLT trace
  - fa content.svg / links.svg : 3016 Persian codepoints, Batik, 0 XSLT trace
  - zh content.svg / links.svg : 1155 CJK codepoints,     Batik, 0 XSLT trace
  Samples — ar: حجة معتبرة / احترام الشخص · fa: استدلال معتبر · zh: 有效论证 / 尊重个人

Ships content.svg + links.svg per language, matching the committed `es` Virtue
precedent. HTML wrappers are intentionally NOT shipped: they inline French
visible text on master across ALL languages (en/fr/pt/ru included) — a separate
pre-existing wrapper-localization bug, filed separately, out of scope here.

Under jsboige's explicit interactive GO ("vasy pour la regen SVG").

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 6, 2026
…path replaced, dispatch h2utyb) (#722)

Root-cause investigation of the #719-flagged test skip (SvgConversionIntegrationTests...
TryAutomateSvgConversion, "Temporairement désactivé pour isoler le crash Magick.NET", skipped
2025-08-01). Dispatch h2utyb SECONDARY (ai-01 2026-07-06 07:09). Base master 7ebeda1. Docs only,
0 write Cards/, 0 code change.

Verdict: the Magick.NET crash is OBSOLETE — no longer reproducible. The code path that crashed
(Freeplane + Magick SVG rasterization) was REPLACED: TryAutomateSvgConversion now delegates to
TryFreeMindSvgExport (FreeMind GUI process + SendKeys, commit 46d6cd9), and production SVG
rendering moved to Batik (PR #565, April 2026). Evidence (code=truth): grep Magick
FallacyMindMapDocumentConfig.cs = 1 token = the dead 'using ImageMagick;' at line 19, ZERO usages;
the method body uses Process.Start + SendKeys, not MagickImage. This resolves #719 flag question
(a): the Magick dependency in the SVG path is dead.

Magick.NET itself is healthy and load-bearing ELSEWHERE (unrelated to SVG): ImageHelper.cs (image
loading, new MagickImage) + PdfManager.cs (PDF image collections, MagickImageCollection). Only its
former presence in the SVG path was the problem, and that presence is gone.

Fix options (post-tag, bundled with #710/#719 test-hygiene lane): (1) reclassify skip as
infra-gated "requires FreeMind GUI" (recommended, accurate reason, preserves local smoke-test
value); (2) delete (Magick premise obsolete, path covered by Batik tests + #715); (3) retarget to
headless Batik (most work, overlaps #715). In all 3, the stale Magick skip reason must be replaced.
Minor cleanup: remove the dead 'using ImageMagick;' (line 19). No dedicated issue — folds into #719.

No live repro run: the test sets FreeMindPath="" so TryAutomateSvgConversion hits the FreeMind-not-
found early return (returns false), never reaching Magick (there is none). Current failure mode if
un-skipped = "FreeMind not found" assertion fail, NOT a Magick crash. Code analysis is conclusive.

Read-only: 0 write Cards/, 0 code change, 0 test execution. Reproducible via grep on
FallacyMindMapDocumentConfig.cs + git log on the skip line.

Dispatch h2utyb (SECONDARY). Base 7ebeda1.

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 6, 2026
… CS8603 in MmGeneratorTests) (#726)

Re-verification of the #710 nullable-cleanup baseline on master 9f52446 (dispatch h2utyb idle-de-
secours: "CS warnings beyond #710's 96"). Found +2 raw warnings = 1 new DISTINCT nullable-flow
warning introduced by PR #715 (fix #665 Virtue ar/fa/zh localization, commit 699580a).

Drift: MmGeneratorTests.cs:281 CS8603 (possible-null return). #715 added a CSV path-finder helper
(walks 12 parent dirs for Argumentum Virtues - Taxonomy.csv, returns null at line 281 if not found);
method returns non-nullable string → CS8603. Confirmed by git blame (lines 274-282 all = 699580a)
and diff vs 34c7702 (helper absent at #710 base — those lines held a FamilleExpression assertion).

MmGeneratorTests.cs: was 6 warnings (#710 top-8), now 7 raw (3 pre-existing CS8602 + 1 new CS8603).
Main converter project stays 0 CS (zero-warning, #587). Distinct-warnings on 9f52446 = 49; raw/echo
factor consistent across both measurements (96→98 = apples-to-apples raw-line count).

Impact on the plan: negligible — new warning is in Slice C scope (CS86xx nullable-flow),
MmGeneratorTests.cs already in §1 top-8. Post-tag Slice C file-by-file pass picks it up; no slice
re-scoping. Fix is low-risk: helper legitimately returns null → string? return type is the honest
annotation.

Read-only: 0 code change, 0 Cards/ write, 0 build mutation. Reproducible via dotnet build Tests.csproj
--no-incremental on 9f52446. Keeps the #710 baseline current so the post-tag lane runs against an
accurate inventory (96→98, +1 distinct).

Dispatch h2utyb (idle-de-secours). Base 9f52446.

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 6, 2026
…ssert null (13 warnings) (#729)

First sub-lot of Slice C (CS86xx nullable-flow) of the #710 nullable-cleanup plan
(dispatch x0ykyn PRIMARY; follows Slice A #727 + Slice B #728). Slice C is the riskiest slice
per #710 §2 — it touches arrange/assert code with intentional null-passing — so it is shipped in
small, cohesive, per-area sub-lots with a full re-test after each, rather than one big bang.

This sub-lot: 13 distinct CS86xx warnings across 2 files in WebBasedGenerator/, both test-only
arrange/assert null-handling. NEITHER file touches CsvHelper mapping or parsing code, so the
CLAUDE.md missing/null-field fragility class is not in scope.

UpdateTableFromRecordsTests.cs (9 warnings) — DataSetInfo.UpdateTableFromRecords contract suite
(DataTable round-trip, GSheetSync-adjacent; no CsvHelper):
- L26  CS8619 `table.PrimaryKey = new[] { table.Columns[PrimaryKey]! }` — the column was just
       Add()'d on the prior line, so the indexer's nullable annotation is provably non-null here.
- L36  CS8625 `Record(string pk, string? textEn = null, string? descEn = null)` — the body already
       null-checks both (`if (textEn != null)`), so `string?` is the honest param type.
- L72/95/118/168 CS8625 `new object[] { "1", "old", null! }` — the null is the desc cell value;
       DataTable stores it as DBNull. Suppression is honest (runtime-legal, annotation-strict).
- L134/157/158 CS8602 `Rows.Find("x")!["col"]` — the prior line asserts
       `.Should().NotBeNull()`; the `!` acknowledges the assertion the compiler can't track.

PdfAlternateFaceAndBackContractTests.cs (4 warnings) — PdfManager.OrderImagesForAlternateFaceAndBack
contract suite (recto-verso ordering, pure; no CSV):
- L52/77/87/110 CS8620 — all `Cards(("Fx", null))` passing null-back to exercise the prod
       IsNullOrEmpty guard ("Rules have no back"). ONE helper-signature change fixes all four:
       `Cards(params (string front, string? back)[] specs)` makes the tuple's back honestly
       nullable (the tests deliberately pass null), with a single `s.back!` suppression at the
       CardImages.Back assignment documenting that prod's entity annotates Back non-nullable but
       tolerates a null Back at runtime via the guard. This is the intentional null-passing idiom
       #710 §2 calls out for test arrange — documented inline in the helper comment.

DoD (measured on this branch, base master 240511c):
- dotnet build Tests.csproj --no-incremental: the 2 target files emit 0 CS86xx (13→0). 0 errors.
- dotnet test: 587 pass / 1 fail (OWL #133 permanent) / 5 skip (#719). 0 regression —
  UpdateTableFromRecords + PdfAlternateFaceAndBack suites all green.

CsvHelper safety (#710 §3): NOT IN SCOPE — neither file is a CsvHelper-mapped entity or exercises
the CSV load path. The CsvBaseStrict + CsvParser suites (the mapping-risk suites) are untouched.

Slice C remaining: 19 distinct CS86xx across ~12 files (CsvGridConversion, MmGenerator incl. the
#715-introduced CS8603 at L281, SvgConversion×2, SvgDisambiguation, SvgPostProcessing, OwlE2E,
FallacyLinkFallback×3, LoggerMarkup, UtilityExtensions, PKHierarchical, ImageFileGenerator×2,
SimpleImageGenerator). These touch parsing/OWL/mindmap code paths and need closer per-line reading;
follow in subsequent sub-lots with the same re-test-after-each discipline.

Base 240511c. 0 Cards/ write, 0 rendering code change.

Dispatch x0ykyn (PRIMARY, Slice C-1). Base 240511c.

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 6, 2026
…s + #715 CS8603 (4 warnings) (#730)

Second sub-lot of Slice C (CS86xx nullable-flow) of the #710 nullable-cleanup plan
(dispatch x0ykyn PRIMARY; follows Slice A #727, Slice B #728, Slice C-1 #729).

This sub-lot closes the dispatch's explicit ask — "corrige le CS8603 de #715" — by fixing all
4 CS86xx in MmGeneratorTests.cs (the mindmap-generation test fixture), including the CS8603 that
#715 (commit 699580a, #665 Virtue ar/fa/zh loc) introduced at L281 (documented in the #726 drift
note as the 96→98 regression). The file is test-only and exercises the real mindmap-generation
code path (FallacyMindMapDocumentConfig / VirtueMindMapDocumentConfig via FreeMindPath="" headless).

Fixes (4 warnings, all low-risk post-assert suppression or honest nullable return):

- L86  CS8602 `xmlDoc.Root!.Name.LocalName` — XDocument.Parse of the test's well-formed .mm yields
       a non-null Root; the `!` documents that invariant. (No prior Root assert, hence the `!`.)
- L138 CS8602 `xmlDoc.Root!.Element("node")!.Elements("node")` — both derefs are guarded by the
       two FluentAssertions `NotBeNull` on the immediately preceding lines (L136 Root, L137 node).
- L176 CS8602 `xmlDoc.Root!.Element("node")!.Elements("node")` — same pattern, guarded by L174+L175.
- L273/281 CS8603 `private static string? FindRepoVirtuesCsv()` returning `null` — the #715 path-finder
       helper legitimately returns null when the Virtues taxonomy CSV is not found walking up from
       the bin dir. `string?` is the honest return type. The sole caller (L299) asserts
       `csvPath.Should().NotBeNull(...)` on L300 before passing it to LoadVirtuesFromPathAsync on L302;
       `csvPath!` there acknowledges that assertion (the compiler can't track FluentAssertions).

#715 CS8603 root cause (code=truth): git blame L274-282 = 699580a (#715); the helper was added to
locate the committed Virtues CSV for the new native-script ar/fa/zh test, declared `string` (non-null)
with a `return null;` fallback — a classic CS8618/CS8630-class mismatch the #710 sweep now catches.

DoD (measured on this branch, base master 240511c):
- dotnet build Tests.csproj --no-incremental: MmGeneratorTests emits 0 CS86xx (4→0). 0 errors.
- dotnet test --filter MmGeneratorTests: 11/11 pass (incl. the 3 ar/fa/zh InlineData #715 cases).
- dotnet test (full): 587 pass / 1 fail (OWL #133 permanent) / 5 skip (#719). 0 regression.

CsvHelper safety (#710 §3): NOT IN SCOPE — MmGeneratorTests exercises the mindmap-generation path
(.mm XML via XDocument), not the CsvHelper CSV load path. The mapping-risk suites are untouched.

Slice C remaining: 15 distinct CS86xx across ~11 files (CsvGridConversion, SvgConversion×2,
SvgDisambiguation, SvgPostProcessing, OwlE2E, FallacyLinkFallback×3, LoggerMarkup,
UtilityExtensions, PKHierarchical, ImageFileGenerator×2, SimpleImageGenerator). Follow in
subsequent sub-lots.

Base 240511c. 0 Cards/ write, 0 rendering code change.

Dispatch x0ykyn (PRIMARY, Slice C-2 — closes the #715 CS8603 call-out). Base 240511c.

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 6, 2026
…omplete (#710) (#734)

Final sub-lot of Slice C (CS86xx nullable-flow) of the #710 nullable-cleanup plan
(dispatch x0ykyn PRIMARY; follows Slice A #727, B #728, C-1 #729, C-2 #730, C-3 #731, C-4 #732,
C-5 #733). This completes Slice C: all 32 distinct CS86xx in Tests/ are addressed across the
7 sub-lots C-1..C-final (merged set), leaving 0 CS86xx once all slice PRs are merged.

The 5 singletons (one warning per file, 5 different areas):

- CsvGridConversionContractTests.cs L176 (CS8625): `new List<object> { "a", null!, "c" }` — the null
  cell is INTENTIONAL (test name "GridToCsv_NullCells_BecomeEmptyStrings", pins the `cell?.ToString()
  ?? ""` guard). `null!` is the honest suppression (runtime-legal null cell, annotation-strict).
- OwlE2EGenerationValidationTests.cs L60 (CS8603): `private static string? ResolveRepoFile(...)` —
  path-finder helper legitimately returns null when the ontology file isn't found walking up from
  the bin dir (same idiom as #715 FindRepoVirtuesCsv). The sole caller (L47) already null-checks and
  throws FileNotFoundException (L48-54); the throw guarantees `path` non-null at L55 FromFile, so no
  caller `!` needed.
- LoggerMarkupSafetyTests.cs L58 (CS8600): `string output = null!;` — closure-capture pattern
  (assigned in the lambda at L59, asserted at L62). `null!` is the honest initializer.
- UtilityExtensionsLayoutTests.cs L142 (CS8600): `((string)null!).PathIsUrl()` — the null is
  INTENTIONAL (test name "PathIsUrl_Returns_False_For_Null", pins the null-guard so a regression
  that dropped it would NRE). The `null!` documents that intent.
- PKHierarchicalGroupingTests.cs L25 (CS8619): `.Select(record => record["path"].ToString()!)` —
  the path key is always set by BuildRecords (L22), so ToString on the boxed string is non-null;
  `!` documents that invariant for the ToHashSet<string>() return type.

DoD (measured on this branch, base master 240511c):
- dotnet build Tests.csproj --no-incremental: the 5 target files emit 0 CS86xx (5→0). 0 errors.
- dotnet test (targeted GSheetSync+Ontology+Utility+PKHierarchical): 52 pass / 1 fail
  (OWL #133 permanent known-fail, pre-existing — not a regression; the 3 OTHER OwlE2E tests pass).
- dotnet test (full): 587 pass / 1 fail (OWL #133) / 5 skip (#719). 0 regression.

CsvHelper safety (#710 §3): NOT IN SCOPE — none of these 5 files is a CsvHelper-mapped entity or
exercises the CSV load path (GSheet grid round-trip, OWL ontology load via OwlAdapter, Logger
markup, path utility, PK grouping reflection).

#710 plan status once all 8 PR (#727-733 + this) merged: Tests/ CS86xx from 98 raw (49 distinct)
to 0. Slice A (6 raw CS0108/CS0219) + Slice B (20 raw CS8618) + Slice C (32 distinct CS86xx) = the
full 98-raw baseline. The #715 drift (CS8603, 96→98) closed at C-2.

Base 240511c. 0 Cards/ write, 0 rendering code change.

Dispatch x0ykyn (PRIMARY, Slice C-final — Slice C complete). Base 240511c.

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 7, 2026
…e-file diagnosis (#738)

Issue #725 reported Argumentation_Virtues_{lang}.html wrappers inlining the FR
mind-map SVG in every language. Investigation on master 6ce91ef proves this is
a STALE-FILE artifact, not a code bug:

- GenerateHtmlSvgWrappers inlines the post-localization content.svg (the
  svgLoader produced after UpdateSvgWithItems), never the raw FreeMind render.
  #725's "inlines the raw FR svg" hypothesis is wrong on the mechanism.
- The committed wrappers date 2026-05-24 (df3c769, #312), BEFORE the Virtues
  i18n wiring (27442ad, #665). They were generated FR because content.svg was
  FR-frozen at the time; they were never regenerated since.
- content.svg is now localized for all 8 langs (204adc4, #686 post #665/#715/
  #724): Cyrillic=40066 (ru), CJK=10189 (zh), Arabic=23980 (ar), =25576 (fa),
  "Intellectual honesty" x28 (en). The wrapper just wasn't regenerated with it.
- Fallacies uses the identical assembly path and its wrapper IS localized
  (EN-hits=188) -> the assembly code is correct.
- Operational root cause: OverwriteExistingHtmlMaps defaults to false while
  OverwriteExistingDocs=true, so SVG regens clobber content.svg but skip the
  existing .html wrappers.

Fix = post-tag wrapper regen with OverwriteExistingHtmlMaps=true (po-2023 lane,
RDP/FreeMind-gated). This tick's gated, regen-free deliverable:

- CI regression test VirtuesMindmapWrapperLocalizationTests (headless, no
  Playwright) mirroring VisualTests/MindmapWrapperTests for Fallacies. Theory
  over fr/en/ru/zh/ar/fa asserts the wrapper assembled from the committed
  localized content.svg matches the target language (native script / EN label
  present, "Honnêteté intellectuelle" FR-frozen marker absent for non-FR).
- Investigation doc documenting the 4-source proof + post-tag action.

0 write Cards/, 0 regen, 0 CSV/DB/OWL. Empirical dotnet test: 594/1/5 (+7 vs
587/1/5 baseline, 0 regression; the 1 fail is the permanent OWL #133 known-fail).

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 28, 2026
…follow-up) (#962)

The release-gate dossier carried six facts measured stale against master
3094d42. All are mechanical/premise drift from July merges — no verdict,
no release scope changed. This pass corrects the dossier body that #959
(header/§0) deliberately left untouched.

1. §3.2 Virtues .content.svg were marked FR-figé ("gap structural"). FALSE:
   Argumentum_Virtues_MindMap_{lang}.content.svg are native-script 8/8,
   committed via #665/#715/#724/#686 (9f52446). Distinct-size proof
   (git cat-file -s): fr 431931 / en 418954 / ru 485254 / pt 446948 /
   es 432142 / ar 461859 / fa 461654 / zh 1148677 — a FR clone would be
   ~431931 everywhere. Twin premise of #636 (CLOSED 2026-07-06), false for
   the same reason. Marked RÉSOLU.

2. §3.2 es/ar/fa/zh mindmap SVG count 3 → 5 each (git ls-files | wc -l).
   fr 6 / en 5 / ru 5 / pt 5 / es 5 / ar 5 / fa 5 / zh 5.

3. §4 tests 596/601 → 643/638/0/5 (CI run 30280070312, both matrix legs),
   aligning with §0/#959. The 596/601 was pre-#911 (Test step was a no-op).

4. §4 Magick.NET 14.14.0 → 14.15.0 (#871 6f1a6e1a, 5 advisories patched).
   Also adds AutoMapper 14.0.0 (#588) and PdfPig 0.1.14 official (#908).

5. §3.6 + §5.8 + §7 + §8.2(c) "PT titre English Channel — open finding,
   appel à décision" → RÉSOLU. git grep "English Channel" -- Cards/ = 0.
   Per ai-01 precision: the string lived in an EMBEDDED csv key that is
   IGNORED at runtime (HarvestManager.cs overwrites it with the real CSV),
   so the defect never reached a card — NOT "resolved by #803". The
   observed mistranslation was stale-harvest, not a live prod defect.
   Separated from PT row-1 cover contamination (#306, distinct, also closed).

6. §5.4(a) + §8.2(a) #636 "arbitrage ouvert" → CLOSED 2026-07-06 (twin
   premise of #1).

Every value above is re-read at source (git ls-files / cat-file -s / grep /
gh issue view), not taken from an intermediate report. 3 audit-probe
imperfections (Fallacies/Scenarii counts grabbed Archive/2022; skos:prefLabel
grep namespace-split) are documented honestly in the audit report, not masked.

Scope: 1 docs file, docs-only, 0 prod write, 0 OWL, 0 CSV. Correction PR,
decision to merge = ai-01 (pre-tag sensitive zone, #134 gate).

Audit report: docs/investigations/2026-07-28-release-validation-v0.9.0-audit.md
(landed in #961). This PR is the body-correction follow-up ai-01 gave GO on
(arbitrage qgsvq4, 2 precisions applied: "n'a jamais atteint une carte"
phrasing + PT vs EN distinct #306).

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