your error makes sense, and this is why EXISTS statements are such a powerful filter. What you have crafted above is called a collections filter. It's looking at your collection of predecessors in each task. The way it works is, if the task has more than one predecessor, Workfront will look at each predecessor separately when applying the filter.
When you only have 1 predecessor, and this contains "Name of predecessor" then Workfront will exclude it.
When you have 2 predecessor, and one of them is "Not The Name You're Trying To Exclude", then Workfront will include the task because one of the predecessors fulfills your filter requirement and the other one does not, so the task can be included.
When you use EXISTS statements, you're in effect stating that in order to be included, NONE of the predecessors should have this. (I guess that makes it a NOTEXISTS statement, haha) Hopefully that clarifies the difference between the two types of filters for you?
The exists statement might look something like the below. I didn't test it -- so you should -- but I think it contains most of the components asked for. I copied the name filter from your code above.
You should probably check my spelling!
EXISTS:a:$$EXISTSMOD=NOTEXISTS
EXISTS:a:$$OBJCODE=PRED
EXISTS:a:successorID=FIELD:ID
EXISTS:a:predecessor:name=Name of predecessor
EXISTS:a:predecessor:name_Mod=cicontains
Quick plug for the next EXISTS webinar below:
https://events.teams.microsoft.com/event/2699d8d3-233a-4f57-92f1-0e8bfaa01f1f@fa7b1b5a-7b34-4387-94ae-d2c178decee1https://events.teams.microsoft.com/event/2699d8d3-233a-4f57-92f1-0e8bfaa01f1f@fa7b1b5a-7b34-4387-94ae-d2c178decee1