Round-004 expression/predicate probe (~85 hand-oracled queries × both engines @ d044e3e). Headline: TVL/null core is FULLY conformant (full AND/OR/XOR truth table, IN-list nulls, string predicates, ORDER BY null placement); debt concentrates in numerics — findings 1-3 share one root: column arithmetic lowers to raw pandas/polars ops without the Cypher numeric-tower wrap the const-folder applies to literals.
SILENT-WRONG (both engines):
- Modulo is Python-floored, openCypher is truncated:
-7 % 3 → 2 (oc -1); column path identical; breadcrumb comment at lazy/engine/polars/row_pipeline.py:90 confirms the known gap.
- Column int division is true-division:
n.rank / 2 (int64) → floats; literal 5 / 2 → 2 correctly (const-folder toInteger wrap) — only the column lane skips it.
- Column int div-by-zero → inf silently; openCypher mandates error.
- Simple CASE
WHEN null matches null subjects (deliberate per row/pipeline.py:1353 comment, but contradicts openCypher/Neo4j: simple CASE uses '=', null never matches).
- bool-vs-int comparison coerces (
WHERE n.flag > 0 matches) instead of null semantics; the numeric-vs-string guard exists but bool-vs-int slips past.
Typed gaps / form defects: missing property in WHERE is GFQLSchemaError (makes IS NULL unusable for schema-optional props; RETURN n.absent correctly nulls); ORDER BY restricted to projected columns; col-vs-col STARTS WITH raises RAW ValueError (untyped); 1 + null pandas typed-errors while polars correctly nulls (parity broken in the conforming direction); toInteger('x1') errors vs null; select-lane errors all mislabeled invalid-node-reference. Entity fns labels()/properties() return display strings not structured values.
Swept clean: extensive TVL/string/CASE/ORDER-BY/SKIP-LIMIT inventory in probe report (scratchpad probe-expr/). Fix order: 1-3 (one numeric-tower root) → 5 → 4 (needs decision: keep documented deviation or conform) → error-typing polish.
Round-004 expression/predicate probe (~85 hand-oracled queries × both engines @ d044e3e). Headline: TVL/null core is FULLY conformant (full AND/OR/XOR truth table, IN-list nulls, string predicates, ORDER BY null placement); debt concentrates in numerics — findings 1-3 share one root: column arithmetic lowers to raw pandas/polars ops without the Cypher numeric-tower wrap the const-folder applies to literals.
SILENT-WRONG (both engines):
-7 % 3→ 2 (oc -1); column path identical; breadcrumb comment at lazy/engine/polars/row_pipeline.py:90 confirms the known gap.n.rank / 2(int64) → floats; literal5 / 2→ 2 correctly (const-folder toInteger wrap) — only the column lane skips it.WHEN nullmatches null subjects (deliberate per row/pipeline.py:1353 comment, but contradicts openCypher/Neo4j: simple CASE uses '=', null never matches).WHERE n.flag > 0matches) instead of null semantics; the numeric-vs-string guard exists but bool-vs-int slips past.Typed gaps / form defects: missing property in WHERE is GFQLSchemaError (makes IS NULL unusable for schema-optional props; RETURN n.absent correctly nulls); ORDER BY restricted to projected columns; col-vs-col STARTS WITH raises RAW ValueError (untyped);
1 + nullpandas typed-errors while polars correctly nulls (parity broken in the conforming direction); toInteger('x1') errors vs null; select-lane errors all mislabeled invalid-node-reference. Entity fns labels()/properties() return display strings not structured values.Swept clean: extensive TVL/string/CASE/ORDER-BY/SKIP-LIMIT inventory in probe report (scratchpad probe-expr/). Fix order: 1-3 (one numeric-tower root) → 5 → 4 (needs decision: keep documented deviation or conform) → error-typing polish.