TASKS.md 88 KB

Uitgaanskrant — takenlijst

Deze sessie (2026-08-14, live pair-sessie met Bob, builder-clicks door Bob + export-verificatie door Claude na elke stap): alle P0 resterend bij sessiestart afgerond — P0-4 (favorieten-lege-lijst- state Tab 3), P0-8 (14/17 "null"-tekst-velden op HorecagelegenheidCurrent, 3 restpunten bewust naar nieuwe "Minor"-sectie), P0-5's header-bijvangst (hardcoded Basic-Auth verwijderd uit alle 15 API-calls; het Drupal-hoofdpunt van P0-5 blijft open bij Bob). Ook P1-15 (5 social-knoppen + Menukaart-knop + EvenementInfo-Website-knop) en P1-4 (horcat Default Value) afgerond, plus nieuwe P1-23 aangemaakt (tikbare links op HorecagelegenheidCurrent, vervolg op P0-8). Onderweg meerdere keren dezelfde omgekeerde-operator-fout (== '' i.p.v. != '') gevonden en gecorrigeerd — zie ook CLAUDE.md. Concurrency: halverwege bleek een andere sessie tegelijk builder-werk te doen (P1-7 Tab 3, gecommit als bed1d68) — geen conflict, beide commit-reeksen zijn na elkaar cleanly gepusht. Bijgewerkt tijdens deze sessie ook CLAUDE.md (nieuw punt: nooit stilzitten, altijd direct de volgende taak geven na "gedaan").


Bijgewerkt: 2026-08-15 (Claude, ochtendsessie). Zie CLAUDE.md voor werkinstructies/conventies. Elke openstaande taak hieronder is zelfstandig te begrijpen zonder de chat gelezen te hebben waarin hij ontstond.

Deze sessie (2026-08-15, ochtend, code-sync + audit, geen live builder-UI-werk gedaan): begonnen met ff-session-check.sh (schoon, niets "— bezig") en een gerichte git log-check op favorieten_widget.dart naar aanleiding van de vaste vuistregel bovenaan dit bestand — bleek sinds bd42224 (allereerste versie, 3 kale placeholder-tabs) nooit meer gewijzigd, ondanks meerdere latere sessies die claimden P0-4/P1-7 Tab 3 daar te hebben afgerond. Een verse flutterflow export-code bevestigde: dat werk staat echt in FlutterFlow, maar was nooit lokaal gepulld/gecommit — dezelfde sessie's ff-run-fvm.sh-run (die intern zelf naar de projectmap exporteert) bracht in totaal 12 bestanden synchroon die stiekem al veel langer op wijzigingen wachtten. Gebouwd (flutter build apk --debug slaagde, flutter analyze: 0 errors) en gecommit (2c093bc). Bijvangst bij het verifiëren van de diff: P1-15 bleek volledig afgerond (de laatste 3 open restpunten — Menukaart-guard + 2x Website-guard — waren ook al gefixt, nooit gemeld) en het P0-3-restpunt "default-locatie zonder naam" bleek ook al gefixt (plus een losse debug-SnackBar opgeruimd) — beide uit deze lijst verwijderd, zie hun eigen doorstreep-notities. Nieuwe live bevindingen tijdens de verificatie-launch (emulator-5554, verse build): twee nieuwe punten toegevoegd, P1-24 (de bekende Invalid argument(s): No host specified in URI-exceptie blijkt ook ná de volledige P1-15-fix nog steeds op te treden, nu bevestigd vóór enige tap — dus een andere, nog ongevonden bron) en P1-25 (nieuwe 129px-RenderFlex-overflow op HomeUitgaantabelKaartComponent:359, geen stack trace met bestandslocatie gevangen wegens de bekende single-dump-beperking). Tweede deel, zelfde sessie (na Bob's "ja, ga maar verder"): P1-7's "Gebruiker"-tab gebouwd, Uitloggen-knop volledig werkend — nieuwe 4e tab op Favorieten (via TabBar's "Active Tab"-dropdown → "+ Add Tab", nieuw ontdekt/gedocumenteerd recept, zie CLAUDE.md), ListTile "Uitloggen" met 2 acties (Update App State: 6 sessievelden op "Clear Value"; Navigate To Login met "Allow Back Navigation" uit → context.goNamed(...)). Bevestigd via verse export + flutter analyze (0 errors), gecommit (ba1e0b2). Live tap-test op een device kon niet: emulator-5554/5556 bleken niet te draaien (alleen Bob's fysieke K7V8DYTSMVTW6XBI was aangesloten) — nog te doen door een volgende sessie/Bob. "Wachtwoord wijzigen" en "Account verwijderen" op dezelfde tab bewust niet gebouwd (wachten op Bob, zie P1-7's "Nog open"-lijst). Correctie op de eerdere claim hierboven: de ff-run-fvm.sh-hot-restart-loop van het ochtenddeel is inmiddels vanzelf beëindigd (bereikte zijn eigen 590s-timeout) — geen open proces meer voor een volgende sessie om op verder te bouwen, gewoon opnieuw starten indien nodig.

Vorige sessie (2026-08-14, tweede ronde, code-audit + 1 builder-poging): op verzoek ("pak nog wat taken op") eerst een code-only audit van api_calls.dart tegen de openstaande P1-7-taak (favorietenpagina) — twee stale/onvolledige aannames in P1-7 gecorrigeerd, geen van beide had nog nieuw Drupal-werk nodig:

  • Tab 1 "Persoonlijke agenda": bleek nog "niet onderzocht", maar UitgaanstabelCall/UitgaanSliderCall ondersteunen al een townid-parameter — rechtstreeks bruikbaar door per favoriete gemeente (favorieteGemeenteIds) een call te doen. Zie bijgewerkte P1-7 hieronder.
  • Tab 3 "Favoriete Gelegenheden": de bestaande blokkering-op-P0-7 was stale (P0-7 is al op 2026-08-13 gefixt) — én er bleek een simpelere, nooit eerder overwogen route: FavorietenAgendaCall (sessie-geauthenticeerd, geeft al server-side de favoriete gelegenheden van de ingelogde gebruiker terug in 1 call). Zie bijgewerkte "Drupal dingen"-lijst hierboven — niet langer een Bob-batch-item, Claude/een volgende sessie kan dit nu direct bouwen. Daarna 1 mechanische builder-taak geprobeerd (P2-7-bijvangst: FavorietenAgendaTESTKANWEGCall verwijderen via het API Calls-paneel) — 2x geprobeerd, 2x niet doorgezet naar een verse export/reload, zelfde "ziet er opgeslagen uit maar bereikt de export niet"-patroon als elders in dit bestand, maar nu voor het eerst ook op het (verder betrouwbare) API Calls-paneel i.p.v. alleen de widget-tree/canvas. Zie de nieuwe blocker-notitie bij P2-7. Niet verder geprobeerd (staande regel: na 1-2 pogingen overdragen aan Bob), geen schade aangericht. Vervolgens, op Bob's aanmoediging ("pak nog een paar taken op"), P1-7 Tab 3 "Favoriete Gelegenheden" alsnog volledig gebouwd in de builder (los tabblad, Bob's eigen tabblad met rust gelaten): ListView + ListTile-itemtemplate + FavorietenAgendaCall-Backend Query + "Generate Dynamic Children" (een tot nu toe onbekend/gemist icoontje, zie nieuw gedocumenteerd in CLAUDE.md) + tap-navigatie naar HorecagelegenheidCurrent. Onderweg twee eerder als "niet gevonden" gedocumenteerde builder-mechanismes alsnog gevonden en gecorrigeerd in CLAUDE.md: het Actions-tab-icoontje (P1-9 had dit "niet gevonden" genoteerd) en de "Generate Dynamic Children"-flow zelf (nergens eerder gedocumenteerd, waarschijnlijk de ontbrekende schakel voor alle toekomstige API-gebonden lijst-taken). Bevestigd via verse export + flutter analyze (geen nieuwe treffers). Zie bijgewerkte P1-7 hieronder voor de volledige stappen (herbruikbaar recept).

Eerdere sessie (2026-08-14, eerste ronde, code-only — geen builder-UI gebruikt omdat Bob meldde gelijktijdig zelf in een andere sessie aan de slag te gaan — gedeelde Chrome dus niet ingezet): ff-session-check.sh toonde 20 bestanden ongecommit in lib//ios//.gitignore, exact overeenkomend met de al-bevestigde-maar-nooit-gecommitte P1-19/P1-20/P1-11/P2-7- wijzigingen uit de sessienotitie van 2026-08-13 hieronder (alle bestanden zelfde mtime, 2026-08-13 21:30 — stabiel, niets actief in wijziging). Alsnog gecommit + gepusht (fb6b224) via ff-commit.sh (diens interactieve confirm-prompt faalde non-interactief, staging + inhoud eerst handmatig geverifieerd tegen de TASKS.md-beschrijvingen, daarna commit+push met dezelfde inhoud). Bijvangst bij het verifiëren: P2-7's API-call-opschoning bleek verder dan gedacht — 7 van de 8 voorgestelde test/scratch-call-verwijderingen zijn ook echt doorgevoerd (alleen FavorietenAgendaTESTKANWEGCall bleef staan), en Establishments Call bleek hernoemd naar HorecagelegenheidoverzichtCall (geen verwijdering, callers consistent meeveranderd) — zie bijgewerkte P2-7 hieronder. Geen builder-werk, geen flutter run/emulator-interactie deze sessie (Bob's twee lopende ff-run-fvm.sh-processen/devices met rust gelaten).

