Tendlo — Domeinenen de twee startstanden
Ontwerp-gate · doorlopen met de eigenaar · besloten

Waar hoort Boodschappen onder — en wat zien mensen als ze de app voor het eerst openen?

Drie vragen in één stuk. (a) Welke domeinen zijn er, en welke module hoort waar. (b) Hoe ziet het Modules-scherm eruit bij de eerste opening — welke tegels los, welke mappen, hoe heten die. (c) Hoe ziet het Dashboard er dan uit, en verschilt dat voor gratis en Plus.

Voorgelegd 6 augustus 2026 · doorlopen met de eigenaar op 6 augustus 2026; alle zes de open vragen zijn beantwoord · code-uitspraken nagerekend op main (d8ded5ed) en met bestand:regel in de tekst · eisen worden op id geciteerd uit het eisen- en besluitenregister

"Boodschappen, waar zou jij die onder doen? Volgens mij kloppen de huidige modules t.o.v. de domeinen sowieso al niet, zitten vage dingen in. Dus geef me een HTML pagina met een voorstel voor modules in welke domeinen en dan ook voorstel voor de start-state van de Modules pagina (en mappen etc) en voor de Dashboard (evt. splitsing in plus vs free)"

Eigenaar, 6 augustus 2026

De korte antwoorden, voor wie niet doorleest

(a) Boodschappen hoort bij Maaltijden — die twee zijn één ketting (menu → lijstje), samen met Recepten en Voorraad. De tien domeinen worden teruggesneden naar zes: Eten · Gezin · Huis · Geld · Gezondheid · Bewaren, met Boodschappen in Eten.

(b) Bij de eerste opening: vier losse tegels (Vandaag · Taken · Agenda · Lijstjes) en zes mappen. Tien tegels, drie rijen, niets wat je meteen moet opruimen.

(c) Eén startbord voor iedereen — zes widgets, dezelfde voor gratis en Plus — en daaronder voor wie géén Plus heeft twee uitgeschakelde voorbeeldwidgets. Geen tweede startstand: wie later Plus koopt, houdt zijn bord zoals het stond.


Nul

Wat de eigenaar besloten heeft — 6 augustus 2026

Dit stuk werd geschreven om vóór te leggen. Het is doorlopen, en er zijn zeven uitspraken uit gekomen. Ze staan hier bij elkaar; verderop staan ze in de kaart en de open vraag die ze sluiten. Vanaf hier kiest dit stuk dus wél — de keuze is gemaakt.

De zeven besluiten

Wat er vastligt, en wat elk besluit sluit

  • 1 · Zes domeinen, opnieuw gesneden — variant A3. Eten · Gezin · Huis · Geld · Gezondheid · Bewaren, met Boodschappen in Eten, bij Maaltijden, Recepten en Voorraad. De regel eronder: een gebied draagt minstens twee modules, want één module is geen groep. Sluit OV-1.
  • 2 · De startstand van het Modules-scherm — variant B2. Vier losse tegels (Vandaag · Taken · Agenda · Lijstjes) en zes mappen. Tien tegels, drie rijen, geen scroll. Dit is de conversieseed die F1-2 mag bouwen.
  • 3 · De startstand van het Dashboard — variant C2. Eén bord van zes widgets, identiek voor gratis en Plus, en daaronder voor wie aantoonbaar géén Plus heeft twee uitgeschakelde voorbeeldwidgets. Geen tweede startstand.
  • 4 · De dashboardseed wijkt bewust af van de letter van E-WID-10 — zes widgets in plaats van acht. Dat is expliciet als keuze bevestigd, niet stilzwijgend aangenomen. Sluit OV-5.
  • 5 · De gratis modules zijn er tien, niet negen. Lijstjes ontbrak in het freemium-besluit terwijl hij kernmodule is. Dit is een correctie van een telling, geen herverdeling van tiers. Sluit OV-4.
  • 6 · Quote wordt een instelling van Vandaag, geen module — mét de voorwaarde dat er dan ook écht instellingen voor komen. Sluit OV-2, met dat voorbehoud erin.
  • 7 · Nieuwe domein-id's, mét omzetting van de AI-toestemmingen. Sluit OV-6. En OV-3: Garanties en Wagenpark verlaten het gevoelige gebied, en die versoepeling is bewust geaccordeerd.
Wat deze besluiten omkeren — en dat hoort zichtbaar te zijn

Drie plekken waar de nieuwe stand een eerdere stand vervangt

1 · Tien mappen worden er zes. E-MOD-06 rekende bij de eenmalige conversie op tien mappen — één per bestaand domein — en had die telling zelfs expliciet gecorrigeerd van elf naar tien. Met besluit 1 worden het er zes. De eis zelf verandert niet (domeinen worden mappen); het getal eronder wel.

2 · Drie losse kernoppervlakken worden er vier. E-MOD-12 sloot af met: "E-MOD-06 gevolg 1 telt voortaan drie losse kernoppervlakken boven de mappen in plaats van vier". Dat klopte half — Boodschappen gaat er terecht uit, maar Lijstjes hoort er wél in. Met besluit 2 zijn het er weer vier: Vandaag · Taken · Agenda · Lijstjes. De code liep hier al vooruit en staat inmiddels goed (zie sectie 7).

3 · Quote gaat naar optie (iii), niet naar (i). A3 rekende in zijn eigen tabel met Quote als module in Gezondheid — de veilige lezing, omdat een module schrappen een eigenaarsbesluit is. Besluit 6 kiest optie (iii): Quote verdwijnt als module. Daarmee telt A3 geen 30 maar 29 modules, en Gezondheid draagt er vijf in plaats van zes. Die telling is hieronder overal bijgewerkt.


Eén

Nulmeting — geteld, niet geschat

Tien domeinen, negenentwintig modules, en vier oppervlakken die geen module zijn. De verdeling is niet een beetje scheef; hij is scheef op een manier die de indeling zinloos maakt.

10domeinen (DomainDescriptor)
29registry-modules (ModuleDescriptor)
6domeinen met precies één module
18van de 29 zitten in drie domeinen
5van de 29 modules zijn gratis
2domeinen zijn sensitive

De tien domeinen worden elk in hun eigen feature-module gedeclareerd en samengevoegd in module_registry.dart:43-45; de vaste volgorde komt uit de literal in feature_modules.dart:71-81. Er is geen sorteerveld en geen domainsSorted — de registratievolgorde is de volgorde, op alle vijf de schermen die op domein groeperen.

Domein (id)ModulesWelkeGratisGevoelig
Gezin gezin5Sportkalender · Schoolvakanties · Verjaardagen · Co-ouderschap · Gezinsafspraken2
Planning planning5Afvalkalender · Vakantieplanning · Beweging · Maaltijden · Recepten2
Financieel financieel9Vaste kosten · Inkomsten · Spaardoelen · Verzekeringen · Garanties · Abonnementen · Wagenpark · Leningen & hypotheek · Bankrekeningen0ja
Gezondheid gezondheid4Routines · Gewicht · Pillen & vitamines · Cyclus0ja
Huis & onderhoud huis1Onderhoud0
Bewaarlijsten bewaarlijsten1Bewaarlijsten1
Vastgoed vastgoed1Vastgoed0
Voorraad voorraad1Voorraad0
Documenten documenten1Documenten0
Welzijn welzijn1Quote0

Correctie op de eerste peiling: het zijn er zes, niet drie. In de opdracht stond dat "welzijn, vastgoed en bewaarlijsten" er elk één dragen. Nageteld dragen zes van de tien domeinen precies één module: daar komen huis (Onderhoud), voorraad en documenten bij. Dat verandert de conclusie van "drie uitzonderingen" naar "de helft plus één is geen indeling maar een omweg".

Waar het echt misgaat

Vier domeinen heten precies zoals hun enige module

Bewaarlijsten bevat Bewaarlijsten. Vastgoed bevat Vastgoed. Voorraad bevat Voorraad. Documenten bevat Documenten. Dat is geen categorie maar een lege doos met het etiket van zijn inhoud erop. In de catalogus is dat vandaag al gek — je klapt een kop "Voorraad" open en er staat één regel "Voorraad" onder. Zodra E-MOD-06 die domeinen omzet naar mappen, wordt het erger: je krijgt vier mappen die je moet openen om één ding te vinden. Een map is een belofte dat er meerdere dingen in zitten.

