Troubleshooting Guide#
Common issues and their solutions when using oxo-flow.
Beginner Common Issues#
If your workflow isn't running as expected, check these common items first:
- Input files exist? Ensure your starting data (e.g., FASTQ files) is in the correct directory.
- Tools installed? If not using a managed environment (Conda/Docker), ensure tools like
bwaorsamtoolsare installed on your system. - Dry-run first? Run
oxo-flow dry-run workflow.oxoflowto see what oxo-flow intends to do without actually running commands. - Working directory? Make sure you are running commands from the project root directory (the one containing your
.oxoflowfile).
"It ran but nothing happened"#
Symptom: oxo-flow run shows success but no output files appear.
Solution:
- Check the output directory path in your
.oxoflowfile — paths are relative to the workflow file location - Use
oxo-flow debug workflow.oxoflowto see the actual commands being run - Verify the shell command actually creates the output file:
"No workflow file found"#
Symptom: oxo-flow run without arguments fails with "no .oxoflow file found"
Solution:
- Ensure you're in a directory containing a
.oxoflowfile - Or explicitly specify the workflow path:
oxo-flow run path/to/workflow.oxoflow - Use
oxo-flow init my-pipelineto create a new project if none exists
"Validate fails with parse error"#
Symptom: oxo-flow validate workflow.oxoflow shows TOML syntax errors
Common TOML mistakes:
| Mistake | Wrong | Correct |
|---|---|---|
| Missing quotes | name = my-rule |
name = "my-rule" |
| Wrong array syntax | [rules] |
[[rules]] |
| Unclosed string | shell = "echo |
shell = "echo hello" |
| Invalid table header | [[rule]] |
[[rules]] |
Use the TOML primer for syntax basics.
Workflow Parsing Errors#
TOML syntax error#
Symptom: parse error in workflow.oxoflow: ...
Solution: Check your TOML syntax. Common mistakes:
- Missing quotes around string values
- Incorrect array-of-tables syntax (use
[[rules]], not[rules]) - Unmatched brackets or braces
Use oxo-flow validate workflow.oxoflow to get detailed error messages.
Duplicate rule names#
Symptom: duplicate rule name: 'step1'
Solution: Every rule must have a unique name field. If you're using
[[include]] directives, use the namespace field to avoid conflicts:
Execution Errors#
Rule fails with non-zero exit code#
Symptom: rule 'bwa_align' failed with exit code 1
Solution:
- Run
oxo-flow debug workflow.oxoflow -r bwa_alignto see the expanded command with all variables substituted. - Check the log output for stderr messages.
- Try running the expanded command manually in your terminal.
- Verify that the required tool is installed and available in the rule's environment.
Command not found#
Symptom: sh: bwa: command not found
Solution: The tool is not in the system PATH. Either:
- Specify an environment in the rule:
- Or ensure the tool is installed and accessible.
Timeout exceeded#
Symptom: command timed out (exit code 124)
Solution: Increase the timeout via --timeout flag or allocate more
resources (threads/memory) to the rule.
Wildcard Issues#
Unresolved wildcards#
Symptom: wildcard error in rule '...' (e.g. a {sample} placeholder that could not be resolved)
Solution: Ensure wildcard values are provided. Wildcards like {sample}
must be resolved from:
- Input file patterns matched against existing files
- Explicit values in the config section
- Scatter configuration
Wildcard constraint violation#
Symptom: wildcard 'chr' value 'invalid' does not match constraint '^chr[0-9XYM]+$'
Solution: The wildcard value doesn't match the regex constraint defined in your workflow. Check that your input filenames follow the expected naming convention.
Environment Issues#
Conda environment creation fails#
Symptom: environment error (conda): ...
Solution:
- Check that conda/mamba is installed:
conda --version - Verify the environment YAML file exists and is valid
- Check for network connectivity (package downloads)
- Try creating the environment manually:
conda env create -f envs/tool.yaml
Docker image not found#
Symptom: environment error (docker): ...
Solution:
- Check that Docker is installed and running:
docker info - Verify the image reference:
docker pull quay.io/biocontainers/bwa:0.7.19--h577a1d6_1 - Check for authentication if using private registries
HPC modules not available#
Symptom: Module load errors when using modules in environment spec
Solution: Verify that the module system is available on your HPC node and that the specified module names and versions are correct:
DAG Issues#
Cycle detected#
Symptom: cycle detected in workflow DAG: A → B → C → A
Solution: Your rules have circular dependencies. The error message shows the full cycle path with → arrows connecting each rule in the loop.
- Use
oxo-flow graph workflow.oxoflowto visualize the DAG - Pick one edge in the cycle and decide how to break it:
- File-based edge: If
Aproduces a file thatBconsumes, andBproduces a file thatAconsumes, rename one output to break the match - Explicit
depends_on: Remove thedepends_onentry that closes the cycle - If the cycle is intentional (e.g., iterative refinement), split the rule into separate pre/post steps
- Re-validate:
oxo-flow validate workflow.oxoflow
Missing input#
Symptom: missing input for rule 'step2': intermediate.txt
Solution: Ensure that some other rule produces intermediate.txt as an output, or that the file already exists before the workflow runs.
Rule not found#
Symptom: rule not found: 'algn' with a list of available rule names
Solution: The target name passed to -t or referenced in depends_on doesn't match any rule. oxo-flow supports prefix matching — try a shorter prefix:
# Instead of guessing the exact name
oxo-flow run pipeline.oxoflow -t align # matches "align_reads", "align_bwa", etc.
Use oxo-flow graph workflow.oxoflow to see all rule names.
Rules not running in parallel#
Symptom: Workflow executes rules one-at-a-time despite -j 8
Causes and solutions:
- DAG is naturally sequential: Run
oxo-flow graph workflow.oxoflowand check Width in the header. If width=1, every rule depends on the previous one — no parallelism is possible. Consider splitting large rules into independent sub-tasks. - Resource constraints: If rules declare high thread/memory requirements (e.g., 32 threads each on a 64-thread machine), the resource pool may only allow 1-2 concurrent jobs. Either reduce declarations or increase
--max-threads/--max-memory. - Implicit file dependencies: Check that intermediate output files use unique names — if two rules produce the same output file, the engine reports an
Output pattern collisionerror and refuses to run.
Orphan rules (rules that never connect)#
Symptom: A rule exists in the workflow but has no connections to other rules — neither consuming their outputs nor producing inputs for them.
Detection: Use oxo-flow graph workflow.oxoflow -f tree and look for rules with no upstream or downstream indicators, or run oxo-flow clean --orphans to find them.
Solution: Check input/output paths for typos. An orphan is usually a misspelled file path that prevents the engine from matching it to other rules.
Output collisions#
Symptom: Output pattern collision: rules 'caller_a' and 'caller_b' both produce '{sample}.vcf'
Solution: Two rules produce files matching the same pattern. This is dangerous — the second rule to finish will overwrite the first rule's output. Give each rule distinct output directories:
# Before (collision)
[[rules]]
name = "caller_a"
output = ["variants/{sample}.vcf"]
[[rules]]
name = "caller_b"
output = ["variants/{sample}.vcf"] # ❌ Same pattern!
# After (fixed)
[[rules]]
name = "caller_a"
output = ["variants/caller_a/{sample}.vcf"] # ✅ Unique path
[[rules]]
name = "caller_b"
output = ["variants/caller_b/{sample}.vcf"] # ✅ Unique path
Deadlock detected#
Symptom: Deadlock detected: 3 rules stuck. Stuck rules: align_S001, align_S002, align_S003. Check resource constraints (threads/memory) and dependencies.
Solution: Pending rules are stuck because none can become ready — typically an upstream rule failed and its dependents stay pending forever (resource waits cannot deadlock: over-capacity requests are clamped, and explicit budget violations fail fast before any rule runs). Check:
oxo-flow statusfor failed upstream rules (the stuck rules' dependencies)- Dependency declarations (
depends_on) that may never be satisfiable - Re-run with
--keep-goingto surface all upstream failures at once
Resource budget exceeded#
Symptom: rule 'bwa_align' requires 64 threads but --max-threads caps the run at 32
Solution: The pre-flight budget check caught a rule whose requirements exceed the explicit limits. Either:
# Increase the budget
oxo-flow run pipeline.oxoflow --max-threads 64
# Or reduce the rule's requirement in the .oxoflow file
[rules.resources]
threads = 32
Note: This check only fires when --max-threads/--max-memory are explicitly set on the CLI. Auto-detected system resources don't trigger budget failures (only warnings).
Checkpoint and Resume#
Resuming a failed workflow#
After fixing the cause of a failure, re-run the same workflow. oxo-flow will check checkpoints and skip already-completed rules:
Clearing checkpoint state#
To force a full re-run, delete the checkpoint file:
Changed inputs rebuild automatically#
Re-running does not blindly reuse completed rules: the checkpoint records the
file set each rule's inputs resolved to (paths + size + mtime, plus a content
hash for files up to 64 MiB). When a glob or directory input gained or lost
files, or a plain input file was edited — including same-size rewrites that
preserve the mtime — the rule and its downstream re-execute, even though
their outputs still exist, and the console prints
input changes invalidated N rule(s). See
Input changes and manifest invalidation.
To see the blast radius before spending compute,
dry-run predicts
exactly which rules would re-run (including the downstream cascade) and how
much completed work stays protected.
Performance Tips#
Workflow runs slowly#
-
Increase parallelism: Use
-jto run more jobs concurrently: -
Check resource constraints: Use
oxo-flow debugto verify that resource requirements are reasonable. -
Use caching: a rule with
cache_keyreuses its outputs from the content cache when the key, inputs, outputs, and rendered command hash identically to a previous run — bump the key when a dependency's behavior changes without touching the declared inputs. (pipeis parsed but not wired up yet — do not rely on it.)
Memory issues with large workflows#
For workflows with many samples (>1,000):
- Process samples in batches using scatter/gather patterns
- Increase system memory limits
- Use cluster backends for distributed execution
Getting Help#
- Run
oxo-flow --helpfor CLI usage - Run
oxo-flow <command> --helpfor subcommand details - Run
oxo-flow debug workflow.oxoflowto inspect resolved commands - Check LIMITATIONS.md for known limitations
- Open an issue for bugs or feature requests
Reporting Real-World Issues#
We particularly value feedback from real-world deployments. If you encounter
issues in your actual bioinformatics workflows (as opposed to test examples),
please use the [Real-World Testing] prefix in your issue title:
[Real-World Testing] SLURM GPU job scheduling fails on cluster with multiple partitions
[Real-World Testing] Conda environment detection issue with custom channels
Include details about your cluster type, oxo-flow version, and a description of what happened versus what you expected. See our Contributing Guide for more guidance on providing effective feedback.