docs(intake): de eisen aan de inzendserver (fase 4) #2258

Merged
brenno merged 1 commit from docs/intake-server-requirements into main 2026-10-03 22:25:30 +00:00
Owner

Wat

Op verzoek van de eigenaar: een beschrijving van de eisen waaraan de inzendserver moet voldoen, als docs/design/INTAKE_SERVER_REQUIREMENTS.md (CC-BY-4.0, zoals het protocol). Het schrijft §6.5 van het ontwerp — nu een handvol regels — uit tot genummerde, toetsbare eisen (MUST/SHOULD/MAY, met een id per eis zodat een conformiteitstest, een reviewbevinding of een checklist ernaar kan verwijzen), voor de beheerder (D3), wie een server draait, een reviewer en wie een andere implementatie schrijft. Het herhaalt het protocol niet; het zegt wat de server eromheen waar moet maken.

  • De lijnen die de server niet overschrijdt (PRI): nooit de inhoud lezen of verwerken, geen accounts of sessies, geen code voor de invuller serveren, geen standaardadres en geen server van de stichting voor anderen, niets naar derden.
  • Conformiteit met het protocol (PRO): de volgorde van de controles, idempotent en nooit overschrijven (ook over een herstart), de hash in het aankomstbericht is die van wat is opgeslagen, een intrekking geeft geen orakel, een stabiele lijst onder gelijktijdig schrijven.
  • Authenticatie en autorisatie (AUT): de ondertekende verzoeken in vaste volgorde en pas daarna de nonce, de geconfigureerde publieke host (niet de Host-kop), een geordende klok, één instantie of een gedeelde noncecache, de allowlist van de operator voor een nieuw fid, een vertrokken organisator verliest toegang op het moment van de nieuwe bundel, tokens alleen als hash en constant-time vergeleken.
  • Publiceren (PUB): de server toetst elke bundel zelf, één publicatie draagt één bundle_seq, vervanging is atomair.
  • Opslag en bewaartermijnen (STO): een halve upload is nooit zichtbaar, fsync en hernoemen, byte voor byte, opruimen als iedereen bevestigd heeft of 90 dagen na sluiting, 24 maanden grafsteentje, minimale metadata, integriteitscontrole bij het starten.
  • Weerstand tegen misbruik (LIM): een harde grens tijdens het streamen, limieten per token per tijdvenster (geen absolute limiet: dat is het DoS-middel), tijdslimieten per fase, een grens op gelijktijdige uploads, en verzamelen blijft mogelijk als de schijf vol is.
  • Privacy en logboeken (LOG): nooit een body, token, geheim of Authorization in een log, geen volledig IP-adres, de reverse proxy hoort bij het bedreigingsoppervlak, geen label per formulier of token in metrics, geen cookies.
  • Inzet en beheer (SEC, OPS): alleen TLS, de kopen die een browser nodig heeft om niets te renderen, CORS als lijst (de organisatorpaden geen CORS), onbevoorrecht draaien, --check-config meldt alles tegelijk, geen geheim met een standaardwaarde, een geteste back-up, en het stilleggen vóór de server voor iemand draait.
  • De beheerder (ORG): een genoemde beheerder, een ondersteuningsbelofte in woorden, een einddatum of verlengdatum, geen gehoste dienst door de stichting, een geschreven incidentenaanpak (misbruik wordt verwijderd zonder te lezen).
  • Toeleveringsketen en licentie (SUP) en hoe conformiteit wordt aangetoond (TST): de gedeelde vectoren, een black-box-conformiteitstest die tegen elke server draait, een websmoketest tegen een echte server, een privacytest die na een volledige run de logboeken afzoekt, een hardeningchecklist, een belastings- en misbruiktest, mutatietoets van de beslislogica.
  • Wat bewust niet wordt geëist (inhoud modereren, virusscan, miniaturen, een beheerscherm, e-mail), en zeven open punten.

Gevonden bij het schrijven

Eén echte lacune in het protocol: het ontwerp belooft dat de organisator 14 dagen vóór het opruimen wordt gewaarschuwd en bij 80 % van een grens, maar de lijst in protocol v1 draagt daar niets voor. De eisen noemen het als open punt met een voorstel (een additief purge_at per regel en een warnings-lijst in de lijst; clients negeren wat ze niet kennen, dus het mag binnen versie 1). Verder: rate- en grensdefaults zijn gissingen tot een eerste echt gebruik (de Kookboek-oproep); de noncecache dwingt een enkele instantie af tenzij een gedeelde opslag; en of 24 maanden voor het grafsteentje de goede lengte is moet een jurist zeggen.

Getoetst

Alleen documentatie. De verwijzingen zijn nagelopen met een script: alle 94 ids zijn gedefinieerd en elke verwijzing naar een id wijst naar een bestaande (het script vond er twee die niet bestonden — een voorbeeld-id en een verwijzing naar SEC-31 in plaats van SUP-01 — en die zijn hersteld); het bestand is geregistreerd in docs/README.md en verwezen vanuit FORM_INTAKE §6.1/§6.5 en INTAKE_PROTOCOL. make check (ongepiped, exit 0) liep vóór die laatste correctie van twee id's in de tekst; daarna draaiden check-static, check-registrations, check-secrets, sast en check-packages opnieuw: groen. De tak loopt niet achter op main.

