code: func filterPartialOutputs(v interface{}, targetedNodes *dag.Set, g *Graph) bool {
  	// should this just be done with TargetDownstream?
  	if _, ok := v.(*NodeApplyableOutput); !ok {
  		return true
  	}
  
  	dependers := g.UpEdges(v)
  	for _, d := range dependers.List() {
  		if _, ok := d.(*NodeCountBoundary); ok {
  			continue
  		}
  
  		if !targetedNodes.Include(d) {
  			// this one is going to be removed, so it doesn't count
  			continue
  		}
  
  		// as soon as we see a real dependency, we mark this as
  		// non-removable
  		return true
  	}
  
  	depends := g.DownEdges(v)
  
  	for _, d := range depends.List() {
  		if !targetedNodes.Include(d) {
  			log.Printf("[WARN] %s missing targeted dependency %s, removing from the graph",
  				dag.VertexName(v), dag.VertexName(d))
  			return false
  		}
  	}
  	return true
  }
docs: // Outputs may have been included transitively, but if any of their
  // dependencies have been pruned they won't be resolvable.
  // If nothing depends on the output, and the output is missing any
  // dependencies, remove it from the graph.
  // This essentially maintains the previous behavior where interpolation in
  // outputs would fail silently, but can now surface errors where the output
  // is required.