De twee andere eenlingen zijn niet beter: Huis & onderhoud bevat alleen Onderhoud, en Welzijn bestaat volledig uit Quote — een dagelijkse spreuk (welzijn_module.dart:44-56, description: "Dagelijkse quote uit jouw thema's"). Er is een domein voor een spreuk.

Het tweede probleem, aan de andere kant

"Planning" is geen onderwerp maar een werkwoord

In planning zitten Afvalkalender, Vakantieplanning, Beweging, Maaltijden en Recepten (planning_module.dart:87-135). Wat hebben die gemeen? Dat ze in de tijd staan — maar dat geldt voor Verjaardagen, Onderhoud, Abonnementen en Cyclus net zo goed. Een categorie die niets uitsluit, sorteert niets. En het is precies de map waar Boodschappen onder de huidige indeling in zou vallen: dan staat je boodschappenlijstje tussen je sportsessies en je vakantieplannen.

Aan de andere kant staat Financieel met negen modules — bijna een derde van de app in één map. Een mappaneel met negen tegels heeft zijn eigen ordeningsprobleem; dan heb je het probleem één niveau dieper geduwd in plaats van opgelost.

Wat er náást de 29 registry-modules staat, en wat dat voor de telling betekent. De kernoppervlakken zijn geen registry-modules: kCoreSurfaceModuleIds bevat taken, agenda, lijstjes en boodschappen (module_registry.dart:14-19), en moduleById('boodschappen') levert null. Vandaag zit in die set helemaal niet — dat is een tab (app_router.dart:151-158). Met E-MOD-12 krimpt de kern naar drie (Agenda · Taken · Lijstjes) en moet Boodschappen een eigen ModuleDescriptor mét domainId krijgen. Na die stap zijn het dus 30 modules over de domeinen te verdelen, niet 29.


Twee

Wat een domein vandaag écht doet — en dus wat herindelen kost

Zonder dit stuk is "de domeinen anders snijden" een smaakvraag. Met dit stuk is het een verbouwing met een prijskaartje van vijf schermen, één gedragsregel en negentien tekstsnaren.

WaarWat het domein daar doetBlijft na E-MOD-06?
Modulebeheer
modules_beheer_screen.dart:212-230
Eén inklapbare sectie per domein, kop = domain.name, sectiesleutel modules-group-${domain.id}; rijen via modulesForDomain; stipje op de kop als één module in het domein een deel-hint heeft (:221-226) ja — catalogus
Onboarding-modulekeuze
modules_step.dart:30-56
Per domein een ModuleGridSection(title: domain.name) met selecteerbare kaarten ja — catalogus
Meldingeninstellingen
meldingen_screen.dart:139-152
Per domein een domain.name.toUpperCase()-kop; puur visueel, alle opslag is per moduleId ja — catalogus
AI-instellingen
ai_settings_section.dart:46-49, :126-133
Filtert de registry op domain.sensitive en toont die als sectie "Gevoelige domeinen", met per domein een opt-in-schakelaar ja — gedrag, geen presentatie
Mijn leven — domeinsecties
mijn_leven_screen.dart:106-115
Per domein een sectie met alleen ingeschakelde modules; lege domeinen vallen weg (:115) nee — wordt map
Mijn leven — "Populair"
mijn_leven_screen.dart:66-102, :142-158
Hard-gecodeerde strook van vier oppervlakken plus twee gecureerde picks (const ['maaltijden','recepten']) — geen domeinlogica nee — vervalt (F1-3)
/domein/:id
stond bij het schrijven op app_router.dart:257 + domain_screen.dart:26-42; beide regels bestaan niet meer
Generiek domeinoverzicht. Was een dode route: nergens in lib/ werd ernaartoe genavigeerd nee — is vervallen, gemerged 20f1b910 (F1-9)
De enige plek waar het domein gedrag draagt

domain.sensitive — en die vlag verhuist mee met de module

De AI-poort weigert een capability als het meegegeven domein gevoelig is en de gebruiker er niet expliciet voor heeft gekozen: ai_gate.dart:36-39, gevoed door {for (final domain in registry.domains) if (domain.sensitive) domain.id} (ai_gate.dart:54-57). Dat is de enige plek in de app waar het domein iets beslist in plaats van iets toont. Elke module die van domein wisselt, wisselt daarmee van AI-standaard. Twee modules in mijn voorstel doen dat: Garanties en Wagenpark verlaten het gevoelige financieel. Dat is geen bijwerking maar een besluit — zie OV-3.

En negentien plekken geven het domein-id als losse tekstsnaar mee. grep -rn "domainId: '" lib/ | grep -v _module.dart geeft 19 treffers, onder meer suggestions_providers.dart:209,240,268,305,330, add_warranty_sheet.dart:204, add_loan_sheet.dart:304, add_insurance_sheet.dart:481, capture_sheet.dart:90,422, add_task_sheet.dart:479, add_stock_item_sheet.dart:191. Er is geen compile-time koppeling met de registry: hernoem je een domein-id, dan blijven die snaren staan, vindt de gate het id niet in sensitiveDomainIds, en valt de poort stil open. Dat is de faalrichting die je niet ziet — en met besluit 7 is het geen hypothese meer maar de opdracht: vijftien van de negentien snaren moeten mee (de volledige verdeling staat bij A3).

Geverifieerd, en het verandert hoe duur de gevoeligheidsvlag écht is: gezondheid gate't vandaag nul aanroepen. Van de 19 snaren wijst er géén één naar 'gezondheid'; zes wijzen naar 'financieel' (de drie suggesties plus garanties, leningen en verzekeringen) en de rest naar niet-gevoelige domeinen, waar de gate het argument straal negeert. De schakelaar "Gezondheid" in de AI-instellingen doet dus vandaag niets — hij bestaat, hij synct (ai_settings_table.dart:31, powersync_schema.dart:98), en er is geen enkele aanroep die hem raadpleegt. Dat is een apart defect en het staat los van deze herindeling; het betekent wel dat de kosten van "een module verhuist uit een gevoelig domein" vandaag alleen bij financieel echt gedrag raken.

Wat er van fase 1 al gebouwd staat — en waar dit stuk op inhaakt

F1-1 is af en gemerged (d27acfbc): springboard_layout.dart levert het volledige indelingsmodel — een geordende lijst van items, waarbij een item een module, een kernoppervlak of een map met eigen id, naam en één niveau diepe inhoud is. De codec filtert nooit op renderbaarheid (:11-14), map-ids van de conversie worden deterministisch afgeleid (:15-20), en de opslag staat per lid en gesynct in member_module_prefs (springboard_layout_providers.dart:37-93).

Wat er nog niet is: geen enkel scherm leest springboardLayoutProvidermijn_leven_screen.dart rendert nog gewoon domeinsecties. En er is nog geen conversie. Dit stuk levert precies de inhoud waar F1-2 op wacht: welke mappen, hoe ze heten, wat erin zit, en wat er los blijft staan.


Drie · vraag (a)

De domeinindeling

Vier varianten, van "raak niets aan" tot "opnieuw snijden". Per variant: wat het is, hoe het voelt, wat het kost, wat je opgeeft.

Drie vragen die de keuze bepalen, en mijn antwoord erop

Hoeveel domeinen is goed? Het springboard is een raster van vier kolommen (F1-3), en een maptegel toont een minivoorbeeld van maximaal vier iconen. Met 29 modules geldt: te weinig mappen (vier) betekent mappen van 8-12, en dan heb je binnen de map opnieuw een ordeningsprobleem plus een preview die niets zegt. Te veel mappen (tien) betekent zes mappen van één. Zes mappen van gemiddeld vijf is de enige maat waarbij geen enkele map een sub-niveau vraagt en geen enkele map overbodig is.

Hoort een domein een minimum te hebben? Ja, en het getal is twee — dat is de definitie van "groep". Eén is geen groep; het is een tegel met een deurtje ervoor. Voor de catalogus is dat een kop met één regel eronder (irritant), voor het springboard is het een map die je moet openen (kostbaar, want elke tik telt).

Zijn de namen te begrijpen voor iemand die de app niet kent? "Financieel" en "Welzijn" zijn beleidstaal. "Vastgoed" is makelaarstaal. "Bewaarlijsten" is een woord dat alleen binnen Tendlo bestaat. Mijn voorstel gebruikt zes woorden die iedereen zonder uitleg begrijpt en die alle zes op één regel onder een tegel van ~90 px passen: Eten · Gezin · Huis · Geld · Gezondheid · Bewaren.

De varianten

