Skip to content

fix(qa): per-CardSet detector thresholds for Rules calibration (#412 follow-up) - #431

Merged
jsboige merged 2 commits into
masterfrom
fix/visual-qa-calibration
Jun 3, 2026
Merged

fix(qa): per-CardSet detector thresholds for Rules calibration (#412 follow-up)#431
jsboige merged 2 commits into
masterfrom
fix/visual-qa-calibration

Conversation

@jsboige

@jsboige jsboige commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Summary

Follow-up to PR #412 (mechanical QA harness). Per ai-01 calibration finding: flat detector thresholds over/under-flag on Rules cards.

Problem

  • blank-ratio threshold 65% flags 23/24 Rules cards (false positive) — Rules have white backgrounds, so high blank-ratio is natural
  • bottom-saturation threshold 85% never triggers — max observed on saturated rules_23 is ~18%

Fix

Per-CardSet threshold dictionary:

CardSet blank-ratio bottom-sat
Rules 92% 12%
Virtues 65% 25%
Fallacies-Web 65% 25%
Scenarii 65% 25%
Default 65% 85%

Changes

Test Results

  • 148 pass / 0 fail / 5 skip (main suite — unchanged)
  • 5/6 visual tests pass (1 skip = no Target/ in Debug CI — existing)

Related

Your and others added 2 commits June 3, 2026 05:03
Read-only terminological consistency analysis across 8 languages:

- Fallacies: 0 inconsistencies (8 families, 21 sub-families, 63 sub-sub-families)
- Scenarii: 25 inconsistencies (PT case/translation variants in categories)
- Virtues: 21 inconsistencies (AR/FA/ZH/ES/RU outlier variants in families)
- Rules: 0 inconsistencies (heading structure consistent across 8 languages)
- Coverage: 100% across all content fields for all datasets

Total real inconsistencies: 46 (outlier records in minority translations).
Scenarii role columns (baratineur/piocheur) confirmed as FALSE POSITIVE
(character names, not terminology).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…follow-up)

Rules cards have white backgrounds → blank-ratio naturally high (65-95%)
causing 23/24 false positives with flat 65% threshold. Bottom-saturation
max observed ~18% on saturated rules_23 → 85% threshold never triggers.

Per-CardSet thresholds:
- Rules: blank-ratio 92%, bottom-sat 12%
- Others (Virtues, Fallacies-Web, Scenarii): 65% / 25%

Raw values still exposed in pivot tables for #250 Phase 1 analysis.

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

§2bis updated post-recalibration (#431 merged e9600c0). Replaces the stale
pre-recalibration caveat (2834, global 65/85 thresholds, "po-2024 follow-up
pending") with the fresh per-CardSet × per-detector breakdown from the
recalibrated run (2026-06-03, 3905 imgs):

- Construction-signature table: each detector flags by card construction, not
  defect. White-bg cards (Rules/Scenarii) → WhiteBand+blank-ratio ~96% noise;
  colored-bg (Fallacies-Web/Virtues) → blank-ratio clean, bottom-sat the signal.
  Only discriminant detector = bottom-sat, read per-CardSet.
- #188 headline: WhiteBand clean on colored cards (Fallacies-Web 0, Virtues 37
  scattered singletons, no 8-lang cluster) → no white-band regression on the
  cards #188 affected.
- True exception list (bottom-sat): Rules rules_23 = #250 FIX 2 (proposed);
  Scenarii ~7 dense cards saturating ~43% uniformly across all 8 langs =
  card-intrinsic, NOT translation (new eye point); Virtues zh/ru/es/pt
  length-overflow cluster = #316/#353 family (PR #400 RU auto-shrink).

Binary summary stays non-discriminant (3219/3905) — value is the per-CardSet
exception filter, not the binary verdict.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jun 4, 2026
…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>
jsboige added a commit that referenced this pull request Jun 5, 2026
…SS remap (#250, supersedes #437) (#438)

* fix(rules): editorial restructure Tarot Rules 24→15 cards + 15-card CSS 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>
@

* fix(rules): mirror 3 FR paragraph moves to 7 translation languages (#250)

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>

* fix(rules): bound .texte so dense Rules cards auto-shrink instead of 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>

* docs(rules): correct false "0px overflow" claim in #250 validation dossier

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>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant