[Bug] A Scorecard slide looks filled in, renders blank, passes the quality gate and exports empty #583

Closed
opened 2026-07-22 16:16:34 +00:00 by brenno · 3 comments
Owner

Found in the pre-publication first-run review by a tester who had never seen the app. This is the most expensive class of bug a presentation tool can have.

Reproduce:

  1. New presentation, empty deck.
  2. Add slide → choose Scorecard (or morph an existing slide to Scorecard via the type selector).
  3. Look at the editor, the slide strip, and the source view.

What happens: the editor shows a complete, filled-in form — title "Seit dem letzten Bericht", metric 1 "Offene Feststellungen", now 96, previous 120, unit "Tage" — all in near-black text, visually indistinguishable from the real values on the bullets slide beside it. (On that slide the placeholder "Unterüberschrift" is correctly greyed.) The slide itself renders entirely white, logo only. The source contains just <!-- _class: scorecard logo-safe --> and nothing else. The quality panel reports "no quality issues found". In presentation mode and in the exported PDF it is a blank white page.

Why this must be fixed before publication: "I stood in front of the room with a blank slide" is the worst outcome this product has. The user received no signal at any point: the form looked filled, the quality gate was green, and the export went through without a murmur. Every safety net the app has was pointing the wrong way at once.

Proposal: two parts. (1) Give the Scorecard editor placeholders the same grey treatment used elsewhere, so an empty field reads as empty. (2) Have the quality analyser report an empty slide as a warning — "this slide has no content" — which also catches the general case rather than just this slide type.

Found in the pre-publication first-run review by a tester who had never seen the app. This is the most expensive class of bug a presentation tool can have. **Reproduce:** 1. New presentation, empty deck. 2. Add slide → choose Scorecard (or morph an existing slide to Scorecard via the type selector). 3. Look at the editor, the slide strip, and the source view. **What happens:** the editor shows a complete, filled-in form — title "Seit dem letzten Bericht", metric 1 "Offene Feststellungen", now 96, previous 120, unit "Tage" — all in near-black text, visually indistinguishable from the real values on the bullets slide beside it. (On that slide the placeholder "Unterüberschrift" *is* correctly greyed.) The slide itself renders entirely white, logo only. The source contains just `<!-- _class: scorecard logo-safe -->` and nothing else. The quality panel reports "no quality issues found". In presentation mode and in the exported PDF it is a blank white page. **Why this must be fixed before publication:** "I stood in front of the room with a blank slide" is the worst outcome this product has. The user received no signal at any point: the form looked filled, the quality gate was green, and the export went through without a murmur. Every safety net the app has was pointing the wrong way at once. **Proposal:** two parts. (1) Give the Scorecard editor placeholders the same grey treatment used elsewhere, so an empty field reads as empty. (2) Have the quality analyser report an empty slide as a warning — "this slide has no content" — which also catches the general case rather than just this slide type.
Author
Owner

