fix(finding): niet-canonieke ## secties verdwijnen niet langer stil (#1198) #1225

Merged
brenno merged 3 commits from claude/clever-bouman-c9c37a into main 2026-08-04 17:14:30 +00:00
Owner

Probleem

Niet-canonieke ## …-sectiekoppen in een finding werden stil uit de weergave én export gedropt, terwijl de bron-.md de tekst behield — een stille afwijking tussen "bestand = bron" en wat je presenteert/exporteert. Voor een opgeleverd pentestrapport een reëel risico. Gevonden bij de beeldkeuring van #1198.

De kopkaart rendert vier vaste, taalonafhankelijke ankers (## Description, ## Confirmation (reproduction), ## Possible impact, ## Recommendation). FindingSpec.parse las alleen die exacte ankers: een handgeschreven/geïmporteerde ## Confirmation of ## Impact (korte vorm), of een extra ## Notes / ## References, matchte niets en verdween.

Oplossing (twee lagen)

  1. Alias-herkenningFindingSpec.canonicalSectionAnchor mapt gangbare korte vormen en de Nederlandse bronkoppen (hoofdletterongevoelig) op het juiste anker. De inhoud landt in het juiste veld en round-trippt bij de volgende opslag naar de canonieke Engelse kop.
  2. Zichtbare waarschuwing — elke ná aliasing nog onbekende ## …-sectie op een finding-kop-dia levert een kwaliteitswaarschuwing op (SlideQualityAnalyzer, categorie Inhoud): de melding zegt dat de sectie niet wordt getoond/geëxporteerd en hoe je de kop hernoemt. Zo wordt de stille datalek onmogelijk. Detail-/bewijs-dia's dragen geen kopkaart en blijven ongemoeid.

Weging (bewaker)

Deze wijziging raakt hoe de .md wordt geïnterpreteerd en normaliseert bij opslag een niet-canonieke kop naar het Engelse anker. Afweging: uitwisselbaarheid/round-trip (de kern van het product) vs. een strengere parser. Gekozen om stille afwijking onmogelijk te maken zónder informatie te verliezen — het bestand blijft de bron, de round-trip blijft heel, en niet-gelijkwaardige secties gaan niet verloren maar worden zichtbaar gemeld i.p.v. auto-verplaatst. Geen nieuwe afhankelijkheid, geen uitgaand verkeer, geen nieuwe vertrouwde partij. De zwaardere variant (onbekende secties bewaren én meerenderen) is bewust niet gekozen: die raakt paginatie, preview, alle exportpaden en l10n, met hoger risico voor beperkt extra nut.

Tests

  • finding_spec_test.dart: alias-routing (korte vorm + NL + hoofdletterongevoelig), onbekende sectie in unknownSectionTitles, canonieke bevinding meldt niets.
  • slide_quality_analyzer_test.dart: waarschuwing op kop-dia voor onbekende sectie, niet voor herkende/canonieke, en niet op een detail-dia.
  • slide_quality_localization_coverage_test.dart bijgewerkt voor de nieuwe issue-kind.

Poorten

make check groen (exit 0, alle tests). make check-secrets schoon (gitleaks + trufflehog, 0). make sast schoon (semgrep, 0 findings). 31 l10n-vertalingen via make add-l10n, make l10n-check groen. Geen pubspec-wijziging (geen SBOM nodig).

Docs bijgewerkt: CHANGELOG, SOURCE_MAP, FILE_FORMAT (nl+en), USER_GUIDE.

## Probleem Niet-canonieke `## …`-sectiekoppen in een `finding` werden stil uit de weergave én export gedropt, terwijl de bron-`.md` de tekst behield — een stille afwijking tussen "bestand = bron" en wat je presenteert/exporteert. Voor een opgeleverd pentestrapport een reëel risico. Gevonden bij de beeldkeuring van #1198. De kopkaart rendert vier vaste, taalonafhankelijke ankers (`## Description`, `## Confirmation (reproduction)`, `## Possible impact`, `## Recommendation`). `FindingSpec.parse` las alleen die exacte ankers: een handgeschreven/geïmporteerde `## Confirmation` of `## Impact` (korte vorm), of een extra `## Notes` / `## References`, matchte niets en verdween. ## Oplossing (twee lagen) 1. **Alias-herkenning** — `FindingSpec.canonicalSectionAnchor` mapt gangbare korte vormen en de Nederlandse bronkoppen (hoofdletterongevoelig) op het juiste anker. De inhoud landt in het juiste veld en round-trippt bij de volgende opslag naar de canonieke Engelse kop. 2. **Zichtbare waarschuwing** — elke ná aliasing nog onbekende `## …`-sectie op een finding-**kop**-dia levert een kwaliteitswaarschuwing op (SlideQualityAnalyzer, categorie Inhoud): de melding zegt dat de sectie niet wordt getoond/geëxporteerd en hoe je de kop hernoemt. Zo wordt de stille datalek onmogelijk. Detail-/bewijs-dia's dragen geen kopkaart en blijven ongemoeid. ## Weging (bewaker) Deze wijziging raakt hoe de `.md` wordt geïnterpreteerd en normaliseert bij opslag een niet-canonieke kop naar het Engelse anker. Afweging: **uitwisselbaarheid/round-trip** (de kern van het product) vs. een strengere parser. Gekozen om stille afwijking onmogelijk te maken zónder informatie te verliezen — het bestand blijft de bron, de round-trip blijft heel, en niet-gelijkwaardige secties gaan niet verloren maar worden zichtbaar gemeld i.p.v. auto-verplaatst. Geen nieuwe afhankelijkheid, geen uitgaand verkeer, geen nieuwe vertrouwde partij. De zwaardere variant (onbekende secties bewaren én meerenderen) is bewust niet gekozen: die raakt paginatie, preview, alle exportpaden en l10n, met hoger risico voor beperkt extra nut. ## Tests - `finding_spec_test.dart`: alias-routing (korte vorm + NL + hoofdletterongevoelig), onbekende sectie in `unknownSectionTitles`, canonieke bevinding meldt niets. - `slide_quality_analyzer_test.dart`: waarschuwing op kop-dia voor onbekende sectie, niet voor herkende/canonieke, en niet op een detail-dia. - `slide_quality_localization_coverage_test.dart` bijgewerkt voor de nieuwe issue-kind. ## Poorten `make check` groen (exit 0, alle tests). `make check-secrets` schoon (gitleaks + trufflehog, 0). `make sast` schoon (semgrep, 0 findings). 31 l10n-vertalingen via `make add-l10n`, `make l10n-check` groen. Geen pubspec-wijziging (geen SBOM nodig). Docs bijgewerkt: CHANGELOG, SOURCE_MAP, FILE_FORMAT (nl+en), USER_GUIDE.
De kopkaart van een `finding` rendert vier vaste, taalonafhankelijke ankers
(`## Description` … `## Recommendation`). `FindingSpec.parse` las alleen die
exacte ankers; een handgeschreven of geïmporteerde bevinding met een korte kop
(`## Confirmation`, `## Impact`) of een extra sectie (`## Notes`) matchte niets
en verdween daarmee uit de gestructureerde weergave, de presentatie en de
export — terwijl de tekst wél in de `.md` bleef staan. Een stille afwijking
tussen "bestand = bron" en wat je uitlevert, en voor een pentestrapport een
reëel risico.

`canonicalSectionAnchor` mapt nu gangbare korte vormen en de Nederlandse
bronkoppen (hoofdletterongevoelig) op het juiste anker, zodat de inhoud in het
juiste veld landt en bij de volgende opslag naar de canonieke Engelse kop
round-trippt. `parse` merget secties per anker en verzamelt elke resterende,
niet-herkende `## …`-kop in `unknownSectionTitles`, zodat een volgende laag de
afwijking zichtbaar kan maken i.p.v. hem stil te laten.

Regressietests in finding_spec_test.dart. Gevonden bij de beeldkeuring van #1198.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sluit de stille datalek volledig: elke `## …`-sectie op een finding-kop-dia
(rol `header`) die na aliasing nog geen canoniek anker is — `## Notes`,
`## References` — levert nu een zichtbare kwaliteitswaarschuwing op
(SlideQualityAnalyzer, categorie Inhoud, zwaarte waarschuwing). De melding
vertelt de auteur dat de sectie niet wordt getoond/geëxporteerd en hoe hij de
kop hernoemt naar een van de vier ankers. Een detail-/bewijs-dia draagt geen
kopkaart en blijft ongemoeid.

Nieuwe issue-kind `findingUnknownSection` + `_checkFindingSections`. Eén nieuwe
`l10n.d(...)`-melding met de placeholder `{sectie}` (auteurstekst, rechtstreeks
ingevuld — nooit door l10n.d); 31 vertalingen toegevoegd via `make add-l10n`,
met `{sectie}` en de vier Engelse ankers overal onvertaald behouden.

Om de klasse-grootte-ratchet niet op te tillen is `_checkChartAltText` (geen
instance-state) naar een top-level helper verplaatst — het repo-recept, i.p.v.
de basislijn te verhogen.

Regressietests in slide_quality_analyzer_test.dart; coverage-test bijgewerkt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
docs: niet-canonieke bevindingssecties — alias + waarschuwing (#1198)
All checks were successful
scans / scans (pull_request) Successful in 1m29s
static-gate / static-gate (pull_request) Successful in 3m33s
1733cf0427
CHANGELOG dev-log; SOURCE_MAP (finding_spec + slide_quality_analyzer);
FILE_FORMAT (nl+en): sectieankers herkennen korte vormen/NL-koppen, een
niet-herkende `## …` rendert/exporteert niet maar wordt door de
kwaliteitscontrole gemeld; USER_GUIDE: nieuwe rij "Inhoud" in de
kwaliteitscontroletabel.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 517d21355c into main 2026-08-04 17:14:30 +00:00
Sign in to join this conversation.
No description provided.