Na de vorige aflevering staan er twee agents op mijn server. OttoOps beheert de boel, DexterDev bouwt. Ze hebben ieder hun eigen rol, hun eigen bestanden en hun eigen geheugen.
Alleen zit dat allemaal nog maar op één plek: op mijn server.
Als daar iets misgaat, kan ik de agent wel opnieuw installeren, maar dan ben ik precies kwijt wat hem míjn agent maakt. Zijn afspraken. Zijn kennis. Zijn logboek. De dingen die hij onderweg zelf heeft geleerd.
Dat wil ik deze keer oplossen.
Niet door een complete kopie van iedere agent te maken. Juist niet. Een agent heeft ook allerlei bestanden die alleen nodig zijn om op dit moment te draaien: wachtrijen, statusbestanden, technische logs, tokens en sleutels. Die wil ik helemaal niet ergens anders bewaren.
Ik wil alleen bewaren wat nodig is om hem weer zichzelf te laten worden.
En daarvoor gebruik ik GitHub.
Teamstatus: 2 agents — OttoOps en DexterDev.
Eerst even: draaien ze nog?
Ik begin inmiddels steeds vaker met dezelfde soort controle. Voordat ik iets nieuws ga bouwen wil ik weten of wat er al staat nog klopt.
Dus eerst:
Draaien jullie allebei, en op welke versie van de basis?
OttoOps controleert het en meldt dat zowel hijzelf als DexterDev draaien, inclusief de ontvangers waarmee ze hun berichten krijgen.
Daarbij komt meteen iets interessants naar boven: een echt versienummer van de gedeelde basis bestaat nog niet. Er staat geen Git-repository achter. OttoOps kan alleen vertellen wanneer de bestanden voor het laatst zijn aangepast.
Dat is eigenlijk precies de aanleiding voor vandaag.

Daarna vraag ik DexterDev:
Wie ben je, en waar staat opgeschreven wat je mag?
Hij geeft het goede antwoord. Hij is DexterDev, hij bouwt en repareert code, test en levert op. Beheer hoort niet bij hem. En hij weet ook waar dat staat: in zijn CLAUDE.md.

Dat laatste is belangrijk. In een eerdere beschrijving van deze stap had ik het over een soort paspoort van een agent. Dat klinkt aardig, maar zo heb ik het uiteindelijk helemaal niet gebouwd. Er bestaat geen apart paspoort. De afspraken over wie een agent is en wat hij mag staan gewoon in zijn eigen CLAUDE.md.
Dat is wat er echt draait, dus dat is ook waar ik hier vanuit ga.
Wat we vandaag bouwen
Ik noem de GitHub-repositories in mijn opdrachten kluizen.
Dat is niet omdat GitHub ineens een geheime opslagplaats is. Het helpt vooral om het onderscheid duidelijk te houden.
In de kluis gaat wat je wilt bewaren als de server morgen weg is.
Niet wat je opnieuw kunt maken. Niet wat alleen vertelt dat een proces op dit moment draait. En vooral: geen sleutels, wachtwoorden of tokens.
Uiteindelijk wil ik drie repositories:
- één voor de gedeelde basis;
- één voor OttoOps;
- één voor DexterDev.
De basis bevat wat alle agents gebruiken. De persoonlijke repositories bevatten alleen wat bij die ene agent hoort.
Dan wordt GitHub ineens een klus op zichzelf
Tot hier klinkt het simpel: maak drie repositories en zet de juiste bestanden erin.
Alleen wil ik niet dat OttoOps en DexterDev daarvoor mijn persoonlijke GitHub-inlog gebruiken.
Ze moeten ieder hun eigen identiteit krijgen.
En dus kom ik bij GitHub Apps terecht.
Voor iedere agent maak ik een aparte GitHub App. Zo kan ik precies bepalen bij welke repositories die agent mag.

Voor DexterDev maak ik er net zo één.

Ook de rechten houd ik beperkt: inhoud lezen en schrijven en de metadata die GitHub daarvoor nodig heeft. Meer niet.

Voor OttoOps geef ik toegang tot de gedeelde basis, zijn eigen repository en die van DexterDev. Dat past bij zijn rol als beheerder.

DexterDev krijgt alleen zijn eigen repository.

Voor beide apps genereer ik een eigen privésleutel. Die komt als .pem-bestand op mijn computer terecht en moet vervolgens bij de juiste agent op de server komen.

