Skip to content

fix(rules): editorial restructure Tarot Rules 24→15 cards + 15-card CSS remap (#250, supersedes #437) - #438

Merged
jsboige merged 6 commits into
masterfrom
fix/250-rules-editorial
Jun 5, 2026
Merged

fix(rules): editorial restructure Tarot Rules 24→15 cards + 15-card CSS remap (#250, supersedes #437)#438
jsboige merged 6 commits into
masterfrom
fix/250-rules-editorial

Conversation

@jsboige

@jsboige jsboige commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

#250 — rééquilibrage éditorial complet des cartes Rules (Tarot) : 24 → 15 cartes

Remplace / SUPERSEDE #437 (qui ne corrigeait que le point 3, couleurs, sur un layout 24 cartes). Comme la restructuration éditoriale change le nombre de cartes (24 → 15), le CSS 24-cartes de #437 devient caduc. Cette PR traite tous les problèmes de layout Rules signalés par jsboige sur #250 en une seule passe : restructuration du contenu CSV + remap CSS 15-cartes cohérent.

Reconnaissance franche : ces régressions de mise en page (§5 École coupée, pages-titre quasi vides, orphelins « Fin de partie », Parlote saturée, couleurs cassées) traînaient depuis ~1 mois. C'est un trou réel dans la validation visuelle. Cette PR vise à les fermer toutes ensemble, avec preuve par régén.

Modèle de carte (rappel)

Les cartes Rules du Tarot sont 1 ligne CSV = 1 carte (pas de pagination runtime). Les coupures de carte sont donc encodées dans les données. Rééquilibrer = restructurer les lignes du CSV. Le CSS colore/labellise par indice de carte ([class~="N"], N = position 1-based) → indépendant de la langue → une seule édition CSS couvre les 8 langues, et un seul template (Argumentum_Rules_fr.json) sert les 8 langues.

Les problèmes #250 traités

# Problème signalé Correctif
1 École : §5 décompte coupé sur 2 cartes Déplacement de 2 paragraphes (suite saynète → fin carte 4 ; « En cas d'égalité… » → fin carte 5) pour que §5 tienne entièrement sur la carte 5
2 Variantes : pages-titre quasi vides (cover seule) Fusion cover + Matériel + Résumé + Installation en 1 carte de setup par variante (Bingo/DBP/Moulin/Parlote). École garde son art pleine page en exception.
3 Couleurs cassées (flips au milieu d'une variante, Parlote en blanc) Remap CSS des 3 familles de sélecteurs vers les frontières 15-cartes réelles et contiguës
4 DBP : orphelin « Fin de partie » Fusionné dans la carte gameplay DBP
5 Moulin : orphelin « Fin de partie + Variantes » Fusionné dans la carte gameplay Moulin
6 Parlote : §3 « tours de jeu » mal placé Déplacement de §3 vers la dernière carte Parlote

Nouvelle structure (15 cartes)

# Variante Contenu
1 École Cover art (pleine page)
2 École Matériel + Résumé
3 École Installation
4 École §1 / §2 / §3 (+ suite saynète)
5 École §4 jury + §5 décompte entier (+ égalité)
6 École §6 pioches + Variantes
7 Bingo Setup fusionné (cover + matériel + résumé + installation)
8 Bingo Déroulé de jeu
9 Dernier beau parleur Setup fusionné
10 Dernier beau parleur Déroulé + fin de partie
11 Moulin à baratin Setup fusionné
12 Moulin à baratin Déroulé + fin de partie + variantes
13 Parlote coinchée Setup fusionné
14 Parlote coinchée §1 piocheur + §2 enchères
15 Parlote coinchée §3 tours de jeu + §4 décompte

Couleurs 15-cartes (un seul thème cohérent par variante, toutes cartes comprises) :
École 2-6 violet · Bingo 7-8 orange · DBP 9-10 bleu · Moulin 11-12 vert · Parlote 13-15 violet clair.

Garantie d'intégrité du contenu (invariant prouvé)

Une fusion ne fait que supprimer une frontière de carte ; un déplacement de paragraphe ne fait que déplacer une frontière (le texte garde sa position globale). Donc pour chaque colonne, le \n\n-join des cellules non vides doit être byte-identique avant/après. Le script l'asserte sur les 9 colonnes de contenu (FR + en/ru/pt/ar/es/zh/fa + print_and_play) → invariant OK, aucun caractère de contenu perdu ou ajouté.

  • Densité de carte réduite : longueur max 1573 (avant : 1829) → bon signal que les cartes fusionnées tiennent.
  • Fusions = concat cellule-entière → appliquées d'office aux 8 langues (sûr).
  • Déplacements de paragraphe = FR uniquement ici (les comptes de paragraphes désynchronisent entre langues) ; les 7 autres langues seront mises en miroir par po-2023 (ancrage par titre ###, pas positionnel).

CSS

  • Indices présents après remap = 1..15 complet, aucun ≥ 16.
  • JSON valide, seule la valeur css change (34 clés non-css byte-identiques à master).

⏳ Reste à faire avant merge

Refs #250. Supersedes #437.

jsboige and others added 3 commits June 4, 2026 03:50
…SS remap (#250)

Treats ALL #250 Rules layout problems in one pass; supersedes #437 (CSS-only,
24-card). Card model = 1 CSV row = 1 card, so rebalancing = restructuring rows.

- #250.1 École: move 2 paragraphs so §5 décompte fits entirely on card 5
- #250.2 covers: merge cover+Matériel+Résumé+Installation into 1 setup card per
  variant (Bingo/DBP/Moulin/Parlote); École keeps full-page art cover
- #250.3 colours: remap CSS [class~=N] selectors to real 15-card boundaries
- #250.4 DBP: merge orphan "Fin de partie" into gameplay card
- #250.5 Moulin: merge orphan "Fin de partie + Variantes" into gameplay card
- #250.6 Parlote: move §3 "tours de jeu" to last Parlote card

Content-preservation invariant proven: for every column the \n\n-join of
non-empty cells is byte-identical before/after (no content lost/added). Peak
card length reduced 1829→1573. Merges applied to all 8 langs; FR paragraph
moves mirrored on 7 other langs by po-2023 (heading-anchored).

CSS: indices now 1..15, only css value changed (34 non-css keys byte-identical).
Visual validation by FR Rules régén pending before merge.

Refs #250. Supersedes #437.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fix(rules): tighten Argumentum H1 on variant setup cards so dense DBP setup fits (#250)

The 4 merged variant setup cards (7/9/11/13) carry the full-size "Argumentum"
H1 (32px, ~83px vertical footprint) plus 4 sections. The densest — DBP setup
(card 9) — overflowed by 14px, clipping the last Installation line. Reducing the
H1 vertical margins (21.44px -> 6px/8px) on those 4 cards frees ~28px; all 15
cards now fit with zero overflow (verified live + baked render). École cover
(card 1) keeps its full-page art. Index-based selector => covers all 8 languages.

Only the css value of Argumentum_Rules_fr.json changes (1 JSON line).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
docs(rules): add #250 visual validation dossier (15-card layout, 0px overflow) (#250)

CardPen render proof (ai-01 Playwright/IIS) for PR #438: 6 representative cards
covering all 6 reported Rules layout problems + the card-9 fit fix. Pixel-measured
0px overflow on all 15 cards. Index-based CSS => FR render validates layout/colours
for all 8 languages.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
@myia-ai-01

Copy link
Copy Markdown

✅ Validation visuelle (lane ai-01, CardPen/Playwright) — layout 15 cartes

Rendu du template + CSV restructuré sur CardPen (IIS local), branche de cette PR.
Mesure pixel sur les 15 cartes : scrollHeight == clientHeight partout → 0 px d'overflow.

Le CSS Rules est indexé par numéro de carte ([class~="N"]) → indépendant de la langue :
ce rendu FR valide la mise en page, les couleurs et le tenir-sur-la-carte pour les 8 langues.
Le contenu par langue (miroir des déplacements de paragraphes) reste la tâche po-2023.

Les 6 problèmes #250 — prouvés corrigés

Carte Problème corrigé
5 — École §4 jury + §5 décompte #1 : §5 décompte tient entièrement sur 1 carte (avec « En cas d'égalité… »)
7 — Bingo setup #2 plus de page-titre vide · #3 orange cohérent
9 — Dernier beau parleur setup #2/#3 (bleu) · fit : carte la plus dense, dernière ligne Installation non coupée (overflow 14 px corrigé en resserrant le H1 « Argumentum »)
11 — Moulin setup #2/#3 (vert)
13 — Parlote setup #2/#3 (violet — Parlote n'est plus en blanc, c'était la régression couleurs)
15 — Parlote §3 tours + §4 décompte #6 : « 3. Les tours de jeu » bien placé en fin de variante

Problèmes #4 (orphelin « Fin de partie » DBP) et #5 (orphelin « Fin + Variantes » Moulin) :
fusionnés dans les cartes gameplay 10 / 12, invariant de contenu byte-identique prouvé sur les 9 colonnes.

Captures

École §5 décompte (carte 5) — tient entièrement :
card05

Dernier beau parleur setup (carte 9) — densité max, Installation non coupée :
card09

Bingo (orange) · Moulin (vert) · Parlote (violet) — un thème cohérent par variante :
card07
card11
card13

Parlote §3 tours bien placé (carte 15) :
card15

Dossier complet : docs/investigations/2026-06-04-rules-250-validation/.

🔒 Pas de merge avant le sign-off visuel #140 (séquencement release).

)

Mirror ai-01's editorial paragraph moves (commit 6fc3644) from FR Text
to Text_en, Text_ru, Text_pt, Text_ar, Text_es, Text_zh, Text_fa:

1. École move 1: saynète continuation from card 5 → end of card 4
2. École move 2: tie-breaking paragraph from card 6 → end of card 5
3. Parlote move: 'tours de jeu' section from card 14 → beginning of card 15

Invariant verified: \n\n-join byte-identical before/after for all 7 columns.
1 file changed, 172 insertions, 172 deletions (moves only, no content change).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jun 4, 2026
…er régén

Régén 2026-06-04 (Debug, combined #438+#439 branch). Rendus extraits du
harvest frais (source de vérité). EN 2→7, PT 0→7, RU 0→7 familles, chacune
localisée. Back: rend la taxonomie complète mais affiche les clés FR
(pré-existant, hors #435) → question éditoriale ouverte pour jsboige.
Table de correspondance des 7 familles ×4 langues pour vérif RU/PT.

Refs #435.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[NanoClaw] Review PR #438

Summary: Editorial restructure of the Argumentum card-game rules deck from 24 rule rows to 15, with a corresponding CSS card-number remap. The PR also adds visual validation evidence (Playwright screenshots, pixel-level overflow checks).

What changed:

  • Cards/Rules/Argumentum Rules - Cards.csv (+626/-491): Merged rule rows across 9 language columns. Each of the 4 game variants (Bingo, Dernier Beau Parleur, Moulin, Parlote) had its separate "Installation" / "Gameplay" / "End" rows merged into a single card per variant, eliminating standalone title/setup cards that previously caused empty-card overflow issues (#250 problems 2-5).
  • Cards/Rules/Argumentum_Rules_fr.json (+1/-1): CSS block rewritten to remap card class selectors from the old 18-card layout (e.g. Moulin 12-14, DBP 9-11, Parlote 15-18) to the new compact 15-card layout (Moulin 11-12, DBP 9-10, Parlote 13-15). Bingo unchanged (7-8). Added a #250 fit rule tightening H1 margins on merged setup cards (7/9/11/13). Variant header footers updated to match new card numbers.
  • docs/investigations/2026-06-04-rules-250-validation/ (5 PNG + README): Visual proof of overflow fix on all 15 cards, with a structured table mapping each screenshot to the specific #250 problems it validates.

Structural analysis:

  • Old layout: 24 Rules_XX rows (1 cover + 5 Ecole + 2 Bingo + 3 DBP + 3 Moulin + 4 Parlote + misc setup rows). New layout: 15 rows (1 cover + 5 Ecole + 2 Bingo + 2 DBP + 2 Moulin + 2 Parlote + 1 shared variants section). Removed rows: Rules_16 through Rules_24 (variant-specific setup/gameplay/end-of-game rows for Moulin and Parlote, plus standalone installation rows). These are now inlined into their parent variant cards.
  • The "Installation" sections for Bingo (card 7), DBP (card 9), Moulin (card 11), and Parlote (card 13) now contain setup + gameplay + scoring in a single card, eliminating the orphan sections that caused overflow.
  • Minor content additions in Ecole (Rules_05: jury paragraph; Rules_06: draw paragraph) and a new paragraph in the French skit section about embromador/piocheur conduct.
  • 8 languages affected; the CSV merge was applied consistently across all language columns with language-appropriate section headers.

CSS remap correctness:

  • Card-number shift is consistent: DBP 9-11 -> 9-10, Moulin 12-14 -> 11-12, Parlote 15-18 -> 13-15. All color groups, variant headers, and fallback selectors updated to match.
  • The new margin-top: 6px; margin-bottom: 8px on H1 for cards 7/9/11/12 addresses the DBP overflow documented in #250.
  • No stale references to old card numbers (16-18) remain in the CSS.

Concerns (minor, non-blocking):

  1. The removed Rules_16-Rules_24 rows contained game-rule content (Moulin tricks, bidding, coinche rules, scoring). While the investigation README claims "byte-identical content invariant," the actual diff shows these paragraphs were moved/merged into the new compact variant cards. A full byte-comparison verification (not just structural claim) would strengthen confidence that no rule text was accidentally dropped during the merge.
  2. The PR title says "24 to 1" but the actual change is 24 rows to 15. The PR body correctly states "24 to 15 cards" -- the title appears truncated or inaccurate.
  3. The Argumentum_Rules_fr.json CSS is duplicated per-language column in the CSV. This PR changes the FR column only; the other 7 language columns still reference the FR template's card numbers via the shared JSON. If the JSON drives rendering for all languages (as the README suggests), this is correct. But worth confirming the other CSV columns don't embed their own per-card CSS that would also need updating.

Verdict: Clean editorial restructure with proper CSS remap and visual validation. The minor concerns above are informational and do not block merge.

…overflowing footer (#250)

jsboige reported Rules card images with overflow regressions on the stylized
bullet-point body running into the footer band. Root cause: the Rules body
markdown was rendered in a bare <div> with no `.texte` wrapper, so CardPen's
#190 autoFitBodyText (frame.js) never engaged — it bails early when `.texte`
is absent and, even when present, only shrinks when `.texte` has a BOUNDED
clientHeight. Dense cards therefore grew past the absolute footer band
(.colorPalette / .pageNumber / variant labels).

Fix (two surgical edits, source-of-truth JSON template):
- mustache: wrap the body in `.texte > .desc_fr` so #190 sees the body and
  the localization field tokens resolve as before.
- css: `card:not([class~="1"]) .texte { max-height: 390px; overflow: hidden; }`
  bounds the body height on every non-cover card so #190 binary-searches the
  font factor down to fit; the cover (variant 1) is excluded — its art lives
  on bleed/safe backgrounds, not in `.texte`.

Validated on the live CardPen engine (Playwright harness, real engine #190 +
domtoimage capture) against the canonical dataset CSV
(Cards/Rules/Argumentum Rules - Cards.csv), 15 cards x 8 languages.

BEFORE (footer collisions, body bottom under footer top):
- FR  #9 +20px, #15 +22px
- RU  #9 +12px, #12 +23px
- PT  #4 +31px, #9 +28px, #10 +39px, #12 +95px
- EN  none
AFTER: zero non-cover collisions across fr/en/ru/pt/es/ar/zh/fa; cover
unchanged. Worst case (PT #12, +95px) now renders cleanly with the body
auto-shrunk above the footer (eyeballed PNGs).

This is the check the #412/#431 mechanical harness missed (it never drove the
live #190 engine), which is why the "0px overflow" claim in the #140 dossier
was wrong; that claim is corrected in a follow-up.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@myia-ai-01

Copy link
Copy Markdown

⚠️ Correction de la validation overflow + commit complémentaire 74ef0971

Mon commentaire de validation précédent était faux sur un point précis et je le corrige franchement : la mesure « scrollHeight == clientHeight partout → 0 px d'overflow » ne mesurait pas le bon overflow.

Ce qui clochait dans la mesure

scrollHeight == clientHeight sur le conteneur de corps est trivialement vrai quand le conteneur n'a aucune hauteur bornée : il grandit pour épouser son contenu, donc scroll == client par construction — pendant que le texte déborde quand même dans la bande de pied de carte absolue (.colorPalette / .pageNumber / labels de variante, en position:absolute). La bonne mesure est bas-du-corps vs haut-du-pied, pas l'auto-fit du conteneur.

jsboige avait raison : il a vu des cartes Rules avec overflow dans les bullet points stylisés. La restructuration 24→15 de cette PR réduit la densité (bon), mais n'élimine pas les collisions résiduelles de pied de carte.

Mesure correcte — moteur CardPen live (#190 autoFitBodyText + domtoimage), CSV dataset canonique, 15 cartes × 8 langues

AVANT (template restructuré de cette PR, sans le hook .texte) — collisions corps/pied réelles :

Langue Cartes en collision (px sous le pied)
FR #9 +20px, #15 +22px
RU #9 +12px, #12 +23px
PT #4 +31px, #9 +28px, #10 +39px, #12 +95px
EN aucune

APRÈS (commit 74ef0971) : 0 collision non-cover sur fr/en/ru/pt/es/ar/zh/fa. Cover (variante 1) inchangée.

Le correctif (74ef0971, 2 lignes)

Le corps Rules était rendu dans un <div> nu → le #190 autoFitBodyText de frame.js ne s'activait jamais (il bail si .texte absent, et ne réduit que si .texte a un clientHeight borné).

  • mustache : corps enveloppé en .texte > .desc_fr#190 voit le corps.
  • css : card:not([class~="1"]) .texte { max-height: 390px; overflow: hidden; } → borne la hauteur sur chaque carte non-cover ⇒ #190 rétrécit la police jusqu'à tenir ; cover exclue (son art est sur bleed/safe, pas dans .texte).

Pire cas (PT #12, +95px) désormais rendu proprement, police auto-réduite au-dessus du pied (PNG eyeballés). C'est exactement le check que le harness mécanique #412/#431 manquait — il ne pilotait jamais le moteur #190 live.

État

…ssier

The dossier README claimed "0 px d'overflow partout (scrollHeight ==
clientHeight)". That measured container auto-fit (trivially scroll==client
when height is unbounded), not body-vs-footer collision. The live #190 engine
check (real CSV, 8 langs) found residual collisions on the restructured
template — FR/RU/PT, worst PT #12 +95px — now resolved by 74ef097 (.texte
hook + bound). README updated with the corrected before/after data.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jun 4, 2026
§2ter stated "0 px overflow FR (scrollHeight == clientHeight)" for the
restructured Rules layout. That measured container auto-fit (trivially true
without a bounded height), not body-vs-footer collision. The live #190 engine
check (real CSV, 8 langs) found residual collisions even after the 24→15
restructure — FR/RU/PT, worst PT #12 +95px — now fixed by 74ef097 (.texte
hook + bound, on PR #438's branch). §2ter updated with the corrected
before/after data. The restructure itself (colours/merges/orphans) stands.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[NanoClaw] Re-review PR #438 (head 0cee7d66fe88f1)

Delta since last review (2 commits):

  1. 74ef097.texte body bound + mustache wrapper (the real fix): The previous review's concern about overflow validation was well-founded. The initial "0px overflow" claim measured scrollHeight == clientHeight on an unbounded container (trivially true), not actual body-vs-footer collision. The live CardPen #190 engine revealed residual collisions across FR (#9 +20px, #15 +22px), RU (#9 +12px, #12 +23px), and PT (#4 +31px, #9 +28px, #10 +39px, #12 +95px). Fix: wrap body in .texte > .desc_fr (mustache, 1 template) + card:not([class~="1"]) .texte { max-height: 390px; overflow: hidden; } (CSS, 1 rule). This activates CardPen's autoFitBodyText binary-search to shrink the font factor until the body fits. Cover (card 1) correctly excluded. Post-fix: zero non-cover collisions across all 8 languages.

  2. 6fe88f1 — README correction: Honest correction of the false "0px overflow" claim, now documenting the real before/after collision data. Also identifies why the mechanical harness (#412/#431) missed this: it never drove the live #190 engine.

Assessment of the fix:

  • .texte wrapper pattern is standard for CardPen's autoFitBodyText (refs #190 in commit message). The max-height: 390px bound is appropriate for the Rules card geometry (leaves room for H1/H2 headings above + footer band below).
  • The fix is confined to the source-of-truth template (Argumentum_Rules_fr.json) — one JSON file, two surgical edits (mustache + css). No CSV changes needed.
  • Card 1 (cover) correctly excluded via card:not([class~="1"]) — its art lives on bleed/safe backgrounds, not in .texte.

Security scan: Clean. No secrets, no dynamic script injection, no eval. Only CSS rules, mustache template HTML, CSV text content, and a documentation README.

Previous concerns — status:

  • Concern 1 (byte-identical invariant): The PR now has a proper 74ef097 fix that the invariant script couldn't catch (it only checks CSV content, not rendered overflow). The fix addresses this gap at the engine level.
  • Concern 2 (truncated title): The GitHub title now reads the full description matching the body. No longer truncated.
  • Concern 3 (per-language CSS): Confirmed unchanged — one JSON template drives all 8 languages via index-based selectors. Correct.

Verdict: The overflow regression discovered post-initial-review is now properly fixed at the template level with engine-level validation across all 8 languages. The honest README correction strengthens confidence. No remaining concerns. Ready for visual sign-off per PR checklist.

jsboige added a commit that referenced this pull request Jun 4, 2026
…r GATE step-2

Temporary override: all GitHub raw URLs changed from Argumentum/master/
to Argumentum/integ-140-regen/ so Release mode pipeline downloads the
fixed Rules template (overflow fix #438) and Memo selector fix (#439)
instead of stale master assets.

This commit is ephemeral — will be reverted once #438/#439 are merged
to master and master URLs become correct.

Files changed:
- AssetConverterConfig.cs: 5 CSV ReleaseFilePath URLs
- WebBasedGeneratorConfig.cs: ~26 template JsonFilePathRelease URLs
- HarvestManager.cs: githubBaseUrl for asset path rewriting
- FallacyMindMapCreatorConfig.cs: 2 mindmap HTML template URLs
- VirtueMindMapCreatorConfig.cs: 2 virtue mindmap HTML template URLs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jsboige
jsboige merged commit 3a39199 into master Jun 5, 2026
3 checks passed
jsboige added a commit that referenced this pull request Jun 5, 2026
… all langs (#435)

The Mémo Face card renders 7/7 families in FR but 2/7 in EN (cognates only:
Influence, Obstruction) and 0/7 in PT/RU. Root cause: CardSetLocalization's
FormatField builds the search pattern as `field}` (one closing brace, no `{{`)
and does a blind template.Replace, so inside `{{#ifCond Famille "==" text_fr}}`
only `text_fr` (followed by `}}`) is localized while `Famille` (followed by a
space) is not. The selector then compares an un-localized FR family label to a
localized text_xx value and matches only cross-language cognates.

Fix: add one space before `}}` after the `text_fr` operand (`text_fr }}`) so it
is space-anchored too -> neither operand is localized -> the selector compares
FR-vs-FR in every language = byte-identical row selection to FR (zero FR change),
now language-invariant. Display placeholders ({{Famille}}, {{desc_fr}}...) keep
their `}}` and still localize. text_fr is selector-only (never displayed), so
keeping it FR has no visible effect. Applied to all 4 selectors: Face (1) + Back
(3 hierarchy levels, same bug class).

Translations already exist in the taxonomy (data-verified) -> this is a selector
bug, not a missing-translation gap. Authoritative confirmation pending a Mémo
régén across 8 langs (held, like #438). Dossier with before-renders + data proof
under docs/investigations/2026-06-04-memo-435-i18n-gap/.

Refs #435.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jun 5, 2026
…er régén

Régén 2026-06-04 (Debug, combined #438+#439 branch). Rendus extraits du
harvest frais (source de vérité). EN 2→7, PT 0→7, RU 0→7 familles, chacune
localisée. Back: rend la taxonomie complète mais affiche les clés FR
(pré-existant, hors #435) → question éditoriale ouverte pour jsboige.
Table de correspondance des 7 familles ×4 langues pour vérif RU/PT.

Refs #435.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jun 5, 2026
… les langues (#435) (#439)

* fix(memo): make family selector language-invariant so Mémo renders in all langs (#435)

The Mémo Face card renders 7/7 families in FR but 2/7 in EN (cognates only:
Influence, Obstruction) and 0/7 in PT/RU. Root cause: CardSetLocalization's
FormatField builds the search pattern as `field}` (one closing brace, no `{{`)
and does a blind template.Replace, so inside `{{#ifCond Famille "==" text_fr}}`
only `text_fr` (followed by `}}`) is localized while `Famille` (followed by a
space) is not. The selector then compares an un-localized FR family label to a
localized text_xx value and matches only cross-language cognates.

Fix: add one space before `}}` after the `text_fr` operand (`text_fr }}`) so it
is space-anchored too -> neither operand is localized -> the selector compares
FR-vs-FR in every language = byte-identical row selection to FR (zero FR change),
now language-invariant. Display placeholders ({{Famille}}, {{desc_fr}}...) keep
their `}}` and still localize. text_fr is selector-only (never displayed), so
keeping it FR has no visible effect. Applied to all 4 selectors: Face (1) + Back
(3 hierarchy levels, same bug class).

Translations already exist in the taxonomy (data-verified) -> this is a selector
bug, not a missing-translation gap. Authoritative confirmation pending a Mémo
régén across 8 langs (held, like #438). Dossier with before-renders + data proof
under docs/investigations/2026-06-04-memo-435-i18n-gap/.

Refs #435.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs(memo): add #435 visual validation — 7/7 families all 4 langs after régén

Régén 2026-06-04 (Debug, combined #438+#439 branch). Rendus extraits du
harvest frais (source de vérité). EN 2→7, PT 0→7, RU 0→7 familles, chacune
localisée. Back: rend la taxonomie complète mais affiche les clés FR
(pré-existant, hors #435) → question éditoriale ouverte pour jsboige.
Table de correspondance des 7 familles ×4 langues pour vérif RU/PT.

Refs #435.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jun 5, 2026
…ation guide) (#440)

* docs(140): add §2ter — #250 Rules + #435 Mémo resolved on branches #438/#439 (#140)

The #140 validation guide §2bis still described the pre-fix Release build
(24-card Rules, "pending re-check until #250 fix", Memo absent). Both are now
fixed and visually validated on feature branches:

- #438: Rules editorial restructure 24→15 cards + 15-card CSS remap, 0px
  overflow FR, 8-lang byte-identical mirror (po-2023 0cee7d6).
- #439: Memo i18n selector fix (text_fr }} space-anchor), 7/7 families in all
  4 langs (EN 2→7, PT 0→7, RU 0→7).

§2ter records the resolved status, flags the Memo Back FR-taxonomy-keys
editorial question for jsboige, and gives the merge→clean-Target régén
sequence so the dossier reflects reality for the Thursday #140 sign-off.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs(140): correct false "0px overflow" claim in §2ter (#250 Rules)

§2ter stated "0 px overflow FR (scrollHeight == clientHeight)" for the
restructured Rules layout. That measured container auto-fit (trivially true
without a bounded height), not body-vs-footer collision. The live #190 engine
check (real CSV, 8 langs) found residual collisions even after the 24→15
restructure — FR/RU/PT, worst PT #12 +95px — now fixed by 74ef097 (.texte
hook + bound, on PR #438's branch). §2ter updated with the corrected
before/after data. The restructure itself (colours/merges/orphans) stands.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jun 8, 2026
…le caveat (#448)

§2ter updated to reflect that #438/#439/#443/#446 are now MERGED on master
(dc01445), not on feature branches. Records the 2026-06-08 full-regen Debug
validation: 6/6 CardSets PASS, Mémo Back localized 8/8 (incl. AR/ES/FA/ZH = no
CSV gap), confirming #446 on the merged deliverable.

Adds a verified caveat: the local Release build (2026-06-02) predates #443/#446,
so its Mémo Back is stale FR (native crop confirms FR subtitle + FR taxonomy).
The final -c Release regen must be re-run on dc01445 with explicit Memo harvest
clobber before any sign-off/tag. §1 build-selection note flagged accordingly.

Refs #140 #134 #443 #446

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jun 10, 2026
…-up) (#450)

* fix(memo): #443 Mémo Back grid — language-invariant control-break grouping

The Mémo Back card collapsed from the spec 7×3×3 taxonomy grid (7 families ×
3 sub-families × 3 sub-sub-families) to an irregular shape. Root cause: the
template grouped the grid via name-coincidence markers
({{#ifCond Famille "==" text_fr}} …) that fired only on rows whose text_fr
happened to equal their own level label. FR rename campaigns (#351 ×27,
#308 ×13) changed text_fr → the coincidences vanished → families collapsed
(Tricherie sub-families = 0, Erreur math/raisonnement = 1, …). The taxonomy
DATA is correct; only the template's grouping was broken.

Fix (lane ai-01 = TEMPLATE, data is fine):
- CardPen main.js: add 3 control-break helpers reading the language-invariant
  FR taxonomy columns (Sous-Famille / Soussousfamille), present in every row
  regardless of render language. They carry NO column token, so the localizer
  (CardSetLocalization.FormatField appends "}}") cannot corrupt the helper call:
    ifFamilyHeader   = Sous-Famille=='' && Soussousfamille==''
    ifSubfamilyHeader= Sous-Famille!=''  && Soussousfamille==''
    ifLeafFirst      = Soussousfamille!='' on first occurrence (control-break)
- Argumentum_Memo_Back_fr.json: swap the 3 name-coincidence conditions for the
  new helpers (display tokens {{Famille}}/{{Sous-Famille}}/{{Soussousfamille}}
  unchanged → localization preserved); fix colorPalette to iterate the rowset
  and emit one swatch per family-root (was fixed indices 0/25/50/…/150, which
  duplicated Influence and omitted Obstruction).

Single shared template → fix propagates to all 8 languages.

Validated three ways on the real injected data (taxonomy WHERE carte∈{1,2},
176 rows): (1) Node + vendored Handlebars → 7 families / 21 sub-families /
63 leaves; (2) OLD-template render proving the regression (10/53, Tricherie=0);
(3) LIVE CardPen engine (Playwright) → 7×3×3 DOM + 7 distinct palette colors
(Obstruction red present, no Influence duplicate) + viewed screenshot.

Refs #443

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(rules): index-independent heading CSS + cover titles (#438 follow-up)

The 24->15 Rules deck restructure (#438) broke the heading CSS, which keyed
banners and number-boxes to card INDEX (nth-of-type + hardcoded content
'01'..'05' + [class~="4"]). After the restructure those indices were wrong:

  1. «Déroulé de la manche» rendered in a colored banner instead of a plain
     big title like «Règles du jeu…».
  2. «Argumentum» rendered big on the sub-game cover cards instead of the rule
     name.
  3. Inconsistent paragraph headers: empty floating number boxes + size
     mismatches on cards 6/10/12/14/15.

Fix (index-independent, semantic headings):
  - h2:first-child = card main title  -> plain, big, no banner
  - other h2       = section sub-head -> plain, thin theme-colored underline
  - h3             = numbered step     -> theme-colored banner; the «1.» number
                     is already in the heading text, so no separate (broken) box
  - removed the leading «# Argumentum» line from the 4 sub-game cover rows
    (Rules_07/09/11/13) across all 8 language columns so «## <rule name>»
    becomes the title; Rules_01 (main cover) keeps «# Argumentum».
  - tightened heading margins/padding so the densest cards do not overflow
    worse than the committed baseline.

Validated live on the real CardPen engine (all 15 cards): zero bannered
titles, covers lead with the rule name, uniform theme-colored step banners;
total text overflow reduced 208px -> 110px vs baseline (cards 11/13 fully
un-clipped, only card 12 +1px = parity).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 3, 2026
…t artefact, variants ARE in repo (#658)

Correction to PR #656's audit-trail note. The original note (and the PR #656
description) stated the 12 NO-MATCH rows were "variant game rules not present in
the repo". That conclusion was WRONG.

Verified against repo (code=truth): the 4 variants ARE present — Rules_07
(Le Bingo mixologie), Rules_09 (Le dernier beau parleur), Rules_11 (Le moulin à
baratin), Rules_13 (La parlote coinchée). The repo holds the full 15-card set.

The 12 NO-MATCH are a layout-alignment artefact: the legacy GSheet used a
24-fine-row layout; the repo uses a condensed 15-card structure (#438/#250
restructure). The row-by-row sentence-overlap matcher could not align GSheet
title-rows against merged repo cards, so it reported NO-MATCH. The 24->15
restructure lost 0 character (16446 FR chars identical, verified by ai-01).

The migration lost no data. The note now documents this correctly.

Root-cause of the error: interpreting a matcher's NO-MATCH signal as
"content absent from repo" without empirically verifying the repo records
exist (pattern [[test-counter-empirical-dotnet-test]]).

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 3, 2026
…s not ported (#662)

Read-only audit of https://dnn.argumentum.myia.io/Règles answering jsboige's
concern (rules not ported to prod). Findings:
- Content: 5/5 rule sets present on prod (FR) — no rule lost (#438/#250 re-paginated
  24→15 without dropping a game). The 4 variants + main game are all published.
- Multilingual: prod is FR-only. <html lang="fr-FR"> hardcoded for all locales,
  ?language= ignored (FR fallback), /XX/Règles all 404, switcher <div class="language">
  empty. The 7 repo translations (en/ru/pt/ar/es/zh/fa) are NOT published on the site.
- Verdict: jsboige's missing-rules concern refuted for content; separate real gap on
  the multilingual axis (DNN content portage, post-tag candidate per #27/#16).

Audit-only, no prod change. Relates ai-01 dispatch msg-20260703T095500-5wdug6,
#636 #490 #134 #140.

Co-authored-by: Claude <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 10, 2026
…~210), no migration needed (#764)

Addendum to 684-translation-manifest.md (#696). Resolves the manifest's own
deferred question ("is it 5 games? do all games have all 6 fields populated?")
with live export #681 ground truth (12-game-rule-content-items.json).

3 corrections, structure unchanged:
- Game count: ~5 (estimate) -> 5 CONFIRMED (entityCount=5, all IsPublished=True).
  Cross-validated vs #662 prod scrape ("5/5 jeux FR présents, 0 rule missing").
- Prose cells: ~30 (assumed full) -> 23/30 populated. The 7 empty are STRUCTURAL
  (3 games have no Variants, 4 games have no Memo card) — not data gaps. No
  fabrication: empty cells stay empty across langs.
- Translation volume: ~210 units -> 161 (prose) + 35 (titles) = ~196, -20% vs
  estimate. Still the dominant portage item, but smaller than planned.

"DB seed/pre-migration" CLARIFIED: no migration needed. The "24-30" was a
CARD-level count (24 pre-repagination #438/#250 -> 15 post), not a game
undercount. The 15 cards map to 5 games (some span multiple cards). The 5
published games ARE the complete intended set (#662: "0 rule missing") —
translation proceeds against them directly, no seeding prerequisite.

The manifest's structure (6 prose fields x 7 langs, Scenarii-style chunking,
gpt-5.5, re-import plan) STANDS — this doc only supersedes its volume figures
and unblocks the source path (export #681 now delivered).

Gate: analysis-only, 0 prod write (export = read-only SELECT). Triggered by
ai-01 dispatch 1gmve4 (primaire). Gated review ai-01.

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.

3 participants