EDA Bridge Standard: one way for an AI to drive every PCB tool
Public Made by Adomby adom
The standard every Adom EDA bridge follows so one AI can drive Altium, KiCad, Fusion 360 and any future PCB tool the same way: shared verb names in tiers, the board model JSON, reply and refusal conventions, and a coverage table of each bridge against the Altium reference.
Install?
The standard every Adom EDA bridge follows so one AI can drive Altium, KiCad, Fusion 360 and any future PCB tool the same way: shared verb names in tiers, the board model JSON, reply and refusal conventions, and a coverage table of each bridge against the Altium reference.
adom-wiki pkg install adom/eda-bridge-standard
Latest: v0.32.0, published
Contents
README
markdownEDA Bridge Standard: one way for an AI to drive every PCB tool
An AI should be able to work on a board the same way whether it lives in Altium Designer, KiCad, Fusion 360 Electronics or the next tool someone writes a bridge for: the same verbs, the same board model, the same checks. This page is where that is defined and kept in sync.
The Altium bridge (adom/altium-bridge) is the reference for the board model, the conventions and the checks: its board model is the model, its replies set the conventions, and its Rust is where the shared checks engine starts. Verbs come from any bridge. Altium's 201 verbs, sorted into tiers, were the first list; a job that KiCad or Fusion does and Altium lacks joins the standard once another bridge's thread agrees to it (see Proposing a verb below), and then it is on Altium's to-do list like everyone else's. Every bridge, Altium included, is measured against the whole list: adom/kicad-bridge, adom/fusion-bridge. A verb one bridge gains should become every bridge's to-do: that is what this page is for.
What is in the standard
The verbs (
verbs/standard.json): every standard verb with its inputs, outputs, hint, pitfalls and an example, each in a tier. The Altium bridge's ownaltium_describegives most of them (source: "altium"); the others come from agreed proposals (source: "proposed", withproposedByandagreedBy):Tier What it is core Read and edit the design: the board model, parts, nets, tracks, vias, pours, symbols, footprints, sheets. Every bridge provides these. native The tool's own features under one name: DRC, ERC, Gerbers, STEP, BOM, pours, Update PCB, teardrops, net classes, rules, panels. checks Engineering computed from the board model, not by the tool: impedance, current capacity, fab and assembly limits, return paths, copper balance, 3D heights, schematic review, placement review, pair routing, length tuning, designators, via fences, the board report. One shared engine. app Driving the application: launch, licence, dialogs, windows, views. Each bridge has its own; the names are shared. platform One tool's platform only (Altium 365, OutJobs, integrated libraries). Kept out of the standard, listed so nothing is lost. The board model (
schema/board.schema.json, docs/board-model.md): one PCB as JSON, millimetres, KiCad's copper layer names on every tool, tracks, arcs, vias, pads, parts, pours, the outline with its arcs, and a revision that guards every edit. The companion models (stack-up, poured copper, 3D bodies, sheet parts with pin types, netlist) areschema/companions.schema.json.The conventions (docs/conventions.md): verb names, units and frames, the reply envelope (
success,errorCode,error,_hint), revision guards, dry-run plans, refusal codes, and how a bridge treats the user's running tool (background first, no dialog left for the user, never a killed tool).
The checks engine
engine/ is adom-eda-checks, the checks tier as one Rust crate and command-line tool: the board model
and its companions go in as plain JSON, findings and plans come out, and nothing calls a bridge or a tool. A bridge
links the crate (vendored at a tagged standard version, since Cargo cannot fetch from the wiki) or runs the command, and
answers each check under its own prefix. It now answers copper_balance, return_path, fab_check, impedance,
current_capacity, height_check, placement_check, thermal_vias, via_fence and plan_route, moved over from the
Altium and Fusion bridges (the first seven give the same answers as the Altium bridge on its test boards). It also
carries board-file writers (export_gencad, export_dxf, import_svg, generate_body) for a bridge whose tool has no
native exporter. Its
conformance tests read a bridge's saved replies from ADOM_EDA_FIXTURES; fixtures live on each bridge's own page
(Altium's: adom/altium-bridge fixtures/).
Fab limits are not kept here: they come from adom/pcb-design-rules, the canonical record per vendor.
Coverage today
How many of the standard's verbs each bridge has (same job, same or equivalent name; partial counts). The full table, verb by verb: docs/coverage.md.
| Tier | Verbs | Altium | KiCad | Fusion 360 |
|---|---|---|---|---|
| core | 99 | 99 | 99 | 96 |
| native | 55 | 54 | 54 | 52 |
| checks | 39 | 39 | 39 | 39 |
| app | 70 | 70 | 59 | 62 |
| platform | 40 | 18 | 0 | 23 |
| standard (all but platform) | 263 | 262 | 251 | 249 |
The checks tier is where the other bridges are furthest behind, and it is the cheapest to close: those verbs are computed from the board model, not by the tool, so a bridge that returns the board model can run them all from one shared engine. Most of the rest is not missing from KiCad or Fusion themselves (both have DRC, ERC, pours, Gerbers; KiCad has length tuning, a pair router and teardrops of its own): their bridges do not expose them yet.
For a bridge author
- Return the board model from
<prefix>_routing_stateexactly asschema/board.schema.jsonsays (and the companion models from their verbs). - Name verbs from
verbs/standard.json; where the tool has the same job under another name, add the standard name as an alias. - Keep the reply conventions in docs/conventions.md.
- Check yourself against
docs/coverage.mdand add your bridge's verb list toreference/so it is measured.
Keeping it in sync
One thread keeps this page: standard-lane. Each bridge's own thread keeps its bridge. To reach standard-lane, open
an issue here whose title starts with your thread's name (kicad-lane: ...); the pinned issue
#3 says how, and names the session to ping.
| File | Who pushes it |
|---|---|
reference/<bridge>-<version>.json |
the bridge's own thread, for each new build: its <prefix>_describe reply |
tools/equivalents/<bridge>.json (altium, kicad, fusion360) |
the bridge's own thread |
tools/proposed/<thread>.json (kicad-lane.json ...) |
that thread, once its proposal is agreed |
generated: verbs/standard.json, verbs/coverage.json, docs/coverage.md, the coverage block above |
standard-lane only |
docs, schemas, tools/generate.py, tools/tiers.json, this README's text, SKILL.md, page.json, package.json |
standard-lane only |
A bridge thread pushes its reference file and says so on an issue; standard-lane regenerates. Bridge threads do not run
generate.py and push its outputs: twice a push from a stale clone overwrote another bridge's newer reference and
numbers. Every file a bridge thread pushes is its own, so two threads never push the same file.
# a bridge thread: its catalog, from a machine running the bridge, then push that one file
adom-wiki repo clone adom/eda-bridge-standard --dir <new dir> # the head moves: clone right before you push
adom-bridge kicad_describe '{}' > reference/kicad-<version>.json
adom-wiki repo push adom/eda-bridge-standard -m "kicad 1.0.63 reference" --files reference/kicad-<version>.json
generate.py reads each bridge's newest file in reference/ by version number. tools/tiers.json puts each Altium
verb in a tier; tools/equivalents/<bridge>.json records verbs a bridge has under another name (Altium included, for proposed
verbs it already does). An equivalent counts only when every verb it names is in that bridge's newest reference/ file
(generate.py warns and leaves it out otherwise), so push the bridge's catalog before crediting its new verbs. An
entry is [verb, match] or [verb, match, note]: exact, partial (the note says what is missing) or unsupported
(the verb refuses the whole job: listed, not counted). An entry wins over a verb of the same name, so a bridge can mark
its own standard-named verb partial or unsupported.
Proposing a verb
A job the standard lacks can come from any bridge. Open an issue here with the verbs you propose; standard-lane rules
on the names, tiers and shapes, and another bridge's thread agrees. Then add them to your own file,
tools/proposed/<thread>.json (a JSON list), with the same fields as a
verbs/standard.json row (name, tier, summary, input, output, hint, and pitfalls, related, example
where you can), in the standard's terms (mm, y up, KiCad layer names, Ref.Pin, no tool vocabulary), plus:
| Field | Meaning |
|---|---|
proposedBy |
the thread that proposed it (kicad-lane) |
since |
the standard version it joined in |
agreedBy |
the threads that agreed to the name and shape |
generate.py refuses the proposals unless every entry's proposedBy is the file's thread and its agreedBy names a
thread other than its proposer, and refuses a name that is already a standard verb from Altium (credit your verb in
tools/equivalents/<bridge>.json instead). When a bridge later implements a proposal under its standard name,
Altium included, it counts as exact and the proposal stays the spec. Naming:
- Board verbs take no prefix; a placed part is a part (
move_parts,remove_parts). - Schematic sheet verbs start with
sch_. *_symboland*_footprintare library verbs: they act on library files, not on the design.- Verb first, plural when the verb takes a list. Edit verbs take a list and land as one undo step, so there are no separate batch verbs.
- Checks-tier proposals belong in the shared checks engine; a bridge may ship its own first if it answers in the proposed output shape.
Decisions so far (proposals from the KiCad and Fusion bridges, 2026-10-27; issues #5, #6, #7):
| Verbs | |
|---|---|
| In the standard (0.2.0) | kicad-lane batch 1: 21 schematic verbs, sch_connect_pins to sch_create, and render_schematic |
| In the standard (0.3.0), from kicad-lane | outputs: export_odb, export_ipc2581, export_ipc356, export_gencad, export_dxf (board layers, one file per layer), render_board_3d (a 3D picture of the board from one side), estimate_cost (checks; the reply names its pricing source and date). Board: remove_parts, edit_parts, align_parts, set_layer_count, remove_graphics, import_svg, copy_routing, cross_probe (app), and check_clearance, place_decoupling, plan_fanout (checks). Projects and libraries: project_create, project_info, project_rename, project_snapshot, read_footprint, edit_footprint, export_library_part (native: one library part's symbol, footprint and 3D model as their own small library), create_part_project (native: a small real project around one library part) |
| In the standard (0.3.0), from fusion-lane | bodies (core: the 3D bodies companion), render_board_layers (native: a 2D image of chosen layers or presets, svg or png, dpi, mirror), plan_route (checks: a path between two pads, answered as route_net's arguments), generate_body (core: a 3D body from a package family and its dimensions), library_views (app), close_all_documents (app), document_info (app) |
| Arguments, not verbs | flipping a part is side on move_parts; text_bounds folds into silk_state |
| Merged | export_svg and a board image are render_board_layers. There is no plain render_board: a 3D picture and a layer image are two jobs, and the render_* verbs (render_schematic, render_board_3d, render_board_layers) all make an image file without opening a window |
| Refused | batch (every edit verb takes a list instead), export_molecule (an Adom feature, not an EDA job) |
| Kept out | each tool's own plumbing, mechanical formats (import_step, a mechanical DXF) and cloud-package steps (Fusion's make_3d_package, build_library_3d, bind_library_3d); board_source (hands back the tool's native file) |
Status
Version 0.32.0: reads Altium 0.2.93 and KiCad 1.0.107. Altium's 11 blank cells are filled: 9 exact, extensions partial, physical_properties unsupported.
Version 0.31.9: reads Fusion 1.13.64; its edit_tracks is exact.
Version 0.31.8: KiCad's cancel_run is exact (a real Freerouting stop proven on 1.0.100).
Version 0.31.7: the board model names tracks[].id, the handle edit_tracks takes.
Version 0.31.6: coverage reads KiCad bridge 1.0.100 (place_parts, edit_tracks, extensions, preferences, select_items, cancel_run; physical_properties refused with the reason).
Version 0.31.5: coverage reads KiCad bridge 1.0.99 (twelve verbs answered under their own names).
Version 0.31.4: coverage reads Fusion 360 bridge 1.13.59 (public; answers the 0.31 verbs).
Version 0.31.3: the reference is Altium 0.2.89 (import_design and tool_update exact).
Version 0.31.2: Fusion's 22 cloud verbs are listed in the platform tier (#29), outside the totals.
Version 0.31.1: sch_no_connect, sch_label, sch_wire, place_parts, edit_tracks, model_check and extensions join from KiCad (#29), 263 verbs.
Version 0.31.0: physical_properties, preferences, select_items and cancel_run join from Fusion (#29), 256 verbs; proposals may now carry the platform tier.
Version 0.30.14: coverage reads Fusion 360 bridge 1.13.55 (sch_place_part, sch_swap_part and edit_parts exact).
Version 0.30.13: coverage reads Fusion 360 bridge 1.13.52 (public; urgent fix for fusion-bridge#136, no verb changes).
Version 0.30.12: coverage reads Fusion 360 bridge 1.13.49 (public; urgent fix for fusion-bridge#136, no verb changes).
Version 0.30.11: coverage reads Fusion 360 bridge 1.13.47 (public; .lbr files without line breaks are rewritten before USE, fusion-bridge#135).
Version 0.30.10: coverage reads KiCad bridge 1.0.98 (document_info exact).
Version 0.30.9: coverage reads KiCad bridge 1.0.97 (tested on KiCad 10.0.8).
Version 0.30.8: coverage reads Fusion 360 bridge 1.13.44.
Version 0.30.7: coverage reads Fusion 360 bridge 1.13.41 (public; the EAGLE import fix, fusion-bridge#133).
Version 0.30.6: coverage reads KiCad bridge 1.0.96 (net_connections, remove_items and doc_params now exact).
Version 0.30.5: the reference is Altium bridge 0.2.88 (public), which answers all 252 standard verbs (import_design and tool_update partial).
Version 0.30.4: coverage reads KiCad bridge 1.0.95 (public): eleven partials now exact, cross_check from the engine.
Version 0.30.3: coverage reads Fusion 360 bridge 1.13.38 (public; export_manufacturing and pcb_report exact).
Version 0.30.2: coverage reads KiCad bridge 1.0.94 (public): export_3d, import_design, edit_pours, tool_update, and the schematic verbs in the standard's own arguments.
Version 0.30.1: coverage reads Fusion 360 bridge 1.13.37 (engine 0.24.0: bom from the engine; render_board and render_board_layers exact).
Version 0.30.0: engine 0.24.0 answers bom (grouped by part number, a variant applied, order checks, the JLCPCB, Mouser and DigiKey files as text; from the Altium bridge) and cross_check (the sheets' designators against the board's), so every bridge can answer them exactly from the parts it already reads.
Version 0.29.6: the reference is Altium bridge 0.2.87 (engine 0.23.0, sends sheetDrawing).
Version 0.29.5: coverage reads Fusion 360 bridge 1.13.34 (five partials now exact: board_summary, read_schematic, list_library, export_pos, window_info).
Version 0.29.4: coverage reads Fusion 360 bridge 1.13.33 (239 of 252: panel now real; export_3d, import_step and tool_update exact).
Version 0.29.3: coverage reads KiCad bridge 1.0.93 (sends sheetDrawing); sheetDrawing entries may carry sizeMm (the sheet's width and height).
Version 0.29.2: Altium's import_kicad counts as import_design (partial, kicad only).
Version 0.29.1: tool_update (app) and import_step (native) join from fusion-lane (#29). 252 verbs.
Version 0.29.0: three verbs from fusion-lane join the standard (#29): export_3d, import_design and edit_pours (native). 250 verbs.
Version 0.28.2: the reference is Altium bridge 0.2.86, which answers all 247 standard verbs (sch_batch and log_tail added).
Version 0.28.1: coverage reads Fusion 360 bridge 1.13.31 (engine 0.23.0, sends sheetDrawing).
Version 0.28.0: engine 0.23.0: schematic_review reads a sheet's drawing (sheetDrawing, kicad-lane's shape, #29) for dangling wire ends, floating labels and overlapping symbols; placement_check counts a body-less SMD test point as flat under a raised module.
Version 0.27.2: coverage reads KiCad bridge 1.0.92 (log_tail exact; sch_batch partial).
Version 0.27.1: coverage reads Fusion 360 bridge 1.13.30 (engine 0.22.0).
Version 0.27.0: engine 0.22.0 ports kicad-bridge's design checks into schematic_review (I2C pull-ups, reset and enable pins, LED resistors, regulator and bulk capacitors, annotation, no-connect flags on wired pins, two names on one net) and its placement score into placement_check (0-100 and a grade; connectors far from the edge, decoupling far from its IC, ratsnest length) (#29). The reference is Altium bridge 0.2.85; coverage reads Fusion 360 bridge 1.13.29.
Version 0.26.5: sch_batch (core) and log_tail (app) join the standard (#29). 247 verbs.
Version 0.26.4: coverage reads KiCad bridge 1.0.91 (234 of 245: add_symbol_art, build_symbol_modes and cleanup_libs now real verbs).
Version 0.26.3: coverage reads KiCad bridge 1.0.90, which answers every standard verb (swap_footprint, plate_vias, normalize_bodies, symbol_mode added; the Altium-only verbs refuse with a reason).
Version 0.26.2: Fusion maps render_board and export_pos (partial), 228 of 245.
Version 0.26.1: align_footprints and edit_placed_footprint withdrawn: they duplicated align_parts and edit_parts (#29). Four verbs from this round stay: verb_times, prewarm, render_board, export_pos.
Version 0.26.0: six verbs from kicad-lane join the standard (#29): verb_times and prewarm (app), render_board, align_footprints and export_pos (native), edit_placed_footprint (core).
Version 0.25.1: regenerated on kicad-lane's latest #29 equivalents (panel, activate_document).
Version 0.25.0: the reference is Altium bridge 0.2.84, which brings two verbs into the standard: update_footprints_from_library (core, #27) and lint_library (checks, #28). The standard is 241 verbs.
Version 0.24.4: coverage reads Fusion 360 bridge 1.13.26 and kicad-lane's first #29 equivalents (KiCad 219); tiers for update_footprints_from_library (core, #27) and lint_library (checks, #28), which enter the standard with Altium's 0.2.84 reference.
Version 0.24.3: coverage reads KiCad bridge 1.0.89 (214 of 239: animate_view).
Version 0.24.2: engine 0.21.1: duplicate_pad_number counts touching or overlapping pads as one land (a split exposed pad is not a duplicate; KiCad #28). KiCad's swap_footprint is no longer counted as update_footprints_from_library, which does a different job (#27).
Version 0.24.1: coverage reads Fusion 360 bridge 1.13.24 (222 of 239: add_symbol_art, list_installed_libraries and install_library partial; uninstall_library, normalize_bodies and sch_sheet_symbol unsupported).
Version 0.24.0: engine 0.21.0 adds lint_library (#28): the shared library rules (pads, courtyard, origin, pins against pads, part numbers) with a fixed severity each, from the footprints and symbols a bridge already reads.
Version 0.23.8: coverage reads KiCad bridge 1.0.88 (214 of 239: variants, and sch_zoom partial).
Version 0.23.7: coverage reads Fusion 360 bridge 1.13.23 (219 of 239: diagnostics, instances, progress, foreground; panel and selection unsupported).
Version 0.23.6: variants moves from platform to native (Altium, Fusion and KiCad 10 all have assembly variants), so the standard is 239 verbs; coverage reads Fusion 360 bridge 1.13.22 (variants and silkscreen_prep, partial).
Version 0.23.5: coverage reads Fusion 360 bridge 1.13.21 (213 of 238: replicate_layout, symbol_prims, set_visibility, and partial place_on_pcb, place_on_sch, pcb_report).
Version 0.23.4: the reference is Altium bridge 0.2.83 (engine 0.20.0, turned bodies, simulate noise and monteCarlo, a 20x faster board model on large boards).
Version 0.23.3: coverage reads KiCad bridge 1.0.87 (engine 0.20.0, turned bodies, simulate noise and monteCarlo).
Version 0.23.2: coverage reads Fusion 360 bridge 1.13.20 (engine 0.20.0, turned bodies, simulate noise and monteCarlo).
Version 0.23.1: simulate (proposed, #23) takes an optional noise analysis and monteCarlo runs (altium-lane, kicad-lane).
Version 0.23.0: the engine (0.20.0) compares turned 3D bodies by their rectangles (separating axes), not their axis boxes, in
height_check and placement_check; a body row may give {cx, cy, w, h, rotation} or corners (kicad-lane #26: 70
false collisions round a 45-degree QFN). Regenerated with fusion-bridge 1.13.19.
Version 0.22.4: an equivalents entry with a note is taken as deliberate, and the generator no longer warns about it.
Regenerated with kicad-bridge 1.0.86, whose equivalents drop 8 stale entries.
Version 0.22.3: generate.py warns when an equivalents entry maps a verb elsewhere while the bridge has its own same-named verb
(a stale entry had kept four of Altium's sheet verbs at partial; altium-lane emptied its file).
Version 0.22.2: the engine (0.19.1)'s footprint_from_land_pattern lines SOT-23-5's pins 4 and 5 up with 3 and 1, and draws the
courtyard round the pads and body only, not the silkscreen pin-1 dot (kicad-lane #25).
Version 0.22.1: regenerated with fusion-bridge 1.13.15 (Altium-only verbs marked unsupported; swap_footprint, set_models, add_models).
Version 0.22.0: the engine (0.19.0) adds panelize (the Altium bridge's panel plan: V-score or mouse bites, rails, tooling and JLCPCB's
rules) and teardrops (a planner of its own: Altium uses its built-in command), as plans every bridge can apply
(fusion-lane). On the Bluetooth Sentinel, 117 teardrops keep the board's 0.1 mm from other copper (checked
independently) and 8 joints with no room are named.
Version 0.21.2: simulate (proposed, #23) takes an optional sweep (a part's value or a model parameter) and temperatures;
each run is its own signal with its step (altium-lane, kicad-lane).
Version 0.21.1: simulate (proposed, #23) reports notSimulated, the parts a partly modelled sheet left out (altium-lane, kicad-lane).
Version 0.21.0: the engine (0.18.0) adds footprint_from_land_pattern, the Altium bridge's footprint layout, so every bridge lays a
footprint out from a datasheet land pattern the same way and writes it in its own format (fusion-lane). On a QFN-16 the
silkscreen keeps 0.2 mm from copper and the courtyard holds every pad.
Version 0.20.3: the engine (0.17.3) reads a standard width rule's minMm when it has no preferred width, so plan_route routes at
Fusion's EAGLE minimum width (fusion-lane).
Version 0.20.2: the engine (0.17.2) classes a rule by its own name only when it has no Altium ordinal, so Altium's other rules
no longer read as critical ones (0.20.1 read "Routing Topology (Shortest)" as a short-circuit rule).
Version 0.20.1: the engine (0.17.1) fixes fusion-lane's findings in board_report:
- The bridge's BOM gaps reach the assembly section (
lcscMissing). - The DRC section reads each tool's own counts (Fusion's
violationCountandairwires). review_boardclasses a tool's own rule names and takesalwaysChecked.
Version 0.20.0: the engine (0.17.0) adds review_board and board_report from the Altium bridge, the last of the checks Fusion
asked for. board_report runs every engine check on one bundle into a single HTML page, and names the input a section
lacks. On the Bluetooth Sentinel the report builds with ten sections. A package-less supply symbol is no part in
schematic_review and pin_pad_check (fusion-lane).
Version 0.19.0: the engine (0.16.0) adds schematic_review and pin_pad_check from the Altium bridge, reading the sheet parts
and netlist companions.
Version 0.18.0: the engine (0.15.0) adds route_pair and length_tune from the Altium bridge, as plans in route_net arguments.
On the Bluetooth Sentinel, length_tune lengthens IO_Red_LED6 by exactly 3.0 mm with every bump at the board's 0.1 mm
from other copper (checked independently), and says when a net has no room.
Version 0.17.1: the engine (0.14.1)'s find_space {check: true} judges overlaps and the outline as placement_check does: parts
stacked under a raised molecule apart, off the outline by pad centres (fusion-lane on BQ25792).
Version 0.17.0: the engine (0.14.0) adds find_space and check_orientation from the Altium bridge. On the Bluetooth Sentinel the
spots found near U4 keep the 0.25 mm clearance from pads, routed tracks and vias (checked independently).
Version 0.16.0: the engine (0.13.0) adds auto_classes and silk_designators from the Altium bridge. On the Bluetooth Sentinel
every planned designator keeps 0.15 mm from every pad, overlaps no other label and stays on the board (checked
independently).
Version 0.15.2: the engine (0.12.2) fixes fusion-lane's findings:
assembly_checkcounts pads sharing one centre as one land, and leaves out parts with no pads (#24).- A
plan_routethat finds no path while avoiding pours says whether a path exists through them (withoutAvoid, #21).
Version 0.15.1: the engine (0.12.1)'s plan_route explains a no-path answer: its planner block, and the avoided pours at each end
pad with whether they are exempt (fusion-lane #21).
Version 0.15.0: the engine (0.12.0) adds assembly_check (matching the Altium bridge's answers on its test boards) and
net_lengths, both from the Altium bridge. Altium 0.2.80 answers the four planners from the engine.
Version 0.14.0:
- The engine (0.11.0) writes IPC-2581 revision C (
export_ipc2581, from the Fusion bridge's writer, #16). The Bluetooth Sentinel, Altium's lane board and a board with an oval pad, an arc outline and a pour with a hole all validate against the IPC-2581C schema. - The standard carries kicad-lane's
simulateandexport_spiceproposals (#23).
Version 0.13.4: the engine (0.10.4)'s plan_route (fusion-lane #21):
- A pour holding the route's own end pad is exempt from
avoidPours. plannerechoes the pour settings.- Grid staircases are smoothed into straight and 45-degree segments.
On the Bluetooth Sentinel, IO_Red_LED6 goes from 42 corners to 19 and 59.5 mm to 57.1 mm, still at the board's 0.1 mm
(checked independently).
Version 0.13.3: the engine (0.10.3)'s plan_route takes avoidPours as a list of nets, and a pourCost that prefers going round
pours without forbidding them (fusion-lane #21: on BQ25792 a hard block found no path).
Version 0.13.2: the engine (0.10.2)'s plan_fanout works on a routed board (altium-lane #22):
- It skips pins already routed.
- It measures every via and stub against other nets' tracks, arcs and vias, not only pads.
- It keeps the exposed-pad grid off existing holes, and names the pours it runs into.
On the Bluetooth Sentinel, U4's plan clears all other-net copper by 0.206 mm or more (checked independently).
Version 0.13.1: the engine (0.10.1)'s place_decoupling keeps each cap clear of the IC's planned fanout (leaveFanout), so placing
caps first no longer blocks the escape stubs and vias (altium-lane: 5 conflicts on the Bluetooth Sentinel's U4, now 0).
Version 0.13.0: the engine (0.10.0) fixes what fusion-lane found placing plans on a real board (#21, #22):
- plan_route checks a through via on every copper layer, not only the planned ones.
- It keeps the strictest board-wide clearance rule, not the smallest.
- It names other nets' pours a route crosses (
crossesPours), and can avoid them (avoidPours). - check_clearance lists stacked parts apart, as placement_check does.
- A cap place_decoupling cannot move keeps its spot, and
icPowerNetslists supplies only.
Version 0.12.0: the engine (0.9.0) adds estimate_cost from the KiCad bridge's fab.rs, without its hard-coded rates: prices come
in as a record read from the fab's own page with its date (prices), and without one the reply is the board's numbers.
On the Bluetooth Sentinel those numbers match the Altium bridge's own fab_check.
Version 0.11.0: the engine (0.8.0) adds plan_fanout from the KiCad bridge's place_tools. It also measures each via and stub
against every other net's pad on the board (conflicts). On the Bluetooth Sentinel's QFNs it plans U1 and U4 clean and
names U3's three collisions with nearby passives, the same three an independent check finds.
Version 0.10.0: the engine (0.7.0) adds check_clearance and place_decoupling from the KiCad bridge's place_tools.
place_decoupling answers move_parts arguments and checks them with placement_check. On the Bluetooth Sentinel it places
U1's, U3's and U4's caps, each cap with one IC, leaving the crystal caps out, and every cap keeps 0.3 mm from other
copper (checked independently).
Version 0.9.1: the engine (0.6.1)'s plan_route takes its track width and via from the board's width and via rules
unless the args give them, so a planned route passes the board's DRC; planner says where each came from (altium-lane PR #4).
Version 0.9.0: the engine (0.6.0) plans a route between two pads (plan_route), from the Fusion bridge's grid search, on
any listed copper layers; on the Bluetooth Sentinel its routes and vias keep the board's 0.1 mm clearance (checked
independently).
Version 0.8.1: the engine (0.5.1)'s marking font draws D and B so they read as D and B, not "IO" and 8 (PR #3).
Version 0.8.0: the engine (0.5.0) writes a part's 3D body as STEP from its package dimensions (generate_body, from the
Altium bridge's body3d.rs, PR #2, #20); it matches Fusion's generator on a 0603, SOIC-8, QFN-32 and QFP-48.
Version 0.7.1: the engine (0.4.1)'s placement_check lists a part under a raised one (an Adom molecule on pins) as
stacked, not as a courtyard overlap, when their pads stay apart and no bodies meet in 3D (fusion-lane #19).
Version 0.7.0: the engine (0.4.0) adds height_check and placement_check from the Altium bridge, reading the 3D bodies
companion; both match Altium's answers on its test boards, and Fusion gets them for the first time.
Version 0.6.0: the engine (0.3.0) adds thermal_vias and via_fence from the Altium bridge, as plans in place_vias
arguments, so KiCad and Fusion can swap their own copies for one; every engine reply names its version (engine).
Version 0.5.1: the engine (0.2.1) writes one GenCAD shape per footprint pattern and pad geometry: two different
footprints of the same name get NAME and NAME_2, and a rotated part's micron-off pins still share their shape
(fusion-lane #17).
Version 0.5.0: the engine (0.2.0) carries shared board-file writers, GenCAD, DXF per layer and SVG to regions, from
altium-lane's writers (#16, PR #1); its DXF draws the copper actually poured when given pours.
Version 0.4.5: the engine (0.1.4) lists each layer once in current_capacity's poursOn (kicad-lane #15); KiCad now
answers four checks from the engine too.
Version 0.4.4: the engine (0.1.3) counts only copper-to-copper clearance rules: a rule naming the edge, mask, silk,
holes, a keepout or the same net is skipped (fusion-lane #13).
Version 0.4.3: the engine (0.1.2) reads a clearance rule written as a value with its unit (0.1mm, Fusion's form) and
leaves same-net spacing rules out; Altium and Fusion now both answer their checks from the engine.
Version 0.4.2: the engine (0.1.1) names a stack's copper layers by the stack entry's layer, or by place (In<n>.Cu),
planes included, as 0.3.1 settled; from altium-lane, which runs the engine inside the Altium bridge now.
Version 0.4.1: coverage counts only what works: a bridge marks a verb partial (with a note) or unsupported in its
equivalents file (conventions); sheet on a tool without sheet files is the sheet number.
Version 0.4.0: the checks engine, adom-eda-checks, is on this page in engine/ with its first five checks; fab limits
come in from adom/pcb-design-rules, never built in. Version 0.3.1: an internal plane is named In<n>.Cu by its place in the copper stack, with kind: "plane" (board model); the stack-up companion gives each copper layer's board model name in layer. Version 0.3.0: 33 more verbs from other bridges, all agreed by the Altium bridge's thread: 26 from the KiCad bridge (the board exports ODB++, IPC-2581, IPC-356, GenCAD and DXF, render_board_3d, remove_parts, edit_parts, align_parts, copy_routing, projects, library footprints, estimate_cost, check_clearance, place_decoupling, plan_fanout) and 7 from the Fusion bridge (bodies, render_board_layers, plan_route, generate_body, library_views, close_all_documents, document_info). A bridge's own equivalents now win over a name match, so a verb that shares a standard name but does another job is not credited for it. Version 0.2.1: this page has one keeper (standard-lane) and bridge threads push only their own files (Keeping it in
sync), one file per owner (tools/equivalents/<bridge>.json, tools/proposed/<thread>.json); the decisions on the KiCad and Fusion proposals are written down above; a lesson from the Fusion bridge on DRC severity is in
docs/conventions.md. Version 0.2.0: verbs can come from any bridge. The first batch, 21 schematic verbs from the KiCad bridge
(sch_connect_pins, sch_bus, sch_items, sch_pins, sch_trace_point, render_schematic ...), was agreed by the
Altium bridge's thread; Altium now shows those as gaps. Earlier: version 0.1.2: the verbs, the board model and the conventions, with Altium bridge 0.2.75 as the reference. 0.1.1
settles the questions the KiCad and Fusion bridges raised as they adopted the board model (the y-down frame, pour
islands, fractured fills, custom pads, reply units): the answers are in docs/board-model.md.
Next: the rest of the checks tier moves into the engine (assembly, 3D heights, placement, schematic review, pair routing, length tuning, designators, via fences, panels, the board report), and each bridge swaps its own copies for it, Altium first.