def validate(row):
    required = {"family", "overhead", "unit", "noise", "baseline", "falsifier", "source"}
    missing = required - row.keys()
    if missing or row["overhead"] <= 0:
        raise ValueError(sorted(missing) or "nonpositive overhead")
    return row["overhead"]
def ratio(left, right):
    validate(left); validate(right)
    scope = ("unit", "noise", "baseline")
    return left["overhead"] / right["overhead"] if all(left[k] == right[k] for k in scope) else None
baseline = {"family":"surface-A", "overhead":120, "unit":"qubits/logical", "noise":"Pauli-v1", "baseline":"target-v1", "falsifier":"no suppression", "source":"synthetic"}
matched = {**baseline, "family":"LDPC-B", "overhead":80}
counterfactual = {**matched, "unit":"modes/logical", "noise":"shift-v1"}
comparison = ratio(baseline, matched)
blocked = ratio(baseline, counterfactual)
try:
    validate({"family":"unlabeled", "overhead":9})
    raise AssertionError("incomplete row accepted")
except ValueError:
    rejected = True
assert comparison == 1.5 and blocked is None and rejected
print(f"PASS: 50 comparison evidence matched_ratio={comparison:.2f} mismatched={blocked} schema_rejected={rejected}")
