Anyone knows how to implement fininsh-to-start task dependency in org-mode?

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.