I have some more information that may be useful. I have identified a very similar issue with the same data sources that I can reproduce consistently.
Projects (all active) is filtered Id exists in Projects (runtime filter, temp, search) or Id exists in Projects (runtime filter, temp, many).
Projects (all active) also has a client filter: If App variables.search has value: Projects (all active).Id exists in Projects (runtime filter, temp, many).
Initially Projects (runtime filter, temp, many) has objects while Projects (runtime filter, temp, search) is empty. Projects (all active) contains the objects in Projects (runtime filter, temp, many), as it should
We populate Projects (runtime filter, temp, search). Projects (all active) now only shows the objects in (runtime filter, temp, search), as it should.
We then remove the objects in Projects (runtime filter, temp, search). Projects (all active) now contains 20 objects, even when Projects (runtime filter, temp, many) contains more than 20 objects. This can be reproduced consistently.
In the app and in devtools Projects (all active) shows 20 objects. I loged the Projects (all active).length to the console in a function. In the console the length of Projects (all active) is printed as 399.
Where does the number 20 come from? There is no good reason why Projects (all active) should contain exactly 20 objects. The best reason I can think of is that when Projects (runtime filter, temp, many) is populated we read to the datasource 4 times. One of the reads has a limit of 20. We can also see that when this limit is increased, Projects (all active) contains more objects consistent with the limit.