Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Evidence-before-action diagnosis of failing ML experiments. Probes the system before guessing causes, process list, dmesg, GPU stats, log scrollback, checkpoint state, then states a hypothesis as a hypothesis and runs a smoke before claiming a root cause. Use when the user asks why a run is failing, diverging, OOMing, hanging, slow, producing weird metrics, has crashed, or asks to debug, diagnose, troubleshoot, or investigate a training issue.
.claude/skills/fcakyon-debug/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 102% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -16% | 0% |
The most expensive class of mistake in ML debugging is asserting a cause based on plausibility, then attempting a "fix" that masks the real problem. This skill enforces the discipline of probe → hypothesis → smoke → controls → claim, in that order.
The agentic Stop hook routes here from reason when an assistant claims a cause without backing tool output.
The user just said any of:
Before forming any hypothesis, gather the cheap evidence. None of these cost more than a few seconds:
Process state:
bashps aux | grep -E '(python|train|torchrun|accelerate)' | grep -v grep
Is the process still running? Zombie? Defunct? Multiple instances?
Kernel / system events:
bashdmesg | tail -100 # OOM kills, hardware errors, NFS errors journalctl -xe --since "1 hour ago" | tail -50
GPU state:
bashnvidia-smi nvidia-smi --query-gpu=utilization.gpu,memory.used,temperature.gpu --format=csv
Is the GPU even being used? Idle GPU during "training" means the process is blocked on data loading or has died.
Disk / filesystem:
bashdf -h /path/to/run-dir du -sh /path/to/run-dir/*
Out of disk? Checkpoints not being written?
Log scrollback: Read the last few hundred lines of the training log. Don't trust the user's summary, they may have skimmed. Look for:
Checkpoint state:
bashls -la /path/to/run-dir/checkpoints/
When was the last checkpoint written? What does its size suggest? An empty .pt is different from a 2GB one cut short.
After the probe, state what _might_ be happening, explicitly framed as a hypothesis:
> "Hypothesis: the run is OOMing because dmesg shows oom-kill 3 minutes ago and the process is gone. Alternative hypotheses I haven't ruled out: (a) NFS write timeout, (b) explicit kill from a sibling process."
Never skip to "the cause is X." The hypothesis labels what you don't yet know.
The cheapest way to confirm or refute a hypothesis is to reproduce the failure shape under a controlled condition:
batch_size=1 for 1 step. If it survives, OOM is confirmed; if it fails the same way, OOM is wrong.eval() mode. Loss finite? Outputs sane?lr=0. If the loss still explodes, the loss itself is broken (not the optimizer).A 30-second smoke beats a 30-minute restart-and-pray.
If the smoke is ambiguous, run a control: change exactly one variable from the failing config and rerun the smoke. The differences narrow what mechanism is responsible.
Common control axes (change one at a time):
Only after evidence stacks up, probe, smoke, control, do you assert a cause. The claim should cite the specific tool output that proves it:
> "Root cause: NFS write timeout. Evidence: dmesg shows nfs server X not responding at 14:23 (the same minute the last checkpoint was written), and the smoke with batch=1 reproduces the timeout. Recommended fix: bind-mount a local scratch dir for checkpoints and rsync to NFS at end of epoch."
If the evidence isn't stacking up, do not promote a hypothesis to a cause. Say "I don't yet know" and propose the next probe.
A concise diagnostic report: (1) what the probes showed, (2) the hypothesis, (3) the smoke outcome, (4) the cause-or-uncertain verdict, (5) the recommended next action. Each claim cites the tool output that backs it.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-10 | fail→fail | 14,116 | 12,256 | -13% | 1 | 1 | 0% | 2,207 | 3,220 | +46% | 0 | 0 | — |
case-16 | pass→pass | 16,659 | 12,927 | -22% | 1 | 1 | 0% | 2,783 | 3,317 | +19% | 0 | 0 | — |
case-01 | fail→pass | 21,302 | 24,793 | +16% | 1 | 1 | 0% | 3,327 | 4,766 | +43% | 0 | 0 | — |
case-02 | fail→pass | 21,826 | 20,427 | -6% | 1 | 1 | 0% | 3,710 | 3,910 | +5% | 0 | 0 | — |
case-03 | fail→fail | 44,932 | 5,189 | -88% | 1 | 1 | 0% | 1,396 | 1,500 | +7% | 0 | 0 | — |
case-04 | fail→fail | 14,563 | 13,747 | -6% | 1 | 1 | 0% | 2,549 | 3,576 | +40% | 0 | 0 | — |
case-05 | fail→pass | 13,265 | 13,372 | +1% | 1 | 1 | 0% | 2,197 | 3,413 | +55% | 0 | 0 | — |
case-06 | fail→fail | 12,608 | 9,751 | -23% | 1 | 1 | 0% | 2,141 | 2,694 | +26% | 0 | 0 | — |
case-07 | fail→pass | 9,929 | 12,444 | +25% | 1 | 1 | 0% | 1,651 | 3,338 | +102% | 0 | 0 | — |
case-08 | pass→pass | 14,793 | 12,008 | -19% | 1 | 1 | 0% | 2,470 | 3,069 | +24% | 0 | 0 | — |
case-09 | fail→pass | 17,330 | 6,507 | -62% | 1 | 1 | 0% | 2,860 | 2,390 | -16% | 0 | 0 | — |
case-11 | pass→pass | 20,137 | 11,888 | -41% | 1 | 1 | 0% | 3,157 | 3,107 | -2% | 0 | 0 | — |
case-12 | fail→fail | 14,523 | 10,320 | -29% | 1 | 1 | 0% | 2,401 | 2,923 | +22% | 0 | 0 | — |
case-13 | pass→pass | 9,088 | 8,316 | -8% | 1 | 1 | 0% | 1,358 | 2,489 | +83% | 0 | 0 | — |
case-14 | fail→pass | 8,783 | 6,987 | -20% | 1 | 1 | 0% | 1,376 | 2,282 | +66% | 0 | 0 | — |
case-15 | pass→pass | 15,803 | 8,988 | -43% | 1 | 1 | 0% | 2,476 | 2,427 | -2% | 0 | 0 | — |
case-17 | pass→pass | 13,848 | 5,590 | -60% | 1 | 1 | 0% | 2,330 | 2,014 | -14% | 0 | 0 | — |
case-18 | fail→pass | 10,989 | 6,394 | -42% | 1 | 1 | 0% | 1,738 | 2,241 | +29% | 0 | 0 | — |
case-19 | pass→pass | 11,811 | 9,194 | -22% | 1 | 1 | 0% | 2,664 | 3,120 | +17% | 0 | 0 | — |
case-20 | pass→pass | 7,372 | 8,236 | +12% | 1 | 1 | 0% | 1,527 | 2,937 | +92% | 0 | 0 | — |
case-21 | pass→pass | 12,126 | 8,425 | -31% | 1 | 1 | 0% | 2,176 | 2,771 | +27% | 0 | 0 | — |
case-22 | pass→pass | 13,097 | 8,687 | -34% | 1 | 1 | 0% | 2,204 | 2,576 | +17% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +32 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.