project
Adom Custom Electronic Load
Public Made by Adomby adom
Two-layer digitally controlled electronic-load prototype. Compact R11 is under active electrical, cooling and probe-access review; not a manufacturing release.
← Commit history
Record Board34 passive clearance studies and distinguish unscored simulation observations
17 files changed
+1299
docs/completion-plan.md+5docs/status.md+5docs/thermal-interface-alternatives.md+5mechanical/thermal-alternatives/board34-feasibility-review.json+247mechanical/thermal-alternatives/interface-source-conflict.json+28mechanical/thermal-alternatives/passive-sensitivity.json+174mechanical/thermal-alternatives/passive-sensitivity.pngprobing-preview-passive-contact/probing-flow/collide.json+119probing-preview-passive-envelope/probing-flow/collide.json+407probing-preview-passive-rearward/probing-flow/collide.json+113probing-preview-passive-shifted/probing-flow/collide.json+133probing-preview-r9/probing-flow/captures/aux-start.json+1probing-preview-r9/probing-flow/captures/off-state-survey.json+1probing-preview-r9/probing-flow/captures/shutdown.json+1probing-preview-r9/probing-flow/report.md+26tools/build_passive_contact_envelope.py+21tools/passive_cooling_sensitivity.py+13docs/completion-plan.md+5@@ -42,3 +42,8 @@ The prior chronological plan, including superseded Board32 data, is retained in Board34 passive feasibility update: the initial envelope failed with 14 head-collision episodes and three tether snags. The shifted envelope reduced this to one collision at TP16, including the landing, with zero snags; increased travel Z cannot resolve a blocked landing. A rearward envelope is being screened separately. No geometry or thermal credit has been adopted. The isolated 0.2 mm Fields candidate completed with Q1 case rise 12.062 C and junction rise 14.372 C at 5.5 W, D1 rise 28.626 C, using catalog 1.522 K/W sink resistance and assumed contact/pad paths. This is supplied-parameter feasibility only; installed orientation, convection obstruction, contact spread, retention and sensitivity remain unresolved. Evidence: `checkpoints/board34-passive-thermal-candidate/fields/fields.json`.+++The decoded rearward and contact-preserving passive envelopes both pass the full 221.5 s replay (zero head collisions, zero snags). The contact-preserving position is X20–96.0984, Y19–95.2, Z12.85–63.65 mm in assembly coordinates. These remain envelope studies, not adopted assemblies. Summary: `mechanical/thermal-alternatives/board34-feasibility-review.json`. Do not use the earlier rearward bounding-box diagnostic as final evidence.++Probing reporting correction: 3 startup rail expectations are scored against synthetic declared nominal values; the other 17 observations are UNSCORED. None is SPICE or bench circuit acceptance. Source and skill fix in probing draft PR2 through `2f5155f8191465d788c9e89d57cec52588d66f1e`; three focused regression tests pass. Current local captures were regenerated with the corrected task binary; the shared package remains unchanged.
docs/status.md+5@@ -13,3 +13,8 @@ Updated 13 October 2026. **Not released for fabrication.** Board34 is the curren [Completion plan](completion-plan.md) · [Cooling review](side-fan-cooling-review.md) · [Engineering datasheet](project-page/electronic-load-datasheet-r0.pdf) · [Cost limitations](cost/README.md) · [Build clips](build-clips.md). No fabrication, purchase, flashing or YouTube publication has occurred. [Archived Board32 status](status-history-board32.md) is historical evidence only.+++13 October follow-up: isolated passive-heatsink envelope studies found two placements that clear the complete probe route, including one retaining the nominal Q1 contact footprint. The supplied-parameter thermal calculation passes nominally but has insufficient demonstrated margin under changed convection/contact assumptions; no thermal acceptance or assembly adoption follows. The AlN supplier page has a documented 20/25 mm dimension conflict. See [feasibility evidence](../mechanical/thermal-alternatives/board34-feasibility-review.json) and [interface review](thermal-interface-alternatives.md).++The probing simulator now reports three synthetic startup rail checks and 17 unscored observations correctly. A generated value without an expected band is not a passing measurement or circuit prediction. [Current simulated report](../probing-preview-r9/probing-flow/report.md).
docs/thermal-interface-alternatives.md+5@@ -15,3 +15,8 @@ At 5.5 W, 40 °C ambient and the unchanged 55 °C case ceiling, the total case-t Henkel SIL PAD TSP 3500 at 0.254 mm has manufacturer TO-220 reference results of 2.02 K/W at 50 psi and 1.37 K/W at 200 psi. Even the latter gives 55.79 °C in the simple all-heat-through-sink calculation before additional spreading allowance. It is therefore not adopted for this budget. At the nominal contact area, 200 psi would imply about 179 N clamp force; the existing fastener study does not establish that preload. These are reference values dependent on surfaces and pressure, not guaranteed assembly specifications. [Manufacturer technical sheet](https://datasheets.tdx.henkel.com/BERGQUIST-SIL-PAD-TSP-3500-en_GL.pdf). The reproducible pressure sweep is in `checkpoints/board32-interface-alternatives/tsp3500-review.json`. No board, operating limit, or acceptance gate changed.+++## Current supplier-page conflict, checked 13 October 2026++Wakefield’s [178-25-220 product page](https://wakefieldthermal.com/wakefield-thermal-25x14x0-635-to-220-aluminum-nitride-pad-178-25-220/) calls the pad 25 × 14 × 0.635 mm in its title and description, but lists 20 × 14 × 0.635 mm under Product Size. R9 uses the latter as nominal geometry. Neither the outline nor mounting hole can be released from this conflicting text; a controlled drawing or fully documented alternative is still needed. [Recorded discrepancy](../mechanical/thermal-alternatives/interface-source-conflict.json).
mechanical/thermal-alternatives/board34-feasibility-review.jsonadded+247@@ -0,0 +1,247 @@+{+ "status": "unadopted-feasibility-only",+ "boardSha256": "74f8ac20cba6b95db26c40f5369156efec80cb80e35388fe064f6891ff78ff11",+ "studies": [+ {+ "study": "envelope",+ "result": "probing-preview-passive-envelope/probing-flow/collide.json",+ "resultSha256": "d299f53074e8af6eaec5586939b2403b445ab2d790de62ac189b2a493ffd3778",+ "collisions": 14,+ "tetherSnags": 3,+ "summary": "collisions over 221.5 s of the run (14528 poses, the head's real surface vs 365 parts at their real shapes, 4 panel wires and the seated ground pin): 14 collision episode(s); ground wire: 721 solves, 3 snag(s)",+ "inputIdentity": {+ "access": {+ "path": "probing-preview-passive-envelope/probing-flow/access.json",+ "sha256": "0ff02c98bdf58c6ec04c884950ae023e1e90705033b09b8d672327c21c710f68"+ },+ "board": {+ "path": "/home/adom/project/adom-custom-electronic-load/probing-flow/design-candidate/sidefan-dft-r23.kicad_pcb",+ "sha256": "74f8ac20cba6b95db26c40f5369156efec80cb80e35388fe064f6891ff78ff11"+ },+ "decodedAssembly": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-envelope/assembly.plain.glb",+ "sha256": "f6940945f4187c037489286dadbe7a782c2b476e7c6f8081ef08318234b00254"+ },+ "glb": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-envelope/assembly.glb",+ "sha256": "81d0e8609e3c9c6a4b6546efae1c62681446b7cd37315eaef31a7bb56470cec2"+ },+ "head:pincer-jaw-moving": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-jaw-moving/medium.glb",+ "sha256": "878327978fcc1187136d465ff154976c02faf0ad657fabb8ec7d0b673bdc25da"+ },+ "head:pincer-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-module/medium.glb",+ "sha256": "8074d36f3ae76432f078ebbd21aa37f2c250beb4a4f4567ce957a8667c1ab5da"+ },+ "head:pogo-barrel": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-barrel/medium.glb",+ "sha256": "5fe8ef0b97ed93240487d478c27fd29d4e4dcc2206534e05dfb2de245d82d94b"+ },+ "head:pogo-plunger": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-plunger/medium.glb",+ "sha256": "f719802f648b10cd9acefbe3f895ffae20955945fac5cb07f576661ffbaebf33"+ },+ "head:probe-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/probe-module/medium.glb",+ "sha256": "d927438999c0b305d0a05e645261f3010978778f91312e5e09ca25a3b5dff5c8"+ },+ "layout": {+ "path": "probing-preview-passive-envelope/probing-flow/layout.json",+ "sha256": "37b719d1c2922fe2c173e810dd24a0ed59f7f93d3d68b122b23922394127d23c"+ },+ "sequence": {+ "path": "probing-preview-passive-envelope/probing-flow/sequence.json",+ "sha256": "296c16143df224a31069444db43521ec0193906eb33dd555cc07399a51c5cb26"+ },+ "workcell": {+ "path": "probing-preview-passive-envelope/probing-flow/workcell.json",+ "sha256": "f56cfe0557906c0f136f8524dfb0f265d632f993971274c5ddbf12821bbe6e75"+ }+ }+ },+ {+ "study": "shifted",+ "result": "probing-preview-passive-shifted/probing-flow/collide.json",+ "resultSha256": "741ea1c74b33537375286cfc5b3b7e7e2626cc276699b693cff0d980b80b2d4b",+ "collisions": 1,+ "tetherSnags": 0,+ "summary": "collisions over 221.5 s of the run (14528 poses, the head's real surface vs 366 parts at their real shapes, 4 panel wires and the seated ground pin): 1 collision episode(s); ground wire: 721 solves, 0 snag(s)",+ "inputIdentity": {+ "access": {+ "path": "probing-preview-passive-shifted/probing-flow/access.json",+ "sha256": "0ff02c98bdf58c6ec04c884950ae023e1e90705033b09b8d672327c21c710f68"+ },+ "board": {+ "path": "/home/adom/project/adom-custom-electronic-load/probing-flow/design-candidate/sidefan-dft-r23.kicad_pcb",+ "sha256": "74f8ac20cba6b95db26c40f5369156efec80cb80e35388fe064f6891ff78ff11"+ },+ "decodedAssembly": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-shifted-envelope/assembly.plain.glb",+ "sha256": "16b29af4ddf6e676079154abc1255f9c80e1a4479187053b752e1963838c5d64"+ },+ "glb": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-shifted-envelope/assembly.glb",+ "sha256": "8f741d319d9b719ab24a9b15d69b838c16ec868ab27bd52297bc40bddf78ed6d"+ },+ "head:pincer-jaw-moving": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-jaw-moving/medium.glb",+ "sha256": "878327978fcc1187136d465ff154976c02faf0ad657fabb8ec7d0b673bdc25da"+ },+ "head:pincer-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-module/medium.glb",+ "sha256": "8074d36f3ae76432f078ebbd21aa37f2c250beb4a4f4567ce957a8667c1ab5da"+ },+ "head:pogo-barrel": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-barrel/medium.glb",+ "sha256": "5fe8ef0b97ed93240487d478c27fd29d4e4dcc2206534e05dfb2de245d82d94b"+ },+ "head:pogo-plunger": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-plunger/medium.glb",+ "sha256": "f719802f648b10cd9acefbe3f895ffae20955945fac5cb07f576661ffbaebf33"+ },+ "head:probe-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/probe-module/medium.glb",+ "sha256": "d927438999c0b305d0a05e645261f3010978778f91312e5e09ca25a3b5dff5c8"+ },+ "layout": {+ "path": "probing-preview-passive-shifted/probing-flow/layout.json",+ "sha256": "37b719d1c2922fe2c173e810dd24a0ed59f7f93d3d68b122b23922394127d23c"+ },+ "sequence": {+ "path": "probing-preview-passive-shifted/probing-flow/sequence.json",+ "sha256": "296c16143df224a31069444db43521ec0193906eb33dd555cc07399a51c5cb26"+ },+ "workcell": {+ "path": "probing-preview-passive-shifted/probing-flow/workcell.json",+ "sha256": "f56cfe0557906c0f136f8524dfb0f265d632f993971274c5ddbf12821bbe6e75"+ }+ }+ },+ {+ "study": "rearward",+ "result": "probing-preview-passive-rearward/probing-flow/collide.json",+ "resultSha256": "c4d0db956490c9d1a8b3378b06306479b0da57f59d6f4a776aa4a063c80753d9",+ "collisions": 0,+ "tetherSnags": 0,+ "summary": "collisions over 221.5 s of the run (14528 poses, the head's real surface vs 366 parts at their real shapes, 4 panel wires and the seated ground pin): 0 collision episode(s); ground wire: 721 solves, 0 snag(s)",+ "inputIdentity": {+ "access": {+ "path": "probing-preview-passive-rearward/probing-flow/access.json",+ "sha256": "0ff02c98bdf58c6ec04c884950ae023e1e90705033b09b8d672327c21c710f68"+ },+ "board": {+ "path": "/home/adom/project/adom-custom-electronic-load/probing-flow/design-candidate/sidefan-dft-r23.kicad_pcb",+ "sha256": "74f8ac20cba6b95db26c40f5369156efec80cb80e35388fe064f6891ff78ff11"+ },+ "decodedAssembly": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-rearward-envelope/assembly.plain.glb",+ "sha256": "a827c2f13f036127a731f7a946a3fbbd7eae56ab4fea9a54fc02b4d96bcffd5a"+ },+ "glb": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-rearward-envelope/assembly.glb",+ "sha256": "bded8f65b916f87850613f72c263ea0d5f9bebe92742ec5c99276ab5924ecfb6"+ },+ "head:pincer-jaw-moving": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-jaw-moving/medium.glb",+ "sha256": "878327978fcc1187136d465ff154976c02faf0ad657fabb8ec7d0b673bdc25da"+ },+ "head:pincer-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-module/medium.glb",+ "sha256": "8074d36f3ae76432f078ebbd21aa37f2c250beb4a4f4567ce957a8667c1ab5da"+ },+ "head:pogo-barrel": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-barrel/medium.glb",+ "sha256": "5fe8ef0b97ed93240487d478c27fd29d4e4dcc2206534e05dfb2de245d82d94b"+ },+ "head:pogo-plunger": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-plunger/medium.glb",+ "sha256": "f719802f648b10cd9acefbe3f895ffae20955945fac5cb07f576661ffbaebf33"+ },+ "head:probe-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/probe-module/medium.glb",+ "sha256": "d927438999c0b305d0a05e645261f3010978778f91312e5e09ca25a3b5dff5c8"+ },+ "layout": {+ "path": "probing-preview-passive-rearward/probing-flow/layout.json",+ "sha256": "37b719d1c2922fe2c173e810dd24a0ed59f7f93d3d68b122b23922394127d23c"+ },+ "sequence": {+ "path": "probing-preview-passive-rearward/probing-flow/sequence.json",+ "sha256": "296c16143df224a31069444db43521ec0193906eb33dd555cc07399a51c5cb26"+ },+ "workcell": {+ "path": "probing-preview-passive-rearward/probing-flow/workcell.json",+ "sha256": "f56cfe0557906c0f136f8524dfb0f265d632f993971274c5ddbf12821bbe6e75"+ }+ }+ },+ {+ "study": "contact",+ "result": "probing-preview-passive-contact/probing-flow/collide.json",+ "resultSha256": "86c6007b864469cd38c70156242c75c3a599027902c9514c75dbff9dd9a17a43",+ "collisions": 0,+ "tetherSnags": 0,+ "summary": "collisions over 221.5 s of the run (14528 poses, the head's real surface vs 366 parts at their real shapes, 4 panel wires and the seated ground pin): 0 collision episode(s); ground wire: 721 solves, 0 snag(s)",+ "inputIdentity": {+ "access": {+ "path": "probing-preview-passive-contact/probing-flow/access.json",+ "sha256": "0ff02c98bdf58c6ec04c884950ae023e1e90705033b09b8d672327c21c710f68"+ },+ "board": {+ "path": "/home/adom/project/adom-custom-electronic-load/probing-flow/design-candidate/sidefan-dft-r23.kicad_pcb",+ "sha256": "74f8ac20cba6b95db26c40f5369156efec80cb80e35388fe064f6891ff78ff11"+ },+ "decodedAssembly": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-contact-envelope/assembly.plain.glb",+ "sha256": "8afac10dde90917415f5287ca475e90fa2fad0fc46603bf8f8ced5a213e6fd9a"+ },+ "glb": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-contact-envelope/assembly.glb",+ "sha256": "9b31cb96a4303ffe8e1c9b6446a2371122d897165438536ca173162379026f21"+ },+ "head:pincer-jaw-moving": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-jaw-moving/medium.glb",+ "sha256": "878327978fcc1187136d465ff154976c02faf0ad657fabb8ec7d0b673bdc25da"+ },+ "head:pincer-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-module/medium.glb",+ "sha256": "8074d36f3ae76432f078ebbd21aa37f2c250beb4a4f4567ce957a8667c1ab5da"+ },+ "head:pogo-barrel": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-barrel/medium.glb",+ "sha256": "5fe8ef0b97ed93240487d478c27fd29d4e4dcc2206534e05dfb2de245d82d94b"+ },+ "head:pogo-plunger": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-plunger/medium.glb",+ "sha256": "f719802f648b10cd9acefbe3f895ffae20955945fac5cb07f576661ffbaebf33"+ },+ "head:probe-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/probe-module/medium.glb",+ "sha256": "d927438999c0b305d0a05e645261f3010978778f91312e5e09ca25a3b5dff5c8"+ },+ "layout": {+ "path": "probing-preview-passive-contact/probing-flow/layout.json",+ "sha256": "37b719d1c2922fe2c173e810dd24a0ed59f7f93d3d68b122b23922394127d23c"+ },+ "sequence": {+ "path": "probing-preview-passive-contact/probing-flow/sequence.json",+ "sha256": "296c16143df224a31069444db43521ec0193906eb33dd555cc07399a51c5cb26"+ },+ "workcell": {+ "path": "probing-preview-passive-contact/probing-flow/workcell.json",+ "sha256": "f56cfe0557906c0f136f8524dfb0f265d632f993971274c5ddbf12821bbe6e75"+ }+ }+ }+ ],+ "thermalResult": "checkpoints/board34-passive-thermal-candidate/fields/fields.json",+ "thermalAccepted": false,+ "currentAssembly": "mechanical/side-fan-r9/side-fan-assembly.glb",+ "limits": [+ "Original R9 fan is retained as an extra obstacle; relocated fan is only a box. These are not coherent final assemblies.",+ "Rearward/contact positions clear the modeled route; carrier, fan harness, exact sink tooling and contact stack remain design work before adoption.",+ "Catalog natural convection and nominal contact resistance are supplied inputs, not installed qualification.",+ "Manufacturer AlN pad page has contradictory length data and no controlled mounting-hole drawing."+ ]+}
mechanical/thermal-alternatives/interface-source-conflict.jsonadded+28@@ -0,0 +1,28 @@+{+ "status": "unresolved-manufacturer-dimension-conflict",+ "checked": "2026-10-13",+ "mpn": "178-25-220",+ "source": "https://wakefieldthermal.com/wakefield-thermal-25x14x0-635-to-220-aluminum-nitride-pad-178-25-220/",+ "titleSizeMm": [+ 25,+ 14,+ 0.635+ ],+ "specificationSizeMm": [+ 20,+ 14,+ 0.635+ ],+ "r9NominalSizeMm": [+ 20,+ 14,+ 0.635+ ],+ "missing": [+ "controlled outline drawing",+ "mounting hole diameter and position",+ "dimensional tolerances",+ "installed interface resistance and preload"+ ],+ "decision": "Do not claim manufacturer-exact digital twin or released mechanical interface from conflicting web text."+}
mechanical/thermal-alternatives/passive-sensitivity.jsonadded+174@@ -0,0 +1,174 @@+{+ "status": "unadopted-parametric-screen",+ "sourceW": 5.5,+ "ambientC": 40.0,+ "method": "All Q1 heat through sink; no board cooling credit. Multipliers are sensitivity scenarios, not measured tolerances.",+ "nominalKPerW": {+ "caseSink": 0.6727626557059773,+ "junctionCase": 0.42,+ "sinkAmbient": 1.522+ },+ "rows": [+ {+ "sinkMultiplier": 1,+ "contactMultiplier": 1,+ "caseC": 52.071194606382875,+ "junctionC": 54.38119460638288,+ "caseBelow55C": true,+ "conservativePackageRiseBelow15C": true+ },+ {+ "sinkMultiplier": 1,+ "contactMultiplier": 1.25,+ "caseC": 52.99624325797859,+ "junctionC": 55.30624325797859,+ "caseBelow55C": true,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1,+ "contactMultiplier": 1.5,+ "caseC": 53.921291909574315,+ "junctionC": 56.23129190957432,+ "caseBelow55C": true,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1,+ "contactMultiplier": 2,+ "caseC": 55.771389212765754,+ "junctionC": 58.08138921276576,+ "caseBelow55C": false,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.1,+ "contactMultiplier": 1,+ "caseC": 52.908294606382874,+ "junctionC": 55.21829460638288,+ "caseBelow55C": true,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.1,+ "contactMultiplier": 1.25,+ "caseC": 53.8333432579786,+ "junctionC": 56.1433432579786,+ "caseBelow55C": true,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.1,+ "contactMultiplier": 1.5,+ "caseC": 54.758391909574314,+ "junctionC": 57.068391909574316,+ "caseBelow55C": true,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.1,+ "contactMultiplier": 2,+ "caseC": 56.60848921276575,+ "junctionC": 58.91848921276575,+ "caseBelow55C": false,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.2,+ "contactMultiplier": 1,+ "caseC": 53.745394606382874,+ "junctionC": 56.055394606382876,+ "caseBelow55C": true,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.2,+ "contactMultiplier": 1.25,+ "caseC": 54.67044325797859,+ "junctionC": 56.98044325797859,+ "caseBelow55C": true,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.2,+ "contactMultiplier": 1.5,+ "caseC": 55.595491909574314,+ "junctionC": 57.905491909574316,+ "caseBelow55C": false,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.2,+ "contactMultiplier": 2,+ "caseC": 57.44558921276575,+ "junctionC": 59.755589212765756,+ "caseBelow55C": false,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.3,+ "contactMultiplier": 1,+ "caseC": 54.58249460638287,+ "junctionC": 56.892494606382876,+ "caseBelow55C": true,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.3,+ "contactMultiplier": 1.25,+ "caseC": 55.5075432579786,+ "junctionC": 57.8175432579786,+ "caseBelow55C": false,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.3,+ "contactMultiplier": 1.5,+ "caseC": 56.43259190957431,+ "junctionC": 58.742591909574315,+ "caseBelow55C": false,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.3,+ "contactMultiplier": 2,+ "caseC": 58.282689212765746,+ "junctionC": 60.59268921276575,+ "caseBelow55C": false,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.5,+ "contactMultiplier": 1,+ "caseC": 56.25669460638287,+ "junctionC": 58.566694606382875,+ "caseBelow55C": false,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.5,+ "contactMultiplier": 1.25,+ "caseC": 57.181743257978596,+ "junctionC": 59.4917432579786,+ "caseBelow55C": false,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.5,+ "contactMultiplier": 1.5,+ "caseC": 58.10679190957431,+ "junctionC": 60.416791909574314,+ "caseBelow55C": false,+ "conservativePackageRiseBelow15C": false+ },+ {+ "sinkMultiplier": 1.5,+ "contactMultiplier": 2,+ "caseC": 59.95688921276575,+ "junctionC": 62.266889212765754,+ "caseBelow55C": false,+ "conservativePackageRiseBelow15C": false+ }+ ],+ "conclusion": "Nominal passes; +10 percent sink resistance exceeds the strict 15 C package-rise screen. Installed conditions and contact assumptions require resolution before adoption."+}
mechanical/thermal-alternatives/passive-sensitivity.pngadded⋯ 1 unchanged line ⋯
probing-preview-passive-contact/probing-flow/collide.jsonadded+119@@ -0,0 +1,119 @@+{+ "board_top_mm": 5.565,+ "bodies": [+ {+ "anchor": "module",+ "name": "probe module",+ "points": 4956780+ },+ {+ "anchor": "module",+ "name": "pogo barrel",+ "points": 1004+ },+ {+ "anchor": "plunger",+ "name": "pogo plunger",+ "points": 292+ },+ {+ "anchor": "pincer",+ "name": "pincer module",+ "points": 4610241+ },+ {+ "anchor": "jaw",+ "name": "pincer jaw moving",+ "points": 994991+ }+ ],+ "closest": [+ {+ "body": "pincer module",+ "gap_mm": 99.11,+ "part": "a board part at (-57.1, 58.0)",+ "t": 172.54+ },+ {+ "body": "pincer jaw moving",+ "gap_mm": 38.82,+ "part": "a board part at (-48.0, 32.5)",+ "t": 172.54+ },+ {+ "body": "probe module",+ "gap_mm": 9.99,+ "part": "a board part at (-4.0, -10.0)",+ "t": 31.06+ }+ ],+ "collisions": [],+ "dt_s": 0.02,+ "inputIdentity": {+ "access": {+ "path": "probing-preview-passive-contact/probing-flow/access.json",+ "sha256": "0ff02c98bdf58c6ec04c884950ae023e1e90705033b09b8d672327c21c710f68"+ },+ "board": {+ "path": "/home/adom/project/adom-custom-electronic-load/probing-flow/design-candidate/sidefan-dft-r23.kicad_pcb",+ "sha256": "74f8ac20cba6b95db26c40f5369156efec80cb80e35388fe064f6891ff78ff11"+ },+ "decodedAssembly": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-contact-envelope/assembly.plain.glb",+ "sha256": "8afac10dde90917415f5287ca475e90fa2fad0fc46603bf8f8ced5a213e6fd9a"+ },+ "glb": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-contact-envelope/assembly.glb",+ "sha256": "9b31cb96a4303ffe8e1c9b6446a2371122d897165438536ca173162379026f21"+ },+ "head:pincer-jaw-moving": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-jaw-moving/medium.glb",+ "sha256": "878327978fcc1187136d465ff154976c02faf0ad657fabb8ec7d0b673bdc25da"+ },+ "head:pincer-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-module/medium.glb",+ "sha256": "8074d36f3ae76432f078ebbd21aa37f2c250beb4a4f4567ce957a8667c1ab5da"+ },+ "head:pogo-barrel": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-barrel/medium.glb",+ "sha256": "5fe8ef0b97ed93240487d478c27fd29d4e4dcc2206534e05dfb2de245d82d94b"+ },+ "head:pogo-plunger": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-plunger/medium.glb",+ "sha256": "f719802f648b10cd9acefbe3f895ffae20955945fac5cb07f576661ffbaebf33"+ },+ "head:probe-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/probe-module/medium.glb",+ "sha256": "d927438999c0b305d0a05e645261f3010978778f91312e5e09ca25a3b5dff5c8"+ },+ "layout": {+ "path": "probing-preview-passive-contact/probing-flow/layout.json",+ "sha256": "37b719d1c2922fe2c173e810dd24a0ed59f7f93d3d68b122b23922394127d23c"+ },+ "sequence": {+ "path": "probing-preview-passive-contact/probing-flow/sequence.json",+ "sha256": "296c16143df224a31069444db43521ec0193906eb33dd555cc07399a51c5cb26"+ },+ "workcell": {+ "path": "probing-preview-passive-contact/probing-flow/workcell.json",+ "sha256": "f56cfe0557906c0f136f8524dfb0f265d632f993971274c5ddbf12821bbe6e75"+ }+ },+ "panel_wires": 4,+ "part_shapes": "triangles (0.25 mm columns)",+ "parts": 366,+ "problems": [],+ "summary": "collisions over 221.5 s of the run (14528 poses, the head's real surface vs 366 parts at their real shapes, 4 panel wires and the seated ground pin): 0 collision episode(s); ground wire: 721 solves, 0 snag(s)",+ "tether": {+ "rests_on": [+ {+ "from_s": 69.5,+ "part": "a board part at (-57.1, 58.0)",+ "to_s": 69.5+ }+ ],+ "snags": [],+ "solves": 721,+ "worst_clearance_mm": -0.0+ }+}
probing-preview-passive-envelope/probing-flow/collide.jsonadded+407@@ -0,0 +1,407 @@+{+ "board_top_mm": 5.565,+ "bodies": [+ {+ "anchor": "module",+ "name": "probe module",+ "points": 4956780+ },+ {+ "anchor": "module",+ "name": "pogo barrel",+ "points": 1004+ },+ {+ "anchor": "plunger",+ "name": "pogo plunger",+ "points": 292+ },+ {+ "anchor": "pincer",+ "name": "pincer module",+ "points": 4610241+ },+ {+ "anchor": "jaw",+ "name": "pincer jaw moving",+ "points": 994991+ }+ ],+ "closest": [+ {+ "body": "pincer module",+ "gap_mm": 0.0,+ "part": "a board part at (-48.1, 34.0)",+ "t": 172.54+ },+ {+ "body": "pincer jaw moving",+ "gap_mm": 38.82,+ "part": "a board part at (-48.0, 32.5)",+ "t": 172.54+ },+ {+ "body": "probe module",+ "gap_mm": 0.0,+ "part": "a board part at (-48.1, 34.0)",+ "t": 64.14+ }+ ],+ "collisions": [+ {+ "body": "pincer module",+ "depth_mm": 16.03,+ "during": "move to TP7 (3V3)",+ "fix": "the pincer hits a board part at (-48.1, 34.0) while handling the ground pin: the jaws come down beside the pin, so the parts around the GND contact must be lower than the jaw tips' path. Fix in the board flow: move a board part at (-48.1, 34.0) away from the ground contact, or use another free GND contact (plan.ground)",+ "from_s": 26.66,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "aux-start",+ "to_s": 26.71+ },+ {+ "body": "probe module",+ "depth_mm": 51.47,+ "during": "move to TP7 (3V3)",+ "fix": "the probe (probe module) hits a board part at (-48.1, 34.0): raise safe Z in the workcell profile above a board part at (-48.1, 34.0)'s height if it happens while traversing; if it happens while landing on a pad, the pad is too close to a board part at (-48.1, 34.0) for the probe module: move the pad or a board part at (-48.1, 34.0) in the board flow",+ "from_s": 26.85,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "aux-start",+ "to_s": 36.5+ },+ {+ "body": "pogo barrel",+ "depth_mm": 56.73,+ "during": "move to TP7 (3V3)",+ "fix": "the probe (pogo barrel) hits a board part at (-48.1, 34.0): raise safe Z in the workcell profile above a board part at (-48.1, 34.0)'s height if it happens while traversing; if it happens while landing on a pad, the pad is too close to a board part at (-48.1, 34.0) for the probe module: move the pad or a board part at (-48.1, 34.0) in the board flow",+ "from_s": 26.97,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "aux-start",+ "to_s": 36.4+ },+ {+ "body": "pogo plunger",+ "depth_mm": 57.73,+ "during": "move to TP7 (3V3)",+ "fix": "the probe (pogo plunger) hits a board part at (-48.1, 34.0): raise safe Z in the workcell profile above a board part at (-48.1, 34.0)'s height if it happens while traversing; if it happens while landing on a pad, the pad is too close to a board part at (-48.1, 34.0) for the probe module: move the pad or a board part at (-48.1, 34.0) in the board flow",+ "from_s": 26.97,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "aux-start",+ "to_s": 36.39+ },+ {+ "body": "probe module",+ "depth_mm": 51.47,+ "during": "move to TP15 (VREF_2V5)",+ "fix": "the probe (probe module) hits a board part at (-48.1, 34.0): raise safe Z in the workcell profile above a board part at (-48.1, 34.0)'s height if it happens while traversing; if it happens while landing on a pad, the pad is too close to a board part at (-48.1, 34.0) for the probe module: move the pad or a board part at (-48.1, 34.0) in the board flow",+ "from_s": 45.99,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "aux-start",+ "to_s": 164.48+ },+ {+ "body": "pogo barrel",+ "depth_mm": 56.73,+ "during": "move to TP15 (VREF_2V5)",+ "fix": "the probe (pogo barrel) hits a board part at (-48.1, 34.0): raise safe Z in the workcell profile above a board part at (-48.1, 34.0)'s height if it happens while traversing; if it happens while landing on a pad, the pad is too close to a board part at (-48.1, 34.0) for the probe module: move the pad or a board part at (-48.1, 34.0) in the board flow",+ "from_s": 46.04,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "aux-start",+ "to_s": 164.42+ },+ {+ "body": "pogo plunger",+ "depth_mm": 57.73,+ "during": "move to TP15 (VREF_2V5)",+ "fix": "the probe (pogo plunger) hits a board part at (-48.1, 34.0): raise safe Z in the workcell profile above a board part at (-48.1, 34.0)'s height if it happens while traversing; if it happens while landing on a pad, the pad is too close to a board part at (-48.1, 34.0) for the probe module: move the pad or a board part at (-48.1, 34.0) in the board flow",+ "from_s": 46.05,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "aux-start",+ "to_s": 164.42+ },+ {+ "body": "pincer module",+ "depth_mm": 16.03,+ "during": "move to TP16 (BOOST_SW)",+ "fix": "the pincer hits a board part at (-48.1, 34.0) while handling the ground pin: the jaws come down beside the pin, so the parts around the GND contact must be lower than the jaw tips' path. Fix in the board flow: move a board part at (-48.1, 34.0) away from the ground contact, or use another free GND contact (plan.ground)",+ "from_s": 168.84,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "off-state-survey",+ "to_s": 184.17+ },+ {+ "body": "probe module",+ "depth_mm": 38.4,+ "during": "move to TP16 (BOOST_SW)",+ "fix": "the probe (probe module) hits a board part at (-48.1, 34.0): raise safe Z in the workcell profile above a board part at (-48.1, 34.0)'s height if it happens while traversing; if it happens while landing on a pad, the pad is too close to a board part at (-48.1, 34.0) for the probe module: move the pad or a board part at (-48.1, 34.0) in the board flow",+ "from_s": 168.89,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "off-state-survey",+ "to_s": 184.12+ },+ {+ "body": "pincer jaw moving",+ "depth_mm": 15.83,+ "during": "move to TP16 (BOOST_SW)",+ "fix": "the pincer hits a board part at (-48.1, 34.0) while handling the ground pin: the jaws come down beside the pin, so the parts around the GND contact must be lower than the jaw tips' path. Fix in the board flow: move a board part at (-48.1, 34.0) away from the ground contact, or use another free GND contact (plan.ground)",+ "from_s": 168.95,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "off-state-survey",+ "to_s": 184.07+ },+ {+ "body": "probe module",+ "depth_mm": 51.47,+ "during": "move to TP5 (GATE)",+ "fix": "the probe (probe module) hits a board part at (-48.1, 34.0): raise safe Z in the workcell profile above a board part at (-48.1, 34.0)'s height if it happens while traversing; if it happens while landing on a pad, the pad is too close to a board part at (-48.1, 34.0) for the probe module: move the pad or a board part at (-48.1, 34.0) in the board flow",+ "from_s": 188.54,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "shutdown",+ "to_s": 197.42+ },+ {+ "body": "pogo barrel",+ "depth_mm": 56.73,+ "during": "move to TP5 (GATE)",+ "fix": "the probe (pogo barrel) hits a board part at (-48.1, 34.0): raise safe Z in the workcell profile above a board part at (-48.1, 34.0)'s height if it happens while traversing; if it happens while landing on a pad, the pad is too close to a board part at (-48.1, 34.0) for the probe module: move the pad or a board part at (-48.1, 34.0) in the board flow",+ "from_s": 188.61,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "shutdown",+ "to_s": 197.36+ },+ {+ "body": "pogo plunger",+ "depth_mm": 57.73,+ "during": "move to TP5 (GATE)",+ "fix": "the probe (pogo plunger) hits a board part at (-48.1, 34.0): raise safe Z in the workcell profile above a board part at (-48.1, 34.0)'s height if it happens while traversing; if it happens while landing on a pad, the pad is too close to a board part at (-48.1, 34.0) for the probe module: move the pad or a board part at (-48.1, 34.0) in the board flow",+ "from_s": 188.61,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "shutdown",+ "to_s": 197.36+ },+ {+ "body": "pincer module",+ "depth_mm": 13.09,+ "during": "back over J7 to pull the ground pin",+ "fix": "the pincer hits a board part at (-48.1, 34.0) while handling the ground pin: the jaws come down beside the pin, so the parts around the GND contact must be lower than the jaw tips' path. Fix in the board flow: move a board part at (-48.1, 34.0) away from the ground contact, or use another free GND contact (plan.ground)",+ "from_s": 202.19,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 34.0)",+ "test": "shutdown",+ "to_s": 202.23+ }+ ],+ "dt_s": 0.02,+ "inputIdentity": {+ "access": {+ "path": "probing-preview-passive-envelope/probing-flow/access.json",+ "sha256": "0ff02c98bdf58c6ec04c884950ae023e1e90705033b09b8d672327c21c710f68"+ },+ "board": {+ "path": "/home/adom/project/adom-custom-electronic-load/probing-flow/design-candidate/sidefan-dft-r23.kicad_pcb",+ "sha256": "74f8ac20cba6b95db26c40f5369156efec80cb80e35388fe064f6891ff78ff11"+ },+ "decodedAssembly": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-envelope/assembly.plain.glb",+ "sha256": "f6940945f4187c037489286dadbe7a782c2b476e7c6f8081ef08318234b00254"+ },+ "glb": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-envelope/assembly.glb",+ "sha256": "81d0e8609e3c9c6a4b6546efae1c62681446b7cd37315eaef31a7bb56470cec2"+ },+ "head:pincer-jaw-moving": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-jaw-moving/medium.glb",+ "sha256": "878327978fcc1187136d465ff154976c02faf0ad657fabb8ec7d0b673bdc25da"+ },+ "head:pincer-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-module/medium.glb",+ "sha256": "8074d36f3ae76432f078ebbd21aa37f2c250beb4a4f4567ce957a8667c1ab5da"+ },+ "head:pogo-barrel": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-barrel/medium.glb",+ "sha256": "5fe8ef0b97ed93240487d478c27fd29d4e4dcc2206534e05dfb2de245d82d94b"+ },+ "head:pogo-plunger": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-plunger/medium.glb",+ "sha256": "f719802f648b10cd9acefbe3f895ffae20955945fac5cb07f576661ffbaebf33"+ },+ "head:probe-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/probe-module/medium.glb",+ "sha256": "d927438999c0b305d0a05e645261f3010978778f91312e5e09ca25a3b5dff5c8"+ },+ "layout": {+ "path": "probing-preview-passive-envelope/probing-flow/layout.json",+ "sha256": "37b719d1c2922fe2c173e810dd24a0ed59f7f93d3d68b122b23922394127d23c"+ },+ "sequence": {+ "path": "probing-preview-passive-envelope/probing-flow/sequence.json",+ "sha256": "296c16143df224a31069444db43521ec0193906eb33dd555cc07399a51c5cb26"+ },+ "workcell": {+ "path": "probing-preview-passive-envelope/probing-flow/workcell.json",+ "sha256": "f56cfe0557906c0f136f8524dfb0f265d632f993971274c5ddbf12821bbe6e75"+ }+ },+ "panel_wires": 4,+ "part_shapes": "triangles (0.25 mm columns)",+ "parts": 365,+ "problems": [+ "pincer module hits a board part at (-48.1, 34.0), 16.03 mm below its top, at 26.66-26.71 s (aux-start: move to TP7 (3V3))",+ "probe module hits a board part at (-48.1, 34.0), 51.47 mm below its top, at 26.85-36.5 s (aux-start: move to TP7 (3V3))",+ "pogo barrel hits a board part at (-48.1, 34.0), 56.73 mm below its top, at 26.97-36.4 s (aux-start: move to TP7 (3V3))",+ "pogo plunger hits a board part at (-48.1, 34.0), 57.73 mm below its top, at 26.97-36.39 s (aux-start: move to TP7 (3V3))",+ "probe module hits a board part at (-48.1, 34.0), 51.47 mm below its top, at 45.99-164.48 s (aux-start: move to TP15 (VREF_2V5))",+ "pogo barrel hits a board part at (-48.1, 34.0), 56.73 mm below its top, at 46.04-164.42 s (aux-start: move to TP15 (VREF_2V5))",+ "pogo plunger hits a board part at (-48.1, 34.0), 57.73 mm below its top, at 46.05-164.42 s (aux-start: move to TP15 (VREF_2V5))",+ "pincer module hits a board part at (-48.1, 34.0), 16.03 mm below its top, at 168.84-184.17 s (off-state-survey: move to TP16 (BOOST_SW))",+ "probe module hits a board part at (-48.1, 34.0), 38.4 mm below its top, at 168.89-184.12 s (off-state-survey: move to TP16 (BOOST_SW))",+ "pincer jaw moving hits a board part at (-48.1, 34.0), 15.83 mm below its top, at 168.95-184.07 s (off-state-survey: move to TP16 (BOOST_SW))",+ "probe module hits a board part at (-48.1, 34.0), 51.47 mm below its top, at 188.54-197.42 s (shutdown: move to TP5 (GATE))",+ "pogo barrel hits a board part at (-48.1, 34.0), 56.73 mm below its top, at 188.61-197.36 s (shutdown: move to TP5 (GATE))",+ "pogo plunger hits a board part at (-48.1, 34.0), 57.73 mm below its top, at 188.61-197.36 s (shutdown: move to TP5 (GATE))",+ "pincer module hits a board part at (-48.1, 34.0), 13.09 mm below its top, at 202.19-202.23 s (shutdown: back over J7 to pull the ground pin)",+ "the ground wire snags a board part at (-48.1, 34.0) by 0.26 mm at 27.0 s (aux-start)",+ "the ground wire snags a board part at (-48.1, 34.0) by 0.26 mm at 56.0 s (off-state-survey)",+ "the ground wire snags a board part at (-48.1, 34.0) by 0.26 mm at 188.75 s (shutdown)"+ ],+ "summary": "collisions over 221.5 s of the run (14528 poses, the head's real surface vs 365 parts at their real shapes, 4 panel wires and the seated ground pin): 14 collision episode(s); ground wire: 721 solves, 3 snag(s)",+ "tether": {+ "rests_on": [+ {+ "from_s": 27.0,+ "part": "a board part at (-48.1, 34.0)",+ "to_s": 197.25+ }+ ],+ "snags": [+ {+ "depth_mm": 0.26,+ "during": "move to TP7 (3V3)",+ "fix": "the ground wire runs through a board part at (-48.1, 34.0): move the probe's approach, the ground contact, or a board part at (-48.1, 34.0) (board flow)",+ "includedInSolver": true,+ "node": 30,+ "obstacleBoundsMm": [+ [+ 345.8000011444092,+ 331.9999998100102,+ 12.899999591708184+ ],+ [+ 422.0000002235174,+ 408.09839671850204,+ 63.69999711513519+ ]+ ],+ "part": "a board part at (-48.1, 34.0)",+ "pinTopMm": [+ 434.0,+ 352.0,+ 11.547999972768126+ ],+ "probeTipMm": [+ 421.5384790827524,+ 337.0362341935153,+ 20.564999972768128+ ],+ "solverEndResidualMm": 0.0007902373629312705,+ "t": 27.0,+ "test": "aux-start",+ "wirePointMm": [+ 419.9376921801392,+ 336.2361808926446,+ 32.5649507956971+ ]+ },+ {+ "depth_mm": 0.26,+ "during": "Off-state signal survey; capture values without invented pass bands",+ "fix": "the ground wire runs through a board part at (-48.1, 34.0): move the probe's approach, the ground contact, or a board part at (-48.1, 34.0) (board flow)",+ "includedInSolver": true,+ "node": 29,+ "obstacleBoundsMm": [+ [+ 345.8000011444092,+ 331.9999998100102,+ 12.899999591708184+ ],+ [+ 422.0000002235174,+ 408.09839671850204,+ 63.69999711513519+ ]+ ],+ "part": "a board part at (-48.1, 34.0)",+ "pinTopMm": [+ 434.0,+ 352.0,+ 11.547999972768126+ ],+ "probeTipMm": [+ 394.75,+ 340.5,+ 20.564999972768128+ ],+ "solverEndResidualMm": 3.214157174389616,+ "t": 56.0,+ "test": "off-state-survey",+ "wirePointMm": [+ 393.1500168242874,+ 333.9858428256714,+ 32.56500357610728+ ]+ },+ {+ "depth_mm": 0.26,+ "during": "descend to hover",+ "fix": "the ground wire runs through a board part at (-48.1, 34.0): move the probe's approach, the ground contact, or a board part at (-48.1, 34.0) (board flow)",+ "includedInSolver": true,+ "node": 29,+ "obstacleBoundsMm": [+ [+ 345.8000011444092,+ 331.9999998100102,+ 12.899999591708184+ ],+ [+ 422.0000002235174,+ 408.09839671850204,+ 63.69999711513519+ ]+ ],+ "part": "a board part at (-48.1, 34.0)",+ "pinTopMm": [+ 434.0,+ 352.0,+ 11.547999972768126+ ],+ "probeTipMm": [+ 414.6,+ 340.0,+ 20.310223083879038+ ],+ "solverEndResidualMm": 2.9195512247777744,+ "t": 188.75,+ "test": "shutdown",+ "wirePointMm": [+ 413.0000113622918,+ 333.7804487752593,+ 32.31023100749253+ ]+ }+ ],+ "solves": 721,+ "worst_clearance_mm": -3.13+ }+}
probing-preview-passive-rearward/probing-flow/collide.jsonadded+113@@ -0,0 +1,113 @@+{+ "board_top_mm": 5.565,+ "bodies": [+ {+ "anchor": "module",+ "name": "probe module",+ "points": 4956780+ },+ {+ "anchor": "module",+ "name": "pogo barrel",+ "points": 1004+ },+ {+ "anchor": "plunger",+ "name": "pogo plunger",+ "points": 292+ },+ {+ "anchor": "pincer",+ "name": "pincer module",+ "points": 4610241+ },+ {+ "anchor": "jaw",+ "name": "pincer jaw moving",+ "points": 994991+ }+ ],+ "closest": [+ {+ "body": "pincer module",+ "gap_mm": 99.11,+ "part": "a board part at (-63.1, 58.0)",+ "t": 172.54+ },+ {+ "body": "pincer jaw moving",+ "gap_mm": 38.82,+ "part": "a board part at (-48.0, 32.5)",+ "t": 172.54+ },+ {+ "body": "probe module",+ "gap_mm": 9.99,+ "part": "a board part at (-4.0, -10.0)",+ "t": 31.06+ }+ ],+ "collisions": [],+ "dt_s": 0.02,+ "inputIdentity": {+ "access": {+ "path": "probing-preview-passive-rearward/probing-flow/access.json",+ "sha256": "0ff02c98bdf58c6ec04c884950ae023e1e90705033b09b8d672327c21c710f68"+ },+ "board": {+ "path": "/home/adom/project/adom-custom-electronic-load/probing-flow/design-candidate/sidefan-dft-r23.kicad_pcb",+ "sha256": "74f8ac20cba6b95db26c40f5369156efec80cb80e35388fe064f6891ff78ff11"+ },+ "decodedAssembly": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-rearward-envelope/assembly.plain.glb",+ "sha256": "a827c2f13f036127a731f7a946a3fbbd7eae56ab4fea9a54fc02b4d96bcffd5a"+ },+ "glb": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-rearward-envelope/assembly.glb",+ "sha256": "bded8f65b916f87850613f72c263ea0d5f9bebe92742ec5c99276ab5924ecfb6"+ },+ "head:pincer-jaw-moving": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-jaw-moving/medium.glb",+ "sha256": "878327978fcc1187136d465ff154976c02faf0ad657fabb8ec7d0b673bdc25da"+ },+ "head:pincer-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-module/medium.glb",+ "sha256": "8074d36f3ae76432f078ebbd21aa37f2c250beb4a4f4567ce957a8667c1ab5da"+ },+ "head:pogo-barrel": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-barrel/medium.glb",+ "sha256": "5fe8ef0b97ed93240487d478c27fd29d4e4dcc2206534e05dfb2de245d82d94b"+ },+ "head:pogo-plunger": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-plunger/medium.glb",+ "sha256": "f719802f648b10cd9acefbe3f895ffae20955945fac5cb07f576661ffbaebf33"+ },+ "head:probe-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/probe-module/medium.glb",+ "sha256": "d927438999c0b305d0a05e645261f3010978778f91312e5e09ca25a3b5dff5c8"+ },+ "layout": {+ "path": "probing-preview-passive-rearward/probing-flow/layout.json",+ "sha256": "37b719d1c2922fe2c173e810dd24a0ed59f7f93d3d68b122b23922394127d23c"+ },+ "sequence": {+ "path": "probing-preview-passive-rearward/probing-flow/sequence.json",+ "sha256": "296c16143df224a31069444db43521ec0193906eb33dd555cc07399a51c5cb26"+ },+ "workcell": {+ "path": "probing-preview-passive-rearward/probing-flow/workcell.json",+ "sha256": "f56cfe0557906c0f136f8524dfb0f265d632f993971274c5ddbf12821bbe6e75"+ }+ },+ "panel_wires": 4,+ "part_shapes": "triangles (0.25 mm columns)",+ "parts": 366,+ "problems": [],+ "summary": "collisions over 221.5 s of the run (14528 poses, the head's real surface vs 366 parts at their real shapes, 4 panel wires and the seated ground pin): 0 collision episode(s); ground wire: 721 solves, 0 snag(s)",+ "tether": {+ "rests_on": [],+ "snags": [],+ "solves": 721,+ "worst_clearance_mm": -0.0+ }+}
probing-preview-passive-shifted/probing-flow/collide.jsonadded+133@@ -0,0 +1,133 @@+{+ "board_top_mm": 5.565,+ "bodies": [+ {+ "anchor": "module",+ "name": "probe module",+ "points": 4956780+ },+ {+ "anchor": "module",+ "name": "pogo barrel",+ "points": 1004+ },+ {+ "anchor": "plunger",+ "name": "pogo plunger",+ "points": 292+ },+ {+ "anchor": "pincer",+ "name": "pincer module",+ "points": 4610241+ },+ {+ "anchor": "jaw",+ "name": "pincer jaw moving",+ "points": 994991+ }+ ],+ "closest": [+ {+ "body": "pincer module",+ "gap_mm": 63.24,+ "part": "a board part at (-48.1, 58.0)",+ "t": 16.46+ },+ {+ "body": "pincer jaw moving",+ "gap_mm": 38.82,+ "part": "a board part at (-48.0, 32.5)",+ "t": 172.54+ },+ {+ "body": "probe module",+ "gap_mm": 0.0,+ "part": "a board part at (-48.1, 58.0)",+ "t": 176.78+ }+ ],+ "collisions": [+ {+ "body": "probe module",+ "depth_mm": 38.4,+ "during": "move to TP16 (BOOST_SW)",+ "fix": "the probe (probe module) hits a board part at (-48.1, 58.0): raise safe Z in the workcell profile above a board part at (-48.1, 58.0)'s height if it happens while traversing; if it happens while landing on a pad, the pad is too close to a board part at (-48.1, 58.0) for the probe module: move the pad or a board part at (-48.1, 58.0) in the board flow",+ "from_s": 168.89,+ "kind": "part",+ "obstacle": "a board part at (-48.1, 58.0)",+ "test": "off-state-survey",+ "to_s": 184.12+ }+ ],+ "dt_s": 0.02,+ "inputIdentity": {+ "access": {+ "path": "probing-preview-passive-shifted/probing-flow/access.json",+ "sha256": "0ff02c98bdf58c6ec04c884950ae023e1e90705033b09b8d672327c21c710f68"+ },+ "board": {+ "path": "/home/adom/project/adom-custom-electronic-load/probing-flow/design-candidate/sidefan-dft-r23.kicad_pcb",+ "sha256": "74f8ac20cba6b95db26c40f5369156efec80cb80e35388fe064f6891ff78ff11"+ },+ "decodedAssembly": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-shifted-envelope/assembly.plain.glb",+ "sha256": "16b29af4ddf6e676079154abc1255f9c80e1a4479187053b752e1963838c5d64"+ },+ "glb": {+ "path": "/home/adom/project/adom-custom-electronic-load/mechanical/passive-board34-shifted-envelope/assembly.glb",+ "sha256": "8f741d319d9b719ab24a9b15d69b838c16ec868ab27bd52297bc40bddf78ed6d"+ },+ "head:pincer-jaw-moving": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-jaw-moving/medium.glb",+ "sha256": "878327978fcc1187136d465ff154976c02faf0ad657fabb8ec7d0b673bdc25da"+ },+ "head:pincer-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pincer-module/medium.glb",+ "sha256": "8074d36f3ae76432f078ebbd21aa37f2c250beb4a4f4567ce957a8667c1ab5da"+ },+ "head:pogo-barrel": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-barrel/medium.glb",+ "sha256": "5fe8ef0b97ed93240487d478c27fd29d4e4dcc2206534e05dfb2de245d82d94b"+ },+ "head:pogo-plunger": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/pogo-plunger/medium.glb",+ "sha256": "f719802f648b10cd9acefbe3f895ffae20955945fac5cb07f576661ffbaebf33"+ },+ "head:probe-module": {+ "path": "/home/adom/project/load-probing-20261012/twin/v2/probe-module/medium.glb",+ "sha256": "d927438999c0b305d0a05e645261f3010978778f91312e5e09ca25a3b5dff5c8"+ },+ "layout": {+ "path": "probing-preview-passive-shifted/probing-flow/layout.json",+ "sha256": "37b719d1c2922fe2c173e810dd24a0ed59f7f93d3d68b122b23922394127d23c"+ },+ "sequence": {+ "path": "probing-preview-passive-shifted/probing-flow/sequence.json",+ "sha256": "296c16143df224a31069444db43521ec0193906eb33dd555cc07399a51c5cb26"+ },+ "workcell": {+ "path": "probing-preview-passive-shifted/probing-flow/workcell.json",+ "sha256": "f56cfe0557906c0f136f8524dfb0f265d632f993971274c5ddbf12821bbe6e75"+ }+ },+ "panel_wires": 4,+ "part_shapes": "triangles (0.25 mm columns)",+ "parts": 366,+ "problems": [+ "probe module hits a board part at (-48.1, 58.0), 38.4 mm below its top, at 168.89-184.12 s (off-state-survey: move to TP16 (BOOST_SW))"+ ],+ "summary": "collisions over 221.5 s of the run (14528 poses, the head's real surface vs 366 parts at their real shapes, 4 panel wires and the seated ground pin): 1 collision episode(s); ground wire: 721 solves, 0 snag(s)",+ "tether": {+ "rests_on": [+ {+ "from_s": 61.25,+ "part": "a board part at (-48.1, 58.0)",+ "to_s": 184.25+ }+ ],+ "snags": [],+ "solves": 721,+ "worst_clearance_mm": -0.0+ }+}
probing-preview-r9/probing-flow/captures/aux-start.jsonadded+1@@ -0,0 +1 @@+{"kind":"dc","metrics":[{"key":"dc_TP7","label":"TP7 (3V3) DC","measured":3.2641,"model":"stated-voltage-with-synthetic-error","ok":true,"pass":[3.135,3.465],"recorded":false,"refs":{"named":3.3},"unit":"V","vs_spice_pct":null},{"key":"dc_TP14","label":"TP14 (5V_AUX) DC","measured":5.0428,"model":"stated-voltage-with-synthetic-error","ok":true,"pass":[4.85,5.15],"recorded":false,"refs":{"named":5.0},"unit":"V","vs_spice_pct":null},{"key":"dc_TP15","label":"TP15 (VREF_2V5) DC","measured":2.4803,"model":"stated-voltage-with-synthetic-error","ok":true,"pass":[2.375,2.625],"recorded":false,"refs":{"named":2.5},"unit":"V","vs_spice_pct":null}],"name":"Auxiliary startup, load disabled; verify rails and observe fan","source":"simulated","test":"aux-start"}
probing-preview-r9/probing-flow/captures/off-state-survey.jsonadded+1@@ -0,0 +1 @@+{"kind":"dc","metrics":[{"key":"dc_TP13","label":"TP13 (SHUNT_N_SENSE) DC","measured":1.4315,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP6","label":"TP6 (V_GATE) DC","measured":0.2385,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP4","label":"TP4 (I_SET) DC","measured":0.6207,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP3","label":"TP3 (SHUNT_P_SENSE) DC","measured":1.778,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP2","label":"TP2 (LOAD_POS) DC","measured":2.9971,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP1","label":"TP1 (DUT_POS) DC","measured":2.9759,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP9","label":"TP9 (HW_OK) DC","measured":2.012,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP5","label":"TP5 (GATE) DC","measured":1.9253,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP10","label":"TP10 (LATCH_Q) DC","measured":1.3576,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP8","label":"TP8 (TEMP_SENSE) DC","measured":2.6997,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP12","label":"TP12 (FAN_TACH) DC","measured":2.6033,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP14","label":"TP14 (5V_AUX) DC","measured":1.6713,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP16","label":"TP16 (BOOST_SW) DC","measured":2.421,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null}],"name":"Off-state signal survey; capture values without invented pass bands","source":"simulated","test":"off-state-survey"}
probing-preview-r9/probing-flow/captures/shutdown.jsonadded+1@@ -0,0 +1 @@+{"kind":"dc","metrics":[{"key":"dc_TP14","label":"TP14 (5V_AUX) DC","measured":1.6647,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP5","label":"TP5 (GATE) DC","measured":1.9439,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP12","label":"TP12 (FAN_TACH) DC","measured":2.5847,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null},{"key":"dc_TP14","label":"TP14 (5V_AUX) DC","measured":1.6656,"model":"unscored-placeholder-not-circuit-prediction","ok":null,"pass":["record","record"],"recorded":true,"refs":{},"unit":"V","vs_spice_pct":null}],"name":"DUT source off before auxiliary off; authored fan coast-down","source":"simulated","test":"shutdown"}
probing-preview-r9/probing-flow/report.mdadded+26@@ -0,0 +1,26 @@+# Probing report++Board: /home/adom/project/adom-custom-electronic-load/probing-flow/design-candidate/sidefan-dft-r23.kicad_pcb. Workcell: adom-probing-v1.++| Test | Metric | Captured | SPICE | Δ vs SPICE | Pass band | Result | Source |+|---|---|---|---|---|---|---|---|+| Auxiliary startup, load disabled; verify rails and observe fan | TP7 (3V3) DC | 3.2641 V | named 3.3 | n/a | 3.135 to 3.465 | PASS | simulated |+| Auxiliary startup, load disabled; verify rails and observe fan | TP14 (5V_AUX) DC | 5.0428 V | named 5.0 | n/a | 4.85 to 5.15 | PASS | simulated |+| Auxiliary startup, load disabled; verify rails and observe fan | TP15 (VREF_2V5) DC | 2.4803 V | named 2.5 | n/a | 2.375 to 2.625 | PASS | simulated |+| Off-state signal survey; capture values without invented pass bands | TP13 (SHUNT_N_SENSE) DC | 1.4315 V | | n/a | "record" to "record" | UNSCORED | simulated |+| Off-state signal survey; capture values without invented pass bands | TP6 (V_GATE) DC | 0.2385 V | | n/a | "record" to "record" | UNSCORED | simulated |+| Off-state signal survey; capture values without invented pass bands | TP4 (I_SET) DC | 0.6207 V | | n/a | "record" to "record" | UNSCORED | simulated |+| Off-state signal survey; capture values without invented pass bands | TP3 (SHUNT_P_SENSE) DC | 1.778 V | | n/a | "record" to "record" | UNSCORED | simulated |+| Off-state signal survey; capture values without invented pass bands | TP2 (LOAD_POS) DC | 2.9971 V | | n/a | "record" to "record" | UNSCORED | simulated |+| Off-state signal survey; capture values without invented pass bands | TP1 (DUT_POS) DC | 2.9759 V | | n/a | "record" to "record" | UNSCORED | simulated |+| Off-state signal survey; capture values without invented pass bands | TP9 (HW_OK) DC | 2.012 V | | n/a | "record" to "record" | UNSCORED | simulated |+| Off-state signal survey; capture values without invented pass bands | TP5 (GATE) DC | 1.9253 V | | n/a | "record" to "record" | UNSCORED | simulated |+| Off-state signal survey; capture values without invented pass bands | TP10 (LATCH_Q) DC | 1.3576 V | | n/a | "record" to "record" | UNSCORED | simulated |+| Off-state signal survey; capture values without invented pass bands | TP8 (TEMP_SENSE) DC | 2.6997 V | | n/a | "record" to "record" | UNSCORED | simulated |+| Off-state signal survey; capture values without invented pass bands | TP12 (FAN_TACH) DC | 2.6033 V | | n/a | "record" to "record" | UNSCORED | simulated |+| Off-state signal survey; capture values without invented pass bands | TP14 (5V_AUX) DC | 1.6713 V | | n/a | "record" to "record" | UNSCORED | simulated |+| Off-state signal survey; capture values without invented pass bands | TP16 (BOOST_SW) DC | 2.421 V | | n/a | "record" to "record" | UNSCORED | simulated |+| DUT source off before auxiliary off; authored fan coast-down | TP14 (5V_AUX) DC | 1.6647 V | | n/a | "record" to "record" | UNSCORED | simulated |+| DUT source off before auxiliary off; authored fan coast-down | TP5 (GATE) DC | 1.9439 V | | n/a | "record" to "record" | UNSCORED | simulated |+| DUT source off before auxiliary off; authored fan coast-down | TP12 (FAN_TACH) DC | 2.5847 V | | n/a | "record" to "record" | UNSCORED | simulated |+| DUT source off before auxiliary off; authored fan coast-down | TP14 (5V_AUX) DC | 1.6656 V | | n/a | "record" to "record" | UNSCORED | simulated |
tools/build_passive_contact_envelope.pyadded+21@@ -0,0 +1,21 @@+from pathlib import Path+import sys,json,hashlib+R=Path(__file__).resolve().parents[1];sys.path.insert(0,str(R/'tools'))+from glb_shape_helpers import read_glb,write_glb,add_shape+import cadquery as cq+O=R/'mechanical/passive-board34-contact-envelope';O.mkdir(exist_ok=True)+g,b=read_glb(R/'mechanical/side-fan-r9/side-fan-assembly.glb')+removed=[]+for i,n in enumerate(g['nodes']):+ if n.get('name','').startswith('Heatsink.ATS_'):+ removed.append(i);n.pop('mesh',None);n['children']=[]+assert removed+root=len(g['nodes']);g['nodes'].append({'name':'PassiveSink.ClearanceStudy','children':[]});g['scenes'][0]['nodes'].append(root)+lo=(20,19,12.85);hi=(96.0984,95.2,63.65)+s=cq.Workplane('XY').box(*[hi[i]-lo[i] for i in range(3)],centered=(False,False,False)).translate(lo).val()+add_shape(g,b,s,'PassiveSink.125319_3inch_CLEARANCE_ENVELOPE',(.68,.4,.08),root,'Conservative solid envelope only. Original abstraction, not manufacturer CAD. Thermal and support redesign unaccepted.')+fan=cq.Workplane('XY').box(24,48,48,centered=(False,False,False)).translate((104,0,4.6)).val()+add_shape(g,b,fan,'ShiftedFan.ConservativeEnvelope',(.35,.35,.38),root,'Provisional relocated fan/plate envelope. Original fan retained as extra conservative obstacle. Harness and carrier redesign required.')+write_glb(O/'assembly.glb',g,b)+(O/'review.json').write_text(json.dumps({'status':'unadopted-clearance-study','source':'mechanical/passive-assembly-study/vendor-model-review.json','boundsMm':list(lo)+list(hi),'nominalManufacturerEnvelopeMm':[76.0984,76.2,50.8],'nominalMassG':257.7,'existingCarrierNeedsRedesign':True,'thermalCredit':False,'purpose':'Test whether passive sink alternative can clear complete probe route before detailed mechanical redesign','boardSha256':hashlib.sha256((R/'aiflow/run/board-34.kicad_pcb').read_bytes()).hexdigest()},indent=2)+'\n')+print(O/'assembly.glb')
tools/passive_cooling_sensitivity.pyadded+13@@ -0,0 +1,13 @@+"""Conservative steady-state sensitivity; not installed thermal qualification."""+import json+from pathlib import Path+root=Path(__file__).resolve().parents[1]+w=5.5; ambient=40.; rcs=.6727626557059773; rjc=.42; rsa=1.522+rows=[]+for sink_multiplier in [1,1.1,1.2,1.3,1.5]:+ for contact_multiplier in [1,1.25,1.5,2]:+ case=ambient+w*(rsa*sink_multiplier+rcs*contact_multiplier)+ junction=case+w*rjc+ rows.append(dict(sinkMultiplier=sink_multiplier,contactMultiplier=contact_multiplier,caseC=case,junctionC=junction,caseBelow55C=case<=55,conservativePackageRiseBelow15C=junction-ambient<=15))+out={'status':'unadopted-parametric-screen','sourceW':w,'ambientC':ambient,'method':'All Q1 heat through sink; no board cooling credit. Multipliers are sensitivity scenarios, not measured tolerances.','nominalKPerW':{'caseSink':rcs,'junctionCase':rjc,'sinkAmbient':rsa},'rows':rows,'conclusion':'Nominal passes; +10 percent sink resistance exceeds the strict 15 C package-rise screen. Installed conditions and contact assumptions require resolution before adoption.'}+p=root/'mechanical/thermal-alternatives/passive-sensitivity.json';p.write_text(json.dumps(out,indent=2)+'\n');print(p)