# Fixed-route data files `power_routes.json` and `critical_routes.json` hold the **hand-drawn, audited geometry** that used to live in `scripts/route_power_stage.py` and the RF/USB block of `scripts/finalize_routing.py`. They are board-specific layout data — not an algorithm — consumed by the project-independent loader ``` pcbrouter fixed --in --out --routes ``` which resolves the anchors against the board's footprints and splices locked copper, rule areas and the RF ground zone into the `.kicad_pcb`. Run `kicad-cli pcb drc --refill-zones` afterwards so the planes re-carve around the new vias (the Python scripts called `ZONE_FILLER.Fill()` for the same reason). Regenerate from the (retired) scripts with `/usr/bin/python3 scripts/_extract_fixed_routes.py`. ## Schema ```jsonc { "tracks": [ { "net": "CORE_SW", // net name (must exist on the board) "layer": "F.Cu", // KiCad canonical or user layer name "width": 0.20, // mm "points": [ "U13.9", [99.25, 95.25], [100.0, 95.25] ] // each point: "REF.PAD" anchor OR [x, y] mm } ], "vias": [ { "net": "VCC0V95", "at": [107.8, 92.6], "diameter": 0.75, "drill": 0.38 } // "at" may also be a "REF.PAD" anchor ], "rule_areas": [ { "name": "RF_NO_DIGITAL", "layers": ["B.Cu", "In2.Cu", "In4.Cu", "In5.Cu"], "rect": [152.0, 36.0, 174.5, 49.5] } // x0 y0 x1 y1 mm ], "ground_zones": [ { "net": "GND", "layer": "F.Cu", "clearance": 0.20, "min_thickness": 0.10, "priority": 100, "outline": [[152.0,36.0],[174.5,36.0],[174.5,49.5],[152.0,49.5]], "via_fence": [[153,38.7],[155,38.7], ...] } // 0.45/0.225 GND vias ] } ``` All coordinates are millimetres in the board's own frame (KiCad screen-down Y). Anchors are resolved to the pad centre. Every emitted item is `(locked yes)`.