from __future__ import annotations
REQUIRED=['motivation_case_id','learning_goal_ref','mechanic_id','intended_behavior','reward_type','participation_metric','mastery_evidence_ref','autonomy_risk','competence_signal','relatedness_signal','coercion_flag','equity_risk','opt_out_state','sunset_condition','review_owner','provenance']
def evaluate(x):
    missing=[k for k in REQUIRED if k not in x]
    if missing: return {'state':'HOLD_INSUFFICIENT_EVIDENCE','reason':'MISSING_FIELDS','missing':missing}
    if x.get('baseline_oracle_reuse'): return {'state':'HOLD_BASELINE_ORACLE_REUSE','reason':'BASELINE_ORACLE_REUSE_FORBIDDEN'}
    if not x.get('learning_goal_ref') or not x.get('intended_behavior'): return {'state':'HOLD_LEARNING_PURPOSE','reason':'LEARNING_PURPOSE_REQUIRED'}
    prov=x.get('provenance') or {}
    if not prov.get('fixture') or not prov.get('rule_version'): return {'state':'HOLD_PROVENANCE','reason':'PROVENANCE_REQUIRED'}
    if not x.get('review_owner'): return {'state':'HOLD_REVIEW_OWNER','reason':'REVIEW_OWNER_REQUIRED'}
    if not x.get('sunset_condition'): return {'state':'HOLD_SUNSET','reason':'SUNSET_REQUIRED'}
    visibility=x.get('visibility')
    if visibility in {'PUBLIC_PEER_RANKING','MANAGER_VISIBLE'} and x.get('opt_out_state') in {None,'MISSING','NONE'}: return {'state':'HOLD_OPT_OUT','reason':'OPT_OUT_REQUIRED'}
    if x.get('coercion_flag') is True: return {'state':'HOLD_COERCION','reason':'COERCION_REQUIRES_REVIEW'}
    if str(x.get('autonomy_risk','')).startswith('HIGH_UNMITIGATED'): return {'state':'HOLD_AUTONOMY_RISK','reason':'AUTONOMY_RISK_UNMITIGATED'}
    if x.get('autonomy_risk')=='UNRECOMPUTED' or x.get('equity_risk')=='UNRECOMPUTED' or x.get('relatedness_signal')=='UNRECOMPUTED': return {'state':'HOLD_EMPLOYER_VISIBILITY_RECOMPUTE','reason':'VISIBILITY_CHANGE_REQUIRES_RECOMPUTE'}
    if x.get('context')=='EMPLOYER_SPONSORED' or visibility=='MANAGER_VISIBLE': return {'state':'HOLD_EMPLOYER_VISIBILITY_RECOMPUTE','reason':'POWER_CONTEXT_REQUIRES_HUMAN_REVIEW'}
    mastery=x.get('mastery_evidence_ref') or {}
    part=x.get('participation_metric') or {}
    if part.get('direction')=='UP' and mastery.get('state') in {'FLAT','MISSING',None}: return {'state':'MODIFY_AND_REVIEW_REQUIRED','reason':'PARTICIPATION_NOT_MASTERY'}
    if str(x.get('equity_risk','')).startswith('HIGH'): return {'state':'MODIFY_AND_REVIEW_REQUIRED','reason':'EQUITY_REVIEW_REQUIRED'}
    if x.get('mechanic_id')=='NONE_REMOVED' and mastery.get('state')=='STABLE': return {'state':'RETIRE_MECHANIC_REVIEW_REQUIRED','reason':'DURABLE_BEHAVIOR_WITHOUT_MECHANIC'}
    return {'state':'MOTIVATION_GOVERNANCE_REVIEW_REQUIRED','reason':'BOUNDED_REVIEW_READY'}

def inspect_transfer(x):
    r=evaluate(x)
    return {'state':r['state'],'reason':r['reason'],'context':x.get('context'),'visibility':x.get('visibility'),'baseline_oracle_reuse':x.get('baseline_oracle_reuse')}
