Simulation Validator
Goal
Provide a three-stage validation protocol: pre-flight checks, runtime monitoring, and post-flight validation for materials simulations.
Requirements
- Python 3.10+
- No external dependencies (uses Python standard library only)
- Works on Linux, macOS, and Windows
Inputs to Gather
Before running validation scripts, collect from the user:
| Input |
Description |
Example |
| Config file |
Simulation configuration (JSON/YAML) |
simulation.json |
| Log file |
Runtime output log |
simulation.log |
| Metrics file |
Post-run metrics (JSON) |
results.json |
| Required params |
Parameters that must exist |
dt,dx,kappa |
| Valid ranges |
Parameter bounds |
dt:1e-6:1e-2 |
Decision Guidance
When to Run Each Stage
Is simulation about to start?
├── YES → Run Stage 1: preflight_checker.py
│ └── BLOCK status? → Fix issues, do NOT run simulation
│ └── WARN status? → Review warnings, document if accepted
│ └── PASS status? → Proceed to run simulation
│
Is simulation running?
├── YES → Run Stage 2: runtime_monitor.py (periodically)
│ └── Alerts? → Consider stopping, check parameters
│
Has simulation finished?
├── YES → Run Stage 3: result_validator.py
│ └── Failed checks? → Do NOT use results
│ → Run failure_diagnoser.py
│ └── All passed? → Results are valid
Choosing Validation Thresholds
| Metric |
Conservative |
Standard |
Relaxed |
| Mass tolerance |
1e-6 |
1e-3 |
1e-2 |
| Residual growth |
2x |
10x |
100x |
| dt reduction |
10x |
100x |
1000x |
Script Outputs (JSON Fields)
| Script |
Output Fields |
scripts/preflight_checker.py |
report.status, report.blockers, report.warnings |
scripts/runtime_monitor.py |
alerts, residual_stats, dt_stats |
scripts/result_validator.py |
checks, confidence_score, failed_checks |
scripts/failure_diagnoser.py |
probable_causes, recommended_fixes |
Three-Stage Validation Protocol
Stage 1: Pre-flight (Before Simulation)
- Run
scripts/preflight_checker.py --config simulation.json
- BLOCK status: Stop immediately, fix all blocker issues
- WARN status: Review warnings, document accepted risks
- PASS status: Proceed to simulation
python3 scripts/preflight_checker.py \
--config simulation.json \
--required dt,dx,kappa \
--ranges "dt:1e-6:1e-2,dx:1e-4:1e-1" \
--min-free-gb 1.0 \
--json
Stage 2: Runtime (During Simulation)
- Run
scripts/runtime_monitor.py --log simulation.log periodically
- Configure alert thresholds based on problem type
- Stop simulation if critical alerts appear
python3 scripts/runtime_monitor.py \
--log simulation.log \
--residual-growth 10.0 \
--dt-drop 100.0 \
--json
Stage 3: Post-flight (After Simulation)
- Run
scripts/result_validator.py --metrics results.json
- All checks PASS: Results are valid for analysis
- Any check FAIL: Do NOT use results, diagnose failure
python3 scripts/result_validator.py \
--metrics results.json \
--bound-min 0.0 \
--bound-max 1.0 \
--mass-tol 1e-3 \
--json
Failure Diagnosis
When validation fails:
python3 scripts/failure_diagnoser.py --log simulation.log --json
Conversational Workflow Example
User: My phase field simulation crashed after 1000 steps. Can you help me figure out why?
Agent workflow:
- First, check the log for obvious errors:
python3 scripts/failure_diagnoser.py --log simulation.log --json
- If diagnosis suggests numerical blow-up, check runtime stats:
python3 scripts/runtime_monitor.py --log simulation.log --json
- Recommend fixes based on findings:
- If residual grew rapidly → reduce time step
- If dt collapsed → check stability conditions
- If NaN detected → check initial conditions
Error Handling
| Error |
Cause |
Resolution |
Config not found |
File path invalid |
Verify config path exists |
Non-numeric value |
Parameter is not a number |
Fix config file format |
out of range |
Parameter outside bounds |
Adjust parameter or bounds |
Output directory not writable |
Permission issue |
Check directory permissions |
Insufficient disk space |
Disk nearly full |
Free up space or reduce output |
Interpretation Guidance
Status Meanings
| Status |
Meaning |
Action |
| PASS |
All checks passed |
Proceed with confidence |
| WARN |
Non-critical issues found |
Review and document |
| BLOCK |
Critical issues found |
Must fix before proceeding |
Confidence Score Interpretation
| Score |
Meaning |
| 1.0 |
All validation checks passed |
| 0.75+ |
Most checks passed, minor issues |
| 0.5-0.75 |
Significant issues, review carefully |
| < 0.5 |
Major problems, do not trust results |
Common Failure Patterns
| Pattern in Log |
Likely Cause |
Recommended Fix |
| NaN, Inf, overflow |
Numerical instability |
Reduce dt, increase damping |
| max iterations, did not converge |
Solver failure |
Tune preconditioner, tolerances |
| out of memory |
Memory exhaustion |
Reduce mesh, enable out-of-core |
| dt reduced |
Adaptive stepping triggered |
May be okay if controlled |
Security
Input Validation
- Config file paths are validated for existence before parsing; non-existent paths produce clear errors
--required parameter names are validated against a safe-character allowlist
--ranges entries are parsed as name:min:max with finite numeric bounds enforced
--min-free-gb is validated as a finite positive number
--residual-growth and --dt-drop thresholds are validated as finite positive numbers
--bound-min, --bound-max, and --mass-tol are validated as finite numbers with bound-max > bound-min
File Access
preflight_checker.py reads a single user-specified config file (JSON/YAML) and checks disk space on the output directory
runtime_monitor.py reads a single log file specified by --log; log files are size-limited (500 MB max) before parsing
result_validator.py reads a single metrics file (JSON) specified by --metrics
failure_diagnoser.py reads a single log file specified by --log
- No scripts write to the filesystem; all output goes to stdout
Tool Restrictions
- Read: Used to inspect script source, references, config files, and simulation logs
- Bash: Used to execute the four Python validation scripts (
preflight_checker.py, runtime_monitor.py, result_validator.py, failure_diagnoser.py) with explicit argument lists
- Write: Used to save validation reports; writes are scoped to the user's working directory
- Grep/Glob: Used to locate log files, config files, and search references
Safety Measures
- No
eval(), exec(), or dynamic code generation
- All subprocess calls use explicit argument lists (no
shell=True)
- Log parsing uses pre-compiled regex patterns; user-supplied patterns are not accepted (patterns are hardcoded)
- Phase names and diagnostic strings extracted from logs are sanitized (truncated, control characters stripped) before inclusion in output
Limitations
- Not a real-time monitor: Scripts analyze logs after-the-fact
- Regex-based: Log parsing depends on pattern matching; may miss unusual formats
- No automatic fixes: Scripts diagnose but don't modify simulations
References
references/validation_protocol.md - Detailed checklist and criteria
references/log_patterns.md - Common failure signatures and regex patterns
Version History
- v1.1.0 (2024-12-24): Enhanced documentation, decision guidance, Windows compatibility
- v1.0.0: Initial release with 4 validation scripts
1---2name: simulation-validator3description: Validate simulations across three stages — run pre-flight checks on configuration files (parameter ranges, required fields, disk space), monitor runtime logs for residual growth, NaN/Inf, and adaptive dt collapse, and perform post-flight validation of results (physical bounds, mass/energy conservation, convergence). Diagnose failed simulations with probable-cause analysis and recommended fixes. Use when preparing to launch a simulation, checking whether a running job is healthy, verifying that finished results are trustworthy, or debugging a crash or blow-up, even if the user only says "my simulation crashed" or "can I trust these results."4---56# Simulation Validator78## Goal910Provide a three-stage validation protocol: pre-flight checks, runtime monitoring, and post-flight validation for materials simulations.1112## Requirements1314- Python 3.10+15- No external dependencies (uses Python standard library only)16- Works on Linux, macOS, and Windows1718## Inputs to Gather1920Before running validation scripts, collect from the user:2122| Input | Description | Example |23|-------|-------------|---------|24| Config file | Simulation configuration (JSON/YAML) | `simulation.json` |25| Log file | Runtime output log | `simulation.log` |26| Metrics file | Post-run metrics (JSON) | `results.json` |27| Required params | Parameters that must exist | `dt,dx,kappa` |28| Valid ranges | Parameter bounds | `dt:1e-6:1e-2` |2930## Decision Guidance3132### When to Run Each Stage3334```35Is simulation about to start?36├── YES → Run Stage 1: preflight_checker.py37│ └── BLOCK status? → Fix issues, do NOT run simulation38│ └── WARN status? → Review warnings, document if accepted39│ └── PASS status? → Proceed to run simulation40│41Is simulation running?42├── YES → Run Stage 2: runtime_monitor.py (periodically)43│ └── Alerts? → Consider stopping, check parameters44│45Has simulation finished?46├── YES → Run Stage 3: result_validator.py47│ └── Failed checks? → Do NOT use results48│ → Run failure_diagnoser.py49│ └── All passed? → Results are valid50```5152### Choosing Validation Thresholds5354| Metric | Conservative | Standard | Relaxed |55|--------|--------------|----------|---------|56| Mass tolerance | 1e-6 | 1e-3 | 1e-2 |57| Residual growth | 2x | 10x | 100x |58| dt reduction | 10x | 100x | 1000x |5960## Script Outputs (JSON Fields)6162| Script | Output Fields |63|--------|---------------|64| `scripts/preflight_checker.py` | `report.status`, `report.blockers`, `report.warnings` |65| `scripts/runtime_monitor.py` | `alerts`, `residual_stats`, `dt_stats` |66| `scripts/result_validator.py` | `checks`, `confidence_score`, `failed_checks` |67| `scripts/failure_diagnoser.py` | `probable_causes`, `recommended_fixes` |6869## Three-Stage Validation Protocol7071### Stage 1: Pre-flight (Before Simulation)72731. Run `scripts/preflight_checker.py --config simulation.json`742. **BLOCK status**: Stop immediately, fix all blocker issues753. **WARN status**: Review warnings, document accepted risks764. **PASS status**: Proceed to simulation7778```bash79python3 scripts/preflight_checker.py \80 --config simulation.json \81 --required dt,dx,kappa \82 --ranges "dt:1e-6:1e-2,dx:1e-4:1e-1" \83 --min-free-gb 1.0 \84 --json85```8687### Stage 2: Runtime (During Simulation)88891. Run `scripts/runtime_monitor.py --log simulation.log` periodically902. Configure alert thresholds based on problem type913. Stop simulation if critical alerts appear9293```bash94python3 scripts/runtime_monitor.py \95 --log simulation.log \96 --residual-growth 10.0 \97 --dt-drop 100.0 \98 --json99```100101### Stage 3: Post-flight (After Simulation)1021031. Run `scripts/result_validator.py --metrics results.json`1042. **All checks PASS**: Results are valid for analysis1053. **Any check FAIL**: Do NOT use results, diagnose failure106107```bash108python3 scripts/result_validator.py \109 --metrics results.json \110 --bound-min 0.0 \111 --bound-max 1.0 \112 --mass-tol 1e-3 \113 --json114```115116### Failure Diagnosis117118When validation fails:119120```bash121python3 scripts/failure_diagnoser.py --log simulation.log --json122```123124## Conversational Workflow Example125126**User**: My phase field simulation crashed after 1000 steps. Can you help me figure out why?127128**Agent workflow**:1291. First, check the log for obvious errors:130 ```bash131 python3 scripts/failure_diagnoser.py --log simulation.log --json132 ```1332. If diagnosis suggests numerical blow-up, check runtime stats:134 ```bash135 python3 scripts/runtime_monitor.py --log simulation.log --json136 ```1373. Recommend fixes based on findings:138 - If residual grew rapidly → reduce time step139 - If dt collapsed → check stability conditions140 - If NaN detected → check initial conditions141142## Error Handling143144| Error | Cause | Resolution |145|-------|-------|------------|146| `Config not found` | File path invalid | Verify config path exists |147| `Non-numeric value` | Parameter is not a number | Fix config file format |148| `out of range` | Parameter outside bounds | Adjust parameter or bounds |149| `Output directory not writable` | Permission issue | Check directory permissions |150| `Insufficient disk space` | Disk nearly full | Free up space or reduce output |151152## Interpretation Guidance153154### Status Meanings155156| Status | Meaning | Action |157|--------|---------|--------|158| PASS | All checks passed | Proceed with confidence |159| WARN | Non-critical issues found | Review and document |160| BLOCK | Critical issues found | Must fix before proceeding |161162### Confidence Score Interpretation163164| Score | Meaning |165|-------|---------|166| 1.0 | All validation checks passed |167| 0.75+ | Most checks passed, minor issues |168| 0.5-0.75 | Significant issues, review carefully |169| < 0.5 | Major problems, do not trust results |170171### Common Failure Patterns172173| Pattern in Log | Likely Cause | Recommended Fix |174|----------------|--------------|-----------------|175| NaN, Inf, overflow | Numerical instability | Reduce dt, increase damping |176| max iterations, did not converge | Solver failure | Tune preconditioner, tolerances |177| out of memory | Memory exhaustion | Reduce mesh, enable out-of-core |178| dt reduced | Adaptive stepping triggered | May be okay if controlled |179180## Security181182### Input Validation183- Config file paths are validated for existence before parsing; non-existent paths produce clear errors184- `--required` parameter names are validated against a safe-character allowlist185- `--ranges` entries are parsed as `name:min:max` with finite numeric bounds enforced186- `--min-free-gb` is validated as a finite positive number187- `--residual-growth` and `--dt-drop` thresholds are validated as finite positive numbers188- `--bound-min`, `--bound-max`, and `--mass-tol` are validated as finite numbers with `bound-max > bound-min`189190### File Access191- `preflight_checker.py` reads a single user-specified config file (JSON/YAML) and checks disk space on the output directory192- `runtime_monitor.py` reads a single log file specified by `--log`; log files are size-limited (500 MB max) before parsing193- `result_validator.py` reads a single metrics file (JSON) specified by `--metrics`194- `failure_diagnoser.py` reads a single log file specified by `--log`195- No scripts write to the filesystem; all output goes to stdout196197### Tool Restrictions198- **Read**: Used to inspect script source, references, config files, and simulation logs199- **Bash**: Used to execute the four Python validation scripts (`preflight_checker.py`, `runtime_monitor.py`, `result_validator.py`, `failure_diagnoser.py`) with explicit argument lists200- **Write**: Used to save validation reports; writes are scoped to the user's working directory201- **Grep/Glob**: Used to locate log files, config files, and search references202203### Safety Measures204- No `eval()`, `exec()`, or dynamic code generation205- All subprocess calls use explicit argument lists (no `shell=True`)206- Log parsing uses pre-compiled regex patterns; user-supplied patterns are not accepted (patterns are hardcoded)207- Phase names and diagnostic strings extracted from logs are sanitized (truncated, control characters stripped) before inclusion in output208209## Limitations210211- **Not a real-time monitor**: Scripts analyze logs after-the-fact212- **Regex-based**: Log parsing depends on pattern matching; may miss unusual formats213- **No automatic fixes**: Scripts diagnose but don't modify simulations214215## References216217- `references/validation_protocol.md` - Detailed checklist and criteria218- `references/log_patterns.md` - Common failure signatures and regex patterns219220## Version History221222- **v1.1.0** (2024-12-24): Enhanced documentation, decision guidance, Windows compatibility223- **v1.0.0**: Initial release with 4 validation scripts