Adds shove_needed.dsn: one signal layer (no vias), where NET_A routes as a straight wall that boxes NET_C out under greedy ordering. Tests assert the contrast: without shove NET_C is dropped (result still DRC-clean, just incomplete); with shove NET_A is moved aside and both nets connect, the exact has_violation check is clean, endpoints stay on pads, and the result is deterministic. Regression tests confirm shove is a no-op on the simple/ crossing/ripup/kicad boards (same connectivity, DRC-clean, zero shoves). Oracle-gated parity is included (skips when the JAR cannot route the synthetic single-layer board).
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.