PCB Revision Witness Review Priority v0.2
Executive Summary
PCB Revision Witness v0.2 converts PCB structural drift into a ranked review-priority queue. It prioritizes changes involving debug/programming nets, power rails, 0-ohm bridges, connector-adjacent route changes, trace layer changes, new vias, BOM substitutions, and coordinate drift.
**Status:** `REVIEW_PRIORITY_TARGETS_IDENTIFIED`
**Review targets:** 7
**HIGH / MEDIUM / LOW:** 1 / 2 / 4
Claim Boundary
Review-priority triage only; not electrical validation, DFM/DRC/ERC replacement, proof of malicious intent, or production board signoff.
Scoring Model
| Priority | Rule |
|---|---|
| HIGH | score >= 80 |
| MEDIUM | 45 <= score < 80 |
| LOW | score < 45 |
Signals scored: debug/programming/control net, power/ground net, 0-ohm bridge / jumper, BOM value substitution, trace layer change, new vias, connector-adjacent layout, component coordinate drift.
Review Priority Table
| Rank | Priority | Score | Target | Affected nets | Reasons |
|---:|---|---:|---|---|---|
| 1 | HIGH | 100 | R5 added: 0R on GND / RESET_BOOT | GND, RESET_BOOT | added passive component; 0-ohm bridge / jumper value; touches debug/programming/control net; touches power/ground rail; bridges sensitive net to rail |
| 2 | MEDIUM | 67 | USB_D_P routing changed | USB_D_P | trace layer set changed ['F.Cu'] -> ['B.Cu', 'F.Cu']; new vias on net: 2; connector-adjacent route change; external interface net |
| 3 | MEDIUM | 60 | RESET_BOOT routing changed | RESET_BOOT | trace layer set changed [] -> ['F.Cu']; debug/programming/control net |
| 4 | LOW | 40 | New net inventory entry: DEBUG_BRIDGE | DEBUG_BRIDGE | new net label in candidate; debug/programming/control-like name |
| 5 | LOW | 33 | C1 changed: 100nF -> 1uF | 3V3, GND | component value substitution; coordinate drift 2.220 mm; power/ground net adjacency |
| 6 | LOW | 28 | 3V3 routing changed | 3V3 | power/ground net |
| 7 | LOW | 28 | GND routing changed | GND | power/ground net |
Detailed Review Targets
1. HIGH - R5 added: 0R on GND / RESET_BOOT
- **Score:** 100
- **Affected nets:** GND, RESET_BOOT
- **Affected region:** `{"max_x": 48.35, "max_y": 46.6, "min_x": 47.65, "min_y": 45.9}`
- **Reasons:** added passive component; 0-ohm bridge / jumper value; touches debug/programming/control net; touches power/ground rail; bridges sensitive net to rail
- **Evidence:** `{"bom": {"manufacturer": "Yageo", "mpn": "RC0402JR-070RL", "quantity": "1", "reference": "R5", "value": "0R"}, "component": {"footprint": "Resistor_SMD:R_0402_1005Metric", "layer": "F.Cu", "nets": ["GND", "RESET_BOOT"], "reference": "R5", "rotation": 90.0, "value": "0R", "x": 48.0, "y": 46.25}}`
2. MEDIUM - USB_D_P routing changed
- **Score:** 67
- **Affected nets:** USB_D_P
- **Affected region:** `{"max_x": 52.35, "max_y": 52.1, "min_x": 32.85, "min_y": 47.45}`
- **Reasons:** trace layer set changed ['F.Cu'] -> ['B.Cu', 'F.Cu']; new vias on net: 2; connector-adjacent route change; external interface net
- **Evidence:** `{"added_segments": [{"end": [42.0, 47.8], "layer": "F.Cu", "net": "USB_D_P", "start": [33.2, 49.0], "width": 0.15}, {"end": [52.0, 51.75], "layer": "B.Cu", "net": "USB_D_P", "start": [42.0, 47.8], "width": 0.15}], "added_vias": [{"at": [42.0, 47.8], "drill": 0.3, "net": "USB_D_P", "size": 0.6}, {"at": [52.0, 51.75], "drill": 0.3, "net": "USB_D_P", "size": 0.6}], "removed_segments": [{"end": [52.0, 51.75], "layer": "F.Cu", "net": "USB_D_P", "start": [33.2, 49.0], "width": 0.15}], "removed_vias": []}`
3. MEDIUM - RESET_BOOT routing changed
- **Score:** 60
- **Affected nets:** RESET_BOOT
- **Affected region:** `{"max_x": 48.8, "max_y": 48.6, "min_x": 47.65, "min_y": 45.9}`
- **Reasons:** trace layer set changed [] -> ['F.Cu']; debug/programming/control net
- **Evidence:** `{"added_segments": [{"end": [48.0, 48.25], "layer": "F.Cu", "net": "RESET_BOOT", "start": [48.45, 46.25], "width": 0.1}], "added_vias": [], "removed_segments": [], "removed_vias": []}`
4. LOW - New net inventory entry: DEBUG_BRIDGE
- **Score:** 40
- **Affected nets:** DEBUG_BRIDGE
- **Affected region:** `null`
- **Reasons:** new net label in candidate; debug/programming/control-like name
- **Evidence:** `{"net": "DEBUG_BRIDGE"}`
5. LOW - C1 changed: 100nF -> 1uF
- **Score:** 33
- **Affected nets:** 3V3, GND
- **Affected region:** `{"max_x": 48.15, "max_y": 48.85, "min_x": 45.65, "min_y": 46.85}`
- **Reasons:** component value substitution; coordinate drift 2.220 mm; power/ground net adjacency
- **Evidence:** `{"candidate_bom": {"manufacturer": "Murata", "mpn": "GRM155R61A105KE15D", "quantity": "1", "reference": "C1", "value": "1uF"}, "candidate_component": {"footprint": "Capacitor_SMD:C_0402_1005Metric", "layer": "F.Cu", "nets": ["3V3", "GND"], "reference": "C1", "rotation": 0.0, "value": "1uF", "x": 47.8, "y": 47.2}, "reference_bom": {"manufacturer": "Murata", "mpn": "GRM155R71C104KA88D", "quantity": "1", "reference": "C1", "value": "100nF"}, "reference_component": {"footprint": "Capacitor_SMD:C_0402_1005Metric", "layer": "F.Cu", "nets": ["3V3", "GND"], "reference": "C1", "rotation": 0.0, "value": "100nF", "x": 46.0, "y": 48.5}}`
6. LOW - 3V3 routing changed
- **Score:** 28
- **Affected nets:** 3V3
- **Affected region:** `{"max_x": 48.35, "max_y": 49.1, "min_x": 45.2, "min_y": 46.85}`
- **Reasons:** power/ground net
- **Evidence:** `{"added_segments": [{"end": [48.0, 48.75], "layer": "F.Cu", "net": "3V3", "start": [47.35, 47.2], "width": 0.25}], "added_vias": [], "removed_segments": [{"end": [48.0, 48.75], "layer": "F.Cu", "net": "3V3", "start": [45.55, 48.5], "width": 0.25}], "removed_vias": []}`
7. LOW - GND routing changed
- **Score:** 28
- **Affected nets:** GND
- **Affected region:** `{"max_x": 48.6, "max_y": 49.6, "min_x": 46.1, "min_y": 45.9}`
- **Reasons:** power/ground net
- **Evidence:** `{"added_segments": [{"end": [48.0, 49.25], "layer": "F.Cu", "net": "GND", "start": [47.55, 46.25], "width": 0.1}, {"end": [48.0, 49.25], "layer": "F.Cu", "net": "GND", "start": [48.25, 47.2], "width": 0.25}], "added_vias": [], "removed_segments": [{"end": [48.0, 49.25], "layer": "F.Cu", "net": "GND", "start": [46.45, 48.5], "width": 0.25}], "removed_vias": []}`
What Requires Human Review
- Confirm whether added passives/jumpers are authorized ECOs.
- Review sensitive/debug/control net bridges to power or ground rails.
- Review connector-adjacent reroutes and layer changes against signal-integrity constraints.
- Classify BOM substitutions as authorized alternates, procurement substitutions, or unexplained changes.
Limitations
- Prototype KiCad parser only; production use should add native KiCad/IPC-2581/ODB++/Altium ingestion.
- Ranking is deterministic triage, not proof of malicious intent.
- Electrical behavior, impedance, manufacturability, ERC/DRC, inspection, and certification remain outside scope.