REQUIRED = {"operation", "baseline", "duration_s", "distances", "cycles", "uncertainty", "postselection"}
def classify(card, rates):
    missing = REQUIRED - card.keys()
    if missing or tuple(card["distances"]) != tuple(sorted(rates)):
        raise ValueError(sorted(missing) or "distance mismatch")
    values = [rates[d] for d in card["distances"]]
    trend = "suppression" if all(a > b for a, b in zip(values, values[1:])) else "worsening" if all(a < b for a, b in zip(values, values[1:])) else "flat"
    return trend, "memory-evidence" if card["operation"] == "memory" else "operation-evidence"
card = {"operation":"memory", "baseline":"physical-idle", "duration_s":.001, "distances":[3,5,7], "cycles":1000, "uncertainty":"binomial-95", "postselection":False}
baseline = classify(card, {3:2e-3, 5:7e-4, 7:2e-4})
boundary = classify(card, {3:7e-4, 5:7e-4, 7:7e-4})
counterfactual = classify(card, {3:2e-4, 5:7e-4, 7:2e-3})
assert (baseline[0], boundary[0], counterfactual[0]) == ("suppression", "flat", "worsening")
assert baseline[1] == boundary[1] == counterfactual[1] == "memory-evidence"
print(f"PASS: 52 logical evidence trends={baseline[0]}/{boundary[0]}/{counterfactual[0]} claim={baseline[1]}")
