← Commit history
docs/examples/astra-esc-independent/audit_kelvin.pyadded+12
@@ -0,0 +1,12 @@+from geometry import *+s=json.load(open('evidence/final-routing-state.json'));calls=[json.loads(l) for l in open('evidence/calls.jsonl')];commits=[c for c in calls if c['verb']=='kicad_route_net' and not c['args'].get('dryRun') and c['result'].get('success')];zones=json.load(open('outer-pours.json'))+json.load(open('kelvin-pad-keepouts.json'));keep=unary_union([Polygon(z['polygon']) for z in zones if z.get('type')=='keepout']);out={}+for net,ref,shunt,c in [('GND','U6.3','R32.2',commits[0]),('GND_OUT','U6.4','R32.1',commits[1])]:+ ids=set(c['result']['itemIds']);track=unary_union([LineString([list(t['start'].values()),list(t['end'].values())]).buffer(t['width']/2) for t in s['segments'] if t['uuid'] in ids]);p=next(p for p in pads if p['name']==ref);q=next(p for p in pads if p['name']==shunt);protected=track.union(p['g']).difference(q['g']);other=[]+ for t in s['segments']:+  if t['net_name']==net and t['layer']=='F.Cu' and t['uuid'] not in ids:other.append(LineString([list(t['start'].values()),list(t['end'].values())]).buffer(t['width']/2))+ for v in s['vias']:+  if v['net_name']==net:other.append(Point(v['position']['x'],v['position']['y']).buffer(v['size']/2))+ for pad in pads:+  if pad['net']==net and pad['name'] not in [ref,shunt]:other.append(pad['g'])+ hits=protected.intersection(unary_union(other));out[ref]={'net':net,'inputPadOutsideKeepoutMm2':p['g'].difference(keep).area,'protectedTraceOutsideKeepoutMm2':protected.difference(keep).area,'otherSameNetCopperIntersectionMm2':hits.area,'scope':'Exact live trace/via geometry plus input pad shapes and committed keepout outlines. Filled polygons are not exposed by zone_state; no claim of direct filled-polygon intersection measurement.'}+print(json.dumps(out,indent=2));Path('evidence/kelvin-geometry-audit.json').write_text(json.dumps(out,indent=2))
docs/examples/astra-esc-independent/encode_video.py+2−2
@@ -6,8 +6,8 @@ manifest=[];files=[];cursor=0 for i,(name,start,end,title) in enumerate(parts):  src=D/'media'/f'{name}.mp4';dur=float(json.loads(subprocess.check_output(['ffprobe','-v','error','-show_entries','format=duration','-of','json',str(src)]))['format']['duration']);end=end or dur  caption=D/'media'/f'stage-{i}.txt';caption.write_text(title+' | Recorded playback 1x')- dest=D/'media'/f'encoded-{i}.mp4';vf=f"scale=1920:-2,drawbox=x=0:y=0:w=iw:h=36:[email protected]:t=fill,drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:textfile={caption}:fontsize=19:fontcolor=white:x=15:y=7"- cmd=['ffmpeg','-v','warning','-y','-ss',str(start),'-i',str(src),'-t',str(end-start),'-vf',vf,'-c:v','libx264','-preset','fast','-crf','22','-pix_fmt','yuv420p','-fps_mode','vfr','-movflags','+faststart','-an',str(dest)]+ dest=D/'media'/f'encoded-{i}.mp4';vf=f"setpts=PTS-STARTPTS,scale=1920:-2,drawbox=x=0:y=0:w=iw:h=36:[email protected]:t=fill,drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:textfile={caption}:fontsize=19:fontcolor=white:x=15:y=7"+ cmd=['ffmpeg','-v','warning','-y','-ss',str(start),'-i',str(src),'-t',str(end-start),'-vf',vf,'-c:v','libx264','-preset','fast','-crf','22','-pix_fmt','yuv420p','-fps_mode','cfr','-r','30','-video_track_timescale','90000','-movflags','+faststart','-an',str(dest)]  print('encoding',i,name,flush=True);subprocess.run(cmd,check=True);files.append(dest)  manifest.append(dict(source=src.name,sourceStart=start,sourceEnd=end,outputStart=cursor,playbackFactor=1,title=title,command=cmd));cursor+=end-start lst=D/'media/concat.txt';lst.write_text(''.join("file '"+str(p)+"'\n" for p in files));dest=out/'astra-esc-independent.mp4'
docs/examples/astra-esc-independent/evidence/kelvin-geometry-audit.jsonadded+16
@@ -0,0 +1,16 @@+{+  "U6.3": {+    "net": "GND",+    "inputPadOutsideKeepoutMm2": 0.0,+    "protectedTraceOutsideKeepoutMm2": 0.0,+    "otherSameNetCopperIntersectionMm2": 0.0,+    "scope": "Exact live trace/via geometry plus input pad shapes and committed keepout outlines. Filled polygons are not exposed by zone_state; no claim of direct filled-polygon intersection measurement."+  },+  "U6.4": {+    "net": "GND_OUT",+    "inputPadOutsideKeepoutMm2": 0.0,+    "protectedTraceOutsideKeepoutMm2": 0.0,+    "otherSameNetCopperIntersectionMm2": 0.0,+    "scope": "Exact live trace/via geometry plus input pad shapes and committed keepout outlines. Filled polygons are not exposed by zone_state; no claim of direct filled-polygon intersection measurement."+  }+}\ No newline at end of file
package.json+6−4
@@ -4,7 +4,7 @@   "type": "skill",   "title": "EDA Skillpack",   "brief": "All skills for all EDA capabilities across the Adom ecosystem.",-  "version": "0.2.2",+  "version": "0.2.3",   "hero": {     "type": "image",     "path": "docs/hero.png"@@ -55,6 +55,7 @@     "SKILL.md",     "docs/examples/astra-esc-independent/README.md",     "docs/examples/astra-esc-independent/anchor_stitching.py",+    "docs/examples/astra-esc-independent/audit_kelvin.py",     "docs/examples/astra-esc-independent/audit_plan.py",     "docs/examples/astra-esc-independent/bridge.py",     "docs/examples/astra-esc-independent/build_route_input.py",@@ -72,6 +73,7 @@     "docs/examples/astra-esc-independent/evidence/fresh-routing-state.json",     "docs/examples/astra-esc-independent/evidence/fresh-state.json",     "docs/examples/astra-esc-independent/evidence/geometric-audit.json",+    "docs/examples/astra-esc-independent/evidence/kelvin-geometry-audit.json",     "docs/examples/astra-esc-independent/evidence/prompt-clock.json",     "docs/examples/astra-esc-independent/evidence/token-cost.json",     "docs/examples/astra-esc-independent/evidence/zone-baseline.json",@@ -91,6 +93,7 @@     "docs/examples/astra-esc-independent/planner.py",     "docs/examples/astra-esc-independent/repair_fresh.py",     "docs/examples/astra-esc-independent/repair_pours.py",+    "docs/examples/astra-esc-independent/requirements.txt",     "docs/examples/astra-esc-independent/route-input.kicad_pcb",     "docs/examples/astra-esc-independent/route_fresh.py",     "docs/examples/astra-esc-independent/route_search.py",@@ -108,6 +111,7 @@     "docs/examples/fable5-bq25792/evidence/planner-iterations.md",     "docs/examples/fable5-bq25792/evidence/planner-method.md",     "docs/examples/fable5-bq25792/evidence/thermal-comparison.md",+    "docs/hero.png",     "docs/showcase/README.md",     "install.sh",     "references/skill-directory.md",@@ -128,9 +132,7 @@     "skills/eda-pour-planning-measurement/SKILL.md",     "skills/eda-thermal-bottlenecks/SKILL.md",     "skills/eda-visible-routing/SKILL.md",-    "uninstall.sh",-    "docs/hero.png",-    "docs/examples/astra-esc-independent/requirements.txt"+    "uninstall.sh"   ],   "dependencies": {},   "confirmed_user_skills": [
page.json+12−98
@@ -4,7 +4,7 @@   "type": "skill",   "title": "EDA Skillpack",   "brief": "All skills for all EDA capabilities across the Adom ecosystem.",-  "version": "0.2.2",+  "version": "0.2.3",   "hero": {     "type": "image",     "path": "docs/hero.png"@@ -27,7 +27,9 @@     "connectivity"   ],   "license": "proprietary",-  "visibility": "public",+  "visibility": {+    "public": true+  },   "sample_prompts": [     {       "label": "Improve heat spreading",@@ -49,113 +51,25 @@   "sub_skills": [],   "parent_app": null,   "org": "adom",-  "description": "All skills for all EDA capabilities across the Adom ecosystem, for any AI.",+  "description": "All skills for all EDA capabilities across the Adom ecosystem.",   "files": [-    "README.md",     "SKILL.md",-    "docs/examples/astra-esc-independent/README.md",-    "docs/examples/astra-esc-independent/anchor_stitching.py",-    "docs/examples/astra-esc-independent/audit_plan.py",-    "docs/examples/astra-esc-independent/bridge.py",-    "docs/examples/astra-esc-independent/build_route_input.py",-    "docs/examples/astra-esc-independent/component_search.py",-    "docs/examples/astra-esc-independent/encode_video.py",-    "docs/examples/astra-esc-independent/esc-g431-astra-independent.kicad_pcb",-    "docs/examples/astra-esc-independent/evidence/electrical-contract.json",-    "docs/examples/astra-esc-independent/evidence/final-route-dryprobes.json",-    "docs/examples/astra-esc-independent/evidence/final-routing-state.json",-    "docs/examples/astra-esc-independent/evidence/final-validate.json",-    "docs/examples/astra-esc-independent/evidence/final-zone-state.json",-    "docs/examples/astra-esc-independent/evidence/fresh-placement-timing.json",-    "docs/examples/astra-esc-independent/evidence/fresh-placement-validate.json",-    "docs/examples/astra-esc-independent/evidence/fresh-plan.json",-    "docs/examples/astra-esc-independent/evidence/fresh-routing-state.json",-    "docs/examples/astra-esc-independent/evidence/fresh-state.json",-    "docs/examples/astra-esc-independent/evidence/geometric-audit.json",-    "docs/examples/astra-esc-independent/evidence/prompt-clock.json",-    "docs/examples/astra-esc-independent/evidence/token-cost.json",-    "docs/examples/astra-esc-independent/evidence/zone-baseline.json",-    "docs/examples/astra-esc-independent/fixture_geometry.py",-    "docs/examples/astra-esc-independent/fresh_place.py",-    "docs/examples/astra-esc-independent/geometry.py",-    "docs/examples/astra-esc-independent/kelvin-pad-keepouts.json",-    "docs/examples/astra-esc-independent/land_routes.py",-    "docs/examples/astra-esc-independent/land_stitching.py",-    "docs/examples/astra-esc-independent/live-routes.json",-    "docs/examples/astra-esc-independent/negotiate_fresh.py",-    "docs/examples/astra-esc-independent/outer-pours.json",-    "docs/examples/astra-esc-independent/pass2.py",-    "docs/examples/astra-esc-independent/plan_pours.py",-    "docs/examples/astra-esc-independent/plan_stitching.py",-    "docs/examples/astra-esc-independent/planes.json",-    "docs/examples/astra-esc-independent/planner.py",-    "docs/examples/astra-esc-independent/repair_fresh.py",-    "docs/examples/astra-esc-independent/repair_pours.py",-    "docs/examples/astra-esc-independent/route-input.kicad_pcb",-    "docs/examples/astra-esc-independent/route_fresh.py",-    "docs/examples/astra-esc-independent/route_search.py",-    "docs/examples/astra-esc-independent/search2.cpp",-    "docs/examples/astra-esc-independent/search3.cpp",-    "docs/examples/astra-esc-independent/soft3-current.json",-    "docs/examples/astra-esc-independent/soft_search2.py",-    "docs/examples/astra-esc-independent/stitching.json",-    "docs/examples/astra-esc-independent/trim_final.py",-    "docs/examples/astra-esc-independent/widen_fresh.py",-    "docs/examples/astra-esc/README.md",-    "docs/examples/fable5-bq25792/README.md",-    "docs/examples/fable5-bq25792/evidence/REPORT.md",-    "docs/examples/fable5-bq25792/evidence/electrical-review.md",-    "docs/examples/fable5-bq25792/evidence/planner-iterations.md",-    "docs/examples/fable5-bq25792/evidence/planner-method.md",-    "docs/examples/fable5-bq25792/evidence/thermal-comparison.md",-    "docs/showcase/README.md",+    "skills/**",+    "README.md",     "install.sh",-    "references/skill-directory.md",-    "skills/eda-assembly-planning/SKILL.md",-    "skills/eda-board-3d-comparison/SKILL.md",-    "skills/eda-component-placement/SKILL.md",-    "skills/eda-copper-ablation/SKILL.md",-    "skills/eda-design-summary-video/SKILL.md",-    "skills/eda-electrical-routing/SKILL.md",-    "skills/eda-end-to-end-layout/SKILL.md",-    "skills/eda-fine-pitch-fanout/SKILL.md",-    "skills/eda-independent-reroute-comparison/SKILL.md",-    "skills/eda-kelvin-current-sense/SKILL.md",-    "skills/eda-motor-driver-layout/SKILL.md",-    "skills/eda-multilayer-current-review/SKILL.md",-    "skills/eda-native-connectivity-conformance/SKILL.md",-    "skills/eda-placement-routing-review/SKILL.md",-    "skills/eda-pour-planning-measurement/SKILL.md",-    "skills/eda-thermal-bottlenecks/SKILL.md",-    "skills/eda-visible-routing/SKILL.md",     "uninstall.sh",-    "docs/hero.png",-    "docs/examples/astra-esc-independent/requirements.txt"+    "references/**"   ],   "dependencies": {},   "confirmed_user_skills": [-    "eda-assembly-planning",-    "eda-board-3d-comparison",-    "eda-component-placement",-    "eda-copper-ablation",-    "eda-design-summary-video",     "eda-electrical-routing",-    "eda-end-to-end-layout",-    "eda-fine-pitch-fanout",-    "eda-independent-reroute-comparison",-    "eda-kelvin-current-sense",-    "eda-motor-driver-layout",-    "eda-multilayer-current-review",-    "eda-native-connectivity-conformance",-    "eda-placement-routing-review",-    "eda-pour-planning-measurement",     "eda-thermal-bottlenecks",+    "eda-copper-ablation",+    "eda-assembly-planning",     "eda-visible-routing"   ],   "scripts": {     "install": "./install.sh",     "uninstall": "./uninstall.sh"-  },-  "name": "eda-engineering",-  "tag": "latest"-}\ No newline at end of file+  }+}