After a few days of fiddling, I almost feel like Taskwarrior is dialed in.
I’ve got a pair of aliases that take away some of the wordiness of task entry: twa
and twp
for things that get either the work or personal tag. If I want to add metadata I can, but if I need to just dash something in, it’s fast.
I’ve set up a work
context, a personal
context (which is just not tagged work
), and a contacts
context. So it’s easy to cut away the noise from different areas of concern.
I customized priority
to p1
, p2
, and p3
and I customized estimate
to ye olde Fibonacci sequence.
I tried using the start/stop functionality and it created an overwhelming amount of visual noise, so I promptly quit doing that, and had such a bad reaction that I ended up radically simplifying the color scheme:
- red: overdue
- paleish orange: due next 48 hours
- yellow: active tasks, which by convention I am limiting to my most important project
- normal text: the rest
- cyan: a “project container”
On that last, Taskwarrior doesn’t really have subtasks. It does have dependencies and it does have projects. I’m not sure where I’m at on the lack of subtasks. Right now I’m feeling my way through. One way I’ve adapted is to make a task that I tag with project
that states the outcome of the project. Something like “Turn off Otter Integration.” Then I set the date I want that to happen and tag it project
as well as add it to, e.g. project:otter
along with all the related tasks.
When I run the big task list report, the project deadlines/delivery dates all show up in cyan, so I can get a sense of relative timing of everything I have going on, or will have going on, and how much stuff is between me and getting that thing done.
I’m trying to be sort of roadmappy/backloggy about all this. I am trying to avoid prematurely assigning due dates until I feel pretty confident I can honor them, or until I’m getting close enough to “due” on a project that I better make a plan.
Since I due-sort everything on my lists, it means there’s sort of a pool of undated tasks down at the bottom of the report just bumping around. That’s fine. They’re the backlog. The meaningful action is the stuff to the top of the list with light color-coding for the stuff I’ve decided needs to happen right now. If I want to start more detailed scheduling on a given project, I can just run the list for it, e.g. task project:otter
, and then assign due dates on as much as I need to keep going. If I want to go prospecting, I can run task undue
to find things without dates.
I once knew an engineering director the project managers dreaded because he wanted to plan out and schedule the next six sprints in detail, then re-ripple the plan at every sprint close. Basically pantomime horse Agile, I guess, shoving Jira tickets around a board. It was tedious make-work in the service of a fundamental hypocrisy of the place we were working, which was that we’d “gone Agile” but weren’t at all Agile.
I am not making software. I’m just running an IT org in the middle of a pre-IPO tech company. That company has four or five processes for everything and has the usual struggles around alignment and prioritization that 600 people are going to have. A lot of deadlines are negotiable. The hardest deadlines tend to be based on contract cycles or compliance motions. So there’s no sense in me deciding I’m going to be utter death about turning off the Otter integration on time: It isn’t costing money, it’s just making Legal nervous and it’s annoying me. So planning it all out is pointless, unrealistic, and fussy.
On the other hand, there’s that one app I’ve been gunning for two years running, I keep missing the window to run a sunsetting motion, and this is the year for it. That requires some detailed dates.
I’m leaving some Taskwarrior stuff on the table:
It has a calculated “urgency” score that I have disabled on all the task lists and taken out of the color scheme. It’s information overload and I don’t need it.
You can make things active and inactive. That also makes more visual noise than adds clarity, though I am experimenting with making all the tasks in the highest priority project active and giving them a different color treatment so I can keep them in easy view.
There are dependencies. Yet more detail that I don’t need to manage. If I get into something so deep that I need to do dependency mapping, the staff program manager will probably be insisting she be allowed to get involved, and all that shit is going in Jira.
So I think what I’m left with is a task list that has some nice ways of storing task metadata (tags, projects, due dates, priority, estimation) without needing to manage fussy plaintext syntax: Taskwarrior uses sqlite, so while you need to type it in correctly, you don’t have to worry about an errant semicolon blowing up your carefully manicured plaintext todo list.
You can leave a lot of features on the table if you like, and everything is amenable to customization.
Tying into notes-tui
Today I spent some time working on integrating this with notes-tui, which is now mostly compatible with Denote, meaning every file has an identifier.
- I added a feature to notes-tui to open a note by identifier
- I added a custom data type to Taskwarrior to store a note identifier
- I added a command to notes-tui to create a Taskwarrior task storing the note identifier
- I have a wrapper script that lets me type
tasknote 52
(or whatever task number) and open the associated note.
Tying into mutt
Likewise, I have a mutt macro that creates a task with the subject and sender and stores the msgid in a custom field in the task, and a wrapper script that finds the associated message for a task in mutt and opens it.