Hi Cylc team,
I’m running operational forecasting workflows and I’m looking for the right pattern for this behavior:
What I want:
- Keep strict within-cycle dependency logic.
- If an upstream task fails, downstream tasks that require it should not run.
- Failed/unmet tasks in cycle N should not block scheduling/progression to cycle N+1.
- I want to avoid manual intervention (manually removing blocked tasks).
Current behavior:
- I already set:
- abort on stall timeout = False
- This prevents workflow abort, but the workflow still stalls/blocks on the same cycle due to unmet required outputs in the graph.
What I tried:
- “completion = succeeded or failed” at [runtime][root] level.
- Validation fails because some tasks are required as :succeeded in graph outputs.
- Error example:
- “:succeeded is required in the graph, but optional in the completion expression succeeded or failed”
- Optional outputs (?) in graph.
- I understand:
- A => B? means B still requires A:succeeded to run, but B is optional for workflow completeness.
- A? => B would relax dependency (not what I want).
- This helps in some places, but in larger chained graphs it becomes complicated to apply safely without making graph definitions messy.
Core question:
Is there a global or cleaner Cylc-native pattern to treat a cycle as “complete with failures” (without stalling) for progression purposes, while still preserving strict within-cycle success dependencies (i.e., no downstream execution when hard upstream failed)? I.e., in a forecast workflow scenario, I want to allow my next cycle to carry on even if there are failed tasks in the current cycle.
If the recommended approach is graph-based only, is there a best-practice pattern for large workflows to avoid lots of repetitive optional/suicide logic?
Thanks in advance.