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.
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.
Waar
Wat het domein daar doet
Blijft 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
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 springboardLayoutProvider —
mijn_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.
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.
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.
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
Eteneten
4
Boodschappen · Maaltijden · Recepten · Voorraad
De ketting menu → lijstje → kast. Dit is het antwoord op de vraag.
—
Gezingezin
6
Verjaardagen · Schoolvakanties · Sportkalender · Gezinsafspraken · Co-ouderschap · Vakantieplanning
Ongewijzigd, plus Vakantieplanning erbij — dat hoort naast Schoolvakanties, niet naast Afvalkalender.
—
Huishuis
4
Afvalkalender · Onderhoud · Wagenpark · Vastgoed
Alles wat je bezit en moet onderhouden. Afvalkalender is een huis-ding, geen planning-ding.
—
Geldgeld
7
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
Gezondheidgezondheid
5
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
Bewarenbewaren
3
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:
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.
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.
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-12vier: 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 rendert — SpringboardLayout.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.
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.
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)
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.
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.
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.
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.
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.
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
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.
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
#
Module
Soort
Maat
Waarom hier
1
Taken
lijstkaart
Groot
Het enige wat je vanaf het bord kunt doen; afvinken is de interactie uit E-WID-03
2
Boodschappen
telkaart + toevoeg-actie
Klein
De tweede interactieve; de eigenaar vroeg letterlijk om "een boodschap toevoegen" vanaf de widget
3
Afvalkalender
aftelkaart
Klein
Het schoolvoorbeeld van "iets wat je vergeet"; gratis
4
Maaltijden
tekstkaart (diner vandaag)
Breed
Gratis, en niet de tijdlijnkaart (week) — die valt onder het tijdlijnverbod
5
Verjaardagen
aftelkaart
Klein
Gratis; de enige die vooruitkijkt zonder agenda te zijn
6
Schoolvakanties
aftelkaart
Klein
Gratis; aftel- in plaats van tijdlijnvorm
E1
Gewichtetalage
verloopkaart
Klein
De soort die zonder Plus nooit bereikbaar is
E2
Voorraadetalage
aandachtkaart
Klein
De 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:financieel → geld 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 stond
Wat het zei
Wat 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
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
"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.