I have been scratching my head for a while now about how to handle task dependencies in Orgmode.
First off, I am aware of org-depend
and org-edna
as well as the ORDERED
property. I am trying to find a way to make them work for a common, but specific type of dependency.
Tasks Dependencies
As defined in this blog page from the ‘projectmanager.com’ website, a Gantt chart will define 4 types of dependency. I find two of them essential in my task management workflow.
Finish to finish
The first one, and most commn I think, is the finish-to-finish dependency which is the one I believe is covered by org-mode; this is also the easiest to enforce (again imho) programatically with orgmode tools. Task A cannot be marked as DONE
before task B and C are.
It is what org-enforce-todo-dependencies
manages, and its info page defines it as a parent/children task relationship. This is how I use it, and how I understand the ‘finish-to-finish’ dependency in general.
The other tools I mentioned above all have the same definition of a task dependency, threfore address the ‘finish-to-finish’ handling. What they add is the possibility to define parent and children task relationships across different projects or files using a BLOCKER
property instead of being limited to a linear, indented type of sub tasks defintion.
Finish to start
The other less common, but as important to me, dependency type I desperately need to implement in a practical way is the finish-to-start relationship. This one can be as much about planning and resource allocation as physical constraints.
For example, it is obvious that I need to get a permit from the city before starting construction work on my house, but, because my resources are limited I decided to start working on feauture request X only after I finished remodeling my kitchen, fixed bug Y and Z, and migrated my email accounts to Emacs.
I will certainly not remember I have to work on feature X after completing all those other tasks, so I need it to pop up on my task list when all those other tasks are completed; and I surely do not want it to unnecessarily clutter my task list in the meantime. Efficient and clear lists are supposed to be the basis for a happy GTD system after all, and I feel like org-mode was mostly built with GTD in my mind.
Using solutions like org-edna I could achieve something similar using a BLOCKER property. The problem I cannot seem to solve is: ‘how do I differentiate those tasks from the tasks blocked using the ORDERED
property, or the org-enforce-todo-dependencies
variable in my agenda views ?’
What I want to achieve
Practically speaking, let’s simplify a typical workflow, and say I have 3 task lists, or agenda views for that matter:
- the ‘Active Projects’ for all the projects I have already started,
- a ‘Projects Backlog’ for all the unhindered projects simply waiting to be started,
- and a self-explanatory ‘Blocked Projects’.
Following the previous ‘finish-to-start’ example, let’s consider I have already started working on my ‘Kitchen Remodel’ project, and my ‘Bug Y’ issue. Projects ‘Bug Z’ and ‘Email To Emacs’ are ready to be started, and I previously decided to start ‘Feature X’ only when everything else is done. My lists should look like the following:
-
Active Projects
- ‘Kitchen Remodel’
- ‘Bug Y’
-
Projects Backlog
- ‘Bug Z’
- ‘Email To Emacs’
-
Blocked Projects
- ‘Feature X’
Org-edna’s BLOCKER
property seems the way to go to send ‘Feature X’ to the ‘Blocked Projects’ list testing with org-entry-is-blocked-p
. When the blocker tasks are DONE
, it should automatically move to the ‘Projects Backlog’.
The wall I am hitting
The problem is that since I am using org-enforce-todo-dependencies
, all the other projects with children tasks will also end up in ‘Blocked Projects’.
I could check for the presence of the BLOCKER
property, but since it is not removed by org-edna with blockers are done, it will defeat the purpose.
The only solution I am seeing so far is to use a STARTED
tag for active projects, this is ok from a convenience point of view. But the ‘Backlog’ is trickier. I see only two non ideal solutions:
- not adding any sub tasks for projects in the backlog,
- using a BACKLOG tag (about which I do not have a good feeling).
(EDIT: After trying this out, I realized it does not work for lower level tasks if the STARTED tag is inherited).
Conclusion
The main issue here I think is that I am not finding a way to differentiate between different types of dependencies. I have just found while editing this post that there exists an org-mode gantt chart module, I will read about it to see how they are handling it.
If anyone sees or is aware of a better way to achieve this, I would greatly appreciate it. I am looking fr something convenient, and not too error prone.
Thanks in advance for your help.