← Commit history
README.md+3−1
@@ -6,6 +6,8 @@ The compact R0 prototype target is 5 W, 24 V and 3 A with simultaneous limits; t  The architecture uses an IXTP15N50L2 linear MOSFET, four-terminal 20 mΩ shunt, OPA189 servo, DAC60501 setpoint, INA226 telemetry and STM32G0B1 supervisor. Hardware comparators, an asynchronous fault latch and an external watchdog hold the gate off on faults. Cooling and the complete measurement error budget remain under review. +The [current board model review](docs/board-model-review.md) includes the exported GLB, checked molecule contact map and a top-to-underside clip. Cooling and final molecule registration remain open.+ ## Current evidence  - A 104-component hierarchical schematic passes native KiCad ERC; all 52 intended nets match the native exported netlist.@@ -16,7 +18,7 @@ The architecture uses an IXTP15N50L2 linear MOSFET, four-terminal 20 mΩ shunt, - D1 now uses [SBR10U45SP5-13](https://wiki.adom.inc/adom/sbr10u45sp5-13), with published symbol, footprint and drawing-derived nominal STEP/GLB assets. Its local thermal study excludes Q1 and is not complete assembly acceptance. - The fan has a [component page with GLB motion states](https://wiki.adom.inc/adom/mf40200v1-1000u-g99). Its preview is simulated; shared viewer integration remains proposed. - The [thermal budget](docs/thermal-budget.md) now matches the 55 °C firmware trip ceiling. The earlier 25 W assumption is retained as an unqualified future option; R0 targets 5 W and still requires cooling validation.-- There are 79 unique raw takes, 25 reviewed excerpts and 21 storyboard clips. Failed/static captures remain identified in the shot log; the final narrated 4–5 minute film is unfinished.+- There are 80 unique raw takes, 26 reviewed excerpts and 22 storyboard clips. Failed/static captures remain identified in the shot log; the final narrated 4–5 minute film is unfinished.  Read the [engineering status](docs/status.md), [placement review](docs/placement-review.md), [library review](docs/library-review.md), [cost breakdown](docs/cost/README.md), [firmware/control-panel contract](docs/firmware-contract.md), and [raw clip log](videos/shotlog.json). The [AI Flow report](docs/runs/board-codex-20261007-1749/README.md) records the run. 
docs/board-model-review.mdadded+30
@@ -0,0 +1,30 @@+# Board model review — v85 prototype++The current board preview is a STEP-derived GLB of AIFlow board 21. Its copper and solder-mask checks pass. This is a geometry review, not a fabrication release or complete cooled molecule.++[Watch the actual top-to-underside inspection, 2×](clips/board-glb-review.mp4) · [Download review GLB](../mechanical/v85-review.glb) · [Copper/mask check](../mechanical/v85-glb-check.json)++Native KiCad 10.0.5 exported the saved board with components, tracks, pads, zones, solder mask and silkscreen. The exporter reported six wire self-interference warnings. Independent OpenCascade import found 1,110 solids, all valid, and a valid complete imported shape. This does not prove that no geometry was omitted by the exporter. [Validity check](../mechanical/v85-step-validity.json)++Visual inspection covers the populated top, exposed test points, corner pins and underside. The cooler is absent. Exact cooling hardware, mating plugs, harness and clamp/tool access remain to be assembled and checked.++## Electrical interface++All eleven interface pad identities agree between the saved PCB and the independent netlist. Their converter coordinates also agree relative to MP1. Names include reference designators so multiple ground contacts remain individually addressable.++| Reference | Electrical net | Unique connection name |+|---|---|---|+| J1 | DUT_POS | DUT_POS_J1 |+| J2 | GND | GND_J2 |+| J3 | 5V_AUX | 5V_AUX_J3 |+| J4 | GND | GND_J4 |+| J5 | UART_TX | UART_TX_J5 |+| J6 | UART_RX | UART_RX_J6 |+| J7 | GND | GND_J7 |+| MP1–MP4 | GND | GND_MP1 through GND_MP4 |++UART names are from the load's perspective: TX is its output and RX is its input. Auxiliary power is separate from the DUT. These labels do not establish connector current ratings or electrical qualification.++[Checked map and limitations](../mechanical/v85-interface-check.json) · [Named footprint derivative](../mechanical/v85-named_footprint.json) · [Named symbol derivative](../mechanical/v85-named_symbol.json) · [Reproduce the interface audit](../tools/molecule_interface.py)++The converter's raw outputs are preserved. They use duplicate generic contact names and a simplified symbol representation. Registration/widget compatibility is not validated. The anchoring report also identifies the medium size as an explicit parameter rather than marker-derived. These contract gaps are tracked in [adom/adom-step2glb#25](https://wiki.adom.inc/adom/adom-step2glb/issues/25); they are not silently waived for final molecule publication.
docs/build-clips.md+8
@@ -173,3 +173,11 @@ The raw inventory is now 70 takes, including rejected and static footage; that i ### Native adopted-board review (take 76)  [Normal-speed clip](clips/sbr-native-board-review.mp4): actual KiCad top, oblique and underside views after SBR diode adoption. Full decode and contact-sheet review passed. Cooling assembly is still absent; this is prototype inspection, not fabrication release. Recorder sample-count diagnostics prevent treating video duration as an engineering stopwatch. Inventory: 76 raw takes, including rejected takes, and 23 reviewed excerpts.++## Latest current, dashboard and model excerpts++- [Current-to-thermal transition](clips/current-gate-transition.mp4): actual dashboard advances from step 12 to 13, normal speed.+- [Live cooling preview](clips/live-cooling-dashboard.mp4): no-navigation image/caption update and scroll, 2×. Cooling estimates remain unqualified.+- [Board GLB review](clips/board-glb-review.mp4): actual top, side and underside inspection, 2×. Cooling assembly absent; metadata/export warnings remain open.++Inventory: 80 raw takes (including rejected/static takes), 26 reviewed excerpts, 22 storyboard clips. The final narrated film is not assembled.
docs/clips/board-glb-review.jpgadded
⋯ 1 unchanged line ⋯
docs/clips/board-glb-review.mp4added
⋯ 1 unchanged line ⋯
docs/completion-plan.md+1−1
@@ -6,7 +6,7 @@ The schematic/netlist/BOM and native models now include SBR10U45SP5-13. The v85  Thermal acceptance is still failed. The board-only model injects 5.5 W through Q1’s PCB terminal region and lacks its external case-to-heatsink path; its extreme temperatures are not a prediction of an assembled cooled unit. The actual interface, supported sink/fan mounting, duct pressure/flow and fault behavior require completion. The stock sink envelope clears all 91 fitted models and probe approaches, but this excludes mating connectors and hardware. [Package sensitivity](package-cooling-review.md) · [Fan airflow review](fan-airflow-review.md). -AIFlow 0.1.85 is published and installed with 135 tests passing and verified live image/caption refresh. Fields PR10 remains a separate owner-review change, and the shared runtime is not replaced. There are 79 raw takes, including static/rejected footage, 25 reviewed excerpts and 21 storyboard clips. The latest excerpt records the actual current-to-thermal dashboard transition. The final narrated 4–5 minute film remains unfinished.+AIFlow 0.1.85 is published and installed with 135 tests passing and verified live image/caption refresh. Fields PR10 remains a separate owner-review change, and the shared runtime is not replaced. There are 80 raw takes, including static/rejected footage, 26 reviewed excerpts and 22 storyboard clips. The latest excerpt records the actual current-to-thermal dashboard transition. The final narrated 4–5 minute film remains unfinished.  Next: complete the package/interface/duct cooling design and represent its supported operating/fault cases; then same-input thermal acceptance, Fields/pour walkthroughs, current-board silkscreen/3D review, prototype manufacturing outputs and final video. Physical calibration, safety tests and industrial qualification remain separate from digital design acceptance. No fabrication release, order or flash has occurred. 
docs/cooling-fastener-review.md+2−2
@@ -18,11 +18,11 @@ Boyd recommends 0.452 N·m for the -7 washer, below the transistor's 1.13 N·m m  Next: choose a toleranced sleeve/fastener or insulated clamp that fits the exact tab, preserve the existing PCB drill, then check the assembled screw/head/nut and tooling volumes in CAD. No washer is added to the released BOM by this screen. -[Reproducible dimensional screen](mechanical/cooling-fastener-screen.json). Run `python3 tools/screen_cooling_fasteners.py`.+[Reproducible dimensional screen](../mechanical/cooling-fastener-screen.json). Run `python3 tools/screen_cooling_fasteners.py`.  ## Short-sleeve centering sensitivity -A rigid 2D cylinder model gives 0.176 mm remaining nominal radial clearance at the far side of a 1.40 mm tab with a 2.8448 mm screw, the 0.81 mm sleeve and nominal catalog diameters. Smaller illustrative screw diameters of 2.75 and 2.60 mm reduce this to 0.129 and 0.066 mm. Thus full-depth coverage is not inherently necessary, and this washer remains a candidate. These are sensitivity calculations, not tolerance limits: real thread roots, discontinuous crests, eccentricity, deformation and molding variation are absent. Do not use the result as insulation qualification. [Model and assumptions](mechanical/short-sleeve-sensitivity.json), reproduced with `python3 tools/check_short_sleeve.py`.+A rigid 2D cylinder model gives 0.176 mm remaining nominal radial clearance at the far side of a 1.40 mm tab with a 2.8448 mm screw, the 0.81 mm sleeve and nominal catalog diameters. Smaller illustrative screw diameters of 2.75 and 2.60 mm reduce this to 0.129 and 0.066 mm. Thus full-depth coverage is not inherently necessary, and this washer remains a candidate. These are sensitivity calculations, not tolerance limits: real thread roots, discontinuous crests, eccentricity, deformation and molding variation are absent. Do not use the result as insulation qualification. [Model and assumptions](../mechanical/short-sleeve-sensitivity.json), reproduced with `python3 tools/check_short_sleeve.py`.  ## Nonconductive screw alternative (2026-10-10; not selected) 
docs/status.md+1−1
@@ -6,7 +6,7 @@ The schematic/netlist/BOM and native models now include SBR10U45SP5-13. The v85  Thermal acceptance is still failed. The board-only model injects 5.5 W through Q1’s PCB terminal region and lacks its external case-to-heatsink path; its extreme temperatures are not a prediction of an assembled cooled unit. The actual interface, supported sink/fan mounting, duct pressure/flow and fault behavior require completion. The stock sink envelope clears all 91 fitted models and probe approaches, but this excludes mating connectors and hardware. [Package sensitivity](package-cooling-review.md) · [Fan airflow review](fan-airflow-review.md). -AIFlow 0.1.85 is published and installed with 135 tests passing and verified live image/caption refresh. Fields PR10 remains a separate owner-review change, and the shared runtime is not replaced. There are 79 raw takes, including static/rejected footage, 25 reviewed excerpts and 21 storyboard clips. The latest excerpt records the actual current-to-thermal dashboard transition. The final narrated 4–5 minute film remains unfinished.+AIFlow 0.1.85 is published and installed with 135 tests passing and verified live image/caption refresh. Fields PR10 remains a separate owner-review change, and the shared runtime is not replaced. There are 80 raw takes, including static/rejected footage, 26 reviewed excerpts and 22 storyboard clips. The latest excerpt records the actual current-to-thermal dashboard transition. The final narrated 4–5 minute film remains unfinished.  Next: complete the package/interface/duct cooling design and represent its supported operating/fault cases; then same-input thermal acceptance, Fields/pour walkthroughs, current-board silkscreen/3D review, prototype manufacturing outputs and final video. Physical calibration, safety tests and industrial qualification remain separate from digital design acceptance. No fabrication release, order or flash has occurred. 
mechanical/cooling-680-body-audit.json+1−1
@@ -1,5 +1,5 @@ {-  "boardSha256": "6b705624e4947fd4a33dc22e9e90678a91bac1b48a850afe66f2af689ad7a3e0",+  "boardSha256": "1681eb90e49f4f229afe89bb75ff1738b7503907a52cd174e8b3d64b120082f4",   "method": "Conservative transformed fitted STEP bounding boxes, board XY with Z above top copper; zero local model transforms only",   "sinkEnvelopeMm": [     115.649,
mechanical/cooling-680-screen.json+1−1
@@ -1,7 +1,7 @@ {   "status": "nominal-stock-sink-candidate",   "acceptance": false,-  "boardSha256": "6b705624e4947fd4a33dc22e9e90678a91bac1b48a850afe66f2af689ad7a3e0",+  "boardSha256": "1681eb90e49f4f229afe89bb75ff1738b7503907a52cd174e8b3d64b120082f4",   "mpn": "680-125220",   "manufacturer": "Wakefield Thermal",   "sinkCenterXY": [
mechanical/package-cooling-budget.json+1−1
@@ -1,7 +1,7 @@ {   "status": "sensitivity-only-unqualified",   "acceptance": false,-  "boardSha256": "6b705624e4947fd4a33dc22e9e90678a91bac1b48a850afe66f2af689ad7a3e0",+  "boardSha256": "1681eb90e49f4f229afe89bb75ff1738b7503907a52cd174e8b3d64b120082f4",   "powerW": 5.5,   "ambientC": 40,   "tripC": 55,
mechanical/v85-glb-check.jsonadded+83
@@ -0,0 +1,83 @@+{+ "tool": "adom-aiflow board-glb copper",+ "version": 1,+ "finish": "copper",+ "paste": "none",+ "board": "kicad/adom-custom-electronic-load.kicad_pcb",+ "glb": "mechanical/v85-review.kicad.glb",+ "changes": [+  "pad copper: 1 KiCad pad mesh(es) -> AdomCopperPads",+  "copper: real copper material",+  "soldermask: KiCad mask faces replaced by outline minus the F.Mask / B.Mask apertures",+  "silkscreen: clipped at the mask openings (exposed copper laid over the ink, as the fab prints it)"+ ],+ "silkClip": {+  "F": 241.242+ },+ "pads": 295,+ "exposedPads": 295,+ "barePads": 40,+ "pastePads": {+  "F": 0,+  "B": 0+ },+ "maskOpenings": {+  "F": 291,+  "B": 31+ },+ "out": "mechanical/v85-review.glb",+ "gate": {+  "gate": "adom-aiflow board-glb check",+  "glb": "mechanical/v85-review.glb",+  "board": "kicad/adom-custom-electronic-load.kicad_pcb",+  "finish": "copper",+  "ok": true,+  "errors": [],+  "notes": [+   "mask open at all 295 exposed pad centres"+  ],+  "exposedPads": 295,+  "barePads": [+   "MP2:1:0",+   "J6:1:0",+   "MP3:1:0",+   "MP1:1:0",+   "J10:1:0",+   "J10:2:1",+   "J5:1:0",+   "J2:1:0",+   "J4:1:0",+   "TP13:1:0",+   "J9:1:0",+   "J9:2:1",+   "J9:3:2",+   "MP4:1:0",+   "TP11:1:0",+   "TP6:1:0",+   "TP7:1:0",+   "Q1::0",+   "Q1:1:1",+   "Q1:2:2",+   "Q1:3:3",+   "TP4:1:0",+   "TP3:1:0",+   "J3:1:0",+   "TP2:1:0",+   "TP1:1:0",+   "J11:1:0",+   "J11:2:1",+   "J11:3:2",+   "J11:4:3",+   "J11:5:4",+   "TP9:1:0",+   "J7:1:0",+   "J8::0",+   "J8::1",+   "TP5:1:0",+   "TP10:1:0",+   "TP8:1:0",+   "TP12:1:0",+   "J1:1:0"+  ]+ }+}\ No newline at end of file
mechanical/v85-interface-check.jsonadded+103
@@ -0,0 +1,103 @@+{+  "boardSha256": "1681eb90e49f4f229afe89bb75ff1738b7503907a52cd174e8b3d64b120082f4",+  "interfaceIdentityPassed": true,+  "coordinatesPassed": true,+  "interface": [+    {+      "reference": "J1",+      "name": "DUT_POS_J1",+      "net": "DUT_POS",+      "pin": "1",+      "x": 108.0,+      "y": -100.0+    },+    {+      "reference": "J2",+      "name": "GND_J2",+      "net": "GND",+      "pin": "1",+      "x": 112.0,+      "y": -100.0+    },+    {+      "reference": "J3",+      "name": "5V_AUX_J3",+      "net": "5V_AUX",+      "pin": "1",+      "x": 120.0,+      "y": -100.0+    },+    {+      "reference": "J4",+      "name": "GND_J4",+      "net": "GND",+      "pin": "1",+      "x": 124.0,+      "y": -100.0+    },+    {+      "reference": "J5",+      "name": "UART_TX_J5",+      "net": "UART_TX",+      "pin": "1",+      "x": 136.0,+      "y": -100.0+    },+    {+      "reference": "J6",+      "name": "UART_RX_J6",+      "net": "UART_RX",+      "pin": "1",+      "x": 140.0,+      "y": -100.0+    },+    {+      "reference": "J7",+      "name": "GND_J7",+      "net": "GND",+      "pin": "1",+      "x": 144.0,+      "y": -100.0+    },+    {+      "reference": "MP1",+      "name": "GND_MP1",+      "net": "GND",+      "pin": "1",+      "x": 100.0,+      "y": -100.0+    },+    {+      "reference": "MP2",+      "name": "GND_MP2",+      "net": "GND",+      "pin": "1",+      "x": 160.0,+      "y": -100.0+    },+    {+      "reference": "MP3",+      "name": "GND_MP3",+      "net": "GND",+      "pin": "1",+      "x": 100.0,+      "y": -32.0+    },+    {+      "reference": "MP4",+      "name": "GND_MP4",+      "net": "GND",+      "pin": "1",+      "x": 160.0,+      "y": -32.0+    }+  ],+  "registrationValidated": false,+  "thermalQualified": false,+  "limitations": [+    "Converter symbol elements remain simplified; native widget/import review required.",+    "STEP export has six wire self-interference warnings pending review.",+    "Molecule anchoring reports pin_size_source=param, not markers.",+    "Cooling assembly absent from board GLB."+  ]+}
mechanical/v85-named_footprint.jsonadded+473
@@ -0,0 +1,473 @@+{+  "boardName": "Adom electronic load R0 prototype",+  "originalFilename": "adom-custom-electronic-load.kicad_pcb",+  "generatedAt": "2026-10-10T15:55:07.262Z",+  "boardDimensions": {+    "width": 64,+    "height": 72,+    "bounds": {+      "minX": 98,+      "maxX": 162,+      "minY": -102,+      "maxY": -30+    }+  },+  "originPin": {+    "name": "MachinePinMediumShort",+    "corner": "FL",+    "originalName": "1",+    "elementName": "MP1",+    "globalPosition": {+      "x": 100,+      "y": -100+    }+  },+  "machinePins": [+    {+      "name": "GND_MP1",+      "contactType": "medium_pin_short",+      "corner": "FL",+      "originalName": "1",+      "elementName": "MP1",+      "elementValue": "MachinePinMediumShort",+      "packageName": "Molecule:MachinePinMediumShort",+      "drillDiameter": 1.2,+      "elementRot": "R0",+      "position": {+        "x": 0,+        "y": 0+      },+      "globalPosition": {+        "x": 100,+        "y": -100+      },+      "z": 2.8,+      "netName": "GND",+      "nameResolution": {+        "source": "verified PCB and independent netlist",+        "reason": "unique net plus reference; no duplicate generic contact names"+      }+    },+    {+      "name": "GND_MP2",+      "contactType": "medium_pin_short",+      "corner": "FR",+      "originalName": "1",+      "elementName": "MP2",+      "elementValue": "MachinePinMediumShort",+      "packageName": "Molecule:MachinePinMediumShort",+      "drillDiameter": 1.2,+      "elementRot": "R0",+      "position": {+        "x": 60,+        "y": 0+      },+      "globalPosition": {+        "x": 160,+        "y": -100+      },+      "z": 2.8,+      "netName": "GND",+      "nameResolution": {+        "source": "verified PCB and independent netlist",+        "reason": "unique net plus reference; no duplicate generic contact names"+      }+    },+    {+      "name": "GND_MP4",+      "contactType": "medium_pin_short",+      "corner": "BR",+      "originalName": "1",+      "elementName": "MP4",+      "elementValue": "MachinePinMediumShort",+      "packageName": "Molecule:MachinePinMediumShort",+      "drillDiameter": 1.2,+      "elementRot": "R0",+      "position": {+        "x": 60,+        "y": 68+      },+      "globalPosition": {+        "x": 160,+        "y": -32+      },+      "z": 2.8,+      "netName": "GND",+      "nameResolution": {+        "source": "verified PCB and independent netlist",+        "reason": "unique net plus reference; no duplicate generic contact names"+      }+    },+    {+      "name": "GND_MP3",+      "contactType": "medium_pin_short",+      "corner": "BL",+      "originalName": "1",+      "elementName": "MP3",+      "elementValue": "MachinePinMediumShort",+      "packageName": "Molecule:MachinePinMediumShort",+      "drillDiameter": 1.2,+      "elementRot": "R0",+      "position": {+        "x": 0,+        "y": 68+      },+      "globalPosition": {+        "x": 100,+        "y": -32+      },+      "z": 2.8,+      "netName": "GND",+      "nameResolution": {+        "source": "verified PCB and independent netlist",+        "reason": "unique net plus reference; no duplicate generic contact names"+      }+    }+  ],+  "contacts": [+    {+      "name": "UART_RX_J6",+      "contactType": "medium_contact",+      "nameResolution": {+        "source": "verified PCB and independent netlist",+        "reason": "unique net plus reference; no duplicate generic contact names"+      },+      "originalName": "1",+      "elementName": "J6",+      "elementValue": "MachineContactMedium",+      "packageName": "Molecule:MachineContactMedium",+      "drillDiameter": 0.78,+      "elementRot": "R0",+      "position": {+        "x": 40,+        "y": 0+      },+      "globalPosition": {+        "x": 140,+        "y": -100+      },+      "z": 2.8,+      "netName": "UART_RX"+    },+    {+      "name": "UART_TX_J5",+      "contactType": "medium_contact",+      "nameResolution": {+        "source": "verified PCB and independent netlist",+        "reason": "unique net plus reference; no duplicate generic contact names"+      },+      "originalName": "1",+      "elementName": "J5",+      "elementValue": "MachineContactMedium",+      "packageName": "Molecule:MachineContactMedium",+      "drillDiameter": 0.78,+      "elementRot": "R0",+      "position": {+        "x": 36,+        "y": 0+      },+      "globalPosition": {+        "x": 136,+        "y": -100+      },+      "z": 2.8,+      "netName": "UART_TX"+    },+    {+      "name": "GND_J2",+      "contactType": "medium_contact",+      "nameResolution": {+        "source": "verified PCB and independent netlist",+        "reason": "unique net plus reference; no duplicate generic contact names"+      },+      "originalName": "1",+      "elementName": "J2",+      "elementValue": "MachineContactMedium",+      "packageName": "Molecule:MachineContactMedium",+      "drillDiameter": 0.78,+      "elementRot": "R0",+      "position": {+        "x": 12,+        "y": 0+      },+      "globalPosition": {+        "x": 112,+        "y": -100+      },+      "z": 2.8,+      "netName": "GND"+    },+    {+      "name": "GND_J4",+      "contactType": "medium_contact",+      "nameResolution": {+        "source": "verified PCB and independent netlist",+        "reason": "unique net plus reference; no duplicate generic contact names"+      },+      "originalName": "1",+      "elementName": "J4",+      "elementValue": "MachineContactMedium",+      "packageName": "Molecule:MachineContactMedium",+      "drillDiameter": 0.78,+      "elementRot": "R0",+      "position": {+        "x": 24,+        "y": 0+      },+      "globalPosition": {+        "x": 124,+        "y": -100+      },+      "z": 2.8,+      "netName": "GND"+    },+    {+      "name": "5V_AUX_J3",+      "contactType": "medium_contact",+      "nameResolution": {+        "source": "verified PCB and independent netlist",+        "reason": "unique net plus reference; no duplicate generic contact names"+      },+      "originalName": "1",+      "elementName": "J3",+      "elementValue": "MachineContactMedium",+      "packageName": "Molecule:MachineContactMedium",+      "drillDiameter": 0.78,+      "elementRot": "R0",+      "position": {+        "x": 20,+        "y": 0+      },+      "globalPosition": {+        "x": 120,+        "y": -100+      },+      "z": 2.8,+      "netName": "5V_AUX"+    },+    {+      "name": "GND_J7",+      "contactType": "medium_contact",+      "nameResolution": {+        "source": "verified PCB and independent netlist",+        "reason": "unique net plus reference; no duplicate generic contact names"+      },+      "originalName": "1",+      "elementName": "J7",+      "elementValue": "MachineContactMedium",+      "packageName": "Molecule:MachineContactMedium",+      "drillDiameter": 0.78,+      "elementRot": "R0",+      "position": {+        "x": 44,+        "y": 0+      },+      "globalPosition": {+        "x": 144,+        "y": -100+      },+      "z": 2.8,+      "netName": "GND"+    },+    {+      "name": "DUT_POS_J1",+      "contactType": "medium_contact",+      "nameResolution": {+        "source": "verified PCB and independent netlist",+        "reason": "unique net plus reference; no duplicate generic contact names"+      },+      "originalName": "1",+      "elementName": "J1",+      "elementValue": "MachineContactMedium",+      "packageName": "Molecule:MachineContactMedium",+      "drillDiameter": 0.78,+      "elementRot": "R0",+      "position": {+        "x": 8,+        "y": 0+      },+      "globalPosition": {+        "x": 108,+        "y": -100+      },+      "z": 2.8,+      "netName": "DUT_POS"+    }+  ],+  "testPoints": [+    {+      "name": "SHUNT_N_SENSE",+      "reference": "TP13",+      "size": 1,+      "position": {+        "x": 8,+        "y": 34+      },+      "globalPosition": {+        "x": 108,+        "y": -66+      }+    },+    {+      "name": "GND",+      "reference": "TP11",+      "size": 1,+      "position": {+        "x": 9.6,+        "y": 14.8+      },+      "globalPosition": {+        "x": 109.6,+        "y": -85.2+      }+    },+    {+      "name": "V_GATE",+      "reference": "TP6",+      "size": 1,+      "position": {+        "x": 6.8,+        "y": 17.4+      },+      "globalPosition": {+        "x": 106.8,+        "y": -82.6+      }+    },+    {+      "name": "3V3",+      "reference": "TP7",+      "size": 1,+      "position": {+        "x": 9.6,+        "y": 17.4+      },+      "globalPosition": {+        "x": 109.6,+        "y": -82.6+      }+    },+    {+      "name": "I_SET",+      "reference": "TP4",+      "size": 1,+      "position": {+        "x": 0.8,+        "y": 22.8+      },+      "globalPosition": {+        "x": 100.8,+        "y": -77.2+      }+    },+    {+      "name": "SHUNT_P_SENSE",+      "reference": "TP3",+      "size": 1,+      "position": {+        "x": 9.6,+        "y": 20+      },+      "globalPosition": {+        "x": 109.6,+        "y": -80+      }+    },+    {+      "name": "LOAD_POS",+      "reference": "TP2",+      "size": 1,+      "position": {+        "x": 6.8,+        "y": 20+      },+      "globalPosition": {+        "x": 106.8,+        "y": -80+      }+    },+    {+      "name": "DUT_POS",+      "reference": "TP1",+      "size": 1,+      "position": {+        "x": 4,+        "y": 20+      },+      "globalPosition": {+        "x": 104,+        "y": -80+      }+    },+    {+      "name": "HW_OK",+      "reference": "TP9",+      "size": 1,+      "position": {+        "x": 4,+        "y": 14.8+      },+      "globalPosition": {+        "x": 104,+        "y": -85.2+      }+    },+    {+      "name": "GATE",+      "reference": "TP5",+      "size": 1,+      "position": {+        "x": 4,+        "y": 17.4+      },+      "globalPosition": {+        "x": 104,+        "y": -82.6+      }+    },+    {+      "name": "LATCH_Q",+      "reference": "TP10",+      "size": 1,+      "position": {+        "x": 6.8,+        "y": 14.8+      },+      "globalPosition": {+        "x": 106.8,+        "y": -85.2+      }+    },+    {+      "name": "TEMP_SENSE",+      "reference": "TP8",+      "size": 1,+      "position": {+        "x": 0.8,+        "y": 20+      },+      "globalPosition": {+        "x": 100.8,+        "y": -80+      }+    },+    {+      "name": "FAN_TACH",+      "reference": "TP12",+      "size": 1,+      "position": {+        "x": 4,+        "y": 34+      },+      "globalPosition": {+        "x": 104,+        "y": -66+      }+    }+  ],+  "summary": {+    "totalMachinePins": 4,+    "totalContacts": 7,+    "totalTestPoints": 13+  }+}
mechanical/v85-named_symbol.jsonadded+287
@@ -0,0 +1,287 @@+{+  "symbolName": "Adom electronic load R0 prototype",+  "originalFilename": "adom-custom-electronic-load.kicad_pcb",+  "elements": [+    {+      "type": "footprint",+      "note": "Server-side generation - simplified footprint representation"+    },+    {+      "type": "symbolRectangle",+      "note": "Server-side generation - calculated bounding rectangle"+    },+    {+      "type": "text",+      "text": "Adom electronic load R0 prototype",+      "note": "Server-side generation - symbol name text"+    }+  ],+  "pins": [+    {+      "name": "GND_MP3",+      "edge": "left",+      "position": {+        "x": 0,+        "y": 68+      },+      "orientation": "left",+      "contactType": "medium_pin_short",+      "originalPadDetails": {+        "finalName": "GND_MP3",+        "contactType": "medium_pin_short",+        "elementName": "MP3",+        "padName": "1",+        "packageName": "Molecule:MachinePinMediumShort",+        "x": 0,+        "y": 68,+        "drill": 1.2+      },+      "jumperGroup": null,+      "jumperGroupIndex": null,+      "jumperGroupTotal": null,+      "netName": "GND"+    },+    {+      "name": "GND_MP1",+      "edge": "left",+      "position": {+        "x": 0,+        "y": 0+      },+      "orientation": "left",+      "contactType": "medium_pin_short",+      "originalPadDetails": {+        "finalName": "GND_MP1",+        "contactType": "medium_pin_short",+        "elementName": "MP1",+        "padName": "1",+        "packageName": "Molecule:MachinePinMediumShort",+        "x": 0,+        "y": 0,+        "drill": 1.2+      },+      "jumperGroup": null,+      "jumperGroupIndex": null,+      "jumperGroupTotal": null,+      "netName": "GND"+    },+    {+      "name": "GND_MP4",+      "edge": "right",+      "position": {+        "x": 60,+        "y": 68+      },+      "orientation": "right",+      "contactType": "medium_pin_short",+      "originalPadDetails": {+        "finalName": "GND_MP4",+        "contactType": "medium_pin_short",+        "elementName": "MP4",+        "padName": "1",+        "packageName": "Molecule:MachinePinMediumShort",+        "x": 60,+        "y": 68,+        "drill": 1.2+      },+      "jumperGroup": null,+      "jumperGroupIndex": null,+      "jumperGroupTotal": null,+      "netName": "GND"+    },+    {+      "name": "GND_MP2",+      "edge": "right",+      "position": {+        "x": 60,+        "y": 0+      },+      "orientation": "right",+      "contactType": "medium_pin_short",+      "originalPadDetails": {+        "finalName": "GND_MP2",+        "contactType": "medium_pin_short",+        "elementName": "MP2",+        "padName": "1",+        "packageName": "Molecule:MachinePinMediumShort",+        "x": 60,+        "y": 0,+        "drill": 1.2+      },+      "jumperGroup": null,+      "jumperGroupIndex": null,+      "jumperGroupTotal": null,+      "netName": "GND"+    },+    {+      "name": "DUT_POS_J1",+      "edge": "bottom",+      "position": {+        "x": 8,+        "y": 0+      },+      "orientation": "bottom",+      "contactType": "medium_contact",+      "originalPadDetails": {+        "finalName": "DUT_POS_J1",+        "contactType": "medium_contact",+        "elementName": "J1",+        "padName": "1",+        "packageName": "Molecule:MachineContactMedium",+        "x": 8,+        "y": 0,+        "drill": 0.78+      },+      "jumperGroup": null,+      "jumperGroupIndex": null,+      "jumperGroupTotal": null,+      "netName": "DUT_POS"+    },+    {+      "name": "GND_J2",+      "edge": "bottom",+      "position": {+        "x": 12,+        "y": 0+      },+      "orientation": "bottom",+      "contactType": "medium_contact",+      "originalPadDetails": {+        "finalName": "GND_J2",+        "contactType": "medium_contact",+        "elementName": "J2",+        "padName": "1",+        "packageName": "Molecule:MachineContactMedium",+        "x": 12,+        "y": 0,+        "drill": 0.78+      },+      "jumperGroup": null,+      "jumperGroupIndex": null,+      "jumperGroupTotal": null,+      "netName": "GND"+    },+    {+      "name": "5V_AUX_J3",+      "edge": "bottom",+      "position": {+        "x": 20,+        "y": 0+      },+      "orientation": "bottom",+      "contactType": "medium_contact",+      "originalPadDetails": {+        "finalName": "5V_AUX_J3",+        "contactType": "medium_contact",+        "elementName": "J3",+        "padName": "1",+        "packageName": "Molecule:MachineContactMedium",+        "x": 20,+        "y": 0,+        "drill": 0.78+      },+      "jumperGroup": null,+      "jumperGroupIndex": null,+      "jumperGroupTotal": null,+      "netName": "5V_AUX"+    },+    {+      "name": "GND_J4",+      "edge": "bottom",+      "position": {+        "x": 24,+        "y": 0+      },+      "orientation": "bottom",+      "contactType": "medium_contact",+      "originalPadDetails": {+        "finalName": "GND_J4",+        "contactType": "medium_contact",+        "elementName": "J4",+        "padName": "1",+        "packageName": "Molecule:MachineContactMedium",+        "x": 24,+        "y": 0,+        "drill": 0.78+      },+      "jumperGroup": null,+      "jumperGroupIndex": null,+      "jumperGroupTotal": null,+      "netName": "GND"+    },+    {+      "name": "UART_TX_J5",+      "edge": "bottom",+      "position": {+        "x": 36,+        "y": 0+      },+      "orientation": "bottom",+      "contactType": "medium_contact",+      "originalPadDetails": {+        "finalName": "UART_TX_J5",+        "contactType": "medium_contact",+        "elementName": "J5",+        "padName": "1",+        "packageName": "Molecule:MachineContactMedium",+        "x": 36,+        "y": 0,+        "drill": 0.78+      },+      "jumperGroup": null,+      "jumperGroupIndex": null,+      "jumperGroupTotal": null,+      "netName": "UART_TX"+    },+    {+      "name": "UART_RX_J6",+      "edge": "bottom",+      "position": {+        "x": 40,+        "y": 0+      },+      "orientation": "bottom",+      "contactType": "medium_contact",+      "originalPadDetails": {+        "finalName": "UART_RX_J6",+        "contactType": "medium_contact",+        "elementName": "J6",+        "padName": "1",+        "packageName": "Molecule:MachineContactMedium",+        "x": 40,+        "y": 0,+        "drill": 0.78+      },+      "jumperGroup": null,+      "jumperGroupIndex": null,+      "jumperGroupTotal": null,+      "netName": "UART_RX"+    },+    {+      "name": "GND_J7",+      "edge": "bottom",+      "position": {+        "x": 44,+        "y": 0+      },+      "orientation": "bottom",+      "contactType": "medium_contact",+      "originalPadDetails": {+        "finalName": "GND_J7",+        "contactType": "medium_contact",+        "elementName": "J7",+        "padName": "1",+        "packageName": "Molecule:MachineContactMedium",+        "x": 44,+        "y": 0,+        "drill": 0.78+      },+      "jumperGroup": null,+      "jumperGroupIndex": null,+      "jumperGroupTotal": null,+      "netName": "GND"+    }+  ],+  "generatedAt": "2026-10-10T15:55:07.262Z",+  "method": "server-side"+}
mechanical/v85-review.glbadded
⋯ 1 unchanged line ⋯
mechanical/v85-review.kicad_footprint.jsonadded+1
@@ -0,0 +1 @@+{"boardName": "board", "originalFilename": "board.kicad_pcb", "generatedAt": "2026-10-10T15:55:07.262Z", "boardDimensions": {"width": 64, "height": 72, "bounds": {"minX": 98, "maxX": 162, "minY": -102, "maxY": -30}}, "originPin": {"name": "MachinePinMediumShort", "corner": "FL", "originalName": "1", "elementName": "MP1", "globalPosition": {"x": 100, "y": -100}}, "machinePins": [{"name": "MachinePinMediumShort", "contactType": "medium_pin_short", "corner": "FL", "originalName": "1", "elementName": "MP1", "elementValue": "MachinePinMediumShort", "packageName": "Molecule:MachinePinMediumShort", "drillDiameter": 1.2, "elementRot": "R0", "position": {"x": 0, "y": 0}, "globalPosition": {"x": 100, "y": -100}, "z": 2.8}, {"name": "MachinePinMediumShort", "contactType": "medium_pin_short", "corner": "FR", "originalName": "1", "elementName": "MP2", "elementValue": "MachinePinMediumShort", "packageName": "Molecule:MachinePinMediumShort", "drillDiameter": 1.2, "elementRot": "R0", "position": {"x": 60, "y": 0}, "globalPosition": {"x": 160, "y": -100}, "z": 2.8}, {"name": "MachinePinMediumShort", "contactType": "medium_pin_short", "corner": "BR", "originalName": "1", "elementName": "MP4", "elementValue": "MachinePinMediumShort", "packageName": "Molecule:MachinePinMediumShort", "drillDiameter": 1.2, "elementRot": "R0", "position": {"x": 60, "y": 68}, "globalPosition": {"x": 160, "y": -32}, "z": 2.8}, {"name": "MachinePinMediumShort", "contactType": "medium_pin_short", "corner": "BL", "originalName": "1", "elementName": "MP3", "elementValue": "MachinePinMediumShort", "packageName": "Molecule:MachinePinMediumShort", "drillDiameter": 1.2, "elementRot": "R0", "position": {"x": 0, "y": 68}, "globalPosition": {"x": 100, "y": -32}, "z": 2.8}], "contacts": [{"name": "MachineContactMedium", "contactType": "medium_contact", "nameResolution": {"source": "value", "priority": ["value", "name", "pad.number", "elementName"], "reason": "value field was non-empty and not a known placeholder"}, "originalName": "1", "elementName": "J6", "elementValue": "MachineContactMedium", "packageName": "Molecule:MachineContactMedium", "drillDiameter": 0.78, "elementRot": "R0", "position": {"x": 40, "y": 0}, "globalPosition": {"x": 140, "y": -100}, "z": 2.8}, {"name": "MachineContactMedium", "contactType": "medium_contact", "nameResolution": {"source": "value", "priority": ["value", "name", "pad.number", "elementName"], "reason": "value field was non-empty and not a known placeholder"}, "originalName": "1", "elementName": "J5", "elementValue": "MachineContactMedium", "packageName": "Molecule:MachineContactMedium", "drillDiameter": 0.78, "elementRot": "R0", "position": {"x": 36, "y": 0}, "globalPosition": {"x": 136, "y": -100}, "z": 2.8}, {"name": "MachineContactMedium", "contactType": "medium_contact", "nameResolution": {"source": "value", "priority": ["value", "name", "pad.number", "elementName"], "reason": "value field was non-empty and not a known placeholder"}, "originalName": "1", "elementName": "J2", "elementValue": "MachineContactMedium", "packageName": "Molecule:MachineContactMedium", "drillDiameter": 0.78, "elementRot": "R0", "position": {"x": 12, "y": 0}, "globalPosition": {"x": 112, "y": -100}, "z": 2.8}, {"name": "MachineContactMedium", "contactType": "medium_contact", "nameResolution": {"source": "value", "priority": ["value", "name", "pad.number", "elementName"], "reason": "value field was non-empty and not a known placeholder"}, "originalName": "1", "elementName": "J4", "elementValue": "MachineContactMedium", "packageName": "Molecule:MachineContactMedium", "drillDiameter": 0.78, "elementRot": "R0", "position": {"x": 24, "y": 0}, "globalPosition": {"x": 124, "y": -100}, "z": 2.8}, {"name": "MachineContactMedium", "contactType": "medium_contact", "nameResolution": {"source": "value", "priority": ["value", "name", "pad.number", "elementName"], "reason": "value field was non-empty and not a known placeholder"}, "originalName": "1", "elementName": "J3", "elementValue": "MachineContactMedium", "packageName": "Molecule:MachineContactMedium", "drillDiameter": 0.78, "elementRot": "R0", "position": {"x": 20, "y": 0}, "globalPosition": {"x": 120, "y": -100}, "z": 2.8}, {"name": "MachineContactMedium", "contactType": "medium_contact", "nameResolution": {"source": "value", "priority": ["value", "name", "pad.number", "elementName"], "reason": "value field was non-empty and not a known placeholder"}, "originalName": "1", "elementName": "J7", "elementValue": "MachineContactMedium", "packageName": "Molecule:MachineContactMedium", "drillDiameter": 0.78, "elementRot": "R0", "position": {"x": 44, "y": 0}, "globalPosition": {"x": 144, "y": -100}, "z": 2.8}, {"name": "MachineContactMedium", "contactType": "medium_contact", "nameResolution": {"source": "value", "priority": ["value", "name", "pad.number", "elementName"], "reason": "value field was non-empty and not a known placeholder"}, "originalName": "1", "elementName": "J1", "elementValue": "MachineContactMedium", "packageName": "Molecule:MachineContactMedium", "drillDiameter": 0.78, "elementRot": "R0", "position": {"x": 8, "y": 0}, "globalPosition": {"x": 108, "y": -100}, "z": 2.8}], "testPoints": [{"name": "SHUNT_N_SENSE", "reference": "TP13", "size": 1, "position": {"x": 8, "y": 34}, "globalPosition": {"x": 108, "y": -66}}, {"name": "GND", "reference": "TP11", "size": 1, "position": {"x": 9.6, "y": 14.8}, "globalPosition": {"x": 109.6, "y": -85.2}}, {"name": "V_GATE", "reference": "TP6", "size": 1, "position": {"x": 6.8, "y": 17.4}, "globalPosition": {"x": 106.8, "y": -82.6}}, {"name": "3V3", "reference": "TP7", "size": 1, "position": {"x": 9.6, "y": 17.4}, "globalPosition": {"x": 109.6, "y": -82.6}}, {"name": "I_SET", "reference": "TP4", "size": 1, "position": {"x": 0.8, "y": 22.8}, "globalPosition": {"x": 100.8, "y": -77.2}}, {"name": "SHUNT_P_SENSE", "reference": "TP3", "size": 1, "position": {"x": 9.6, "y": 20}, "globalPosition": {"x": 109.6, "y": -80}}, {"name": "LOAD_POS", "reference": "TP2", "size": 1, "position": {"x": 6.8, "y": 20}, "globalPosition": {"x": 106.8, "y": -80}}, {"name": "DUT_POS", "reference": "TP1", "size": 1, "position": {"x": 4, "y": 20}, "globalPosition": {"x": 104, "y": -80}}, {"name": "HW_OK", "reference": "TP9", "size": 1, "position": {"x": 4, "y": 14.8}, "globalPosition": {"x": 104, "y": -85.2}}, {"name": "GATE", "reference": "TP5", "size": 1, "position": {"x": 4, "y": 17.4}, "globalPosition": {"x": 104, "y": -82.6}}, {"name": "LATCH_Q", "reference": "TP10", "size": 1, "position": {"x": 6.8, "y": 14.8}, "globalPosition": {"x": 106.8, "y": -85.2}}, {"name": "TEMP_SENSE", "reference": "TP8", "size": 1, "position": {"x": 0.8, "y": 20}, "globalPosition": {"x": 100.8, "y": -80}}, {"name": "FAN_TACH", "reference": "TP12", "size": 1, "position": {"x": 4, "y": 34}, "globalPosition": {"x": 104, "y": -66}}], "summary": {"totalMachinePins": 4, "totalContacts": 7, "totalTestPoints": 13}}\ No newline at end of file
mechanical/v85-review.kicad_symbol.jsonadded+1
@@ -0,0 +1 @@+{"symbolName": "board", "originalFilename": "board.kicad_pcb", "elements": [{"type": "footprint", "note": "Server-side generation - simplified footprint representation"}, {"type": "symbolRectangle", "note": "Server-side generation - calculated bounding rectangle"}, {"type": "text", "text": "board", "note": "Server-side generation - symbol name text"}], "pins": [{"name": "MachinePinMediumShort", "edge": "left", "position": {"x": 0, "y": 68}, "orientation": "left", "contactType": "medium_pin_short", "originalPadDetails": {"finalName": "MachinePinMediumShort", "contactType": "medium_pin_short", "elementName": "MP3", "padName": "1", "packageName": "Molecule:MachinePinMediumShort", "x": 0, "y": 68, "drill": 1.2}, "jumperGroup": null, "jumperGroupIndex": null, "jumperGroupTotal": null}, {"name": "MachinePinMediumShort", "edge": "left", "position": {"x": 0, "y": 0}, "orientation": "left", "contactType": "medium_pin_short", "originalPadDetails": {"finalName": "MachinePinMediumShort", "contactType": "medium_pin_short", "elementName": "MP1", "padName": "1", "packageName": "Molecule:MachinePinMediumShort", "x": 0, "y": 0, "drill": 1.2}, "jumperGroup": null, "jumperGroupIndex": null, "jumperGroupTotal": null}, {"name": "MachinePinMediumShort", "edge": "right", "position": {"x": 60, "y": 68}, "orientation": "right", "contactType": "medium_pin_short", "originalPadDetails": {"finalName": "MachinePinMediumShort", "contactType": "medium_pin_short", "elementName": "MP4", "padName": "1", "packageName": "Molecule:MachinePinMediumShort", "x": 60, "y": 68, "drill": 1.2}, "jumperGroup": null, "jumperGroupIndex": null, "jumperGroupTotal": null}, {"name": "MachinePinMediumShort", "edge": "right", "position": {"x": 60, "y": 0}, "orientation": "right", "contactType": "medium_pin_short", "originalPadDetails": {"finalName": "MachinePinMediumShort", "contactType": "medium_pin_short", "elementName": "MP2", "padName": "1", "packageName": "Molecule:MachinePinMediumShort", "x": 60, "y": 0, "drill": 1.2}, "jumperGroup": null, "jumperGroupIndex": null, "jumperGroupTotal": null}, {"name": "MachineContactMedium", "edge": "bottom", "position": {"x": 8, "y": 0}, "orientation": "bottom", "contactType": "medium_contact", "originalPadDetails": {"finalName": "MachineContactMedium", "contactType": "medium_contact", "elementName": "J1", "padName": "1", "packageName": "Molecule:MachineContactMedium", "x": 8, "y": 0, "drill": 0.78}, "jumperGroup": null, "jumperGroupIndex": null, "jumperGroupTotal": null}, {"name": "MachineContactMedium", "edge": "bottom", "position": {"x": 12, "y": 0}, "orientation": "bottom", "contactType": "medium_contact", "originalPadDetails": {"finalName": "MachineContactMedium", "contactType": "medium_contact", "elementName": "J2", "padName": "1", "packageName": "Molecule:MachineContactMedium", "x": 12, "y": 0, "drill": 0.78}, "jumperGroup": null, "jumperGroupIndex": null, "jumperGroupTotal": null}, {"name": "MachineContactMedium", "edge": "bottom", "position": {"x": 20, "y": 0}, "orientation": "bottom", "contactType": "medium_contact", "originalPadDetails": {"finalName": "MachineContactMedium", "contactType": "medium_contact", "elementName": "J3", "padName": "1", "packageName": "Molecule:MachineContactMedium", "x": 20, "y": 0, "drill": 0.78}, "jumperGroup": null, "jumperGroupIndex": null, "jumperGroupTotal": null}, {"name": "MachineContactMedium", "edge": "bottom", "position": {"x": 24, "y": 0}, "orientation": "bottom", "contactType": "medium_contact", "originalPadDetails": {"finalName": "MachineContactMedium", "contactType": "medium_contact", "elementName": "J4", "padName": "1", "packageName": "Molecule:MachineContactMedium", "x": 24, "y": 0, "drill": 0.78}, "jumperGroup": null, "jumperGroupIndex": null, "jumperGroupTotal": null}, {"name": "MachineContactMedium", "edge": "bottom", "position": {"x": 36, "y": 0}, "orientation": "bottom", "contactType": "medium_contact", "originalPadDetails": {"finalName": "MachineContactMedium", "contactType": "medium_contact", "elementName": "J5", "padName": "1", "packageName": "Molecule:MachineContactMedium", "x": 36, "y": 0, "drill": 0.78}, "jumperGroup": null, "jumperGroupIndex": null, "jumperGroupTotal": null}, {"name": "MachineContactMedium", "edge": "bottom", "position": {"x": 40, "y": 0}, "orientation": "bottom", "contactType": "medium_contact", "originalPadDetails": {"finalName": "MachineContactMedium", "contactType": "medium_contact", "elementName": "J6", "padName": "1", "packageName": "Molecule:MachineContactMedium", "x": 40, "y": 0, "drill": 0.78}, "jumperGroup": null, "jumperGroupIndex": null, "jumperGroupTotal": null}, {"name": "MachineContactMedium", "edge": "bottom", "position": {"x": 44, "y": 0}, "orientation": "bottom", "contactType": "medium_contact", "originalPadDetails": {"finalName": "MachineContactMedium", "contactType": "medium_contact", "elementName": "J7", "padName": "1", "packageName": "Molecule:MachineContactMedium", "x": 44, "y": 0, "drill": 0.78}, "jumperGroup": null, "jumperGroupIndex": null, "jumperGroupTotal": null}], "generatedAt": "2026-10-10T15:55:07.262Z", "method": "server-side"}\ No newline at end of file
mechanical/v85-step-validity.jsonadded+9
@@ -0,0 +1,9 @@+{+  "step": "mechanical/v85-mechanical.step",+  "topLevelShapes": 1,+  "solids": 1110,+  "invalidSolids": [],+  "importedShapeValid": true,+  "seconds": 47.87742495536804,+  "limitation": "BREP validity is not proof of export completeness; compare source geometry and warnings separately."+}
page.json+4−5
@@ -3,14 +3,13 @@   "slug": "adom-custom-electronic-load",   "type": "component",   "title": "Adom Custom Electronic Load",-  "brief": "Independent compact digitally controlled load design for 3rdPartyFab; research and AIFlow evidence in progress",+  "brief": "Two-layer programmable load prototype: current screen passes; cooling and molecule integration remain under review.",   "version": "0.1.0",   "kind": "project",   "source": "adom-aiflow",   "hero": {-    "type": "billboard",-    "headline": "Adom Custom Load",-    "subhead": "Compact load PCB in development: precision control, fan cooling and workcell integration"+    "type": "image",+    "path": "docs/clips/board-glb-review.jpg"   },   "author": {     "name": "John Lauer",@@ -39,4 +38,4 @@     "distributor_links": {}   },   "org": "adom"-}\ No newline at end of file+}
tools/molecule_interface.pyadded+75
@@ -0,0 +1,75 @@+#!/usr/bin/env python3+"""Bind converter contact metadata to independently checked PCB/netlist pins.++Preserves raw converter outputs. This checks interface identity/coordinates,+not registration compatibility or thermal readiness.+"""+import copy+import hashlib+import json+from pathlib import Path+import sexp++ROOT = Path(__file__).resolve().parents[1]+BOARD = ROOT / 'kicad/adom-custom-electronic-load.kicad_pcb'++def build():+    board = sexp.parse(BOARD.read_text())+    schematic = {c['ref']: c['pins'] for c in json.loads((ROOT / 'design/netlist.json').read_text())['components']}+    pads = {}+    for fp in sexp.find(board, 'footprint'):+        props = {p[1]: p[2] for p in sexp.find(fp, 'property')}+        ref = props['Reference']+        if ref not in {'J1','J2','J3','J4','J5','J6','J7','MP1','MP2','MP3','MP4'}:+            continue+        at = sexp.first(fp, 'at')+        physical = sexp.find(fp, 'pad')+        assert len(physical) == 1, (ref, 'expected single interface pad')+        pad = physical[0]+        local = sexp.first(pad, 'at')+        assert all(float(v) == 0 for v in local[1:3]), (ref, 'nonzero local pad position')+        net = sexp.first(pad, 'net')[-1]+        assert schematic[ref][str(pad[1])] == net, (ref, 'PCB/netlist mismatch')+        pads[ref] = dict(net=net, pin=str(pad[1]), x=float(at[1]), y=-float(at[2]))+    assert len(pads) == 11+    raw_fp = json.loads((ROOT / 'mechanical/v85-review.kicad_footprint.json').read_text())+    raw_sym = json.loads((ROOT / 'mechanical/v85-review.kicad_symbol.json').read_text())+    fp, sym = copy.deepcopy(raw_fp), copy.deepcopy(raw_sym)+    names = {r: f"{v['net']}_{r}" for r,v in pads.items()}+    seen = set()+    for item in fp['machinePins'] + fp['contacts']:+        ref = item['elementName']; p = pads[ref]+        assert ref not in seen+        seen.add(ref)+        expected = {'x':p['x']-pads['MP1']['x'], 'y':p['y']-pads['MP1']['y']}+        assert all(abs(item['position'][axis]-expected[axis]) < 1e-6 for axis in ['x','y']), ref+        item.update(name=names[ref], netName=p['net'], nameResolution={'source':'verified PCB and independent netlist','reason':'unique net plus reference; no duplicate generic contact names'})+    assert seen == set(pads)+    seen = set()+    for pin in sym['pins']:+        detail = pin['originalPadDetails']; ref = detail['elementName']+        if ref in pads:+            assert ref not in seen+            seen.add(ref)+            pin.update(name=names[ref], netName=pads[ref]['net'])+            detail['finalName'] = names[ref]+    assert seen == set(pads)+    fp['boardName'] = sym['symbolName'] = 'Adom electronic load R0 prototype'+    fp['originalFilename'] = sym['originalFilename'] = BOARD.name+    for element in sym['elements']:+        if element.get('type') == 'text' and element.get('text') == 'board':+            element['text'] = sym['symbolName']+    report = dict(boardSha256=hashlib.sha256(BOARD.read_bytes()).hexdigest(),+                  interfaceIdentityPassed=True, coordinatesPassed=True,+                  interface=[dict(reference=r,name=names[r],**v) for r,v in sorted(pads.items())],+                  registrationValidated=False, thermalQualified=False,+                  limitations=['Converter symbol elements remain simplified; native widget/import review required.',+                               'STEP export has six wire self-interference warnings pending review.',+                               'Molecule anchoring reports pin_size_source=param, not markers.',+                               'Cooling assembly absent from board GLB.'])+    for path, obj in [('mechanical/v85-named_footprint.json',fp),('mechanical/v85-named_symbol.json',sym),('mechanical/v85-interface-check.json',report)]:+        (ROOT/path).write_text(json.dumps(obj,indent=2)+'\n')+    print('PASS: 11 interface pads agree with PCB/netlist and MP1-relative converter coordinates; registration remains unvalidated.')++if __name__ == '__main__':+    build()
videos/build-storyboard.json+6
@@ -126,6 +126,12 @@       "title": "Live cooling comparison",       "description": "Actual preview refresh without navigation at 2x. Calculated interface sensitivity under unverified airflow; not thermal acceptance.",       "raw_path": "/home/adom/project/adom-custom-electronic-load/docs/clips/live-cooling-dashboard.mp4"+    },+    {+      "id": "board-glb-review",+      "title": "Check the digital board from both sides",+      "description": "Actual canonical-viewer inspection at 2x; prototype has no cooling assembly yet. Exposed test points and molecule pins visible. Metadata/export issues remain under review.",+      "raw_path": "/home/adom/project/adom-custom-electronic-load/docs/clips/board-glb-review.mp4"     }   ] }
videos/inventory.json+8−2
@@ -1,6 +1,6 @@ {-  "rawTakeCount": 79,-  "reviewedExcerptCount": 25,+  "rawTakeCount": 80,+  "reviewedExcerptCount": 26,   "countingRule": "Unique raw window recording filenames in this project; excludes derivative action/speed exports and reference projects. Raw count includes rejected takes.",   "takes": [     {@@ -476,6 +476,12 @@       "durationSeconds": 26.6,       "topic": "Live dashboard image/caption update from current results to cooling sensitivity",       "review": "Full decode and contact sheet reviewed. Actual no-navigation preview replacement and eased scroll. Seven-second 2x excerpt; cooling remains unqualified."+    },+    {+      "file": "videos/raw/window-10291968-20261010-160559.mp4",+      "durationSeconds": 13.7,+      "topic": "Actual v85 board GLB top-to-underside inspection",+      "review": "Full decode, contact sheet and excerpt poster reviewed. 2x excerpt. Cooling absent; export and metadata warnings remain open."     }   ] }
videos/shotlog.json+10
@@ -331,6 +331,16 @@       "status": "Full decode and contact sheet reviewed",       "excerpt": "../docs/clips/live-cooling-dashboard.mp4",       "playbackSpeed": 2+    },+    {+      "id": "board-glb-review-80",+      "file": "videos/raw/window-10291968-20261010-160559.mp4",+      "duration_s": 13.7,+      "recordingId": "rec-219f85f9b6f446fe9ad1500156d137c6",+      "topic": "Actual v85 board GLB review",+      "status": "Full decode, contact sheet and excerpt poster reviewed",+      "excerpt": "../docs/clips/board-glb-review.mp4",+      "playbackSpeed": 2     }   ],   "failed_captures": [