import hashlib,json
from pathlib import Path
from compare import ROOT,equal,verify,verify_original
from sql_audit import audit
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
assert not (ROOT/'manifest.json').exists(),'Never overwrite sealed manifest'
equal(verify_original(),json.loads((ROOT/'comparison-original.json').read_text()),'immutable_original_comparison');result=verify();sql=audit();equal(sql,json.loads((ROOT/'sql-audit.json').read_text()),'immutable_sql_audit')
target=ROOT/'comparison-final.json';assert not target.exists(),'No final comparison overwrite';target.write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n')
main=ROOT.parents[3]/'zhctproject'/'ai_api';source=json.loads((ROOT/'source-http-final-sha.json').read_text())['files'];assert len(source)==30
for name,digest in source.items():assert sha(main/name)==digest,'Current main drift before sealing: '+name
native=[json.loads(p.read_text()) for p in ROOT.glob('native-*.json')];assert len(native)==4 and sum(n['stats']['assertions']['total'] for n in native)==80 and all(n['failures']==0 for n in native)
raw={}
for lane in ('B','C'):
 folder=ROOT/'private-evidence'/lane;assert folder.stat().st_mode&0o777==0o700;raw[lane]={}
 for p in sorted(folder.iterdir()):
  assert p.is_file() and p.stat().st_mode&0o777==0o600
  raw[lane][p.name]={'sha256':sha(p),'bytes':p.stat().st_size}
cleanup={lane:json.loads((ROOT/f'resource-cleanup-{lane}.json').read_text()) for lane in ('B','C')};assert cleanup['B']['evidence_files']==10 and cleanup['C']['evidence_files']==14 and all(r['contract_removed'] for r in cleanup.values())
m={'status':'COMPLETE_SEALED_ROOT_REVIEW','interfaces':5,'HTTP':{'B':10,'C':10,'total':20,'original_nonempty_positive':10,'original_boundary':6,'necessary_extra_readonly_retests':4},'native_assertions':80,'original_C_datetime_reds':2,'full_original_DTO_passes':18,'effective_scenarios_all_green':16,'complete_BC_own_positive_pairs':3,'complete_BC_boundary_pairs':3,'natural_positive_per_engine_not_BC_equal':4,'B_original_body_unchanged':2,'business_fix_files':{'app/admin/service/store/Equipment.php':source['app/admin/service/store/Equipment.php']},'original_source':json.loads((ROOT/'source-http-frozen-sha.json').read_text())['files'],'final_actual_source':source,'TDD':{'original_Service_red':True,'v1_94_green_but_not_deployed':True,'root_independent_invalid_calendar_v1_red':True,'root_v2_144_green':True,'pure_final_counterexamples':6},'approved_C_schema_DDL':{'business_DDL':1,'temporary_DDL':3,'business_DML':0,'temporary_rows_rollback0':True,'target':'AIZHCT_APP.YOSHOP_EQUIPMENT.STATUS SMALLINT DEFAULT1 NOTNULL CHECK0..255','SQL_sha256':sha(ROOT/'equipment-status-add.sql'),'old12_columns_indexes_constraints_triggers_exact':True,'independent_new_PDO_readback':True},'SQL':sql,'raw_remote_each_lane':'/tmp/cdx-ai-admin-device-dishes-read5-20261011/private/evidence','raw_remote_counts':{'B':10,'C':14},'raw_ignored_local':str(ROOT/'private-evidence'),'raw':raw,'cleanup':cleanup,'limits':['synthetic inactive device-only tenant, no real pairing/permissions/devices/SDK','one synthetic zero-nutrition Dish/Img/File metadata, no IO/Baidu/OSS','natural Store two-column and category dictionary per-engine full proof, no fake BC equality','valid zero DM DATE fractions only, no wide/nonzero date recovery or whole module/performance closure']}
(ROOT/'manifest.json').write_text(json.dumps(m,ensure_ascii=False,indent=2)+'\n');files=sorted(p for p in ROOT.iterdir() if p.is_file() and p.name!='MANIFEST.sha256');(ROOT/'MANIFEST.sha256').write_text(''.join(f'{sha(p)}  {p.name}\n' for p in files));print(json.dumps({'status':m['status'],'public_artifacts':len(files),'raw_local_counts':{k:len(v) for k,v in raw.items()},'HTTP':20,'native_assertions':80,'current_final_source_files':30}))