Mijn opdracht aan OttoOps:
In mijn downloads folder heb ik twee pem bestanden “ottoops-agent.2026-10-04.private-key.pem” en “dexterdev-agent.2026-10-04.private-key.pem” plaats deze bij de juiste agent en zet de rechten correct.
Daarna liggen beide sleutels bij de juiste gebruiker en zijn ze alleen voor die gebruiker leesbaar.

Die sleutels gaan uiteraard niet naar GitHub.
De opdracht aan OttoOps — letterlijk
Dit is de eerste keer in de reeks dat ik naast de korte opdrachten in de tekst ook een heel Markdown-bestand als opdracht gebruik. Deze neem ik daarom letterlijk op.
# Opdracht aan OttoOps: GitHub-toegang als voorziening in de basis
Elke agent krijgt een eigen GitHub App en kan daarmee bij zijn eigen kluis op GitHub. Jij bouwt dat
één keer, als onderdeel van de gedeelde basis, zodat er voor een nieuwe agent niets opnieuw bedacht
hoeft te worden: hij krijgt een app en een pem, draait één commando met die twee, en hij kan erbij.
Wat gedeeld is (de scripts) staat in de basis. Wat van één agent is (zijn App ID, zijn pem en zijn
tokens) staat bij die agent in zijn homedir en komt nooit in de basis.
## Gegevens
- Jouw App ID: <APP_ID_OTTOOPS>
- Jouw pem: staat in je homedir
- Rechten van de apps: Contents read/write, Metadata read. Geen pull requests en geen branches: er
wordt direct naar main gepusht.
- De naam van een app en zijn installaties zoeken de scripts zelf op via de API. Niemand hoeft ze
over te tikken.
## Wat je bouwt in de basis
Zet drie scripts in de map van de basis waar de gedeelde programma's staan. Elke agent mag ze lezen
en uitvoeren, alleen jij mag ze wijzigen. Ze werken altijd voor de gebruiker die ze aanroept en lezen
alles uit diens homedir.
### `github-app-setup <APP_ID> <pad-naar-pem>`
Richt GitHub-toegang in voor de agent die het aanroept. Het commando moet je vaker kunnen draaien
zonder dat er iets dubbel wordt of stukgaat.
- Controleer dat de pem bestaat en leesbaar is, en stop anders met een melding.
- Verplaats hem naar `~/.config/github-app/app.pem` (600). De map `~/.config/github-app` krijgt 700.
- Schrijf `~/.config/github-app/config` (600):
```
APP_ID=<APP_ID>
PEM=$HOME/.config/github-app/app.pem
```
- Maak een JWT (RS256, `iat` = nu-60, `exp` = nu+540, `iss` = APP_ID), ondertekend met de pem via
`openssl dgst -sha256 -sign`, base64url zonder padding.
- Haal met `GET https://api.github.com/app` de `slug` op, en met
`GET https://api.github.com/app/installations` de installaties. Gebruik daarbij de headers
`Authorization: Bearer <jwt>` en `Accept: application/vnd.github+json`. Schrijf de installaties naar
`~/.config/github-app/installations` (600), één regel per eigenaar: `eigenaar=installation_id`.
- Zet de git-configuratie van deze gebruiker (global):
```
git config --global credential.https://github.com.helper ""
git config --global --add credential.https://github.com.helper "<pad-in-de-basis>/git-credential-github-app"
git config --global credential.https://github.com.useHttpPath true
git config --global url."https://github.com/".insteadOf "git@github.com:"
```
De lege eerste helper wist eventuele andere helpers. Met `useHttpPath` ziet de helper de eigenaar.
Met `insteadOf` gaan SSH-adressen via HTTPS.
- Zet de commit-identiteit op de bot van de app, zodat op GitHub te zien is welke agent iets deed:
- het ID komt uit `curl -s https://api.github.com/users/<slug>%5Bbot%5D | jq .id`
- `git config --global user.name "<slug>[bot]"`
- `git config --global user.email "<ID>+<slug>[bot]@users.noreply.github.com"`
- Staan er in de homedir clones met een SSH-remote, zet die dan op
`https://github.com/<eigenaar>/<repo>.git`.
- Sluit af met een rapport: welke app, welke installaties en welke repo's daaronder, welke bestanden
er zijn aangemaakt met hun rechten.
### `github-app-token <eigenaar>`
Zet een geldig installation token op stdout.
- Zoek de installation ID voor `<eigenaar>` op, zonder op hoofdletters te letten. Is de eigenaar
onbekend, dan zet je een melding op stderr en stop je met exit 1.
- Cache per eigenaar in `~/.cache/github-app/<eigenaar>.json` (map 700, bestand 600), met `token`
en `expires_at`. Is het token nog langer dan 5 minuten geldig, geef het dan terug zonder API-call.
- Anders maak je een JWT zoals hierboven en doe je
`POST https://api.github.com/app/installations/<id>/access_tokens`.
- Staat er geen `.token` in het antwoord, zet dan de `message` op stderr en stop met exit 1.
- Schrijf de cache atomair: eerst naar een tijdelijk bestand, dan `mv`.
### `git-credential-github-app`
- Git roept dit aan met `get`, `store` of `erase`. Reageer alleen op `get`; bij de andere twee doe je
niets en stop je met exit 0.
- Lees de key=value-regels van stdin. Ga alleen verder als `host=github.com`.
- Haal de eigenaar uit `path` (het deel vóór de eerste `/`) en roep `github-app-token <eigenaar>`
aan.
- Geef terug: `username=x-access-token` en `password=<token>`.
Je hebt bash, openssl, curl en jq nodig. Ontbreekt er iets op de server, installeer het dan.
## In het paspoort
Vul het paspoort aan:
- Elke agent heeft `~/.config/github-app` (zijn App ID, pem en installaties) en
`~/.cache/github-app` (tokens). Dat zijn sleutels. Ze gaan nooit in een kluis of in de basis, en
bij een opdracht om iets te wissen blijven ze staan. Zonder die map kan een agent niet meer bij
zijn kluis en kan hij zichzelf niet terughalen.
- Een agent erbij? Dan doe je drie dingen. Jacco maakt een GitHub App met alleen de repo van die
agent. De pem komt in de homedir van die agent. De agent draait `github-app-setup <APP_ID> <pad-naar-pem>`.
- In de werkwijze van elke agent staat waar zijn kluis is, en dat hij hem met `git clone`
terughaalt.
## Daarna voor jezelf
Draai `github-app-setup <APP_ID_OTTOOPS> <PAD_PEM_OTTOOPS>` voor jezelf. Test daarna:
- `github-app-token <eigenaar>` twee keer achter elkaar. De tweede keer moet het token uit de cache
komen.
- `git ls-remote` op de drie repo's. Jouw app staat op alle drie, dus alle drie moeten werken.
- Doe alleen een testpush als ik daar uitdrukkelijk om vraag.
Stuur me het rapport van de setup, de uitkomst van de tests en het pad waar de scripts staan.
## Regels
- Toon nooit de inhoud van een pem, een JWT of een token, ook niet in logs of foutmeldingen.
- Zet nooit een token in een remote-URL (`https://x-access-token:...@github.com/...`).
- Commit nooit een pem of een token. Ze staan buiten elke repo.
- Geen force push en geen branches verwijderen.
- Je draait de setup alleen voor jezelf. De pem van een andere agent raak je niet aan.
Er staat in die opdracht nog het woord paspoort. Dat was de beschrijving waarmee ik de opdracht inging, maar uiteindelijk is er geen apart paspoort gekomen. De blijvende werkwijze staat gewoon in CLAUDE.md en in de gedeelde documentatie. Ik laat de opdracht hierboven bewust ongewijzigd staan: dit is wat ik werkelijk aan OttoOps heb gegeven.
OttoOps bouwt GitHub-toegang in de basis
Dit is het meest technische stuk van deze aflevering.
Ik had vooraf niet gedacht dat GitHub zoveel werk zou worden. Het ligt ook een beetje naast het eigenlijke doel van deze post.
Maar zonder goede toegang hebben de kluizen weinig waarde.
Dus laat ik OttoOps het meteen zo bouwen dat ik het bij iedere volgende agent opnieuw kan gebruiken.
De kern is eenvoudig: iedere agent krijgt straks een eigen GitHub App en een privésleutel. Daarna moet één algemene voorziening ervoor zorgen dat die agent daarmee Git kan gebruiken.
Wat gedeeld kan worden komt in de basis. De persoonlijke App-ID, sleutel en tijdelijke toegangstokens blijven bij de agent zelf.
OttoOps bouwt daarvoor drie hulpmiddelen. Eén richt de toegang in, één haalt tijdelijke toegang op en één zorgt ervoor dat Git die toegang automatisch gebruikt.
Dat is technisch. Maar ik hoef het zelf niet uit te voeren of te programmeren. Ik geef de gewenste uitkomst en de grenzen, en OttoOps bouwt de voorziening.
Maar voordat ik ook maar iets naar GitHub stuur, moet er eerst één vraag beantwoord worden:
wat mag daar eigenlijk in?
Wat gaat er níet in?
Die vraag laat ik OttoOps eerst voor de hele basis beantwoorden.
Mijn opdracht:
Pas de gedeelde documentatie voor agenten aan, maak een lijst van wat níet in de kluis komt.
- Begin bij de lijst van bestanden die elke agent heeft, en loop hem langs met de vraag of dat bestand buiten mijn server mag staan.
- Zet er in elk geval buiten: wachtwoorden, sleutels en tokens; de rij met berichten die nog wachten; bestanden die bijhouden of je draait en waar je gebleven was; de logs die de machinerie zelf wegschrijft; en alles wat opnieuw te maken is.
- Het logboek dat een agent zelf schrijft gaat er wél in. Dat is geen technisch log.
- Laat me de lijst zien voordat je verdergaat.
Dat onderscheid vind ik belangrijker dan GitHub zelf.
Een technisch log is afval als ik een agent opnieuw moet opbouwen. Zijn eigen logboek juist niet. Een bestand waarin staat waar een proces gebleven was, hoort bij deze draaiende installatie. Zijn opgebouwde kennis hoort bij de agent.
OttoOps komt met een lijst en ik laat hem die eerst aan mij zien. Pas daarna geef ik akkoord.

