docs: link de webdemo, en geef toe dat de uitgever hem draait (#589) #722

Merged
brenno merged 3 commits from feat/webdemo-readme-link-589 into main 2026-07-23 10:50:13 +00:00
Owner

Sluit de README-helft van #589. #589 blijft open voor de deploy zelf.

Wat erin zit

  1. De demolink in de README — één blok onder de openingsalinea, met erbij wat
    de webbouw niet kan. De alinea "Runs on your device, not on a server" tien
    regels lager geeft nu toe dat de demo de ene plek is waar dat apparaat een
    pagina van de uitgever is. USER_GUIDE.md noemt hem bij What the browser
    version cannot do
    .
  2. De correctie die eronder bleek te zitten. COMPLIANCE.md zei "does not
    host OciDeck itself as a service"
    en "It does run one service";
    PRIVACY.md had een sectie The one server the publisher runs. Een gratis
    publieke kopie op een eigen oorsprong ís hosten — de link zou dus precies de
    zin onwaar hebben gemaakt die een kritische lezer als eerste natrekt.
    Dezelfde fout als #579, één correctie verderop.
  3. Twee poorten, want dit soort schuld ontstaat stilletjes.

Wat er in de documenten staat, en waarom alleen dát

Alleen wat aan te tonen valt: de oorsprong ziet wat elke statische webserver
ziet (IP, tijdstip, opgevraagde bestanden), en de fetch-proxy draait daar mee —
getoetst met een verzoek zonder Origin, dat de 403 met "dit adres is alleen
voor de OciDeck-app zelf"
uit ocideck_fetch_proxy.py teruggaf. Een URL die je
op de demo importeert wordt dus door de server van de stichting opgehaald, en
"de uitgever raakt je deck nooit aan" houdt daar op.

Over retentie op díé host heeft de beheerder niets verklaard, waar hij dat over
de CVE-mirror op 2026-07-23 wel deed. Dat staat er zo — een gat benoemen is
eerlijker dan het vullen.

De poorten

  • Koppeling README ↔ verantwoording (docs_claims_match_code_test.dart):
    prijst de README een host op librekat.nl aan, dan moeten COMPLIANCE.md en
    PRIVACY.md die host noemen. De meting zelf toetst op een vaste zin en niet
    op de README, zodat het weghalen van de demolink de eis laat vervallen in
    plaats van de poort omgooit.
  • Ankers (docs_anchor_links_test.dart, nieuw): élke link naar een kop in
    élk Markdown-bestand van deze repo moet bij een bestaande kop uitkomen — 64
    bestanden; andermans documentatie blijft erbuiten. Vond meteen twee dode
    verwijzingen in de inhoudsopgave van de USER_GUIDE, allebei op een
    gedachtestreepje dat in een ankernaam een extra streepje meetelt.

Allebei één keer rood zien worden tegen de onherstelde tekst.

De weging (bewaker)

De botsing is gemak tegen soevereiniteit: de demo zet de uitgever in het
kritieke pad van wie hem gebruikt. Gemak wint voor de kennismaking,
soevereiniteit voor het echte werk — en dat staat er ook zo: "a convenience for
looking, not the intended way to work on a real deck"
, met de uitweg (zelf
bouwen of zelf hosten) erbij. Ik verander van gedachten zodra de demo iets zou
kunnen wat een eigen bouw niet kan; dan is het geen kennismaking meer maar een
slot.

Tweede botsing, en die is scherper: veiligheid staat op 1, en de uitgeleverde
demo is achterstallig.
De link landt hier tóch, op expliciet besluit van de
beheerder, omdat de demo werkt en terugdraaien één alinea is. Wat er open blijft
staat hieronder — dat is geen voetnoot.

Wat er níet in zit

De herbouw en herdeploy van de demo. Gemeten op 2026-07-23:

  1. de bundel is van 15 juli (Last-Modified: Wed, 15 Jul 2026 14:44:38 GMT)
    en mist dus form-action 'none', de referrer-meta én het laadscherm uit
    #704 — de tien witte seconden staan er nog;
  2. de statische host levert geen van de vier headers die HOSTING.md §4b
    als voorwaarde stelt (X-Frame-Options, CSP als echte header,
    X-Content-Type-Options, Referrer-Policy). frame-ancestors uit een
    meta-tag wordt niet gehandhaafd, dus de demo is framebaar;
  3. /LICENSE.md, /SOURCE.md, /THIRD_PARTY_NOTICES.md en /SHA256SUMS geven
    404 — EUPL-1.2 art. 5. Dat lost een herdeploy vanzelf op, want
    pack_web_release.dart zet ze in de bundel.

En make build-web draait op deze machine niet: .tool-versions pint 3.44.6,
de SDK is 3.44.7, en sbom-verify valt daarop om. Dat is #721.

Poorten

make check groen, make check-secrets groen (gitleaks + trufflehog, werkboom
en historie), make sast groen (semgrep, 0 bevindingen op 679 bestanden). DAST
niet gedraaid — ZAP staat hier niet ingericht, en dit is een tekstwijziging
zonder geserveerd oppervlak.

Sluit de README-helft van #589. **#589 blijft open** voor de deploy zelf. ### Wat erin zit 1. **De demolink in de README** — één blok onder de openingsalinea, met erbij wat de webbouw *niet* kan. De alinea "Runs on your device, not on a server" tien regels lager geeft nu toe dat de demo de ene plek is waar dat apparaat een pagina van de uitgever is. `USER_GUIDE.md` noemt hem bij *What the browser version cannot do*. 2. **De correctie die eronder bleek te zitten.** `COMPLIANCE.md` zei *"does not host OciDeck itself as a service"* en *"It does run **one** service"*; `PRIVACY.md` had een sectie *The one server the publisher runs*. Een gratis publieke kopie op een eigen oorsprong ís hosten — de link zou dus precies de zin onwaar hebben gemaakt die een kritische lezer als eerste natrekt. Dezelfde fout als #579, één correctie verderop. 3. **Twee poorten**, want dit soort schuld ontstaat stilletjes. ### Wat er in de documenten staat, en waarom alleen dát Alleen wat aan te tonen valt: de oorsprong ziet wat elke statische webserver ziet (IP, tijdstip, opgevraagde bestanden), en de fetch-proxy draait daar mee — getoetst met een verzoek zonder `Origin`, dat de 403 met *"dit adres is alleen voor de OciDeck-app zelf"* uit `ocideck_fetch_proxy.py` teruggaf. Een URL die je op de demo importeert wordt dus door de server van de stichting opgehaald, en "de uitgever raakt je deck nooit aan" houdt daar op. Over retentie op díé host heeft de beheerder niets verklaard, waar hij dat over de CVE-mirror op 2026-07-23 wel deed. Dat staat er zo — een gat benoemen is eerlijker dan het vullen. ### De poorten - **Koppeling README ↔ verantwoording** (`docs_claims_match_code_test.dart`): prijst de README een host op `librekat.nl` aan, dan moeten `COMPLIANCE.md` en `PRIVACY.md` die host noemen. De meting zelf toetst op een vaste zin en niet op de README, zodat het weghalen van de demolink de eis laat vervallen in plaats van de poort omgooit. - **Ankers** (`docs_anchor_links_test.dart`, nieuw): élke link naar een kop in élk Markdown-bestand van deze repo moet bij een bestaande kop uitkomen — 64 bestanden; andermans documentatie blijft erbuiten. Vond meteen twee dode verwijzingen in de inhoudsopgave van de `USER_GUIDE`, allebei op een gedachtestreepje dat in een ankernaam een extra streepje meetelt. Allebei één keer rood zien worden tegen de onherstelde tekst. ### De weging (bewaker) De botsing is **gemak tegen soevereiniteit**: de demo zet de uitgever in het kritieke pad van wie hem gebruikt. Gemak wint voor de kennismaking, soevereiniteit voor het echte werk — en dat staat er ook zo: *"a convenience for looking, not the intended way to work on a real deck"*, met de uitweg (zelf bouwen of zelf hosten) erbij. Ik verander van gedachten zodra de demo iets zou kunnen wat een eigen bouw niet kan; dan is het geen kennismaking meer maar een slot. Tweede botsing, en die is scherper: **veiligheid staat op 1, en de uitgeleverde demo is achterstallig.** De link landt hier tóch, op expliciet besluit van de beheerder, omdat de demo werkt en terugdraaien één alinea is. Wat er open blijft staat hieronder — dat is geen voetnoot. ### Wat er níet in zit De herbouw en herdeploy van de demo. Gemeten op 2026-07-23: 1. de bundel is van **15 juli** (`Last-Modified: Wed, 15 Jul 2026 14:44:38 GMT`) en mist dus `form-action 'none'`, de referrer-meta én het laadscherm uit #704 — de tien witte seconden staan er nog; 2. de statische host levert **geen** van de vier headers die `HOSTING.md` §4b als voorwaarde stelt (`X-Frame-Options`, CSP als echte header, `X-Content-Type-Options`, `Referrer-Policy`). `frame-ancestors` uit een meta-tag wordt niet gehandhaafd, dus de demo is framebaar; 3. `/LICENSE.md`, `/SOURCE.md`, `/THIRD_PARTY_NOTICES.md` en `/SHA256SUMS` geven **404** — EUPL-1.2 art. 5. Dat lost een herdeploy vanzelf op, want `pack_web_release.dart` zet ze in de bundel. En `make build-web` draait op deze machine niet: `.tool-versions` pint 3.44.6, de SDK is 3.44.7, en `sbom-verify` valt daarop om. Dat is #721. ### Poorten `make check` groen, `make check-secrets` groen (gitleaks + trufflehog, werkboom en historie), `make sast` groen (semgrep, 0 bevindingen op 679 bestanden). DAST niet gedraaid — ZAP staat hier niet ingericht, en dit is een tekstwijziging zonder geserveerd oppervlak.
`COMPLIANCE.md` zei "does not host OciDeck itself as a service" en "It does run
**one** service", en `docs/PRIVACY.md` had een sectie *The one server the
publisher runs*. Beide zinnen waren onwaar op het moment dat ze geschreven
werden: `ocideck.librekat.nl` draaide al, een gratis publieke kopie van de
webbouw op een oorsprong van de stichting. Een gratis kopie hosten ís hosten.

Dat is dezelfde fout als #579, één correctie verderop. Die ruimde de absolute
claim "no OciDeck server" op en liet "host niet als dienst" staan — en dat is
precies de zin die een kritische lezer als eerste natrekt zodra de README naar
de demo linkt.

Wat er nu staat, en alleen wat aan te tonen valt: de oorsprong ziet wat elke
statische webserver ziet (IP, tijdstip, opgevraagde bestanden), en de
fetch-proxy draait daar mee — getoetst met een verzoek zonder `Origin`, dat de
403 met "dit adres is alleen voor de OciDeck-app zelf" uit
`ocideck_fetch_proxy.py` teruggaf. Een URL die je op de demo importeert wordt
dus door de server van de stichting opgehaald, en "de uitgever raakt je deck
nooit aan" houdt daar op. Over retentie op díé host heeft de beheerder niets
verklaard, waar hij dat over de CVE-mirror op 2026-07-23 wel deed; dat staat er
zo, in plaats van dat het verzonnen wordt.

De poort erbij koppelt de README aan de twee documenten: prijst de README een
host op `librekat.nl` aan, dan moeten `COMPLIANCE.md` en `PRIVACY.md` die host
noemen. De meting zelf toetst op een vaste zin en niet op de README, zodat het
weghalen van de demolink de eis laat vervallen in plaats van de poort omgooit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
`docs_registration_test` bewaakt dát een document bereikbaar is en
`docs_claims_match_code_test` of wat er staat waar is. Daartussen zat een gat:
een link naar een kop die hernoemd is ziet er in de bron precies hetzelfde uit,
en op een forge klik je hem stil naar de bovenkant van de pagina. Niemand ziet
het, ook de schrijver niet.

Aanleiding is de demolink van #589, die twee verse ankers naar `PRIVACY.md` en
`KNOWN_LIMITATIONS.md` meebracht. Een poort die alleen die twee kende zou de
volgende hernoeming weer missen, dus loopt hij alle Markdown van deze repo
langs — 64 bestanden. Andermans documentatie blijft erbuiten (`third_party/`,
`node_modules/`, de `ephemeral/.plugin_symlinks/` van de bureaubladbouw): een
kapotte link daarin is niet van ons om te repareren.

Hij vond meteen twee dode verwijzingen in de inhoudsopgave van de `USER_GUIDE`,
allebei op hetzelfde: een gedachtestreepje verdwijnt uit een ankernaam maar de
spaties eromheen blijven, dus *Redaction — leaving data out* wordt
`redaction--leaving-data-out` met twee streepjes. Precies daarop liep ook de
eerste versie van de ankerberekening in deze test vast, die zes valse
meldingen gaf.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
`ocideck.librekat.nl` bestond al maanden en kwam nul keer in de README voor. De
goedkoopste route naar "ik heb OciDeck gezien" was daarmee Flutter installeren
en zelf bouwen, en dat doet vrijwel niemand in de anderhalve minuut die een
nieuw project krijgt — dus bleef de hele functielijst een onbewezen bewering
voor wie langskwam.

Er staat nu één blok onder de openingsalinea. Met erbij wat de webbouw *niet*
kan, want de demo is de kleinste helft van de twee en een bezoeker die daar
video of de lokale CVE-database zoekt concludeert "stuk" in plaats van "andere
bouw". De alinea "Runs on your device, not on a server" die tien regels lager
staat geeft nu toe dat de demo de ene plek is waar dat apparaat een pagina van
de uitgever is; zonder die zin lezen de twee blokken elkaar tegen.

`USER_GUIDE.md` noemt hem bij *What the browser version cannot do* — dat is waar
een lezer die alleen de gids openslaat de vraag stelt — en zegt erbij dat een
URL-import daar door de server van de uitgever wordt opgehaald, vóór de zin
waarin je een deck van een klant opent.

Wat er niet in zit: de herbouw en herdeploy van de demo zelf. De uitgeleverde
bundel is van 15 juli en mist `form-action 'none'`, de referrer-meta en het
laadscherm uit #704; de statische host levert geen van de vier headers die
`HOSTING.md` §4b als voorwaarde stelt; en `/LICENSE.md`, `/SOURCE.md`,
`/THIRD_PARTY_NOTICES.md` en `/SHA256SUMS` geven 404, wat een herdeploy vanzelf
oplost omdat `pack_web_release.dart` ze in de bundel zet. Dat is een hand op de
server, niet op deze repo — #589 blijft daarvoor open.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 9ab6c58a8c into main 2026-07-23 10:50:13 +00:00
Sign in to join this conversation.
No description provided.