Eerdere sessie (2026-08-13 avond, builder + emulator, Bob gelijktijdig actief in zijn eigen ff-run-fvm.sh-testronde): begonnen met 2 onbeklaimde P1-9/P1-15-punten op EventCurrentbeide geblokkeerd op een structureel onbetrouwbare Widget Tree-klikprecisie (zie de uitgebreide poging-notitie bij P1-9), teruggezet naar Bob. Halverwege meldde Bob dat hij P0-7 zelf had gefixt (Drupal-view-bug) en vroeg om naar de horecagelegenheid-pagina te kijken. P0-7 bevestigd opgelost via een live check op emulator-5554 (nid 91142, "De Beun": echte titel/foto's/inhoud in plaats van placeholders) — maar dat onthulde meteen een nieuwe, dringende P0-8: de Info/Links/Bezorgen- tabs van HorecagelegenheidCurrent breken zichtbaar zodra er echte data doorkomt (RenderFlex-overflow tot 209px + letterlijke "null"- tekst op 17 ongeguarde velden, live gefotografeerd op alle 3 tabs). Volledig uitgeschreven met exacte regelnummers en een mechanisch herhaalbare fix — zie P0-8 hieronder.

Eerdere sessie (2026-08-13, zelfstandig, code-only — geen builder-UI gebruikt omdat niet zeker was of Bob achter zijn scherm zat): twee punten uitgediept, puur via lezen/grep, geen wijzigingen aan app-code. P1-15 uitgebreid met 3 nieuw gevonden crash-plekken die niet in het eerder gedocumenteerde 5-knoppenlijstje zaten: een 6e ongegarandeerde "Menukaart"-knop in hetzelfde bestand (evenement_horecagelegenheid_widget.dart:626-635), en twee "Website"-knoppen die helemaal geen guard hebben (niet eens de kapotte) — evenement_info_widget.dart:268 (component gebruikt op de normaal bereikbare EventCurrent-pagina) en evenement_component_widget.dart:414 (alleen op de al bekende orphan- route EventWidget, zie P2-7). Ook bevestigd dat horecagelegenheid_current_widget.dart géén launchURL-aanroepen bevat — dat eerdere twijfelpunt is nu weggenomen. P1-21's punt 2 gecorrigeerd: de aanname dat lib/flutter_flow/flutter_flow_ad_banner.dart zonder builder-UI en zonder export-risico lokaal aan te passen zou zijn bleek ongeverifieerd en botst met CLAUDE.md's algemene regel over gegenereerde bestanden — teruggedraaid naar "nog op te lossen, waarschijnlijk via een eigen custom widget", niet blind uitgevoerd. Tweede ronde, zelfde sessie: 6 "nog open"-taken tegen de huidige code herbevestigd (vuistregel bovenaan dit bestand — niet blind vertrouwen dat "open" nog klopt): P0-7 (Drupal-endpoint opnieuw met curl getest, alle 3 nid's nog steeds HTTP 500), P0-5 (hardcoded Basic-Auth-header, nog steeds 15 treffers), P1-4 (horcat ??= null!; nog aanwezig, regel verschoven naar 1440), P1-16 (nog geen enkele Firebase-referentie in het project), P1-20 (HeaderButtonsComponentWidget heeft nog steeds geen component-parameter, showBackButton-fix nog niet aangemaakt), P1-11 (bug zelf ongewijzigd, maar geciteerde regelnummers waren stale door tussentijdse edits — gecorrigeerd naar de huidige regels). Geen van deze 6 bleek stiekem al opgelost; alleen regelnummer-correcties, geen statuswijzigingen.

⚠️ Belangrijke ontdekking, zelfde ronde: halverwege deze sessie bleek Bob gelijktijdig een eigen ff-run-fvm.sh-build/testronde te draaien (proces gestart 20:39, device K7V8DYTSMVTW6XBI) — de bijbehorende verse export bracht een hoop bevestigd-maar-nooit- gecommit werk voor het eerst echt in deze repo: P1-20 volledig geïmplementeerd (exact het hieronder uitgewerkte showBackButton- patroon), P1-11 gefixed (Expanded + hoogte-correctie op HorecagelegenheidEventTabelComponentCopy), alle 9 P1-19 Row→Wrap-conversies landen nu pas écht in git (eerdere "afgerond"-notitie was destijds alleen via een losse /tmp/ff-check- export geverifieerd, nooit gecommit — git log -S"return Wrap(" bevestigde 0 eerdere treffers), en een gedeeltelijke P2-7 API-call-opschoning (LoginCall/GetcsrfCall/ZZUserEstablishmentsTESTCall verwijderd, overige test/scratch-calls hergegroepeerd onder een nieuwe KanwegGroup-wrapper i.p.v. verwijderd — Bob's eigen aanpak, wijkt af van de letterlijke aanbeveling maar overlapt grotendeels). Niets hiervan is door Claude gecommit (nog steeds Bob's eigen, actieve build/testronde) — alleen TASKS.md-status bijgewerkt op Bob's verzoek, ná bevestiging via git diff. Kleine kanttekening: horecagelegenheidoverzicht_kaart_widget.dart kreeg ook een toegevoegde voorloop-spatie op de 'titel'/'adres'/'plaats'- fallback-teksten (' titel' etc.) — lost P1-6 niet op, lijkt een onbedoeld bijeffect, geen actie ondernomen.

Vervolgsessie zelfde dag (2026-08-13, tweede ronde, ook zelfstandig code-only/emulator, geen builder-UI): drie taken efficiënt gecombineerd zonder Bob's browser nodig te hebben. P1-7 Tab 2 uitgezocht: bevestigd dat er nog helemaal geen favoriet-toggle-UI voor gemeenten bestaat (favorieteGemeenteIds alleen in app_state.dart), plus waarom het bekende horeca-hartje-patroon hier niet 1-op-1 past (gemeentekeuze is een dropdown, geen kaartjeslijst) — twee opties uitgeschreven ter bespreking met Bob. P1-20 kreeg een volledig uitgewerkt, direct uitvoerbaar stappenplan (parameternaam showBackButton, default true, welke ene call site false moet worden, welke 9 met rust gelaten kunnen worden) — scheelt een onderzoeksronde bij de volgende live builder-sessie. P1-9 punt 1 (Event-pagina) live gecheckt via een directe am start-deeplink naar EventCurrent (nid 214370) op de al draaiende emulator — twee nieuwe concrete layout-bevindingen (titel/deel-knop zonder tussenruimte, en een losstaande, altijd-zichtbare nid-debugtekst die zwaarder weegt dan P1-6's oorspronkelijke cosmetica-inschatting). Kanttekening: de gebruikte emulator-instantie was zelf ~2 dagen oud (stale t.o.v. vandaag's P1-22/P1-10-fixes), dus de "???"-tekens die ook zichtbaar waren op het screenshot zijn vermoedelijk gewoon dat al bekende, inmiddels gefixte encodingprobleem op oude gecompileerde code — niet als nieuwe bug behandeld.

Eerdere sessie (2026-08-12, review): volledige gebruikersdoorloop op een verse build (ff-run-fvm.sh, geïnstalleerde app was nog van 2026-08-09 en dus stale t.o.v. alle fixes van 2026-08-10/11) langs de 5 gevraagde gebieden: overzichtspagina (Home), horecaoverzicht (HorecagelegenhedenOverzicht), evenement (EventCurrent + EvenementHorecagelegenheid), pagina (PUitgaanPage) en horecagelegenheidpagina (HorecagelegenheidCurrent), gecombineerd met een code-audit van diezelfde bestanden. 4 nieuwe bevindingen toegevoegd: nieuwe P0-7 (horecagelegenheid-infodata blijkt structureel leeg — bevestigd op 2 verschillende gelegenheden, geen toeval), nieuwe P1-20 (Home's al-verwijderd-gewaande terugknop is terug via een hergebruikt component en blokkeert soms de hamburger), nieuwe P1-21 (AdBanner op PUitgaanPage toont developer-debugtekst aan echte gebruikers), nieuwe P1-22 (decodeUtf8: false op alle API-calls → emoji in Drupal-content worden ?-tekens). P1-19 uitgebreid met 8 nieuw gevonden zusterinstanties van hetzelfde "kale Row zonder Wrap"-categorietag-patroon, nu bevestigd op exact de pagina's uit deze review (Home, PUitgaanPage, EventCurrent, HorecagelegenheidCurrent). P1-13 live herbevestigd — nog steeds kapot (1529px-overflow op de Activiteiten-tab), geen voortgang t.o.v. 2026-08-10. Zie de individuele taken hieronder voor bewijsvoering (screenshots/log-regels/broncoderegels).

Eerdere sessie (2026-08-10, avond): live pair-sessie — Bob deed alle builder-edits zelf, Claude gaf per punt de exacte stappen en verifieerde daarna elke edit met een verse flutterflow export-code

  • grep (niet op de builder-UI zelf vertrouwd). 9 taken écht afgerond en bevestigd: P1-18 (login-crash + de daaropvolgende success-check-bug), P0-1, P0-3 (beide restpunten — punt 2 uiteindelijk simpeler opgelost dan gepland: HeaderButtonsComponentWidget() hergebruikt op EventCurrent i.p.v. de logica te dupliceren), P1-3, P1-9's schaduw-restpunt, P1-1 (alle 4 sub-punten), P1-12 (opgelost via een Visibility-guard op de rauwe horecaid-parameter, netter dan de oorspronkelijk voorgestelde Default Value). Belangrijke bevinding: minstens 2x deze sessie leek een builder-edit in de UI geslaagd ("Confirm" gedaan, geen foutmelding) maar bleek bij een verse export toch niet doorgezet (P0-3 punt 1 ooit eerder, en een eerste P1-15-poging vanavond) — elke afgeronde taak in een levende sessie nu standaard verifiëren met een verse export vóór 'm als klaar te beschouwen, niet op de UI-status alleen vertrouwen. P1-15 blijft open (5 social-knoppen op EvenementHorecagelegenheid) — eerste poging bleek bij export niet toegepast, Bob gaat hier zelfstandig mee verder.

Eerdere sessie (2026-08-10, middag): twee taken opgepakt. P2-9-bijvangst (dode terug-knop Home) volledig afgerond — Remove Widget-actie, bevestigd via verse export. P1-13: builder-fix uitgevoerd (Expanded+Shrink Wrap uit+Scrollable aan op de StaggeredView-node) maar niet doorgezet naar de export ondanks correcte builder-UI-status ("Synced", geen foutmelding, blijft staan na reload) — bevestigd met 3 onafhankelijke verse flutterflow export-code-runs. Sanity-check bevestigt dat de exportpijplijn zelf werkt (P0-6/P2-9 tonen wél correct) — dit lijkt een specifiek sync-probleem bij deze property-combinatie, zie P1-13 voor het volledige verslag en het verzoek aan Bob om zelf te verifiëren.

Vorige sessie (2026-08-09, avond): twee taken opgepakt. P1-19: builder-fix geprobeerd (Row → Wrap Widget), maar de menu-klik registreerde niet (4 pogingen, geen schade) — teruggegeven aan Bob met exact stappenplan. P1-13: eindelijk de al maanden gezochte volledige stack trace gevangen (nieuwe flutter run --route-truc omzeilt de race met Home's eigen overflow) — root cause nu hard bevestigd (niet-scrollbare MasonryGridView in een kale Column) + concreet fix-voorstel, builder-uitvoering nog open. Bijvangst: een tweede, nog niet eerder gedocumenteerde instantie van P1-19's "kale Row/Column zonder Wrap"-bugfamilie gevonden op PUitgaanSliderKaartComponent:179.

Vorige sessie (2026-08-09, middag): eerste sessie met mcp__android__*- toegang tot beide emulators (i.p.v. alleen losse adb-Bash-commando's) — P0-6 afgerond (5 debug-knoppen op Login verwijderd, builder + export/build + live geverifieerd op telefoon én tablet). Sub-bevinding (hintText-placeholder) blijft open, geblokkeerd op paneel-clipping. P1-17 opnieuw onderzocht en root cause herbevestigd, maar de voorgestelde "Engels weghalen"-fix is door Bob afgewezen — Engels moet beschikbaar blijven; taak blijft open in andere vorm (zie daar).

Deze review-sessie (2026-08-07, middag+avond): volledige doorloop van open taken + code-audit, plus een live "ogen van een gebruiker"-doorloop op de emulator (ná herstart van Bob's desktop/ Android-VM wegens een OOM — app opnieuw opgestart via de standaard ff-run-fvm.sh-workflow, daarna pm clear om een echte eerste-launch-ervaring te simuleren). Concrete live vondsten: zie nieuwe P0-6 (test-navigatieknoppen zichtbaar op de productie- Login-pagina — grootste vondst van de sessie), P1-17 (Engelse locale-fallback + vrijwel geen echte vertalingen), aangevulde P2-9 (onboarding + dode terug-knop op Home, nu live bevestigd i.p.v. ingeschat) en P1-15 (scope groter dan gedacht). Kanttekening: de emulator vertoonde ook wat omgevingsinstabiliteit (kort een "System UI isn't responding"-melding vlak na herstart, en flutter run verloor op een gegeven moment de verbinding met het device) — dat lijkt eerder aan de verse VM-herstart/host-belasting te liggen dan aan de app zelf, dus niet 1-op-1 als app-bug behandelen, maar wel vermeld voor het geval het patroon terugkomt.

Formaat van elke taak: **P0-1 · Eigenaar: ...** als eerste regel — een stabiel nummer (verandert niet als andere taken worden afgerond/verwijderd) + wie 'm oppakt. Volgorde binnen elke prioriteit = geschatte ernst/impact, hoogste eerst.

Eigenaar-waarden:

  • Bob — sneller/simpeler voor hem zelf (meestal builder-UI met een bekend fragiele dialoog, zie CLAUDE.md).
  • Claude — zelfstandig/via browser-automation te doen, nog onbeklaimd.
  • Claude — bezig (sessie ) / Bob — bezig — een sessie/persoon is hier nu actief mee bezig.
  • Onbepaald — nog geen eigenaar gekozen.
  • ⚠️ Voorkom dubbel werk: Bob start elke taak in een nieuwe, aparte chat — er kunnen dus meerdere sessies tegelijk actief zijn op hetzelfde project. Voordat je een taak oppakt: check of de Eigenaar-regel al "— bezig" zegt. Zo ja: niet zelfstandig ook gaan zitten werken aan hetzelfde bestand/component — vraag Bob eerst wie 'm afmaakt (dit gebeurde op 2026-08-04: twee sessies pakten onafhankelijk P0-2 op; Bob moest scheidsrechteren). Zet zelf "— bezig" in de Eigenaar-regel zodra je serieus aan een taak begint, en haal het weer weg (of verwijder de taak, zie hieronder) zodra je stopt.

    Afronden: een volledig afgeronde taak wordt verwijderd uit deze lijst (niet gearchiveerd). Bij gedeeltelijke voortgang: taak laten staan met bijgewerkte inhoud die alleen het resterende werk beschrijft.

    Modelkeuze: Haiku vs Sonnet

    Korte conclusie (2026-08-05, beoordeeld): niet standaard overschakelen op Haiku voor dit project. Bijna elke Claude-taak hier eindigt als een FlutterFlow-builder-interactie (Bob kan zelf geen code bewerken, zie CLAUDE.md), en die builder is canvas-gerenderd Flutter Web zonder normale DOM/accessibility-tree. Dat botst met precies Haiku's zwakke kant: geduldig multi-stap troubleshooten (scroll-pogingen, DOM/shadow-DOM-zoektochten, accessibility geforceerd activeren, herkennen van een "Discard changes?"- dialoog, op tijd stoppen na 1-2 pogingen i.p.v. blijven klikken of per ongeluk een Delete-knop raken). Zelfs taken die er triviaal uitzien (bv. P1-10's cache-toggle: 1 klik + Confirm) bleken pas na 6+ verschillende technieken écht geblokkeerd op een clipping-bug — dat vraagt het uithoudingsvermogen/verstand van Sonnet om zowel de pogingen als het op tijd stoppen goed te doen.

    • Wel Haiku-geschikt — puur lezen/greppen/samenvatten, geen builder-UI, geen destructief risico:
      • De audit-/verificatiestappen die dit bestand al vaak gebruikt om "open" vs "al gefixt" te bevestigen (git log -S"...", gerichte grep) — zie de vuistregel hierboven over verouderde taakstatus.
      • Live emulator-checks (app draaien, deep link/navigatie, scherm/ logs checken) — geen builder-bewerking. Kanttekening (2026-08-05): de eerder als "laag risico, duidelijk slagingscriterium" ingeschatte P1-8-check bleek bij uitvoering juist 2 échte crashes op te leveren (zie P1-1 punt 4 en de nieuwe P1-12) — het navigeren/screenshotten zelf is Haiku-geschikt, maar de opvolging (stacktrace naar exacte broncoderegel herleiden, onderscheid maken tussen "al bekend probleem" en "nieuwe bug", inschatten of normaal gebruik geraakt wordt) vroeg meer redeneerwerk dan verwacht — bij een crash-bevinding op zo'n check de opvolging liever alsnog met Sonnet doen.
    • Niet Haiku-geschikt (Sonnet aanhouden): elke taak die een builder-widget/-property wijzigt (vrijwel alle overige P1/P2-taken), en taken die ontwerpkeuze/afweging vragen zoals P1-9 en de P2-features (P2-2 t/m P2-6, P2-8) — geen mechanisch patroon, dus geen goede Haiku-fit.

    P0 — blokkeert livegang

    (P0-6 volledig afgerond 2026-08-09 avond, incl. hintText-restpunt — door Bob zelf gedaan in de builder, geverifieerd via verse flutterflow export-code: keys d507d3b9/t8h5f8ir in internationalization.dart staan nu op nl: 'E-mailadres'/en: 'Email address' resp. nl: 'Wachtwoord'/en: 'Password'. Uit deze lijst verwijderd.)

    (P0-1 afgerond 2026-08-10 avond — Bob, builder, bevestigd via verse export: HomeUitgaanSliderComponent toont nu if (homeslider.isEmpty) { return Image.asset('assets/images/logo800px.png'); } vóór de Carousel gebouwd wordt. Uit deze lijst verwijderd.)

    (P0-3 afgerond 2026-08-10 avond — Bob, builder, beide restpunten bevestigd via verse export. Punt 1: Flexible(child: Text(...)) staat nu om de gemeente-/provincienaam in HeaderButtonsComponent. Punt 2: eenvoudiger opgelost dan gepland — i.p.v. losse If/Then/Else-logica op EventCurrent na te bouwen (waar Claude eerder 5x vastliep) is de hele losse AppBar-Row daar vervangen door een instantie van de gedeelde HeaderButtonsComponentWidget(), die de naam-logica al bevat. Het laag-risico restpunt (default-locatie 28666/28694 toont nog geen naam bij allereerste app-start) staat als bijvangst bij P2-7 hieronder. Uit deze lijst verwijderd.)

    *(P0-4 afgerond 2026-08-14 — live pair-sessie, Bob builder, bevestigd via verse export: favorieten_widget.dart Tab 3 ("Favoriete Gelegenheden") toont nu if (favorieteGelegenheidItem.isEmpty) { return Image.asset('assets/images/logo800px.png'); } vóór de ListView.builder gebouwd wordt — zelfde empty-state-patroon als P0-1/P1-1. Bob zet er later nog begeleidende tekst bij (cosmetisch restpunt, geen blocker). Correctie tijdens uitzoekwerk: Tab 1 ("Persoonlijke agenda") en Tab 2 ("Favoriete gemeenten") bleken bij inspectie nog helemaal niet gebouwd (kale placeholder-tekst, geen lijst) — die empty-state-vraag is dus alleen op Tab 3 van toepassing, zie P1-7 voor het bouwplan van tab 1/2. Bevestigd dat favorieten al syncen via Drupal bij inloggen (root cause gefixed 2026-08-09, zie P1-18) — Tab 3 haalt live data op via FavorietenAgendaCall. Uit deze lijst verwijderd.)*

    P0-5 · Eigenaar: Bob. Drupal: anonieme leestoegang onderzoeken voor browse-endpoints. Drupal-niveau, geen Claude-taak — nog open. (Bijvangst afgerond 2026-08-14, live pair-sessie: de hardcoded Basic-Auth-header (Authorization: Basic Ym9iOnNlcmhpaQ==, decodeert naar bob:serhii, alleen nodig voor de devbob.uitgaanskrant.com-dev-omgeving) is nu uit alle 15 API-calls in api_calls.dart verwijderd via de Headers-tab per call — bevestigd via verse export: 0 treffers meer.)

    *(P0-7 afgerond 2026-08-13 avond — Bob, Drupal-kant: de kapotte flutterflowmobiel_establishment_info-Views-display (services_1) is gefixt, EstablishmentInfoCall geeft niet langer HTTP 500. Live bevestigd (Claude, emulator-5554, verse app-launch, nid 91142 = "De Beun"): titel, fotocarousel en HTML-inhoud tonen nu allemaal echte Drupal-data i.p.v. de title/content/kapot-plaatje-placeholders. Uit deze lijst verwijderd. Dit legt meteen een nieuwe, dringende vervolgbug bloot — zie P0-8 hieronder: met echte data stroomt de Info/Links/Bezorgen-tabs breekt de pagina zichtbaar (RenderFlex-overflow

    • letterlijke "null"-tekst), iets wat met de eerdere lege/placeholder-data niet zichtbaar was.)*

    *(P0-8 grotendeels afgerond 2026-08-14 — live pair-sessie, Bob deed de builder-edits, Claude verifieerde elk veld met een verse export (zelfde werkwijze als de 2026-08-10-sessie). Alle 10 Info-tab/Links-tab-velden bevestigd correct (adres, plaats, telefoonnummer, email, kvk, website, menukaart, facebook, twitter, instagram — allemaal != null && != ''). Bezorgen-tab: bestellink/bezorgkosten/ minimaleorder ook bevestigd correct; thuisbezorgtbetaalopties werkt met een net iets andere maar functioneel prima variant ("Is Set" i.p.v. "Is Set and Not Empty" — laag risico, blijft zo staan). Onderweg 2x een per-ongeluk omgekeerde conditie (== '' i.p.v. != '') gevonden en gecorrigeerd op adres/kvk/website — zelfde soort verkeerde-operator-fout als hieronder bij Minor-1 blijvend openstaat. 3 restpunten bewust niet als launch-blocker behandeld (Bob's beslissing 2026-08-14) — verplaatst naar "Minor — non-blockers" hieronder: bezorgtijden (conditie hangt aan het verkeerde veld), afhaalopties + bezorgdin (nog geen conditie, wacht op Bob's uitzoekwerk hoe deze twee velden uit de API komen). Het losse "tikbare links"-verbeterpunt is verplaatst naar P1-23. Uit de P0-lijst verwijderd.)*

    P0-9 · Eigenaar: Bob (Drupal-kant, zelfde soort fix als P0-7). Kapotte Drupal-Views-display op Home — bevestigd 2026-08-15 (Claude, puur curl, geen emulator nodig):

    curl -s "https://uitgaanskrant.com/nl/flutterdrup/views/flutterflowmobiel1.json?display_id=display_3"
    → ["Display display_3 on view flutterflowmobiel1 could not be found"]
    

    i.p.v. de verwachte lijst met event-objecten (HTTP 200, dus geen 500 — gewoon een niet-bestaande/verwijderde display-naam op de flutterflowmobiel1-view, zelfde soort Drupal-Views-misconfiguratie als het inmiddels gefixte P0-7). Wordt gebruikt door HomeUitgaantabelKaartComponentWidget(displayid: 'display_3') op Home (lib/uitgaanspaginas/home/home_widget.dart:311-313, eerste van 5 category-secties — exacte zichtbare tab-plek nog niet 100% bevestigd, zie hieronder). De overige 4 vergelijkbare secties (services_4/5/6/7) zijn wél gewoon in orde (elk 25 items, bevestigd via dezelfde curl-check). Sterk vermoede link naar twee losse live bevindingen dezelfde sessie — zie P1-24 (herhaalde "No host specified in URI"-crash direct bij Home-launch) en P1-25 (nieuwe RenderFlex-overflow in exact hetzelfde componentbestand, regel 359): een los array-element dat een string is i.p.v. een object past bij beide symptomen (getJsonField op een string-element geeft vermoedelijk null/onverwachte waarden terug in plaats van de verwachte velden). Fix: in Drupal de display_3-display op de flutterflowmobiel1-view herstellen/opnieuw aanmaken (of de FlutterFlow-call omzetten naar de juiste bestaande display-naam, als display_3 per ongeluk hernoemd/verwijderd is) — zelfde categorie fix als P0-7. Na de Drupal-fix: opnieuw live testen of P1-24/P1-25 daarmee ook verdwijnen, dat bevestigt of de link klopte.

    Minor — non-blockers (launch mag hier niet op wachten)

    Bob's expliciete categorie (2026-08-14): kleine restpunten uit P0-8 die de livegang niet blokkeren, later oppakken.

    (Minor-1 afgerond 2026-08-16 — Bob, builder, live pair-fix sessie: de "bezorgtijden"-Visibility-conditie op HorecagelegenheidCurrent (Bezorgen-tab) bindt nu aan JSON Path $[:].bezorgtijden i.p.v. het verkeerde Openingstijden-veld. Bevestigd via verse export. Uit deze lijst verwijderd.)

    Minor-2 · Eigenaar: Bob. HorecagelegenheidCurrent (horecagelegenheid_current_widget.dart), Bezorgen-tab: "afhaalopties" en "bezorgdin" hebben nog geen Visibility-conditie (kale Text(getJsonField(..., r'''$[:].afhaalopties/bezorgdin''').toString())) — tonen dus nog een letterlijke "null" bij een leeg veld. Bob moet eerst uitzoeken hoe deze twee velden uit de API komen (2026-08-14: "moet ik even kijken") voordat de standaard "Is Set and Not Empty"-fix (zelfde recept als de overige 15 velden van het oorspronkelijke P0-8) toegepast kan worden.

    Drupal dingen — verzamellijst, batchen bij Bob's eigen Drupal-sessie

    Eigenaar: Bob. Bob's voorkeur (2026-08-13): kleine builder-fixes die toch al wachten op ander Drupal-werk hier verzamelen i.p.v. los oppakken — dan in één builder-bezoek samen met de Drupal-kant afhandelen.

    • Hartje-icoon op de horecagelegenheid-detailpaginaafgerond (2026-08-16, Bob, builder, live pair-fix sessie). If-tak van de ConditionalBuilder rond IconButtonFavoriet toont nu Icons.favorite (gevuld) met witte Fill Color, zelfde stijl als de Else-tak. Bevestigd via verse export. Geen Drupal-afhankelijkheid nodig gebleken — puur cosmetisch, meegepakt tijdens een toch al geplande sessie op deze pagina.
    • P1-7 Tab 3 "Favoriete Gelegenheden"afgerond (2026-08-14, Claude, builder), zie P1-7 hieronder. Was hier vermeld als Drupal-geblokkeerd; bleek stale en is dezelfde sessie alsnog gloednieuw gebouwd (nooit door Bob opgepakt) — geen actie meer nodig.

    P1 — snel na livegang

    *(P1-23 afgerond 2026-08-16 — Bob, builder, live pair-fix sessie: website, menukaart, facebook en bestellink op HorecagelegenheidCurrent hebben nu allemaal een tap-actie (launchURL(getJsonField(..., r'''$[:].<veld>''')), direct via de Text-widget's eigen Actions-tab — geen InkWell-wrap nodig gebleken). Bijvangst: twitter/instagram (niet in de oorspronkelijke scope, zelfde patroon) zijn tegelijk meegepakt. Bevestigd via verse export (5 launchURL-aanroepen). Alle 4+2 velden hadden al de "Is Set and Not Empty"-guard uit P0-8, dus geen los crash-risico meer zoals bij het oorspronkelijke P1-15. Nog geen visuele link-styling (kleur/ underline) — puur cosmetisch restpunt, functioneel al klaar. Uit deze lijst verwijderd.)*

    (P1-18 afgerond 2026-08-10 avond — Bob, builder + Custom Code, in twee stappen. Root cause was een dubbele bug: (1) login_widget.dart behandelde het drupalLogin-resultaat als bool i.p.v. een JSON-map → crashte altijd; (2) de eerste conditie-fix checkte alleen "is $.success aanwezig" i.p.v. de waarde, wat altijd waar was (het veld zat er sowieso in, bij succes én bij falen). Uiteindelijke oplossing — op Bob's eigen voorstel — was simpeler dan een aparte Custom Function: drupal_login.dart retourneert nu null bij een mislukte/foute login i.p.v. een {success: false, ...}-map, en de knop's conditie is teruggebracht tot een simpele, echte null-check (_model.resultDrupalLogin != null, operator "Is Set" op de hele actie-output, geen JSON Path meer nodig). Bevestigd via verse export. Het losse debug-dialoogje (AlertDialog "melding" met de rauwe JSON) is blijven staan — niet meegenomen in deze fix, kan later nog opgeruimd worden als cosmetische bijvangst. Uit deze lijst verwijderd.)

    *(P1-1 volledig afgerond 2026-08-10 avond — Bob, builder, alle 4 sub-punten bevestigd via verse export: HomeUitgaanSliderComponent (= P0-1), PUitgaanSliderComponent, EvenementComponent, horecagelegenheidCurrent tonen nu allemaal if (<lijst>.isEmpty) { return Image.asset('assets/images/logo800px.png'); } vóór hun Carousel gebouwd wordt. Uit deze lijst verwijderd. Vervolgaudit 2026-08-13 (Claude): dit loste de lege-líjst-crash op, maar dekt niet per se een leeg imageUrl-veld op een individueel item binnen een wél-gevulde lijst (ander sub-geval van hetzelfde CachedNetworkImage-patroon uit CLAUDE.md) — daarom alle 13 live CachedNetworkImage-aanroepen in het project nagelopen op precies dát: 9 hebben een if (... != null && ... != '')-guard (of valueOrDefault, wat het risico verlegt naar een kapot-plaatje-icoon i.p.v. een crash — zie P0-7/P1-6), en de resterende 4 gebruiken allemaal getJsonField(item, r'''$.logo''').toString() — bij een ontbrekend veld levert .toString() op null de string "null" op (4 tekens), nooit een lege string, dus geen synchrone CachedNetworkImage-crash (wel een kapot plaatje, cosmetisch). Van die 4 zijn er 3 op HorecagelegenheidEventTabelComponentCopy (al bekend kapot via P1-11, geen nieuwe info) en 1 op het bevestigd dode/orphan UitgaantabelKaartComponentWidget (P2-7, niet live bereikbaar). Geen nieuwe crash-risico's gevonden — deze deelvraag is hiermee afgesloten, niet opnieuw op te pakken.)*

    (P1-3 afgerond 2026-08-10 avond — Bob, builder, bevestigd via verse export: Flexible(child: Text(functions.kortDatum(widget!.datum))) staat nu op "Text-datum" in PUitgaanSliderKaartComponent. Uit deze lijst verwijderd.)

    (P1-4 afgerond 2026-08-14 — live pair-sessie, Bob builder: horcat- parameter op HorecagelegenheidoverzichtCall (voorheen "EstablishmentsCall") kreeg Default Value '17967' (categorie "Uitgaansgelegenheden"). Bevestigd via verse export: String? horcat = '17967' i.p.v. de crashende horcat ??= null!;. Uit deze lijst verwijderd.)

    P1-5 · Eigenaar: Bob. "Thuis bezorgen" koppelen aan een echt leverbaar-veld per horecagelegenheid. Wacht op Bob: eerst het API-endpoint aan Drupal-kant configureren. Daarna tonen/verbergen op basis van het echte veld i.p.v. de huidige dode tap.

    P1-6 · Eigenaar: Bob (mechanisch, maar groot — spreid over sessies). Letterlijke veldnaam i.p.v. nette placeholder bij ontbrekende data. 2026-08-05: audit herhaald (Claude, verse grep) — scope flink groter dan de eerdere 13 treffers van 2026-08-04, met name evenement_horecagelegenheid_widget.dart bleek nog niet meegenomen. Patroon overal hetzelfde: valueOrDefault<String>(<bron>, '<default>') waarbij de default gelijk is aan de veld-/functienaam. Fix is mechanisch (Default Value-tekst aanpassen in de builder op het Text-widget), maar raakt dezelfde "Set from Variable"-property als de Empty-URL-fix — zelfde risico-inschatting als het CachedNetworkImage-patroon. Niet in één sessie proberen af te maken gezien de omvang hieronder (~45 treffers); pak het file-voor-file op.

    • horecagelegenheidoverzicht_kaart_widget.dart:359/383/410 — titel/adres/plaats
    • evenement_info_widget.dart:136/158/213/238/293 — adres/plaats/entreeprijs/entreetoelichting/contact
    • evenement_component_widget.dart:221/242/317/339 — title/eventDate/adres/plaats (317/339 zijn nieuw t.o.v. de 2026-08-04-audit, waren toen nog niet aanwezig of gemist)
    • horecagelegenheid_current_widget.dart:377/500/747 — title/logo/content (volledig nieuw gevonden, stond niet in de vorige audit). Zie P0-7: deze 3 velden bleken 2026-08-12 live op elke geteste gelegenheid permanent op de placeholder te blijven staan (niet incidenteel) — een betere Default-Value-tekst alleen lost dat niet op, eerst P0-7's onderliggende data-probleem oplossen.
    • event_current_widget.dart:327/418/442 — title/nid/date (327 en 442 zijn nieuw t.o.v. de 2026-08-04-audit, alleen nid stond er al in)
    • evenement_horecagelegenheid_widget.dartgrootste blok, ~30 treffers, volledig nieuw t.o.v. de vorige audit (waarschijnlijk pas zichtbaar geworden na de P1-image-crash-fix-uitbreiding van dit component): regels 178(HorecaNaam), 418(establishmentnid), 445(email), 476(Logo), 499(Plaats), 533(Adres), 577/586/597 (Telefoon, 3x — icoon/tekst/tooltip-varianten), 642(menukaart), 710(entreeprijs), 743(EntreeToelichting), 818/827/843(facebook, 3x), 885/894/910(instagram, 3x), 952/961(twitter, 2x), 1016/1025/1041(Website, 3x), 1083/1092/1108(urluk, 3x), 1194(Openingstijden), 1222(OpeningstijdenUitzondering), 1310(Bezorgtijden), 1337(bezorgkosten), 1364(bestellink).
    • Grensgeval (geen letterlijke veldnaam maar wel technische/zinloze placeholder, zelfde fix-aanpak): p_uitgaan_slider_kaart_component_widget.dart:284 toont 'def' als datum ontbreekt.
    • Niet-verdachte gevallen bewust genegeerd (echte inhoudelijke fallback, geen technische naam): 'Evenement' (kaart_tabel_uitgaan_comp_widget.dart:216, kaart_tabel_uitgaan_s_comp_widget.dart:123) en 'Uitgaan' (tag_categorie_component_widget.dart:113).
    • Let op — voor de Facebook/Instagram/Twitter/Website/urluk-knoppen op evenement_horecagelegenheid_widget.dart is dit géén puur cosmetisch probleem, zie P1-15 hieronder: de Default-Value-tekst aanpassen lost daar de crash niet op, alleen de zichtbare tekst als hij (na de P1-15-fix) wél verborgen wordt.

    *(P1-15 volledig afgerond — bevestigd 2026-08-15, Claude, na een lokale git-sync-achterstand van 12 bestanden ingehaald (zie sessienotitie bovenaan): behalve de al bekende 5 social-/contact-knoppen op evenement_horecagelegenheid_widget.dart blijken ook de laatste 3 open restpunten uit de bredere audit inmiddels gefixt in de builder (door Bob, nooit apart gemeld/gecommit) — Menukaart-knop (evenement_horecagelegenheid_widget.dart:626-635) heeft nu de if (... != null && ... != '')-guard, Website-knop op evenement_info_widget.dart:262 (gebruikt op EventCurrent) en Website-knop op evenement_component_widget.dart:408 (orphan EventWidget) hebben beide nu ook een guard om de InkWell. Geverifieerd via een verse flutterflow export-code + git diff (commit 2c093bc). Nog steeds geen verklaring gevonden voor de losstaande "Op/vanaf de Home-pagina zelf"-crash-log uit 2026-08-07 (zie de oude aantekening hieronder) — de reproductie op 2026-08-15 (zie sessienotitie bovenaan, herhaalde Invalid argument(s): No host specified in URI direct bij Home's eerste launch, vóór enige tap) laat zien dat dit ondanks alle bovenstaande fixes nog steeds optreedt — dus een andere, nog niet gevonden bron. Uit deze lijst verwijderd als losse P1-taak; de resterende mysterie-crash staat nu apart als P1-24 hieronder.)*

    • (Oude beschrijving voor de context, root cause gold voor de 5+1 hierboven bevestigde knoppen:) Kapotte zichtbaarheids-conditie op de social-/contact-knoppen liet de app crashen bij tikken (niet alleen lelijke tekst) — if (valueOrDefault<String>(<veld>, '<placeholder>') != null && ... != '') is altijd waar omdat valueOrDefault nooit null/'' teruggeeft, dus onTap riep launchURL() aan met de kale placeholder-string als URL (geen geldig schema/host → crash).

    P1-24 · Eigenaar: Onbepaald. Onverklaarde Invalid argument(s): No host specified in URI-excepties — zelfde foutmelding als het net afgeronde P1-15, maar blijken niet door die fix verklaard: live herbevestigd 2026-08-15 (Claude, verse ff-run-fvm.sh-launch, emulator-5554) dat deze exceptie 6x achter elkaar direct bij Home's allereerste launch verschijnt, vóór enige gebruikersinteractie — dus niet vanuit een onTap-knop-tik zoals bij alle bekende P1-15- plekken. Sterke verdachte gevonden (2026-08-15, Claude, puur via curl op de API, geen emulator nodig): zie de nieuwe P0-9 hieronder — een van Home's category-secties (display_id=display_3) geeft een kapotte Drupal-Views-response terug (["Display display_3 on view flutterflowmobiel1 could not be found"], een array met 1 losse string i.p.v. de verwachte lijst objecten). HomeUitgaantabelKaartComponentWidget (die deze sectie rendert, zie home_uitgaantabel_kaart_component_widget.dart:132) verwacht overal JSON-objecten met velden als .logo/.categorie — wat er precies gebeurt als getJsonField op een los string-element in de array losgelaten wordt (mogelijk een intern type-mismatch die zich uit als een kapotte/host-loze URI ergens verderop in de widget-boom) is nog niet 100% hard bevestigd met een stack trace, maar de timing (meteen bij Home's launch, geen tap nodig) en de aanwezigheid van precies 1 kapotte Drupal-view op exact dezelfde pagina maken dit de meest waarschijnlijke oorzaak. Volgende stap zodra P0-9 (Drupal-kant) gefixt is: opnieuw live testen of deze exceptie dan ook verdwijnt — zo niet, dan alsnog het FIFO/R-recept of een gerichte --route-launch gebruiken om een verse volledige dump te vangen (de single-dump-per-proces-beperking uit CLAUDE.md verbruikte de stack trace deze sessie aan de ongerelateerde overflow van P1-25).

    P1-25 · Eigenaar: Onbepaald. Nieuwe RenderFlex-overflow gevonden 2026-08-15 (Claude, live launch emulator-5554): "A RenderFlex overflowed by 129 pixels on the bottom", Column, in lib/uitgaanspaginas/home_uitgaantabel_kaart_component/home_uitgaantabel_kaart_component_widget.dart:359. Geen directe visuele crash op het eerste scherm (Home bleef verder bruikbaar), maar wel een echte layout-fout op de al vaker aangepaste HomeUitgaantabelKaartComponent (zie P1-19 — dat loste een ander, kale-Row-zonder-Wrap-probleem in hetzelfde bestand op, dit is een nieuw/apart punt). Mogelijk dezelfde oorzaak als P1-24 hierboven (de kapotte display_3-Drupal-view, zie het nieuwe P0-9 — dit component rendert die sectie, en 1 array-element dat een losse string is i.p.v. een object past bij zowel een layout- als een URI-fout) — eerst P0-9 fixen en herlive-testen vóórdat hier los verder gezocht wordt. Nog geen stack trace met widget-boom-context gevangen (zelfde single-dump-beperking als P1-24 hierboven) — bij onderzoek eerst een hot-restart vlak vóór het tonen van deze component om een verse volledige dump te krijgen.

    P1-16 · Eigenaar: Bob (Firebase-koppeling is account-/builder-niveau, geen Claude-taak). Geen crash-reporting/analytics (bv. Firebase Crashlytics) ingesteld. Nu is de enige manier om een crash zoals P1-15 hierboven te zien een handmatige flutter run-log tijdens een actieve sessie — na livegang is dat niet meer haalbaar, dan draai je blind. Aanbeveling: instellen vóór livegang, niet pas erna — FlutterFlow heeft ingebouwde Firebase-integratie (Crashlytics minimaal, Analytics optioneel) die met een paar builder-instellingen aan te zetten is. Zonder dit blijft elke toekomstige crash-bug (nieuwe RenderFlex- overflows, een volgende launchURL-achtige misser) onzichtbaar totdat een gebruiker 'm toevallig meldt. Vers gecheckt 2026-08-13 (Claude, grep op "crashlytics"/"firebase" in lib/ en pubspec.yaml): nog geen enkele Firebase-referentie in het project — nog steeds volledig niet opgepakt.

    P1-17 · Eigenaar: Onbepaald. Live bevestigd 2026-08-07 (Claude, emulator met systeemtaal en-US, verse app-data): de app valt terug op Engels zodra het toestel niet op Nederlands staat (geen opgeslagen taalvoorkeur → MaterialApp.locale is null → Flutter matcht het systeem-en-US tegen de ondersteunde ['nl','en']-lijst en kiest en). Dat zou op zich geen probleem zijn als er een echte Engelse vertaling stond — die is er vrijwel niet: van de 169 sleutels in lib/flutter_flow/internationalization.dart zijn er 50 waar nl/en toevallig identiek zijn (onvertaald), 44 waar beide talen leeg zijn (dus zichtbaar niets, zoals de Login-hinttekst uit P0-6), en slechts 1 sleutel met een bewust andere Engelse tekst — en die ene is fout: key 7pacsyhe (het hartje-menu-item in de drawer) toont nl: 'Favorieten' maar en: 'Home', dus een Engelstalig toestel ziet twee menu-items met de tekst "Home" (huis-icoon én hartje-icoon) — verwarrend, de favorieten zijn zo niet te vinden. Iedere gebruiker met een Engelstalig toestel (niet ongebruikelijk, ook onder Nederlanders) krijgt dus een merkbaar kapotte/lege interface. 2026-08-09, Bob: Engels moet blijven aangeboden (niet weghalen als taal) — de eerder voorgestelde "forceer hard op nl"-fix (Engels uit FFLocalizations.languages() verwijderen) is dus afgewezen, niet uitgevoerd. Resterende optie is de grotere, aparte contentklus: de ontbrekende Engelse vertalingen daadwerkelijk invullen (of een losse taalkeuze-instelling bouwen i.p.v. op systeemlocale te vertrouwen). Nog niet opgepakt. Live herbevestigd 2026-08-09 (Claude, emulator): root cause klopt exact zoals hierboven beschreven — op een device met ro.product.locale=en-US verdween de "Wachtwoord vergeten?"-link op Login volledig (lege en-vertaling voor key utppw2si); na adb shell cmd locale set-app-locales com.uitgaanskrant.app --locales nl-NL (betrouwbaardere per-app-locale-override dan de systeembrede settings put system system_locales + broadcast, die op de emulator niet altijd doorwerkte zonder reboot) kwam de tekst meteen terug — bevestigt dat dit puur een vertaalprobleem is, geen widget-bug.

    P1-7 · Eigenaar: Onbepaald. "Favorieten pagina maken" (Bob's naam voor deze taak, 2026-08-13 — was P0-4, samengevoegd met het oude P1-7 favorieten/profielscherm-werk + P2-8 gemeente-favoriet). Bob bouwt de Drupal-kant (views/endpoints) zelf, apart; Claude/deze sessie kan de lokale/UI-kant + look&feel oppakken zolang die niet op Drupal wacht.

    Al afgerond (2026-08-13, geverifieerd via verse export):

    • App State-velden favorieteGemeenteIds en favorieteHorecaNids (beide List<String>, Persisted: true) bestaan nu in lib/app_state.dart.
    • Hartje-toggle op HorecagelegenheidoverzichtKaart (overzichtskaart) volledig werkend: ConditionalBuilder op FFAppState().favorieteHorecaNids.contains(widget!.nid) (ingesteld via "Set from Variable" → Available Options → List Contains Item, zie CLAUDE.md) — If-tak toont gevuld hartje + removeFromFavorieteHorecaNids, Else-tak toont outline hartje + addToFavorieteHorecaNids. Logica én styling (witte Fill Color op beide takken) bevestigd correct.
    • Hartje-toggle op HorecagelegenheidCurrent (detailpagina): zelfde patroon, Remove/Add-acties functioneel correct. Cosmetisch restpunt (icoon/kleur If-tak nog niet aangepast) verplaatst naar de "Drupal dingen"-lijst hierboven — Bob wil dit batchen met een latere Drupal-sessie.
    • Tab 3 "Favoriete Gelegenheden" — volledig gebouwd en werkend (2026-08-14, Claude, builder, bevestigd via verse export + flutter analyze). Gebruikt FavorietenAgendaCall (1 sessie- geauthenticeerde call, geen client-side nid-lijst nodig). Bouwstappen (herbruikbaar patroon, zie ook de nieuwe "Generate Dynamic Children"- sectie in CLAUDE.md):
      1. ListView ingevoegd op Tab 3's lege Column (Insert Widget → Layout Elements → ListView), placeholder-Text verwijderd.
      2. Backend Query (database-icoon) → API Call → FavorietenAgenda toegevoegd aan de ListView.
      3. ListTile als item-template ingevoegd in de ListView.
      4. Generate Dynamic Children (4e icoon in de widget-iconenrij, tooltip bevestigt de naam) op de ListView aangezet: Variable Name favorieteGelegenheidItem, Value → Set from Variable → FavorietenAgenda Response → Available Options "No Further Changes" (rauwe JSON-array, geen predefined-path-extractie) → Save → bevestigingsdialoog ("generate its children dynamically... edit the first child to set how every child should look") → Ok. Canvas toont meteen 4 herhaalde design-time placeholder-rijen.
      5. ListTile's Title opnieuw gebonden (was per ongeluk nog aan de hele API-respons gebonden i.p.v. het loop-item): Set from Variable → bron favorieteGelegenheidItem (nieuw beschikbaar ná stap 4) → Available Options "JSON Path"$.node_title.
      6. Subtitle leeggemaakt (triple-click veld → Delete) — geen bruikbaar 2e veld in deze call, anders bleef de letterlijke placeholder-tekst "Subtitle" op elke rij staan (zelfde P1-6-patroon).
      7. On Tap-actie (Actions-tab, 2e icoon — ja, deze tab bestaat wel, zie de gecorrigeerde P1-9-notitie): Navigate To → horecagelegenheidCurrent → Parameters → Pass (niet "Define" — dat opent per ongeluk de doelpagina's eigen parameterschema-editor) → parameter nid → Value → Set from Variable → bron favorieteGelegenheidItem → JSON Path $.nid. Gegenereerde code geverifieerd (ListView.builder + getJsonField(favorieteGelegenheidItemItem, r'''$.node_title''') + context.pushNamed(HorecagelegenheidCurrentWidget.routeName, queryParameters: {'nid': ...$.nid...})), flutter analyze toont geen nieuwe treffers voor favorieten_widget.dart. Bekend restpunt, geen blocker: geen leading-logo-afbeelding (ListTile's "Leading"-sectie biedt alleen een Icon-property, geen Image-slot — zou een aparte widget-vervanging vergen). (Lege-lijst-state inmiddels ook gefixt — zie het voormalige P0-4 hierboven, zelfde live pair-sessie.)

    Nog open:

    • Tab 2 "Favoriete gemeenten" vullen — geen Drupal-blocker bekend: gemeenteNaamById (custom function) + favorieteGemeenteIds kunnen in principe al een lijst van gemeentenamen tonen, zodra er ooit iets in die lijst staat. Uitgezocht (2026-08-13, Claude, code-audit): er bestaat nog helemaal geen favoriet-toggle-UI voor gemeentengrep op favorieteGemeenteIds in heel lib/ geeft alleen de declaratie in app_state.dart terug, geen enkele andere referentie (ter vergelijking: favorieteHorecaNids heeft wél 2 echte toggle-implementaties, zie hierboven). Structureel probleem: de huidige gemeente-kiezer leent zich niet 1-op-1 voor het bekende hartje-kaartje-patroon. Provincie/gemeente wordt gekozen via SelectStateDropDownComponentWidget (lib/selecteer_plaats/select_state_drop_down_component/...widget.dart, gebruikt binnen SelectprovinciegemeenteWidget) — dat zijn twee losse FlutterFlowDropDown<String>-widgets (provincie- en gemeentedropdown), geen lijst/kaartjes-grid met losse tappable item-widgets zoals de horeca-overzichtskaart. Een dropdown-item is in FlutterFlow platte tekst; er is geen ingebouwde manier om er een los tikbaar hartje-icoontje naast te zetten zonder de dropdown zelf te vervangen door een andere widget (bv. een ListView met item-rijen). Twee realistische opties, ter bespreking met Bob vóórdat dit gebouwd wordt:
      1. Kleinere ingreep: één favoriet-hartje bij de huidige keuze zetten (bv. naast de reeds geselecteerde gemeentenaam elders in de app, zoals op HeaderButtonsComponent of Home), i.p.v. favorieten vanuit de dropdown-lijst zelf te kunnen aanvinken — "favoriet deze gemeente" i.p.v. "kies uit een lijst welke gemeenten favoriet zijn".
      2. Grotere ingreep: de provincie/gemeente-dropdown op SelectStateDropDownComponentWidget vervangen door een lijst-gebaseerde kiezer met per-rij hartje, functioneel vergelijkbaar met de horeca-kaartjes — grotere structurele wijziging, geen quick win. Geen van beide is deze sessie uitgevoerd (buiten scope voor code-only werk, en vraagt eerst een ontwerpkeuze van Bob).
    • Tab 1 "Persoonlijke agenda" (events in favoriete gemeente(n)) — uitgezocht (2026-08-14, Claude, code-audit): geen nieuwe Drupal-call nodig, bestaande calls volstaan al. UitgaanstabelCall/ UitgaanSliderCall (api_calls.dart) accepteren allebei al een townid-parameter (nu gebruikt door PUitgaantabelKaartComponent/ PUitgaanSliderComponent voor de huidige gekozen gemeente) — exact wat hier nodig is. Bouwplan: loop over favorieteGemeenteIds (App State, al gevuld zodra Tab 2 ooit favorieten heeft) en roep UitgaanstabelCall per gemeente-id aan, resultaten samenvoegen tot 1 lijst (of simpeler: hergebruik PUitgaantabelKaartComponent als los blok per favoriete gemeente, met een kopje erboven = gemeentenaam). Geen Drupal-wijziging nodig — wel afhankelijk van Tab 2's favoriet-toggle-UI (zie hierboven), want zonder die blijft favorieteGemeenteIds altijd leeg.
    • "Gebruiker"-tab, "Uitloggen"-knop afgerond (2026-08-15, Claude, builder, bevestigd via verse export + flutter analyze: 0 errors). favorieten_widget.dart heeft nu een 4e tab "Gebruiker" (via TabBar's "Active Tab"-dropdown → "+ Add Tab", zie CLAUDE.md voor het herbruikbare recept) met een ListTile "Uitloggen". On Tap: Action 1 = Update App State (6 velden op "Clear Value": userToken/userSessionid/userSessionname/userName/userUid/ userMail), Action 2 = Navigate To Login met "Allow Back Navigation" uit (genereert context.goNamed(...) i.p.v. pushNamed, dus geen terugknop-pad naar de net-verlaten sessie). Nog open, zelfde tab: "Wachtwoord wijzigen" en "Account verwijderen" (zie Bob's beslissing 3 hieronder — account verwijderen heeft mogelijk AVG-implicaties aan Drupal-kant en is een App-Store-vereiste, zie daar) — deze twee zijn niet meegenomen, eigen vervolgtaak.
    • Open vraag aan Bob (blokkeert de Drupal-sync van favorieten): bestaat er al een Drupal-endpoint om een favoriet (horeca of gemeente) toe te voegen/verwijderen voor een ingelogde gebruiker (bv. Flag-module of een custom Services-resource), of moet dat nog gebouwd worden? Zonder endpoint-naam/-vorm blijft de huidige toggle lokaal-only (secureStorage, geen sync naar Drupal bij inloggen op een ander toestel).

    Bob's beslissingen (2026-08-09, nog steeds leidend):

    1. Favorieten (zowel horeca als gemeenten) worden Drupal-gesynchroniseerd, niet puur lokaal — sync bij app-start én direct na elke toevoegen/verwijderen-actie. Lokale opslag (FFAppState/ secureStorage) blijft daarnaast nodig als cache/snelle UI-state.
    2. "Persoonlijke agenda" (tab 1) = events in de door de gebruiker gefavoriete gemeente(n) (niet de her-toegekende naam "agenda" op de bestaande horeca-GET-call — dat is een aparte, nog te bouwen view).
    3. "Gebruiker"-tab = het oude P1-7-scope (wachtwoord wijzigen, uitloggen, account verwijderen), nu als tab i.p.v. aparte pagina. Account verwijderen heeft mogelijk AVG-implicaties aan Drupal-kant. Let op prioriteit: Apple's App Store Review Guideline 5.1.1(v) eist in-app accountverwijdering voor een app met accountaanmaak — zonder dit scherm blokkeert een iOS-submissie, niet alleen P1.

    *(P1-12 afgerond 2026-08-10 avond — Bob, builder, opgelost via een andere en betere route dan oorspronkelijk voorgesteld: i.p.v. een Default Value op establishmentID toe te voegen (die de crash slechts had gemaskeerd met een nep-waarde "0"), is de hele EvenementHorecagelegenheidWidget-instantie op EventCurrent nu achter een Visibility-conditie gezet die bindt aan de rauwe pagina-parameter horecaid zelf (operator "Is Set"), vóór een eventuele Default Value-substitutie — zelfde "bind aan de rauwe bron, niet aan de gesubstitueerde waarde"-principe als het bekende CachedNetworkImage/P1-15-patroon. Bevestigd via verse export: if (widget!.horecaid != null && widget!.horecaid != '') EvenementHorecagelegenheidWidget(... establishmentID: widget!.horecaid!, ...) — de force-unwrap is nu veilig, want alleen bereikbaar binnen de guard. Uit deze lijst verwijderd.)*

    P1-13 · Eigenaar: Bob (geblokkeerd op een bevestigd FlutterFlow- platformprobleem, geen Claude-taak meer totdat dat opgelost is). Live herbevestigd 2026-08-12 (Claude, verse build, telefoonformaat emulator-5554): nog steeds kapot, exact zoals hieronder beschreven — "BOTTOM OVERFLOWED BY 1529 PIXELS" op de Activiteiten-tab, zichtbaar al na de 2e rij kaartjes, geen scroll mogelijk voorbij dat punt. Geen voortgang t.o.v. 2026-08-10, geen nieuwe informatie deze sessie — puur een bevestiging dat de taak actueel blijft. Root cause + fix zijn bekend en juist toegepast in de builder (door zowel Claude als Bob, op zowel 1 als meerdere tabs), maar de wijziging bereikt nooit de export — zie de uitgebreide blocker-documentatie hieronder. Volgende stap is bij Bob: Issues-paneel checken, de alternatieve SingleChildScrollView-route proberen, of FlutterFlow-support contacteren. Op HorecagelegenhedenOverzicht → tab "Activiteiten" overflowt de kaartjesgrid. Root cause definitief bevestigd (2026-08-09, Claude, verse volledige stack trace + visuele bevestiging op emulator-5554):

    A RenderFlex overflowed by 5382 pixels on the bottom.
    Column:file:///.../lib/horecagelegenhedenoverzicht/horecagelegenheden_overzicht/horecagelegenheden_overzicht_widget.dart:286:29
    

    horecagelegenheden_overzicht_widget.dart:286-382: de Activiteiten-tab is een kale Column (mainAxisSize: MainAxisSize.max, regel 286) met als enige kind een FutureBuilder die uiteindelijk een MasonryGridView.builder bouwt (regel 354) met shrinkWrap: true + physics: NeverScrollableScrollPhysics() (regel 355-356/382) — dit patroon (shrinkWrapped grid zonder eigen scroll) vereist een scrollbare ouder om te werken, maar die ontbreekt hier: de Column zit direct in de TabBarView's Expanded (regel 282-284), zonder SingleChildScrollView eromheen. Met 25 items (regel 340, .take(25)) × Container(width: 600.0, height: 225.0) (regel 388-390) in 1 kolom op telefoonformaat (crossAxisCount: 1 onder kBreakpointSmall, regel 359-363) wil de grid ≈5625px hoog worden terwijl de tab maar een fractie daarvan aan ruimte heeft — vandaar de 5382px-overflow. Verklaart vermoedelijk ook de eerder waargenomen kleinere "on the right"-overflows elders in eerdere sessies (los bevestigd deze sessie op een ander component: zie P1-19's zustervondst op PUitgaanSliderKaartComponent:179, zelfde "kale-Row/Column-zonder-wrap"-familie maar niet dezelfde plek).

    • Bestandspad-correctie (2026-08-10): de hierboven genoemde horecagelegenheden_overzicht_widget.dart bestaat niet meer als zodanig — Bob's project splitst deze pagina inmiddels in HorecagelegenhedenOverzicht (dunne ConditionalBuilder-wrapper, [If/Then/Else 2 Conditions]) die naar horecagelegenheden_overzicht_page_data_type_widget.dart of ..._sort_page_widget.dart doorschakelt. De Activiteiten-tab-Column zit nu op regel ~277 van het PageDataType-bestand (structuur/getallen overigens identiek: Column(mainAxisSize: MainAxisSize.max)FutureBuilderMasonryGridView.builder(shrinkWrap: true, physics: const NeverScrollableScrollPhysics())). Navigeer in de builder dus naar ?page=HorecagelegenhedenOverzicht (niet naar de PageDataType/SortPage-varianten los) — de widget-tree toont dan gewoon de juiste, actieve tak.
    • Fix uitgevoerd in de builder (2026-08-10, Claude) — mechanisch, bevestigd correct qua stappen, maar NIET bevestigd in de export (zie blocker hieronder): op de Column binnen TabBar Page (kind van TabActiviteiten) bleek de Column zelf al binnen een bestaande Expanded(TabBarView(...)) te zitten (dus al bounded-height) — een losse "Scrollable"-toggle op die Column zelf gaf zelfs een expliciete "Invalid Action"-foutdialoog terug ("You can't set Expanded for a widget if it's in a Column that doesn't have a defined Height. This includes a Scrollable Column.") toen ik daarna ook Expanded op het kind probeerde — nuttige bevestiging dat FlutterFlow deze combinatie zelf detecteert en terugdraait. Werkende combinatie (op de StaggeredView-node zelf, kind van de Column, niet op de Column zelf): rechterpaneel → Expansion → Expanded (rechtse van de 3 iconen: None/Flexible/Expanded, in die volgorde — geen tooltip nodig om te onthouden) + Shrink Wrap → uit + Scrollable → aan. Geen foutdialoog bij deze combinatie, paneel toont "Synced"/"Saved", waarde blijft staan na page-reload binnen dezelfde sessie.
    • ⚠️ BLOCKER — bevestigd niet-doorzettend naar de export (2026-08-10, Claude): ondanks bovenstaande drie toggles zichtbaar correct in de builder (en blijvend zo na reload) én "Synced"-status zonder foutmelding, lieten drie onafhankelijke verse flutterflow export-code --as-debug-runs (over ca. 10 minuten, dezelfde opzet als Bob's eigen ff-run-fvm.sh gebruikt) geen enkele wijziging zien: Column/MasonryGridView in het geëxporteerde bestand staan nog altijd exact zoals vóór de builder-edit (shrinkWrap: true, NeverScrollableScrollPhysics, geen nieuwe Expanded). Sanity-check uitgevoerd: de exportpijplijn zelf werkt wél correct — dezelfde export toonde de al langer bevestigde P0-6-hintText-fix (d507d3b9/t8h5f8ir in internationalization.dart) gewoon goed. Ook een heel andere, eenvoudiger wijziging in dezelfde sessie (P2-9's dode terug-knop op Home, kale "Remove Widget"-actie) wél correct in de export terechtgekomen — dus dit is geen algemene sessie-brede exportstoring, het lijkt specifiek aan deze combinatie van property-toggles (Expansion/Shrink Wrap/Scrollable op een StaggeredView diep genest in een TabBarView) gebonden.
    • Update 2026-08-10, later dezelfde sessie: Bob heeft de 3 toggles ook zélf, met eigen muisklikken in zijn eigen browser gezet (Expansion → Expanded, Shrink Wrap → uit, Scrollable → aan) — óók dat kwam niet door in een verse export. Dit sluit "Claude's geautomatiseerde klik triggert geen echt change-event" als verklaring uit: zelfs een echte handmatige muisklik in Bob's eigen, ingelogde browser (bevestigd: mcp__claude-in-chrome__* draait sowieso al in Bob's eigen Chrome, geen aparte sandbox) persisteert deze specifieke combinatie niet. Dit wijst nu sterk op een echt FlutterFlow-platformprobleem met deze property-combinatie op een diep-geneste MasonryGridView/StaggeredView binnen een TabBarView, niet op iets in onze workflow. Nog te proberen (niet meer door Claude gedaan deze sessie, tijd op):
      1. Check het Issues-paneel (rode teller rechtsboven) — een analyzer-fout kan een stille opslag-blokkade veroorzaken (zelfde patroon als in CLAUDE.md gedocumenteerd voor exports).
      2. Browser-refresh vlak vóór het zetten van de toggles proberen, zonder tussendoor iets anders te doen — mogelijk speelt de eerdere "Invalid Action"-dialoog (zie hierboven) een rol in state-corruptie die een refresh oplost.
      3. Alternatieve fix-route proberen: i.p.v. de 3 losse toggles op StaggeredView, de hele Column-inhoud Wrap Widget → SingleChildScrollView (shrinkWrap/physics blijven dan op de bestaande waarde staan — dat patroon werkt al elders in dit project, zie de oorspronkelijke fix-beschrijving hierboven). Dit is een structureel andere widget-tree-bewerking dan de property-toggle die nu blijkt te haperen.
      4. Als niets werkt: FlutterFlow-support contacteren met "widget property change toont als opgeslagen in het paneel, maar bereikt nooit View Code/export" — klinkt als een reproduceerbare bug aan hun kant.
    • Nieuwe theorie van Bob (2026-08-10): mogelijk speelt mee dat alle 6 StaggeredViews op deze pagina dezelfde generieke naam "StaggeredView" dragen (geen custom naam) — misschien faalt de save juist omdat er meerdere identiek-genoemde widgets op dezelfde pagina staan, en werd de fix tot nu toe maar op 1 van de 6 (Activiteiten) toegepast. Deels onderzocht (Claude, 2026-08-10):
      • Widgets van dit type (geen Component) hebben geen losse "Rename"-optie — het contextmenu op de tree-rij biedt Duplicate/Insert/Wrap/Replace/Remove/Comment/Copy Style/Copy Code/Convert to Component/Save as Template, geen "Rename Widget". Dubbelklikken op de widgetnaam bovenin het rechterpaneel opent per ongeluk "Convert to Component" (nieuwe-component-dialoog) — niet gebruiken, dat is een structureel andere, veel grotere wijziging dan bedoeld (geannuleerd, geen schade aangericht).
      • "Value Key"-veld geprobeerd als alternatief voor een unieke identiteit — veld gevonden via de Search properties-zoekbalk, maar het inputveld zelf rendert volledig buiten de geclipte viewport (zie hieronder), dus niet in te vullen door Claude.
      • Poging om de fix ook op de Cultuur-tab te zetten (test: alle 6 tegelijk) liep vast op clipping — ook na Bob's browser fullscreen op een 4K-scherm bleef Shrink Wrap/Scrollable/Value Key buiten de zichtbare/klikbare automation-viewport (bevestigd: het probleem zit in hoe de browser-automation-brug de pagina ziet — vermoedelijk een vaste virtuele CDP-viewportbreedte, los van Bob's fysieke schermresolutie — niet in Bob's venstergrootte zelf, dus verder fullscreen/resizen door Bob heeft geen zin). StaggeredView van TabCultuur is wél betrouwbaar te selecteren (Widget Tree), alleen de eigenlijke toggle-klik niet.
      • Widget Tree → TabActiviteitenTabBar PageColumnStaggeredView staat al goed (Expansion: Expanded, Shrink Wrap: uit, Scrollable: aan — door zowel Claude als Bob bevestigd zichtbaar ingesteld, zie hierboven).
      • Update 2026-08-10, definitieve uitkomst: Bob heeft de toggles zelf op meerdere/alle tabs gezet — óók dat kwam niet door. Verse export ná Bob's wijziging: alle 6 MasonryGridView.builder- instanties (regel 344/524/708/892/1076/1260) staan nog steeds op shrinkWrap: true + const NeverScrollableScrollPhysics(), geen enkele nieuwe Expanded. Sanity-check herhaald: de exportpijplijn zelf werkt gewoon (P2-9's Home-knop-verwijdering staat nog correct in dezelfde export). Dit sluit de naamgevingstheorie definitief uit — of het nu 1 of 6 identiek-genoemde StaggeredView-widgets betreft maakt niets uit voor de save. Samen met de eerdere uitsluiting van "Claude's automation triggert geen change-event" (Bob's eigen handmatige klikken faalden ook) betekent dit: dit is bevestigd een echt FlutterFlow-platformprobleem met deze specifieke property-combinatie (Expansion/Shrink Wrap/Scrollable op een MasonryGridView/StaggeredView diep genest in een TabBarView), onafhankelijk van wie er klikt, hoeveel widgets het betreft, of hun naamgeving. Resterende opties (niet meer geprobeerd deze sessie):
      • Issues-paneel checken op een stille analyzer-blokkade.
      • De alternatieve Wrap Widget → SingleChildScrollView-route proberen (structureel andere widget-tree-actie, mogelijk buiten bereik van deze specifieke bug) — zie de oorspronkelijke fix-beschrijving hierboven.
      • FlutterFlow-support contacteren: "widget property change (Column/ StaggeredView Expansion/ShrinkWrap/Scrollable, diep genest in een TabBarView) toont als correct opgeslagen in zowel de builder-UI als na page-reload, maar bereikt nooit View Code of flutterflow export-code, ongeacht wie de wijziging maakt of hoeveel widget-instanties het betreft" — met dit reproductiepad als bewijs.
    • Reproductierecept dat de race met Home's eigen overflow (P1-19) vermeed (2026-08-09, definitief werkend — vervangt eerdere R+deep-link-pogingen): flutter run direct starten met --route i.p.v. cold-start via am start ná een losse flutter run/hot-restart. Dit zet Flutter's defaultRouteName al vóór de eerste frame, dus go_router opent meteen de juiste pagina — Home wordt nooit gebouwd, dus zijn eigen overflow (P1-19/P1-3-familie) verbruikt de "één-volledige-dump-per-proces"-slot niet meer eerder:

      export PATH="/home/bob/fvm/bin:$HOME/.pub-cache/bin:$PATH"
      fvm flutter run -d emulator-5554 --route "/horecagelegenhedenOverzicht?plaats=28666"
      

      (geen FIFO/R/deep-link-am-start meer nodig voor dít doel. Voor een pagina die zelf niet los bereikbaar is met de juiste parameters via een directe --route, blijft het FIFO/R-recept uit CLAUDE.md nodig.) Bevestigd geprobeerd en verworpen: R (hot-restart) + de deep-link-am start vlak erna in één Bash-call (minimale sleep) — een hot-restart reset altijd naar de initialLocation/Home, en de daarna verstuurde deep-link-intent wordt door de al herstarte app niet meer verwerkt (adb-warning "Activity not started, intent has been delivered to currently running top-most instance" terwijl de app toch weer op Home landde) — dus dit blijft Home's eigen overflow eerst verbruiken. --route bij het opstarten zelf is de werkende oplossing voor dit specifieke race-probleem.

    • Hypothese uit 2026-08-05 (HorecagelegenheidoverzichtKaartWidget's MediaQuery.sizeOf-breedtekeuze) blijft weerlegd — de daadwerkelijke oorzaak is de ontbrekende scroll-wrapper hierboven, niet de tekstkolom-breedtekeuze.

    *(P1-19 afgerond in de builder 2026-08-12 avond, maar pas op 2026-08-13 avond echt in deze repo gecommit — de destijds "bevestigd via verse export"-verificatie liep via een losse /tmp/ff-check-export, niet via deze projectrepo zelf; git log -S"return Wrap(" bevestigde 0 eerdere treffers vóór vandaag. Inhoud ongewijzigd: alle 9 kale-Row-met-List.generate-tag-overflows (rechtsklik Row → Replace → Wrap) — Home (HomeUitgaantabelKaartComponent), PUitgaanSliderKaartComponent, EventCurrent, EvenementHorecagelegenheid (4x), HorecagelegenheidCurrent (cryptocoins), PUitgaantabelKaartComponent. Uit deze lijst verwijderd.)*

    *(P1-20 geïmplementeerd — bevestigd via lokale git diff op 2026-08-13 avond, tijdens Bob's eigen gelijktijdige ff-run-fvm.sh-build/testronde. Gecommit 2026-08-14 (Claude, commit fb6b224) — stond 15+ uur ongecommit in de working tree, zie sessie-notitie bovenaan dit bestand. Exacte match met het eerder uitgewerkte voorstel: HeaderButtonsComponentWidget kreeg een showBackButton-parameter (Boolean, default true), de terug-AlignedTooltip-node zit nu achter if (widget!.showBackButton == true), en Home's instantie (home_widget.dart) zet 'm expliciet op false. Uit deze lijst verwijderd. Kanttekening voor een latere sessie: login_widget.dart gebruikt dezelfde component (default true, dus nog steeds een zichtbare Terug-knop) — mogelijk net zo zinloos op een entry-pagina als op Home was, niet onderzocht/aangepast.)*

    *(P1-21 gesloten zonder bouwwerk — Bob's beslissing 2026-08-16: geen losse custom widget voor de AdBanner-fallback. PUitgaanPage's FlutterFlowAdBanner toont nu nog de debug-tekst zolang Google AdMob de app niet heeft goedgekeurd (kan pas ná livegang), maar dat lost zichzelf op zodra de app is goedgekeurd en AdMob echte advertenties gaat serveren — Bob's inschatting is bovendien dat deze fallback-tekst juist nodig kan zijn zodat Google de advertentie-integratie kan zien tijdens de review. Claude's eerder uitgewerkte CleanAdBanner-custom- widget-voorstel (verving de debugtekst door een lege SizedBox) is dus niet gebouwd — bewust afgewezen, niet vergeten. Geen actie meer nodig tot ná de Google/Apple-goedkeuring bij livegang; check dan of de debugtekst inderdaad verdwenen is. Uit deze lijst verwijderd.)*

    • Kanttekening bij P2-5 ("Ad-banners..., na livegang"): P2-5 gaat er nog van uit dat advertenties een niet-gebouwd P2-idee zijn — in werkelijkheid staat er dus al minstens 1 banner live in de code. Check met Bob of P2-5's "waar wel/geen ads"-regel (geen ads op locatie-kiezer/login/account) al is toegepast op deze ene bestaande banner, en of er bewust voor PUitgaanPage gekozen is als eerste plek.

    (P1-22 volledig afgerond 2026-08-13 — live pair-sessie, Bob builder + Claude verse-export-verificatie, gecombineerd met P1-10's cache-toggle in één doorloop per call (Bob's voorstel, scheelde een dubbele builder-bezoekronde). Alle 11 live API-calls hebben nu decodeUtf8: true bevestigd (homeTabel, HomeSlider, Uitgaanstabel, UitgaanSlider, EstablishmentInfo, HorecagelegenheidEvents, gemeenten, provincies, Evenement, Establishments, requestNewPassword) — EstablishmentsCall's toggle werd in de eerste ronde gemist (niet te verwarren met het dode EstablishmentsNewCall, zelfde-klinkende naam), in een 2e verse export alsnog bevestigd correct. Uit deze lijst verwijderd.)

    (P1-9 volledig afgerond 2026-08-16 — Bob, builder, live pair-fix sessie: EventCurrent's TextTitle heeft nu 8px rechter-padding (ruimte t.o.v. de deel-knop), en het kale nid-debugtekstwidget onder de titel is verwijderd. Beide bevestigd via verse export (Padding(EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 8.0, 0.0)) om TextTitle; 0 treffers meer voor valueOrDefault<String>(widget!.nid, 'nid')). Alle eerdere schaduw-/spacing-restpunten (PUitgaanSliderKaartComponent, HorecagelegenhedenOverzicht) waren al langer afgerond. Uit deze lijst verwijderd.)

    (P1-10 punt 1 — cache-toggle op homeTabel/gemeenten/provincies — afgerond 2026-08-13, gecombineerd met P1-22 in één doorloop per API call, bevestigd via verse export. Punt 2 hieronder blijft open als losse taak.)

    P1-10 · Eigenaar: Onbepaald. Performance — resterend werk (audit afgerond 2026-08-05, Claude, code-niveau):

    1. Groter/structureel, nog te beoordelen: 4 pagina's (Home, horecagelegenheden_overzicht(_sort_page/_page_data_type)_widget.dart) hebben een TabBarView met 6-7 tabs die allemaal gelijktijdig hun eigen API-call vuren bij page-load (Flutter bouwt alle tabs eager, geen lazy-tabs) — ook de tabs die de gebruiker nog niet ziet. De inmiddels aangezette cache: true (zie archiveringsnotitie hierboven) verhelpt dit niet — dat voorkomt alleen herhaling bij een latere rebuild, niet de eerste gelijktijdige burst. Echte fix vraagt een structurele herbouw (bv. IndexedStack met on-demand FutureBuilder per tab-activatie i.p.v. TabBarView) — vermoedelijk custom code. Geen bekend rate-limit-probleem op de Drupal-API, dus mogelijk lage prioriteit ondanks de N×-overhead.
    2. Bijvangst tijdens de audit: dode EstablishmentsNewCall verplaatst naar de P2-7-opschoonlijst.

    *(P1-11 geïmplementeerd — bevestigd via lokale git diff op 2026-08-13 avond, tijdens Bob's eigen gelijktijdige ff-run-fvm.sh-build/testronde. Gecommit 2026-08-14 (Claude, commit fb6b224). Fix op HorecagelegenheidEventTabelComponentCopy komt overeen met het eerder uitgewerkte voorstel: de tekst-tegel- Container verloor zijn hardcoded height: 200.0 (blijft in Expanded, hoogte volgt nu de Row), en de afbeeldings-tegel-Container is nu zelf ook in Expanded gewrapt met height: 60.0 i.p.v. 200.0. Uit deze lijst verwijderd — Bob's eigen build/testronde moet dit nog live bevestigen (Events-tab van een horecagelegenheid, geen overflow meer).)*

    P2 — features & concept, na livegang

    P2-1 · Eigenaar: Bob — testen in de API, komt terug. Datum-filter: Vandaag / Dit weekend / Deze week.

    P2-2 · Eigenaar: Onbepaald. Google Maps-weergave van horecagelegenheden — bewust niet vóór livegang (Maps API-key + billing, onduidelijk of elke locatie al lat/long heeft, marker-UI — geen quick win).

    P2-3 · Eigenaar: Onbepaald. "In de buurt"/geolocatie-browsen — aanvulling op het provincie/gemeente-model, geen vervanging.

    P2-4 · Eigenaar: Onbepaald. Overige feature-ideeën, geen van alle uitgewerkt: deel-knop op eventpagina · "toevoegen aan agenda" (native kalender) · "events op deze locatie" prominenter op de horeca-detailpagina · reviews/waardering voor horecagelegenheden (groot, vraagt nieuw Drupal content-type + moderatie, eigen project). (De "Wat is er vanavond"-melding is uitgelicht naar P2-10 hieronder — dat idee weegt zwaarder dan de rest van dit lijstje.)

    P2-9 · Eigenaar: Onbepaald. Onboarding/eerste-gebruik-uitleg. Live bevestigd 2026-08-07 (Claude, emulator, pm clear + verse launch = echte eerste-keer-ervaring): een nieuwe gebruiker opent de app en ziet direct de Home-pagina met bovenaan een carousel met kop "OOK LEUK" ("ook leuk" veronderstelt dat je al iets gezien hebt — vreemd als allereerste tekst) en daaronder een kale lijst events, geen welkomsttekst, geen uitleg wat Uitgaanskrant is, geen prompt om een provincie/gemeente te kiezen. (Zie ook P0-3's opmerking dat de eerste-launch-default-locatie 28666/28694 geen naam toont totdat iemand handmatig kiest.) Zonder duidelijke eerste indruk is de kans groot dat een nieuwe gebruiker de app na 1x openen niet snapt/niet terugkomt. Nog geen concrete builder-fix uitgewerkt — eerst met Bob bespreken wat voor onboarding gewenst is (korte welkomsttekst? meteen naar provincie/gemeente-keuze i.p.v. Home?) vóórdat dit gebouwd wordt.

    • Bijvangst, zelfde verkenning: dode terug-pijl-knop in Home's AppBarafgerond (2026-08-10, Claude). IconButtonBack verwijderd via Widget Tree → rechtsklik → "Remove Widget" (op HomeWidgetAppBarRow, naast IconButtonDrawer). Bevestigd via verse flutterflow export-code: geen enkele referentie meer aan IconButtonBack/het bijbehorende Icons.arrow_back_outlined-icoon in home_widget.dart — de AppBar-Row bevat nu alleen nog de hamburger-menuknop. Geen builder-sync-problemen bij deze simpele Remove-Widget-actie (i.t.t. P1-13's multi-property-toggle, zie daar).

    P2-10 · Eigenaar: Onbepaald. "Vanavond in [gemeente/provincie]"- herinnering (pushmelding of in-app-widget) — uitgelicht uit de ongestructureerde lijst van P2-4 omdat dit vermoedelijk de goedkoopste hefboom is voor terugkerend gebruik: dit type overzichts-app wint of verliest niet op features maar op of mensen 'm blijven openen. Een eenmalige/wekelijkse melding met "dit weekend in [gekozen gemeente]" is een directe reden om terug te komen, i.p.v. te wachten tot iemand toevallig weer aan de app denkt. Hangt af van dezelfde Firebase-infra als P1-16 (Firebase Cloud Messaging naast Crashlytics/Analytics) — logisch om in dezelfde builder-sessie op te pakken als P1-16. Nog niet uitgewerkt qua precieze inhoud/frequentie (voorkom spam-gevoel) — eerst met Bob bespreken vóór bouwen.

    P2-5 · Eigenaar: Onbepaald. Ad-banners op horeca-overzicht, horeca-detail, event-detail; vaste regel: geen ads op locatie-kiezer/login/account.

    P2-6 · Eigenaar: Onbepaald. Tekstzoeken op titel op de horeca-overzichtspagina (los van de Datatype/Sort-experimenten die Bob daar zelf op test — die zijn actief werk-in-uitvoering, geen dode code).

    P2-7 · Eigenaar: Bob. Opschonen:

    • Merge kaartTabelUitgaanComp + kaartTabelUitgaanSComp — Bob doet dit zelf ("ik kijk er zelf naar").
    • lib/uitgaanspaginas/uitgaantabel_kaart_component/uitgaantabel_kaart_component_widget.dart (klasse UitgaantabelKaartComponentWidget, géén Home-/P-prefix) — dode/orphan code, bevestigd 2026-08-12 tijdens P1-19: bestaat wel lokaal in de repo maar wordt nergens in de codebase geïnstantieerd (bevestigd grep, en bevestigd in de builder zelf: Bob kon het component niet vinden om te openen). Eerdere aanname in dit bestand dat dit "gebruikt wordt op zowel Home als PUitgaanPage" was fout — de daadwerkelijk live componenten daar zijn HomeUitgaantabelKaartComponent resp. PUitgaantabelKaartComponent (los, wel actief).
    • lib/kanweg opnieuw leegmaken indien teruggekomen na een latere export-pull, plus eventuele nieuwe losse dode componenten in lib/evenement/.
    • Nieuw gevonden, echte compile-fout in dode code (2026-08-14, Claude, flutter analyze ná het committen van fb6b224): lib/evenement/slider_uitgaan_component_small_current/slider_uitgaan_component_small_current_widget.dart:109Undefined name 'carouselResponse'. Root cause: Bob's ZZZhomeSliderCall-verwijdering (P2-7 hierboven) haalde de omringende FutureBuilder weg (die carouselZZZhomeSliderResponse via snapshot.data! leverde) maar de binnenste Builder verwijst nog naar de oude variabelenaam, nu ongedefinieerd — een onvolledige refactor-restant, geen nieuwe eigen wijziging. Geen impact op de gebouwde app: bevestigd via grep dat geen enkel ander bestand SliderUitgaanComponentSmallCurrentWidget importeert (al bekend als dood, zie de ZZZhomeSliderCall-notitie hierboven), en een verse flutter build apk --debug slaagde gewoon (✓ Built build/app/outputs/flutter-apk/app-debug.apk) — Dart compileert alleen bestanden die vanaf main.dart bereikbaar zijn, dus deze fout raakt de live app niet. Wel relevant: dit component bestaat sowieso al niet meer in de builder (Bob kon het niet terugvinden, zie de eerdere UitgaantabelKaartComponentWidget-notitie hierboven) — waarschijnlijk hetzelfde soort orphan. Als dit ooit via de builder verwijderd wordt (samen met de andere lib/evenement/- opschoning), is deze compile-fout vanzelf opgelost; tot die tijd geen actie nodig, alleen genoteerd zodat een toekomstige flutter analyze-treffer hier niet als nieuwe/onverklaarde bug wordt aangezien.
    • Eén browse-by-category-patroon i.p.v. twee: nu Home landelijk is, bepalen hoe Home's categorieën en PUitgaanPage's provincie/ gemeente-gescoopte categorieën zich tot elkaar verhouden.
    • Dubbele Provincie/Gemeente-blok in het menu opruimen (12 menu-items waar 6 zouden volstaan).
    • EventWidget-route: heraansluiten of definitief schrappen (losse orphan-route). Bevestigd orphan 2026-08-05 (Claude, grep): route staat correct geregistreerd (nav.dart, pad /event, param nid) en geëxporteerd (index.dart), maar geen enkele pushNamed/ navigatie-aanroep in de hele codebase gaat er ooit naartoeEventCurrent (pad /eventCurrent) is overal de daadwerkelijk gebruikte event-detailpagina. Alleen bereikbaar via een handmatige directe URL. Beslissing (verwijderen uit nav.dart+index.dart, of alsnog ergens aan koppelen) ligt bij Bob.
    • Volledige API-call-audit (2026-08-13, Claude, grep op alle klassenamen buiten api_calls.dart zelf, gecombineerd met de live-bereikbaarheid-bevindingen uit P1-19/P2-7): van de 22 gegenereerde API-calls in de builder zijn er 11 ongebruikt. EstablishmentsNewCall (regel hierboven) was hier al 1 van, nu volledig lijstje:
      • Vervangen door custom code, veilig te verwijderen: login (LoginCall) en getcsrf (GetcsrfCall) — de echte login-flow loopt via de custom action drupalLogin (lib/custom_code/actions/drupal_login.dart), die zelf rechtstreeks http.post naar het Drupal-login-endpoint doet én het CSRF-token al uit diezelfde loginrespons haalt (data['token']) — de aparte GetcsrfCall/services/session/token-aanroep is dus overbodig geworden. Bevestigd: geen van beide klassen wordt nog ergens aangeroepen. Bevestigd verwijderd (2026-08-14, Claude, grep op class LoginCall/class GetcsrfCall in api_calls.dart: 0 treffers) — Bob deed dit al in zijn 2026-08-13-build/testronde, nu gecommit (fb6b224).
      • Test/scratch-duplicaten — bevestigd verwijderd (2026-08-14, Claude, zelfde grep-check, allemaal 0 treffers in api_calls.dart): ZZ userEstablishments TEST (ZZUserEstablishmentsTESTCall), ZZZhomeSlider (ZZZhomeSliderCall), homeSlidershortDate (HomeSlidershortDateCall), ZZhome uitgaan (ZZhomeUitgaanCall), zzEstablishmentEvents Copy (ZzEstablishmentEventsCopyCall), EstablishmentsNew (EstablishmentsNewCall, al bekend), QueryCityId (QueryCityIdCall) — 7 van de 8 voorgestelde verwijderingen zijn doorgevoerd (zelfde build/testronde, gecommit fb6b224). Enige die bleef staan: FavorietenAgendaTESTKANWEG (FavorietenAgendaTESTKANWEGCall) — nog steeds aanwezig in api_calls.dart, nog steeds geen enkele live-referentie (bevestigd). Losse, kleine restopruiming.
      • ⚠️ Poging door Claude (2026-08-14), 2x geprobeerd — nieuw bevestigd blocker-patroon, geen wijziging aangebracht. API Calls-paneel → FavorietenAgendaTESTKANWEGDelete → bevestigingsdialoog ("Delete this API Call from the project?") → Delete: de dialoog sluit netjes (geen freeze, i.t.t. de bekende geneste-Set-Variable-freezes elders in CLAUDE.md), maar de call staat na een page-reload gewoon weer terug in de lijst — 2x gereproduceerd (2e poging zelfs met een expliciete Synced-check vóór het navigeren). Een losse verse flutterflow export-code ná de eerste poging bevestigde hetzelfde: class FavorietenAgendaTESTKANWEGCall nog gewoon aanwezig in api_calls.dart. Dit is niet hetzelfde patroon als de al bekende widget-tree-klikproblemen (dit paneel is een platte lijst, geen canvas/tree-coördinaten, en de Delete-flow zelf werkt zichtbaar/klikbaar) — eerder een nieuw voorbeeld van het bredere "ziet er opgeslagen uit in de builder-UI, bereikt nooit de export"-patroon (zie P1-13/P0-3 punt 1 voor eerdere instanties). Kant-en-klaar voor Bob: API Calls-paneel (linker sidebar-icoon onder "Connect") → FavorietenAgendaTESTKANWEGDelete-knop onderaan → Delete bevestigen — zelfde stappen, kost hem waarschijnlijk hetzelfde (nog niet getest of het bij hem wél persisteert), maar dit hoort niet nog een 3e keer door Claude geprobeerd te worden zonder nieuwe informatie.
      • Nog niét dood, wel ongebruikt — laten staan: FavorietenAgenda (FavorietenAgendaCall) — geen enkele huidige live-referentie, maar dit is de call die P1-7's geplande "Persoonlijke agenda"/Favorieten-tabs straks nodig hebben. Niet verwijderen, gewoon nog niet aangesloten.
      • Live/actief (11, ter controle, niet aanraken): homeTabel, HomeSlider, Uitgaanstabel, UitgaanSlider, EstablishmentInfo, HorecagelegenheidEvents, gemeenten, provincies, Evenement, Establishments, requestNewPassword. Kanttekening 2026-08-14: EstablishmentsCall is in dezelfde build/testronde hernoemd naar HorecagelegenheidoverzichtCall (callName 'Horecagelegenheidoverzicht', zelfde endpoint/params horcat/townid/displayId) — geen verwijdering, puur een naamswijziging; alle aanroepende widgets (horecagelegenheden_overzicht*) zijn consistent meeveranderd, bevestigd via grep, geen dode/gebroken referenties.
      • Verwijderen kan gewoon via de builder (API Calls-paneel → call selecteren → verwijderen) — geen custom code/lokale bestanden bij betrokken, dus geen export-sync-risico zoals bij widget-edits.

    (Laag-risico-restpunt uit P0-3 (default-locatie 28666/28694 zonder naam) afgerond — bevestigd 2026-08-15 via de export-sync (zie sessienotitie bovenaan): select_state_drop_down_component_widget.dart zet nu ook provincieSelectNaam = 'Noord-Holland' en gemeenteSelectNaam = 'Amsterdam (gemeente)' naast de bestaande id-defaults. Bijvangst in dezelfde builder-sessie: een losse debug-SnackBar ("Provincies: X") die bij elke provincie-call verscheen is ook verwijderd.)

    P2-8 · Opgegaan in P1-7 (2026-08-09). Hartje-tap op gemeente-/ provincienaam om te favorieten is nu onderdeel van de bredere Favorieten-pagina/profielscherm-taak — zie P1-7 hierboven voor scope en status.