## Wat Op verzoek van de eigenaar: **een beschrijving van de eisen waaraan de inzendserver moet voldoen**, als `docs/design/INTAKE_SERVER_REQUIREMENTS.md` (CC-BY-4.0, zoals het protocol). Het schrijft §6.5 van het ontwerp — nu een handvol regels — uit tot **genummerde, toetsbare eisen** (MUST/SHOULD/MAY, met een id per eis zodat een conformiteitstest, een reviewbevinding of een checklist ernaar kan verwijzen), voor de beheerder (D3), wie een server draait, een reviewer en wie een andere implementatie schrijft. Het herhaalt het protocol niet; het zegt wat de server **eromheen** waar moet maken. - **De lijnen die de server niet overschrijdt** (PRI): nooit de inhoud lezen of verwerken, geen accounts of sessies, geen code voor de invuller serveren, geen standaardadres en geen server van de stichting voor anderen, niets naar derden. - **Conformiteit met het protocol** (PRO): de volgorde van de controles, idempotent en nooit overschrijven (ook over een herstart), de hash in het aankomstbericht is die van wat is opgeslagen, een intrekking geeft geen orakel, een stabiele lijst onder gelijktijdig schrijven. - **Authenticatie en autorisatie** (AUT): de ondertekende verzoeken in vaste volgorde en pas daarna de nonce, de **geconfigureerde publieke host** (niet de `Host`-kop), een geordende klok, één instantie of een gedeelde noncecache, de **allowlist van de operator** voor een nieuw `fid`, een vertrokken organisator verliest toegang op het moment van de nieuwe bundel, tokens alleen als hash en constant-time vergeleken. - **Publiceren** (PUB): de server toetst elke bundel zelf, één publicatie draagt één `bundle_seq`, vervanging is atomair. - **Opslag en bewaartermijnen** (STO): een halve upload is nooit zichtbaar, `fsync` en hernoemen, byte voor byte, opruimen als iedereen bevestigd heeft of **90 dagen na sluiting**, 24 maanden grafsteentje, minimale metadata, integriteitscontrole bij het starten. - **Weerstand tegen misbruik** (LIM): een harde grens **tijdens het streamen**, limieten **per token per tijdvenster** (geen absolute limiet: dat is het DoS-middel), tijdslimieten per fase, een grens op gelijktijdige uploads, en **verzamelen blijft mogelijk als de schijf vol is**. - **Privacy en logboeken** (LOG): nooit een body, token, geheim of `Authorization` in een log, geen volledig IP-adres, de reverse proxy hoort bij het bedreigingsoppervlak, **geen label per formulier of token in metrics**, geen cookies. - **Inzet en beheer** (SEC, OPS): alleen TLS, de kopen die een browser nodig heeft om niets te renderen, CORS als lijst (de organisatorpaden **geen** CORS), onbevoorrecht draaien, `--check-config` meldt alles tegelijk, geen geheim met een standaardwaarde, een geteste back-up, en het stilleggen vóór de server voor iemand draait. - **De beheerder** (ORG): een **genoemde beheerder**, een ondersteuningsbelofte in woorden, een **einddatum of verlengdatum**, geen gehoste dienst door de stichting, een geschreven incidentenaanpak (misbruik wordt *verwijderd zonder te lezen*). - **Toeleveringsketen en licentie** (SUP) en **hoe conformiteit wordt aangetoond** (TST): de gedeelde vectoren, een **black-box-conformiteitstest** die tegen elke server draait, een websmoketest tegen een echte server, een **privacytest die na een volledige run de logboeken afzoekt**, een hardeningchecklist, een belastings- en misbruiktest, mutatietoets van de beslislogica. - **Wat bewust niet wordt geëist** (inhoud modereren, virusscan, miniaturen, een beheerscherm, e-mail), en **zeven open punten**. ## Gevonden bij het schrijven Eén echte lacune in het protocol: het ontwerp belooft dat de organisator **14 dagen vóór het opruimen** wordt gewaarschuwd en bij **80 %** van een grens, maar de lijst in protocol v1 draagt daar niets voor. De eisen noemen het als open punt met een voorstel (een additief `purge_at` per regel en een `warnings`-lijst in de lijst; clients negeren wat ze niet kennen, dus het mag binnen versie 1). Verder: rate- en grensdefaults zijn gissingen tot een eerste echt gebruik (de Kookboek-oproep); de noncecache dwingt een enkele instantie af tenzij een gedeelde opslag; en of 24 maanden voor het grafsteentje de goede lengte is moet een jurist zeggen. ## Getoetst Alleen documentatie. De verwijzingen zijn nagelopen met een script: alle 94 ids zijn gedefinieerd en elke verwijzing naar een id wijst naar een bestaande (het script vond er twee die niet bestonden — een voorbeeld-id en een verwijzing naar `SEC-31` in plaats van `SUP-01` — en die zijn hersteld); het bestand is geregistreerd in `docs/README.md` en verwezen vanuit FORM_INTAKE §6.1/§6.5 en INTAKE_PROTOCOL. `make check` (ongepiped, exit 0) liep vóór die laatste correctie van twee id's in de tekst; daarna draaiden `check-static`, `check-registrations`, `check-secrets`, `sast` en `check-packages` opnieuw: groen. De tak loopt niet achter op main.
brenno merged commit b9f64bd7a9 into main 2026-10-03 22:25:30 +00:00
brenno deleted branch docs/intake-server-requirements 2026-10-03 22:25:30 +00:00
Sign in to join this conversation.
No description provided.