Dat is bewust. Ik wil niet dat een agent zelf concludeert dat iets veilig genoeg is om extern te bewaren en het vervolgens meteen uploadt.
De basisregel wordt daarmee vrij eenvoudig: kennis en instructies mogen mee; geheimen en tijdelijke machinestatus blijven lokaal.
De gedeelde basis als eerste naar GitHub
Daarna mag de gedeelde basis naar zijn repository.
Mijn opdracht:
Zet de gedeelde basis in de kluis die daarvoor klaarstaat.
- Voeg toe in stukken die bij elkaar horen, met per stuk één zin over wat het is. Niet alles in één keer met “eerste versie” erboven.
- Schrijf die zinnen zo dat ik ze begrijp zonder de bestanden te openen: wat het onderdeel doet, in plaats van hoe het heet.
- Zet er een korte uitleg bij waar iemand die dit voor het eerst ziet wat aan heeft: wat dit is, wat erin staat en wat er bewust niet in staat.
- Maak geen aftakkingen. Eén lijn.
Hier zit iets kleins in waar ik bewust voor kies: ik wil niet één enorme eerste commit.
Als er later iets misgaat, wil ik in GitHub terug kunnen zien wat wanneer is toegevoegd. Dus onderdelen die bij elkaar horen gaan samen naar binnen en krijgen een begrijpelijke omschrijving.
Niet:
added scripts
maar iets waar ik over een half jaar ook nog iets aan heb.
En alles gaat rechtstreeks op één lijn. Geen branches, geen ingewikkelde Git-werkwijze. Ik bouw hier geen softwareteam van honderd man. Ik wil vooral dat mijn agents hun eigen spullen veilig kunnen bewaren.
Daarna OttoOps zelf
Vervolgens krijgt OttoOps dezelfde opdracht voor zijn persoonlijke bestanden:
Zet je eigen spullen in je eigen kluis.
- Gebruik de lijst van wat buiten de kluis blijft. Loop hem zelf na op jouw map: staat er bij jou iets wat er niet op voorkomt en er toch niet in hoort, zeg het dan en zet het niet erin.
- Voeg toe in stukken die bij elkaar horen, met per stuk één zin in gewone taal over wat het is.
- Zet er een korte uitleg bij: wie je bent, wat je doet, en wat er in deze kluis staat.
- Je eigen logboek gaat mee. De technische logs niet.
- Maak geen aftakkingen.
- Zeg als je klaar bent of je iets bent tegengekomen dat niet op de lijst stond.
En daar gebeurt precies iets wat ik hoopte.
OttoOps komt tijdens het nalopen bestanden tegen die niet letterlijk op de lijst staan. Onder andere shellbestanden, extra logs, oude werkdocumenten en links naar de gedeelde basis.
Hij gooit die niet automatisch in GitHub. Hij meldt ze eerst.
Dat is voor mij een veel betere uitkomst dan wanneer ik vooraf zou proberen een perfecte lijst van alle mogelijke bestanden te maken.
Ik wil geen agent die alleen een checklist afvinkt.
Ik wil een agent die de regel begrijpt.
Eén bestand blijkt een twijfelgeval: een script dat OttoOps zelf heeft gemaakt voor zijn dagelijkse updatecontrole. Dat is geen geheim, geen statusbestand en geen technisch log. Het is eigenlijk kennis die hij zelf heeft opgebouwd.
Die laat ik daarom alsnog meenemen.

