Added
- A pin on an edge-connector finger is a DRC error (
edge-connector-conflict), the
third member of the family withmounting-hole-conflictandcut-track-conflictand
the most absolute of the three: a bore and a cut each destroy the pad and leave a hole,
but a finger is solid copper that was never drilled (geometry.undrilled_holes), so a
through-hole lead cannot be fitted there at all. Nothing checked it, so a part dropped on
the finger strip was accepted in silence — and the finger strip runs along the board
edge, which is exactly where a connector or a terminal block gets placed.
Changed
-
The placement ghost goes red over a hole with no pad. A mounting bore, an
edge-connector finger and a cut track all leave a position on the grid with nothing to
solder a lead into, and DRC has always called each of them an error — but the ghost
stayed green right up to the click, so the part went down and the only thing that ever
said so was a line in the DRC panel afterwards. The status line now names it too. The
placement is still not refused: a mounting hole can be added over a part that was
already there, so refusing would only make the same board harder to reach while leaving
it reachable. -
The blank-board guidance appears until you have placed your first part, then stops.
It is for the first launch; repeating it on every launch afterwards is the application
explaining its own front door to somebody who has been through it a hundred times — and
there was nowhere to click it away, because the block is transparent to the mouse by
design. -
Two solder traces running side by side are one row in the findings panel, not
sixteen.solder-trace-proximityfires once per pad per trace, so eight pads of
perfectly ordinary parallel routing put sixteen copies of one sentence in the panel and
pushed everything else off the bottom — which is how the most valuable rule in the tool
became the one people scroll past. Gathered by the run now (C4–J4 · 8 pads), with
every pad still there one level down.- The rule itself is unchanged, and deliberately: it is a warning, not an error —
nothing is refused and the board is legal — and DRC's output is compared byte-for-byte
against the reference implementation this port is proved against
(test_matches_typescript_golden_drc). Grouping in the engine was written, measured
at 8 findings → 4 onrandom-09, and reverted for that reason. The noise was never in
the engine; it was in the panel.
- The rule itself is unchanged, and deliberately: it is a warning, not an error —
-
Auto-place stops turning parts for nothing. The annealer accepts any move whose
cost delta is<= 0, and a rotation's delta is exactly zero for every part the cost
function cannot tell apart turned — one on no net, or one whose courtyard is square. So
it turned parts for no reason at all: on thedensefixture it turned 11, and 5 of
those cost 0.00 to turn back. That is not free to whoever is holding the iron — every
rotation is an orientation to get right at the bench and a polarity line in the build
guide, and a plan reading "11 turned" describes work the tool did rather than noise it
made. When the placer has no preference, the user's own orientation is now the one
kept: across eight fixtures and eight seeds, parts turned went from 46 to 30 with the
routed cost identical to the last decimal.- Applied to the WINNER only, after
_pick_besthas chosen, and checked against the
router. Tidying every candidate before the choice changes the boards the router is
shown and therefore which one wins — measured ondense, where doing it that way
left the mean routed cost 31.5 → 35.9 while the best was unchanged. - Letting a rotation nudge the anchor at the same time — the obvious fix for a part
that can only be turned if it also moves a hole or two — was tried and measured
worse: summed mean routed cost 254.1 → 261.0 at half the rotations nudging, 260.0 at
a quarter, 262.6 at 0.15, with ne555 losing most of it. That result is written down at
the proposal site so nobody re-derives it.
- Applied to the WINNER only, after
Windows - PerfStudio_..._Setup.exe. It is unsigned, so SmartScreen will
warn on first run: More info -> Run anyway. A signed build is planned.
Linux - perfstudio-...-x86_64.AppImage. chmod +x and run it; it needs
glibc 2.35 or newer. If it will not start, the machine has no FUSE 2: install
libfuse2, or run the file with --appimage-extract-and-run, which unpacks it
instead of mounting it.
macOS - perfstudio-...-arm64.dmg, Apple silicon. Drag it to Applications,
then run this before opening it:
xattr -dr com.apple.quarantine /Applications/PerfStudio.app
It is signed ad-hoc but not notarized, so Gatekeeper blocks the first launch.
On macOS 15 and later the dialog it raises defaults to Move to Trash, which
deletes the install. Clearing the flag first avoids the dialog entirely. On an
Intel Mac, install from source.
Anywhere with Python 3.12+: pip install -e . from a clone, then
perfstudio.
This is pre-alpha software. Nobody has yet built a real board by following a
generated guide - check every measurement against the part in your hand.