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


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.

  1. Het huis begint met "ik". Carmen met "kom" of "kijk". Blind te horen, ook zonder vorm.
  2. Traag, kort, dan stil. Drie korte zinnen, in één keer, dan een hele tel niets. Het huis versnelt nooit.
  3. Droog, over zichzelf. "Zelf zou ik het niet zo gezegd hebben." "Zelf heb ik nooit een meetlint gehad." Nooit humor over de mens.
  4. 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.
  5. 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.
  6. 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.
  7. Het huis handelt niet en wil niets. Het stelt voor, de eigenaar zet. Het introduceert nooit een vakmens; geld is van "wij".
  8. 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.
  9. Eén ding tegelijk in de kamer. Kleine vraag óf helpende hand; één keer per gesprek; nooit bedanken, nooit met andere woorden herhalen.
  10. 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).
  11. 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).
  12. 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)

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

3.5 De deur in het bijzonder


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:

Technische lessen die je anders opnieuw leert:


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.

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.

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

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