Alle vier plaatsen Boodschappen; dat is de vraag die dit stuk moet beantwoorden.

A1Afgewezen

Laat de tien staan; geef Boodschappen alleen een domein.

Wat het is
Eén nieuwe ModuleDescriptor voor Boodschappen met domainId: 'planning' (want daar staat Maaltijden). Verder verandert er niets aan de registry.
Hoe het voelt
Bij de eerste opening staan er vier losse tegels en tien mappen — veertien tegels, waarvan zes mappen met precies één ding erin, en vier mappen die heten zoals hun enige inhoud. De eerste handeling van een zorgvuldige gebruiker is opruimen. Dat is precies het tegenovergestelde van wat E-MOD-06 wil ("zodat niemand op een leeg raster start"): niet leeg, maar rommelig.
Wat het kost
Bijna niets. Eén descriptor, één route (zie de kanttekening hieronder), en de vier plekken uit E-MOD-12. Geen enkele domein-id wijzigt, dus alle 19 tekstsnaren blijven kloppen en domain.sensitive beweegt niet.
Wat je opgeeft
De startstand van F1-2 — het enige moment waarop de app de indeling van de gebruiker mag bepalen. Na de conversie zijn de mappen van hem; de app mag er niet meer in. Een slechte startstand is daarna niet meer te repareren zonder in andermans indeling te graaien.

Afgewezen op 6 augustus 2026. Hier stond dat A1 serieus te overwegen was als het doel was fase 1 nu te ontstoppen. Dat argument is vervallen omdat A3 gekozen is en de seed daarmee net zo goed vastligt: fase 1 is ontstopt zonder de startstand op te offeren. Het onderliggende punt blijft wél waar en is de reden dat de keuze nú moest vallen — na de conversie is de indeling van de gebruiker en is elke correctie een ingreep in andermans map.

A2Afgewezen

Ruim alleen de eenlingen op; laat de drie grote domeinen ongemoeid.

