# 离线只读验证：不访问网络、不操作设备，只读取同目录合成输入。
import json, math, struct, statistics
from pathlib import Path
def check(d):
 ids=[x['id'] for x in d['nodes']]; known=set(ids)
 dup=sorted({x for x in ids if ids.count(x)>1})
 dangling=sorted({x['target'] for x in d['links'] if x['target'] not in known})
 valid=sum(x['point']=='p-run' and x['target'] in known for x in d['links'])
 return dict(duplicate_ids=dup,dangling_targets=dangling,valid_group_bindings=valid)

if __name__=='__main__':
 fixture=json.loads(Path(__file__).with_name('fixture.json').read_text(encoding='utf-8'))
 actual=check(fixture['input'])
 assert actual==fixture['expected'], {'实际':actual,'预期':fixture['expected']}
 print(json.dumps({'状态':'通过','实际':actual,'边界':'仅离线合成样例，现场未测'},ensure_ascii=False))
