empty-eq-filter-matches-nothing-silently
/workspace/SOLUTION.mdI built a faithful minimal reproduction of the DuckBrain/PostgREST-style failure at /workspace/repro/, reproduced the bug, applied the fix, and ran both the new feature tests and the adjacent contract test.
graph_edges(ns, '') builds its filter via a helper that only distinguishes None from "not None":
if project_id is not None: # '' slips through
return f"project_id=eq.{project_id}"
An empty scope is interpolated as project_id=eq. — the store evaluates it as equality with the empty string, gets zero rows, no error, so the render index is silently always empty. Project-scoped call sites with a real id work, which is why the sibling test passes and only the empty-argument call site fails.
Make empty/whitespace mean scope-wide and drop the filter in the helper (fixes every call site at once):
def _scope_filter(project_id: str | None) -> str | None:
- if project_id is not None:
+ # Empty/whitespace scope == whole namespace. Never emit `project_id=eq.`.
+ if project_id is not None and str(project_id).strip():
return f"project_id=eq.{project_id}"
return None
| State | Result |
|---|---|
| Before fix | 3 failures: marker literal missing, invalidated_count=0, contract 0 != 3; sibling P-1 test passes |
| After fix | 7/7 pass, export prints INVALIDATED by D-002 (E-000001) and invalidated_count=2 |
I also encoded the companion lesson as an executable false-fix (false_fix/graph.py): it drops the empty filter correctly but renames the output line and silently drops pending rows from the denominator. Running the same tests against it yields 4 failures — the literal assertIn and the existing stored rows stay counted (pending included) contract test both catch it, confirming that a diff must pass the worker's new tests and the adjacent contract tests, with assertion literals read against the code.
/workspace/SOLUTION.md — full markdown write-up (root cause, diagnosis greps, exact fix, defense-in-depth, verification transcript, acceptance checklist)/workspace/repro/ — duckbrain.py, graph.py, test_export.py, run.sh, false_fix/graph.pyReproduce with:
cd /workspace/repro && python3 -m unittest -v test_export # 7 passed
# Evidence - Problem class: empty-eq-filter-matches-nothing-silently - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-10-12T20:26:46.201Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "A render feature (namespace-scoped export) asked a helper for all edges with an empty project id: the helper interpolated the filter as project_id=eq.<empty>, which the store answers with ZERO rows and no error. The feature was fully wired (markers, helpers, tests written against expected output) but every render was silently blind: the index was always empty. Debug path: new tests asserting output text failed while sibling tests (same helpers, real project id) passed \u2014 the delta between the passing and failing call sites is the bug; grep every call site of the query helper for the empty-argument one. Fix: make the helper treat an empty scope as scope-wide (drop the filter) instead of emitting an eq.<empty> filter, and keep the tests that pin the rendered text. Companion lesson in the same session: a worker's implementation satisfied its NEW tests' spirit but not their asserted literals (tests asserted 'invalidated_count=N' and a named line the code never printed) and silently changed a denominator that an EXISTING contract test pinned ('stored rows stay counted' \u2014 pending rows included). Always run a worker's new tests AND the adjacent contract tests before accepting a diff; read assertion literals against the code, not the commit message.", "environment": "python 3.11, live DuckBrain-backed test suite, fleet-loaded host (load 8-48), foreman tick verification of a dead worker's uncommitted diff", "language": "python", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "empty-eq-filter-matches-nothing-silently", "provider": "openrouter", "solved_at": "2026-10-12T20:26:46.229Z", "version": ""}