Wat het is
Geen module verhuist tussen de grote domeinen. Alleen de zes eenlingen worden opgezogen: Huis & onderhoud ← Onderhoud + Vastgoed + Voorraad; Bewaren ← Documenten + Bewaarlijsten; Quote → Gezondheid; Boodschappen → Planning. Uitkomst: zes domeinen — Gezin 5, Planning 6, Financieel 9, Huis 3, Gezondheid 5, Bewaren 2.
Hoe het voelt
Beter dan A1: geen map van één meer. Maar de twee echte problemen blijven staan — "Planning" wordt nóg breder (Boodschappen, Maaltijden, Recepten, Beweging, Vakantieplanning, Afvalkalender: zes dingen zonder gemeenschappelijk onderwerp) en Financieel blijft negen. En Voorraad — "wat ligt er in de vriezer, koelkast en voorraadkast" (voorraad_module.dart:45) — staat dan bij Onderhoud en Vastgoed in plaats van bij Maaltijden.
Wat het kost
Klein. Vier domeinen verdwijnen uit de registry, vier domainId-velden wijzigen. Van de 19 tekstsnaren raakt er één: add_stock_item_sheet.dart:191 ('voorraad'). Geen enkele module verlaat een gevoelig domein, dus de AI-standaarden bewegen niet.
Wat je opgeeft
De kans om het goed te doen. A2 haalt de meest zichtbare fout weg en laat de fout eronder staan: de indeling volgt nog steeds de mappenstructuur van de broncode (lib/features/*) en niet de manier waarop iemand naar zijn eigen leven kijkt.
A3Gekozen · 6 aug 2026

Zes gebieden, opnieuw gesneden: Eten · Gezin · Huis · Geld · Gezondheid · Bewaren.

Wat het is
De 29 modules worden opnieuw verdeeld over zes domeinen van 3 tot 7, gesneden op waar iemand aan denkt in plaats van op waar de code staat. Zie de tabel hieronder.
Hoe het voelt
Zes woorden van één lettergreep-of-twee, elk met een herkenbare inhoud. Boodschappen staat bij Maaltijden, Recepten en Voorraad — de vier stappen van dezelfde ketting: je plant een menu, dat maakt een lijstje, je koopt het, het ligt in de kast. Geld is alleen geld. Papieren staan bij papieren. En er is geen map die je opent voor één ding.
Wat het kost
Middel. Tien domein-declaraties worden zes; 18 van de 28 bestaande modules krijgen een ander domainId — hier stond eerst 13, maar met de nieuwe id's uit besluit 7 verhuist ook de hele financieel-lichting mee naar geld. Alleen de vijf van Gezin, de vier van Gezondheid en Onderhoud houden hun domainId letterlijk. Van de 19 losse tekstsnaren moeten er vijftien mee — zie de hertelling hieronder; de schatting van "drie" die hier eerst stond, was fout. Twee modules verlaten een gevoelig domein — dát is de echte prijs, en het is een eigenaarsbesluit (OV-3, geaccordeerd). Verder is het mechanisch: elk scherm dat op domein groepeert leest registry.domains en past zich vanzelf aan.
Wat je opgeeft
De 1-op-1 relatie tussen een domein en een map onder lib/features/. Na A3 wonen Wagenpark en Garanties in de map lib/features/financieel/ maar horen ze bij het domein huis respectievelijk bewaren. Dat is verwarrend voor wie de code leest — en het is de goede afweging, want een domein is een gebruikersbegrip en een broncodemap niet.
Domein#Modules (gratis eerst, dan registervolgorde)Gevoelig
Eten eten4 Boodschappen · Maaltijden · Recepten · Voorraad
De ketting menu → lijstje → kast. Dit is het antwoord op de vraag.
Gezin gezin6 Verjaardagen · Schoolvakanties · Sportkalender · Gezinsafspraken · Co-ouderschap · Vakantieplanning
Ongewijzigd, plus Vakantieplanning erbij — dat hoort naast Schoolvakanties, niet naast Afvalkalender.
Huis huis4 Afvalkalender · Onderhoud · Wagenpark · Vastgoed
Alles wat je bezit en moet onderhouden. Afvalkalender is een huis-ding, geen planning-ding.
Geld geld7 Vaste kosten · Inkomsten · Bankrekeningen · Abonnementen · Spaardoelen · Leningen & hypotheek · Verzekeringen
Negen min Wagenpark en Garanties: die twee zijn een auto en een papiertje, geen geldpost.
ja
Gezondheid gezondheid5 Routines · Beweging · Gewicht · Pillen & vitamines · Cyclus
Beweging komt uit Planning (het is een gezondheidsding). Quote stond hier in het voorstel en is er met besluit 6 uit — hij wordt geen module.
ja
Bewaren bewaren3 Bewaarlijsten · Documenten · Garanties
Drie keer "dit heb ik nodig als ik het nodig heb". Garanties is een bewaard papier, geen uitgave.

Nagerekend ná besluit 6: 4 + 6 + 4 + 7 + 5 + 3 = 29. Hier stond 30, met Quote als zesde module in Gezondheid. Dat was de voorzichtige lezing: A3 rekende met optie (i) uit OV-2 omdat een module schrappen geen bouwkeuze is. De eigenaar heeft optie (iii) gekozen, dus Quote telt niet mee. De som is nu de 29 huidige ModuleDescriptors min Quote plus Boodschappen. Kleinste map 3, grootste 7, mediaan 4½ — geen enkele map vraagt een sub-niveau, geen enkele map is overbodig, en geen enkele map draagt er één.

Hertelling van de tekstsnaren — het zijn er vijftien, niet drie. Hierboven stond dat er van de 19 losse domainId-snaren maar drie mee hoeven. Dat telde alleen de snaren waarvan de poortuitkomst verandert, niet de snaren waarvan het id ophoudt te bestaan — en dat laatste is de faalrichting die deze pagina zelf beschrijft. Nageteld met grep -rn "domainId: '" lib/ | grep -v _module.dart, verdeeld over zes id's:

Id vandaag#WordtWaar
planning7verdwijnt add_task_sheet.dart:479 · capture_sheet.dart:90 en :422 · list_detail_screen.dart:326 · add_recipe_sheet.dart:198 · recipe_ai_cover_button.dart:96 · add_appointment_sheet.dart:592
financieel6geld suggestions_providers.dart:209, :240, :268 · add_insurance_sheet.dart:481 · add_warranty_sheet.dart:204 · add_loan_sheet.dart:304
documenten1bewaren suggestions_providers.dart:305
voorraad1eten add_stock_item_sheet.dart:191
gezin3blijft add_school_holiday_sheet.dart:194 · add_receipt_sheet.dart:244 · add_sport_event_sheet.dart:270
huis1blijft suggestions_providers.dart:330

7 + 6 + 1 + 1 = 15 moeten mee; 4 blijven staan. De vijf snaren in suggestions_providers.dart staan bovendien op :209, :240, :268, :305 en :330 — niet op de regels die eerder in dit stuk genoemd werden. Er is geen compile-time koppeling met de registry, dus een gemiste snaar valt niet om maar wordt genegeerd; voor de zes financieel-snaren betekent dat een poort die stil open valt. Dit hoort in de brief van het pakket dat de hernoeming uitvoert.

Twee namen zijn bewust een compromis, en dat hoort hier te staan. "Gezin" klopt niet voor een Solo-abonnee, die per E-PLUS-20 nadrukkelijk bestaat — maar "Mensen" of "Agenda's" leest slechter voor de meerderheid, en de map is hoe dan ook hernoembaar. "Bewaren" is een werkwoord waar ik hierboven "Planning" op afkeur; het verschil is dat "bewaren" wél iets uitsluit (het gaat over dingen die je niet gebruikt maar terugvindt), terwijl "plannen" niets uitsluit.

A4Afgewezen

Vier grove bakken: Gezin · Huis · Geld · Gezondheid.

Wat het is
Eten en Bewaren gaan op in Huis; Vakantieplanning en Quote worden verdeeld. Uitkomst: Huis 11, Geld 7, Gezin 6, Gezondheid 6.
Hoe het voelt
Vier tegels naast vier losse oppervlakken: het beginscherm is één rij van acht en dat is prachtig leeg. Tot je een map opent en er elf tegels in staan waar Voorraad, Documenten, Vastgoed en Boodschappen tussen elkaar liggen.
Wat het kost
Evenveel als A3 — dezelfde verbouwing van dezelfde velden.
Wat je opgeeft
Precies wat je wilde winnen. Het ordeningsprobleem verhuist van het beginscherm naar het mappaneel, en dáár heb je geen tweede niveau om het mee op te lossen (springboard_layout.dart:21-23: "een map in een map bestaat niet"). Vier is te grof voor 29 modules.
Besloten · vraag (a) · 6 augustus 2026

A3 is gekozen, en Boodschappen staat in Eten

De rationale in één alinea. De domeinindeling van vandaag is geen indeling van de app maar een afdruk van lib/features/: elke feature-map heeft één domein gedeclareerd, ook als er maar één module in zat. Dat verklaart alle zes de eenlingen én de grabbelton "Planning" in één keer, en het verklaart waarom er een domein voor een spreuk bestaat. Zolang die afdruk alleen als kop in modulebeheer diende, kostte het weinig. Vanaf E-MOD-06 wordt hij de startindeling van het beginscherm van iedere gebruiker, en vanaf dat moment mag de app er niet meer aan zitten. Dit is het laatste moment waarop de indeling nog gratis te herzien is; daarna is elke correctie een ingreep in andermans map.

En het letterlijke antwoord op de vraag. Boodschappen hoort bij Maaltijden — dat is de enige module waar hij inhoudelijk mee praat. In A3 heet die map Eten, en dat is het antwoord.

Het woord is er. E-MOD-12 hield dit punt bewust open ("Dit is één woord van de eigenaar en geen bouwkeuze — vul het niet stilzwijgend in"). Op 6 augustus 2026 is het uitgesproken: eten. Daarmee is de open vraag in E-MOD-12 gesloten en kan de conversieseed van F1-2 volledig worden vastgelegd. Boodschappen krijgt een ModuleDescriptor met domainId: 'eten' en tier gratis — inclusief de nieuwe stabiele route die hij daarvoor nodig heeft, zie het blok hieronder.

Bouwdetail dat het corpus nergens noemt en dat A1 t/m A4 alle vier raakt

Boodschappen heeft geen route — en routePath is een const String

Elke ModuleDescriptor vereist een routePath (module_descriptor.dart:105, required), en de descriptors staan in const-lijsten. Boodschappen heeft vandaag geen eigen route: hij leeft op /lijstjes/<deterministisch id>, en de tegel op Mijn leven valt terug op /lijstjes zolang shoppingListIdProvider nog null is (mijn_leven_screen.dart:93-99). grep boodschappen lib/core/router/app_router.dart geeft nul treffers.

Gevolg: "Boodschappen wordt een gewone module" vereist een nieuwe stabiele route — bijvoorbeeld /boodschappen die doorverwijst zodra het lijst-id bekend is. Zonder die route kan er geen descriptor zijn, en zonder descriptor is er geen domainId, geen plek in modulebeheer, geen conversie-item en geen scherm-shortcut (die wordt uit routePath afgeleid; voor Lijstjes is hij daarom handmatig geregistreerd — feature_modules.dart:189-198). Dit hoort in de brief van het pakket dat E-MOD-12 uitvoert, niet pas in de bouw.


Vier · vraag (b)

De startstand van het Modules-scherm

Dit is de conversie-invulling waar F1-2 op wacht. Hij moet concreet genoeg zijn om te bouwen, dus hij eindigt in een letterlijke seed.

De randvoorwaarden, en waar ze vandaan komen

  • De kernoppervlakken staan los en bovenaan, vóór de mappen (E-MOD-06, gevolg 1). Dat zijn er sinds E-MOD-12 vier: Vandaag, Taken, Agenda en Lijstjes — Boodschappen is eruit.
  • De gecureerde picks vervallen: Maaltijden en Recepten staan vandaag zowel in de "Populair"-strook (mijn_leven_screen.dart:142-158) als in hun domeinsectie. Na de conversie precies één keer, in hun map.
  • De conversie draait één keer per lid en is deterministisch: map-ids worden uit het domein-id afgeleid (springboard_layout.dart:15-20), zodat twee toestellen die tegelijk converteren dezelfde indeling opleveren.
  • Converteer op de volledige registry, niet op de ingeschakelde subset (F1-2 §3): de weergave verbergt wat niet rendert. "Staat er niet in" leid je af uit de opgeslagen indeling, nooit uit wat er rendertSpringboardLayout.placedModuleIds (springboard_layout.dart:284-294) is daar de bron voor.
  • Een module die ná de conversie in de app komt landt in een aparte bak "Nieuw", niet in de map van zijn oude domein.

De varianten

De vraag is niet óf er mappen komen — dat is besloten — maar wat er los blijft en hoeveel je ziet.

B1Afgewezen

Alles in mappen, ook de kernoppervlakken (map "Basis").

Wat het is
Zeven tegels: één map "Basis" met Vandaag/Taken/Agenda/Lijstjes, plus de zes domeinmappen.
Hoe het voelt
Maximaal rustig en volstrekt nietszeggend. Je opent de tab en er staan zeven grijze deurtjes; niets wat je kunt dóén is één tik ver. Taken zit dan achter twee tikken, terwijl E-NAV-06 juist drie korte wegen naar Taken belooft.
Wat het kost
Niets extra — het model staat het toe (springboard_layout.dart:102-104: "het model staat toe dat een lid ze verplaatst of alsnog in een map stopt").
Wat je opgeeft
De belofte van E-MOD-06 gevolg 1 en de bereikbaarheid van de vier dingen die iedere gebruiker dagelijks aanraakt.
B2Gekozen · 6 aug 2026

Vier losse tegels bovenaan, daaronder zes mappen. Tien tegels, drie rijen.

Wat het is
Rij 1: Vandaag · Taken · Agenda · Lijstjes. Rij 2 en 3: Eten · Gezin · Huis · Geld · Gezondheid · Bewaren. Verder niets.
Hoe het voelt
Eén blik, geen scroll, en de scheiding is meteen leesbaar: boven staat wat je doet, onder staat waar je het over hebt. Elke map opent op een inhoud van 3 tot 7 — precies wat een paneel comfortabel toont. Vier van de zes mappen tonen in hun preview minstens één icoon dat je zonder Plus echt kunt openen, omdat de mapinhoud gratis eerst gesorteerd is.
Wat het kost
Precies wat F1-2 al begroot heeft: één conversieroutine met markersleutel, in de stijl van share_default_migration.dart. Geen extra mechanisme.
Wat je opgeeft
Zichtbaarheid van individuele modules op dag één: een nieuwe gebruiker ziet zes mapnamen en geen modulenamen. Dat is opgevangen door het zoekveld (E-MOD-08) dat de mapnaam bij het resultaat toont (E-MOD-07), en door de onboarding, die op domein blijft ordenen en dus dezelfde zes koppen gebruikt.
Mijn modules — eerste opening (schets, 4 kolommen)
Vandaag
Taken
Agenda
Lijstjes
Eten4
Gezin6
Huis4
Geld7
Gezondheid5
Bewaren3
B3Afgewezen

Zet ook de gratis modules los bovenaan; alleen Plus zit in mappen.

Wat het is
Los: Vandaag, Taken, Agenda, Lijstjes, Boodschappen, Maaltijden, Verjaardagen, Schoolvakanties, Afvalkalender, Bewaarlijsten (tien). Daaronder zes mappen. Zestien tegels, vier rijen.
Hoe het voelt
Op dag één uitstekend: alles wat je kunt gebruiken staat één tik ver, en de mappen zijn zichtbaar "de rest". Voor een gratis gebruiker is dit de beste eerste indruk van alle varianten.
Wat het kost
Niets extra in de bouw — de seed hoeft alleen op ModuleTier.free te filteren.
Wat je opgeeft
Dit is de variant met een tijdbom. De indeling wordt bevroren op het abonnement dat je op dag één had. Koopt iemand een week later Plus, dan reorganiseert zijn beginscherm níét — dat verbiedt E-MOD-10 terecht ("uitzetten en weer aanzetten doen samen niets"). Hij houdt dus voorgoed een indeling waarin "los bovenaan" iets betekende wat niet meer waar is, en 24 nieuwe modules zitten in mappen die hij nooit heeft gekozen. Bovendien is tier geen ordeningsbegrip dat een gebruiker herkent: hij ziet geen reden waarom Maaltijden los staat en Recepten in een map — die twee horen bij elkaar.
B4Afgewezen

Geen startmappen: één plat raster van 34 tegels met het zoekveld erboven.

Wat het is
De conversie maakt geen enkele map; de gebruiker bouwt ze zelf met E-MOD-01.
Hoe het voelt
Negen rijen scrollen op dag één. Dat is de "muur van iconen" die precies de reden was om überhaupt mappen te introduceren.
Wat het kost
Het minste van alles: F1-2 krimpt tot een lijst.
Wat je opgeeft
Een besluit dat al genomen is. E-MOD-06 legt vast dat de domeinen als startpunt in de vorm van mappen worden omgezet, expliciet "zodat niemand op een leeg raster start". Deze variant staat hier alleen om die keuze zichtbaar te houden.
Besloten · vraag (b) · 6 augustus 2026

B2 is gekozen — vier los, zes mappen, tien tegels

De rationale. Een startstand heeft twee manieren om te falen. Leeg of nietszeggend (B1, B4 in zijn scrollende variant) leert niemand wat de tab is. Overvol (B4) of slim-op-de-verkeerde-as (B3) levert een indeling op die de gebruiker moet corrigeren — en corrigeren in andermans indeling is precies wat we na de conversie niet meer mogen. Tien tegels in drie rijen van vier is de enige stand die op één blik past, meteen uitlegt hoe het scherm werkt, en geen enkele beslissing neemt die later omgedraaid moet worden.

Waarom "gratis eerst" binnen een map. Een maptegel toont een minivoorbeeld van maximaal vier iconen (F1-3). Sorteer je op registervolgorde, dan tonen Eten en Huis vier Plus-iconen en ziet de map er dood uit voor wie geen Plus heeft. Met gratis-eerst tonen Eten, Gezin, Huis en Bewaren minstens één icoon dat écht opengaat. Geld en Gezondheid zijn volledig Plus — daar valt niets aan te sorteren, en dat is eerlijke informatie.

De conversieseed, letterlijk — dit is wat F1-2 mag bouwen

In de vorm van springboard_layout.dart. Map-ids deterministisch uit het domein-id (:15-20); de mapnaam is de DomainDescriptor.name als startnaam (E-MOD-06) en dus hernoembaar.

[
  {"surface": "vandaag"},
  {"surface": "taken"},
  {"surface": "agenda"},
  {"surface": "lijstjes"},

  {"folder": <stable("eten")>,       "naam": "Eten",
   "items": ["boodschappen", "maaltijden", "recepten", "voorraad"]},

  {"folder": <stable("gezin")>,      "naam": "Gezin",
   "items": ["verjaardagen", "schoolvakanties", "sportkalender",
             "gezinsafspraken", "coouderschap", "vakantieplanning"]},

  {"folder": <stable("huis")>,       "naam": "Huis",
   "items": ["afvalkalender", "onderhoud", "wagenpark", "vastgoed"]},

  {"folder": <stable("geld")>,       "naam": "Geld",
   "items": ["vaste_kosten", "inkomsten", "bankrekeningen", "abonnementen",
             "spaardoelen", "leningen", "verzekeringen"]},

  {"folder": <stable("gezondheid")>, "naam": "Gezondheid",
   "items": ["routines", "beweging", "gewicht", "pillen_vitamines",
             "cyclus"]},

  {"folder": <stable("bewaren")>,    "naam": "Bewaren",
   "items": ["bewaarlijsten", "documenten", "garanties"]}
]

Alle 29 module-id's zijn letterlijk overgenomen uit de registry en nageteld. 4 + 6 + 4 + 7 + 5 + 3 = 29 items in mappen, plus 4 losse oppervlakken. Bijgewerkt na besluit 6: hier stonden er 30, met quote onderin de map Gezondheid. Quote wordt geen module, dus hij staat niet in de seed — de quote-sectie op Vandaag blijft wél bestaan en verhuist naar de Vandaag-instellingen. De id's staan in gezin_module.dart:75-115, planning_module.dart:87-135, financieel_module.dart:56-135, gezondheid_module.dart:61-95, huis_onderhoud_module.dart:41, vastgoed_module.dart:30, voorraad_module.dart:39, documenten_module.dart:34 en bewaarlijsten_module.dart:28; boodschappen is nieuw en welzijn_module.dart vervalt.

Opnieuw geverifieerd op main (d8ded5ed)

kSpringboardCoreSurfaceIds is inmiddels gerepareerd — dit staat niet meer open

Hier stond dat de constante nog Vandaag · Taken · Agenda · Boodschappen bevatte, en dat de conversie daardoor Boodschappen als vast oppervlak zou neerzetten en Lijstjes zou laten verdwijnen. Dat klopt niet meer. Het bestand staat op lib/core/modules/springboard_layout.dart en de constante op :116-121 bevat Vandaag · Taken · Agenda · Lijstjes — precies besluit 2. Gerepareerd in c9fe4be3 ("fix(springboard): kern-set volgt E-MOD-12 — Lijstjes erin, Boodschappen eruit"), met de vangrails in test/core/modules/springboard_layout_test.dart:311-327. De doc-comment op :101-115 legt de regel er zelf bij uit.

Wat er wél nog openstaat, en dat is descriptor-werk. kCoreSurfaceModuleIds (lib/core/modules/module_registry.dart:14-19) bevat nog steeds 'boodschappen' en géén 'vandaag'; de doc-comment bij de springboard-constante zegt dat ook met zoveel woorden. En de doc-comment bij ModuleDescriptor.tier (lib/core/modules/module_descriptor.dart:124-127) beschrijft de gratis kern nog als "Agenda/Taken/Vandaag/Boodschappen" — zonder Lijstjes, en achterhaald door E-MOD-12 én door besluit 5. Die twee horen in de brief van het pakket dat Boodschappen zijn descriptor geeft.


Vijf · vraag (c)

De startstand van het Dashboard

Er staat nog geen regel dashboardcode in lib/ — alleen de gereserveerde opslagrij kShellDashboardsModuleId (member_module_prefs_dao.dart:82-84, nul consumenten) en een icoon (app_icons.dart:76-77). Dit is dus een ontwerpvoorstel voor fase 3, geen beschrijving.

Wat al vastligt

  • Nooit leeg starten (E-WID-10), en geen tijdlijnkaart in de startstand — Agenda staat wél in de galerij maar niet op het verse bord, anders is het dashboard "Vandaag in een ander jasje".
  • Het gratis bord moet bruikbaar zijn (E-PLUS-01); een tab die voor een gratis gebruiker leeg is, is een weggegooide tabpositie.
  • Plus-widgets zichtbaar maar uit, met hun echte vorm en verplicht gelabeld als "Voorbeeld" (E-PLUS-02, E-PLUS-03) — maar alleen wanneer vaststaat dát er geen Plus is. Bij "nog onbekend" toont de app de vorige bekende stand, of een rustige laadweergave.
  • Eén bord, opgeslagen als lijst van dashboards met widget-instanties (E-WID-12, E-OPS-06).

De varianten

De echte vraag onder (c) is niet "welke widgets", maar of er twee startstanden bestaan.

C1Afgewezen

Letterlijk E-WID-10: Taken, Boodschappen en één widget per aangezette gratis module.

Wat het is
Acht widgets: Taken, Boodschappen, Lijstjes, Bewaarlijsten, Maaltijden, Verjaardagen, Schoolvakanties, Afvalkalender.
Hoe het voelt
Ruim twee schermen scrollen op dag één, met drie lijstkaarten erin — Taken, Lijstjes en Bewaarlijsten gebruiken dezelfde bouwsteen, en het widgetonderzoek zegt dat ook met zoveel woorden ("Bewaarlijsten: dezelfde bouwsteen als Lijstjes"). Drie keer dezelfde kaartvorm leest als een fout, niet als een keuze.
Wat het kost
Niets extra; het is de letterlijke lezing.
Wat je opgeeft
De eerste indruk. En bij Lijstjes komt er een keuze bij die niemand op dag één kan maken: die widget vraagt welke lijst hij toont, en op een verse installatie is er nog geen lijst om te kiezen.
C2Gekozen · 6 aug 2026

Eén startbord van zes widgets voor iedereen; zonder Plus komen er twee voorbeeldwidgets onder.

Wat het is
Dezelfde zes instanties in beide tiers, in dezelfde volgorde. Het enige verschil is dat een gebruiker van wie vaststaat dat hij geen Plus heeft, onderaan twee uitgeschakelde widgets ziet met het label "Voorbeeld".
Hoe het voelt
Eén scherm plus een stukje. Bovenaan het enige wat je meteen kunt dóén (taken afvinken — E-WID-03), daarna drie korte statuskaarten en het menu van vandaag. De twee voorbeeldkaarten staan onderaan, waar ze verleiden zonder in de weg te zitten — en ze tonen precies de twee kaartvormen die een gratis gebruiker anders nooit ziet.
Wat het kost
Eén seed, één tier-afhankelijke staart. De etalage hangt aan de drie-standen-poort uit E-PLUS-02; die moet er sowieso komen.
Wat je opgeeft
Een startbord dat is toegesneden op wat je hebt gekocht. Dat klinkt als verlies en is het niet — zie de rationale.
Dashboard — eerste opening (schets)
Takenlijstkaart · Groot · 4 open, afvinkbaar ☐ Planten water geven · vandaag
☐ Voorraadkast nalopen · vr
☐ Tafel afruimen · za
Boodschappentelkaart · Klein11 op de lijst · + Toevoegen
Afvalaftelkaart · KleinGFT · vandaag
Menu vandaagtekstkaart · BreedPasta met courgette
Verjaardagenaftelkaart · KleinNoor · over 6 dagen
Schoolvakantieaftelkaart · Kleinnog 6 dagen · t/m 18 aug
Gewichtverloopkaart · KleinVoorbeeld · Plus
Voorraadaandachtkaart · KleinVoorbeeld · Plus
C3Afgewezen

Twee startstanden: een gratis bord en een Plus-bord.

Wat het is
Wie Plus heeft bij de eerste opening krijgt een rijker bord met Gewicht, Vaste kosten en Voorraad erop; wie niet, krijgt het gratis bord.
Hoe het voelt
Voor een Plus-koper: goed. Voor iedereen anders: niet anders dan C2.
Wat het kost
Twee seeds die je allebei moet onderhouden, plus een tier-lezing op precies het moment dat de app het minst zeker weet wat de tier is — koude start, netwerkquery nog onderweg (E-PLUS-02).
Wat je opgeeft
Het werkt alleen voor wie Plus koopt vóór hij de tab één keer opent. Iedereen die later upgradet houdt het gratis bord, want de indeling is opgeslagen en wordt niet herschreven. De variant lost dus een probleem op voor een kleine groep, en introduceert een tweede seed die voor altijd uit elkaar kan lopen. En als de tier-lezing bij de koude start "nog onbekend" is, moet je alsnog raden — precies wat E-PLUS-02 verbiedt.
C4Afgewezen

Minimaal: drie widgets, laat de gebruiker de rest zelf plaatsen.

Wat het is
Taken, Boodschappen, Verjaardagen. Klaar.
Hoe het voelt
Onaf. Drie kaartjes boven een half leeg scherm leest als een bord dat nog moet laden, niet als een uitnodiging.
Wat het kost
Het minste.
Wat je opgeeft
De motivering onder E-WID-10: "wie op dag één een lege tab opent, weet niet wat de tab is en komt niet terug — en dan wordt er nooit gemeten of het board werkt." Half leeg is bijna leeg.
Besloten · vraag (c) · 6 augustus 2026

C2 is gekozen — één bord, zes widgets, en het tier-verschil zit alléén in de staart

De rationale. Een gratis dashboard dat halfleeg voelt verkoopt geen Plus, en een dashboard vol met wat je niet hebt ergert — die twee vangen elkaar op zodra je ze uit elkaar trekt in bord en etalage. Het bord is voor iedereen hetzelfde en is uit gratis bronnen volledig te vullen: zes werkende widgets, waarvan één groot en interactief. De etalage is twee kaarten en staat onderaan. Daarmee is het verschil tussen gratis en Plus op dag één zichtbaar zonder dat het pijn doet, en blijft er precies één seed te onderhouden.

Waarom Gewicht en Voorraad de twee etalagekaarten zijn, en niet twee willekeurige. Het widgetonderzoek stelt vast dat het probleem van het gratis bord niet het aantal widgets is maar welke soorten ontbreken: een gratis gebruiker ziet nooit een verloopkaart (een grafiek) en bijna nooit een aandachtkaart. Dat zijn precies de twee soorten die het dashboard onderscheiden van Vandaag. Zet je die twee als etalage neer, dan toont de app niet "je mist een module" maar "je mist een manier van kijken" — en dat is het eerlijkste argument dat Plus heeft.

De volgorde is niet willekeurig. Boven staat wat je aanraakt (Taken, Boodschappen), in het midden wat je moet weten (Afval, Menu, Verjaardagen, Schoolvakantie), onder wat je zou kunnen hebben. Geen tijdlijnkaart, dus geen tweede Vandaag.

De dashboardseed, letterlijk

#ModuleSoortMaatWaarom hier
1TakenlijstkaartGrootHet enige wat je vanaf het bord kunt doen; afvinken is de interactie uit E-WID-03
2Boodschappentelkaart + toevoeg-actieKleinDe tweede interactieve; de eigenaar vroeg letterlijk om "een boodschap toevoegen" vanaf de widget
3AfvalkalenderaftelkaartKleinHet schoolvoorbeeld van "iets wat je vergeet"; gratis
4Maaltijdentekstkaart (diner vandaag)BreedGratis, en niet de tijdlijnkaart (week) — die valt onder het tijdlijnverbod
5VerjaardagenaftelkaartKleinGratis; de enige die vooruitkijkt zonder agenda te zijn
6SchoolvakantiesaftelkaartKleinGratis; aftel- in plaats van tijdlijnvorm
E1Gewicht etalageverloopkaartKleinDe soort die zonder Plus nooit bereikbaar is
E2Voorraad etalageaandachtkaartKleinDe tweede soort die zonder Plus bijna nooit bereikbaar is

Drie regels die in de brief moeten, anders bouwt iemand het net verkeerd

1 · Seed alle zes, ook als de module uitstaat. Dezelfde regel als op het springboard: de instantie blijft staan en rendert niet. Wie Schoolvakanties later aanzet, krijgt zijn widget terug op de plek waar hij hoorde. De alternatieve implementatie ("seed alleen wat aanstaat") leest de renderbaarheid en levert een bord dat per lid anders is en niet meer te herstellen.

2 · Een widget die niets rendert laat geen gat. Op het springboard is dat vanzelf zo; in een raster niet. Laat verborgen instanties inklappen in plaats van een lege cel achterlaten.

3 · De etalage verschijnt pas als het vaststaat. Bij tier "nog onbekend" toont het bord de zes gewone widgets en géén voorbeeldkaarten — anders ziet een betalende klant bij elke koude start seconden lang "Voorbeeld · Plus" onder zijn eigen bord staan.


Zes

Open vragen — alle zes gesloten op 6 augustus 2026

Zes punten die bewust niet waren ingevuld, omdat het antwoord een keuze is en geen afleiding. Ze zijn alle zes in de doorloop met de eigenaar beantwoord. De vraag blijft staan zoals hij gesteld was — daaronder staat wat er besloten is.

OV-1 · gesloten · besluit 1

In welk domein landt Boodschappen?

Het voorstel was Eten (bij A3) of planning (bij A1/A2). Dit is het punt dat E-MOD-12 expliciet openhield en dat de conversieseed blokkeerde. Eén woord volstond.

Antwoord

eten — de map Eten, bij Maaltijden, Recepten en Voorraad

Met A3 als gekozen indeling. Wat daarmee ontstopt: de conversieseed van F1-2 is nu volledig vast te leggen, en het pakket dat Boodschappen zijn ModuleDescriptor geeft weet welk domainId erin moet. De open vraag in E-MOD-12 vervalt.

OV-2 · gesloten · besluit 6 · mét voorbehoud

Blijft Quote een module, of wordt het een instelling van Vandaag?

Quote is een dagelijkse spreuk die zichzelf als TodaySection op Vandaag zet (welzijn_module.dart:20-30) en waarvan de landings-favoriet al bewust is uitgezet omdat het scherm niets toevoegt (:53-55: "een landings-favoriet in de balk is zinloos"). Het is dus een tegel die je nooit tikt. Drie opties: (i) Quote wordt module in Gezondheid — dan neemt hij de gevoeligheidsvlag van dat domein over, wat voor een spreuk raar is; (ii) Quote blijft module maar in een niet-gevoelig domein — dan is er weer geen goede map; (iii) Quote is geen module maar een instelling van Vandaag — dan verdwijnt er een tegel, een route en een domein tegelijk. Het voorstel was (iii), maar het schrapt een module en dat is een eigenaarsbesluit; A3 rekende daarom met (i).

"Prima als instelling van vandaag, maar er moeten dan wel echt instellingen voor zijn (welke thema's vind je leuk etc.)"

Eigenaar, 6 augustus 2026

Antwoord · optie (iii), met een voorwaarde

Quote wordt een instelling van Vandaag — maar dan moeten die instellingen er ook zijn

Dit keert het voorstel van A3 om: die rekende met (i), Quote als module in Gezondheid. Gezondheid draagt daarmee vijf modules in plaats van zes, en de indeling telt 29 in plaats van 30.

Het gaat niet om het schrappen van functionaliteit maar om het opruimen van een tegel die niemand tikt. De quote-sectie op Vandaag blijft bestaan (band chroom, buiten het signaalplafond). Wat verdwijnt is de module, de route /module/quote en het domein welzijn. De themakeuze moet meeverhuizen naar de Vandaag-instellingen.

Geverifieerd — en het zit net iets anders dan hier eerder stond. De instellingen staan vandaag níét op het Quote-scherm zelf, maar in de generieke module-instellingensheet: quote_settings_section.dart, bereikt via de ModuleSettingsAction() in de kop van het scherm (quote_screen.dart:39). Die sheet draagt drie dingen (quote_settings_section.dart:40-71): thema-selectie met per thema een gewicht (soms/normaal/vaker — quote_prefs.dart:25-43), meldingen aan/uit en het meldingstijdstip. In de themakiezer zit bovendien een taalkeuze nl/en/beide (quote_prefs.dart:46-60, gerenderd op quote_theme_selector.dart:103). Op het scherm zélf staat de themakiezer alleen als lege-staat-terugval, zolang er nog geen thema gekozen is (quote_screen.dart:49-50). Alle voorkeuren zijn persoonlijk en device-lokaal (SharedPreferences, quote_prefs.dart:4-11), niet gesynct.

En één ding dat dit stuk over het hoofd zag: er staat méér op dat scherm dan instellingen. Het Quote-scherm draagt ook een favorietenlijst en een archief van de laatste veertien dagen (quote_screen.dart:70-100). Dat zijn geen instellingen en ze verhuizen dus niet vanzelf mee. Verdwijnt de route, dan verdwijnen die twee — tenzij ze expliciet elders belegd worden. Dat is een uitspraak die nog moet vallen.

Vervolgwerk — dit besluit is pas af met een pakket. Er moet een werkpakket komen dat (a) de thema-selectie met gewichten, de taalkeuze en het meldingstijdstip naar de Vandaag-instellingen brengt, (b) de TodaySection elders registreert nu welzijn_module.dart vervalt, en (c) een uitspraak doet over favorieten en archief. Zonder dat pakket is besluit 6 functieverlies in plaats van een opruiming, en dat is uitdrukkelijk niet wat er besloten is.

OV-3 · gesloten · besluit 7

Garanties en Wagenpark verlaten het gevoelige domein — akkoord?

In A3 verhuizen ze van financieel (sensitive: true) naar bewaren en huis. Gevolg: hun AI-standaard gaat van "vraagt eerst een expliciete opt-in" naar "gewoon toegestaan". Voor Garanties is dat concreet add_warranty_sheet.dart:204, dat vandaag domainId: 'financieel' meegeeft aan de scanknop. Twee lezingen: (i) een garantiebewijs scannen is geen financiële handeling en de versoepeling is terecht; (ii) gevoeligheid hoort helemaal niet aan het domein te hangen maar aan de module — dan is dit het moment om sensitive naar ModuleDescriptor te verplaatsen. Optie (ii) is de nettere architectuur en meer werk.

Antwoord · lezing (i)

Akkoord — de versoepeling is bewust geaccordeerd, en sensitive blijft aan het domein hangen

Garanties gaat naar bewaren, Wagenpark naar huis; beide niet gevoelig. Hun AI-standaard versoepelt daarmee van "vraagt eerst een expliciete opt-in" naar "gewoon toegestaan". Dat is geen bijwerking die iemand later ontdekt — het is hier bekeken en goedgekeurd. Concreet raakt het één aanroep: add_warranty_sheet.dart:204. Wagenpark heeft vandaag geen eigen domainId-snaar, dus daar verandert alleen de registratie.

Lezing (ii) is niet gekozen. sensitive blijft een eigenschap van het domein, niet van de module. Verplaatsen naar ModuleDescriptor is de nettere architectuur en meer werk, en het is geen voorwaarde voor deze herindeling — het staat dus als overweging genoteerd, niet als opdracht.

OV-4 · gesloten · besluit 5

De "negen gratis modules" zijn er tien — telt Lijstjes mee?

Het freemium-besluit somt negen op: Vandaag, Taken, Agenda, Boodschappen, Maaltijden, Verjaardagen, Schoolvakanties, Afvalkalender, Bewaarlijsten. Lijstjes ontbreekt in die lijst, terwijl het wél in kCoreSurfaceModuleIds staat (module_registry.dart:14-19), dus altijd aan is en dus gratis. Met E-MOD-12 is Lijstjes bovendien uitdrukkelijk kern. Is de lijst dus tien, of is er iets bedoeld met het weglaten? Dit is geen herverdeling van tiers — het is de vraag of de lijst één regel mist. Voor de dashboardseed maakt het uit: bij tien telt Lijstjes mee als "aangezette gratis module" onder E-WID-10.

Antwoord

Het zijn er tien. De lijst miste een regel.

Lijstjes hoort erbij: hij is kernmodule (E-MOD-12), staat altijd aan (module_registry.dart:14-19) en kán dus niet achter Plus zitten — een module die je niet kunt uitzetten, kun je ook niet verkopen. Dit is een correctie van een telling, geen herverdeling van tiers: er verhuist geen enkele module van Plus naar gratis of andersom.

Nageteld. Precies vijf registry-modules dragen tier: ModuleTier.free: bewaarlijsten (bewaarlijsten_module.dart:35), schoolvakanties (gezin_module.dart:91), verjaardagen (:101), afvalkalender (planning_module.dart:96) en maaltijden (:124). Daarbij de vier kernoppervlakken (Taken · Agenda · Lijstjes · Boodschappen) en de tab Vandaag: 5 + 4 + 1 = 10.

De negen-opsomming moet overal in het corpus gecorrigeerd worden — het is één regel, maar hij staat op meerdere plaatsen en elke plek waar hij blijft staan is een plek waar iemand Lijstjes per ongeluk achter Plus zet.

OV-5 · gesloten · besluit 4

Mag de startstand van E-WID-10 afwijken?

E-WID-10 zegt letterlijk "Taken, Boodschappen, en één widget per aangezette gratis module". Letterlijk uitgevoerd zijn dat acht widgets, met drie lijstkaarten van dezelfde bouwsteen (Taken, Lijstjes, Bewaarlijsten). Het voorstel C2 leest de eis als "per gratis module is er een widget beschikbaar" en zet er zes neer. Dat is een afwijking van de letter en die hoort niet stilzwijgend te gebeuren.

Antwoord

Ja — zes widgets, en de afwijking is expliciet als keuze bevestigd

De gelezen eis is "per gratis module is er een widget beschíkbaar", niet "elke gratis module staat op het verse bord". Het argument dat de doorslag gaf is het argument uit C1: letterlijk uitgevoerd staan er drie lijstkaarten van dezelfde bouwsteen op het bord (Taken, Lijstjes, Bewaarlijsten), en drie keer dezelfde kaartvorm leest als een fout in plaats van als een keuze. Bij Lijstjes komt er bovendien een keuze bij die op dag één niet te maken is: die widget vraagt wélke lijst hij toont, en op een verse installatie is er nog geen lijst.

Wat dit vraagt van E-WID-10: de eis moet zó bijgewerkt worden dat de letter en de seed elkaar niet meer tegenspreken. Nu staat er nog "één widget per aangezette gratis module", en dat leest een uitvoerder als acht. De eis gaat over niet leeg starten; het aantal is hier vastgelegd.

OV-6 · gesloten · besluit 7

Hernoemen we de domein-id's, of alleen de labels?

A3 kan op twee manieren: met nieuwe id's (eten, geld, bewaren) of door bestaande id's te hergebruiken met een nieuw label (bijvoorbeeld financieel → naam "Geld", voorraad → naam "Eten"). Hergebruik is gratis voor de 19 tekstsnaren en voor de gesyncte sensitive_opt_in_domains_json-set (ai_settings_table.dart:31), en duur voor iedereen die de code later leest — een domein voorraad dat "Eten" heet en Boodschappen bevat is een val. Nieuwe id's zijn eerlijk en kosten een aantal snaren plus een eenmalige remap van de opt-in-set.

Antwoord

Nieuwe id's — eten, geld, bewaren — mét omzetting van de AI-toestemmingen

Hergebruik met een nieuw label is afgewezen: goedkoop nu, een val later. gezin, gezondheid en huis houden hun id; eten, geld en bewaren zijn nieuw. planning, financieel, vastgoed, voorraad, documenten, bewaarlijsten en welzijn verdwijnen.

De omzetting is geen detail maar de kern van dit besluit. sensitive_opt_in_domains_json is een gesyncte kolom met een JSON-array van domein-id's: kolomdefinitie lib/core/ai/data/ai_settings_table.dart:31-32, sync-schema lib/core/sync/powersync_schema.dart:98, schrijfpad lib/core/ai/ai_providers.dart:120-128, leespad in de poort lib/core/ai/ai_gate.dart:37-38, en de gevoelige set wordt uit de registry afgeleid op lib/core/ai/ai_gate.dart:54-57. Wie vandaag opt-in op financieel heeft staan en morgen geld krijgt, staat stilletjes weer uit — de poort weigert dan, zonder melding, en de gebruiker ziet alleen dat AI "het niet doet". Een hernoeming zonder eenmalige remap van deze set is dus geen cosmetische wijziging maar het uitzetten van iemands AI-toestemming.

Eén remap, twee sleutels: financieelgeld is de enige die een bestaande opt-in kán dragen die gedrag heeft. gezondheid houdt zijn id, dus daar is niets te doen. De remap draait eenmalig en moet idempotent zijn, want de kolom synct — twee toestellen kunnen hem allebei zien.


Zeven

Correcties op het corpus — verwerkt

Zeven uitspraken die bij verificatie niet klopten, plus twee die er bij de doorloop bij kwamen. Ze zijn nu in de bronnen zelf rechtgezet; deze tabel houdt bij wat er stond, wat er klopt, en waar het verwerkt is. De kolom "Stand" is opnieuw nagerekend op main (d8ded5ed) — niet overgenomen uit de eerste peiling.

Waar het stondWat het zeiWat er klopt · stand
De opdracht bij dit stuk "welzijn, vastgoed en bewaarlijsten dragen er elk één" Zes domeinen dragen er één: ook huis, voorraad en documenten. Opgelost door besluit 1 — na de herindeling draagt geen enkel gebied er één
springboard_layout.dart:105-110 kSpringboardCoreSurfaceIds = Vandaag · Taken · Agenda · Boodschappen Achterhaald — inmiddels gerepareerd in de code. Het bestand staat op lib/core/modules/springboard_layout.dart en de constante op :116-121 bevat Vandaag · Taken · Agenda · Lijstjes. Gerepareerd in c9fe4be3, met tests op springboard_layout_test.dart:311-327. Wat wél openstaat: kCoreSurfaceModuleIds (module_registry.dart:14-19) loopt nog achter
Fase-0/1-plan, F1-2 stap 1 "dat zijn er drie plus Vandaag — Vandaag, Taken, Agenda" De opsomming noemt er drie in totaal en mist Lijstjes. Het zijn er vier: Vandaag, Taken, Agenda én Lijstjes. Het plan signaleerde het verschil zelf twee zinnen later, maar de opsomming is de regel die iemand overneemt. Verwerkt in de opsomming zelf met besluit 2
module_descriptor.dart:124-127 gratis kern = "Agenda/Taken/Vandaag/Boodschappen" Mist Lijstjes; achterhaald door E-MOD-12 én door besluit 5 (tien gratis, niet negen). Staat nog open — code-werk, hoort in het descriptor-pakket
E-MOD-06, verificatieblokken mijn_leven_screen.dart:113 · picks op :143-145 · strook :63-101 / :66-100 Regeldrift: het bestand staat op lib/features/shell/screens/mijn_leven_screen.dart, het lege-domeinfilter op :115, de picks op :142-145, de strook op :66-102. De conclusies kloppen wél
E-MOD-12 onvoorwaardelijke true op module_providers.dart:396 De core-surface-kortsluiting staat op :400; :396 is de provider-declaratie. Zelfde regeldrift
E-MOD-06 ("bij de AI-instellingen hangt de gevoeligheid aan het domein") suggereert dat sensitive voor beide gevoelige domeinen gedrag draagt Vandaag draagt alleen financieel gedrag: nul aanroepen geven domainId: 'gezondheid' aan de AI-poort mee. De schakelaar "Gezondheid" in de AI-instellingen verandert niets. Apart defect, los van deze herindeling — en het blijft staan na besluit 7, want gezondheid houdt zijn id
Dit stuk zelf, A3 · "wat het kost" "Van de 19 tekstsnaren moeten er drie mee" Fout — het zijn er vijftien. De telling keek naar de snaren waarvan de poortuitkomst verandert, niet naar die waarvan het id ophoudt te bestaan. Zeven planning-snaren verliezen hun domein volledig en zes financieel-snaren moeten naar geld. De hertelling met alle bestand:regel staat bij A3
Dit stuk zelf, OV-2 "Quote is een tegel die je nooit tikt" — als was het scherm leeg Onvolledig. Het Quote-scherm draagt naast de themakiezer-terugval een favorietenlijst en een archief van veertien dagen (quote_screen.dart:70-100). Die twee zijn geen instelling en verhuizen niet vanzelf mee met besluit 6. En de instellingen zélf staan niet op het scherm maar in de module-instellingensheet (quote_settings_section.dart:40-71)

De twee die iemand het verkeerde lieten bouwen — stand. Rij 2 en rij 3 leidden samen tot een conversie die Boodschappen als kernoppervlak neerzet en Lijstjes van het beginscherm laat verdwijnen. Rij 2 is opgelost in de code (c9fe4be3), en dat is geverifieerd in plaats van aangenomen — deze pagina beweerde tot vandaag het tegendeel. Rij 3 is opgelost in het plan: de opsomming in F1-2 stap 1 noemt nu vier oppervlakken, in de opsomming zelf en niet pas in een kanttekening eronder. Wat resteert is kCoreSurfaceModuleIds en de doc-comment bij ModuleDescriptor.tier; allebei code, allebei belegd bij het pakket dat Boodschappen zijn descriptor geeft.