Why
PostGuard spans ~12 repos bound by a few implicit contracts, each tested in isolation with mocks. Flows are combinatorial and crypto-core versions have drifted with no single source of truth. Symptom: "fix one thing, three others break," found late and by hand.
The matrix has two axes
- Flows — sender × recipient × channel (website, Outlook, Thunderbird, SDK/API, mobile)
- Versions — pg-core ↔ pg-wasm ↔ pg-js ↔ pg-ffi ↔ PKG v2
They meet at three contracts (the seams):
- Wire format —
pg-core VERSION_V3 + bincode-v1 preamble.
- PKG v2 HTTP API —
/v2/parameters, /v2/{irma,request}/start|jwt|key|sign/key, /v2/api-key/validate.
- Yivi condiscon — the
IrmaAuthRequest/ConItem shape (the in-flight feat/condiscon-auth-request).
Two workstreams
- Shrink the matrix — enumerate the finite real flows; make the 3 contracts explicit/versioned; retire the dead
postguard-thunderbird-extension; de-duplicate addon glue; one Yivi binding; one pg-js version; a compat manifest.
- Central harness — grow
postguard-version-matrix → postguard-e2e with 4 layers: contract tests, crypto-compat fixtures, e2e golden flows (headless Yivi via irmaclient, real-device swappable later), version matrix in CI. Runs nightly + on contract-affecting PRs.
Assets we build on (don't rebuild)
postguard-website/docker-compose.yml — full stack incl. irma-server + mailcrab
postguard-version-matrix — manual version sweep
irmago/irmaclient + internal/sessiontest — headless Yivi (disproves "decryption can't be automated")
cryptify/api-description.yaml — OpenAPI pattern to copy
postguard-docs/docs/guide/{architecture,usage-flows,protocol}.md
Progress is tracked via the sub-issues below.
Why
PostGuard spans ~12 repos bound by a few implicit contracts, each tested in isolation with mocks. Flows are combinatorial and crypto-core versions have drifted with no single source of truth. Symptom: "fix one thing, three others break," found late and by hand.
The matrix has two axes
They meet at three contracts (the seams):
pg-coreVERSION_V3+ bincode-v1 preamble./v2/parameters,/v2/{irma,request}/start|jwt|key|sign/key,/v2/api-key/validate.IrmaAuthRequest/ConItemshape (the in-flightfeat/condiscon-auth-request).Two workstreams
postguard-thunderbird-extension; de-duplicate addon glue; one Yivi binding; one pg-js version; a compat manifest.postguard-version-matrix→postguard-e2ewith 4 layers: contract tests, crypto-compat fixtures, e2e golden flows (headless Yivi viairmaclient, real-device swappable later), version matrix in CI. Runs nightly + on contract-affecting PRs.Assets we build on (don't rebuild)
postguard-website/docker-compose.yml— full stack incl.irma-server+mailcrabpostguard-version-matrix— manual version sweepirmago/irmaclient+internal/sessiontest— headless Yivi (disproves "decryption can't be automated")cryptify/api-description.yaml— OpenAPI pattern to copypostguard-docs/docs/guide/{architecture,usage-flows,protocol}.mdProgress is tracked via the sub-issues below.