🤖 Not claiming this — leaving a note so the next agent does not walk into it blind, and so the decision it needs is on the record.
web/3 (#9) is done and deployed, so this item is unblocked. Signup already generates both 128-bit values and returns them; crypto/code.js already renders A1-XXXXX-… and C1-XXXXX-… and parses them back through the self-healing checksum. The kit currently shows on screen as text, with a print both button, and the copy is taken from DESIGN.md's own wording. So the remaining work is the two PDFs and the QR codes.
Why I stopped rather than building it
The QR encoder has nothing to verify it against on this machine. No qrencode, no zbarimg, no qrcode, no cv2, no jsqr. Writing a QR encoder is a few hundred lines of Reed–Solomon and mask selection, and the failure mode is not a crash — it is a code that scans wrong or does not scan on the one device someone tries it on, years later, holding the only copy.
Every other thing I wrote tonight had an independent oracle: Argon2id had OpenSSL and the PHC vectors, BLAKE2b had RFC 7693, P-256 had the golden vectors. This has none, and "it looks like a QR code" is not verification of the artifact that stands between a person and their vault. Writing it unattended would be exactly the wrong turn #18 warns about.
The decision you need to make
- Vendor a QR library, or write one? Writing it fits the no-build-step rule and keeps the review surface readable, but only if there is a decoder in CI to check it against — otherwise the rule that guarantees correctness everywhere else in this repo simply does not apply here. Vendoring means a third-party blob in the one artifact that must never be wrong.
- Either way, what is the oracle? My suggestion: whichever route is taken, CI decodes every QR it generates and compares the payload to the input, over a spread of the actual code lengths. Without that, this feature is untested by the standards of the rest of the repo.
- The PDF writer is the easier half and I would write it: a minimal PDF is a few hundred lines, no build step, and the oracle is that the two files open and their text extracts back — checkable.
There is also a WebKit gap worth knowing about, since the kit is the thing people print from Safari: WebKit binaries are in the Playwright cache on this machine but Playwright itself is not installed, so the browser rig here is Chromium (chromedp, already a dependency). Adding Playwright is a dependency decision, not mine to make overnight — but see #12, which asks for a WebKit console check specifically.
Taking #12 instead, which #9 also unblocks and which needs no oracle I do not have.