TDS-PORTFOLIO-001: Overlay & referentie-generator
Datum: 2026-05-19 Status: Concept
Doel
Een lokaal script dat zusterrepos uitleest en de gegenereerde delen van Documentatie-pagina's invult: portfolio-map alinea's, portfolio-visie overlays, en API-referentie-secties. Met een schone draai verdwijnt het risico dat handgeschreven mirrors verouderen ([[PORTFOLIO-001-overlay-geen-mirror]]).
Referentie
- PRD: (nog geen — dit is door de visie geïnitieerd, niet door een product-PRD)
- ADRs: [[PORTFOLIO-001-overlay-geen-mirror]]
Referentiepatroon
~/Projects/
├── Ruimtemeesters-Documentatie/ ← deze repo
│ ├── tools/overlay-generator/ ← woont hier
│ ├── docs/60-portfolio-atlas/portfolio-map.md
│ ├── docs/00-visie/portfolio-visie.md
│ └── docs/70-api-referentie/<app>-<surface>-referentie.md
├── Ruimtemeesters-Databank/
│ ├── README.md ← bron
│ ├── docs/00-vision/*.md ← bron
│ ├── openapi.yaml ← bron (optioneel)
│ └── mcp-tools.json ← bron (optioneel)
├── Ruimtemeesters-Geoportaal/
│ └── …
└── (verder alle Ruimtemeesters-* repos)
De generator draait vanuit Ruimtemeesters-Documentatie/ en leest zusterrepos via relatieve paden (../Ruimtemeesters-*). Geen HTTP, geen autorisatie nodig — alles is lokaal.
Vereiste technische eigenschappen
Interfaces
-
CLI:
pnpm generate(ofpython -m overlay_generator) — geen argumenten voor de happy path; draait alle generatoren. Vlaggen:--only portfolio-map,--check(faalt als output wijzigt),--dry-run. -
Input contract: per app een conventiegebaseerde set bestanden in een vaste plek (zie hierboven). Als een bestand niet bestaat, wordt die app gewoon overgeslagen voor die surface — niet faliekant falen.
-
Output contract: gegenereerde secties zitten tussen HTML-comment-markers in bestaande markdown-bestanden. De generator vervangt alleen wat tussen de markers staat:
<!-- BEGIN GENERATED:portfolio-map -->...<!-- END GENERATED:portfolio-map -->Alles erbuiten is handgeschreven en blijft intact.
Data
- Geen persistente opslag. De generator is staatloos: input is de huidige filesystem-staat, output is markdown.
- Geen API-aanroepen. Geen Github, geen externe registries. Dit houdt de generator offline en deterministisch.
- Caching: niet nodig in de eerste versie. Een doorloop over 25 repos is goedkoop genoeg.
Randvoorwaarden
- Idempotent: tweemaal draaien levert dezelfde diff. Geen tijdstempels, geen UUIDs, geen volgorde-afhankelijkheid in output.
- Deterministisch: zelfde input → byte-voor-byte zelfde output. Anders is CI-controle (
--check) nutteloos. - Veilig faalbaar: een ontbrekend bron-bestand levert een log-regel en een placeholder-marker, niet een crash. Een corrupte bron levert een crash mét referentie naar het bestand.
- Onafhankelijk van app-implementaties: de generator leest alleen markdown / OpenAPI / JSON. Hij hoeft niets te installeren of te draaien uit de zusterrepos.
Surface per surface
| Surface | Bron-detectie | Outputlocatie | Gegenereerde inhoud |
|---|---|---|---|
portfolio-map | Eerste alinea onder # <App> in elke ../Ruimtemeesters-*/README.md | docs/60-portfolio-atlas/portfolio-map.md | Eén bullet of tabelregel per app |
portfolio-visie | Eerste alinea van ../Ruimtemeesters-*/docs/{00-vision,00-visie}/*-vision.md | docs/00-visie/portfolio-visie.md | Eén alinea per app met link |
api-referentie:http | Aanwezigheid van openapi.yaml / openapi.json | docs/70-api-referentie/<app>-http-referentie.md | Endpoint-lijst, parametervormen, response-schema's |
api-referentie:mcp | Aanwezigheid van mcp-tools.json of packages/*/mcp-tools.json | docs/70-api-referentie/<app>-mcp-referentie.md | Tool-naam, parameters, beschrijving |
Nieuwe surfaces worden in een latere TDS toegevoegd, niet hier.
Categorisatie blijft handwerk
De groepering in portfolio-map.md (Front doors / Beleidsbronnen / …) is geen output van de generator. Die categorisatie is een eigen-inhoud-redactionele keuze; alleen de beschrijvingen per app worden gegenereerd. De handmatige categorie-koppen en hun volgorde blijven buiten de BEGIN/END GENERATED-markers.
Buiten scope
- Doorlinken naar PRDs / ADRs / TDSs van zusterrepos op een diepere manier dan "hier is de repo, ga zelf kijken". Een echte cross-repo doc-graaf is een latere fase.
- Schrijven naar zusterrepos. De generator is read-only buiten Documentatie.
- Een eigen front-end. CLI volstaat.
- Auto-commits of automatische PRs. De ontwikkelaar draait
pnpm generateen commit zelf.
Openstaande vragen
- Implementatietaal: Node.js (consistent met de meeste apps) of Python (consistent met scrapers en datapipelines)? Geen sterke voorkeur — kiezen bij de implementatie. Pas geen GitHub Actions-template aan voordat dit besloten is.
- CI-integratie: moet
pnpm generate --checkin CI faalbaar zijn om PRs te blokkeren met verouderde output, of is dat te veel friction in fase 1? - OpenAPI-conventies: niet alle apps hebben een
openapi.yaml. Moet de generator ook FastAPI / Express introspecteren? Eerste versie: alleen bestandsgebaseerd; introspectie pas als de behoefte er aantoonbaar is.
Bijbehorend plan
Te schrijven in 50-implementatieplannen/overlay-generator-plan.md zodra deze TDS goedgekeurd wordt.