diff --git a/mindgraph/graph.py b/mindgraph/graph.py
index be55272..c1dc475 100644
--- a/mindgraph/graph.py
+++ b/mindgraph/graph.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
-from typing import (Any, Callable, Generator, Iterator, List, Optional, Set,
-                    Tuple)
+from typing import Any, Callable, Iterator, List, Set, Tuple
+
 from yaml import dump, load
 
 
@@ -67,34 +67,36 @@ class Task(object):
                    depth: int = 0,
                    visited: Set["Task"] = None,
                    taskkey: Callable[["Task"], Any]=None,
-                   ) -> Generator[Tuple[int, "Task"], None, Set["Task"]]:
+                   ) -> Iterator[Tuple[int, "Task"]]:
         """Post-order traversal of Project rooted at Task"""
+        from itertools import chain
+
         if visited is None:
             visited = set()
 
-        children = self._subtasks
-        if taskkey is not None:
-            children = sorted(self._subtasks, key=taskkey)
+        if taskkey is None:
+            blockers = self.blockers
+            subtasks = self.subtasks
+        else:
+            blockers = sorted(self.blockers, key=taskkey)
+            subtasks = sorted(self.subtasks, key=taskkey)
 
-        for child in children:
-            if child not in visited:
-                visited = yield from child._postorder(depth+1,
-                                                      visited,
-                                                      taskkey)
+        for node in chain(blockers, subtasks):
+            if node in visited:
+                continue
+            yield from node._postorder(depth+1, visited, taskkey)
 
         yield (depth, self)
         visited.add(self)
 
-        return visited
-
     def todo(self) -> Iterator["Task"]:
         """Generate Tasks in todo order
 
         Tasks are scheduled by priority and to resolve blocking tasks
         """
         # sorts by priority (2 before 1), then alphabetical
-        def taskkey(Task):
-            return (-Task.priority, Task.name)
+        def taskkey(task):
+            return (-task.priority, task.name)
         return (x[1] for x in self._postorder(taskkey=taskkey))
 
     def __str__(self) -> str:

add precedence for "blockers" in todo() method
Current `todo()` method implementation, only accounts for `Task.subtasks` and `Task.priority`. Needs to also account for `Task.blockers`, such that `Task` objects in "blockers" yield prior to `Task` objects in "subtasks".
diff --git a/test/test_mindgraph.py b/test/test_mindgraph.py
index 3a375fa..368b7a3 100644
--- a/test/test_mindgraph.py
+++ b/test/test_mindgraph.py
@@ -1,10 +1,10 @@
 import os
-from random import choice
 import string
 from argparse import Namespace
+from random import choice
+from unittest.mock import mock_open, patch
 
 import pytest
-from unittest.mock import mock_open, patch
 import yaml
 
 from mindgraph import *
@@ -39,8 +39,8 @@ def task_project():
     t31 = t3.append('task 3.1')
     t32 = t3.append('task 3.2')
 
-    t32.subtasks.append(t22)
-    t12.subtasks.append(t22)
+    t32.blockedby(t22)
+    t12.blockedby(t22)
     return g
 
 

pip install -e .
parse_log_pytest
requirements.txt
pytest
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
importlib-metadata==4.8.3
iniconfig==1.1.1
-e git+https://github.com/capsulecorplab/mindgraph.git@aa05682130d34c308f699936d16299b5029d26ab#egg=mindgraph
mypy==0.971
mypy-extensions==1.0.0
packaging==21.3
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytest==7.0.1
PyYAML==6.0.1
tomli==1.2.3
typed-ast==1.5.5
typing_extensions==4.1.1
zipp==3.6.0

name: mindgraph
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - mypy==0.971
      - mypy-extensions==1.0.0
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pyyaml==6.0.1
      - tomli==1.2.3
      - typed-ast==1.5.5
      - typing-extensions==4.1.1
      - zipp==3.6.0
prefix: /opt/conda/envs/mindgraph

test/test_mindgraph.py::test_todo_blocking_tasks_win
test/test_mindgraph.py::test_repr test/test_mindgraph.py::test_deep_repr test/test_mindgraph.py::test_to_yaml test/test_mindgraph.py::test_main
test/test_mindgraph.py::test_todo_high_priorities_win test/test_mindgraph.py::test_postorder_default_priorities_ignored test/test_mindgraph.py::test_task_init_typeerror test/test_mindgraph.py::test_task_append_task test/test_mindgraph.py::test_task_append test/test_mindgraph.py::test_task_pop test/test_mindgraph.py::test_task_pop_fail1 test/test_mindgraph.py::test_task_append_TypeError test/test_mindgraph.py::test_blockedby test/test_mindgraph.py::test_blockedby_TypeError test/test_mindgraph.py::test_blocking test/test_mindgraph.py::test_blocking_TypeError test/test_mindgraph.py::test_priority_getter_setter test/test_mindgraph.py::test_name_getter_setter test/test_mindgraph.py::test_to_yaml_TypeError test/test_mindgraph.py::test_parser
mindgraph/graph.py
mindgraph/graph.py