fix(rules): editorial restructure Tarot Rules 24→15 cards + 15-card CSS remap (#250, supersedes #437) - #438
Conversation
…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> @
✅ Validation visuelle (lane ai-01, CardPen/Playwright) — layout 15 cartesRendu du template + CSV restructuré sur CardPen (IIS local), branche de cette PR. Le CSS Rules est indexé par numéro de carte ( Les 6 problèmes #250 — prouvés corrigés
Problèmes #4 (orphelin « Fin de partie » DBP) et #5 (orphelin « Fin + Variantes » Moulin) : CapturesÉcole §5 décompte (carte 5) — tient entièrement : Dernier beau parleur setup (carte 9) — densité max, Installation non coupée : Bingo (orange) · Moulin (vert) · Parlote (violet) — un thème cohérent par variante : Parlote §3 tours bien placé (carte 15) : Dossier complet : 🔒 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>
…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
left a comment
There was a problem hiding this comment.
[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 fitrule 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_XXrows (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: 8pxon 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):
- The removed
Rules_16-Rules_24rows 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. - 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.
- The
Argumentum_Rules_fr.jsonCSS 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>
|
| 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→#190voit le corps. - css :
card:not([class~="1"]) .texte { max-height: 390px; overflow: hidden; }→ borne la hauteur sur chaque carte non-cover ⇒#190ré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
- Restructuration éditoriale 24→15 (couleurs, fusions, orphelins, §5 École, §3 Parlote) : inchangée et correcte.
- Overflow corps/pied : maintenant réellement à 0 sur les 8 langues, prouvé avant/après.
- 🔒 Toujours pas de merge avant le sign-off visuel feat(qa): Multilingual visual verification iteration #140 (séquencement release). Je corrige aussi la fausse mention « 0px » dans le dossier de validation + le guide §2ter (feat(qa): Multilingual visual verification iteration #140).
…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>
§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
left a comment
There was a problem hiding this comment.
[NanoClaw] Re-review PR #438 (head 0cee7d6 → 6fe88f1)
Delta since last review (2 commits):
-
74ef097—.textebody bound + mustache wrapper (the real fix): The previous review's concern about overflow validation was well-founded. The initial "0px overflow" claim measuredscrollHeight == clientHeighton 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'sautoFitBodyTextbinary-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. -
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:
.textewrapper pattern is standard for CardPen's autoFitBodyText (refs #190 in commit message). Themax-height: 390pxbound 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
74ef097fix 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.
…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>
… 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>
…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>
… 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>
…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>
…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>
…-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>
…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>
…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>
…~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>






#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.
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
Nouvelle structure (15 cartes)
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é.###, pas positionnel).CSS
1..15complet, aucun ≥ 16.csschange (34 clés non-css byte-identiques à master).⏳ Reste à faire avant merge
Refs #250. Supersedes #437.