"""Deterministic release policy over synthetic candidate outcomes; no LLM calls."""
import json


REQUIRED_IDS = tuple(f'case-{index:03d}' for index in range(100))


def evaluate(rows, required_ids=REQUIRED_IDS, minimum_pass_rate=0.95):
    if not 0 <= minimum_pass_rate <= 1 or not required_ids or len(set(required_ids)) != len(required_ids):
        raise ValueError('A nonempty unique case set and valid threshold are required')
    ids = [row['id'] for row in rows]
    if len(set(ids)) != len(ids) or set(ids) != set(required_ids):
        raise ValueError('Candidate must contain each required case exactly once')
    for row in rows:
        if row['outcome'] not in ('pass', 'fail', 'ungraded') or type(row['critical_violation']) is not bool:
            raise ValueError('Invalid outcome or critical flag')
    passed = sum(row['outcome'] == 'pass' for row in rows)
    ungraded = [row['id'] for row in rows if row['outcome'] == 'ungraded']
    critical = [row['id'] for row in rows if row['critical_violation']]
    rate = passed / len(required_ids)
    reasons = []
    if critical:
        reasons.append('critical_violation')
    if ungraded:
        reasons.append('ungraded_cases')
    if rate < minimum_pass_rate:
        reasons.append('below_pass_threshold')
    return {'decision': 'block' if reasons else 'pass', 'passed': passed, 'required': len(required_ids),
            'pass_rate': rate, 'critical_cases': critical, 'ungraded_cases': ungraded, 'reasons': reasons}


def fixture():
    return [{'id': identifier, 'outcome': 'pass', 'critical_violation': False} for identifier in REQUIRED_IDS]


def scenario():
    unsafe = fixture()
    unsafe[-1].update(outcome='fail', critical_violation=True)
    clean = fixture()
    return {'fixture': 'synthetic deterministic outcomes; not model performance',
            'minimum_pass_rate': 0.95, 'high_average_with_critical_failure': evaluate(unsafe),
            'clean_candidate': evaluate(clean)}


if __name__ == '__main__':
    print(json.dumps(scenario(), indent=2, sort_keys=True))