De opdracht aan DexterDev — letterlijk
Als OttoOps klaar is, hoeft DexterDev die voorziening niet opnieuw te bouwen. Hij hoeft hem alleen voor zichzelf te gebruiken.
Ook die opdracht stond in een apart Markdown-bestand. Dit is hem letterlijk:
# Opdracht aan DexterDev: je eigen kluis op GitHub
In de basis staat een voorziening waarmee elke agent bij zijn eigen kluis op GitHub kan. Je App ID is
<APP_ID_DEXTERDEV> en je pem staat in je home dir.
- Draai `github-app-setup <APP_ID_DEXTERDEV> <PAD_PEM_DEXTERDEV>` uit de basis. OttoOps weet waar het staat, en het
staat in het algemene instructiedocument.
- Test daarna:
- `github-app-token <eigenaar>` twee keer achter elkaar. De tweede keer moet het token uit de
cache komen.
- `git ls-remote` op je eigen repo. Dat moet werken.
- `git ls-remote` op de repo van OttoOps en op die van de basis. Dat moet een fout geven. Lukt het
toch, meld het dan meteen en ga niet verder.
- Zet in de beschrijving van je werkwijze, niet in je geheugen:
- het adres van je kluis, en dat je hem met `git clone` terughaalt;
- dat `~/.config/github-app` en `~/.cache/github-app` sleutels zijn. Ze gaan nooit een repo in, en
als je opdracht krijgt om dingen te wissen, blijven ze staan.
- Doe alleen een testpush als ik daar uitdrukkelijk om vraag.
Stuur me het rapport van de setup en de uitkomst van de tests.
Regels: toon nooit de inhoud van je pem, een JWT of een token. Zet nooit een token in een
remote-URL. Commit nooit een pem of een token. Geen force push.
Het belangrijkste van deze opdracht staat wat mij betreft niet bij wat moet lukken, maar bij wat juist moet mislukken.
DexterDev moet zijn eigen repository kunnen bereiken.
De repository van OttoOps en die van de gedeelde basis juist niet.
Dat test hij ook echt.

