MiniPC openEMS engineering candidate — 30 September 2026

DELIVERABLE
Open ../MiniPC_openEMS-review.kicad_pcb with the matching .kicad_pro.
The report is ../output/pdf/MiniPC_openEMS_Report.pdf.
This is a connected engineering candidate, not a fabrication-release board.
The report supersedes the earlier assumed-stackup impedance conclusions.

RUNTIME
Use Python 3.12.14. Do not use the macOS Python 3.9 pcbnew/SWIG module.
The solver interpreter is runtime/venv/bin/python relative to this directory.
The geometry/report interpreter is ../routing-user-spec/venv/bin/python.
openEMS was built locally from the official sources; no upstream source
modifications were required. See build-driver.log and the source build log.
Dependencies installed: Boost, HDF5, CGAL, VTK; TinyXML built by the upstream
build driver. Builds and runs require several GB of disk space.
The GitHub repository omits compiled runtimes. See INSTALL.txt for source pins
and interpreter setup. Geometry/report dependencies are pinned separately.

PROVENANCE
Routing basis: ../MiniPC_engineering-review.kicad_pcb (previous fresh route).
Placed/unrouted source: ../MiniPC.kicad_pcb, unchanged SHA-256:
68e43d32592128b7ec214908cc37b3476c397a4400bafd982d5a3f3d9fe5ad29
Original Altium PCB: used ONLY for layer/material metadata from Board6/Data.
No original trace or via geometry was read into or copied to the new routing.
source-stackup.json is the normalized metadata; altium-stack-metadata.json
retains the selected source fields. Df and solder-mask profile are unknown.
Zero loss tangents in the KiCad project are explicit unknown-data placeholders,
not a material measurement or a production requirement.

REPRODUCE SIMULATIONS
From the MiniPC-motherboard directory, use the following pattern. Each output
directory is separate; existing runs can be inspected without rerunning.

MPLBACKEND=Agg openems-2026-09-30/runtime/venv/bin/python \
  openems-2026-09-30/coupon.py 0.14 0.01 \
  openems-2026-09-30/models/accepted-coupon-140

Retained run matrix (script; width mm; XY/X resolution mm; output label):
coupon.py;            0.15;  0.01;   accepted-coupon-150
coupon-conformal.py;  0.15;  0.01;   coupon-150-conformal
coupon.py;            0.133; 0.01;   accepted-coupon-133
coupon-conformal.py;  0.133; 0.01;   coupon-133-conformal
coupon.py;            0.14;  0.01;   accepted-coupon-140
coupon-zrefine.py;    0.14;  0.01;   accepted-coupon-140-zrefined
coupon-conformal.py;  0.14;  0.01;   coupon-140-conformal
section-graded.py;    0.15;  0.0125; section-150-fine
section-graded.py;    0.14;  0.0125; section-140-fine
section-graded.py;    0.15;  0.01;   section-150-veryfine
section-graded.py;    0.14;  0.01;   section-140-veryfine
power-neck.py;        0.15;  0.02;   power-150
power-neck.py;        0.30;  0.02;   power-300
power-neck.py;        0.30;  0.01;   power-300-refined

Save each run's stdout/stderr to <label>.log in this directory. collect-results.py
requires a recorded -50 dB energy-convergence event and checks outgoing power
and unwanted common-mode incident amplitude. Spectra cover 2.5–7.5 GHz only.
The output is a balanced-excitation response column, not a full 4-port matrix.
Lumped launch fixtures are included, not de-embedded. PEC/lossless models
cannot predict actual dissipative channel loss or DC rail voltage drop.

The original coupon port experiment failed power-balance checks and is rejected.
The installation smoke test is not an accepted engineering simulation.
Older coarse/asymmetric-grid experiments remain available for diagnostics but
are not included in accepted-results.json. The model matrix above is canonical.
Do not rerun revise-coupon.py, refine-models.py or final-coupon-mesh.py; those are
historical editing helpers. Use the final standalone simulation scripts.

PCB CHANGES AND CHECKS
apply-layout.py generates the candidate from the preserved preceding candidate.
It alters only the listed trace widths and adds recovered stackup/project settings.
Native KiCad refill is necessary afterward. It may require macOS application
permissions outside a command sandbox. Run from MiniPC-motherboard:

routing-user-spec/venv/bin/python openems-2026-09-30/apply-layout.py
/Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli pcb drc \
  --refill-zones --save-board --format json \
  --output MiniPC_openEMS-review-drc.json MiniPC_openEMS-review.kicad_pcb
routing-user-spec/venv/bin/python routing-user-spec/audit-board.py \
  MiniPC_openEMS-review.kicad_pcb --reference=MiniPC_engineering-review.kicad_pcb
routing-user-spec/venv/bin/python routing-fresh/publish-checkpoint.py \
  MiniPC_openEMS-review.kicad_pcb --check-only \
  --baseline=routing-user-spec/baseline-user-rules-drc.json \
  --rules=routing-user-spec/manufacturing-rules.json

The comparison baseline-current-drc.json was generated from the unchanged
MiniPC_engineering-review board in the same root-folder library environment.
The candidate and baseline both retain 1260 reported findings and no unconnected
items. No new copper/drill/edge/thermal findings were added. The 199-item capped
mask-bridge sample changed among unchanged footprint pads; raw sample differences
are retained in drc-comparison.json. No violations were suppressed.

REPORT
routing-user-spec/venv/bin/python openems-2026-09-30/collect-results.py
MPLBACKEND=Agg openems-2026-09-30/runtime/venv/bin/python \
  openems-2026-09-30/plot-results.py
routing-user-spec/venv/bin/python openems-2026-09-30/build-report.py

Run verify-final.py after audit-board.py to compare the saved routing and DRC.
Then use package-results.py to build the review ZIP; it excludes installed runtimes
and earlier source boards. The separate GitHub repository includes the placed
source, preceding candidate, schematics, obstacle and cutout inputs needed for
these final edits. It does not reproduce every historical autorouter experiment.

CONVERSATION IMAGES
../conversation contains clearly labeled rendered excerpts and exact text.
These are user-approved transcript images, not screenshots of the application.

Inspect the rendered PDF, the full DRC JSON, layout-changes.json,
final-geometry-check.json and artifact-manifest.json before reuse.
