from pathlib import Path
import csv,json,hashlib,zipfile
base=Path(__file__).resolve().parents[1]; out=Path(__file__).resolve().parent
sources={
'drill_motor_pcb':'drill_header_holes_A92/drill_motor_a85_cutoff.kicad_pcb',
'drill_motor_bom':'drill_header_holes_A92/motor-A92-candidate-BOM.csv',
'drill_target':'drill_encoder_target_A104/firmware/固件/drill_target/build/drill_control_g431cb.bin',
'lamp_power_pcb':'lamp_control_decoupling_A70/power_board/lamp_buck_lmr51450_a6_local_ldo.kicad_pcb',
'lamp_led_pcb':'lamp_local_decoupling_A59/board/led_driver.kicad_pcb',
'lamp_power_delta_bom':'lamp_control_decoupling_A70/BOM-delta.csv',
'lamp_target':'lamp_bench_capture_A68/firmware/固件/lamp_target/build/lamp_safety_g030f6.bin',
'vacuum_main_pcb':'vacuum_display_pullups_A111/cad/vacuum_control_evt_a5_logic_fet.kicad_pcb',
'vacuum_main_delta_bom':'vacuum_display_pullups_A111/added_BOM.csv',
'vacuum_panel_pcb':'vacuum_panel_board_A107/cad/vacuum_panel_a107.kicad_pcb',
'vacuum_pressure_pcb':'vacuum_pressure_adapter_A114/cad/vacuum_pressure_a114.kicad_pcb',
'vacuum_target':'vacuum_pressure_read_A113/firmware/固件/vacuum_target/build/vacuum_control_g030f6.bin',
'requirement_baseline':'vacuum_manual_A105/whole_product_28_requirements_A105.csv'}
records=[]
for key,rel in sources.items():
 p=base/rel; data=p.read_bytes(); records.append({'role':key,'path':str(p),'bytes':len(data),'sha256':hashlib.sha256(data).hexdigest()})
(out/'current-source-snapshot.json').write_text(json.dumps({'status':'ENGINEERING_REVIEW_ONLY','manufacturing_release':False,'sources':records},ensure_ascii=False,indent=2)+'\n')
rows=list(csv.DictReader((base/sources['requirement_baseline']).open(encoding='utf-8-sig')))
notes={
'电磨':('A92 motor CAD / A104 target input acquisition','按键/旋钮为诊断采集，完整电机启动、调速、手柄、LCD、充电运行链尚未证明；180×80工程载板需产品化'),
'吸尘器':('A111 main / A107 panel / A114 pressure adapter / A113 target','具备面板及原始压力采集候选；风机锁定关闭、吸力未标定；显示模块及传感器仅工程候选，学习/告警效果未证明'),
'AI美甲灯':('A70 power / A59 LED driver / A68 target','供电/LED驱动/安全采样候选；摄像头、甲面定位、选择性照射及320×240显示缺少完整集成证据；输出关闭')}
for r in rows:
 r['ImplementationEvidenceScope'],r['IntegrationGap']=notes[r['Product']]
 r['Status']='NOT_VERIFIED'; r['CurrentPhysicalEvidence']='未取得参考机及候选机对照实测'
 r['ReferenceProvenance']='沿用A105历史需求摘录；本轮未重新核对商品页面；采购和功能冻结前复核手册/实物'
 r['AcceptanceAuthority']='现有95%/2dBA等阈值是工程暂定值，非厂家或用户批准；完整行为匹配不能仅用这些阈值替代'
with (out/'whole-product-requirements-A116.csv').open('w',encoding='utf-8-sig',newline='') as f:
 w=csv.DictWriter(f,fieldnames=list(rows[0]));w.writeheader();w.writerows(rows)
assert len(rows)==28 and all(r['Status']=='NOT_VERIFIED' for r in rows)
(out/'verification.json').write_text(json.dumps({'source_files_read':len(records),'requirements':len(rows),'requirements_physically_passed':0,'cad_rerun_this_turn':False,'target_build_rerun_this_turn':False,'external_contact':False,'order_placed':False,'physical_test':False,'manufacturing_release':False},indent=2)+'\n')
print(json.dumps({'source_files_read':len(records),'requirements':len(rows),'output':str(out)},ensure_ascii=False))
