Parts entries complete, well-formed, verified, orderable – 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.
PARTS.verified parts signed
pendingdevice: warning
Every parts entry is verified against its datasheet (verified), no component has an open verify note, and every part is an LCSC part or an EasyEDA device – the board's own copper (own.what copper: a solder jumper, a test pad) excepted.
sign-off: every part verified against its datasheet, no open verify note (pending – blocks only the release) – finds e.g.: an unchecked part going into an order
Why
The parts database feeds every check. A value copied from a distributor's table without a look at the datasheet is an assumption; the sign-off records who checked what against which revision.
What to do
Check the part (handbook 4.3) and fill in verified; resolve verify notes in the graph.
For the maker of [cart] makers that orders from JLCPCB's catalogue – a failure for the planned maker, a warning for another one (grade other_maker), not run without such a maker (a note): every assembled part is listed at JLCPCB, in stock for [project] quantity boards with the assembler's attrition, under the MPN of its entry, not 'Standard Only' on an Economic order – from the snapshot of edakit stock. A thin margin, MSL 5 or more, another class: margin; an old snapshot: stale.
parts orderable (4.2): every assembled part listed at JLCPCB, in stock for quantity boards (with the attrition under Standard), its entry's MPN, not "Standard Only" on an Economic order – from the snapshot of edakit stock; MSL ≥ 5, a thin margin, another class warn; an old snapshot is pending, none a note – finds e.g.: a part that is pre-order only, Standard-only or baked, found in the quote
for the maker of [cart] makers that orders from JLCPCB's catalogue (fail as the planned maker, warning as another one, not run without it): every BOM line in JLCPCB's public assembly catalogue with stock for quantity boards (otherwise only pre-order), under the MPN of its parts entry; another class than jlc_class warns – PARTS.stock checks the same and more from the stock snapshot when the part is chosen
Why
What the assembler can place is decided when the part is chosen, not when the BOM is uploaded. A part only LCSC stocks is 'pre-order only' at JLCPCB; a 'Standard Only' part (large holders, modules) turns a one-sided Economic order into Standard with setup per side and loading fees on every type; an MSL 5 part is baked for a fee and two days; a catalogue entry under another part number is another part. Found in the quote, each of these costs a part swap, sign-offs again and gate runs.
What to do
edakit stock after every part change. A part that fails: another part (part-search, edakit stock --lcsc for the candidates), the part soldered by hand (bom: false), or Standard PCBA chosen on purpose ([release] assembly.pcba = "standard"). A wrong MPN: correct the parts entry or the LCSC number. Accept a warning in the sign-off file with its reason.
Sources
edakit handbook 4.2 and 8.4
JLCPCB part pages (PCBA Type, MSL, X-ray) and the quotes of 2026-10-24 and 2026-10-25 (attrition)
edakit handbook 4.2
Replaces P-4, F-2
PARTS.supplier supplier per part
warning
Every part bought separately and fitted by hand (bom: false) has an LCSC number or an order entry in its parts entry ({supplier: code} or {supplier: {code, moq, step}}), so that edakit order can put it into a cart – an own part (own, the board's copper among them) excepted. A C99… number is an EasyEDA user-library entry, not an LCSC number: LCSC does not sell it. A warning.
supplier per part: a part bought separately (bom: false) has an LCSC number – a C99… EasyEDA library number is none – or order in its parts entry (warning) – finds e.g.: a module or LED nobody wrote an order code for, found when the order list is written by hand
Why
The assembler's BOM leaves out every hand-soldered part, module and cable. What has no supplier and no order code is written into an order list by hand, late and without spares or the supplier's minimum – a 50-pack that does not exist, one LED short for the last board.
What to do
Add order to the parts entry, e.g. {"berrybase": "OSM5DK7331A"} or {"lcsc": {"moq": 20, "step": 20}}, or give the component its LCSC number – for a C99… library number the supplier the part really comes from; then edakit order. Accept the warning in the sign-off file if the part is at hand already.
Every fact a check needs and the profile requires is in the entry: lead for a through-hole part, functions on MCU pins a net's fn uses, hot_loop of a switching regulator, compliance.radio of a module or microcontroller, compliance.rohs of every part the BOM lists (bom not false: true, false or the exemption – a note, for a board that is sold a warning), mpn and manufacturer of every assembled part with a maker of [cart] makers that matches the BOM by manufacturer part number (PCBWay, Eurocircuits, AISLER – bom.match in the profile; an error when the planned maker is one of them, else a warning, grade other_maker), what the model of an LED strip needs – pixels_per_m, i_pixel_a, r_vdd_ohm_per_m, r_gnd_ohm_per_m (the rail resistance is in no LED data sheet: the strip's seller, a measurement, or the project's own value), compliance.reach of every part of a board that is given away or sold – no compliance fact of the board's own copper (own.what copper: a solder jumper, a test pad), which is the bare board's and its maker's. The grade names the fact; its severity is the profile's.
SVHC stated: with purpose.use (8.1) "gift" or "sale" every parts entry the board uses has compliance.reach – the supplier's REACH statement, or "none above 0.1 %" with its source (4.1); an own board's entry gets its summary from edakit part datasheet. A gift is placing on the market under REACH too (Art. 3(12): free of charge), and Art. 33(2) asks any supplier of an article to name a substance of very high concern above 0.1 % to a consumer who asks, within 45 days. Graded by purpose (15.4): information for a gift, a warning for a board that is sold, nothing for one built for oneself or without a purpose – accept on one of its components with the reason (chapter 15 – support, not legal advice) – finds e.g.: none of the 31 parts entries of pytree states it, its M-6 review found lead likely present in thick-film resistors, diode die attach and header contacts with no supplier statement on file, and edakit check said nothing
manufacturer part number (4.1): with a maker of [cart] makers that matches parts by manufacturer part number (PCBWay, Eurocircuits, AISLER – bom.match in its profile) every assembled part's entry names its mpn and its manufacturer – an error when the planned maker is one of them, else a warning – finds e.g.: a part the maker cannot match, found at its BOM upload
radio stated: every part of graph type module or microcontroller has compliance.radio in its parts entry – its bands and power (4.1), or "none" when it does not transmit; missing is graded by purpose.use (8.1): a warning for a board that is sold ("sale"), information for one built for oneself or given away, or without a purpose – accept on one of its components –, other parts need it only if they transmit; a radio of another shape is an error. The entry is in the circuit hash: the statement renews M-1 and M-6 (8.2) – finds e.g.: an Arduino Nano whose entry says nothing about a radio – found by the regulatory review from the part's name; a plug-in board with an ESP32 its name does not show
RoHS stated: every part the BOM lists (bom not false) has compliance.rohs in its parts entry – true, false or the exemption (4.1), from the manufacturer's statement or the distributor's page; missing is graded by purpose.use (8.1): a warning for a board that is sold ("sale"), information for one built for oneself or given away, or without a purpose – accept on one of its components; a part soldered by hand or on a bought board (bom: false) is the regulatory review's (M-6) – finds e.g.: a resistor the review at the order found without a RoHS status on a board for sale
Why
A check without its fact checks nothing and says so only here.
What to do
Fill in the fact from the datasheet (handbook 4.1).
Sources
JLCPCB PCB capabilities: hole size tolerance +0.13/-0.08 mm, minimum plated slot width 0.5 mm on 2 layers – https://jlcpcb.com/capabilities/pcb-capabilities (read 2026-10-27)
edakit handbook 13.6 and 8.1 (L-9)
The review at the order of 2026-10-30 (implementation plan 5.5): the agent regulatory-reviewer graded the parts' missing compliance a note and named a BOM part without compliance.rohs on a board for sale a check candidate; the owner's decision of 2026-11-01: a note, for a board that is sold a warning (handbook 15.3) – grade rohs, [facts] bom of the domain core
pico-sdk 2.1.1, src/rp2350/hardware_regs/include/hardware/regs/io_bank0.h: IO_BANK0_GPIOn_CTRL_FUNCSEL_VALUE_* – the SPI, UART, I2C and PWM function of every GPIO – https://github.com/raspberrypi/pico-sdk/blob/2.1.1/src/rp2350/hardware_regs/include/hardware/regs/io_bank0.h
pico-sdk 2.1.1, src/rp2_common/hardware_pwm/include/hardware/pwm.h: each slice drives two outputs from one counter; PWM_GPIO_SLICE_NUM = (gpio >> 1) & 7 below GPIO 32, channel = gpio & 1; src/rp2350/hardware_regs/include/hardware/platform_defs.h: RP2350A ADC_BASE_PIN 26
Lesson of pytree (D-14, 2026-10-19): the star's blue LED at 1 kHz and the buzzer on GP20/GP21 shared PWM slice 2 – every note would have changed the blue PWM; found by chance in a review
TI SNVA021C, AN-1149 Layout Guidelines for Switching Power Supplies, Rev. C (2013), 5 Traces and Ground Plane: inductor, output capacitors and output diode as close to each other as possible; the grounds of IC, input capacitors, output capacitors and output diode connected close together directly to a ground plane – https://www.ti.com/lit/an/snva021c/snva021c.pdf
Lesson of pytree (D-41, 2026-10-23): in the released run 20261023-000107 the MT3608 boost's diode cathode (D33) reached its output capacitor C13 over 61 mm of copper across the board; DRC, the gate and the electrical review passed it, the layout review (M-5) found it; the fix listed four pad pairs (L1.2–U6.1 ≤ 6 mm, U6.1–D33.2 ≤ 5 mm, D33.1–C13.1 ≤ 5 mm, C13.2–U6.2 ≤ 8 mm), the 61-mm segment on V_LED, a net without a pin of U6
edakit handbook 4.1 (field compliance) and 15.3 (what the review needs)
Lesson of the Christmas bell (tgd1975/automatic_christmas_bell, D-18 from the M-6 reviews of D-16): on the boards main, smd and tht U1 is an Arduino Nano without a transmitter, no parts entry said so, and the M-6 reviews of 2026-10-26 established it from the part's identity; on esp32 the T-Display's compliance.radio was added by hand during the review
Eurocircuits, BOM requirements (MPN and designators required): https://www.eurocircuits.com/?p=9450 – search result of 2026-10-30, the page not reachable from the session (docs/concepts/done/ordering.md)
Ordering at the manufacturer (docs/concepts/done/ordering.md, decided 2026-10-30): BOM with MPN and PARTS.fact/mpn, in stage P
Regulation (EC) No 1907/2006 (REACH) Art. 3(12): placing on the market means supplying or making available, whether in return for payment or free of charge, to a third party; Art. 3(33): supplier of an article; Art. 33(2): on request by a consumer any supplier of an article containing a substance meeting the criteria in Article 57 and identified in accordance with Article 59(1) in a concentration above 0.1 % w/w provides sufficient information to allow safe use, as a minimum the name of that substance, free of charge within 45 days – https://www.legislation.gov.uk/eur/2006/1907/article/33 (read 2026-11-01; the copy as it stood in EU law)
Lesson of pytree (D-53, 2026-11-01): a gift, its M-6 review found none of the 31 parts entries with compliance.reach and lead likely present; edakit check reported nothing (rule proposal #95)
Replaces P-7, G-15, G-18, P-11, P-12
PARTS.schema parts entries well-formed
error
Every field of a parts entry has the form its kind's schema gives (edakit part lint): known names with their unit, numbers where numbers belong, ranges with min ≤ max, pin roles the kind knows.
Why
A value of the wrong form is read as missing or wrong by every check that uses it.
What to do
Correct the field as the message says; edakit part lint lists all.
Sources
edakit handbook 4.1 (field compliance) and 15.3 (what the review needs)
Lesson of the Christmas bell (tgd1975/automatic_christmas_bell, D-18 from the M-6 reviews of D-16): on the boards main, smd and tht U1 is an Arduino Nano without a transmitter, no parts entry said so, and the M-6 reviews of 2026-10-26 established it from the part's identity; on esp32 the T-Display's compliance.radio was added by hand during the review
Replaces G-14, G-18, G-24, P-11
PARTS.library copy of the parts library current
notenewer: notedraft: note
A parts entry copied from edakit's parts library (its field library) names the library version it was taken from: a library entry that has changed since is noted (grade newer), and so is a copy of an entry the owner has not signed (grade draft).
Why
The library entry is corrected or extended after a project took its copy – a limit read again, a pin function added; the project does not learn it unless something says so. A copy stays the project's: it changes only on purpose, with edakit part add --update. An unsigned library entry is a draft – Claude wrote it from the datasheet, nobody has checked it.
What to do
Compare the versions (edakit part add <key> --update shows what changed and takes the library's version over the copy), or keep the copy and accept the note; a draft: the owner checks the library entry against its datasheet and signs it (edakit part sign <key> --by NAME), or the project signs its copy as its own entry.
Sources
rules-at-scale.md, decision 8 (2026-10-31): the library in edakit, taken over as a copy that names its version, every entry signed by the owner
edakit handbook 4.1 (the parts library)
PARTS.footprint footprint data complete
error
A parts entry with footprint_data – an own footprint as text (handbook 4.5) – gives every pad its place, its shape (RECT, ELLIPSE or OVAL) and size, and a through-hole pad (MULTI) its hole; every pad number is a pin of the entry or the pad is marked mechanical, and every pin of the entry has a pad; lines, texts, polarity marks and the outline are well formed; a polarity mark '+' or '−' lies nearest to a pad whose pin role has that sign (GEO.mark's test, on the data); with "symbol": "box" the sides of the entry's symbol name pins of the entry, each once. Only where an entry of the project has footprint_data.
footprint data complete – PARTS.footprint and SYNC.footprint only where a parts entry has footprint_data (4.5): every pad its place, its shape (RECT, ELLIPSE, OVAL) and size, a through-hole pad (MULTI) its hole; every pad a pin of the entry or "mechanical": true, every pin a pad; lines, texts, marks and outline well formed; a polarity mark nearest to a pad of its sign – GEO.mark's test (8.1) on the text; with "symbol": "box" the entry's symbol sides naming pins of the entry, each once. The same problem of several pads is one finding: pads 1–24: shape missing – finds e.g.: a pad the land pattern has and the entry's pins not, a "+" written next to the cathode
Why
The data is what edakit builds the project's copy from and what the layout hash covers. A pad without a pin carries no net and the board misses a connection, a pin without a pad cannot be soldered, a through-hole pad without a hole is a pad on both sides with nothing between, and a '+' next to the cathode is pytree's 5-mm LED again (handbook 4.4). Here it is found on the text, before EasyEDA has the copy – not in the gate's silkscreen (GEO.mark) or in the polarity review M-1, whose circuit hash the data changes (decision 5).
What to do
Complete the data in the parts entry: place, shape, size and hole of the pad from the datasheet's land pattern; a pin for every pad that carries a net, "mechanical": true on a mounting pad; the mark next to the pad of its sign – or the pin's role corrected where the datasheet says so. edakit part footprint KEY writes the footprint pcb dump measured as a start.
Sources
edakit concept 'Circuit design as code' (docs/concepts/done/design-as-text.md), gap 2, proposals 1 and 3, and decision 5 of 2026-10-28: the footprint as data in the parts entry – origin, pads in the form part import caches them, outline and print; a pad without a pin in the entry is a finding, and so is the reverse
edakit handbook 4.4 (pytree's LED footprint printed '+' next to pad 1, the cathode) and 8.1 (L-8: a sign of the silkscreen against the role of the nearest polarised pad, release/fab.py check_polarity_marks)
EasyEDA Pro extension API types 0.3.50 (resources/app/assets/pro-api/0.3.50.ab46409c/api-types.d.ts, read 2026-10-29): pad shapes ELLIPSE, OVAL, RECT, NGON and POLYGON (EPCB_PrimitivePadShapeType), pad layers TOP, BOTTOM and MULTI (TPCB_LayersOfPad), holes ROUND [diameter] and SLOT [diameter, length] (TPCB_PrimitivePadHole)