fix(mindmap): #665 wire Virtue mindmap ar/fa/zh localization (was rendering French) + empirical native-script test - #715
Merged
Conversation
… 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
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>
This was referenced Jul 6, 2026
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>
This was referenced Jul 6, 2026
Merged
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.mmgé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/_zhentiè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 §2a câblé en/ru/pt/es et déféré le trio ar/fa/zh (extension entité requise).#686prétendait dans son body avoir câblé ar/fa/zh (commitc2e51192) — mais ce câblage n'a jamais atterri sur master. Vérifié code=vérité sur204adc47(tête au moment du fix) :git show HEAD:Virtue.cs | grep -c "TitleAr\|TitleFa\|TitleZh"→ 0 (aucune propriété ar/fa/zh)MindMapLocalizationVirtue listaient en/ru/pt/es uniquement#686ne 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
#686déclarait à tort. (Pattern [[feedback_merge_cross_check_audit]].)Le fix — 2 couches, miroir exact du pattern Fallacies (déjà 8/8 OK)
Virtue.cs: propriétés + bindings ClassMap.Optional()Title/Description/Remark/Link/Family/Subfamily/Subsubfamily × Ar/Fa/Zh→ colonnes CSV*_ar/_fa/_zhexistantes.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.mmdepuis 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) :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)
content.svg/links.svgré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
#133OWL round-trip, préexistant, sans rapport) / 5 skip. 0 régression (+9 tests vs baseline 578).🤖 Generated with Claude Code