feat(release): reproduceerbare builds onderzocht + webbundel content-reproduceerbaar (#1027) #1032

Merged
brenno merged 2 commits from feat/repro-provenance-onderzoek-1027 into main 2026-07-31 21:39:29 +00:00
Owner

Pakt #1027 op (reproduceerbare builds / provenance, ENISA-residu O1). Onderzoeksissue: onderzocht, één haalbare winst geland, de rest gewogen.

Wat dit doet

  • Webbundel content-reproduceerbaar gemaakt. Empirisch: van 2854 bestanden verschilde er precies één over twee schone builds — flutter_bootstrap.js, en daarin alleen een willekeurig serviceWorkerVersion-cachebustergetal (van een afgeschreven service-workermechanisme); geen absoluut bouwpad lekt. tool/pack_web_release.dart (normaliseerServiceWorkerVersie) leidt dat getal nu deterministisch af van de service-workerinhoud — nog steeds een juiste cache-buster. Naast de al bestaande .last_build_id-strip.
  • Onderzoeksdossier assurance/reproduceerbare-builds.md: per platform getoetst/gewogen + de SLSA-weging.
  • docs/BUILD.md: herbouw-en-vergelijk-route, en de stale zin "OciDeck has neither today" gecorrigeerd (er is nu een handtekening (#1014) én web-reproduceerbaarheid).
  • ENISA-map (O1) en assurance-README verwijzen door.

De wegingen (terugvindbaar, mét heropen-trigger)

  • macOS — bit-repro principieel onmogelijk voor een derde (serverside notarisatieticket). Windows — hoge last (PE-timestamp, cross-build op de spiegel), lage opbrengst. Beide gewogen weg; notarisatie/handtekening blijven de herkomstgarantie.
  • SLSA — L2/L3 vragen een runner-sleutel/gehoste isolatie die botsen met least-privilege (dezelfde lijn als #1013/#1014). Reproduceerbaarheid bedient "vertrouw de bouwer niet" hier beter dan een provenance-attestatie; geen aparte SLSA-attestatie nu.

Eerlijke kanttekening

De web-reproduceerbaarheid geldt binnen een vaste bouwomgeving. main.dart.js sprong tijdens de toetsen eenmalig naar een tweede, daarna stabiele waarde, samenvallend met een gelijktijdige host-build — een gevoeligheid van de native-assetslaag (dartcv4/OpenCV via CMake), niet per-build-willekeur. Dat is niet weggeschreven: het staat in BUILD.md §"Scope, honestly" en in het dossier, en het pinnen ervan is aangewezen als sluitstuk voor repro over machines heen — hoort onder #520.

Bewaker (pr-landen §2c — publieke belofte)

Geraakt: een publieke belofte in docs/BUILD.md. Bewaker-oordeel: akkoord, kan naar main — soevereiniteit-versterkend, geen vastzetting, belofte eerlijk gehedged, wegingen met heropen-trigger. Eén bevinding (de "verify it yourself"-route verkocht een cross-machine-herbouw licht over) is in deze PR verwerkt met een expliciete verwachting: een mismatch betekent "reproduceer de bouwomgeving beter", geen manipulatie.

Poort

make check groen op een verse worktree boven de huidige origin/main (a61c2f12): alle statische poorten, 7753 tests, dekkingsvloer + per-bestandvloer. Geen pubspec-wijziging (geen SBOM-regen), geen nieuwe l10n-strings, geen nieuw docs/-bestand (het dossier staat in assurance/, bewust niet-uitgeleverd).

Verwant: #1014 (getekende manifest), #1013 (Windows-Authenticode bewust niet), #520 (veilige distributie).

Pakt **#1027** op (reproduceerbare builds / provenance, ENISA-residu O1). Onderzoeksissue: onderzocht, één haalbare winst geland, de rest gewogen. ## Wat dit doet - **Webbundel content-reproduceerbaar gemaakt.** Empirisch: van 2854 bestanden verschilde er precies één over twee schone builds — `flutter_bootstrap.js`, en daarin alleen een *willekeurig* `serviceWorkerVersion`-cachebustergetal (van een afgeschreven service-workermechanisme); geen absoluut bouwpad lekt. `tool/pack_web_release.dart` (`normaliseerServiceWorkerVersie`) leidt dat getal nu deterministisch af van de service-workerinhoud — nog steeds een juiste cache-buster. Naast de al bestaande `.last_build_id`-strip. - **Onderzoeksdossier** `assurance/reproduceerbare-builds.md`: per platform getoetst/gewogen + de SLSA-weging. - **`docs/BUILD.md`**: herbouw-en-vergelijk-route, en de stale zin "OciDeck has neither today" gecorrigeerd (er is nu een handtekening (#1014) én web-reproduceerbaarheid). - ENISA-map (O1) en assurance-README verwijzen door. ## De wegingen (terugvindbaar, mét heropen-trigger) - **macOS** — bit-repro principieel onmogelijk voor een derde (serverside notarisatieticket). **Windows** — hoge last (PE-timestamp, cross-build op de spiegel), lage opbrengst. Beide gewogen weg; notarisatie/handtekening blijven de herkomstgarantie. - **SLSA** — L2/L3 vragen een runner-sleutel/gehoste isolatie die botsen met least-privilege (dezelfde lijn als #1013/#1014). Reproduceerbaarheid bedient "vertrouw de bouwer niet" hier beter dan een provenance-attestatie; geen aparte SLSA-attestatie nu. ## Eerlijke kanttekening De web-reproduceerbaarheid geldt **binnen een vaste bouwomgeving**. `main.dart.js` sprong tijdens de toetsen eenmalig naar een tweede, daarna stabiele waarde, samenvallend met een gelijktijdige host-build — een gevoeligheid van de **native-assetslaag** (dartcv4/OpenCV via CMake), niet per-build-willekeur. Dat is niet weggeschreven: het staat in BUILD.md §"Scope, honestly" en in het dossier, en het pinnen ervan is aangewezen als sluitstuk voor repro over machines heen — hoort onder #520. ## Bewaker (pr-landen §2c — publieke belofte) Geraakt: een publieke belofte in `docs/BUILD.md`. Bewaker-oordeel: **akkoord, kan naar main** — soevereiniteit-versterkend, geen vastzetting, belofte eerlijk gehedged, wegingen met heropen-trigger. Eén bevinding (de "verify it yourself"-route verkocht een cross-machine-herbouw licht over) is in deze PR verwerkt met een expliciete verwachting: een mismatch betekent "reproduceer de bouwomgeving beter", geen manipulatie. ## Poort `make check` groen op een **verse worktree boven de huidige `origin/main`** (a61c2f12): alle statische poorten, 7753 tests, dekkingsvloer + per-bestandvloer. Geen pubspec-wijziging (geen SBOM-regen), geen nieuwe l10n-strings, geen nieuw `docs/`-bestand (het dossier staat in `assurance/`, bewust niet-uitgeleverd). Verwant: #1014 (getekende manifest), #1013 (Windows-Authenticode bewust niet), #520 (veilige distributie).
De web-release had precies één bouw-tot-bouw-variatie: `serviceWorkerVersion`
in flutter_bootstrap.js is een willekeurig getal — een cache-buster voor
Flutter's afgeschreven service-worker. Empirisch was dat het enige verschil van
2854 bestanden over twee schone builds; verder is de bundel byte-identiek en lekt
geen absoluut bouwpad.

`pack_web_release.dart` normaliseert dat getal nu (`normaliseerServiceWorkerVersie`)
naar een waarde afgeleid van de service-workerinhoud — deterministisch én nog
steeds een juiste cache-buster (verandert precies als de service-worker
verandert). Dit staat naast de al bestaande `.last_build_id`-strip, om dezelfde
reden. Daarmee is de bundelinhoud binnen een vaste bouwomgeving reproduceerbaar.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
docs(assurance): onderzoek reproduceerbare builds & provenance (#1027)
All checks were successful
scans / scans (pull_request) Successful in 3m30s
19f2c5bcd1
Uitwerking van ENISA-residu O1: `assurance/reproduceerbare-builds.md` toetst
empirisch per platform en weegt tegen SLSA. Web is content-reproduceerbaar
gemaakt en getoetst (met de eerlijke kanttekening dat de native-assetslaag nog
een variabele is); macOS is principieel (serverside notarisatie) en Windows qua
opbrengst gewogen weg; een aparte SLSA-provenance-attestatie voegt voor één
vertrouwenswortel niets toe boven de off-runner getekende manifest.

`docs/BUILD.md` krijgt de herbouw-en-vergelijk-route en corrigeert de stale zin
"OciDeck has neither today" (er is nu een handtekening én web-reproduceerbaarheid).
De ENISA-map en de assurance-README verwijzen door.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 4ede15ab9f into main 2026-07-31 21:39:29 +00:00
Sign in to join this conversation.
No description provided.