Open PR #4 draft PR #9 merged bug report

KiCad generated DRUs 55/55 invalid; PCBWay 4L outer/PTH minima need source audit

Josh Aberdeen · 9d ago

Verified problem: all generated KiCad DRUs fail parser

Using the current publicly served adom/pcb-design-rules source and the native KiCad custom-rules parser through ADOM bridge, we tested all 55 generated kicad/*.kicad_dru files across 13 vendors. 55/55 were rejected, each with rule min-hole: unknown constraint type 'hole'; rule_count=0. In tools/generate.py the generator emits (constraint hole (min ...)), while KiCad expects hole_size. We reproduced the served pcbway-4L.kicad_dru byte-for-byte from the unmodified generator (SHA-256 09074b07419730ebac73432d37acc946d9c10706ac323d2651142c5eb65f7244).

An isolated candidate changed hole to hole_size and generated annular-width/hole-to-hole rules from already recorded fields. 55/55 then passed syntax parsing, but that is expressly not evidence that the rules enforce all actual fab capabilities; no production files were modified, no UMCU21 ADOM Rules gate accepted.

PCBWay 4-layer source-applicability audit: additional under-enforcement

For standard 4L with 1 oz outer and inner copper, PCBWay's capabilities table (https://www.pcbway.com/capabilities.html, read 2026-11-02) distinguishes:

  • 35 µm inner-layer conventional track width/spacing >= 4/5 mil;
  • 35 µm outer-layer conventional track width/spacing >= 5/6 mil;
  • outer 35 µm annular ring: via-hole >= 5 mil, component-hole >= 10 mil, with an additional generic statement for pads with vias in the middle >= 0.15 mm;
  • component-hole to component-hole >= 16 mil; via-to-via (<=0.45 mm) >= 11 mil;
  • four-layer minimum inner hole-to-copper isolation >= 7 mil.

The existing generated PCBWay 4L pack carries a *.Cu 4/5 mil track/spacing pair, leaving outer-layer 1 oz clearances below the conventional values; it has no distinct PTH annular constraint or inner hole-isolation rule. The candidate's annular_width (min 0.15mm) applied indiscriminately to via and pad does not enforce conventional 0.254 mm component-hole annular ring. Because conditions are part of KiCad's precedence and applicability, a syntax-parse PASS alone cannot resolve these defects.

Requested maintainer path

  1. Fix the invalid hole generator keyword and add regression coverage for all generated KiCad DRUs.
  2. Audit PCBWay 4L and other vendors' source applicability by copper weight, layer and drill-pad type; distinguish more conservative overall values from properly conditioned rules.
  3. Verify actual native DRC negative controls for track/via/PTH/zone/netclass clearance, annular width, hole-to-hole and hole-to-copper; validate Board Setup constraints separately.
  4. Cross-check existing upstream discussion PR #2 (global ID 98), issues #2, #4 and #5 before modifying shared generator behaviour. In particular, issue #5 documents that an unconditional minimum clearance can reduce a board's intended zone/netclass spacing.
  5. Publish regenerated rules only after engineering source/negative-control review; do not merge or bulk change 55 vendors on syntax success alone.

The isolated proposal and source-hash evidence are in PCB Design Studio draft PR #162: https://github.com/Unclefungussz/PCB-Design-Studio-/pull/162 (studio-control/manufacturing/postgres/upstream-adom-proposal/). The existing UMCU21 Stage 2 is HOLD on the native loaded pack; Stage 3 remains locked. No fabrication, firmware, CAD or live rule setting has been overridden.

The objective is a correct, reviewable upstream correction, not a workaround that marks a bad rule as passed.

3 Replies

Josh Aberdeen mentioned this in pull request #3 · 9d ago
Josh Aberdeen mentioned this in pull request #4 · 9d ago
Josh Aberdeen mentioned this in pull request #6 · 9d ago
Josh Aberdeen mentioned this in pull request #7 · 9d ago
Josh Aberdeen · 9d ago ·edited

Circuit Forge UMCU21 is commissioning native ADOM AI Flow Stage 2 Rules with an independent PostgreSQL gate. It is still HOLD; no stage jump or manufacturer waiver.

CURRENT SMALLEST COMPLETE REVIEW REQUEST — please review PR #9 (global 383). It supersedes PR #8 and #7. The latter drafts should be closed only after #9 is reviewed.

The PR carries exactly one opt-in PCBWay standard four-layer 1 oz strict profile. On the candidate generator, 298 generated-and-committed files were compared: eight changed, ALL PCBWay 4-layer (KiCad DRU, Board Setup, Fusion 2, Altium, index, README). All other outputs remained byte-identical. Source generator, record and regression tests are included (11 files in PR). The candidate exact DRU SHA-256 is ed114795f294b9e6355627166f0d557132d848f2325389c8f54b0b7cf7ee0ef4; Board Setup SHA-256 01edbd0b23d3bbe4807e6428dc24ca4dfe320bb4986a963db44c914e4d33a9a5.

The real safety failures in the published pack are a global 0.127 mm custom copper clearance overriding stricter netclasses, weak 1 oz outer copper limits, and missing annular-ring/hole controls. PR #9 sources 35 um outer standard 5/6 mil and preserves a 0.1524 mm board-level clearance floor while keeping stronger netclasses. Candidate native KiCad 10 DRC violating/compliant and netclass-floor coupons are documented.

Corrections to our earlier report: KiCad 10 DOES accept constraint hole; the initial rejection was an ADOM Bridge precheck, not KiCad DRC. There is NO pre-existing main-generator drift; earlier comparison was against the rebased PR #7 generator. Both claims are withdrawn. Native AI Flow issue #120 is separately fixed since v0.2.34.

Specific maintainer decision requested: Please review the one-record opt-in kicadStrict schema design and the conservative vendor values. If satisfactory, approve/merge PR #9 into the authoritative default publisher and confirm the published strict DRU + companion Board Setup bytes. If not, identify exact necessary changes and we'll retest. Actual first-board pad/zone, solder mask, stackup and Board Setup import remain separately hard-gated at their real ADOM stages; they are not falsely claimed passing here.

Only after upstream publication will UMCU21 use the genuine native rules profile, source-hash its loaded files, run native KiCad checks and request independent PostgreSQL acceptance. No local fabricated publication, manual run.json edit, manufacturing order, or waiver.

Josh Aberdeen mentioned this in pull request #8 · 9d ago
Josh Aberdeen mentioned this in pull request #9 · 9d ago
John Lauer · 7d ago

Status: PR #9 is merged, so the PCBWay standard 4-layer 1 oz pack is now the sourced strict profile (details and hashes on PR #9). Your correction is right: KiCad 10 accepts constraint hole. We measured it independently on 10.0.6 for adom/adom-aiflow#120, where it enforced exactly like hole_size.

Leaving this issue open for the broader items 2 and 3: auditing the other vendors' applicability by copper weight, layer and drill-pad type, and native negative controls. The unconditional-clearance pattern from issue #5 is the first thing to check across the other packs.

John Lauer · 7d ago

Josh, a heads-up before it lands, so your gate isn't surprised: your strict pack is moving to its own name, with the same bytes and the same hashes.

What your gate loads New path SHA-256 (unchanged)
kicad/pcbway-4L.kicad_dru kicad/pcbway-4L-circuit-forge-strict.kicad_dru ed114795f294b9e6355627166f0d557132d848f2325389c8f54b0b7cf7ee0ef4
kicad/pcbway-4L.board-setup.json kicad/pcbway-4L-circuit-forge-strict.board-setup.json 01edbd0b23d3bbe4807e6428dc24ca4dfe320bb4986a963db44c914e4d33a9a5

The Fusion and Altium files move the same way (-circuit-forge-strict suffix).

Why: after merging #9 we realised it made your comfort margins the default for every Adom user on PCBWay 4-layer. In two places that default was now stricter than PCBWay publishes: 4 mil inner track width, and 0.30 mm via-to-via hole spacing. Someone pushing PCBWay to its published limits would fail DRC on a board PCBWay builds. So this page now has two layers:

  • Published (the default): exactly the fab's published limits, split the way the fab splits them. For PCBWay 4L 1 oz:

    • track width: 5 mil outer, 4 mil inner;
    • hole spacing: 0.30 mm via to via, 0.45 mm where a component hole is involved;
    • rings: 0.15 mm via, 0.254 mm PTH;
    • hole to inner copper: 7 mil;
    • edge clearance: 0.25 mm;
    • silkscreen text: 0.8 mm minimum height.

    Your structural fixes all stay: no unconditional custom clearance (the board floor carries 0.1524 mm, 6 mil), the 1 oz outer minimums, the separate rings, the hole controls, and every rule at error.

  • Profiles: opt-in, each naming its author and reason. circuit-forge-strict is the first. It's frozen at your reviewed bytes, and a test fails if they ever change. Anyone can add a profile by PR; README "Published limits and profiles" has the format.

KiCad 10 loads the new published pack with its bare (layer outer)/(layer inner) qualifiers; I checked it against a real board. One clearance limitation is documented: KiCad can't set a per-layer clearance floor without a custom rule that overrides netclasses, so the 6 mil outer value applies to inner layers too, 1 mil above PCBWay's published inner 5 mil.

AI Flow will ask each user at the start which pack and profile to use, and record the choice. Your runs can name circuit-forge-strict explicitly.

Log in to reply.