[Bug] Het faalbeleid van de presentatie-import wordt gezet maar nooit gelezen #812

Closed
opened 2026-07-24 18:16:22 +00:00 by brenno · 2 comments
Owner

Bij het overzetten van de presentatie-import (#772) is SlideFailurePolicy meegekomen, maar het bijbehorende gedrag niet. Het resultaat is bedrading die niets doet.

Wat er staat. lib/services/import/models/slide_failure_policy.dart declareert bestEffort, skip en rasterize. ProblemSlide.suggestedPolicy draagt zo'n waarde, en deck_builder.dart (~regel 585) vult hem netjes in: rasterize als de dia een afbeelding heeft, anders bestEffort.

Wat er niet staat. Niets leest dat veld ooit uit. De import doet altijd best-effort + een 'niet overgenomen'-notitiedia; skip en rasterize zijn onbereikbaar. De problemSlides uit PresentationImportResult worden alleen geteld voor de melding ('N dia's vragen aandacht').

Waarom dit meer is dan een ongebruikt veld. Het losse bronproject had hier een echte functie: bij een dia die niet schoon converteert kon de gebruiker per dia kiezen — best-effort met notitie, rasteriseren als afbeelding, overslaan, of de hele import afbreken — met een 'auto-doorgaan'-instelling om die vraag over te slaan. Die keuze is er nu niet; de enum wekt de indruk van wel.

De dode-code-poort ving dit niet, en dat is geen fout van de poort: die toetst of een bestand bereikbaar is vanuit main(), niet of een enumwaarde ooit gelezen wordt. Het bestand is bereikbaar, dus groen.

Twee wegen, en de keuze is de eigenlijke vraag:

  1. Bouwen wat het belooft — een beslismoment per probleemdia (of een keuze vooraf: 'vraag het me' / 'altijd best-effort'). ProblemSlide draagt al alles wat zo'n dialoog nodig heeft: bronnummer, titel, de beschrijvingen van wat er misgaat, en of er een afbeelding is. Let op de wisselwerking met de bulk-wachtrij: tien bestanden × per-dia-vragen is snel onwerkbaar, dus daar hoort een 'niet meer vragen'-uitweg bij.
  2. Weghalen — de enum en suggestedPolicy schrappen. Best-effort + notitiedia is een verdedigbare vaste keuze, en dan is er ook niets dat anders suggereert.

Let op dat rasterize in het bronproject leunde op een aanroep van LibreOffice (soffice) als extern proces. Dat komt hier niet terug: geen subproces, geen externe afhankelijkheid. Wordt het optie 1, dan moet 'rasteriseren' iets anders betekenen (bijvoorbeeld: alleen de afbeeldingen van de dia houden en de rest laten vallen — wat de bron-code feitelijk ook deed als er al een afbeelding was) of vervallen.

Herkomst: gevonden bij de eindcontrole van #772, op de vraag of werkelijk alles uit het bronproject was overgezet. Antwoord: de conversiemotor wel, dit beleid niet.

Bij het overzetten van de presentatie-import (#772) is `SlideFailurePolicy` meegekomen, maar het bijbehorende gedrag niet. Het resultaat is bedrading die niets doet. **Wat er staat.** `lib/services/import/models/slide_failure_policy.dart` declareert `bestEffort`, `skip` en `rasterize`. `ProblemSlide.suggestedPolicy` draagt zo'n waarde, en `deck_builder.dart` (~regel 585) vult hem netjes in: `rasterize` als de dia een afbeelding heeft, anders `bestEffort`. **Wat er niet staat.** Niets leest dat veld ooit uit. De import doet altijd best-effort + een 'niet overgenomen'-notitiedia; `skip` en `rasterize` zijn onbereikbaar. De `problemSlides` uit `PresentationImportResult` worden alleen geteld voor de melding ('N dia's vragen aandacht'). **Waarom dit meer is dan een ongebruikt veld.** Het losse bronproject had hier een echte functie: bij een dia die niet schoon converteert kon de gebruiker per dia kiezen — best-effort met notitie, rasteriseren als afbeelding, overslaan, of de hele import afbreken — met een 'auto-doorgaan'-instelling om die vraag over te slaan. Die keuze is er nu niet; de enum wekt de indruk van wel. **De dode-code-poort ving dit niet**, en dat is geen fout van de poort: die toetst of een *bestand* bereikbaar is vanuit `main()`, niet of een enumwaarde ooit gelezen wordt. Het bestand is bereikbaar, dus groen. **Twee wegen, en de keuze is de eigenlijke vraag:** 1. **Bouwen wat het belooft** — een beslismoment per probleemdia (of een keuze vooraf: 'vraag het me' / 'altijd best-effort'). `ProblemSlide` draagt al alles wat zo'n dialoog nodig heeft: bronnummer, titel, de beschrijvingen van wat er misgaat, en of er een afbeelding is. Let op de wisselwerking met de bulk-wachtrij: tien bestanden × per-dia-vragen is snel onwerkbaar, dus daar hoort een 'niet meer vragen'-uitweg bij. 2. **Weghalen** — de enum en `suggestedPolicy` schrappen. Best-effort + notitiedia is een verdedigbare vaste keuze, en dan is er ook niets dat anders suggereert. Let op dat `rasterize` in het bronproject leunde op een aanroep van LibreOffice (`soffice`) als extern proces. Dat komt hier **niet** terug: geen subproces, geen externe afhankelijkheid. Wordt het optie 1, dan moet 'rasteriseren' iets anders betekenen (bijvoorbeeld: alleen de afbeeldingen van de dia houden en de rest laten vallen — wat de bron-code feitelijk ook deed als er al een afbeelding was) of vervallen. **Herkomst:** gevonden bij de eindcontrole van #772, op de vraag of werkelijk alles uit het bronproject was overgezet. Antwoord: de conversiemotor wel, dit beleid niet.
Author
Owner

Opgepakt, optie 1: het beslismoment bouwen. Tak: fix/import-faalbeleid-812.

Reikwijdte: deck_builder.dart gaat het beleid werkelijk toepassen (per bron-dia), de import-service krijgt een tweefase-vorm zodat de vraag tússen classificeren en bouwen past (niet twee keer parsen), en er komt een beslisdialoog voor de enkelvoudige import. De bulk-wachtrij vraagt bewust níéts — tien bestanden × per-dia-vragen is geen route — die blijft best-effort, en dat komt in de tekst te staan.

Eén naamswijziging vooraf: rasterize wordt imageOnly. Rasteriseren impliceert renderen, en dat kan hier niet (geen subproces). Wat de bron-code feitelijk deed was 'houd alleen de afbeeldingen van deze dia', en zo gaat het ook heten.

Opgepakt, optie 1: het beslismoment bouwen. Tak: `fix/import-faalbeleid-812`. Reikwijdte: `deck_builder.dart` gaat het beleid werkelijk toepassen (per bron-dia), de import-service krijgt een tweefase-vorm zodat de vraag tússen classificeren en bouwen past (niet twee keer parsen), en er komt een beslisdialoog voor de enkelvoudige import. De bulk-wachtrij vraagt bewust níéts — tien bestanden × per-dia-vragen is geen route — die blijft best-effort, en dat komt in de tekst te staan. Eén naamswijziging vooraf: `rasterize` wordt `imageOnly`. Rasteriseren impliceert renderen, en dat kan hier niet (geen subproces). Wat de bron-code feitelijk deed was 'houd alleen de afbeeldingen van deze dia', en zo gaat het ook heten.
Author
Owner

Geland op main met merge-commit c50d1b1e (PR #819, zes commits). Geverifieerd op main: de beslisdialoog staat er, rasterize en suggestedPolicy komen nergens meer voor, en het beleid wordt werkelijk gelezen.

Gekozen voor optie 1: het beslismoment gebouwd. Bij één bestand verschijnt de vraag zodra er dia's zijn met écht verlies — per dia zo volledig mogelijk, alleen de afbeelding, of overslaan, met de redenen erbij. De bulk-wachtrij vraagt bewust niets.

rasterize heet imageOnly. Zoals het issue al aangaf kon rasteriseren hier niet terugkomen: dat leunde in het bronproject op een LibreOffice-subproces. Wat die code feitelijk deed zodra er een plaatje was, is wat de naam nu zegt.

Drie grenzen zitten met een test vast: het beleid raakt alleen dia's met écht verlies (anders ruimt één keuze een heel deck op), afbreken breekt ook werkelijk af, en de standaardkeuze vernietigt niets.

Dat laatste was de scherpste vondst, en hij kwam pas boven bij het schrijven van de documentatie: de uitleg beloofde 'wat u niet aanraakt wordt zo volledig mogelijk overgenomen', terwijl de voorselectie op imageOnly stond zodra een dia een afbeelding had. Wie niets aanraakte en op Importeren drukte, verloor juist de tekst van díé dia's. Elke dia begint nu op best-effort en het voorstel-veld is geschrapt — een voorstel dat tegelijk de standaard is, is geen voorstel maar een besluit dat voor je genomen is. Wil advies terugkomen, dan komt het terug náást een veilige standaard, niet ervoor in de plaats.

make check groen (6555 tests, dekking 86,5%), geen basislijn verhoogd, geen nieuwe afhankelijkheid.

Geland op main met merge-commit `c50d1b1e` (PR #819, zes commits). Geverifieerd op main: de beslisdialoog staat er, `rasterize` en `suggestedPolicy` komen nergens meer voor, en het beleid wordt werkelijk gelezen. Gekozen voor **optie 1**: het beslismoment gebouwd. Bij één bestand verschijnt de vraag zodra er dia's zijn met écht verlies — per dia zo volledig mogelijk, alleen de afbeelding, of overslaan, met de redenen erbij. De bulk-wachtrij vraagt bewust niets. **`rasterize` heet `imageOnly`.** Zoals het issue al aangaf kon rasteriseren hier niet terugkomen: dat leunde in het bronproject op een LibreOffice-subproces. Wat die code feitelijk deed zodra er een plaatje was, is wat de naam nu zegt. Drie grenzen zitten met een test vast: het beleid raakt alleen dia's met écht verlies (anders ruimt één keuze een heel deck op), afbreken breekt ook werkelijk af, en de standaardkeuze vernietigt niets. Dat laatste was de scherpste vondst, en hij kwam pas boven bij het schrijven van de documentatie: de uitleg beloofde 'wat u niet aanraakt wordt zo volledig mogelijk overgenomen', terwijl de voorselectie op `imageOnly` stond zodra een dia een afbeelding had. Wie niets aanraakte en op Importeren drukte, verloor juist de tekst van díé dia's. Elke dia begint nu op best-effort en het voorstel-veld is geschrapt — een voorstel dat tegelijk de standaard is, is geen voorstel maar een besluit dat voor je genomen is. Wil advies terugkomen, dan komt het terug náást een veilige standaard, niet ervoor in de plaats. `make check` groen (6555 tests, dekking 86,5%), geen basislijn verhoogd, geen nieuwe afhankelijkheid.
brenno 2026-07-24 20:13:35 +00:00
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#812
No description provided.