← Commit history
docs/results/boards/tmf8829-adapter-molecule.pngadded
⋯ 1 unchanged line ⋯
docs/results/boards/tmf8829-molecule.pngadded
⋯ 1 unchanged line ⋯
docs/results/ledger.jsonladded+44
@@ -0,0 +1,44 @@+{"board": "adom/amfm-receiver-molecule", "run": "first", "parts": 403, "connections": 543, "routed": 540, "kicad": {"violations": {}, "unconnected": 6}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 31, "perRule": {"cap-first": 4, "corner-90": 2, "crystal-chain": 1, "fill-unfed": 15, "fold-back": 1, "layer-hop": 26, "pad-entry": 68, "pad-entry-oblique": 1, "route-efficiency": 1, "same-net-parallel": 1, "square-t": 3, "unconnected": 4, "via-count": 3, "via-in-trace": 3, "width-steps": 8, "xtal-load-cap-line": 3, "xtal-series-line": 1}, "vias": 591, "copper_mm": null}, "checkOnOriginal": {"errors": 68, "perRule": {"cap-first": 4, "corner-90": 8, "crystal-chain": 1, "layer-hop": 2, "off-45": 25, "pad-entry": 81, "pad-entry-oblique": 1, "route-efficiency": 6, "square-t": 30, "via-in-trace": 2, "width-steps": 1, "xtal-load-cap-line": 3, "xtal-series-line": 1}, "vias": 976, "copper_mm": null, "error": null}, "notes": ["note: for the designer: the GND pour refills into 8 extra separate pieces, cut by /FM_Frontend/FM_BPF, VT_FM, /Tuning_UI/VTR_OUT, /Tuning_UI/PWM_F2, AM_AUDIO, /FM_Frontend/CAL_INJ, +3.3VA, /Power_MCU/HSE_IN, /Power_MCU/H", "note: for the designer: FM_EN_N R218.2 to U103.47: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: AM_EN_N R220.2 to U103.48: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: LED_STAT R226.1 to U103.27: the search ran out of budget before reaching it, even allowed to move routes"], "picture": "boards/amfm-receiver-molecule.png"}+{"board": "adom/amfm-receiver-molecule", "run": "current", "parts": 403, "connections": 543, "routed": 539, "kicad": {"violations": {}, "unconnected": 4}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 26, "perRule": {"cap-first": 4, "corner-90": 1, "crystal-chain": 1, "fill-unfed": 12, "layer-hop": 27, "pad-entry": 69, "pad-entry-oblique": 1, "route-efficiency": 1, "same-net-parallel": 1, "square-t": 3, "unconnected": 4, "via-count": 3, "via-in-trace": 3, "width-steps": 2, "xtal-load-cap-line": 3, "xtal-series-line": 1}, "vias": 584, "copper_mm": null}, "checkOnOriginal": {"errors": 68, "perRule": {"cap-first": 4, "corner-90": 8, "crystal-chain": 1, "layer-hop": 2, "off-45": 25, "pad-entry": 81, "pad-entry-oblique": 1, "route-efficiency": 6, "square-t": 30, "via-in-trace": 2, "width-steps": 1, "xtal-load-cap-line": 3, "xtal-series-line": 1}, "vias": 976, "copper_mm": null, "error": null}, "notes": ["note: for the designer: the GND pour refills into 7 extra separate pieces, cut by /FM_Frontend/FM_BPF, /Tuning_UI/VTR_OUT, /Tuning_UI/PWM_F2, /FM_IF/V_IF4, AM_AUDIO, /FM_Frontend/CAL_INJ, CAL_MARK, +3.3VA, /Power_MCU/HSE", "note: for the designer: SWCLK U103.36 to MC7.1: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: FM_EN_N R218.2 to U103.47: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: AM_EN_N R220.2 to U103.48: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: LED_STAT R226.1 to U103.27: the search ran out of budget before reaching it, even allowed to move routes"], "picture": "boards/amfm-receiver-molecule.png"}+{"board": "adom/carrier-fc-rp2350a-mini", "run": "first", "parts": 80, "connections": 74, "routed": 62, "kicad": {"violations": {}, "unconnected": 12}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 13, "perRule": {"layer-hop": 2, "pad-entry": 1, "pad-entry-oblique": 1, "pair-coupling": 1, "route-efficiency": 5, "same-net-parallel": 1, "unconnected": 12, "via-in-trace": 1, "width-steps": 1}, "vias": 57, "copper_mm": null}, "checkOnOriginal": {"errors": 10, "perRule": {"clearance": 6, "corner-90": 1, "fold-back": 1, "pad-entry": 7, "rail-floor": 1, "square-t": 1, "via-in-trace": 1, "via-stand-off": 1}, "vias": 101, "copper_mm": null, "error": null}, "notes": ["note: for the designer: /ESC_SIG.IO9 MC21.1 to U2.15: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /ESC_UART0_TX.IO12 MC24.1 to U2.16: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /ESC_UART0_RX.IO13 MC25.1 to U2.19: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /FC_SWCLK J1.1 to U2.23: no path even through the routes it may move: pads, fills or protected copper wall it in", "note: for the designer: /FC_DIO J1.3 to U2.24: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: +5V C3.1 to C3.1: no legal path found within the time limit", "note: for the designer: /WS0_DIN.IO0 LED2.3 to U2.3: no legal path found within the time limit", "note: for the designer: /ESC_RST.IO7 MC22.1 to U2.12: no legal path found within the time limit", "note: for the designer: /ESTOP.IO8 U2.14 to SW2.2: no legal path found within the time limit", "note: for the designer: /MOTOR_RST.IO22 MC28.1 to U2.33: no legal path found within the time limit", "note: for the designer: /FC_BOOT R3.1 to U2.47: no legal path found within the time limit", "note: for the designer: /FC_RST R1.1 to U2.48: no legal path found within the time limit"], "picture": "boards/carrier-fc-rp2350a-mini.png"}+{"board": "adom/carrier-fc-rp2350a-mini", "run": "current", "parts": 80, "connections": 74, "routed": 74, "kicad": {"violations": {}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 1, "perRule": {"layer-hop": 2, "pad-entry": 2, "pad-entry-oblique": 1, "rail-floor": 1, "via-in-trace": 1}, "vias": 67, "copper_mm": null}, "checkOnOriginal": {"errors": 10, "perRule": {"clearance": 6, "corner-90": 1, "fold-back": 1, "pad-entry": 7, "rail-floor": 1, "square-t": 1, "via-in-trace": 1, "via-stand-off": 1}, "vias": 101, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/carrier-fc-rp2350a-mini.png"}+{"board": "adom/coax-antennuator-molecule-32x32", "run": "first", "parts": 9, "connections": 2, "routed": 2, "kicad": {"violations": {"track_width": 2}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 7, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {"via-stand-off": 2}, "vias": 128, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/coax-antennuator-molecule-32x32.png"}+{"board": "adom/coax-antennuator-molecule-32x32", "run": "current", "parts": 9, "connections": 2, "routed": 2, "kicad": {"violations": {}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 7, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {"via-stand-off": 2}, "vias": 128, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/coax-antennuator-molecule-32x32.png"}+{"board": "adom/coax-molecule-2ch-64x64", "run": "first", "parts": 9, "connections": 2, "routed": 2, "kicad": {"violations": {}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 4, "copper_mm": null}, "checkOnOriginal": {"errors": 28, "perRule": {"via-in-pad": 28}, "vias": 591, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/coax-molecule-2ch-64x64.png"}+{"board": "adom/coax-molecule-2ch-64x64", "run": "current", "parts": 9, "connections": 2, "routed": 2, "kicad": {"violations": {}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 4, "copper_mm": null}, "checkOnOriginal": {"errors": 28, "perRule": {"via-in-pad": 28}, "vias": 591, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/coax-molecule-2ch-64x64.png"}+{"board": "adom/coax-molecule-32x32", "run": "first", "parts": 8, "connections": 1, "routed": 1, "kicad": {"violations": {}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 2, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {}, "vias": 128, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/coax-molecule-32x32.png"}+{"board": "adom/coax-molecule-32x32", "run": "current", "parts": 8, "connections": 1, "routed": 1, "kicad": {"violations": {}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 2, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {}, "vias": 128, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/coax-molecule-32x32.png"}+{"board": "adom/combiner-molecule", "run": "first", "parts": 26, "connections": 5, "routed": 5, "kicad": {"violations": {"track_width": 9}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 4, "perRule": {"pad-entry": 3, "pad-entry-oblique": 1, "same-net-parallel": 4}, "vias": 62, "copper_mm": null}, "checkOnOriginal": {"errors": 308, "perRule": {"off-45": 308}, "vias": 1400, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/combiner-molecule.png"}+{"board": "adom/combiner-molecule", "run": "current", "parts": 26, "connections": 5, "routed": 5, "kicad": {"violations": {}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 3, "perRule": {"pad-entry-oblique": 1, "same-net-parallel": 3}, "vias": 62, "copper_mm": null}, "checkOnOriginal": {"errors": 314, "perRule": {"clearance": 6, "off-45": 308}, "vias": 1400, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/combiner-molecule.png"}+{"board": "adom/drone-motor-carrier", "run": "first", "parts": 41, "connections": 32, "routed": 32, "kicad": {"violations": {"clearance": 2}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 8, "perRule": {"clearance": 3, "corner-90": 2, "corner-acute": 1, "fold-back": 1, "layer-hop": 1, "square-t": 1}, "vias": 19, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {"via-in-trace": 3}, "vias": 307, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/drone-motor-carrier.png"}+{"board": "adom/drone-motor-carrier", "run": "current", "parts": 41, "connections": 32, "routed": 32, "kicad": {"violations": {}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 2, "perRule": {"corner-90": 2, "pair-coupling": 1}, "vias": 22, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {"via-in-trace": 3}, "vias": 307, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/drone-motor-carrier.png"}+{"board": "adom/drone-motor-carrier-assembly", "run": "first", "parts": 41, "connections": 32, "routed": 32, "kicad": {"violations": {"clearance": 41, "malformed_courtyard": 82950, "copper_edge_clearance": 9, "track_width": 5}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"malformed_courtyard": 82950, "copper_edge_clearance": 3}, "unconnected": 0}, "check": {"errors": 3, "perRule": {"corner-90": 2, "pair-coupling": 1, "square-t": 1}, "vias": 25, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {"via-in-trace": 3}, "vias": 307, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/drone-motor-carrier-assembly.png"}+{"board": "adom/drone-motor-carrier-assembly", "run": "current", "parts": 41, "connections": 32, "routed": 32, "kicad": {"violations": {"malformed_courtyard": 82950}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"malformed_courtyard": 82950, "copper_edge_clearance": 3}, "unconnected": 0}, "check": {"errors": 2, "perRule": {"corner-90": 2, "pad-entry": 1, "pair-coupling": 1}, "vias": 20, "copper_mm": null}, "checkOnOriginal": {"errors": 3, "perRule": {"edge": 3, "via-in-trace": 3}, "vias": 307, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/drone-motor-carrier-assembly.png"}+{"board": "adom/esc-g431", "run": "first", "parts": 149, "connections": 238, "routed": 182, "kicad": {"violations": {"clearance": 8, "starved_thermal": 55}, "unconnected": 51}, "kicadOnOriginal": {"violations": {"clearance": 7, "starved_thermal": 48}, "unconnected": 0}, "check": {"errors": 75, "perRule": {"cap-first": 2, "clearance": 7, "decoupling-pin": 2, "fill-unfed": 23, "fold-back": 2, "pad-entry": 26, "pad-entry-oblique": 1, "rail-floor": 3, "route-efficiency": 1, "same-net-parallel": 2, "square-t": 3, "unconnected": 32, "via-in-trace": 1, "width-steps": 2, "xtal-load-cap-line": 1}, "vias": 150, "copper_mm": null}, "checkOnOriginal": {"errors": 373, "perRule": {"cap-first": 3, "clearance": 7, "corner-90": 127, "corner-acute": 8, "crystal-chain": 1, "decoupling-pin": 2, "layer-hop": 35, "off-45": 204, "pad-entry": 82, "pad-entry-acute": 14, "pad-entry-oblique": 1, "rail-floor": 4, "route-efficiency": 11, "same-net-parallel": 2, "square-t": 10, "via-count": 10, "via-in-pad": 7, "via-in-trace": 7, "via-size": 94, "via-stand-off": 1, "width-steps": 1, "xtal-load-cap-line": 1}, "vias": 444, "copper_mm": null, "error": null}, "notes": ["note: for the designer: the +VBAT pour refills into 1 extra separate pieces, cut by /DRV_SHA, /GLB, /DRV_SHB: move them or bridge the pieces", "note: for the designer: /COMP2_INM_IO1_BEMF_A C42.1 to U5.13: no path even through the routes it may move: pads, fills or protected copper wall it in", "note: for the designer: /COMP2_INM_IO1_BEMF_A R24.2 to TP20.1: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /DRV_BSTA U4.20 to C12.2: its way is held by /DRV_SHA (Q1.3 to R24.1), which found no other place", "note: for the designer: /DRV_SHB Q4.5 to TP13.1: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /DRV_GHC U4.13 to R12.1: no legal path found within the time limit", "note: for the designer: /DRV_SHC R31.1 to U4.12: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /VBAT_SENSE R25.2 to C41.2: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /VBAT_SENSE U5.14 to R25.2: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /DRV_GLA U4.11 to R4.1: no legal path found within the time limit", "note: for the designer: /COMP1_INM_IO1_BEMF_B R30.2 to U5.12: no legal path found within the time limit", "note: for the designer: /COMP1_INM_IO1_BEMF_B R29.2 to C43.1: no legal path found within the time limit"], "picture": "boards/esc-g431.png"}+{"board": "adom/esc-g431", "run": "current", "parts": 149, "connections": 239, "routed": 207, "kicad": {"violations": {"clearance": 7, "starved_thermal": 52}, "unconnected": 24}, "kicadOnOriginal": {"violations": {"clearance": 7, "starved_thermal": 48}, "unconnected": 0}, "check": {"errors": 63, "perRule": {"cap-first": 2, "clearance": 7, "decoupling-pin": 2, "fill-unfed": 25, "fold-back": 4, "layer-hop": 5, "pad-entry": 33, "pad-entry-oblique": 1, "rail-floor": 4, "route-efficiency": 1, "square-t": 1, "unconnected": 19, "via-in-trace": 2, "width-steps": 1, "xtal-load-cap-line": 1}, "vias": 241, "copper_mm": null}, "checkOnOriginal": {"errors": 373, "perRule": {"cap-first": 3, "clearance": 7, "corner-90": 127, "corner-acute": 8, "crystal-chain": 1, "decoupling-pin": 2, "layer-hop": 35, "off-45": 204, "pad-entry": 82, "pad-entry-acute": 14, "pad-entry-oblique": 1, "rail-floor": 4, "route-efficiency": 10, "same-net-parallel": 2, "square-t": 10, "via-count": 9, "via-in-pad": 7, "via-in-trace": 7, "via-size": 94, "via-stand-off": 1, "width-steps": 1, "xtal-load-cap-line": 1}, "vias": 444, "copper_mm": null, "error": null}, "notes": ["note: for the designer: the +VBAT pour refills into 2 extra separate pieces, cut by /DRV_SHA, GND_OUT: move them or bridge the pieces", "note: for the designer: the GND pour refills into 2 extra separate pieces, cut by +VBAT, /5V_EN, +5V, +12V, /USART1_TX, Net-(LED1-A), +3V3, /SWDIO, /HSE_OUT, /IBAT_SENSE, /PB6, /E_STOP: move them or bridge the pieces", "note: for the designer: /COMP2_INM_IO1_BEMF_A R24.2 to TP20.1: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /DRV_BSTA U4.20 to C12.2: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /DRV_SHB Q4.5 to TP13.1: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /DRV_GHC U4.13 to R12.1: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /DRV_SHC R31.1 to U4.12: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /DRV_GLA U4.11 to R4.1: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /COMP1_INM_IO1_BEMF_B R28.2 to R29.2: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /COMP1_INM_IO2_BEMF_C U5.8 to R31.2: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /DRV_GHA R2.1 to U4.19: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: /DRV_GHA TP18.1 to R2.1: the search ran out of budget before reaching it, even allowed to move routes"], "picture": "boards/esc-g431.png"}+{"board": "adom/ranger-micro-breakout-molecule-extended", "run": "first", "parts": 27, "connections": 6, "routed": 6, "kicad": {"violations": {"track_width": 2}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"hole_clearance": 8}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 8, "copper_mm": null}, "checkOnOriginal": {"errors": 70, "perRule": {"hole-clearance": 8, "off-45": 62, "pad-entry": 1}, "vias": 1110, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/ranger-micro-breakout-molecule-extended.png"}+{"board": "adom/ranger-micro-breakout-molecule-extended", "run": "current", "parts": 27, "connections": 6, "routed": 6, "kicad": {"violations": {}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"hole_clearance": 8}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 8, "copper_mm": null}, "checkOnOriginal": {"errors": 70, "perRule": {"hole-clearance": 8, "off-45": 62, "pad-entry": 1}, "vias": 1110, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/ranger-micro-breakout-molecule-extended.png"}+{"board": "adom/rf-mech-molecule-32x32", "run": "first", "parts": 20, "connections": 0, "routed": 0, "kicad": {"violations": {"courtyards_overlap": 4}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"courtyards_overlap": 4}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/rf-mech-molecule-32x32.png"}+{"board": "adom/rf-mech-molecule-32x32", "run": "current", "parts": 20, "connections": 0, "routed": 0, "kicad": {"violations": {"courtyards_overlap": 4}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"courtyards_overlap": 4}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/rf-mech-molecule-32x32.png"}+{"board": "adom/rf-mech-molecule-32x64", "run": "first", "parts": 36, "connections": 0, "routed": 0, "kicad": {"violations": {"courtyards_overlap": 4}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"courtyards_overlap": 4}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/rf-mech-molecule-32x64.png"}+{"board": "adom/rf-mech-molecule-32x64", "run": "current", "parts": 36, "connections": 0, "routed": 0, "kicad": {"violations": {"courtyards_overlap": 4}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"courtyards_overlap": 4}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/rf-mech-molecule-32x64.png"}+{"board": "adom/rf-mech-molecule-64x64", "run": "first", "parts": 68, "connections": 0, "routed": 0, "kicad": {"violations": {"courtyards_overlap": 4}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"courtyards_overlap": 4}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/rf-mech-molecule-64x64.png"}+{"board": "adom/rf-mech-molecule-64x64", "run": "current", "parts": 68, "connections": 0, "routed": 0, "kicad": {"violations": {"courtyards_overlap": 4}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"courtyards_overlap": 4}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/rf-mech-molecule-64x64.png"}+{"board": "adom/rf-scaffold-module", "run": "first", "parts": 11, "connections": 2, "routed": 2, "kicad": {"violations": {"copper_edge_clearance": 10}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"copper_edge_clearance": 6}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 6, "copper_mm": null}, "checkOnOriginal": {"errors": 14, "perRule": {"via-in-pad": 14}, "vias": 277, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/rf-scaffold-module.png"}+{"board": "adom/rf-scaffold-module", "run": "current", "parts": 11, "connections": 2, "routed": 2, "kicad": {"violations": {"copper_edge_clearance": 6}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"copper_edge_clearance": 6}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 2, "copper_mm": null}, "checkOnOriginal": {"errors": 14, "perRule": {"via-in-pad": 14}, "vias": 277, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/rf-scaffold-module.png"}+{"board": "adom/rf-workcell-module", "run": "first", "parts": 9, "connections": 14, "routed": 14, "kicad": {"violations": {"copper_edge_clearance": 8, "track_width": 8}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"clearance": 4, "copper_edge_clearance": 8}, "unconnected": 0}, "check": {"errors": 0, "perRule": {"pad-entry": 4}, "vias": 16, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {"via-stand-off": 36}, "vias": 211, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/rf-workcell-module.png"}+{"board": "adom/rf-workcell-module", "run": "current", "parts": 9, "connections": 14, "routed": 14, "kicad": {"violations": {"copper_edge_clearance": 8}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"clearance": 4, "copper_edge_clearance": 8}, "unconnected": 0}, "check": {"errors": 0, "perRule": {"pad-entry": 4}, "vias": 16, "copper_mm": null}, "checkOnOriginal": {"errors": 4, "perRule": {"clearance": 4, "via-stand-off": 36}, "vias": 211, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/rf-workcell-module.png"}+{"board": "adom/rp1-breakout-molecule-extended", "run": "first", "parts": 25, "connections": 5, "routed": 5, "kicad": {"violations": {"track_width": 2}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 8, "copper_mm": null}, "checkOnOriginal": {"errors": 62, "perRule": {"off-45": 62}, "vias": 1105, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/rp1-breakout-molecule-extended.png"}+{"board": "adom/rp1-breakout-molecule-extended", "run": "current", "parts": 25, "connections": 5, "routed": 5, "kicad": {"violations": {}, "unconnected": 0}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 8, "copper_mm": null}, "checkOnOriginal": {"errors": 62, "perRule": {"off-45": 62}, "vias": 1105, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/rp1-breakout-molecule-extended.png"}+{"board": "adom/rp2350a-ads1220", "run": "first", "parts": 100, "connections": 176, "routed": 163, "kicad": {"violations": {"solder_mask_bridge": 4}, "unconnected": 13}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 11, "perRule": {"cap-first": 3, "layer-hop": 1, "pad-entry": 11, "pad-entry-oblique": 1, "pour-split": 1, "rail-floor": 1, "same-net-parallel": 1, "unconnected": 7, "via-count": 1, "via-in-trace": 3, "xtal-load-cap-line": 1}, "vias": 80, "copper_mm": null}, "checkOnOriginal": {"errors": 31, "perRule": {"cap-first": 3, "clearance": 4, "fold-back": 3, "layer-hop": 2, "mask-bridge": 19, "pad-entry": 19, "pad-entry-oblique": 1, "rail-floor": 1, "same-net-parallel": 2, "square-t": 1, "via-count": 1, "via-in-trace": 1, "via-stand-off": 1, "xtal-load-cap-line": 1}, "vias": 97, "copper_mm": null, "error": null}, "notes": ["note: for the designer: the +3V3 pour refills into 1 extra separate pieces, cut by +1V1, GND: move them or bridge the pieces", "note: for the designer: /QSPI_SD3 U3.55 to U4.7: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: +1V1 U3.6 to U3.6: no legal path found within the time limit", "note: for the designer: +1V1 U3.50 to U3.50: no legal path found within the time limit", "note: for the designer: +3V3 C12.1 to C12.1: no legal path found within the time limit", "note: for the designer: +3V3 C8.1 to C8.1: no legal path found within the time limit", "note: for the designer: /VREG_AVDD U3.46 to U3.46: no legal path found within the time limit", "note: for the designer: GND U2.17 to U2.17: no legal path found within the time limit", "note: for the designer: GND U2.17 to U2.17: no legal path found within the time limit", "note: for the designer: GND U3.61 to U3.61: no legal path found within the time limit", "note: for the designer: GND U3.61 to U3.61: no legal path found within the time limit", "note: for the designer: GND C7.2 to C7.2: no legal path found within the time limit"], "picture": "boards/rp2350a-ads1220.png"}+{"board": "adom/rp2350a-ads1220", "run": "current", "parts": 100, "connections": 176, "routed": 172, "kicad": {"violations": {"solder_mask_bridge": 1}, "unconnected": 5}, "kicadOnOriginal": {"violations": {}, "unconnected": 0}, "check": {"errors": 9, "perRule": {"cap-first": 1, "layer-hop": 3, "pad-entry": 10, "pad-entry-oblique": 1, "pour-split": 1, "rail-floor": 4, "route-efficiency": 1, "unconnected": 3, "via-count": 1, "via-in-trace": 2, "xtal-load-cap-line": 1}, "vias": 92, "copper_mm": null}, "checkOnOriginal": {"errors": 31, "perRule": {"cap-first": 3, "clearance": 4, "fold-back": 3, "layer-hop": 2, "mask-bridge": 19, "pad-entry": 19, "pad-entry-oblique": 1, "rail-floor": 1, "same-net-parallel": 2, "square-t": 1, "via-count": 1, "via-in-trace": 1, "via-stand-off": 1, "xtal-load-cap-line": 1}, "vias": 97, "copper_mm": null, "error": null}, "notes": ["note: for the designer: the +3V3 pour refills into 1 extra separate pieces, cut by +1V1, GND: move them or bridge the pieces", "note: for the designer: /QSPI_SD3 U3.55 to U4.7: no path even through the routes it may move: pads, fills or protected copper wall it in", "note: for the designer: +1V1 U3.50 to U3.50: no path even through the routes it may move: pads, fills or protected copper wall it in", "note: for the designer: +1V1 U3.23 to U3.23: the search ran out of budget before reaching it, even allowed to move routes", "note: for the designer: GND C7.2 to C7.2: no via site within 2 mm, even moving the routes it may move"], "picture": "boards/rp2350a-ads1220.png"}+{"board": "adom/tmf8829-adapter-molecule", "run": "first", "parts": 21, "connections": 11, "routed": 11, "kicad": {"violations": {"courtyards_overlap": 1, "pth_inside_courtyard": 12}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"courtyards_overlap": 1, "pth_inside_courtyard": 12}, "unconnected": 0}, "check": {"errors": 8, "perRule": {"fill-unfed": 8, "pad-entry": 1}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 1, "perRule": {"pad-entry": 1, "rail-floor": 1}, "vias": 22, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/tmf8829-adapter-molecule.png"}+{"board": "adom/tmf8829-adapter-molecule", "run": "current", "parts": 21, "connections": 11, "routed": 11, "kicad": {"violations": {"courtyards_overlap": 1, "pth_inside_courtyard": 12}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"courtyards_overlap": 1, "pth_inside_courtyard": 12}, "unconnected": 0}, "check": {"errors": 8, "perRule": {"fill-unfed": 8, "pad-entry": 2}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 1, "perRule": {"pad-entry": 1, "rail-floor": 1}, "vias": 22, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/tmf8829-adapter-molecule.png"}+{"board": "adom/tmf8829-molecule", "run": "first", "parts": 20, "connections": 37, "routed": 37, "kicad": {"violations": {"clearance": 37, "copper_edge_clearance": 9, "track_width": 36}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"copper_edge_clearance": 6}, "unconnected": 0}, "check": {"errors": 10, "perRule": {"fill-unfed": 6, "pad-entry": 1, "rail-floor": 1, "same-net-parallel": 2, "square-t": 1, "via-in-trace": 2}, "vias": 30, "copper_mm": null}, "checkOnOriginal": {"errors": 12, "perRule": {"cap-first": 1, "corner-acute": 1, "fold-back": 4, "layer-hop": 2, "same-net-parallel": 5, "square-t": 1, "via-in-pad": 1, "via-in-trace": 20, "via-stand-off": 21}, "vias": 53, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/tmf8829-molecule.png"}+{"board": "adom/tmf8829-molecule", "run": "current", "parts": 20, "connections": 37, "routed": 37, "kicad": {"violations": {"copper_edge_clearance": 6}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"copper_edge_clearance": 6}, "unconnected": 0}, "check": {"errors": 8, "perRule": {"fill-unfed": 6, "layer-hop": 4, "pad-entry": 2, "rail-floor": 1, "same-net-parallel": 1}, "vias": 32, "copper_mm": null}, "checkOnOriginal": {"errors": 12, "perRule": {"cap-first": 1, "corner-acute": 1, "fold-back": 4, "layer-hop": 2, "same-net-parallel": 5, "square-t": 1, "via-in-pad": 1, "via-in-trace": 20, "via-stand-off": 21}, "vias": 53, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/tmf8829-molecule.png"}+{"board": "caleb/i2s-carrier", "run": "first", "parts": 14, "connections": 1, "routed": 1, "kicad": {"violations": {}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"copper_edge_clearance": 6}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/i2s-carrier.png"}+{"board": "caleb/i2s-carrier", "run": "current", "parts": 14, "connections": 1, "routed": 1, "kicad": {"violations": {"copper_edge_clearance": 6}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"copper_edge_clearance": 6}, "unconnected": 0}, "check": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 0, "perRule": {}, "vias": 0, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/i2s-carrier.png"}+{"board": "ntx-embedded/teazzers-taprite-solonoid-638-0031-multicarrier", "run": "first", "parts": 33, "connections": 20, "routed": 20, "kicad": {"violations": {"courtyards_overlap": 8}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"courtyards_overlap": 8}, "unconnected": 0}, "check": {"errors": 8, "perRule": {"clearance": 8, "pad-entry-oblique": 1}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 8, "perRule": {"clearance": 8, "pad-entry-oblique": 1}, "vias": 0, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/teazzers-taprite-solonoid-638-0031-multicarrier.png"}+{"board": "ntx-embedded/teazzers-taprite-solonoid-638-0031-multicarrier", "run": "current", "parts": 33, "connections": 20, "routed": 20, "kicad": {"violations": {"courtyards_overlap": 8}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"courtyards_overlap": 8}, "unconnected": 0}, "check": {"errors": 8, "perRule": {"clearance": 8, "pad-entry-oblique": 1}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 8, "perRule": {"clearance": 8, "pad-entry-oblique": 1}, "vias": 0, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/teazzers-taprite-solonoid-638-0031-multicarrier.png"}+{"board": "ntx-embedded/teazzers-taprite-solonoid-638-0031-v2", "run": "first", "parts": 12, "connections": 5, "routed": 5, "kicad": {"violations": {"courtyards_overlap": 2}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"courtyards_overlap": 2}, "unconnected": 0}, "check": {"errors": 2, "perRule": {"clearance": 2}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 2, "perRule": {"clearance": 2}, "vias": 0, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/teazzers-taprite-solonoid-638-0031-v2.png"}+{"board": "ntx-embedded/teazzers-taprite-solonoid-638-0031-v2", "run": "current", "parts": 12, "connections": 5, "routed": 5, "kicad": {"violations": {"courtyards_overlap": 2}, "unconnected": 0}, "kicadOnOriginal": {"violations": {"courtyards_overlap": 2}, "unconnected": 0}, "check": {"errors": 2, "perRule": {"clearance": 2}, "vias": 0, "copper_mm": null}, "checkOnOriginal": {"errors": 2, "perRule": {"clearance": 2}, "vias": 0, "copper_mm": null, "error": null}, "notes": [], "picture": "boards/teazzers-taprite-solonoid-638-0031-v2.png"}
docs/results/lessons.jsonladded+31
@@ -0,0 +1,31 @@+{"after": ["a small carrier board", "a small sensor board"], "build": "b1", "finding": "Tracks written with the parser's net number instead of the file's own on boards that number their nets (KiCad 9). KiCad DRC did not report it (it re-derives track nets from pads on load); the program's own check of the written board did.", "fix": "write.rs file_numbers(): write the number from the file's (net N \"name\") table. Harness flags router/check disagreement.", "verified": "b2: a small sensor board check clearance 12 -> 0, unconnected 6 -> 0"}+{"after": ["a small sensor board"], "build": "b2", "finding": "GND pour left in pieces nothing feeds (fill-unfed 2, pour-split 1). the original has 12 vias tying the pours; ours 2.", "fix": "open: ground stitching", "verified": ""}+{"after": ["adom/drone-motor-carrier", "a 4-layer switch board"], "build": "b2", "finding": "A differential pair's two tracks were never measured against each other (each is searched with the partner's copper as its own). Where the pair's polarity is flipped between its ends the pad entry hairpinned and left D+ 0.078 mm from D- (KiCad clearance x2).", "fix": "router.rs try_pair: reject a pair whose own tracks come closer than min(gap, clearance) anywhere", "verified": "b3: drone-motor-carrier KiCad 0 violations, 0 open. Open: that pair is now routed uncoupled; a clean turn-around or a via swap for flipped polarity is not built."}+{"after": ["a 4-layer switch board"], "build": "b2", "finding": "4-layer board: 50 ground pads got no via to the inner plane (no via site within 2 mm), 64 of 114 joined. The original itself has 14 open joins in KiCad.", "fix": "open: plane fan-out on dense multi-layer boards", "verified": ""}+{"after": ["results/p3t benchmark C trace"], "build": "28a8e38", "finding": "benchmark C +5V to U10 goes thin at its FIRST lay on the whole board: every full-width search fails ('none in 1.22 s'), then the rail's own ladder in rail_route drops straight to 0.40 and 0.25 mm. In the fixture (no other nets, no lanes) the same search succeeds. The stepped widths and the full-width-only re-lay rule live in attempts(), which rail taps do not use.", "fix": "open: rail_route ladder needs the stepped widths and the never-below-chart rule; find what blocks the wide search on the full board (lanes or search budget)", "verified": ""}+{"after": ["a motor-controller board", "a motor-controller board", "a flight controller board"], "build": "b5", "finding": "Boards whose ground is a poured outer layer (no inner plane) ended with cut-off pour pieces: KiCad open joins on GND although every traced join was made. Signals routed first sliced the pour; a stitching pass afterwards (b6) found no room for vias.", "fix": "router.rs find_pour_planes: an outer-layer pour covering 40% of the board is treated as a plane, and each pad of that net on the other side gets its via EARLY (Level::PlaneFanout), before signals take the room. repair.rs stitch_pours stays as the mop-up.", "verified": "b8: a motor-controller board 10 -> 1 open, a motor-controller board 15 -> 7 open and starved thermals 8 -> 2; a small sensor board stays 0/0. Fixtures 6 pass + 1 known."}+{"after": ["a flight controller board", "a motor-controller board"], "build": "b6", "finding": "The pour model joined a pad to its pour if the two touched; KiCad joins through thermal-relief spokes and reports starved_thermal when fewer than the minimum reach. The program's own check said joined where KiCad said starved.", "fix": "pour.rs: pad-to-pour joins are modelled as four spokes along the pad axes across the relief gap, each must be unblocked; reads zone thermal gap/width and pad zone_connect (board.rs).", "verified": "b7/b8: starved thermals on a motor-controller board 8 -> 2. Open: the remaining 2 and a flight controller board's 8."}+{"after": ["the largest test board"], "build": "b5", "finding": "HARNESS fault, not router: KiCad's DRC was run under each board's own project. the largest test board sets clearance to 'ignore' and open joins to 'warning', so a run with 40 failed joins reported '0 errors, 0 open' and looked like a pass.", "fix": "harness.py judge_pro: both the original and the routed board are judged under the board's own rule VALUES but with clearance, unconnected_items, shorting_items, tracks_crossing, hole_clearance and copper_edge_clearance forced to error. rejudge.py re-judges an existing run. Only two wiki projects turn any of these down (the largest test board, i2s-carrier edge clearance).", "verified": "the largest test board b5 rejudged: ours 68 open + 28 clearance; his 0 open + 50 clearance (his project ignores clearance on purpose)."}+{"after": ["adom/carrier-fc-rp2350a-mini"], "build": "b8", "finding": "HARNESS: pictures narrower than 1500 px were refused by adom-shotlog (it wants the original size or --native), so some boards had no picture in the log.", "fix": "harness.py passes --native (pictures are rendered at their final size).", "verified": "carrier-fc b8 injected by hand"}+{"after": ["adom/carrier-fc-rp2350a-mini"], "build": "b8", "finding": "9 short straight joins (module pad to the contact facing it, 5 mm) failed on the full board and routed alone. Snapshot at the first failure (new debug switch ADOM_ROUTE_SNAP_FAIL / ADOM_ROUTE_SNAP_PAD): the USB pair could not be coupled (0.4 mm class clearance cannot pass a 0.7 mm pad gap; his own board passes it under DRC exclusions), fell back to two separate tracks, and those ran the module's full height, one on top of the other on the two layers: a wall on both layers. They kept Level::Pair, which repair never moves, so nothing could push them aside and 68M search nodes were burnt against the wall.", "fix": "(1) search.rs STACK_COST: a track may not run on top of its pair partner on another layer (b9, 9 -> 8 open). (2) router.rs route_pair: a pair that falls back to separate tracks is queued as Data, first in line but movable by repair (b10).", "verified": "b10: 74/74 joined, KiCad 0 errors 0 open, check 0 errors (his 10), 80 vias (his 101). Open: with no spec the rails get the 0.40 mm floor where his run about 1 mm; his pair straddles a pad under exclusions, ours runs uncoupled."}+{"after": ["adom/carrier-fc-rp2350a-mini"], "build": "-", "finding": "HARNESS/reading his boards: a project's drc_exclusions make KiCad report 0 where the raw rules are broken (his USB pair passes pad U2.18 at 0.275 mm under a 0.4 mm class). 'Original: 0 errors' means 'no errors he has not accepted'. The program's own check does not read exclusions and reports them (6 clearance on this board).", "fix": "none needed in the router; ledger rows now say how many exclusions the project carries", "verified": ""}+{"after": ["adom/rf-workcell-module", "adom/combiner-molecule", "adom/rp1-breakout-molecule-extended", "adom/ranger-micro-breakout-molecule-extended", "adom/coax-antennuator-molecule-32x32", "adom/rf-scaffold-module", "adom/drone-motor-carrier-assembly"], "build": "b9", "finding": "14 of the 38 wiki boards have no .kicad_pro. KiCad judges those by its own defaults (0.2 mm clearance, 0.2 mm minimum track, 0.5 mm to the edge, 0.25 mm to holes: read off its DRC messages). The router fell back to its standing rules (0.15 mm neck and clearance, 0.3 mm edge), so KiCad reported track_width, clearance and copper_edge_clearance errors on seven of them.", "fix": "project.rs: with no project file the router loads KiCad's defaults through the same path as a real project.", "verified": "b11 on six of them: track_width errors 0 everywhere; remaining edge findings are his own edge-connector pads (same count as the originals)."}+{"after": ["a 4-layer switch board"], "build": "b9", "finding": "4-layer board, GND plane on In1.Cu and +3.3V plane on In2.Cu: all 49 GND plane vias refused ('no via site within 2 mm'), on an empty board too. The world treated any non-ground pour on a layer typed 'signal' as deliberate rail copper that other nets stay out of; KiCad types every layer 'signal' by default, so the inner +3.3V plane became a wall for every other net's via.", "fix": "router.rs build_world: a zone on a plane layer (Board::plane_layers, 50% of the board) never blocks; the rail-pour rule stays for routing layers.", "verified": "b12: 114/114 joined, KiCad 0 errors 0 open (his original: 14 open), 4 s. Fixture probe: GND alone PASS."}+{"after": ["an I/O carrier board"], "build": "b9", "finding": "The router reported 124/124 joined; KiCad found 16 joins open. Five nets have small local pours over pin-header pads; the plan ends a route as soon as it reaches the pour's outline, and KiCad's refill does not in fact join those pads (starved spokes, fill cut away round each pad). The stitching pass saw nothing to mend: pour::loose_islands returned empty when no pad reaches any piece of the pour, and its only remedy was a via to another layer, useless for a one-layer pour.", "fix": "pour.rs loose_islands: with no pad on any pour piece, every copper-joined group of pads but the largest is loose. repair.rs stitch_pours + join_by_track: a loose piece with no pour of its net on another layer is joined by a track, searched piece to piece WITHOUT the pour as a target (post.rs components_with(net, false)), both directions tried and the shorter kept (a search can leave a pad and land on a track, never the reverse); trim_overlaps runs again after.", "verified": "b13: 124/124, KiCad 0 errors 0 open (his original: 31 open, 1 clearance), check 0 errors (his 12), 16 joining tracks."}+{"after": ["adom/rp2350a-ads1220"], "build": "b9", "finding": "KiCad: 2 vias bridge a pad's solder-mask opening; the program's own check saw nothing. Measured: via edge 0.1899 mm from a rounded pad corner against a 0.19 mm limit (0.09 opening + 0.10 mask-to-copper). Exact by the arc, but KiCad tests the opening as a polygon (max_error 0.005 mm).", "fix": "mask.rs: copper being laid keeps 6 um more than the limit (MaskMap::guarded). FIRST TRY (b15) applied it to tracks too: via bridges gone, but 171 -> 162 joins, the extra 6 um shut the escapes of the 0.4 mm pitch QFN. b19: vias only.", "verified": "b15: via bridges 2 -> 0 (one pad/zone bridge left, made by KiCad's own refill). b19 result pending."}+{"after": ["a flight controller board", "a motor-controller board", "a motor-controller board", "a motor-controller board"], "build": "b14", "finding": "Budget. (a) a flight controller board: the pass spent all its time on a dozen stuck data lines (each first try up to limit/30, each in-level repair unbounded) and nine joins of 1-2 mm (MCU VCAP pin to its capacitor) were never tried: 'no legal path found within the time limit'. (b) a motor-controller board: run 1 took 524 s and left 3 open; run 2 started with 65 s left, got to 24 open and was thrown away. (c) stitching's new track joins searched hopeless joins at the full 800k node limit and used its whole 20 s (a motor-controller board lost a via it had before).", "fix": "router.rs pass: each turn (first try and in-level repair) gets at most 4x the even split of the time left. router.rs run loop: with less than half a run's time left, no new run; the best board's open joins get a 'last mile' repair with 6x the soft node limit. repair.rs: stitch joins capped at 60k nodes, and a via beside the pad is tried first where the net's other layer lies under it.", "verified": "pending b19"}+{"after": ["a large Ethernet switch board"], "build": "b9", "finding": "A SHORT: KiCad shorting_items, one track of a coupled pair (100BASE-T1 P) ran through pad D301.2 of its partner net (a protection diode sitting on the pair). A coupled pair is searched with the partner's copper treated as its own, and the only check afterwards was track against track.", "fix": "router.rs try_pair: either track within clearance of ANY pad of the partner net rejects the coupled attempt. post.rs drop_shorts: the last step before writing takes off any route whose copper touches another net's pad or an earlier route, and says so in a note (an open join the designer sees beats a short he may not).", "verified": "fixture on that pair alone: joined, clearance clean (as two separate tracks). Pair fixtures on PiProbe and benchmark B still couple (100%, 76%, 87%). Whole board rerun pending."}+{"after": ["a flight controller board"], "build": "b19", "finding": "Trace totals: 81 of 116 million search nodes (70%) went to rail taps. A tap that cannot be made climbs down a ladder of seven width/margin steps, two ways each, before giving up, 20 to 60 s a tap; nine joins of 1-2 mm at the MCU (VCAP, VDDA, VBAT) were walled in by data lines laid first.", "fix": "router.rs: a supply net whose pads all lie within 6 mm is laid in the first group (b20). post.rs rail_route: after the first step fails the LAST step is asked at once; if it closes without running out of nodes there is no way at any width and the steps between are skipped (b23). post.rs try_rail: a failed tap is not searched again until a route near it or on its net changes. search.rs: a search cut short by time now says so (RAN_OUT), so it is never read as proof of a wall.", "verified": "b20: 120 -> 124 of 129 joined, open 9 -> 5. b23 pending."}+{"after": ["benchmark C benchmark"], "build": "b19", "finding": "REGRESSION caught by the benchmark and isolated with off-switches (three benchmark C runs: all on 293/302, fair-share off 300/302, mask guard off 293/302): the fair-share budget (b16) cut in-level repairs short and left 9 joins open where 2 were before. It had not helped the flight controller either (b19 identical to b14).", "fix": "router.rs: the share is off unless ADOM_ROUTE_SHARE is set. Lesson for the method: a change made for one board is not kept until the benchmarks pass, and a change that does not move the board it was made for is taken out.", "verified": "b24 benchmark pending"}+{"after": ["a flight controller board"], "build": "b23", "finding": "The rail probe (ask the last, most permissive step right after the first fails) did not pay: on this board the probe runs out of nodes instead of closing, so it proves nothing and is only extra work. 124 -> 121 joined.", "fix": "taken out again (b25). Kept from that round: short supply nets first, the failed-tap memo, time-outs counted as cut short.", "verified": "b25 pending"}+{"after": ["adom/rp2350a-ads1220"], "build": "b23", "finding": "Mask tolerance, third form: vias always; tracks only where they pass a rounded corner at an angle (a rounded rectangle is stored as an outline with short corner facets, so the corner test looks for those).", "fix": "mask.rs curved_near; search.rs adds hugging lines clear of the guard.", "verified": "b23: both via bridges and the track bridge are gone, 170/176 joined (b14: 171/176 with 3 of them). One bridge left, pad against a zone KiCad refills itself."}+{"after": ["a current-monitor board"], "build": "b9", "finding": "Router: 515/515 joined. KiCad: 5 joins open at R103 and R104. Both are marked do-not-populate, and the router left every DNP part out of the plan. A DNP part is still copper that must be wired (an option resistor), and KiCad counts its pads. Four wiki boards carry DNP parts (the largest test board 7, a current-monitor board 3, esc-g431 1, the 4-layer switch board 1); the three benchmark boards have none, which is why this was never seen.", "fix": "classify.rs and post.rs: DNP parts are routed like any other; only the spec's skipRefs leave a part out.", "verified": "plan now lists the extra joins; whole-board rerun pending (b25)"}+{"after": ["a large Ethernet switch board"], "build": "b25", "finding": "KiCad: a +3.3V via 0.11 mm from a GND pad. The router's own check saw a GND via, legal beside its own pad. The file says GND too. KiCad re-nets any via that has no track from the copper it lands in when the board loads, and the stripped file still carries the OLD plane fills, so a lone GND via through the +3.3V plane became a +3.3V via. Every stitching via, return via and plane via without a track is exposed to this on boards with more than one plane; which ones flip is not even stable.", "fix": "write.rs: a via whose route has no track is written with (free yes), KiCad's flag for a via that keeps its own net. Tested in KiCad 10 by hand on that board: the finding goes, and marking one via exposed the next ones, so all of them get the flag. New debug switch ADOM_ROUTE_DEBUG_VIA=x,y prints what the checker sees round one via.", "verified": "by hand on the one via; b27 PiProbe and benchmark B in KiCad and a whole-board rerun pending"}+{"after": ["adom/rp2350a-ads1220", "a flight controller board", "piprobe_v13"], "build": "b26", "finding": "A supply pin's stub to its own capacitor (the classifier's cap-first task) was routed at the power level, after all data lines, and the pin was often walled in by then.", "fix": "router.rs: those stubs (pin and capacitor within 3 mm) are laid in the first group, with the short local supply nets.", "verified": "b26: a flight controller board 125/129 (120 at b14), ads1220 171/176 with 1 mask finding (4 at b14); benchmark PiProbe still KiCad 0/0 with warnings 18 -> 14, copper 296 -> 287 mm, rip-ups 66 -> 46; benchmark B and benchmark C unchanged; fixtures pass."}+{"after": ["adom/esc-g431"], "build": "b28", "finding": "the G431 ESC board: 204 of 239 joined, the pass alone used the whole budget. Trace: 43% of 217 million search nodes went to rail taps; one tap (U4.7) was searched 565 times. The memo of failed taps (b20) does not stop it: repair keeps changing the routes round the tap, so each time is a new state and the same seven-step ladder runs again.", "fix": "post.rs try_rail: at most 6 ladders per tap in a run (9 in the last-mile repair). router.rs pass: a join whose turn comes after the time is up still gets one short try (30k nodes).", "verified": "b29 regression: benchmark C 300/302, PiProbe and benchmark B KiCad 0/0, fixtures 6 pass + 1 known, all identical to b26. G431 on b29 pending."}+{"after": ["b27 runs"], "build": "b27", "finding": "Free-via flag verified on whole boards.", "fix": "-", "verified": "a large Ethernet switch board clearance 11 -> 10 (the original's own 10), esc-g431 10 -> 7 (the original's own 7); PiProbe (6 free vias) and benchmark B (14) still KiCad 0/0; benchmark C unchanged."}+{"after": ["adom/esc-g431", "benchmark C fixtures"], "build": "b30", "finding": "The cap on rail-tap searches (b29) had no effect on esc-g431 because repair's route_hard calls the search by another path; guarding that path too (b30) FAILED a fixture: a benchmark C supply fixture came out thin (0.26% drop, limit 0.25%), since a rail planned by the power stage needs its repeated tries in repair. And on esc-g431 the cap changed nothing either way: the pass still runs to its limit with 39 open (the freed time is spent on other failing searches). That board is F.Cu/B.Cu only with many small signal pours and no room for ground vias at the bridge; 204 of 239 is where this router stands on it.", "fix": "b31: planned rails are exempt from the cap in repair. Kept only if the whole regression passes; otherwise the tree goes back to b29's behaviour.", "verified": "pending"}+{"after": ["a flight controller board", "a motor-controller board"], "build": "b29", "finding": "OPEN: starved_thermal. KiCad wants at least two thermal spokes per pad into its pour (min_resolved_spokes); adom-route's tracks pass close enough to ground pads to leave one. a flight controller board 9 (original 0), a motor-controller board 1, esc-g431 49 against the original's own 48. The pour model counts a pad as joined with one spoke.", "fix": "not done: tracks of other nets would have to keep two spoke corridors free at each relief pad.", "verified": ""}+{"after": ["a flight controller board", "a motor-controller board"], "build": "b31", "finding": "starved_thermal (lesson 28): tracks run through the thermal-relief gap of ground pads and take their spokes.", "fix": "search.rs RELIEF_COST: a millimetre inside the relief gap of another net's pad costs 2.5; router.rs build_world lists the pads that join their pour through spokes (same test as pour.rs). A cost, not a wall.", "verified": "b32: regression identical to b31 (PiProbe, benchmark B KiCad 0/0, benchmark C 300/302, fixtures). a flight controller board 125/129 with 4 open -> 129/129 with 0 open, starved pads 9 -> 7; a motor-controller board unchanged (1 starved, 4 open). Small and mid boards rerun on b32 for the final table."}+{"after": ["benchmark C", "a current-monitor board"], "build": "b31", "finding": "REGRESSION found by the all-board rerun, not by the benchmarks: with the memo and cap applied to repair's rail searches for rails WITHOUT a spec (b31), benchmark C as it sits on the wiki (no spec) went 300 -> 297 joined and a current-monitor board 521 -> 520. The three benchmark boards could not show it: their rails are planned from a spec and were exempt.", "fix": "b33: repair's route_hard searches rails unguarded again (b29's behaviour); the memo and cap stay on the first pass and the rail repair only. Method: the all-board run is part of the regression check from now on, since the benchmarks all carry a spec.", "verified": "b33 regression and the two boards rerunning"}+{"after": ["benchmark C", "a current-monitor board", "benchmarks"], "build": "b33", "finding": "Final build of the night.", "fix": "-", "verified": "b33: regression identical to b29/b31 (PiProbe and benchmark B KiCad 0/0, benchmark C 300/302, fixtures 6 pass + 1 known); benchmark C back to 300/302, a current-monitor board back to 521/521 with KiCad 0/0; a flight controller board 129/129 with 0 open."}
docs/results/questions/pair-coupling.pngadded
⋯ 1 unchanged line ⋯
docs/results/questions/rail-width.pngadded
⋯ 1 unchanged line ⋯
docs/results/questions/rf-copper.pngadded
⋯ 1 unchanged line ⋯
docs/results/results-icon.pngadded
⋯ 1 unchanged line ⋯
docs/results/summary.jsonadded+1
@@ -0,0 +1 @@+{"boards": 22, "cleanFirst": 9, "cleanNow": 19}\ No newline at end of file
docs/results/table.jsonadded+486
@@ -0,0 +1,486 @@+[+ {+  "board": "coax-molecule-32x32",+  "parts": 8,+  "first": {+   "joined": 1,+   "joins": 1,+   "open": 0,+   "newErrors": 0,+   "vias": 2,+   "clean": true+  },+  "now": {+   "joined": 1,+   "joins": 1,+   "open": 0,+   "newErrors": 0,+   "vias": 2,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 128+ },+ {+  "board": "coax-antennuator-molecule-32x32",+  "parts": 9,+  "first": {+   "joined": 2,+   "joins": 2,+   "open": 0,+   "newErrors": 2,+   "vias": 7,+   "clean": false+  },+  "now": {+   "joined": 2,+   "joins": 2,+   "open": 0,+   "newErrors": 0,+   "vias": 7,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 128+ },+ {+  "board": "coax-molecule-2ch-64x64",+  "parts": 9,+  "first": {+   "joined": 2,+   "joins": 2,+   "open": 0,+   "newErrors": 0,+   "vias": 4,+   "clean": true+  },+  "now": {+   "joined": 2,+   "joins": 2,+   "open": 0,+   "newErrors": 0,+   "vias": 4,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 591+ },+ {+  "board": "rf-workcell-module",+  "parts": 9,+  "first": {+   "joined": 14,+   "joins": 14,+   "open": 0,+   "newErrors": 8,+   "vias": 16,+   "clean": false+  },+  "now": {+   "joined": 14,+   "joins": 14,+   "open": 0,+   "newErrors": 0,+   "vias": 16,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 211+ },+ {+  "board": "rf-scaffold-module",+  "parts": 11,+  "first": {+   "joined": 2,+   "joins": 2,+   "open": 0,+   "newErrors": 4,+   "vias": 6,+   "clean": false+  },+  "now": {+   "joined": 2,+   "joins": 2,+   "open": 0,+   "newErrors": 0,+   "vias": 2,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 277+ },+ {+  "board": "teazzers-taprite-solonoid-638-0031-v2",+  "parts": 12,+  "first": {+   "joined": 5,+   "joins": 5,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "now": {+   "joined": 5,+   "joins": 5,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 0+ },+ {+  "board": "i2s-carrier",+  "parts": 14,+  "first": {+   "joined": 1,+   "joins": 1,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "now": {+   "joined": 1,+   "joins": 1,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 0+ },+ {+  "board": "rf-mech-molecule-32x32",+  "parts": 20,+  "first": {+   "joined": 0,+   "joins": 0,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "now": {+   "joined": 0,+   "joins": 0,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 0+ },+ {+  "board": "tmf8829-molecule",+  "parts": 20,+  "first": {+   "joined": 37,+   "joins": 37,+   "open": 0,+   "newErrors": 76,+   "vias": 30,+   "clean": false+  },+  "now": {+   "joined": 37,+   "joins": 37,+   "open": 0,+   "newErrors": 0,+   "vias": 32,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 53+ },+ {+  "board": "tmf8829-adapter-molecule",+  "parts": 21,+  "first": {+   "joined": 11,+   "joins": 11,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "now": {+   "joined": 11,+   "joins": 11,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 22+ },+ {+  "board": "rp1-breakout-molecule-extended",+  "parts": 25,+  "first": {+   "joined": 5,+   "joins": 5,+   "open": 0,+   "newErrors": 2,+   "vias": 8,+   "clean": false+  },+  "now": {+   "joined": 5,+   "joins": 5,+   "open": 0,+   "newErrors": 0,+   "vias": 8,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 1105+ },+ {+  "board": "combiner-molecule",+  "parts": 26,+  "first": {+   "joined": 5,+   "joins": 5,+   "open": 0,+   "newErrors": 9,+   "vias": 62,+   "clean": false+  },+  "now": {+   "joined": 5,+   "joins": 5,+   "open": 0,+   "newErrors": 0,+   "vias": 62,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 1400+ },+ {+  "board": "ranger-micro-breakout-molecule-extended",+  "parts": 27,+  "first": {+   "joined": 6,+   "joins": 6,+   "open": 0,+   "newErrors": 2,+   "vias": 8,+   "clean": false+  },+  "now": {+   "joined": 6,+   "joins": 6,+   "open": 0,+   "newErrors": 0,+   "vias": 8,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 1110+ },+ {+  "board": "teazzers-taprite-solonoid-638-0031-multicarrier",+  "parts": 33,+  "first": {+   "joined": 20,+   "joins": 20,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "now": {+   "joined": 20,+   "joins": 20,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 0+ },+ {+  "board": "rf-mech-molecule-32x64",+  "parts": 36,+  "first": {+   "joined": 0,+   "joins": 0,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "now": {+   "joined": 0,+   "joins": 0,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 0+ },+ {+  "board": "drone-motor-carrier",+  "parts": 41,+  "first": {+   "joined": 32,+   "joins": 32,+   "open": 0,+   "newErrors": 2,+   "vias": 19,+   "clean": false+  },+  "now": {+   "joined": 32,+   "joins": 32,+   "open": 0,+   "newErrors": 0,+   "vias": 22,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 307+ },+ {+  "board": "drone-motor-carrier-assembly",+  "parts": 41,+  "first": {+   "joined": 32,+   "joins": 32,+   "open": 0,+   "newErrors": 52,+   "vias": 25,+   "clean": false+  },+  "now": {+   "joined": 32,+   "joins": 32,+   "open": 0,+   "newErrors": 0,+   "vias": 20,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 307+ },+ {+  "board": "rf-mech-molecule-64x64",+  "parts": 68,+  "first": {+   "joined": 0,+   "joins": 0,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "now": {+   "joined": 0,+   "joins": 0,+   "open": 0,+   "newErrors": 0,+   "vias": 0,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 0+ },+ {+  "board": "carrier-fc-rp2350a-mini",+  "parts": 80,+  "first": {+   "joined": 62,+   "joins": 74,+   "open": 12,+   "newErrors": 0,+   "vias": 57,+   "clean": false+  },+  "now": {+   "joined": 74,+   "joins": 74,+   "open": 0,+   "newErrors": 0,+   "vias": 67,+   "clean": true+  },+  "originalOpen": 0,+  "originalVias": 101+ },+ {+  "board": "rp2350a-ads1220",+  "parts": 100,+  "first": {+   "joined": 163,+   "joins": 176,+   "open": 13,+   "newErrors": 4,+   "vias": 80,+   "clean": false+  },+  "now": {+   "joined": 172,+   "joins": 176,+   "open": 5,+   "newErrors": 1,+   "vias": 92,+   "clean": false+  },+  "originalOpen": 0,+  "originalVias": 97+ },+ {+  "board": "esc-g431",+  "parts": 149,+  "first": {+   "joined": 182,+   "joins": 238,+   "open": 51,+   "newErrors": 8,+   "vias": 150,+   "clean": false+  },+  "now": {+   "joined": 207,+   "joins": 239,+   "open": 24,+   "newErrors": 4,+   "vias": 241,+   "clean": false+  },+  "originalOpen": 0,+  "originalVias": 444+ },+ {+  "board": "amfm-receiver-molecule",+  "parts": 403,+  "first": {+   "joined": 540,+   "joins": 543,+   "open": 6,+   "newErrors": 0,+   "vias": 591,+   "clean": false+  },+  "now": {+   "joined": 539,+   "joins": 543,+   "open": 4,+   "newErrors": 0,+   "vias": 584,+   "clean": false+  },+  "originalOpen": 0,+  "originalVias": 976+ }+]\ No newline at end of file
docs/results/table.pngadded
⋯ 1 unchanged line ⋯