import json
from pathlib import Path
p=Path(__file__).parent
read=lambda f:json.loads((p/f).read_text())
for lane in 'BC':
    red=read(f'crud-red-{lane}.json');green=read(f'read-green-{lane}.json');audit=read(f'independent-audit-{lane}.json')
    assert red['failure'] is None and len(red['cases'])==22 and len({x['path'] for x in red['cases']})==6
    assert red['category_natural_unchanged'] and red['dishes_projection_unchanged']
    assert all(x['create_time_length']==x['update_time_length']==(19 if lane=='B' else 26) for x in red['cases'] if 'create_time_length' in x)
    assert green['failure'] is None and len(green['cases'])==6 and green['fixture_dml']==green['business_dml']==1
    assert green['cases']['own_list_seconds']['all_formal_fields_types_source_equal']
    assert green['cases']['own_list_seconds']['create_time_length']==green['cases']['own_list_seconds']['update_time_length']==19
    assert all(green['cases'][x]['complete_rows_source_equal'] for x in ['options_form','options_include','options_filter'])
    assert green['natural_category_unchanged'] and green['dishes_projection_unchanged']
    assert audit['all_passed'] and audit['independent_new_connection'] and all(audit['checks'].values())
    assert audit['business_dml']==audit['ddl']==0 and audit['retained']['status']==2 and audit['retained']['is_delete']==1 and audit['retained']['dish_references']==0
    cleanup=read('cleanup.json')[lane]
    assert cleanup['worker_stopped'] and cleanup['port_not_listening'] and cleanup['private_source_and_copied_config_removed'] and cleanup['private_responses_and_token_context_removed']
    assert cleanup['private_cache_files_remaining']==cleanup['private_runtime_files_remaining']==0
    assert cleanup['category_rows_retained']==1
assert read('frozen-read-original-B.json')['cases']==read('frozen-read-candidate-B.json')['cases']
wire=read('wire-comparison.json');assert wire['passed'] and wire['complete_wire_cases']==2 and wire['source_and_owned_projection_cases']==3
assert read('unit-result.json')['private_candidate']['checks']==21
print('PASS: four new real Store POST CRUD paths, 22 original + 6 exact-owned-row regression HTTP cases per engine, DM seconds output red/green, B complete frozen wire unchanged, independent source/object audit and resource cleanup, retained soft row per lane')
