Borrowing it
Nothing to install: this file belongs to drandyhaas/KiCadRoutingTools. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/drandyhaas/KiCadRoutingTools/main/.claude/skills/diagnose-routing-failures/SKILL.mdgit clone --depth 1 https://github.com/drandyhaas/KiCadRoutingToolsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/drandyhaas/kicadroutingtools/diagnose-routing-failures)<a href="https://agentmods.dev/skills/drandyhaas/kicadroutingtools/diagnose-routing-failures"><img src="https://agentmods.dev/badge/skills/drandyhaas/kicadroutingtools/diagnose-routing-failures/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/drandyhaas/kicadroutingtools/diagnose-routing-failures"><img src="https://agentmods.dev/badge/skills/drandyhaas/kicadroutingtools/diagnose-routing-failures.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00075 | $0.03336 |
| Opus 5.5 | $0.00030 | $0.01334 |
| Sonnet 5.5 | $0.00015 | $0.00667 |
| Haiku 4.5 | $0.00007 | $0.00334 |
Grade A, and why
diagnose-routing-failures scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 3d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 172 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Diagnose Routing Failures
When this skill is invoked with a board file and routing log file(s), root-cause the failures and produce a targeted retry command. Routing runs should always be captured with 2>&1 | tee /tmp/<step>.txt so the logs are available.
Step 1: Parse the Structured Outputs
JSON summary
grep "JSON_SUMMARY" /tmp/route_output.txt | sed 's/.*JSON_SUMMARY: //' | python3 -m json.tool
Key fields:
failed_single: failed single-ended net names — nets with NO result at allopen_single: nets that KEPT a result whose copper still leaves pads disconnected (non-multipoint only; a multipoint shortfall is already the pad deficit). Always read this alongsidefailed_single— a board can ship open copper withfailed_single: [], so a run is only clean when both are empty. These nets also appear by name infailed_multipoint.terminal_restores:{net: outcome}for rip victims restored at terminal failure.fullis the only success;full_openrestored copper that never covered every pad, andstubkept only the escape stubs — both ship broken and are worth reporting as failures with a distinct cause (the reroute failed and the pre-rip copper could not be fully put back).stacked_copper: same-net duplicate copper KiCad's DRC will never flag. Not a routing failure, but if present, say so — it is invisible to every other check. It is censused before the plane finalize; route.py's end-of-run dedup (#162) then removes exact same-span copies, so readcheck_weirdon the output for what shipped.close_same_net_vias(#1414): same-net via pairs this run laid under the drill hole-to-hole floor (check_drcVIA-DRILL-HOLE);different_net_crossings(#1375): different-net tracks crossing on one layer among the run's copper (a short; check_drcSEGMENT-CROSSING). Both ship despitefailed 0: say so.failed_multipoint: nets with unconnected pads, including pad coordinatesblockers: per still-failed net, the run's LAST frontier blocking analysis (#409):{net, stage, blocked_by: [{net, blocked_count, unique_cells, track_cells, via_cells, near_target_cells, near_source_cells}], more?}— "net X failed BECAUSE nets Y,Z wall it off" as data. A net boxed in by PRE-EXISTING copper gets an entry withstage: "preexisting"whoseblocked_byitems carry only{net, preexisting: true}. Key absent when no failed net has an attributable blocker.boxed_in: per failed net whose search died almost at once with nothing rippable —{net, verdict: "boxed_in_static", iterations, geometry: {grid_step, clearance, track_width, via_diameter}}. Static obstacles (neighbouring pads + clearance), not congestion: the lever is a finer grid or smaller clearance/track, unlessgeometryis already at the floor.fanout_dropped: per failed net with a ball its fanout never escaped —{net, pad, component, plane_like, pads}(#652). The fix is upstream of this step: re-run the fanout for that net, or, whenplane_like, the plane.sealed_by_snpc: per failed net whose last legal via site was closed by this run's own--same-net-pad-clearance(#907) —{net, pad, same_net_pad_clearance, required_surround_mm, escape_reach_mm, aperture}. Re-run with--same-net-pad-clearance 0(a via then placed in a pad is stamped filled+capped, #962), or widen the channel in placement.multipoint_pads_connectedvsmultipoint_pads_total: connection success rate. Derived from the final-board union-find (the same checkcheck_connected.pyuses), so it credits pads reached via planes/zones, fanout stubs, and rip-up/retry reroutes and agrees withcheck_connected.py(issue #184).pad_pairs_connected/pad_pairs_total: pad-pair routability tallies (#409 follow-up; PRR = connected/total downstream). Per graded multi-pad net: connected = |pads| − pad components from the same final-board union-find, total = |pads| − 1 (clamped so a net whose pads are invisible to the union-find grades as connected). Population: the routing scope after already-routed filtering, pre-existing rippable nets the run graded, and disturbed coverage-gate nets. NOT reconcilable withmultipoint_edges_*(those count component-MST edges — pre-existing copper joins terminals first, so there are fewer edges than pad pairs). Each summary's are computed before the final reconciliation, likeblockers; the merged document (--json-out,JSON_SUMMARY_MIN) takes a still-broken net's tally from the end-of-run re-grade of the shipped board, so a net broken after the last summary is listed too (#1309). Counted per outer board outline (#479): a gap between two outlines is neither a routable pair nor an open one.pad_pairs_open: per net shipping a pair deficit:{net, pairs_connected, pairs_total, outcome, open_subtype}, sorted by net; key absent when none.outcomeis always"open"today — route.py runs no DRC, so a route-time failure is definitionally an open; shorts arecheck_drc.py's domain and the field exists so a DRC-integrated emitter can add"short"without a schema break. (Distinct namespace from route_diffpair_reports.outcome.)open_subtype:collision_refused(left open because restoring the ripped track would collide — a short was averted, #134),coverage_gate(disturbed out-of-scope net shipping broken),unrouted(scope net, no result at all),partial(routed a result but left pads disconnected). Join withblockersonnetfor cause + outcome per failed net.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 3d ago Changed · +4 lines 92859595848e
- 5d ago Changed · +24 lines ea5721dfea31
- 6d ago Changed · +1 lines 64127bb7a70b
- 7d ago Changed · +7 lines 6e7df467459e
- 18d ago Changed · +2 lines 0abb55757415
- 26d ago Changed f91bf13e88a5
- 1mo ago Changed · +1 lines 32c931400fcd
- 2mo ago First seen · 133 lines · 75 tokens per session scan A b887a0c7497f
diagnose-routing-failures is a skill published in the GitHub repository drandyhaas/KiCadRoutingTools (706 stars, last pushed today), licensed MIT. It adds 75 tokens to every session and 3,336 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
gke-ai-troubleshooting-tpu-dynamic-slices-monitoring
Monitors, troubleshoots, and manages GKE TPU Dynamic Slices custom resources. Use when checking TPU slice lifecycle states, troubleshooting slice provisioning failures, validating single-slice or multi-slice (JobSet) workload manifests, or safely patching stuck finalizers and disabling the slice controller. Don't use…
gke-ai-troubleshooting-tpu-vbar-oom
Diagnoses and prevents vbarcontrolagent segfaults, out-of-memory (OOM) errors, and TPU device initialization failures on TPU v6e nodes in GKE caused by race conditions during TPU device resets or high-frequency metrics polling. Use when troubleshooting vbarcontrolagent crashes, memory cgroup OOMs in serial console…
doca-flow
DOCA Flow packet steering on NVIDIA NICs/DPUs, linked into a C application: match/action pipes, ports, representors, forwarding, hairpin, counters. Trigger on packet steering, classifier, rule-matching, representor, hairpin or 5-tuple-to-queue questions even when "DOCA Flow" is not named. Also covers pipe validation…
diagnose-driver-install
Diagnose NVIDIA driver installation failures on DeepOps-managed nodes — nvidia-smi errors, "No devices were found", DKMS build failures, or GPU pods crash-looping. Use before reinstalling anything.
catc-troubleshoot
Catalyst Center troubleshooting workflows - device unreachable investigation, client connectivity issues, interface down analysis, site-wide outage triage, wireless roaming problems, integration with pyATS for CLI-level diagnostics. Use when the device is managed by Catalyst Center and you want its…
pyats-troubleshoot
Systematic network troubleshooting - connectivity, routing, interface, protocol, and performance issues using structured OSI-layer and divide-and-conquer methodology, via direct CLI/pyATS access. Use when something is broken, a device is unreachable, a link is flapping, users report slow performance, or an OSPF/BGP…