Document 09 of 14 · docs/QA.md

Verifying by driving, the sweep

Nothing on this site is verified by reading it. Every claim the site makes to a visitor has an assertion that drives the page and checks. studio-src/sweep.cjs runs them all; studio-src/pdfcheck.mjs checks the files. Both are hand-run and run in the weekly Action. When an assertion is added, it is proved non-vacuous first: break the thing on purpose and watch it fail. Three false alarms on measureandbuy came from assertions that had gone stale, so check the assertion before believing a regression.

1. Every page, at 1440 and at a real 390 viewport

2. Template page

3. Customizer

4. The files (pdfcheck.mjs)

For every template's free file and for the two files of a test-mode order:

Locally without poppler this is a small Node script reading the PDF objects; with poppler, pdfinfo and pdffonts do the same and the numbers must agree.

5. The purchase, in test mode, by hand, on a phone

  1. Customize the invoice with a logo and twelve lines.
  2. Pay with Stripe's test card. The success page shows the waiting state, then READY inside fifteen seconds, with two buttons.
  3. Both PDFs open in Preview and in Acrobat. Fonts embedded, both sizes correct, the logo present.
  4. The email arrives inside a minute with the same two buttons and the same order id.
  5. The next day the link in the email still works. A refund from the Stripe dashboard flips the order to refunded and the link stops.
  6. Repeat once with a delayed-payment test method to prove async_payment_succeeded is handled.

This is the Phase 1 acceptance test and it is not done until all six pass.

6. Launch checklist (cutover day)

7. The weekly Action

Runs the sweep against www, pdfcheck on the free files, one end-to-end render through Browser Run into a scratch path (then deleted), the Supabase keep-warm query, and a link check. Opens one issue (commented on, not duplicated) when anything fails. It never changes anything; it tells a person. Same posture as measureandbuy's monthly source check, and PIPESTATUS[0] not $? after any pipe, for the same reason.

All documents