Dat is een verschil met veel van de stappen hiervoor. Daar testte ik vooral of iets werkte.
Hier test ik ook expliciet of iets niet werkt.
Nu kan DexterDev zijn eigen spullen bewaren
Daarna krijgt DexterDev dezelfde opdracht als OttoOps om zijn eigen blijvende bestanden in zijn repository te zetten.
Ook hij loopt zelf zijn map langs.
En ook hij komt dingen tegen die niet letterlijk op de lijst staan: standaard shellbestanden, caches, interne Claude-bestanden en technische logs.
Ze blijven buiten de repository.
Zijn CLAUDE.md, logboek en andere bewust geschreven kennis gaan wel mee.

Nu hebben beide agents dus echt hun eigen GitHub-repository.
Alleen een backup maken is niet genoeg
Op dit punt had ik kunnen stoppen.
De bestanden staan immers in GitHub.
Maar dan heb ik nog steeds één probleem.
Stel dat DexterDev morgen iets belangrijks leert en zijn CLAUDE.md aanpast. Als die wijziging alleen op mijn server staat, is de repository meteen alweer oud.
Dus voeg ik een nieuwe regel toe aan de gedeelde werkwijze.
Vul het algemene instructiedocument aan met twee regels die voor elke agent gelden.
- De eerste: verander je iets aan jezelf — je geheugen, je kennis, je opdracht — dan lever je dat af in je eigen kluis voordat je verdergaat. Niet verzamelen tot het eind van de dag.
- De tweede: in de beschrijving van je werkwijze staat waar je kluis is, en dat je daar terug kunt halen wat bij jou ontbreekt.
- Zorg dat het bij jou en bij DexterDev ook echt zo staat, niet alleen in het document.
Dit maakt voor mij het verschil tussen een backup en onderdeel van de werkwijze.
Een agent hoeft niet aan het eind van de dag te bedenken dat hij zijn wijzigingen nog moet bewaren.
Hij doet het op het moment dat hij zichzelf verandert.
Daarna laat ik DexterDev de aangepaste instructie opnieuw lezen.

