TESTVERSLAG — Mijn buurt, één verbetering (statische site) Datum: 2026-10-25. Omgeving: Linux-container, Node 22, Chromium (headless) via Playwright, Python 3 http.server. Alle tests zijn geautomatiseerd uitgevoerd op de opgeleverde bestanden in deze map; de screenshots in screenshots/ zijn echte browserschermen uit diezelfde runs (zie screenshots/overzicht.txt voor de gebruikte filters/URL's). SAMENVATTING - Logicatest (Node, bouw/test-logic.js) tegen controles/verwachte-tellingen.json: 88 geslaagd, 0 mislukt. - Browsertest (Chromium, bouw/test-browser.js): 92 geslaagd, 0 mislukt. - Behouden: 200 personen, 400 antwoorden, 747 thema-houdingcombinaties, 1 thema zonder houding, 30 buiten-codeboek-items; basis 160/320, test 40/80; 17 wijkgeometrieën; alle respondent-wijkcodes koppelen (15 wijken met records, 2 zonder). - Alle 31 filtercases (inclusief samengestelde filters en de per-wijk-kaarttellingen) geven exact de verwachte personen, antwoordsleutels en contextgroepen. De drie ranglijsten (waardering V1, problemen V2, wensen V2) komen per onderwerp overeen. - Doorsneden via dezelfde respondent: parkeren 21 probleem / 8 afwijzing / 4 beide (anm8ag9, gbp55ru, p2bcd3e, ug9bynp); speelruimte 19 waardering in V1, waarvan 6 met verbeterwens in V2; stoepen 4/18 bij 75+ tegenover 7/142 elders (5 bij 45–64). - Zelfde-thema-test: p2bcd3e V2 matcht NIET op groen + gewenste verandering (groen heeft afwijzing, parkeren heeft wens). ÉÉN BEWUSTE AFWIJKING - Percentage bij filtercase 'buiten_codeboek': 18/160 = 11,25%. De controle noteert 11,2 (Python-afronding), JavaScript rondt op 11,3. De tellingen zelf (18 personen, 20 antwoorden) zijn identiek; de site toont hele procenten (11%). De logicatest staat 0,1 procentpunt afrondingsverschil toe en benoemt dit. WAT IS GECONTROLEERD IN DE BROWSER (file://, 1920×1080 tenzij anders vermeld) [OK] file:// laadt zonder console-fouten [OK] file:// geen externe requests [OK] start basisgroep 160/320 [OK] samenvatting toont 160 personen [OK] 17 wijken in kaart (hoofdkaart) [OK] 17 wijken in lijst [OK] geen horizontale overflow 1920 [OK] wijk klikken (Ede-Veldhuizen) → wijkfilter + 19 personen [OK] dropdown volgt kaartselectie [OK] URL-hash bevat wijk [OK] kaart: andere wijken behouden eigen aantal (Ede-West 21/21 in lijst) [OK] nogmaals klikken verwijdert wijkselectie [OK] wijk zonder gegevens (Bedrijventerrein) selecteerbaar: 0 personen + lege toestand [OK] kaart markeert gekozen wijk [OK] reset vanuit lege toestand werkt [OK] leeftijd 75+ → 18 personen [OK] leeftijdsopties chronologisch [OK] staaf klikken stelt onderwerp/vraag/houding in (75+ stoepen 4/18) [OK] samenvatting toont n/N (4/18 = 22%) [OK] grafiek V1 waardering toont “Niet van toepassing” bij V2-filter [OK] grafiek Wensen (V2) niet van toepassing bij houding=probleem [OK] tabel toont 4 reacties [OK] actieve filters getoond [OK] Wis filters → standaard [OK] URL-weergave wijk Ede-West + 25-44 + V1 groen: 4/10 [OK] samenvatting toont 4/10 = 40% [OK] labelchip klikken zet onderwerp (+houding): Rust en ruimte: waardering [OK] gekozen chip gemarkeerd als actief [OK] knop Parkeren: V2/parkeren/probleem 21/160 + anm8ag9 open [OK] detail toont beide antwoorden [OK] detail: V2 gemarkeerd als passend, V1 als context [OK] detail: bewijsfragmenten gemarkeerd (mark) in V2 [OK] detail: drie houdingen bij parkeren (probleem, afwijzing, wens) [OK] voorbeeldtekst: 21/160, 8, 4 live berekend [OK] focus op sluitknop na openen [OK] Escape sluit detailpaneel [OK] focus terug naar aanroepende knop [OK] tegenvoorbeeld ewjuefq opent via tekstknop in voorbeeldtekst [OK] sluitknop sluit detailpaneel [OK] knop Speeltuin: V1/speelruimte/waardering 19/160 + 2gwgqwj open [OK] voorbeeldtekst: 19/160 en 6 van die 19 [OK] detail 2gwgqwj: V1 passend, V2 context [OK] browser-terug sluit het detailpaneel (id uit hash) [OK] browser-vooruit opent het paneel weer [OK] zoektekst zonder resultaten → 0 van 160 [OK] Wis zoektekst herstelt [OK] zoek “Schaduw” (hoofdletterongevoelig) in V2 → 9 personen [OK] wijk met personen maar zonder passend label → onderscheiden melding [OK] Testgevallen → 40/80 + waarschuwing [OK] Alles → 200/400 + gemengd-waarschuwing [OK] Toon alles → 400 rijen in tabel [OK] lege antwoorden zichtbaar in tabel [OK] paginering: 25 rijen, Toon meer zichtbaar [OK] Toon meer → 50 rijen [OK] buiten_codeboek: houding teruggezet naar alle, 18 personen / 20 antwoorden, houdingfilter uitgeschakeld [OK] grafieken bij buiten_codeboek: niet van toepassing [OK] houding zonder onderwerp zoekt in alle thema-houdinglabels [OK] onbekende URL-waarden veilig teruggezet + melding [OK] herladen herstelt selectie (Veldhuizen parkeren 6/19, kaart=aandeel) [OK] kaartmodus aandeel: legenda met percentages en kleine groep [OK] kleine groep in lijst zonder percentage (Ederveen 5 personen) [OK] wijk zonder data: “geen” in lijst en gearceerd [OK] Deel deze weergave toont echte URL + file://-opmerking [OK] toetsenbord: Enter op wijkpad selecteert Bennekom (20) [OK] toetsenbord: spatie deselecteert [OK] toetsenbord: Enter op staaf filtert (groen) [OK] toetsenbord: Enter op respondent-ID opent detail [OK] toetsenbord: focus blijft in detailpaneel [OK] toetsenbord: Escape sluit [OK] alle downloadlinks bestaan lokaal (14) [OK] reactietekst wordt als tekst gerenderd (geen script/HTML-elementen uit data) [OK] file:// sessie zonder console-fouten (totaal) [OK] file:// sessie zonder externe requests (totaal) [OK] offline (netwerk uitgeschakeld) op file://: site werkt, 21/160 [OK] embed=1: compacte kop (body.embed) [OK] embed=1: filters, fictief-label en attributie zichtbaar [OK] embed=1: geen horizontale overflow 1280 [OK] embed=1: hash-filters werken (21/160) [OK] demo-iframe.html laadt index.html?embed=1 in iframe [OK] iframe: site werkt binnen frame (160 personen, embed-klasse) [OK] iframe: wijk klikken werkt (Lunteren 19) [OK] embed-sessie zonder console-fouten/externe requests [OK] mobiel: geen horizontale overflow [OK] mobiel: wijk klikken werkt (Bennekom 20) [OK] mobiel: detailpaneel opent [OK] mobiel: geen console-fouten [OK] HTTP vanuit submap: site werkt (21/160, detail open) [OK] HTTP: geen 404/ontbrekende assets [OK] HTTP: geen externe requests, geen console-fouten [OK] HTTP: Deel deze weergave toont http-URL zonder file-opmerking [OK] HTTP: demo-iframe werkt vanuit submap [OK] HTTP: downloadbestanden bereikbaar OFFLINE EN HOSTING - file://: alle requests zijn file://-requests; er is geen enkel verzoek naar een externe host gedaan (alle externe requests zouden door de test zijn geblokkeerd en gelogd; de lijst bleef leeg). Ook met Chromium's offline-emulatie werkt de site. - Lokale HTTP vanuit een submap (http://127.0.0.1:8765/site/): geen 404's of ontbrekende assets, geen consolefouten, downloads bereikbaar, demo-iframe.html werkt, 'Deel deze weergave' geeft de http-URL zonder file-opmerking. - Consolefouten en -waarschuwingen: geen, in alle sessies (desktop, embed, mobiel, HTTP). - Horizontale overflow: geen op 1920, 1280 (embed) en 390 (mobiel). SCREENSHOTS (echte Chromium-schermen, zie screenshots/overzicht.txt) 01-overzicht.png (1920×1080), 02-wijk-en-leeftijd.png (1920×1080, 4/10 = 40% zichtbaar), 03-parkeren-bronreactie.png, 04-speeltuin-twee-antwoorden.png, 05-iframe.png (1280×720, embed-stand), 06-mobiel.png (390×844). Opmerking bij 05: de screenshot is van index.html?embed=1 op een viewport van 1280×720, dezelfde weergave die demo-iframe.html in zijn iframe toont; de werking binnen het iframe zelf is apart getest (zie hierboven). LEESBAARHEID KAARTLABELS - De negen wijken van Ede-stad beslaan samen ~7% van de gemeente; daarom staat naast de hoofdkaart een uitvergroting met dezelfde geometrie. Labels zijn visueel gecontroleerd op 1920×1080 en 1280×720. Enkele labels in de uitvergroting zijn een paar kaarteenheden verschoven om botsingen te voorkomen (grenzen ongewijzigd). De Klomp toont op de hoofdkaart alleen het aantal; de naam staat in de wijklijst en de tooltip. In de aandeel-modus liggen de labels van Ede-West en Ede-Veldhuizen dicht bij elkaar maar blijven leesbaar. NIET GETEST OF NIET TE GARANDEREN VANUIT DEZE OMGEVING - Alleen Chromium (headless) is gebruikt. Firefox, Safari/WebKit, Edge en echte mobiele apparaten (touch) zijn niet getest. - Het klembord: de knop is getest op het tonen van de echte URL en het terugvalveld; of de kopie naar het systeemklembord in een echte browser slaagt is in headless-modus niet betrouwbaar vast te stellen. - Inbedden in Interact en de HTTPS-/frame-headers van een echte host zijn niet getest (er is geen publicatie gedaan). Dit pakket wijzigt geen Interact-code of serverheaders; zie README.txt. - Schermlezers zijn niet getest; wel zijn aria-labels, aria-pressed, rollen, focusbeheer en toetsenbordbediening aanwezig en per toetsenbord gecontroleerd (Tab/Enter/Spatie/Escape). - Reduced-motion is als CSS-regel aanwezig en de embed-test draaide met reducedMotion=reduce; er zijn geen animaties behalve een korte kleurovergang op de kaart, die bij reduced-motion wordt uitgeschakeld. - Printweergave is niet beoordeeld. - Model en verbruik: de omgeving rapporteert geen tokenverbruik of kosten; daarom zijn die hier niet opgenomen. HERHALEN VAN DE TESTS (optioneel, in de map naast site/) node bouw/test-logic.js site python3 -m http.server 8765 --bind 127.0.0.1 & (vanuit de map boven site/) node bouw/test-browser.js site http://127.0.0.1:8765/site LOGICATEST — VOLLEDIGE UITVOER PASS totaal personen PASS totaal antwoorden PASS totaal thema_houding PASS totaal thema zonder houding PASS totaal buiten_codeboek PASS 17 wijkgeometrieen PASS alle respondent-wijkcodes koppelen PASS wijkcodes uniek in geojson PASS basis 160/320 PASS test 40/80 PASS ranglijst V1 waardering PASS ranglijst V2 belemmering PASS ranglijst V2 gewenste verandering PASS filtercase start_basis PASS filtercase alles PASS filtercase testgevallen PASS filtercase v1 PASS filtercase v2 PASS filtercase parkeren_probleem PASS filtercase parkeren_afwijzing PASS filtercase groen_waardering PASS filtercase 75plus_stoepen PASS filtercase veldhuizen_parkeren PASS filtercase ede_west_25_44 PASS filtercase geen_tekstresultaten PASS filtercase buiten_codeboek PASS filtercase zoek_schaduw PASS filtercase wijk_WK022801 PASS kaart lokale context WK022801 PASS filtercase wijk_WK022802 PASS kaart lokale context WK022802 PASS filtercase wijk_WK022803 PASS kaart lokale context WK022803 PASS filtercase wijk_WK022804 PASS kaart lokale context WK022804 PASS filtercase wijk_WK022805 PASS kaart lokale context WK022805 PASS filtercase wijk_WK022810 PASS kaart lokale context WK022810 PASS filtercase wijk_WK022811 PASS kaart lokale context WK022811 PASS filtercase wijk_WK022812 PASS kaart lokale context WK022812 PASS filtercase wijk_WK022813 PASS kaart lokale context WK022813 PASS filtercase wijk_WK022820 PASS kaart lokale context WK022820 PASS filtercase wijk_WK022830 PASS kaart lokale context WK022830 PASS filtercase wijk_WK022840 PASS kaart lokale context WK022840 PASS filtercase wijk_WK022850 PASS kaart lokale context WK022850 PASS filtercase wijk_WK022860 PASS kaart lokale context WK022860 PASS filtercase wijk_WK022870 PASS kaart lokale context WK022870 PASS filtercase wijk_WK022880 PASS kaart lokale context WK022880 PASS filtercase wijk_WK022890 PASS kaart lokale context WK022890 PASS kaart_basis WK022801 PASS kaart_basis WK022802 PASS kaart_basis WK022803 PASS kaart_basis WK022804 PASS kaart_basis WK022805 PASS kaart_basis WK022810 PASS kaart_basis WK022811 PASS kaart_basis WK022812 PASS kaart_basis WK022813 PASS kaart_basis WK022820 PASS kaart_basis WK022830 PASS kaart_basis WK022840 PASS kaart_basis WK022850 PASS kaart_basis WK022860 PASS kaart_basis WK022870 PASS kaart_basis WK022880 PASS kaart_basis WK022890 PASS kaart andere wijk bij wijkfilter (Veldhuizen 6/19) PASS som kaart = globaal bij alle wijken (21) PASS doorsnede speelruimte waardeert 19 PASS doorsnede speelruimte waardeert+wens 6 PASS doorsnede parkeren probleem+afwijzing 4 PASS parkeren 21/8/4 PASS zelfde_thema_test p2bcd3e PASS stoepen 4/18 bij 75+, 7/142 elders, 5 bij 45-64 PASS onbekende URL-waarden teruggezet PASS buiten_codeboek + houding -> houding alle 88 geslaagd, 0 mislukt