from pathlib import Path
import json,hashlib,zipfile,csv
R=Path(__file__).resolve().parent;B=R.parent;H=B/'engineering_handoff_local';sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest();j=json.loads((R/'checks.json').read_text());a=json.loads((R/'frontend_static_arithmetic.json').read_text())
report=f'''# 灯具跨板检测前端核对及去耦修正 A43

状态：电源板A43原理图/PCB/CAM工程候选，本地ERC0、DRC0、未连线0；原理图一致性仍保留4条旧DNP缺失封装提示。FABRICATION_HOLD，三款产品20项效果验收仍0项实测。

## 更正前序判断

A41/A42仅核对安全板A39时把LED检测上游称为“未绑定/未实现”。本轮读取实际A24电源板原理图、PCB和导出网表发现检测电路已经存在：R7/R8=100k/100k分压，R6=10mR电流分流，U2=INA180A1IDBVR增益20。A24电源J2.1–5与A39安全J3.1–5分别为CTRL_3V3、GND、LED_PWR_PERMIT、LED_V_MON_0_3V、LED_I_MON_0_3V，五对名称和逐脚路径均核对。原本电路“缺失”的判断应改为“跨板检测路径存在，未校准或实机验证”；旧包保留历史记录，当前以本报告为准。

电压路径：VLED_GUARDED→R7/R8分压→电源R9/C11→跨板pin4→安全R13/C4→U1.12/PA5/ADC_IN5。电流路径：VLED_PRE_SENSE→R6→VLED_GUARDED；U2 IN+3/IN-4跨R6、VS5接CTRL_3V3、GND2、OUT1→电源R10/C12→跨板pin5→安全R14/C5→U1.13/PA6/ADC_IN6。这是逐脚电气设计证据，接线线束、供电与读数尚未实测。

## 实际硬件变更

A24网表中U2供电CTRL_3V3上没有本地电容。依据TI INA180数据手册SBOS741H页21/27的电源旁路/布局要求，新增C14=100n X7R16V0603至CTRL_3V3/GND，靠近U2供电脚布置；电容到供电脚路由约3.7mm，新增地平面回流过孔，包括U2地脚附近地过孔。100n为标称值，精确MPN、偏压后有效容量和实测供电噪声仍待验证，不能据此宣称EMC或动态精度合格。

新增1个封装、4条0.25mm走线和4个0.65/0.3mm过孔；原有器件位置/焊盘与所有原走线/过孔保留。KiCad保存仅对R13圆角比例文本作数值舍入、重新排序属性并补隐含MPN字体默认厚度；比较器仅允许这些元数据差异，没有豁免铜箔变化。没有改规则或压掉警告。

## 本地证据与实际边界

- 本轮完整native ERC、重填铜后DRC/未连线、原理图一致性检查及逐脚网表比较通过。4条一致性提示为既有C9/C10/D1/R5 DNP缺失封装，不是安装孔，也不是0条。未放宽规则或新增豁免。
- 配套9层Gerber、分离钻孔和正面贴装坐标已重导出；这些文件仅供工程审查，不授权制造。可运行`sh run_native_checks.sh`，需KiCad10/Python3；核对所需本地库和仅供比较的A24PCB/A39网表包含在包内。
- 电压名义比例0.5；电阻1%组合为0.495–0.505。5V/5.5V算例ADC上端为2.525V/2.7775V。它们是静态情景计算，真实输入范围、VDDA最低值、电源时序/掉电注入与瞬态保护仍不合格声明。
- 电流名义比例0.2V/A；5A算例输出1V、分流压降50mV、耗散0.25W。5A不是已建立整板额定值。TI增益误差条件是Vout0.5至VS-0.5，当前10mR/增益20下名义低于2.5A不在这一项保证区间内，不能把全量程精度一概按增益误差算。数据手册默认12V共模/5V供电/25°C条件下最大输入失调500uV，单独这一项对应50mA等效误差；实际5V共模/3.3V供电还需考虑CMRR/PSRR，不能当作50mA全条件保证，热漂、器件公差、PCB铜压降/Kelvin、输出低端非线性、滤波和ADC误差还需加入。U2共模与供电分开校核，不把0V共模150uV套到5V高侧。
- 100k/100k的50k戴维南源阻抗与两级100n滤波形成慢响应。电源分压→1k/100n→安全1k/100n的名义最慢时间常数为{a['voltage_slowest_pole_ms_nominal']:.5f}ms，五倍约51.25ms；不是单级0.1ms滤波。A42“20ms原始帧新鲜度”只指ADC采集时间，不代表电压已跟上实际负载变化。电源异常授权阈值和延时必须考虑这一模拟动态。
- 安全R10上拉与U1供电同名CTRL_3V3，NTC接安全J4.4/GND可做比例采样；精确NTC曲线、公差、安装/热耦合与温度阈值尚未选定或验证。本轮未用假定B值授予温度合格。

本轮BOM只增1个0603电容，未新增放大器或分压器；单位价格仍空，待工厂报价，不能报作完整千台整机成本。现有ADC诊断固件仍为A42，硬件输出保持关断，温度/供电/驱动健康授权字段仍false。下一步依据本轮实际电路实现VDDA校准与电压/电流诊断换算，再闭合精确NTC、驱动反馈/输出和实机效果验收。未采购、联系供应商、烧录、通电或制造下单。

A43 PCB SHA256 `{j['PCB_sha256']}`；原理图SHA256 `{j['schematic_sha256']}`。安全板配对A39，固件A42。旧A24资料只供比较，不是本轮新CAM。完整三款目标仍包含电磨/吸尘器/美甲灯原产品功能效果、实际负载与结构、整机成本及测试证据，均未被本轮局部native检查替代。
'''
(R/'README.md').write_text(report);(H/'A43-lamp-cross-board-frontend.md').write_text(report)
(R/'source_references.json').write_text(json.dumps({'TI_datasheet':'https://www.ti.com/lit/ds/symlink/ina180.pdf','local_pdf':'TI_INA180_SBOS741H.pdf','sha256':sha(R/'TI_INA180_SBOS741H.pdf'),'used_pages':[4,8,21,27],'scope':'INA180A1 pin mapping/supply/common mode/gain+offset conditions/bypass recommendation; no physical qualification'},indent=2)+'\n')
with (R/'BOM_delta.csv').open('w',newline='') as f:
 w=csv.writer(f);w.writerow(['ref','value','footprint','quantity','exact_MPN','unit_price','status']);w.writerow(['C14','100n X7R16V','Capacitor_SMD:C_0603_1608Metric',1,'','','CANDIDATE_PHYSICAL_NOT_RUN'])