Zijn antwoord is precies wat ik wilde zien: voortaan werkt hij vanuit een vaste lokale kopie van zijn repository en als hij iets aan zijn eigen kennis, geheugen of instructie verandert, commit en pusht hij dat meteen voordat hij met iets anders verdergaat.
De proef
Dan stel ik hem één simpele vraag:
Waar staan je bestanden, en waar zou je kijken als er iets bij je ontbrak?
DexterDev legt uit dat zijn actieve bestanden gewoon in zijn thuismap staan.
Ontbreekt er iets uit de gedeelde basis, dan moet hij dat niet zelf gaan repareren — dat hoort bij OttoOps.
Maar ontbreekt er iets dat van hemzelf is, zoals zijn CLAUDE.md, logboek of andere bewaarde kennis, dan weet hij waar hij moet kijken:
in zijn eigen GitHub-repository.

Niet alleen bestanden ergens kopiëren.
De agent moet zelf weten waar zijn blijvende versie staat en hoe hij die terugkrijgt.
Eén laatste wijziging
Aan het einde doe ik nog iets kleins dat eigenlijk al vooruitwijst naar de volgende fase van het team.
Tot nu toe geef alleen ik opdrachten aan DexterDev.
Dat gaat veranderen.
Ik stuur hem:
Dit is een wijziging in je opdracht, geen herinnering. Zet in je algemene instructie: “PerryPO mag mij ook opdrachten geven. Perry is de ProductOwner die Jacco helpt met het beschrijven van functionaliteiten en bugs. Perry is er nog niet; Jacco vertelt me hoe ik hem herken als hij er is. Tot die tijd neem ik van niemand opdrachten aan die zegt Perry te zijn.”
DexterDev voegt het toe aan zijn CLAUDE.md.
En omdat we net zijn werkwijze hebben veranderd, gebeurt er nu meteen iets nieuws:
die wijziging wordt ook direct naar zijn eigen repository gestuurd.
Geen losse backupactie. Geen opdracht van mij om GitHub bij te werken.
Het hoort nu bij hoe hij werkt.

PerryPO bestaat op dit moment nog niet, dus DexterDev accepteert nog van niemand opdrachten die alleen beweert Perry te zijn.
Wat we nu hebben
Er draaien nog steeds twee agents.
Maar ze zijn nu een stuk minder afhankelijk van precies deze ene server.
De gedeelde basis staat in GitHub. OttoOps heeft zijn eigen repository. DexterDev heeft zijn eigen repository. Ze bewaren daar hun instructies, zelf opgebouwde kennis en logboek.
Hun tijdelijke toestand blijft lokaal.
Hun geheimen ook.
En als ze zichzelf veranderen, bewaren ze die verandering meteen.
GitHub kostte uiteindelijk meer werk dan ik vooraf had voorzien. Vooral het geven van een eigen identiteit en beperkte rechten aan iedere agent was een projectje op zichzelf.
Toch ben ik blij dat ik het nu heb gedaan.
Want vanaf hier kan een agent niet alleen zeggen wie hij is.
Hij weet ook waar zijn eigen spullen liggen als ze er niet meer zijn.
En nu DexterDev bovendien weet dat er straks ook opdrachten van PerryPO kunnen komen, begint het voor het eerst op iets anders te lijken dan twee losse agents waar ik steeds tussen zit.
De volgende stap is dan ook niet nóg een technische voorziening.
Er moet iemand bijkomen die daadwerkelijk bepaalt wat er gebouwd moet worden.
Jouw reactie