Adds narrow_channel.dsn: a keepout wall with a narrow gap positioned off the routing grid, so no grid cell centre falls inside the gap's free centreline. The exact/grid track drops the net (cell quantization can't fit a centreline in the channel); the continuous room track routes it. This is the headline result that continuous free-space beats the grid. Tests: the room router's output is DRC-clean (exact has_violation is None) on simple/crossing/kicad/narrow_channel; it connects simple/crossing (with a via) and all four multi-pin KiCad nets; traces are orthogonal and end on pads; and the continuity contrast asserts exact routes 0 while rooms routes 1, both clean. Oracle-gated connectivity parity on simple/crossing.
DSN test fixtures
Hand-crafted minimal Specctra DSN files, written to exercise the parser. They
are modeled on the real fixtures shipped in the upstream FreeRouting repo
(fixtures/empty_board.dsn and fixtures/SMD-routing-issue-demo.dsn) so the
grammar and formatting match what kicad-cli pcb export specctra-dsn and
FreeRouting itself produce, but they were typed fresh here (no upstream file is
copied into this tree).
empty_board.dsn— the smallest valid board: parser, resolution, unit, and a structure with two signal layers and apcbboundary path. Modeled on FreeRoutingfixtures/empty_board.dsn.smd_demo.dsn— a fuller board exercising every scope the parser handles: quoted board/padstack/image names,via, defaultrule(width + clearance with a(type smd_smd)pair), akeepout, padstacks (rect and circle pads), images with pins, placement withfront/rotation, nets withComp-Pinreferences, and aclasswithcircuit/use_viaand arule. Modeled on FreeRoutingfixtures/SMD-routing-issue-demo.dsn.