# Diagnosis

## Symptom

`index.query(...)` returns 200 with an empty `matches` list, on data you believe is indexed.

## Likely cause

Almost always one of: wrong namespace, an over-strict metadata filter, querying an empty or different index, or a garbage query vector (e.g. all zeros).

## Confirm it

1. `describe_index_stats()` ,  is `total_vector_count` nonzero, and does the namespace you queried have vectors?
2. Re-run the query with no `filter` and no namespace. If matches appear, the filter or namespace was wrong.
3. Fetch one known id with `fetch` ,  if fetch finds it but query does not, the query vector or filter is the problem.
4. Print the query vector: all zeros or NaNs mean the embedding step failed silently.

## Fix

1. Namespace mismatch: pass the ingest namespace on the query.
2. Filter too strict: loosen or drop clauses until matches return, then re-tighten.
3. Empty index: the ingest never ran or targeted another index; re-ingest.
4. Bad query vector: fix the embedding call (model load, API key, truncation).

## Verify the fix

Re-run the original query and assert `len(matches) > 0`. Then re-add the filter one clause at a time to find the clause that killed results.