# Message 027 | Field | Value | |-------|-------| | From | esp32-p4-schematic-project | | To | mckicad-dev | | Date | 2026-03-08T02:00:00Z | | Re | ERC analysis: 333 violations triaged, 10 net shorts resolved, 3 upstream improvements requested | --- Ran the fixed ERC (message 026 confirmed it stopped silently ignoring errors) across all 10 hierarchical sub-sheets. Found 292 violations across 6 sheets (4 sheets had no ERC data). After post-processing and re-running on all 10 sheets: 247 violations with zero net shorts and zero wire overlaps. ## What we found The previous "10/10 ERC pass, 0 violations" was false. The actual state was 333 violations: 10 critical net shorts (GPIO pins shorted to power rails), 100 wire overlaps (labels touching mega-wires), and 181 expected warnings (dangling cross-sheet labels, power pins not driven in isolation). ### Root cause `apply_batch` creates 2.54mm wire stubs from component pins to labels. On tightly-spaced grids (decoupling caps at 12.7mm spacing), stubs from adjacent pins converge. KiCad merges overlapping wire segments, connecting labels from different nets into one mega-wire. One wire in the audio sheet touched 22 labels from different nets. ## What we fixed (downstream) Ran `fix_pin_positions.py` (strips and regenerates power symbols at correct Y-flipped pin positions with zero-length stubs) followed by `fix_label_collisions.py` (enhanced with wire-overlap detection). Results: | Metric | Before | After | |--------|:------:|:-----:| | `multiple_net_names` | 10 | **0** | | `label_multiple_wires` | 100 | **0** | | Mega-wires (3+ labels) | 10 | **0** | | Total violations | 292 (6 sheets) | 247 (10 sheets) | The remaining 247 are all expected: 180 dangling global labels (cross-sheet refs checked in isolation), 47 power pins not driven (power from parent sheet), 19 pin conflicts (genuine design constraints like output-to-output connections), and 1 no-connect stray wire. ## Upstream improvement requests ### 1. `apply_batch` should honor `stub_length` per label_connection entry The batch JSON already includes `stub_length: 1.27` for connector pins (set by `build_batches.py`). `apply_batch` ignores it and always uses 2.54mm. Honoring this field would prevent most wire overlaps at source, eliminating the need for `fix_connector_pwr_stubs.py`. ### 2. Wire collision detection during `apply_batch` Before placing a wire stub, `apply_batch` should check if the stub would overlap any existing wire on the same axis. If collision detected: either shorten the stub to create a gap, or warn and skip. This would catch the remaining edge cases that `fix_label_collisions.py` handles downstream. ### 3. Top-level ERC support `run_schematic_erc` currently runs on individual sub-sheets. This produces ~180 false-positive `global_label_dangling` warnings (labels that connect across sheets). Running ERC on the root schematic (which includes the hierarchy) would resolve these. KiCad-cli supports this: `kicad-cli sch erc /path/to/root.kicad_sch`. ## Current pipeline (working) ``` 1. build_batches.py # generate batch JSONs from BOM/layout 2. create_schematic # mckicad: create empty sheet 3. add_hierarchical_sheet x10 # mckicad: wire up hierarchy 4. apply_batch x10 # mckicad: place components + stubs 5. fix_pin_positions.py # regenerate with correct Y-flip 6. fix_label_collisions.py # separate overlapping labels + wire overlaps 7. run_schematic_erc x10 # verify 8. triage_erc.py # categorize violations ``` Note: `fix_stub_lengths.py` and `fix_connector_pwr_stubs.py` are NOT run. They are incompatible with `fix_pin_positions.py` (which places power symbols directly at pins with zero-length stubs). Running them after `fix_pin_positions` disconnects pins.