abse/smartwatch-flex-top-only

Three-panel flex smartwatch with two parallel R3.9 bends, all components flat-top, low-profile JST connector harnesses, split heartbeat optical windows and screw-retained PCB mounting. Modeled 39 × 50.5 × 14.5mm prototype; 100% routing, zero native DRC and shorts. Hardware qualification pending.

Version
0.2.20
License
unset
Stars
0

scripts/run-electrical-release-audits.py

from pathlib import Path
from concurrent.futures import ThreadPoolExecutor,as_completed
import os,subprocess
root=Path(__file__).resolve().parent.parent
node='/workspace/.cloud-tools/node_modules/.bin/bun';py='/workspace/.cloud-tools/python/bin/python'
cache='routing/final/cache.json';source='dist/index/circuit.json'
jobs=[['scripts/audit-copper.mjs',cache,source,'reports/copper-audit.json'],['scripts/audit-clearance.mjs',cache,source],['scripts/audit-board-edge.mjs',cache,source],['scripts/audit-native-drills.mjs',cache,source,'reports/native-drill-audit.json'],['scripts/audit-thermal-vias.mjs',cache,source],['scripts/audit-flex.mjs',source],['scripts/audit-printed-coil.mjs',source],['scripts/audit-pour-board-edge.py',source,'reports/pour-board-edge-audit.json']]
def run(j):
 p=subprocess.run([py if j[0].endswith('.py') else node,*j],cwd=root,capture_output=True,text=True);(root/f'reports/electrical-fixes/{Path(j[0]).stem}-final.log').write_text(p.stdout+p.stderr);print(j[0],p.returncode,p.stdout[-300:],flush=True);return p.returncode
with ThreadPoolExecutor(max_workers=3) as p:results=[f.result() for f in as_completed([p.submit(run,j) for j in jobs])]
assert not any(results),results