fix(compiler): preserve empty membership filters
What does this MR do and why?
Empty membership filters must return no matches. This allows empty lists in GQL and keeps filters that edge tags cannot express on the node scan.
Stack
Part 1: filter correctness, targeting main. Next: !2742 (closed) for shared compiler support, then !2743 (closed) for GQL integration.
Relates to #1311 and #1258.
Testing
Five ClickHouse scenarios passed for empty membership, aggregation, and all three neighbors directions. The complete stack passed 225 local tests and workspace code lint.
Agent context: scope and history
The final diff is 79 additions and 39 deletions across ten files. This MR contains no Boolean expression model or NOT syntax. JSON schema rules remain unchanged. The published history is preserved through follow-up commits. Review the final diff; earlier commits contain the feature before it was split. The standalone 475-line test file and pinned-version hook change are removed from the stack.