The first algorithm to get right is
GUMP-104, where we bail out of building at all if a dependency dies. The next step to tackle is to build against the last version of the dependency that /was/ built successfully.
This requires gump to become time-aware beyond a single build run, saving off previous successes into a repository and knowing about them. It requires a significant extension of the model where, for example
if p.state <= FAILED:
successful_p = historyutil.lookup_last_successful_build(p)
p.failed_project = p
p.state == RECOVERED
stages are inserted to keep most of the plugins blissfully unaware of the intelligence going on. If we get this right that'll be where the staged plugin model will really start to shine, as the graph theory people can design smart new algorithms (As long as they're compatible with the basic topsort we're doing in some way), and the build tool people can just, well, build stuff.