Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion hermes_cli/kanban_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -3025,7 +3025,11 @@ def archive_task(conn: sqlite3.Connection, task_id: str) -> bool:
summary="task archived with run still active",
)
_append_event(conn, task_id, "archived", None, run_id=run_id)
return True
# ``archived`` parents no longer block children, same as ``done``.
# Promote newly-unblocked dependents immediately instead of waiting
# for a later dispatcher tick.
recompute_ready(conn)
return True


def delete_archived_task(conn: sqlite3.Connection, task_id: str) -> bool:
Expand Down
22 changes: 22 additions & 0 deletions tests/hermes_cli/test_kanban_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -1278,6 +1278,28 @@ def test_unlink_tasks_triggers_recompute_ready(kanban_home):
"child should promote to ready immediately after unlink_tasks "
"removes its last blocking dependency"
)


def test_archive_task_triggers_recompute_ready_for_dependents(kanban_home):
"""Archiving a parent must immediately unblock its children.

``recompute_ready()`` already treats ``archived`` parents as satisfied
dependencies, just like ``done``. Regression: ``archive_task()`` updated
the parent row but never ran the ready-promotion pass, so children stayed
stuck in ``todo`` until a later dispatcher tick.
"""
with kb.connect() as conn:
parent = kb.create_task(conn, title="obsolete parent")
child = kb.create_task(conn, title="child", parents=[parent])

assert kb.get_task(conn, child).status == "todo"
assert kb.archive_task(conn, parent) is True

assert kb.get_task(conn, child).status == "ready", (
"child should promote to ready immediately after its last blocking "
"parent is archived"
)

# ---------------------------------------------------------------------------
# _add_column_if_missing / _migrate_add_optional_columns idempotency (#21708)
# ---------------------------------------------------------------------------
Expand Down
Loading