Dependencies & relations
Connect todos that block, relate to, or belong to each other — and let "ready" work sort itself out.
Real work has ordering: the migration can’t ship before the schema change, the blog post waits on the feature. createtodo models this directly instead of leaving it in your head.
Kinds of relations
- Blocks / blocked by — one todo must finish before another can start
- Related to — todos that share context without an ordering
- Duplicate of — the same work filed twice
- Parent / subtodo — a todo broken into pieces
Add relations from a todo’s page, from a row’s context menu (Blocked by…, Blocking…, Related to…, Duplicate of…), or in the composer while creating the todo — a follow-up or a blocker found mid-work is linked the moment it is filed. Search the other todo by title or identifier; both sides show the connection. Blocking relations that would form a cycle are rejected.
A blocked todo is marked in the list, and the Blocked filter hides or isolates blocked work.
Why blockers pay off
Once blockers are recorded, “what can I actually work on?” becomes a query instead of a
puzzle. The ct CLI’s ct ready lists exactly the todos that are open with no
unresolved blockers, and closing a blocker reports what it just unblocked:
ct dep add MZ-124 MZ-123 # MZ-124 waits on MZ-123
ct ready # MZ-124 is hidden while MZ-123 is open
ct close MZ-123 # → reports MZ-124 is now unblocked
This is what makes handing a backlog to an agent safe: the agent works the frontier of unblocked todos in the right order, without being told what’s next.