CRITICAL = ["feedback_run_id","content_variant_id","hypothesis_ref","metric_definition","instrumentation_version","collection_state","observation_window","observed_value","decision_state","next_action","evidence_ref","segment","baseline_ref"]

def evaluate(c):
    missing=[k for k in CRITICAL if c.get(k) in (None,"",[],{})]
    evidence_complete=not missing
    instrumentation_valid=bool(c.get("instrumentation_version")) and c.get("duplicate_collection") is not True
    collection_valid=(c.get("collection_state")=="VALID") and instrumentation_valid
    metric_semantics_valid=(c.get("metric_semantics_current") is True)
    window_valid=(c.get("window_comparable") is True) and (c.get("segment_comparable") is True)
    decision_valid=(c.get("baseline_valid") is True) and not c.get("metric_hierarchy_conflict",False)

    if not evidence_complete:
        state="HOLD_MISSING_EVIDENCE"
    elif c.get("duplicate_collection") is True:
        state="BLOCKED_DUPLICATE_COLLECTION"
    elif c.get("collection_state")!="VALID":
        state="REMEASURE_COLLECTION_SUSPECT"
    elif not metric_semantics_valid:
        state="STALE_METRIC_SEMANTICS"
    elif not window_valid:
        state="DISPUTED_WINDOW"
    elif c.get("baseline_valid") is not True:
        state="BLOCKED_BASELINE"
    elif c.get("metric_hierarchy_conflict") is True:
        state="REVISE_OR_SEGMENT"
    else:
        state="LOOP_ACTIONABLE"
    return {"state":state,"evidence_complete":evidence_complete,"instrumentation_valid":instrumentation_valid,"collection_valid":collection_valid,"metric_semantics_valid":metric_semantics_valid,"decision_valid":decision_valid}
