Problem
When a child Kanban task's status is set to "ready" via the dashboard API (drag-drop or PATCH), the _set_status_direct function accepts it unconditionally — even when the task's parent(s) are still todo, running, or blocked. The dispatcher then spawns the child, which discovers no upstream output and either blocks itself (wasting a spawn cycle) or works with incomplete/stale data.
The dependency guard already exists in recompute_ready (which auto-promotes todo → ready only when all parents are done), but direct status writes via the dashboard bypass this check entirely.
Proposed Fix
Add the same parent-dependency check to _set_status_direct() in plugins/kanban/dashboard/plugin_api.py:
- When
new_status == "ready", query all parents and reject (return False → 409) if any parent is not done.
- No change to
recompute_ready — it already handles this correctly.
- Update affected tests accordingly.
Impact
- Prevents mis-dispatched tasks from being spawned with unfinished upstream dependencies.
- No breaking change to the dashboard UX — tasks with incomplete parents were never supposed to be draggable to the ready column.
Problem
When a child Kanban task's status is set to "ready" via the dashboard API (drag-drop or PATCH), the
_set_status_directfunction accepts it unconditionally — even when the task's parent(s) are stilltodo,running, orblocked. The dispatcher then spawns the child, which discovers no upstream output and either blocks itself (wasting a spawn cycle) or works with incomplete/stale data.The dependency guard already exists in
recompute_ready(which auto-promotestodo → readyonly when all parents aredone), but direct status writes via the dashboard bypass this check entirely.Proposed Fix
Add the same parent-dependency check to
_set_status_direct()inplugins/kanban/dashboard/plugin_api.py:new_status == "ready", query all parents and reject (returnFalse→ 409) if any parent is notdone.recompute_ready— it already handles this correctly.Impact