edakit documentation

PERF

The plan of a hand-wired board on a perfboard makes the graph's nets and can be built – 7 codes.

Each engine decides one kind of relation; a finding's code is ENGINE.relation. Severities are the catalog's defaults – a project's domains may set others; a grade is a sub-case with its own severity, a topic the part of a code a domain switches on.

PERF.net perfboard plan = graph

erroropen: errorshort: errormeet: errorlabel: errorjoined: errorinside: note

The copper of the plan – the leads in their holes, the pads a kind joins, the bridges below, the insulated wires on top and the pins a part joins inside – makes exactly the graph's nets of the board: no net open, no two nets in one piece of copper, every wire joining the net it is labelled with.

  • the nets the plan makes, from the holes, the copper groups of the kind (groups of edakit/perfboards/<kind>.toml: none on a pad per hole, runs of three on 3-hole-strips), the bridges of [[wire]] with side bottom (every hole along the path), the insulated wires with side top (their two ends) and the pins a part joins inside (joined of the parts entry, a button's pins that share a role, 4.1), against the graph's nets of the board: open, short, a wire labelled with a net it does not join (label), a hole or a strip where two nets meet (meet) – why it exists: a strip not cut, a bridge in the wrong row, the bottom read the wrong way round, found only with the multimeter (perfboard-layout, Why)
  • a module on sockets (kind module) joins its pins inside – the nets are whole with it plugged in; pins that reach the rest of their net only inside it are a note (inside), and the test list measures them as groups of their own (decision 19) – why it exists: the bell's LED cathodes reach ground only through the Nano's second GND pin
  • a key joined of a parts entry that is not a list of pin groups of the entry: grade joined
Why
The classic mistakes of a hand-wired board – a bridge forgotten, a row started one hole too early, an LED the wrong way round – are found with the multimeter after soldering. On the Christmas bell's plan the check found all three in a copy built to break, each with the hole where the soldering iron goes.
What to do
Add the missing bridge or wire, move the bridge or the part that joins two nets – the finding of grade meet names the hole –, or correct the wire's net.
Sources
  1. edakit concept 'Perfboard layout' (docs/concepts/new/perfboard-layout.md), decisions of 2026-11-03 and 2026-11-09: decisions 1, 11, 16 to 19
  2. edakit handbook 7.9

PERF.place every part in its holes

errorunplaced: errorunknown: erroroffboard: errortwo: errorrole: errorspan: errorgeometry: error

Every part of the hand-wired board has a place in the plan, lies within the board's holes, has one lead per hole, and a part placed by the holes of its roles has its leads in exactly those holes.

  • every part of the board in [place] (unplaced), no designator there that is not on the board (unknown), every lead and every wire end within holes of [perfboard] (offboard), one lead per hole (two); a part placed by role (anode = "L3", cathode = "L2") has its leads where its roles are named, edakit derives the rotation (role); span only on a part with two leads (span); its footprint geometry known – the geometry beside the board file, footprint_data, or the library cache of edakit part import (geometry) – why it exists: decision 14 of perfboard-layout, the bell's LEDs by role
Why
A part the plan leaves out is soldered from memory; two leads in one hole do not fit; an LED placed by its rotation reads alike for a yellow one with its cathode on pin 1 and a green one with its anode there – the trap the bell's PCB had.
What to do
Give the part its place – at and rot, or the holes of its roles –, move it onto the board, or correct the holes the plan names.
Sources
  1. edakit concept 'Perfboard layout' (docs/concepts/new/perfboard-layout.md), decisions of 2026-11-03 and 2026-11-09: decisions 10, 13, 14
  2. edakit handbook 7.9

PERF.grid leads on the grid

errorbent: notesmd: error

Every pad of a placed part lands on a hole of the 2.54 mm grid within the bend a lead takes (tolerance.lead_bend_mm of the kind); a bent lead within it is a note; a part with SMD pads is an error – a perfboard takes through-hole parts only.

  • the pads of the footprint geometry, turned by rot, fitted onto the holes: the largest distance of a pad from its hole once the part is centred on its holes, against tolerance.lead_bend_mm of the kind (an assumption of 0.8 mm until a build measures it); above 0.05 mm a note (bent); a pad without a hole an error (smd) – why it exists: decision 3 of perfboard-layout, the bell's buttons
Why
A part whose pins are off the grid – a slide switch with terminals 2.0 mm apart, a terminal block at 3.5 mm – does not go into the holes, and an SMD part has no lead to go through them. The bell's buttons, 6.5 x 4.5 mm on 7.62 x 5.08 mm, are bent by 0.63 mm.
What to do
A part with pins on the 2.54 mm grid, another rotation, or – for an SMD part – a through-hole part in a variant of its own (handbook 3, 10.4).
Sources
  1. edakit concept 'Perfboard layout' (docs/concepts/new/perfboard-layout.md), decisions of 2026-11-03 and 2026-11-09: decision 3, 'What edakit checks'
  2. edakit/perfboards/pad-per-hole.toml: pitch 2.54 mm (Rademacher 710-5, CIF 4987709)

PERF.body bodies apart, spans long enough

errorspan: errorunder: note

The bodies of the placed parts do not overlap and cover no other part's lead and no wire's end; an axial part's span holds its body and the bends of its leads; a part under a module on sockets is a note.

  • bodies as boxes – body.box of the parts entry, else the footprint's box – or round where the footprint's name says so (_BD5.0 of a radial LED or capacitor), an axial part's body (-L6.5 and _BD2.5, or body.box) between its leads, a module's sockets one pitch around each pin: no two overlap, none covers a lead or a wire's end; an axial part's span in holes at least its body plus tolerance.axial_bend_mm on each side (span); a part under a module on sockets (under) – why it exists: decision 19 of perfboard-layout
Why
Two bodies in one place do not fit, a lead under a body cannot be soldered or reached by the probe, and a resistor bent too close at its body cracks; a module on 8.5 mm sockets has room under it for wires, not for parts that might touch it.
What to do
Move one of the parts, give the axial part a longer span, or move the part from under the module.
Sources
  1. edakit concept 'Perfboard layout' (docs/concepts/new/perfboard-layout.md), decisions of 2026-11-03 and 2026-11-09: decision 19, 'What edakit checks'
  2. edakit/perfboards/pad-per-hole.toml: tolerance.axial_bend_mm (an assumption until a build)

PERF.mount mounting holes free

error

Every mounting hole of the plan lies on the board, no lead, bridge or wire end sits under the nut around it, and no body reaches into it.

  • [[holes]] in mm, x right and y up from the board's lower left corner seen from the top: inside the board; the pads whose centre lies within keep / 2 plus half a pad of the hole's centre stay free – keep of the hole, default 1.875 x d, the corners of an M3 nut (6.01 mm, ISO 4032) for d = 3.2 – why it exists: decision 15 of perfboard-layout
Why
A frame's holes rarely meet the 2.54 mm grid – the bell's are 78 x 49 mm apart, the grid gives 76.2 x 48.3 –, so they are drilled between the holes; a pad under the nut shorts to the screw or is crushed.
What to do
Move the part or the wire from the nut, or the mounting hole – in mm, as on a PCB.
Sources
  1. edakit concept 'Perfboard layout' (docs/concepts/new/perfboard-layout.md), decisions of 2026-11-03 and 2026-11-09: decision 15
  2. ISO 4032, hexagon nuts: M3 width across corners e min 6.01 mm

PERF.wire bridges straight, wires into free holes

errorcorner: errorend: error

On the bottom only straight rows of bridges between neighbouring holes: none turns a corner, and two rows meet at a lead or in the middle of another row, never at right angles in an empty hole; an insulated wire on top ends in a free hole, not in a lead's, and not under a body.

  • [[wire]] with side bottom: every step along a row or a column, no corner within it and none where two rows end in the same empty hole (corner); side top: both ends in free holes, not under a body – a module on sockets is raised, its sockets are bodies (end) – why it exists: decisions 11, 16, 17 of perfboard-layout
Why
A bridge around a corner is a wire that should run on top, where it is easy to solder; a lead and a wire do not fit into one hole, so a wire's end goes into the free hole beside the lead, joined to it by a bridge below.
What to do
Straighten the bridges or take a wire on top for the way around the corner; move the wire's end into a free hole beside the pin.
Sources
  1. edakit concept 'Perfboard layout' (docs/concepts/new/perfboard-layout.md), decisions of 2026-11-03 and 2026-11-09: decisions 11, 16, 17

PERF.current copper carries the current

errorunknown: note

A bridge, a wire or a strip carries the current of its net – the largest current of a part on it from the simulation – within the copper's rating of the kind's data; without a rating with its source a note names the currents.

  • the nets of the plan's bridges and wires against copper.max_a of the kind with copper.source, the currents from <artifacts>/sim/net_currents.json of edakit sim; without a rating a note with the three largest (unknown); without a simulation nothing – why it exists: 'What edakit checks', Current, of perfboard-layout
Why
A current only with its source, never a guess: no datasheet of a perfboard rates its pads, and the bell's ground carries 0.8 A with the servo stalled.
What to do
A rating with its source in edakit/perfboards/<kind>.toml (copper.max_a, copper.source), or a thicker wire for the net.
Sources
  1. edakit concept 'Perfboard layout' (docs/concepts/new/perfboard-layout.md), decisions of 2026-11-03 and 2026-11-09: 'What edakit checks', Current