v0.3.7 — Telemetry integrity fixes
What's fixed
Three data quality bugs in the telemetry collection pipeline:
1. G1 block name mismatch (bm25-memory.py)
Injection items used "block": "g1" but last-retrieval-meta.json stored metadata under "g1_decisions". Result: all G1 records had query_type=UNKNOWN, retrieval_method=UNKNOWN, candidates_returned=None.
2. CM retrieval_method lost (utility-rate.py)
chat-memory.py writes retrieval_method to a separate file (last-cm-injection.json). The merge code discarded this before the metadata was saved → CM records had retrieval_method=UNKNOWN despite using HYBRID.
3. "UNKNOWN" truthy bypass (utility-rate.py)
block_meta.get("query_type") or _classify_query(prompt) — "UNKNOWN" is a truthy string so the fallback never fired. Fixed with explicit != "UNKNOWN" guard.
Also adds BM25 default for g2_prefetch/g2_grep blocks (codebase-memory-mcp is BM25-only, no meta block written).
Impact
After backfilling 37 historical records:
retrieval_methodUNKNOWN: 60% → 0%query_typeUNKNOWN: 62% → 0%- Causal r (BM25 score → utility_rate): +0.639 → +0.667
- SEMANTIC vs KEYWORD utility gap: 24.8pp (47.8% vs 23.0%)