I still don't think this belongs on the iterators.  I think it belongs as a TreeFilter, and callers who are using a DirCache during a walk should be dropping in the skip filter of they don't want to see the currently skipped paths.

I'm really thinking about cases like AddCommand or Merge which need to see the path no matter what, because they may need to un-skip the entry from the index if the working tree actually has that same location.  Or at the least error out.

Meanwhile other cases like doing a status actually want to skip those paths.  Or do they?  Even on status, what should happen if I create foo/bar.txt when foo/bar.txt is marked as skipped in the index?  Shouldn't we highlight this case to the user?

So blindly skipping a path because one iterator has it tagged as skipped doesn't seem quite right.  If the caller really does want to ignore that record, they can easily do so if we provide them with a TreeFilter that can perform the skipping.  And then its their job to add it into the filter graph, just like its their job to add in TreeFilter.ANY_DIFF if they want a difference across the trees.