The blocking-declaration part is the real unlock — parallelism falls out of the dependency graph for free once the planner has to say what blocks what.
The thing that bit me running this pattern daily: the main session waiting on the merge is itself a single point of failure. If it dies mid-flight the worktrees are fine but nobody remembers they were owed. I ended up writing every dispatch to a queue table before spawning, with a sweeper that wakes the owner on completion — so recovery is reading a ledger instead of reconstructing intent from memory.
Fan-out is the easy half. Fan-in is where the state goes missing.