In addition to the artifacts already consumed by build targets, I'm reasonably confident that the dependency tree can be implemented with a "Depends On" typeahead for build steps, and an implicit artifact created from previous build targets. This would allow the construction of advanced dependency trees between build steps, like so:
a /|\ / | \ / | \ / | \ b c d \ | \ | \ | \| e____ /|\ \ / | \ \ / | \ \ / | \ \ f g h i \ | \ | \ | \ | \ | \| \| j k
The build is considered successful only if all targets are currently in a successful state (or more accurately, we can re-run the steps in "failure steps", "success steps" when there are no more targets running to re-evaluate the build state).