Start โ€บ ๐Ÿ”ง Bouwboek

Je bent hier ยท Bouwboek ยท wat zit erin, en waar draait het

Wat is dit De inhoudsopgave van de machine: per onderdeel wat het is, wat het doet, waar het draait en wie het aanroept.

Voor wie Voor jezelf, vรณรณr een gesprek waarin iemand vraagt "en hoe werkt dat dan?" โ€” en voor een nieuwe bouwer die morgen instapt.

Wat doe je hier Lees blok 0 (waar staat wat), zoek daarna het onderdeel op waar de vraag over gaat. Wil je het getest zien: Testboek.

Wat is dit deel, simpel gezegd: R4M is niet รฉรฉn ding maar twee mappen op deze Mac. In de ene staat de machine die draait (de rail, de demo's, het kasboek), in de andere staat het verhaal erover (deze site). Dit boek loopt de machine onderdeel voor onderdeel af en zegt er telkens bij: dit is bewezen, dit is nog niet bewezen. Wat niet gecontroleerd kon worden staat er als ONBEVESTIGD bij โ€” nooit als feit.

Bouwboek ยท alleen achter Access

NIEUW 14-08-2026 13:30 Wat zit erin

Alle feiten hieronder zijn op 14-08-2026 nagekeken tegen de repo Rails4Mankind en tegen de live endpoints. Waar de werkorder en de werkelijkheid uiteenliepen, staat de werkelijkheid.

BLOK 0 ยท LOCATIEKAART

Waar staat wat โ€” map, deploy, live, GitHub, back-up

Simpel gezegd: er zijn twee mappen die ertoe doen en รฉรฉn die je met rust laat. Verwar je ze, dan bouw je aan iets wat niemand ziet. Alle paden hieronder zijn op 14-08-2026 met ls en git remote gecontroleerd, niet overgetypt.

BouwdeelMap op de MacDeployLiveGitHub
Engine + demo
vitrine, pas.html, quickstart, verifieer-API, kasboek
/Volumes/8TB MM4/Rails4Mankind scripts/deploy-fly.sh
fly.toml ยท app r4m-franky ยท regio cdg (Parijs)
r4m-franky.fly.dev โ†—
v0.29.5 live โ€” dagcheck 19-08 00:21, geen versiedrift
DS2036/r4m-engine
privรฉ
maX-site
dit dossier, achter login
/Volumes/8TB MM4/r4m-maX Cloudflare Pages
wrangler.toml ยท project r4m-max
r4m-max.pages.dev โ†—
v0.94.0 โ€” achter Cloudflare Access
DS2036/r4m-max
privรฉ
Archief
niets mee doen
~/Downloads/Rails4Mankind-ARCHIEF geen โ€” niet in bouwen, niet in deployen geen DS2036/Rails4Mankind
v0.28.7

Waar de back-ups staan

  • Engine โ€” backups/ in de map: รฉรฉn versleutelde kopie van de database per dag (r4m-20260814T024006Z.sqlite.enc is de laatste), gemaakt door de nachtploeg com.r4m.daily-backup. Daarnaast auto-backup-commits in git, de GitHub-repo zelf, en een kopie in de Cloudflare-R2-bucket r4m-backups.
  • maX โ€” backups/backup-v<versie>-<datum>/: een volledige kopie van public/ vรณรณr elke werkorder. Twaalf stuks op 14-08, de nieuwste is backup-v0.91.1-20260814-1311-voor-werkorder7. Daarnaast een git-tag per versie en de GitHub-repo.

โš ๏ธ De regel die je รฉรฉn keer vergeet en dan nooit meer: een Fly-deploy stuurt de lokale map op, niet GitHub. Wat niet op deze Mac staat, gaat niet live. GitHub is de back-up en de geschiedenis, niet het deploy-kanaal. Cloudflare Pages werkt hetzelfde: wrangler uploadt public/ zoals die hier op de schijf staat.

1 ยท DE BIND-KANTsandbox bewezen ยท productie nog niet

Van itsme-login naar een attestatie โ€” zonder ooit een naam te bewaren

Simpel gezegd: iemand logt in met itsme. Wij krijgen van itsme te horen wรญรฉ dat is, maar bewaren die naam niet. We malen hem door een versleutelde molen tot er รฉรฉn onleesbare code overblijft, en die code is voor elke klant weer een andere. Wat we daarna kunnen zeggen is precies รฉรฉn zin: "op dit moment stond hier een uniek mens, gecontroleerd door itsme." Meer niet โ€” en dat is het hele punt.

Wat er draait, en waar

  • De deur: GET /api/identity/itsme/attest-start โ€” staat LIVE op r4m-franky.fly.dev. Code: src/routes/identityOidc.ts. Snelheidsslot ervoor (writeLimiter, 100 per minuut) omdat deze deur publiek is en bij elke klik rijen wegschrijft.
  • Waar hij naartoe stuurt: op 14-08-2026 13:07 geeft die route een 302 naar tb2r.sandbox.signicat.com/auth/open/connect/authorize, met acr_values=idp:itsme, scope=openid, PKCE aan (code_challenge_method=S256) en terugkeeradres /api/identity/itsme/callback. Signicat is de makelaar tussen ons en itsme; wij praten niet rechtstreeks met itsme.
  • De terugweg: /api/identity/itsme/callback โ€” hier wordt de persoon omgezet in een gezouten hash met IDENTITY_SALT, en pas daarna in een attestatie (src/attest/attestation.ts).
  • De paarsgewijze code: uniquenessRef = sha256(persoons-hash : afnemer). Dezelfde mens geeft bij dezelfde klant altijd dezelfde code โ€” zo dwing je "รฉรฉn mens, รฉรฉn plaats" af. Bij een รกndere klant is het een andere code, dus twee klanten kunnen hun lijsten niet aan elkaar knopen.
  • Het bewijsstuk: het door de provider ondertekende identiteitsbewijs gaat verzegeld in een aparte kluis (src/identity/evidenceVault.ts) achter een eigen sleutel (AUDIT_EVIDENCE_KEY) โ€” alleen te openen bij audit of gerechtelijk bevel.

โœ… Wat op 09-07-2026 al bewezen is (v0.27.33). De founder liep de hele keten zelf af op de lokale server: app โ†’ login โ†’ pas-kaart โ†’ "Bevestig met itsmeยฎ" โ†’ Signicat-sandbox โ†’ "Je pas is bevestigd" โ†’ een identiteit met provider itsme en zekerheidsniveau HIGH โ†’ verzegeld bewijsstuk #1 in de kluis โ†’ npm run audit:evidence zei handtekening geldig tegen de live sleutellijst van de makelaar. Die rij staat er vandaag nog: in de lokale database is identity_evidence rij 1 provider itsme, tijdstip 2026-07-09 13:01:03.

โš ๏ธ Wat er nog niet is, en dat moet je zelf zeggen voor iemand het vraagt.

  • De sandbox is geen productie. Wat de burger in de sandbox ziet is een simulator van Signicat, niet de itsme-app op zijn telefoon. In productie ziet hij het echte itsme-scherm en nooit een simulator.
  • Er is nog geen itsme-testgebruiker. Die is aangevraagd bij Signicat. De keten van 09-07 liep via de Custom-simulator; de eerste keten met een รฉchte itsme-testgebruiker moet nog gebeuren. Dat is de openstaande rij in het Testboek.
  • Productiecontract en tarieven zijn een aparte, latere stap โ€” via Signicat als makelaar, met TURBEAU2ROCK CommV als contracterende entiteit. Wat itsme per verificatie kost in productie: ONBEVESTIGD, dat gesprek is nog niet gevoerd.
2 ยท DE VERIFIEER-KANTlive ยท gratis ยท geen account

Het attest opsturen en een ja/nee terugkrijgen

Simpel gezegd: een klant heeft van iemand een bewijsje gekregen en wil weten of het echt is. Hij stuurt het naar ons en krijgt "ja" of "nee". Daar hoeft hij geen klant voor te zijn, geen sleutel voor aan te vragen en niets voor te betalen. Dat is met opzet zo: een bewijs dat alleen wรญj kunnen controleren, is geen bewijs. Dan vraag je iemand om ons te geloven, en geloven is precies wat R4M wil afschaffen.

Vier oproepen, en niet meer โ€” src/routes/attest.ts

OproepWat je terugkrijgt
GET /api/public/attestWat een attestatie is, of de ondertekening aanstaat, hoeveel er uitstaan, en de quickstart in drie regels.
GET /api/public/attest/jwks.jsonDe publieke sleutel. Hiermee controleer je onze handtekening zรฉlf, offline, voor altijd โ€” ook als wij morgen niet meer bestaan. Live op 14-08: รฉรฉn Ed25519-sleutel, kid ksaUEs2Ls4pb--_8.
GET /api/public/attest/:idIs dรญt bewijs nu geldig? Antwoord valid:true of valid:false met een reden.
POST /api/public/attest/verifyIemand overhandigde een token โ€” is het echt en nog levend? Handtekening klopt niet = geweigerd.

Wat er nรณรณit uit komt

Geen naam, geen rijksregisternummer, geen geboortedatum, geen e-mailadres, geen adres. Het sterkste dat dit koppelvlak ooit zegt is: "een uniek mens, geverifieerd door <provider> op niveau <assurance>, op <tijdstip>" โ€” plus de paarsgewijze code die alleen voor die ene afnemer betekenis heeft. Staat de ondertekeningssleutel niet ingesteld, dan geeft de server een 503 en gรฉรฉn attestatie: liever niets dan een niet-ondertekend "bewijs".

3 ยท DE VITRINE8 demo's live

De demo-vitrine, de pas en de quickstart

Simpel gezegd: de etalage. Acht kleine demo's die elk รฉรฉn ding laten zien in plaats van het uit te leggen, plus de pagina waar je zelf een bewijs haalt en de pagina waar de techneut van een klant in vijf minuten aangesloten is.

De acht demo's โ€” r4m-franky.fly.dev/demo/ โ†—

Titels op 14-08-2026 rechtstreeks van de live vitrine gelezen, niet uit de code.

  • ๐Ÿชช Bewijs dat je een mens bent
  • ๐Ÿ‘ค Eรฉn mens, รฉรฉn keer
  • ๐Ÿ“ฌ De brievenbus die jou betaalt
  • ๐Ÿšช De datapoort voor machines
  • ๐Ÿ›๏ธ De uitdeelrail (0%)
  • ๐Ÿงพ Vraag het aan het kasboek
  • ๐Ÿค– x402 live โ€” de agent-deur
  • ๐Ÿค– Machines op de loonlijst

De pas โ€” /demo/pas.html

Dit is waar de bezoeker de eID-stap zet en een attestatie-id (att_โ€ฆ) terugkrijgt. Sinds v0.29.3 (nu live: v0.29.5) zegt de pagina vooraf met zoveel woorden dat de itsme-knop naar de testomgeving gaat โ€” niet achteraf, niet in de kleine lettertjes. Dat was een bewuste keuze: iemand die op een itsme-knop drukt, denkt dat hij zijn echte identiteit afgeeft.

De quickstart โ€” /quickstart.html

De pagina voor de techneut aan de andere kant: drie curl-regels en hij is aangesloten.

โœ… Afwijking van de werkorder โ€” in ons voordeel, en daarom hier gecorrigeerd. Werkorder 7 gaat ervan uit dat de quickstart publiek valid:false geeft omdat de productiedatabase vers is, en zet dat als openstaand punt (werkorder E2). Dat is sinds v0.29.2 opgelost. Er is een vast voorbeeld-attest att_demo000quickstart dat publiek altijd valid:true teruggeeft, gemarkeerd als sample:true met de eerlijke noot erbij dat het gรฉรฉn persoon en gรฉรฉn verificatie is. Het telt niet mee in de tellingen. Nagekeken op 14-08-2026 13:08 โ€” E2 is dicht.

โš ๏ธ Wat wรฉl nog waar is: de productiedatabase is vers. Op 14-08 staat de teller op issued 0 ยท live 0 ยท distinctHumans 0. Er is nog geen enkele echte mens door de publieke deur gegaan. Het vaste voorbeeld maakt de quickstart controleerbaar; het maakt de teller niet voller, en dat is de bedoeling.

4 ยท HET KASBOEK5/5 invarianten groen

Eerlijke wiskunde, publiek na te rekenen

Simpel gezegd: de meeste bedrijven laten een grafiek zien. Wij laten het kasboek zien, en er zit een knop op waarmee een vreemde kan narekenen of het klopt. Twee getallen worden nooit opgeteld: geld dat รฉcht verplaatst is (settled) en geld dat nog beloofd is (pending). Zodra je die twee bij elkaar optelt, ben je aan het pitchen.

Twee publieke oproepen โ€” src/routes/publicApi.ts

  • /api/public/honest-math โ†— โ€” de gemeten werkelijkheid. Stand 14-08: 0 werkers ooit uitbetaald, brievenbus-omzet $1,70 afgerekend, x402-dataverkoop 4 stuks voor $2,03, kaartverkoop 1 voor $2,00, verdiende platformfee $0,32, externe kopers 0.
  • /api/public/reconciliation โ†— โ€” de vijf controles die een boekhouder zou doen.

De vijf invarianten โ€” alle vijf groen op 14-08-2026 13:08

#ControleIn gewone taalStand
i1globalConservationEr is geen geld uit het niets ontstaan of verdwenen.ok ยท onbalans $0
i2perTransactionBalanceElke losse transactie sluit op nul.ok ยท 0 scheve
i3cacheMatchesDerivedHet snelle saldo-overzicht liegt niet tegenover het echte grootboek.ok ยท geen drift
i4auditClaimIngelegd = vastgehouden + uitbetaald + fees.ok ยท $1,76 = $1,76 + $0 + $0
i5noNegativeHoldingsNiemand staat rood.ok ยท geen negatieve

Te zien voor een mens in plaats van een machine: /demo/kasboek.html โ†— en /grootboek.html โ†—.

5 ยท DAGCHECK & BEWAKINGbewust rood

De twee bewakingen die voorkomen dat er onzin de deur uitgaat

Simpel gezegd: twee dingen gingen eerder mis en kunnen weer misgaan. Er vertrok bijna een mail met een lege link erin op de plek van het enige bewijsstuk, en een gecorrigeerd cijfer bleef op twee andere pagina's gewoon staan. Dit script kijkt elke dag of dat opnieuw gebeurt, in plaats van te vertrouwen op iemands geheugen.

Waar: tools/dagcheck-bewaking.sh in de maX-map. Draaien: ./tools/dagcheck-bewaking.sh. Afloop 0 = groen, 1 = rood.

(a) De plaatshouder-controle

Kijkt in wat daadwerkelijk een mail in gaat โ€” verkoopkit.html, klanten.html, ochtendrapport.html, muc-voorstellen.js โ€” naar restanten als [DEMO-URL], โ‚ฌ[X] en [naam].

GEWIJZIGD 14-08-2026 14:10 Stand 14-08-2026 13:45: ROOD op 2, en die twee horen zo. Vanochtend stonden er nog 13. Het groene licht voor de demo-URL is gegeven, dus de elf [DEMO-URL]-restanten zijn vervangen door de echte link โ€” r4m-franky.fly.dev/demo/, publiek en zonder account te openen.

Wat blijft staan zijn twee regels in de verkoopkit met het maximumbedrag per verificatie in de tariefclausule. Dat cijfer kennen we pas nรก de itsme-tarieven, en een cap die onder de kostprijs ligt maakt elk jaarcontract verlieslatend op die post. Daarom blijft die bewust leeg en blijft de bewaking daarop rood: rood is hier het gewenste antwoord, geen defect. De bewaking staat er juist om te beletten dat iemand dat bedrag "even" invult met een gok.

(b) De correctie-grep

Elke regel is een cijfer dat ooit fout stond. Staat het buiten zijn correctieblok, dan is de correctie niet doorgezet. Zes regels, alle zes groen op 14-08: het x402-transactieaantal, de 75M-kop, de oude itsme-penetratie, de NVWA-overclaim, de DAC7-drempel zonder nuance en AI Act artikel 50. Nieuwe correctie? Eรฉn regel toevoegen aan de lijst in het script โ€” dat is de hele bedoeling.

6 ยท DE MAX-SITE ZELF

Dit dossier โ€” hoe het in elkaar zit

Simpel gezegd: de site die je nu leest is geen verzameling losse pagina's. Er is รฉรฉn bestand waar de status in staat, รฉรฉn script dat het versienummer overal stempelt, en รฉรฉn script dat vakwoorden automatisch uitlegt. Dat is met opzet: elk gegeven dat op twee plekken met de hand staat, gaat vroeg of laat uit elkaar lopen.

OnderdeelWat het doetWie roept het aan
data.jsDe enige databron voor het dashboard: versienummer, statuskaarten, en de lijst "laatst gewijzigd".index.html en elke pagina met een versiestempel.
versie.jsStempelt het versienummer in รฉlke voettekst, live uit MAX_DATA. Lukt dat niet, dan staat er rood "versie onbekend" โ€” nooit een stil verouderd nummer.Alle pagina's, onderaan.
jargon.jsZet bij het eerste gebruik van een vakwoord een stippellijn en een uitleg-tooltip; daarna staat het woord kaal.Alle pagina's.
anker.jsZorgt dat een link naar een blok ook aankomt als dat blok dichtgeklapt staat: doel opzoeken (ook via data-anker/data-item, want JavaScript-verbouwde blokken verliezen hun id), รฉlke uitklapper erboven openzetten, eronder schuiven en twee seconden laten oplichten. NIEUW v0.96.0Alle pagina's, als laatste script โ€” dus nรก de bouwers.
cccbar.jsDe balk bovenaan, spiegelt de dashboard-tabs.Alle pagina's, bovenaan.
muc-voorstellen.jsHet MUC-dossier: de bronnen, notities en voorstellen per use case.main-use-cases.html.
functions/Cloudflare Pages Function /api/feedback โ€” vangt Franky's โœ”/โœ˜/โ“ op in de KV-opslag MAX_FEEDBACK, zodat de CLI ze kan uitlezen.De tab zelf, en lees-feedback.sh vanaf de CLI.

Waar je de rest vindt

  • Waar zit wat โ€” het spoorboekje: welk project in welke map, met versiehistoriek per project.
  • Woordenlijst โ€” elk vakwoord van deze site in รฉรฉn zin, met een "zeg liever"-regel voor aan tafel.
  • Testboek โ€” wat er getest is, door wie, wanneer, en hoe je het zelf naloopt.
  • Archief โ€” de changelog en alles wat van de site af is.

Slot op de deur

De hele site staat achter Cloudflare Access met GitHub-login, en elke pagina draagt noindex, nofollow. Er staat niets op wat een zoekmachine mag vinden.