Het huis dat praat — wat er al is, en wat we ervan geleerd hebben
Voor A (de hoofdagent) · van B · 23 september 2026, avond
E, na de herstart van vanmiddag: "neem jij ondertussen alles door wat we hebben in de code al over je huis en over een huis. Ook qua design en lettertype etc. We hebben in de vorige ronde al zoveel gedaan en geleerd. We willen niet afgeleid raken, maar belangrijke lessen willen we meenemen. Zet het klaar voor de hoofdagent."
Dit is die doorloop. Eerst wat er staat (met paden, zodat je niet hoeft te zoeken), dan de regels waar het huis zich aan houdt, dan het ontwerp en de letter, dan de lessen per ronde in E's eigen woorden, en tot slot E's drie ideeën van vanmiddag als opdrachten die je kunt oppakken. Niets hierin is nieuw beleid; het is wat er al besloten, gebouwd en geleerd is, op één plek.
Werkkopie-afspraak. Wij werken in dezelfde map (~/Developer/mi-casa-presentatie, branch presentatie). B
schrijft daar niets; alles van B staat in de regiemap (~/Documents/mi-casa-presentatie). Op het moment van
schrijven staan er zeven ongecommitte bestanden in de werkkopie (de ronde "de Ja-knop en de deur chiquer", zie §4
ronde 9) die door jouw sessie geschreven worden. Stage alleen je eigen paden; nooit git add -A.
In één minuut
- Het huis heeft één stem en één plek. Het zegt "ik", spreekt vanuit de onderrand van zijn eigen passe-partout in de kopletter (Montserrat 600), arriveert in één keer en is dan stil. Carmen praat op het linnen, woord voor woord. Het verschil is diepte en tempo, nooit kleur, nooit een bubbel of avatar.
- Het huis zegt alleen wat een bron zegt. Een veld zonder bron is
null, en de zin valt weg. Elke beurt met een bron draagtfeit {bron, soort}; dat is wat op tafel komt te liggen. Nooit een waarde, nooit een naam, nooit iets over de mensen. - Wat het huis van zichzelf weet komt uit drie lagen: het profiel (BAG, EP-Online, of de seed in demo), de
registers (
lib/kennis/huis-zelf.mjs: monument, beschermd gezicht, achterkant, maten, dak, hoogte, bouwlagen) en, alleen tegen de eigenaar, van binnen (EP-Online-opname, het web, gelezen papier). - Aan de deur klinkt weinig, in de kamer meer. De deur heeft een maat (de eerste minuut); daar zegt het huis zijn maten, hoogstens één registerfeit, "bewaar me" en de terugwissel. De kamer heeft de chip "Wat weet je van jezelf?" met tot vijf feiten, de kleine vraag, de helpende hand, en Binnen.
- De lessen die het zwaarst wegen: elk voorstel heeft een vervolg; feiten mogen niet verdwijnen (daarom de tafel); geen AI-disclaimers of AI-labels in beeld zolang we testen; het straatbeeld op ooghoogte vóór de luchtfoto; de Ja-knop is de belangrijkste tik van de eerste minuut; altijd de directe testlink.
1 · Wat er staat
1.1 De deur: server/lib/gesprek/machine.mjs
| Stap | Functie | Wat het huis doet |
|---|---|---|
deur |
deur() |
Carmen: het feit van de singel, de vraag "Waar woon je, of waar droom je van?" |
bevestig |
bevestig() |
"{straat} {nummer} in {plaats}. Bedoel je dat?" met de gevel (straatbeeld, 1,5 s budget) of luchtfoto in de plaat |
huis |
wissel() |
Carmen: "Dan laat ik jullie even alleen." · 1 s stil · wissel naar het huis · paneel huis · de matenzin · hoogstens één registerfeit (ZELF_AAN_DE_DEUR: bescherming → monument → ligging → dak, alleen zekerheid hoog) · "Bewaar me, dan onthoud ik wat je me vertelt." · de terugwissel "De straat? Daar weet Carmen meer van." · Carmen: het straatfeit |
vrij |
zelfbeurt() |
chip "Wat weet je nog meer?": korte wissel, tot vier registerfeiten die aan de deur niet klonken, slot, Carmen terug |
vrij → bewaar |
bewaarBegin(), inDeBewaarstap() |
chip "Bewaar mijn huis": het huis vraagt één e-mailadres, de server stuurt de link; het huis ontstaat pas bij het klikken (lib/huizenAanmaken.mjs, één adres = één huis) |
vrij, wijk |
breinbeurt() |
alleen op onbekende invoer: Sonnet 5 met tools (huis_feiten, straat_feit, wijk_straten, straat_maten, rijm, web_van_eigenaar, zoek_adres), guard tegen cijfers/namen zonder bron |
Drie budgetten bepalen het tempo aan de deur: ZELF_MS 3000 (de registers), STRAATBEELD_NA_MS 800 (de gevel
na het profiel), BEVESTIG_BEELD_MS 1500 (de gevel bij "Bedoel je dat?"). Wat niet op tijd is, valt weg zonder
foutmelding; opTijd() is het patroon. In tests klinkt de zelfkennis nooit (NODE_TEST_CONTEXT), en
GESPREK_ZELF=0 zet hem uit.
De teksten staan in server/data/gesprek/teksten.json (huis.*, zelf.*, bewaar.*, wissel.*, bevestig.*),
tweetalig, met een _over-regel per sectie die zegt waar de sectie voor is. De tijden: stilNaOpeningMs 7000,
stilBijWisselMs 1000, stilBijZelfMs 600. De AI-disclaimer huis.ai staat nog in het bestand maar wordt sinds
23-09 niet meer uitgesproken (E).
1.2 Het profiel: server/lib/gesprek/huis.mjs
haalHuisprofielOp(adres): in demo-modus eerst de seed (seed.mjs, zoekSeedHuis, alleen huizen zonder
bewaardOp), anders BAG (postcode + nummer) via de bronpoort, terugval lib/huisprofiel.mjs (BAG OGC via de
Locatieserver), en EP-Online voor het label, parallel. Elk veld dat geen bron heeft blijft null. bron is het
contractveld voor de onderrand, bronnen staat ernaast als het label van een andere bron komt. peildatum is de
dag dat wíj keken; geldigSinds wat de bron zelf meegaf. De luchtfoto is een PDOK-WMS-URL rond het RD-punt
(luchtfotoUrl, 40 × 40 m, geen download, geen sleutel).
Seed-huis h01 (Wilhelminapark 25, Sanne): bouwjaar 1910 is echt (BAG), 145 m² en label C zijn demo (het register
kent hier 659 m² met kantoorfunctie, dus niemand wordt belast), en de seed draagt nog wozWaarde 783000 plus
verzonnen gasverbruik en isolatie. Dat laatste staat op de backlog: harde grens "nooit een waarde", en
GET /api/huizen/:id geeft het hele record aan iedereen.
1.3 Wat het huis over zichzelf weet: server/lib/kennis/huis-zelf.mjs
watHetHuisOverZichzelfWeet(adres) maakt uit acht open bronnen een lijst feiten in de stem van het huis, elk met
{ tekst: {nl, en}, bron: {naam, url, peildatum, geldigSinds?}, soort, zekerheid? }. De soorten, in de volgorde
waarin ze in de code staan:
| soort | Bron | Voorbeeld (Wilhelminapark 25) |
|---|---|---|
monument |
Rijksmonumentenregister (RCE Linked Data, exact op verblijfsobject-id) en gemeente Utrecht (WFS) | "Het register omschrijft mij zo: '…' Zelf zou ik het niet zo gezegd hebben." |
bescherming |
RCE beschermde gezichten via PDOK | beschermd stadsgezicht Utrecht-Oost |
pand |
BAG (pandtelling, status) | "Ik ben niet één pand maar twee, aan elkaar gebouwd…" |
ligging |
BAG-omtrek + BGT-rijbanen + Locatieserver-straatlijn | "Mijn achterkant kijkt naar het noordwesten." (zekerheid hoog of midden) |
maten |
BAG-omtrek | "Van voor naar achter ben ik 20 meter diep en 14 meter breed." |
dak, hoogte |
3DBAG | schuin dak, nok 12,2 m, "AHN5, 2023" in de zin |
gebruik |
BAG | gebruiksdoel |
binnen |
EP-Online (watHetHuisVanBinnenWeet) |
de opname, eigen opwek, zomerwarmte — alleen in de kamer |
Bij een storing komt er géén feit. Elke zin zegt waar hij vandaan komt ("Dat weet ik van mijn omtrek in het
register, niet van mezelf"). Er staat een cache per bron in het geheugen. README.md in die map legt uit welke
bronnen we bewust níét gebruiken (AHN los, de RCE-WFS op afstand, de Utrechtse redengevende omschrijving) en
waarom. Proef: node server/proef/huis-zelf.mjs "<adres>".
De straat en de wijk zijn Carmens werk, niet dat van het huis: straat-bronnen.mjs (de oogst, 440 straten,
1.113 feiten), straat-op-aanvraag.mjs (heel Nederland, 3 s budget), straat-maten.mjs (ochtendzon, diepte,
bomen, water, halte), wijk-op-aanvraag.mjs (CBS-buurt in ~15 s). Het huis zegt over de straat: "Daar sta ik met
mijn rug naartoe. Carmen?"
1.4 De kamer: server/lib/gesprek/kamer.mjs
Context kamer van POST /api/gesprek: het huis tegenover zijn eigenaar. Eén stem (geen Carmen), het fan-getal
als onderwerp (paneel kamer {aantal, sindsVandaag}, event teller), het huis handelt nooit (zichtbaarheid is een
voorstel plus een chip naar het bestaande scherm). Daarbovenop, in deze volgorde na de opening: de kleine vraag
(één per gesprek, drie woorden, wordt één relatie met bron gezegd en het strookje), de helpende hand
(lib/helpende-hand.mjs, vermoedens.json, één zin per dag, "Waarom zie ik dit?" als drie beurten), en de chip
"Wat weet je van jezelf?" (maten uit het record eerst, dan de registers, dan Binnen; samen hoogstens vijf; één
keer per gesprek; de zelf-lijst wordt bij het huis bewaard). Teksten in teksten-kamer.json, met eigen lezer.
Wat er nooit uit deze machine komt: een naam, een initiaal, een gezicht, een waarde, een prijs; hoogstens een
eigenschap als er meer dan één mens achter zit.
1.5 Binnen: server/lib/binnen.mjs, lezen.mjs, Binnen.svelte, Dagboek.svelte, Lezen.svelte
Pakket 1 (het huis vraagt naar binnen, acht binnen-vragen), pakket 2 (/#/binnen/:huisId: omtrek, kamers,
dagboek), pakket 3 (POST /api/huizen/:id/lees: pdf of foto, Sonnet 5 stelt hoogstens vijf zinnen voor met zaak
en datum, de eigenaar bevestigt, het bestand wordt nooit bewaard). Concept en regiebesluiten: BINNEN.md.
1.6 De plaat en de onderrand: web/src/components/GesprekPlaat.svelte, web/src/schermen/Deur.svelte
De plaat is één beeld in een passe-partout en de onderrand is de mond van het huis. Bewust géén FotoKader
(dat zet een AI-label). In het papier ligt de gevel op ooghoogte (straatbeeld) met de luchtfoto eronder als
terugval en verrijking; toont zegt de deur wat er echt te zien is zodat de onderrand de juiste bron noemt. Twee
dingen bewegen: de gouden haarlijn (band) sluit zich om de foto zodra het huis "ik" zegt en dooft bij de
terugwissel; de plaat doet dan één stap terug (--deur-stap 0.98). Sinds 23-09 loopt de foto van rand tot rand en
tot bovenaan het scherm, zonder eigen hoeken (E).
Deur.svelte kiest de plaatbron per paneel (plaatBronVan: huis, straat, wijk, straten, bevestig), bouwt de
tafellijst (TAFEL_MAX 12, kaartjes uit feit), houdt de Ja/Nee in de onderrand zolang het bevestig-paneel open
staat, en luistert naar toon (tik op een nummer = zie dat huis).
1.7 De beurt: web/src/components/GesprekBeurt.svelte
Carmen: --font-tekst op --maat-groot, woord voor woord (--woord 45 ms), regellengte 58ch. Het huis:
--font-kop op --kop-klein, gewicht 600, letterafstand -0.005em, in één keer (--huis-in 180 ms). Het label
CARMEN staat één keer boven haar eerste beurt; het huis krijgt nooit een naam, het adres in de onderrand ís zijn
naam. De standtijd van een huisbeurt is leestijd, geen animatie: TEMPO in web/src/lib/gesprek.js rekent
huisIn + 600 ms + 280 ms per woord, tussen 2,5 en 10 s. Wijzig je --woord, --huis-in of --huis-woord in
app.css, wijzig dan TEMPO mee; ze staan met opzet naast elkaar gedocumenteerd.
1.8 De tafel: web/src/components/Tafel.svelte, OpTafel.svelte
Vanaf 1024px ligt de deur als telefoon op een walnoten tafel; ernaast liggen afdrukken (luchtfoto's in
passe-partout: huis, straat, wijk als wand, de drie straten) en kaartjes (elke zin met een bron: erboven in
kapitalen wie het zei, de zin in de tekstletter, in de onderrand bron en peildatum). Raster van vakken
(--tafel-rijen 4, kolommen gemeten); het nieuwste ding ligt groot in het midden tegen de telefoon aan, de rest
eromheen, hoe ouder hoe verder naar buiten, kleiner en gedempter; hoogstens twaalf; niets scrolt. Elk ding ligt
een vaste fractie scheef (schommel, uit zijn sleutel, zodat de tafel niet trilt). Op de telefoon is dezelfde
lijst het vel "Op tafel". Zaalstand ?podium=1. Alle maten in app.css (--tafel-*, --telefoon-*, --hout*).
De huis-afdruk toont adres en bron, niet bouwjaar of oppervlakte; die staan alleen op een kaartje als het huis
ze uitspreekt (zie §5.2).
1.9 De stem: server/lib/stem.mjs, web/src/lib/stem.js, StemKnop.svelte
POST /api/stem {gesprekId, beurtId} (nooit vrije tekst), cache op schijf, STEM_DAG_TEKENS 60000, voorStem()
zet <break time>-tags bij opsommingen en punten. Het huis = E's E Pro (ELEVENLABS_VOICE_ID), Carmen = "Hope"
(WZlYpi1yf6zJhNWXih74, CARMEN_STANDAARD); Leonie en Emma staan nog als kandidaten in het account. De metronoom
in de browser wacht op ended. Aan met ?stem=1.
1.10 Het straatbeeld: server/lib/straatbeeld.mjs, mapillary.mjs, routes/straatbeeld.mjs
Camera vanaf de rijbaan vóór het huis op het pandcentroid (heading uit de straatkant), Google Street View Static
via onze proxy, Mapillary als tweede bron (Google tenzij Mapillary minstens twee jaar jonger is en naar het huis
kijkt; attributie "Mapillary · CC BY-SA 4.0" met link), metadata-cache, beelden alleen kort in het geheugen,
dagbovengrenzen 3.000 / 8.000. Panelen huis/straat/wijk/straten/bevestig dragen straatbeeld {url, bron} én
luchtfoto. Kosten: $7 per 1.000 na 10.000 gratis per maand per SKU.
1.11 Het vel, het bewijs, de teamsessie
GET /api/huizen/:id/vel + Vel.svelte (A5, QR uit web/src/lib/qr.js), /#/bewijs (tellers per dag:
huizenBewaard, vellen, stemzinnen), /#/ervaar (vijf stations). Zaterdag 26-09: TEAMSESSIE.md, SPREEKTEKST.md,
REGIEKAART.md; een uur van tevoren polsslag.sh --zaal en op-scherp.sh --live. Geen POST /api/reset meer
tot na zaterdag: dat wist bewaarde huizen en accounts.
2 · De regels waar het huis zich aan houdt
Uit concept v3 (§1–2), de bouwopdrachten en de code. Dit is de stem; wie het huis iets nieuws laat zeggen, toetst eraan.
- Het huis begint met "ik". Carmen met "kom" of "kijk". Blind te horen, ook zonder vorm.
- Traag, kort, dan stil. Drie korte zinnen, in één keer, dan een hele tel niets. Het huis versnelt nooit.
- Droog, over zichzelf. "Zelf zou ik het niet zo gezegd hebben." "Zelf heb ik nooit een meetlint gehad." Nooit humor over de mens.
- Bron is spreekrecht. Geen bron, geen zin. Elke zin zegt waar hij vandaan komt, en elk feit draagt
{naam, url, peildatum}; de onderrand en het kaartje tonen dat. - Het huis weet van binnen, Carmen van buiten. Straat, wijk, stad, geschiedenis: "Daar weet Carmen meer van." Carmen is nooit binnen geweest; dat is hoe privacy hier klinkt.
- Nooit een waarde, nooit een prijs, nooit een naam. Geen WOZ, geen vraagprijs, geen initiaal van een fan, geen gezicht. Hoogstens een eigenschap als er meer dan één mens achter zit.
- Het huis handelt niet en wil niets. Het stelt voor, de eigenaar zet. Het introduceert nooit een vakmens; geld is van "wij".
- Weten wat je niet weet. "Meer staat er in de registers niet over mij." Nooit invullen wat een bron niet gaf; een storing is stilte.
- Eén ding tegelijk in de kamer. Kleine vraag óf helpende hand; één keer per gesprek; nooit bedanken, nooit met andere woorden herhalen.
- Geen disclaimer, geen AI-label in beeld zolang we testen (E, 23-09). De tekst blijft bestaan
(
huis.ai), maar klinkt niet. Presentatie gaat vóór wetgeving in deze fase; de jurist komt later (creatief-eerst-juristen-later). - Elke vraag heeft een vervolg. Een voorstel ("Zal ik…?") heeft een ja/nee-afhandeling die iets toont dat we echt kunnen (les van 18-09).
- Aan de deur een maat, in de kamer de rest. De eerste minuut is kort; wat meer wil, gaat naar "Wat weet je nog meer?" (deur) of "Wat weet je van jezelf?" (kamer).
3 · Ontwerp en letter
Bron van waarheid: design-system/MASTER.md en web/src/app.css; het waarom in .impeccable.md. In een
.svelte-bestand staat nooit een losse hex, px of fontnaam (E: "de precieze kleuren kunnen we later nog aanpassen
omdat alles zo logisch is opgebouwd").
3.1 Letter (D20, D22, P3)
- Kop: Montserrat Variable (E: "het lettertype is te AI-standaard, ik denk richting Gotham"; Montserrat is het dichtst bij Gotham). Tekst: Source Sans 3 Variable. Beide via fontsource, geen Google-Fonts-verzoek.
- Montserrat heeft geen
opsz; het contrast komt uit gewicht en letterafstand: h1 700/-0.02em, h2 600/-0.015em, h3 600/-0.005em,line-height1.1. Tekst 1.5,text-wrap: pretty, max ~58ch. - Elk getal in
--font-cijfer(= de tekstletter, tabulair, klasse.cijfer). Nooit een getal in de kopletter, ook al kan Montserrat het: de afspraak is letter-onafhankelijk. - Maatschaal:
--maat-mini11,--maat-klein13,--maat-basis15,--maat-groot17,--kop-klein20,--kop-midden22→28,--kop-groot30→42,--kop-reus34→48. Lichaamstekst blijft 15px op elk scherm. - Het huis spreekt in de kopletter (
--kop-klein, 600), Carmen in de tekstletter (--maat-groot). Dat is het enige typografische onderscheid tussen de twee stemmen, en het is genoeg.
3.2 Kleur als rol
Negen rollen (--bg, --oppervlak, --rand, --inkt, --tekst, --tekst-gedempt, --signaal, --fout,
--pp-papier) met een dag- en een nachtset. Accent = inkt. Goud is de enige kleur die iets betekent (D49):
een lijn, nooit een vlak, behalve het hart; goud markeert wat een band met jou heeft. Verboden: paars-blauwe
gradients, Funda-blauw, makelaar-oranje, glassmorphism als decoratie, Inter/Roboto, puur #000/#fff, een tweede
accentkleur op één scherm.
De kamer (/fans, MASTER §11) is "de andere kant van de dag": klasse .kamer draait de rollen om. Een component
weet nooit dat het in de kamer staat. Afgeleiden die op :root uitgerekend worden (--accent, --goud-vlak)
moeten in de twee .kamer-blokken opnieuw gekoppeld worden; dat is de valkuil die het strookje donker maakte
(opgelost met --strook-papier/-inkt/-lijn).
3.3 Het passe-partout (D48), de signatuur
Elke foto in een papieren rand met een bredere onderrand, en het onderschrift gedrukt ín die rand. Tokens
--pp-* in app.css; randmaten 14/11/7 zijn materiaaldikte, geen afstand, en staan daarom niet op de
ruimteschaal. Verboden: fotohoekjes, vouwen, tape, ezelsoren, rotatie (ook niet één graad), een witte rand
(--pp-papier is nooit #fff), een zwarte slagschaduw, een tweede rand om de rand. "Als het als Etsy of als een
bruiloftssite gaat lezen, is een van de zes regels overtreden." Op de tafel liggen de dingen wél een fractie scheef
(--draai-max); dat is de tafel, niet het passe-partout.
3.4 Vorm, ruimte, motion
- Radius 20 kaarten, 24 beeld,
--radius-pilvoor knoppen en pillen; tap-doel--tap48px, ook als iets er kleiner uitziet (een onzichtbaar vlak eromheen); randen 1px. - Ruimte: één schaal 4/8/12/20/32/48/64.
- Motion: alleen het ♥ (één klop,
--bloei620 ms) en het inkomende signaal bewegen opvallend; al het andere is--vlot180 ms met--ease-uit.--deur420 ms voor de wissel naar de kamer en het opkomen van de gevel.prefers-reduced-motionzet het woord-voor-woord uit, in JS én CSS. - Schaduw warm (
rgba(40,36,30,…)), nooit een zwarte doos.
3.5 De deur in het bijzonder
- Diepte, geen kleur. Carmen op het linnen, het huis van het papier. Geen avatars, geen bubbels.
- Het veld en de chips staan vast onderaan, het gesprek scrolt erboven (ronde 4: gemeten, veld op dezelfde y
in zeven momenten). Het chipvak heeft een vaste hoogte (
--chipvak); een nieuwe set vervangt de oude op dezelfde plek, alleen op opacity. Een te lange chip wordt afgekapt, de rij wordt nooit hoger. - De plaat mag nooit zoveel hoogte pakken dat er voor het gesprek niets overblijft (
--plaat-max). - Volle breedte (E, 23-09): de foto van rand tot rand en tot boven, geen eigen hoeken naast een scherm vol rondingen.
- De onderrand noemt de bron kort: tot de eerste komma of " (", hoogstens vier namen en dan "+n", peildatum
met harde koppeltekens (
korteBron,bronRegelinTafel.svelte, gedeeld met de deur en Op tafel). - Het straatbeeld eerst, de luchtfoto als verrijking (E, 23-09, zet D54 opzij voor de testfase): "een dakvlak van boven herkent niemand als zijn huis; een gevel op ooghoogte wel."
- De Ja-knop is de belangrijkste tik van de eerste minuut (E, 23-09): één volwaardige knop "Ja, dat klopt" over de volle breedte van de onderrand, daaronder een stil "Nee, opnieuw". Deze ronde loopt nu in jouw sessie (§4, ronde 9).
4 · De lessen per ronde, in E's woorden
Chronologisch; wat E zei, wat we deden, wat de les is. De volledige logboekregels staan in VOORTGANG.md.
Ronde 1 · 17-09 · "te veel jurist." Concept v1 was een juridisch stuk. E: creatief team dat grenzen opzoekt, netjes binnen de wet maar niet roomser dan de paus. Uit die correctie kwam Carmen. Les: dromen eerst, toetsen later; het huis mag droog en persoonlijk zijn.
Ronde 2 · 18-09 · "Het idee is fantastisch, maar de uitwerking nog niet." E's eerste test: "water" leidde tot een belofte die we niet konden waarmaken, "ja" werd niet begrepen, "laat maar zien" werd de straat "Maar". Les: elk voorstel heeft een vervolg; ja/nee vóór het netwerk in elke stap; een PDOK-treffer alleen als de invoer er echt op lijkt (stoplijst; later ook: alleen cijfers is geen adres). En de deur zelf: standtijd per woord, veld en chips vast, metronoom per ronde (twee antwoorden liepen door elkaar).
Ronde 3 · 18-09 · "echt een telefoon op tafel, met een mooie houten tafel als achtergrond." Uit drie mockups (telefoon op tafel, de marge, de wand) koos E A met de wand en de ondertitel uit C. Les: de deur is op élk scherm de telefoonindeling; de tafel is de jas eromheen.
Ronde 4 · 22-09 · "het is nog te leeg." Naast de presentatie een tweede baan voor de essentie: de kennisbank, het huis dat zichzelf kent, tien buurten, de oogst, de straatmaten. Les: de stem is alleen zo goed als de voorraad erachter; eerst bronnen, dan zinnen.
Ronde 5 · 23-09 · "Haal het stuk over ik heb geen stem etc weg. Ook afbeeldingen voorzien van AI image weg. We
zijn aan het testen, stop met wetgeving boven presentatiestof te plaatsen." De disclaimer uit de deur, het
AI-tafelmerk weg, GesprekPlaat zonder label. Les: in de testfase geen voorbehouden in beeld.
Ronde 6 · 23-09 · "In het gesprek verdwijnen de feiten. We hebben een perfecte UI gecreëerd om juist veel zaken
op tafel te leggen. Laten we dat benutten." feit op elke beurt met bron, kaartjes op tafel, Op tafel op de
telefoon. Les: een feit dat is uitgesproken moet blijven liggen; de tafel is het geheugen dat je ziet. (Dit is
precies waar E vanmiddag op doorgaat, §5.1.)
Ronde 7 · 23-09 · de stem. "Een niet-chique stem voor Carmen. Je merkt direct dat er iets meer pauze moet
komen bij opsommingen. Test ook in Engels." Daarna: "WZlYpi1yf6zJhNWXih74 deze stem graag voor Carmen. E Pro
blijft erin." Les: pauzes zijn regie (voorStem); het huis en Carmen klinken anders, ook in het Engels.
Ronde 8 · 23-09 · "We moeten echt van die luchtfoto's af … streetview … luchtfoto's erbij als verrijking, maar niet enkel." En: "ik kan geen nummer kiezen" (de pillen stonden gedempt voor gasten: ontwerp, maar verkeerd voor de test). Straatbeeld op ooghoogte overal, gast-harten, tik = kijk. Les: persoonlijk is op ooghoogte; en wat voor een gast bewust dicht zit, moet in een test toch werken.
Ronde 9 · 23-09 · "de yes knop mag veel meer aanwezig en dit mag in de gehele stijl veel chiquer maar modern
zijn." En: "je ziet dat de hoeken van de afbeelding niet passen. Kaarsrecht vs overal rondingen … de volle
breedte." De volle breedte is live (b70300e). De Ja-knop en het chiquer maken van het veld, de chips, de
bronregels en de zwevende schakelaars (glas) staan op dit moment ongecommit in de werkkopie
(app.css, GesprekChips.svelte, GesprekVeld.svelte, GesprekBeurt.svelte, TaalSchakelaar.svelte,
Deur.svelte, i18n): rol ja | nee | chip per voorzet, "Ja, dat klopt" als inkt-knop over de volle breedte, het
nee als stil woord, het veld als pil met de pijl erin, Carmen op regelafstand 1.6, de bronregels in kleine
kapitalen. De web-build slaagt ermee. Wat nog moet: kijken op 390 en 1440, licht en donker, en dan committen en
deployen. Les: chic is hier rust, ruimte en materiaal, geen nieuwe kleur.
Vaste afspraken uit deze rondes, buiten het ontwerp:
- Altijd de directe testlink bij elk verzoek om te testen (E: "geef me de link van wat ik moet testen altijd").
- Nooit "investeerders"; de werkterm is "de zaal".
- Uitvoering door Opus/Sonnet, regie en eigen QA door de hoofdagent; E wil elke 10–15 minuten een korte stand bij lang agentwerk.
- Eén link per werkdag op Trello-lijst Review; één regel per dag in
VOORTGANG.md.
Technische lessen die je anders opnieuw leert:
- De Bash-tool is zsh:
--include=*.xzonder quotes faalt;set -- $dsplitst niet. - Een grep-keten na
node --testverbergt een falende test (grep geeft 0): kijk naar de exit van de test zelf. Zo is er twee keer met een rode test gedeployd. - Env-waarden met
|of spaties (Mapillary-token,MAIL_VAN) moeten in enkele quotes, anders breekt het sourcen. - Een lege
SLEUTEL=-regel op zilch33 blokkeert de echte; schrijf sleutels via een tijdelijk bestand, nooit in de chat of een transcript (de Google-sleutel en het Mapillary-token staan op de backlog om te roteren). - 429 aan de deur viel stil terug op de fixture (Sannes huis); nu
teDrukBeurt, een eerlijke zin. bevestig,wensbeurt,rijmbeurt,wijkbeurtzijnasync function*geworden voorawait; een gewonefunction*metawaitis een SyntaxError die je pas bij het starten ziet.- Het brein en de zelfkennis draaien nooit in tests (
NODE_TEST_CONTEXT); tests die netwerk nodig hebben, zetten hun eigen lijst met_zetZelfkennisVoorTest. GET /api/gesprek/:idis de volledige geschiedenis van een gesprek (beurten metfeit, panelen); daar hoeft niets nieuws voor bedacht te worden.
5 · E's drie ideeën van vanmiddag, klaargezet
E, bij een schermafbeelding van de tafel: "hier ligt een enorme kans! We kunnen alles steeds naar rechts schuiven, eigenlijk onbeperkt. Dus al het nieuwe verschijnt dichtbij het scherm en schuift steeds verder door. We houden dan bijna een onbeperkte geschiedenis bij. Dit staat ook perfect in contact met onze neo4j (of andere) manier van zaken opslaan en een rijk profiel opbouwen. Een los punt is dat het huis heel saaie dingen zegt direct. Aantal m2 en reg nummer. Dit typen is ok, maar noemen is niet een normale conversatie. We zouden voor alle jaartallen een aantal leuke weetjes kunnen ophalen. Dat kan een goedkopere agent doen. … Echt wel een hoop feiten per jaar zodat het niet verveelt. En alleen maar leuke en soms ook gewichtige weetjes. Geen oorlogen, erge gebeurtenissen etc."
Drie dingen, elk als opdracht die een agent kan oppakken. B heeft er niets van gebouwd; dit is de beoordeling en het recept.
5.1 De tafel als onbeperkte geschiedenis: alles schuift naar rechts
Wat er nu is. Nieuwste groot tegen de telefoon, de rest in een raster eromheen, hoogstens twaalf, niets
scrolt; oudere dingen gaan eraf. De lijst wordt in Deur.svelte uit de events gebouwd (tafelRauw, oudste
eerst) en bestaat alleen in de browser. De volledige geschiedenis bestaat wél al aan de serverkant:
GET /api/gesprek/:id (beurten met feit, panelen), en per bewaard huis het web (lib/relaties.mjs, met
zaak, soort, bron, wanneer).
Voorstel. Eén richting, zoals E zegt: het nieuwste komt tegen de telefoon aan, alles wat er lag schuift één plaats naar rechts, en de tafel is naar rechts onbeperkt (horizontaal scrollen, of slepen; de telefoon blijft staan). Behoud wat E eerder koos: het nieuwste ligt groot, wat ouder is ligt kleiner en gedempter; de vaste scheefte per sleutel blijft, zodat niets trilt bij het schuiven. Op de telefoon blijft "Op tafel" het vel, nu ook onbeperkt.
- Bron van de lijst wordt de server, niet de browser: de tafel leest
GET /api/gesprek/:id(bestaat) en voegt nieuwe events toe; na een herlaad ligt alles er nog. Voor een bewaard huis komt daar het web bij (relaties met hun strookjes), zodat de tafel van de kamer dezelfde tafel is als die van de deur. - Virtualiseren vanaf zo'n veertig dingen (alleen wat in beeld is wordt gerenderd); de
flip-animatie blijft voor de dingen in beeld. - Wat E "neo4j" noemt, is in dit project al het web: elk ding op tafel is een knoop met
bronenpeildatum, en een relatie hangt aan een zaak. Geen nieuwe opslag nodig voor de teamsessie; wel de afspraak dat een kaartje en een relatie hetzelfde schema spreken ({tekst, bron, soort, wanneer}), zodat het later in een graaf kan zonder vertaalslag. Schrijf dat als één regel inserver/README.md. - Podium (
?podium=1) had links én rechts; in één richting wordt het alleen rechts, met de telefoon links van het midden. Controleer de derde rij van de zaal. - Te raken:
Tafel.svelte(raster → baan),OpTafel.svelte,Deur.svelte(TAFEL_MAXweg, lijst uitGET /api/gesprek/:id), tokens--tafel-*inapp.css. Server: niets nieuws, hoogstensGET /api/gesprek/:idin de kamer-context.
Waar B nee tegen zegt. Niet vóór zaterdag ombouwen: de tafel is de kern van "Ervaar het zelf", en een scrollende baan is een ander gebaar dat E eerst moet zien. Een mockup (drie schermbeelden: na 3, 12 en 40 dingen) kost een uur en is de veilige weg.
5.2 Het huis zegt saaie dingen: typen is goed, noemen niet
Wat er nu is. De eerste beurt van het huis is de matenzin ("Ik ben gebouwd in 1910. 145 vierkante meter,
energielabel C."), dan hoogstens één registerfeit, dan "Bewaar me", dan de terugwissel. Het monumentnummer klinkt
als het huis een gemeentelijk monument is ("nummer …"). De maten komen alleen op tafel als het huis ze uitspreekt
(kaartje uit feit); de huis-afdruk zelf toont adres en bron.
Voorstel: scheid wat het huis zegt van wat er op papier staat.
- Op papier (getypt, op tafel, in het paneel): bouwjaar, oppervlakte, label, monumentnummer, pandtelling,
maten in meters. Zet ze in de onderrand van de huis-afdruk (
Tafel.svelte,OpTafel.svelte) en in het huis-paneel, als regels in de kleine kapitalen: "BOUWJAAR 1910 · 145 M² · LABEL C". Dan blijven ze liggen zonder dat iemand ze hoeft uit te spreken. Het kaartje "145 vierkante meter" vervalt. - Gesproken: het huis opent met iets wat een huis over zichzelf zóu zeggen: het bouwjaar met een weetje van dat
jaar (§5.3), en één feit met karakter uit de registers ("Mijn achterkant kijkt naar het noordwesten", "Ik sta in
een beschermd stadsgezicht"). De volgorde in
ZELF_AAN_DE_DEURblijft; de matenzin gaat van de deur naar de kamer ("Wat weet je van jezelf?" zegt hem nog wel, daar vraag je erom). - Te raken:
machine.mjs wissel()(de matenzin niet meer als beurt; het paneelhuisdraagt de maten al),teksten.json huis.voorstellen(blijft voor de kamer en voor de stem op verzoek),Tafel.svelte(onderrand van de huis-afdruk), testsgesprek.test.mjs(telling van huisbeurten: nu 3). - De stem (
stem.mjs) leest alleen beurten, dus wat op papier staat wordt vanzelf niet meer voorgelezen.
Grens. Het bewijsbord telt een huis-paneel als "een huis dat sprak"; dat blijft kloppen. En het huis zegt nog steeds alleen wat een bron zegt: minder, niet anders.
5.3 Weetjes per jaar, door een goedkopere agent
Wat het is. Voor elk bouwjaar dat in Nederland voorkomt (zeg 1600–2026, de meeste huizen 1880–2026) een voorraad van tien tot twintig korte weetjes: leuk, soms gewichtig, nooit oorlog, ramp, dood of ellende. Het huis zegt er aan de deur één ("Ik ben gebouwd in 1910. Datzelfde jaar vloog de eerste Nederlander in een vliegtuig boven eigen land"), en in de kamer meer ("Wat gebeurde er in mijn bouwjaar?"). Bij een tweede bezoek een ander, zodat het niet verveelt (E).
Bron. Wikipedia-jaarpagina's (nl en en, "1910") en Wikidata; de oogstmachine (straat-bronnen.mjs) praat al
met beide, met poort en peildatum. Licentie CC BY-SA 4.0: bronvermelding in de onderrand zoals bij de straten
("Wikipedia, 1910 · peildatum …"). Eén feit uit een lijst is geen werk, maar de naam staat erbij, zoals overal.
De goedkopere agent. Haiku 4.5 (claude-haiku-4-5-20251001) via dezelfde fetch als het brein
(brein.mjs), niet Sonnet: per jaar één aanroep met de jaarpagina als invoer en een strikte opdracht: kies tien
tot twintig feiten, elk één zin in de stem van het huis ("Datzelfde jaar …"), nl én en, met toon: leuk | gewichtig, en laat weg: oorlog, aanslag, ramp, ongeluk, ziekte, sterfgevallen, misdaad, politiek conflict.
Daarna een harde stoplijst in code (woorden als oorlog, slag, ramp, overleden, aanslag, moord, epidemie,
hongersnood, bezetting) die een zin ongeacht het model verwijdert, en een steekproef van de regie (E of A) op
twintig jaren vóór het live gaat. Kosten: ruwweg 400 jaren × één aanroep van ~6.000 tokens in en ~1.500 uit; met
Haiku-tarieven een paar euro in totaal, eenmalig; daarna staat het op schijf.
Opslag en vorm. server/data/verhalen/jaren/<jaar>.json (in git, zoals de oogst), elk feit in het schema van
de verhalenvoorraad: { tekst: {nl, en}, bron: {naam, url, peildatum}, soort: 'jaar', toon }. Een lezer
server/lib/kennis/jaar-feiten.mjs met weetjeVanJaar(jaar, { al = [] }) (kiest deterministisch per gesprek, slaat
over wat dit huis al zei). Aan de deur in wissel() direct na het bouwjaar, als beurt met feit zodat het op tafel
komt; in de kamer een chip in teksten-kamer.json; voor het brein een tool jaar_feit in brein-tools.mjs, zodat
"wat gebeurde er toen?" een bron heeft en door de guard komt.
Grenzen. Dit zijn geen pitchcijfers (die blijven onderzoek/PITCH-FEITEN.md); het zijn gesourcede
geschiedenisfeiten, Carmens domein ("ik roddel over 1890"), dus het huis mag ze zeggen als zijn jaar. Geen
Nederlandse "EK gewonnen" verzinnen: alleen wat op de pagina staat, met jaartal in dezelfde zin (de les van de
oogst: "dateert uit 1223" werd ooit "jouw straat dateert uit 1223"). Buiten Nederland en de wereld: ook
wereldnieuws mag (Einstein 1905), zolang het leuk of gewichtig is.
Volgorde die B voorstelt. Eerst 5.3 (een avond, één Sonnet- of Opus-agent voor de machine, Haiku voor de inhoud), dan 5.2 (een uur, want het bouwjaar heeft dan iets om mee te zeggen), 5.1 als mockup en pas na zaterdag als bouw.
6 · Wat A niet moet doen
- Geen
POST /api/resettot na zaterdag; geendocker composeop zilch33; alleen./deploy.sh demo; nooitzandbakofapp; niets aan/srv/caddyof DNS. - Geen sleutels in git, chat of transcript; agents tonen nooit env-inhoud.
- Geen cijfer in pitch of demo buiten
onderzoek/PITCH-FEITEN.md; nooit een waarde; nooit "investeerders". - Geen AI-disclaimer of AI-label terug in beeld; geen luchtfoto als enige beeld waar straatbeeld is.
- Geen tweede accentkleur, geen fotohoekjes, geen rotatie in het passe-partout, geen hex in een
.svelte. - Stage alleen eigen paden; B werkt niet in de code.
7 · Waar alles staat
code ~/Developer/mi-casa-presentatie (branch presentatie; deploy: ./deploy.sh demo)
server/lib/gesprek/ machine.mjs kamer.mjs huis.mjs seed.mjs bedoeling.mjs brein*.mjs limiet.mjs
server/lib/kennis/ huis-zelf.mjs straat-*.mjs maten-lezer.mjs README*.md
server/lib/ relaties.mjs helpende-hand.mjs binnen.mjs lezen.mjs stem.mjs straatbeeld.mjs mapillary.mjs
server/data/gesprek/ teksten.json teksten-kamer.json pitch.json
server/data/verhalen/ straten-*.json oogst/
web/src/app.css alle tokens
web/src/components/ GesprekPlaat GesprekBeurt GesprekChips GesprekVeld Tafel OpTafel HuisStem Strookje StemKnop
web/src/schermen/ Deur Wijk MijnHuis Fans Binnen Vel Bewijs Ervaar
design-system/MASTER.md .impeccable.md server/README.md
regie ~/Documents/mi-casa-presentatie
OVERDRACHT.md VOORTGANG.md BACKLOG.md
conversational/ CONCEPT-V3.md BINNEN.md TEAMSESSIE.md SPREEKTEKST.md WAT-NU.md REGIEKAART.md HUIS-LESSEN.md
conversational/brainstorm/08-de-landing-met-carmen.md (de wissel, de twee stemmen)
gereedschap/ bouw-concept.mjs publiceer-storyboard.sh polsslag.sh op-scherp.sh lasttest-deur.mjs
hoofd ~/Documents/mi-casa-su-casa
DECISIONS.md (D1, D20, D22, D48, D49, D51, D54) · ontwerp/01-typografie.md · ontwerp/02-signatuurstijl.md
live https://demo.micasa.bijt.me · /storyboard/concept/ · /#/bewijs · /#/ervaar