taskgraph loop picks up from its task statuses, where a
fresh plain session often stops early.
Each benchmark is a PRD for a program that copies an existing tool, so the real
tool serves as the oracle for hidden acceptance tests. Each test compares
standard output and exit status. Before any run, the harness points the tests
at the oracle itself and checks that it passes 100%.
Two arms build each PRD unattended in an empty git repository, on Sonnet:
- Plain:
claude -pwith the PRD. - Taskgraph:
taskgraph init,parse-prd, thenloop --trustwith a budget, which is whattaskgraph goruns.
Large PRDs
The PRDs are about five times the size of the SQL and Python ones below:- JS: a JavaScript interpreter, scored against
node(72 cases). - Shell: a POSIX shell, scored against
dash(45 cases). - jq: a jq 1.7 clone, scored against jq (42 cases).
A second taskgraph run on jq scored 33/42 for $3.54.
Interrupted
The run is stopped partway through, then resumed the way a person would resume it:- Plain: the same prompt goes to a new session.
- Taskgraph:
taskgraph loopruns again.
¹ The first plain session ended on its own, before the stop point, at $1.28 for
Shell and $1.41 for jq. The second session, given the same prompt, added little.
Earlier PRDs
These benchmarks are smaller, and taskgraph should never lose on them. The results below come from the build in which one loop session works through the tasks:
The git-compatible VCS benchmark was not rerun on this build.
Parallel
Toolbelt is a PRD for 13 independent coreutils clones, scored against GNU coreutils 9.4 (21 cases). It compares two arms:- Plain: told to build the parts in parallel with subagents.
- Taskgraph: runs
loop --parallel 3. Between waves the harness merges each finished branch and marks its task done, as a person would.
² Its build wrote
dist/src/cli.js instead of dist/cli.js, so every case
failed. With that one path fixed, it scored 20/21.
Without --merge, each of the 12 waves ran one task, because every tool task
also edits src/cli.ts to register itself. The file guard held the other
tasks back. With --merge, taskgraph merges each wave itself and resolves
conflicts in shared files, so tasks run side by side.
Cost recheck
A later batch reran plain Claude Code on Shell and jq, and built the same two PRDs with taskgraph at low effort from a fixed 12-task plan. Costs are from the session transcripts.
Plain cost a quarter to a third of what it did in the runs above, and
taskgraph’s jq cost was more than twice its earlier runs. Plain built each
program in 19 to 27 API calls. Taskgraph used about 165, each one reading the
whole session again, and on jq it wrote 2.6 times the output tokens.
Taskgraph at Claude Code’s default effort, run earlier the same day, cost
$7.19 on Shell and $6.37 on jq.
One task per session
The loop’s prompt then changed so each session builds one task in a few large steps, commits it, marks it done and stops, and the loop starts a fresh session for the next. That is now thedefault preset. Same plans, Claude
Code’s default effort:
No session went past 81K tokens. Both benches together cost $7.52, against
$13.56 for one session over every task and $4.61 for plain: 45% less than
before, and still about 60% more than plain. Most of what is left is each
fresh session reading its prompt and files again.
Interrupted at 8 minutes
The same Shell and jq builds, stopped 8 minutes in with SIGTERM (what Ctrl-C does), then resumed:- Plain:
claude -p --continuein the same folder, told it was interrupted and to carry on. - Taskgraph:
taskgraph loopagain, one task per session.
Both benches together, against the uninterrupted runs above:
The score held for both. The cost didn’t for plain:
--continue carries the
whole conversation, so every later call re-reads it. On jq the resumed session
reached 430K tokens and read 34M cached tokens, and it was still polishing when
it was killed at 87 minutes. Taskgraph’s sessions stayed under 72K tokens: the
next one started on the interrupted task from its status and its uncommitted
files. One run per row, on a different day from the uninterrupted runs.
Takeaways
- Uninterrupted, taskgraph ties or trails plain Claude Code on score on every benchmark. Interrupted, it scored a case or two higher on Shell and jq, which is within noise.
- With no interruption, it spent about 40% less on Shell and jq in these runs, and more on JS. The cost recheck didn’t hold that up: costs swing a lot between runs, and there taskgraph cost about three times as much as plain. With one task per session it costs about 60% more than plain.
- After an interruption, taskgraph resumed from its task statuses and came close
to its uninterrupted score. Plain sessions often end early on their own,
before the work is complete. Resumed with
--continue, plain kept its score but cost almost three times as much; taskgraph cost 14% more, which made it about 30% cheaper than plain after an interruption. - On independent parts,
loop --parallel --mergecame within a case of plain subagents, at twice the cost and four times the time.
When to use it
What you get over plain Claude Code:- A plan on disk. Tasks, dependencies and progress notes live in
.taskgraph/tasks/tasks.json, so you can read, edit and review them like code. - Clean resume. After an interruption
taskgraph looppicks up from the task statuses and comes close to its uninterrupted score. - A dependency graph you can inspect.
taskgraph nextshows the first unblocked task,graphdraws the tree andwhy 7says what blocks task 7. - Unattended parallel builds.
loop --parallel --mergeruns independent tasks side by side and merges each wave itself.

