Data Correctness Framework + Testing
## Data Correctness Framework + Tests
End-to-end validation that the query engine returns correct results for every query shape. This covers a purpose-built test harness that seeds a known dataset into ClickHouse, runs queries through the full compilation and execution pipeline, and asserts on row-level correctness including sort order, redaction, pagination, and aggregation.
### Framework and harness
| Status | Label | MR | Description |
|--------|-------|----|-------------|
| [x] | Harness | !522 | feat(testing): add data correctness harness + data integration tests |
| [x] | Assertions | !527 | feat(testing): enforce assertion usage via query introspection in data correctness harness |
| [x] | Hardening | !535 | chore(testing): harden assertion enforcement |
| [x] | Cleanup | !537 | chore(cleanup): continue hardening data correctness harness + remove cruft |
### Seed data
| Status | Label | MR | Description |
|--------|-------|----|-------------|
| [x] | Seed data | !539 | chore(testing): extend seed data with subgroups, notes, unicode user, and new edges |
### Test suites
| Status | Label | MR | Description |
|--------|-------|----|-------------|
| [x] | Search | !540 | chore(testing): add search tests for contains, is_null, ordering, redaction, and unicode |
| [x] | Pagination | !541 | chore(testing): add pagination, limit, empty result, and combined feature tests |
| [x] | Aggregation | !542 | chore(testing): add aggregation sort, sum, and redaction tests |
| [x] | Path finding | !543 | chore(testing): add path finding max_depth and redaction tests |
| [x] | Traversal | !544 | chore(testing): add traversal order_by, variable-length, incoming, and filter tests |
| [x] | Neighbors | !545 | chore(testing): add neighbors mixed entity types and redaction tests |
| [x] | Edge cases | !546 | chore(testing): add edge case tests for giant strings, sql injection, and empty results |
### Correctness fixes found through testing
| Status | Label | MR | Description |
|--------|-------|----|-------------|
| [x] | Fix | !526 | fix(querying): graph formatter removes node sort order with hashmap - use indexmap instead |
| [x] | Fix | !574 | fix(data): enforce assert_node_count on all search/traversal/neighbors tests |
| [x] | Fix | !576 | fix(tests): assert edge set instead of discarding in traversal_with_order_by + harden MustInspect |
### Additional coverage
| Status | Label | MR | Description |
|--------|-------|----|-------------|
| [x] | Search | !577 | Unicode properties, wildcard/boolean/datetime/nullable columns, node ID filtering, order_by, empty auth returning zero nodes, exact redaction, contains and is_null filter operators |
| [x] | Traversal | !577 | Variable-length hops with min/max bounds, redaction at depth, incoming and bidirectional directions, shared-node deduplication, filter narrowing, fan-in from multiple source types |
| [x] | Aggregation | !577 | Sum, avg, min, max, min on strings, multiple functions in one query, redacted users excluded from counts |
| [x] | Path finding | !577 | all_shortest and any path types, rel_types filtering, redaction blocking intermediate nodes, max_depth enforcement |
| [x] | Neighbors | !577 | Mixed entity types on a single center node, dynamic_columns wildcard, rel_types filtering, redaction, edge direction preserved for both-direction queries |
| [x] | Edge cases | !577 | Giant strings (10k chars), SQL injection payloads stored as data, empty results with valid schema |
issue