De helft hiervan is opgelost in b043d5f (PR #652); dit issue blijft open voor de andere helft.

Wat er gedaan is — de placeholders. De oorzaak zat niet in de scorecard-editor maar in het thema: AppTheme.fromProfile zette helemaal geen hintStyle, dus élke hintText in de app erfde de gewone tekstkleur. Twee editors repareerden dat zelf (alt_text_field, _editor_field); de rest niet. Daarom is de fix in app_theme.dart en niet in scorecard_editor.dart — hij geldt nu voor elk invoerveld.

De kleur is muted geworden, de profielgestuurde gedempte tekstkleur die dezelfde functie al berekent. Mijn eerste keuze, scheme.onSurfaceVariant, lag maar 0,041 luminantie van de gewone tekstkleur af — een verschil dat je met een kleurenkiezer ziet en met het oog niet. test/input_hint_contrast_test.dart rekent dat na in licht én donker thema en stond eerst rood om precies die reden.

Wat er nog staat — de lege dia meldt zichzelf nog steeds niet. De kwaliteitscontrole zei "geen problemen" over een dia zonder inhoud, en dat blijft zo. Dat vraagt een nieuw SlideQualityIssueKind, en dat is geen bijvangst van een afgebakende wijziging: de keten loopt langs slide_quality.dart (enum), slide_quality_localization.dart (nieuwe d()-string, dus 31 vertalingen), slide_quality_analyzer.dart (de regel zelf), plus de plekken die uitputtend op het enum schakelen — quality_export_policy, slide_quality_panel, slide_quality_actions, slide_badge_tone_test.

Dat is ook de waardevolste helft: hij vangt de algemene vorm ("deze dia heeft geen inhoud") en niet alleen dit slidetype. Verwant aan #615, dat constateert dat negen van de 24 slidetypes in géén exporttest voorkomen — samen zijn dat de twee vangnetten die hier allebei de verkeerde kant op wezen.

De helft hiervan is opgelost in `b043d5f` (PR #652); dit issue blijft open voor de andere helft. **Wat er gedaan is — de placeholders.** De oorzaak zat niet in de scorecard-editor maar in het thema: `AppTheme.fromProfile` zette helemaal geen `hintStyle`, dus élke `hintText` in de app erfde de gewone tekstkleur. Twee editors repareerden dat zelf (`alt_text_field`, `_editor_field`); de rest niet. Daarom is de fix in `app_theme.dart` en niet in `scorecard_editor.dart` — hij geldt nu voor elk invoerveld. De kleur is `muted` geworden, de profielgestuurde gedempte tekstkleur die dezelfde functie al berekent. Mijn eerste keuze, `scheme.onSurfaceVariant`, lag maar 0,041 luminantie van de gewone tekstkleur af — een verschil dat je met een kleurenkiezer ziet en met het oog niet. `test/input_hint_contrast_test.dart` rekent dat na in licht én donker thema en stond eerst rood om precies die reden. **Wat er nog staat — de lege dia meldt zichzelf nog steeds niet.** De kwaliteitscontrole zei "geen problemen" over een dia zonder inhoud, en dat blijft zo. Dat vraagt een nieuw `SlideQualityIssueKind`, en dat is geen bijvangst van een afgebakende wijziging: de keten loopt langs `slide_quality.dart` (enum), `slide_quality_localization.dart` (nieuwe `d()`-string, dus 31 vertalingen), `slide_quality_analyzer.dart` (de regel zelf), plus de plekken die uitputtend op het enum schakelen — `quality_export_policy`, `slide_quality_panel`, `slide_quality_actions`, `slide_badge_tone_test`. Dat is ook de waardevolste helft: hij vangt de algemene vorm ("deze dia heeft geen inhoud") en niet alleen dit slidetype. Verwant aan #615, dat constateert dat negen van de 24 slidetypes in géén exporttest voorkomen — samen zijn dat de twee vangnetten die hier allebei de verkeerde kant op wezen.
Author
Owner

De tweede helft opgepakt. Tak: fix/lege-dia-melden-583. Reikwijdte: slide_quality.dart (nieuw SlideQualityIssueKind), slide_quality_localization.dart (nieuwe d()-string, 31 vertalingen), slide_quality_analyzer.dart, plus de plekken die uitputtend op het enum schakelen — quality_export_policy, slide_quality_panel, slide_quality_actions — en de tests.

De tweede helft opgepakt. Tak: `fix/lege-dia-melden-583`. Reikwijdte: `slide_quality.dart` (nieuw `SlideQualityIssueKind`), `slide_quality_localization.dart` (nieuwe `d()`-string, 31 vertalingen), `slide_quality_analyzer.dart`, plus de plekken die uitputtend op het enum schakelen — `quality_export_policy`, `slide_quality_panel`, `slide_quality_actions` — en de tests.
Author
Owner

De tweede helft is opgelost in 9fb5b867 e.v. (PR #681), op main. Daarmee is dit issue rond.

De regel gaat over de vorm, niet over het slidetype — dat was de waardevolste helft van je voorstel, en het is precies zo gebouwd: SlideQualityIssueKind.emptySlide, met de tekst "Deze dia is leeg: hij toont niets op het scherm en in de export".

Hoe "leeg" wordt bepaald is het enige waar ik een keuze moest maken. De dia wordt vergeleken met een vers aangemaakte dia van hetzelfde type. Wat daar al in staat — de vaste kop van een checklist, de beginrijen van een scope-matrix, de voorbeeldgebeurtenissen van een tijdlijn — is niet van de auteur en telt dus niet als inhoud. Een handgeschreven veldenlijst zou die koppen wél meetellen, en dan meldt een lege checklist zichzelf nooit. Bijkomend: de regel onderhoudt zichzelf, en dat is bij SlideType geen luxe.

Een waarschuwing, geen fout: een dia die je nog moet vullen is geen vergissing.

De test loopt uitputtend over SlideType.values. Eén bestaande test moest mee — forSlide returns only matching slide issues leunde erop dat een verse bullets-dia nul meldingen geeft, en dat is nu niet meer waar.

Bijvangst, apart ingediend als #677: bij het vertalen bleek dat zes talen bestaande kwaliteitsmeldingen nog als onvertaald Engels dragen. make l10n-check ziet dat niet, want die toetst dekking en geen taal. Naast de nieuwe, correct vertaalde melding komt in die zes talen dus Engelse tekst in hetzelfde paneel te staan.

De tweede helft is opgelost in `9fb5b867` e.v. (PR #681), op main. Daarmee is dit issue rond. **De regel gaat over de vorm, niet over het slidetype** — dat was de waardevolste helft van je voorstel, en het is precies zo gebouwd: `SlideQualityIssueKind.emptySlide`, met de tekst "Deze dia is leeg: hij toont niets op het scherm en in de export". **Hoe "leeg" wordt bepaald** is het enige waar ik een keuze moest maken. De dia wordt vergeleken met een vers aangemaakte dia van hetzelfde type. Wat daar al in staat — de vaste kop van een checklist, de beginrijen van een scope-matrix, de voorbeeldgebeurtenissen van een tijdlijn — is niet van de auteur en telt dus niet als inhoud. Een handgeschreven veldenlijst zou die koppen wél meetellen, en dan meldt een lege checklist zichzelf nooit. Bijkomend: de regel onderhoudt zichzelf, en dat is bij `SlideType` geen luxe. Een waarschuwing, geen fout: een dia die je nog moet vullen is geen vergissing. De test loopt uitputtend over `SlideType.values`. Eén bestaande test moest mee — `forSlide returns only matching slide issues` leunde erop dat een verse bullets-dia nul meldingen geeft, en dat is nu niet meer waar. **Bijvangst, apart ingediend als #677:** bij het vertalen bleek dat zes talen bestaande kwaliteitsmeldingen nog als onvertaald Engels dragen. `make l10n-check` ziet dat niet, want die toetst dekking en geen taal. Naast de nieuwe, correct vertaalde melding komt in die zes talen dus Engelse tekst in hetzelfde paneel te staan.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#583
No description provided.