Simulation failure triage
Skill HeshamFS/materials-simulation-skills/skills/robustness/simulation-failure-triage
First-response triage for cross-code (LAMMPS/VASP/QE/MOOSE) simulation failures: classifies the failure signature (nonconvergence, NaN/Inf, exploding energy, unstable timestep, pressure blow-up, missing potentials/pseudopotentials, memory exhaustion, process crash/segfault, corrupted output, incomplete runs) and proposes a SAFE one-change-at-a-time RETRY LADDER with explicit STOP CONDITIONS, prioritizing evidence preservation. Use as the immediate first response to a failed or suspicious run. For deep per-stage validation, conservation/physical-bounds checks, and "can I trust these results" analysis, defer to the simulation-validator skill.From its SKILL.md
npx -y skills add HeshamFS/materials-simulation-skills --skill simulation-failure-triageAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- runs commandsInstructs the agent to run 1 command, including `python3 skills/robustness/simulation-failure-triage/scripts/failure_triage.py --code LAMMPS --stage runtime --symptoms nan,pressure-blowup --recent-change "increased timestep" --json`.
SKILL.md
9.5 KB, ~2.0k tokens by cl100k_base, as published. Nobody here has run it
Simulation Failure Triage
Goal
Classify common simulation failure signatures and return immediate actions, retry ladders, and stop conditions.
Requirements
- Python 3.10+
- No external dependencies
- Works on Linux, macOS, and Windows
Inputs to Gather
| Input | Description | Example |
|---|---|---|
| Code | Simulation code | LAMMPS, VASP, MOOSE, QE |
| Stage | Setup, runtime, postprocess | runtime |
| Symptoms | Failure signs | nan,pressure-blowup |
| Log text or file | Error evidence | Lost atoms, ZBRENT |
| Recent change | Last modified setting | larger timestep |
Decision Guidance
- First preserve evidence: logs, inputs, executable version, and scheduler output.
- Separate setup errors from numerical instability and physical model issues.
- Retry with a single controlled change.
- Stop retrying when the result becomes scientifically meaningless or a required model input is missing.
Script Outputs
scripts/failure_triage.py emits:
likely_causesimmediate_actionsretry_ladderstop_conditionsevidence
Workflow
python3 skills/robustness/simulation-failure-triage/scripts/failure_triage.py \
--code LAMMPS \
--stage runtime \
--symptoms nan,pressure-blowup \
--recent-change "increased timestep" \
--json
Error Handling
Invalid stages or oversized log files stop with exit code 2. Unknown symptoms are retained as custom evidence.
Limitations
This skill gives first-response triage. It does not guarantee that a failed simulation can be repaired.
Verification checklist
- Recorded the preserved-evidence set BEFORE any rerun: copied logs, input decks, scheduler output, and the executable/version string (per the first
immediate_actionsitem) so the original failure is reproducible. - Quoted the FIRST warning/error from the run, not just the final crash line, and confirmed
evidence.log_excerpt(first 500 chars, original casing) captures it; re-run with--log-file/--log-textif the excerpt misses the root signature. - Logged every
likely_causesentry with itssymptom,category, andfirst_action, and verified no real signature landed in thecategory: custombucket because its keyword was absent fromLOG_HINTS/PATTERNS. - Confirmed the failure category is correct rather than mislabeled: a segfault/SIGSEGV/signal 11/core-dumped maps to
crash(notcorrupted-output), and an OOM/bad_alloc/oom-killmaps toout-of-memory(notincomplete-run). - Applied the
retry_ladderstrictly one change at a time, recording the single parameter changed and its effect at each rung (including the memory rung when memory-bound). - Checked every
stop_conditionsentry and halted the retry loop instead of stacking arbitrary stabilizing tweaks when any condition is met (e.g. unverifiable potential/pseudopotential, results dependent on arbitrary stabilizers). - After any numerical recovery, handed off to the
simulation-validatorskill for conservation / physical-bounds / "can I trust these results" checks rather than declaring success here.
Common pitfalls & rationalizations
| Tempting shortcut | Why it's wrong / what to do |
|---|---|
| "The last line of the log is the error, so I'll fix that." | The final crash line is often a downstream symptom; the script's second immediate_actions item exists because the FIRST warning/error is the real cause. Capture it in evidence.log_excerpt and triage from there. |
| "It segfaulted, so it's a corrupted-output / disk issue." | A crash (SIGSEGV/signal 11/core dumped) is a memory-fault category pointing at out-of-bounds/null-pointer/ABI bugs and a gdb/valgrind/ASan repro — not I/O. Do not treat it as corrupted-output. |
| "The job got killed, so I'll just bump the walltime." | killed alone is genuinely ambiguous and stays incomplete-run; an OOM signature (bad_alloc, oom-kill, "out of memory") is a distinct out-of-memory cause needing memory reduction / --mem increase, not more walltime. |
| "I'll lower dt AND change the preconditioner AND adjust the barostat to get it running." | The retry ladder is one controlled change per rung; stacking fixes makes results "depend on arbitrary stabilizing changes" — an explicit stop_conditions trigger. Change one parameter, record its effect, then proceed. |
| "I added the missing PAIR coeff path and it ran, so the physics is fine." | A clean run after fixing missing-potential/bad-pseudopotential resolves setup, not validity; species mapping, valence, or functional may still be wrong. Run completion is not correctness. |
| "It runs now, triage is done." | Triage only restores execution. Conservation, physical bounds, and convergence are out of scope here — defer to simulation-validator before trusting any number. |
Security
Input Validation
--stageis checked against a fixed allowlist (setup,runtime,postprocess,unknown); any other value exits with code 2.--codemust be non-empty and at most 100 characters; an empty or oversized value exits with code 2.--symptomsare split on commas and capped at 50 entries, each at most 100 characters; exceeding either limit exits with code 2.- Unknown symptoms are not rejected; they are retained as
customevidence rather than silently dropped. - There are no numeric arguments, so no finite/positive checks apply.
- All input-validation failures (and log read errors) are caught and exit with code 2 and a stderr message.
File Access
- The only file read is the optional
--log-filepath; when omitted, the script reads no files. - Before reading, the log file's size is checked via
stat; if it exceeds the 10 MB cap (MAX_LOG_SIZE) the script raises and exits with code 2. Both file content and--log-textare then truncated to 10 MB. - The script writes no files; all results go to stdout (JSON with
--json, otherwise plain text). - Path-sandboxing caveat: the log path is not restricted to a working directory, so the script can read any file the invoking process has permission to read; only pass trusted paths.
Tool Restrictions
allowed-toolsisRead, Bash, Write, Grep, Glob.Bashruns only the bundledscripts/failure_triage.py.Readopens the skill's own files and a user-provided log to inspect failure evidence;Grep/Globlocate log files, inputs, and prior output;Writerecords triage notes or preserved evidence at the user's direction. The bundled script itself does not write files.
Safety Measures
- No
eval/execand no dynamic code execution; log text is treated as data and never run. - The script spawns no subprocesses and runs no external solvers.
- Output is structured JSON (
--json), making results machine-checkable. - DoS caps bound resource use: 10 MB log size/text limit, 50 symptoms, and 100-character limits on
codeand each symptom.
References
- See
references/failure_patterns.mdfor common failure signatures and retry ladders.
Version History
- 1.1.3: Add
Verification checklist(evidence-based checks tied tofailure_triage.pyoutputs — preserved-evidence set, first-error excerpt, category-mislabel guards, one-change retry ladder, stop conditions, simulation-validator handoff) andCommon pitfalls & rationalizationstable covering last-line-only triage, segfault-as-I/O, OOM-vs-walltime, stacked stabilizing changes, and "it ran so it's valid". - 1.1.1: Strengthen evals to be discriminating — each case now pins the exact
failure_triage.pyJSON output viascript_checks(specificcategory/first_actionstrings, log-hint symptom inference, fixed retry-ladder/stop-condition text, recent-change immediate action), so the suite measures the skill's actual output rather than generic triage knowledge. - 1.1.0: Add dedicated
out-of-memoryandcrash(segfault) classifications; segfaults and OOM are no longer mislabeled as I/O or interrupted-execution. Preserve original-case log excerpt. Add input-validation caps (symptoms, code length). Sharpen description to defer deep validation to simulation-validator. Fixmissing-potentialeval token. - 1.0.0: Initial cross-code simulation failure triage skill.
What ships with it: 4 files
16.7 KB alongside SKILL.md, 1 of them executable
evals/
- evals.json5.9 KB
references/
- failure_patterns.md1.2 KB
scripts/
- failure_triage.pyruns7.3 KB
- CHANGELOG.md2.3 KB
Gives 0 of the 12 instructions most quality gates skills give in ~2.0k tokens
Counted across 1,524 of the 2,830 authors here whose files we hold, read 2026-09-06
- Read full output and check exit codein 45 of 1524, across 40 files
- Verify output confirms the claimin 44 of 1524, across 39 files
- Identify the command that proves the claimin 43 of 1524, across 39 files
- Execute the full verification commandin 36 of 1524, across 30 files
- Produce a verification reportin 34 of 1524, across 18 files
- Review git diff changesin 30 of 1524, across 16 files
- Fix build failures immediatelyin 29 of 1524, across 9 files
- Group findings by severityin 28 of 1524
- State claim only with evidencein 27 of 1524, across 22 files
- Verify regression tests with red-green cyclein 26 of 1524, across 22 files
- Run the full test suitein 26 of 1524, across 25 files
- Run test suite with coveragein 25 of 1524, across 10 files
Said here and by no other author read
- preserve logs and inputs before any rerun
- quote the first warning or error from the run
- apply the retry ladder one change at a time
- record the effect of each parameter change
- halt retries when stop conditions are met
- hand off to simulation-validator after numerical recovery
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.