# CRITIC · menu-qr-fix

**Verdict: FIX**

Reviewed Wed Oct 21, 2026 (PT), read-only. Voice is calm and honest about the limits. No fake team, no hype, no deal copy, no squad or -mallow wording. Pills and buttons (MENU QR CODES, FIX MY MENU QR, READ THE NOTE, SCAN FOR MENU, TALK TO A HUMAN →) are ALL CAPS with no "!" and no vendor names. House spec sizes are labeled as JKCA choices. No refund window appears in this pack (the "14 days" here is the change window, not a refund).

## Must-fix

1. **A Scanworthy quote is still on the service page** (L265 to L268). Lead default: use the no-quote line.
   - Now: `> "Set up a server-side redirect from the dead URL to your real one — but this only works if the QR encoded a URL on a domain you control, which most don't."` / `> Scanworthy, "Why your printed QR code stopped working," May 23, 2026` plus the Critic note and the "Alternative" line.
   - Use (the whole block): **Attributed line**: "Codes on the QR company's domain can only be turned back on by that company. So we check yours first, and tell you straight."
2. **There's also a Scanworthy quote in section 1** (L14), with an em dash a crew could copy.
   - Now: `Scanworthy, a QR company, describes the moment: "Today, the QR code stopped working — it now shows a 'subscribe to continue' page." It says the owner's choices are then to pay the subscription ("often $180+/year") or reprint [Q1]. (That quote contains ...)`
   - Use: "Scanworthy, a QR company, says most free trials run 7 or 14 days, and that the owner's choices are then to pay the subscription or reprint [Q1]. Internal context only. Don't quote it in public copy."
3. **The gate still allows the quote** (L362).
   - Now: "Scanworthy quote used exactly (with its em dash) or replaced by the no-quote line. No paraphrase in quote marks."
   - Use: "No Scanworthy quote in any public copy. The service page uses the no-quote line."
4. **The doubt-killer contradicts the checkout.** Stripe is pay-first ("After you pay, we'll email to collect photos..."), but L284 promises a check before payment.
   - Now: "If your old codes point at the QR company's domain, we'll tell you before you pay for anything they can't fix."
   - Use: "We read every old code first and tell you which ones can be saved. The new codes on your own domain are yours either way."
   - Or json can make the CTA go to intake first and keep the original line.
5. **The 302 claim goes past Q6.** RFC 9110 only says a 301 is heuristically cacheable. It doesn't say a 302 is re-checked every time.
   - L83: "A 302 is checked fresh each time." → "A 302 doesn't carry that rule, so a change reaches people sooner."
6. **An absolute claim with no backing** (L340, service meta). Codes on the generator's domain still need a reprint, and the domain has to stay renewed.
   - Now: "so a printed menu never needs reprinting."
   - Use: "so a printed menu doesn't need reprinting when the menu changes."
7. **X post 3 claims work that hasn't started** (L324).
   - "We're setting up menu QR codes that point at the restaurant's own domain." → "We set up menu QR codes that point at the restaurant's own domain."
8. **Q7 is a snapshot only.** FACTS says to re-open it in a browser before publishing.
   - L347: "Re-open Q1 and Q3 to Q5 before pasting." → "Re-open Q1, Q3 to Q5, and Q7 (qrcode.com, in a browser) before pasting."

## Nice-to-have
- L102: "it never expires" conflicts with the next FAQ. Use "it doesn't expire on its own".
- L257: "opens a payment page" → "opens a 'subscribe to continue' page" (matches Q1 and the note).
- L111: "The paid features you'd give up are things like scan counts" leans on Q2, which is internal-only. You could drop the sentence.
- Ship step 6: the demo path https://jkca.studio/menu-demo returns 404 today. Check it returns 302 before the page ships.
- json still has to confirm the 14-day change window and the price past 10 codes. Both are already flagged.

## Links checked (curl)
- 200: scanworthy.com article, all developers.cloudflare.com docs, rfc-editor RFC 9110, pypi segno, honestqr, jkca.studio/notes/.
- Timeout (000): qrcode.com (all 3). Matches the FACTS note.
- `theirsite.com` URLs are placeholders. They don't resolve, which is expected.
- 404, expected because the pages aren't built: /notes/menu-qr-code-stopped-working/, /services/menu-qr/, /menu-demo.

## Round 2

**Verdict: PASS**

Re-gated Wed Oct 21, 2026, 10:02 AM PT. I worked from the files, not from FIXES-APPLIED.md: I diffed PACK.md and FACTS.md against the round-1 text. FACTS.md is unchanged.

- All 8 must-fixes are fixed.
- **No Scanworthy quote or em dash anywhere.** The two Scanworthy mentions left (L18 internal, L60 note) are unquoted attributions backed by Q1.
- **The flow is intake first, pay after review, and it's consistent:**
  - Hero button (L250), close button (L281) and ship step 3 all go to the Kindform intake.
  - Stripe L292: "no checkout on the page", and the Payment Link is sent after the codes are read.
  - The custom text "Thanks for the photos. After you pay..." fits that order.
- **No leftover checkout wording.** There's no buy-now or checkout button wording for our service. "payment page" (L257) and "paying them" (L72) are about the QR company. The doubt-killer is allowed to stay as it is.
- **Round-1 claim fixes:** the 302 line, the service meta and X post 3 are fixed. Ship step 1 now re-opens Q7.
- **Links:** /menu-demo still returns 404 (re-curled). The pack now handles that correctly: it's optional and not linked unless it's built.

### Still open (nice-to-have)
- The "How it works" steps don't show when payment happens. Step 2 could be: "We read your codes, tell you which can be saved, and send the $49 link."
- Strip the internal note "(True because the CTA goes to intake first...)" from the shipped doubt-killer.
- L102: "it never expires" → "it doesn't expire on its own".
- L257: "opens a payment page" → "opens a 'subscribe to continue' page".
- L111: the scan-counts sentence rests on Q2, which is internal-only.