files=[p for p in R.rglob('*') if p.is_file() and p.name!='package.py' and not p.name.startswith('.') and p.suffix not in ['.pyc','.kicad_prl']]
manifest=''.join(f'{sha(p)}  {p.relative_to(R).as_posix()}\n' for p in sorted(files));(H/'A43-SHA256SUMS.txt').write_text(manifest)
z=H/'Lamp-cross-board-frontend-review-A43.zip'
with zipfile.ZipFile(z,'w',zipfile.ZIP_DEFLATED) as a:
 for p in files:a.write(p,p.relative_to(R).as_posix())
 a.writestr('SHA256SUMS.txt',manifest)
with zipfile.ZipFile(z) as a:
 assert a.testzip() is None
 for line in manifest.splitlines():
  digest,name=line.split('  ',1);assert hashlib.sha256(a.read(name)).hexdigest()==digest
 count=len(a.namelist())
ip=H/'LOCAL-PACKAGES.json';idx=json.loads(ip.read_text());idx.update(status=j['status'],latest_report='A43-lamp-cross-board-frontend.md',latest_machine_report='../lamp_frontend_pair_A43/checks.json',latest_manifest='A43-SHA256SUMS.txt')
e={'archive':z.name,'sha256':sha(z),'bytes':z.stat().st_size,'zip_entries':count,'manifest_entries':len(files),'zip_crc':'PASS','manifest_readback':'PASS','manufacturing_status':'FABRICATION_HOLD'}
idx['packages']=[p for p in idx['packages'] if p.get('archive')!=z.name]+[e]
idx['latest_lamp_power_frontend_A43']={'PCB':'../lamp_frontend_pair_A43/power_board/lamp_buck_lmr51450_a4_frontend.kicad_pcb','PCB_sha256':j['PCB_sha256'],'safety_pair':'A39','firmware_pair':'A42 raw ADC only','voltage_nominal_ratio':0.5,'current_nominal_V_per_A':0.2,'ERC':0,'DRC':0,'unconnected_items':0,'DNP_schematic_parity_warnings':4,'physical_test_release':False}
idx['lamp_frontend_status_correction_A43']='A24 already contained LED100k/100k voltage divider and10mR/INA180A1 current frontend; five cross-board pin pairs checked A43. A41/A42 unimplemented wording was incomplete. Paths exist; calibrated firmware+physical validation remain absent. C14 supply bypass added in A43.'
idx['manufacturing_exclusions']['lamp_A43']='A43 supply bypass and cross-board native path checked; 4 existing DNP schematic footprint warnings preserved; actual calibration, sensing dynamics/Kelvin/rail sequencing, whole-system and physical validation remain open; fabrication hold.'
ip.write_text(json.dumps(idx,ensure_ascii=False,indent=2)+'\n');print(json.dumps(e,indent=2))
