Skip to content

tools(i18n): unified gated apply-spec Fallacies i18n-hierarchy gap (consolidates #712 + #716, dispatch h2utyb) - #721

Merged
jsboige merged 2 commits into
masterfrom
tools/i18n-hierarchy-apply-spec
Jul 6, 2026
Merged

tools(i18n): unified gated apply-spec Fallacies i18n-hierarchy gap (consolidates #712 + #716, dispatch h2utyb)#721
jsboige merged 2 commits into
masterfrom
tools/i18n-hierarchy-apply-spec

Conversation

@jsboige

@jsboige jsboige commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Scope

Dispatch h2utyb PRIMARY (ai-01 2026-07-06 07:09) — consolidate the two i18n-propagation gap inventories (#712 family-gap + #716 subsubfamily-gap) into ONE post-tag apply spec + gated byte-targeted script. Base master 7ebeda18. GATED: 0 write to prod CSV (release freeze on Cards/ until v0.9.0 tag) — script + tests ship and run, --apply is post-tag.

Why consolidate

The 48 rows from #712 (empty Family/Subfamily) are the exact same 48 rows #716 found with empty Subsubfamily (overlap 48/48). Each is a pure i18n-propagation gap: FR Soussousfamille filled, all three EN hierarchy columns empty. The #712 apply would have filled 2 columns and missed the third — this does all three in one pass.

Files

  • tools/fallacies_i18n_hierarchy_apply.py — Python 3 stdlib, same byte-targeted discipline as mnemonics_to_latin.py (chore(i18n): mnémoniques Virtues — normalisation (DEFER post-tag, scope à arbitrer) #654): BOM preserved, CRLF, QUOTE_MINIMAL, only empty target cells change. Re-derives the canonical FR→EN map at apply time (never hardcoded). Modes: --dry-run (default), --apply (gated), --report.
  • tools/test_fallacies_i18n_hierarchy_apply.py — 11 unit tests, all PASS: canonical-map derivation, conflict detection, plan building (3-col/partial/novel/no-FR-key/full-row), apply round-trip (BOM+CRLF preserved, never overwrites filled cells), + real-CSV grounding (asserts 144 cells = 48×3, 0 conflict, 0 novel on master).
  • docs/taxonomy/i18n-hierarchy-apply-spec.md — the unified spec: gap, 6-tuple canonical map, script usage, 5 validation gates, post-tag apply procedure, impact, relationship to the link_fr→link_en gap (24 URLs, human-research, out of scope).

Dry-run on 7ebeda18 (the report)

144 cells (48 rows × 3 EN columns), 0 conflict, 0 novel key, canonical map 63 FR keys (consensus). The 6 gap FR keys → tuples:

  • Jeu de pouvoir (33) → Influence / Psychological manipulation / Power games
  • Conditionnement (6) → Influence / Psychological manipulation / Conditioning
  • Mensonge (4) → Cheating / Spin doctoring / Lying
  • Langage persuasif (2) → Influence / Rhetorical device / Loaded language
  • Ambiguïté narrative (2) → Misleading language / Ambiguity / Narrative ambiguity
  • Repoussoir (1) → Influence / Appeal to emotion / Foil

Validation gates (enforced in code, abort exit 2)

  1. Re-derive mapping at apply time (no hardcoded tuple) 2. Conflict (>1 tuple per FR key → abort) 3. Novel key (FR value absent from map → abort) 4. Row count preserved 5. BOM + CRLF + QUOTE_MINIMAL byte-preserved.

Post-tag apply = one command

python tools/fallacies_i18n_hierarchy_apply.py --csv <PATH> --apply (after dry-run confirms 144/0/0 + tests pass). Supersedes #712 + #716 as the single authoritative apply spec.


DoD

Item Status
One unified spec (supersedes #712 + #716) docs/taxonomy/i18n-hierarchy-apply-spec.md
Gated byte-targeted script (#654 discipline) tools/fallacies_i18n_hierarchy_apply.py
Validation gates documented + enforced in code ✅ 5 gates, exit 2 on any failure
Unit tests (synthetic + real-CSV grounding) ✅ 11/11 pass (144 cells, 0 conflict, 0 novel)
Release freeze respected ✅ 0 write Cards/, 0 --apply execution

Gate boundaries (HARD — spec + gated script, NOT executed)

  • ❌ No prod CSV write, no build, no prod test, no OWL regen.
  • ❌ No --apply execution during release freeze.
  • ✅ Script + unit tests ship; dry-run on real CSV produces the 144-cell / 0-conflict report.

Relates: dispatch h2utyb (PRIMARY), #712, #716, #654 (byte-targeted discipline), #587 (CSV hygiene), #707 §1. Base 7ebeda18.

🤖 Generated with Claude Code

Your and others added 2 commits July 6, 2026 08:48
#712 + #716 consolidated)

Consolidates the two data-quality inventories — #712 family-gap (Family/Subfamily empty) + #716
subsubfamily-gap (Subsubfamily empty, same 48 rows) — into ONE post-tag apply spec + gated
byte-targeted script. Dispatch h2utyb PRIMARY (ai-01 2026-07-06 07:09), base master 7ebeda1.
GATED: 0 write to prod CSV (release freeze on Cards/ until v0.9.0 tag). Script + unit tests ship
and run; --apply on prod is post-tag.

The 48 rows are a pure i18n-propagation gap: French Soussousfamille filled but all three English
hierarchy columns (Family/Subfamily/Subsubfamily) empty. Fix is 100% mechanical — each row's FR key
maps to exactly one canonical (Family, Subfamily, Subsubfamily) EN tuple (100% consensus, 0 conflict).
The #712 apply would have filled 2 columns and missed the third; this does all three in one pass.

Files:
- tools/fallacies_i18n_hierarchy_apply.py — Python 3 stdlib, same byte-targeted discipline as
  mnemonics_to_latin.py (#654): BOM preserved, CRLF, QUOTE_MINIMAL, only empty target cells change.
  Re-derives the canonical map at apply time (never hardcoded). Modes: --dry-run (default), --apply
  (gated), --report.
- tools/test_fallacies_i18n_hierarchy_apply.py — 11 unit tests (all PASS): canonical-map derivation,
  conflict detection, plan building (3-col/partial/novel/no-FR-key/full-row), apply round-trip
  (BOM+CRLF, never overwrites filled cells), + real-CSV grounding (asserts 144 cells = 48x3, 0
  conflict, 0 novel on master).
- docs/taxonomy/i18n-hierarchy-apply-spec.md — the unified spec: gap definition, 6-tuple canonical
  map, script usage, 5 validation gates (re-derive/conflict/novel/row-count/byte-preserve), post-tag
  apply procedure, impact, relationship to the link_fr->link_en gap (24 URLs, human-research,
  out of scope).

Validation gates (enforced in code, abort exit 2): re-derive mapping at apply, conflict (>1 tuple per
FR key), novel key (FR value absent from map), row count preserved, BOM+CRLF+QUOTE_MINIMAL.
Dry-run on 7ebeda1: 144 cells (48x3), 0 conflict, 0 novel, canonical map 63 FR keys consensus.

Post-tag apply = one command (--apply), same discipline as #654 --apply. Supersedes #712 + #716 as
the single authoritative apply spec.

Read-only this PR: 0 write Cards/, 0 build, 0 prod test, 0 OWL regen. Reproducible: python
tools/fallacies_i18n_hierarchy_apply.py (dry-run) + python tools/test_fallacies_i18n_hierarchy_apply.py.

Dispatch h2utyb (PRIMARY). Base 7ebeda1.

Co-authored-by: Claude-Code <noreply@anthropic.com>
…ispatch h2utyb TERTIAIRE)

Applies the #712/#716 i18n-propagation-gap method to the other two Cards/ datasets. These use
semantic name pairs (not _fr/_en suffix), so FR↔EN pairs are enumerated explicitly. Result: 0
derivable gap in either — Fallacies is the ONLY Cards/ dataset with an i18n-propagation hierarchy
gap.

Scenarii (167 rows, 8 FR→EN pairs: catégorie↔category, sous-catégorie↔subcategory, titre↔title,
baratineur↔smoothTalker, piocheur↔drawer, contexte↔context, enjeu↔issue, suggestion↔suggestion_en):
0 gap across all 8. Confirms Scenarii 100% translated (8 fields × 4 langs).

Rules (15 rows, Text↔Text_en): 0 gap (consistent with #306 PT row-1 cover fix).

Reproducible via scenarii_rules_gap_scan.py (scratchpad). Closes TERTIAIRE: the Fallacies hierarchy
gap is the only i18n-propagation gap in Cards/.

Dispatch h2utyb (TERTIAIRE). Base 7ebeda1.

Co-authored-by: Claude-Code <noreply@anthropic.com>
@jsboige
jsboige merged commit 3cf7982 into master Jul 6, 2026
3 checks passed
@jsboige
jsboige deleted the tools/i18n-hierarchy-apply-spec branch July 6, 2026 09:55
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