A checkbox list cannot express "this cannot start until that is done". Most Obsidian setups solve it with a wiki link and a habit — which works right up until the blocking task is finished and nothing tells you the other one is now free.
Obsidian task dependencies need to live on both notes to be trustworthy, so InventTasks writes both sides and keeps them symmetric.
Three kinds of link#
| Relationship | Meaning | Direction |
|---|---|---|
| Blocks | This task stops another from proceeding | Stored on this task, mirrored as waiting on the other |
| Waiting on | This task cannot proceed until another finishes | Derived — you never write it directly |
| Related | Connected, but neither blocks the other | Symmetric on both notes |
Waiting on is deliberately read-only. It is the other side of a blocks link, so writing both by hand would let the two disagree; the API refuses attempts to set it for the same reason. Write the blocking side, get the waiting side free and correct.
Relationship writes update both notes in a single atomic operation. There is no window where one file claims a link the other has never heard of.
Subtasks are real tasks#
A subtask is its own Markdown file with parent_task in frontmatter — not a
line item inside a parent note. It has its own status, dates, fields, comments
and attachments, and appears in searches and views like anything else.
- One level by default, or two when nested subtasks are enabled — so a root task, a child and a grandchild
- A task can have more than one parent. Tree views draw it once under the first visible parent rather than duplicating it
- Cycles, self-links, duplicates and unsupported depth are rejected rather than quietly stored
Nesting shows in List, Table and Gantt. The toolbar's Subitems control switches between hiding them, nesting them under parents, or promoting them to top-level rows.
Warnings, not handcuffs#
Close a task with open subtasks, unfinished checklist items or unresolved waiting on links and InventTasks can prompt you first. It is a question, not a refusal — sometimes the blocker genuinely stopped mattering, and a tool that argues with you about that gets uninstalled.
The same applies to dates: dependencies are drawn on the Gantt chart, but moving a blocking task does not automatically shift everything downstream. There is no automatic rescheduling and no critical-path calculation.
Progress that follows the tree#
A Progress (automatic) custom field derives its percentage from completed subtasks or checklist entries. Finish two of four subtasks and the parent reads 50% without anyone maintaining it.
What it looks like on disk#
---
id: TSK-00088
title: Migrate the database
status: todo
parent_task: TSK-00080
relationships:
blocks: [TSK-00089, TSK-00091]
related: [TSK-00042]
---
waiting_on is absent because it is derived. Open TSK-00089 and you will find
this task listed there instead — written at the same instant, by the same
operation.