Failure scenario
Run a valid DAG plan with three dependent steps:
a fails and does not set continue_on_failure.
b depends on a.
c depends on b.
The planner marks b skipped, but when it processes that skip it does not propagate the skip to b's dependents. c is then reported successful and its tool executes even though the entire dependency chain that was meant to gate it did not run.
A direct current reproduction produces:
a: failed
b: skipped due to upstream failure
c: success (tool executed)
Sites
src/odin/planner.py:91-97 records an already-marked dependent as skipped but does not cascade that status further.
src/odin/planner.py:143-151 only adds immediate dependents to the skipped set when processing a freshly executed failure.
Expected result
Propagate an upstream failure/skip through all transitive dependents, or decide readiness from the recorded statuses of every declared dependency before executing each step.
Failure scenario
Run a valid DAG plan with three dependent steps:
afails and does not setcontinue_on_failure.bdepends ona.cdepends onb.The planner marks
bskipped, but when it processes that skip it does not propagate the skip tob's dependents.cis then reported successful and its tool executes even though the entire dependency chain that was meant to gate it did not run.A direct current reproduction produces:
Sites
src/odin/planner.py:91-97records an already-marked dependent as skipped but does not cascade that status further.src/odin/planner.py:143-151only adds immediate dependents to theskippedset when processing a freshly executed failure.Expected result
Propagate an upstream failure/skip through all transitive dependents, or decide readiness from the recorded statuses of every declared dependency before executing each step.