Thema
Verantwoordelijkheden
Het kernprincipe van Seifer, uitgeschreven.
De grensregel
Elke stage leest de output van de vorige als read-only bron van waarheid en schrijft alleen in zijn eigen laag. Geen enkele stage grijpt terug in de laag van een ander.
Dat maakt de keten herhaalbaar en veilig genoeg voor een agent: voorstel → goedkeuring, geen volledige autonomie.
Per stage
Stage 1 · solution-explorer — "wat & waarom"
| Bezit | Het probleem, de markt, de personas, de MVP-scope, user-stories + acceptatiecriteria, de technische richting, de wireframe. Samengevat: de documentatie/ (productdefinitie). |
| Doet NIET | Code schrijven, tech-stack afdwingen als config, deploy-config maken. |
| Levert op | documentatie/ als bron van waarheid voor intentie. |
Stage 2 · scaffolder — "hoe het gebouwd is (skeleton)"
| Bezit | De code-spine (config → persistence → mailer → auth → http-kernel), de plumbing (.scaffolder/manifest.json), de versie-pinning, en sync. |
| Doet NIET | Businesslogica of entiteitsvelden verzinnen — dat vult een mens/agent in de seams modules.ts + domain-migrations.ts. En hoort geen productie-/ops-artefacten te bezitten — zie naad B; dat is vandaag een botsing. |
| Levert op | app/ + .scaffolder.json + manifest. |
Stage 3 · deployment — "waar & of het draait"
| Bezit | De connectie-artefacten (co-host docker-compose.yml, proxy/Caddyfile, deploy.env, registry-CI), platform.yaml, provisioning, secrets-store, status/health/TLS/in-sync, audit + rollback. |
| Doet NIET | App-code of productdefinitie schrijven — expliciet out-of-scope in onboard-solution. |
| Levert op | Een live, geverifieerd, declaratief geregistreerd product. |
Mens / operator — de gates
Ideeën en Go/No-Go-beslissingen. Het invullen van businesslogica (entiteitsvelden) in de seams. Secret-waarden (Hetzner-token, GHCR-token, Resend-key). Domein en DNS. Goedkeuring van kosten (host apply) en productie (up). Het git-repo en de provider-tokens.
De matrix (RACI-licht)
| Activiteit | explorer | scaffolder | deployment | mens |
|---|---|---|---|---|
| Probleem/markt/scope bepalen | A | – | – | C |
Productdefinitie (documentatie/) | A | – | – | C |
| Go/No-Go bouwen | – | – | – | A |
scaffolder.config.yaml afleiden | C | A | – | R |
| App-code / spine genereren | – | A | – | – |
| Businesslogica / velden invullen | C | R | – | A |
Connectie-artefacten + platform.yaml | – | C | A | – |
| Host provisionen (kosten) | – | – | R | A |
| Secrets / domein / DNS | – | – | R | A |
| Deploy uitvoeren (productie) | – | – | R | A |
| Verifiëren (health/TLS/sync) | – | – | A | C |
| Deploy-metadata contract | C | A | R | – |
A = accountable/eigenaar · R = doet het werk · C = geconsulteerd.
Waar de regel vandaag gebroken wordt
Twee plekken, allebei in naad B:
- De scaffolder emit deploy-CI (
app/.github/workflows/…) — dat is een ops-artefact in de code-laag. Bovendien op een plek die GitHub niet leest, metpush: false. - Compose-eigenaarschap. De scaffolder emit een dev-compose die
syncbezit; deployment wil een co-host-compose. Opgelost door ze fysiek te scheiden (root vsapp/), maar dat is impliciet in plaats van vastgelegd.
Beide staan in het doelcontract van naad B om recht te trekken.