Multi-Board Net Classes

The container holds the canonical net classes for a multi-board project. On container save, those classes propagate physically into every sub-project's .kicad_pro. Each sub-project keeps the result in its own settings and uses it for ERC, DRC, routing, and rendering.

Local Nets

When replication happens

Replication runs on container save:

  • From the desktop: when you click OK on Schematic Setup → Net Classes (container mode), MultiBoardPropagateNetSettings runs.
  • From the agent / Python: mbs_setup and set_netclass persist the container, then run the propagator before returning.

Disk-only sub-projects (not currently open) are loaded ephemerally, updated, and unloaded after.

What replicates

All net-class fields except priority:

  • Clearance, track width, via diameter / drill, microvia diameter / drill
  • Differential pair width / gap / via gap
  • Wire width, bus width, line style
  • Tuning profile
  • PCB color, schematic color

Priority is per-sub-project. Each board's net class grid keeps its own row order; the container's priority is never propagated. This avoids spurious conflicts when either board's grid order changes.

The Status column

The Status column appears on Schematic Setup → Net Classes (and PCB Setup → Net Classes). Its values depend on whether you're viewing from a sub-project or from the container.

On a sub-project

StatusMeaning
SharedClass name and all replicated fields match the container's copy
LocalClass exists only on this sub-project (no container match)
ConflictClass name exists on both, but at least one field differs

On the container (MBSCH)

Opening Schematic Setup from the MBSCH shows an aggregated view across the container and every sub-project. Status values:

StatusMeaning
SourceThe container defines this class and no sub-project has a same-named class
SharedEvery sub-project that has this class matches the container
ConflictAt least one sub-project has a same-named class with diverging fields
Only on <board>A sub-project defines this class but the container doesn't

Only on <board> rows are read-only on the container view. The container is the canonical source, so sub-project-only classes are surfaced for visibility but can't be edited here. Container rows remain editable.

Conflict resolution

When propagation finds a conflict (same name, different fields), the Net Class Conflict dialog opens for each affected class. Four options per conflict:

  • Use container value: overwrite the sub-project's class with the container's
  • Keep sub-project value: leave the sub-project unchanged
  • Merge: union the field sets. Only available when no field has a different value on each side (e.g. one side specifies clearance, the other specifies track width, neither contradicts). Disabled with a tooltip when the values truly conflict.
  • Skip this class: do nothing on this sub-project, leave the existing state

Each option has an Apply to all remaining conflicts checkbox to bulk-resolve. Sticky Merge only applies to subsequent conflicts that are also mergeable; non-mergeable conflicts re-prompt.

Conflict

Headless callers (agent, Python) don't see the dialog. The handler resolves conflicts silently using "Use container value". The Merge option is desktop-only; headless mutations always go through the binary use-or-keep decision. The response counters report how many classes were added, overwritten, kept, or skipped.

The Default class

Every project has a Default net class. It always exists and can be modified, but cannot be created or deleted. The agent and Python APIs return an error if you try to delete it; the desktop UI hides those actions for the Default row.

From the agent and Python