import json,sqlite3,urllib.request from pathlib import Path root=Path(__file__).resolve().parent.parent before=json.loads((root/'integration-work/before-switch-final.json').read_text()) after=json.loads((root/'integration-work/after-switch.json').read_text()) assert before==after,'Data changed across restart; inspect the audit' with sqlite3.connect(root/'integration-work/backups/upgrade-20261106-172956/huobao-data/huobao.sqlite3') as old,sqlite3.connect(root/'huobao-data/huobao.sqlite3') as current: old.row_factory=current.row_factory=sqlite3.Row originals=[dict(r) for r in old.execute('SELECT * FROM ai_service_configs')] now={r['id']:dict(r) for r in current.execute('SELECT * FROM ai_service_configs')} assert all(now[r['id']]==r for r in originals) assert len(now)==len(originals)+18 variants=[r for r in now.values() if json.loads(r['settings'] or '{}').get('gpu_variant_source')] assert len(variants)==18 for sid in (4,6,7,8,9,10): assert {json.loads(r['settings'])['gpu'] for r in variants if json.loads(r['settings']).get('gpu_variant_source')==sid}=={'gpu1','gpu2','gpu3'} summary={'passed':True,'original_configs_unchanged':len(originals),'fixed_gpu_configs':len(variants), 'projects':after['tables']['dramas']['count'],'styles':after['tables']['style_presets']['count'],'media_files_preserved':len(after['media'])} base=json.loads((root/'huobao-data/last-launch.json').read_text())['api'] with urllib.request.urlopen(base+'/ai-configs',timeout=10) as response:configs=json.load(response)['data'] assert len(configs)==28 summary['live_api_configs']=len(configs) (root/'integration-work/gpu-release-verification.json').write_text(json.dumps(summary,indent=2)) print(json.dumps(summary))