import json
from pathlib import Path
p=Path(__file__).parent
read=lambda f:json.loads((p/f).read_text())
for lane in 'BC':
    red,green=[read(f'crud-{phase}-{lane}.json') for phase in ('red','green')]
    for r in (red,green):
        assert r['failure'] is None and len(r['cases'])==14
        assert len({x['path'] for x in r['cases']})==7
        assert r['natural_seven_tables_unchanged'] and r['reference_rows_unchanged'] and r['owned_stall_unchanged']
        assert r['source_checks']['noop_update_time_not_advanced'] and r['source_checks']['delete_mealtimes_retained_as_original']
        assert r['retained']['status']==0 and r['retained']['is_delete']==1
        assert r['retained']['relation_counts']['marketing_strategy_mealtimes']==1
    assert red['source_checks']['changed_update_time_advanced']==(lane=='B')
    assert green['source_checks']['changed_update_time_advanced']
    for case in green['cases']:
        if 'raw_column_count' in case:
            assert case['all_original_fields_and_six_relations_source_equal']
            assert case['raw_column_count']==20 and case['strategy_value_type']=='string'
            assert case['create_time_length']==case['update_time_length']==19
    audit=read(f'independent-audit-{lane}.json')
    assert audit['all_passed'] and audit['independent_new_connection'] and all(audit['checks'].values())
    assert audit['business_dml']==audit['ddl']==0
    cleanup=read('cleanup.json')[lane]
    assert cleanup['worker_stopped'] and cleanup['port_not_listening']
    assert cleanup['private_cache_files_remaining']==cleanup['private_runtime_files_remaining']==0
    assert cleanup['marketing_rows_retained']==cleanup['original_mealtime_relation_rows_retained']==2
repair=read('repair-apply-result.json');v=repair['verification']
assert repair['applied_statements']==3 and v['column_count']==20
for k in ('original_columns_unchanged','original_rows_unchanged','indexes_unchanged','old_constraints_unchanged','triggers_unchanged','source_comment_preserved'):assert v[k]
assert repair['original_projection_sha256']==v['original_projection_sha256_after']
ind=read('repair-independent-audit.json')
assert ind['column']==[{'column_name':'CONSUME_SCENE_TYPE','data_type':'SMALLINT','nullable':'N','data_default':'5'}]
assert ind['constraint'][0]['status']=='ENABLED' and ind['constraint'][0]['validated']=='VALIDATED'
assert ind['constraint'][0]['search_condition']=='CONSUME_SCENE_TYPE BETWEEN 0 AND 255'
assert read('frozen-read-original-B.json')['routes']==read('frozen-read-candidate-B.json')['routes']
wire=read('wire-comparison.json');assert wire['passed'] and wire['full_response_scenarios']==13 and wire['selected_owned_row_scenarios']==1
assert read('unit-result.json')['private_candidate']['checks']==28
print('PASS: authorized one-column add-only DDL, 7 POST real CRUD per engine, candidate money/time/changed-noop green, original MySQL frozen body unchanged, independent natural-seven-table audit + retained rows + cleanup; root applied identical candidate SHA, not committed/published')
