v9 Residue — quick root-cause анализ (40 fails, 2026-05-17 late-night)
Quick-analysis из-под CC, пока Codex residue agent работает в фоне (gpt-5.5 xhigh, 500K+ tokens reasoning). Этот отчёт — minimal verdict для быстрого решения.
Сводка распределения
- Surface buckets: 20 row_count_off + 11 filter_or_value + 7 order_by_off + 2 exec_error
- Difficulty: 21 moderate + 11 challenging + 6 simple
- Concentration: formula_1 (7), card_games (6), thrombosis_prediction (6), codebase_community (4), european_football_2 (4) — 27/40 в пяти доменах
Root-cause категоризация (ручной обход репрезентативных)
| Category | Approx count | Sample qids | Typical fix |
|---|---|---|---|
| Wrong JOIN key / FK chain | 5-7 | 207 (bond_id vs atom_id), 902 (results vs driverStandings), 866 | Explicit FK declaration в schema prompt |
| Missing/extra DISTINCT | 3-5 | 358 (missing), 407 (extra), 484 | Add column-cardinality + DISTINCT-intent critique |
| Wrong SELECT shape | 2-3 | 866 (url-only vs full row), 988 (concat vs tuple) | "Return columns separately, match gold-tuple shape" hint |
| Wrong SQL strategy (correlated subquery vs JOIN-agg) | 2-3 | 349, 484 | Hard — модельная стратегия отличается structurally |
| Missing JOIN / wrong table (classifier match) | 8 | 37, 173, 408, 518, 595 | Schema-linker miss → P3.F territory |
| CAST AS REAL / division aggregation | 3 | 25, 37, 1036 | Inject "use CAST(x AS REAL) for division" в critique |
| LIKE pattern miss | 2 | 25, 990 | hard (требует value-aware retrieval) |
| Missing ORDER BY / LIMIT | 3 | 894, 1144 | Add "preserve ordering hints" в critique |
| Date arithmetic | 1 | 1254 | gpt-oss-20b уже фиксанул похожий (1232); residue — особый case |
| Exec failed / empty | 2 | 1275, 77 | edge, не стоит effort'а |
| Genuine ambiguity (gold annotation) | 2-3 | 407 (DISTINCT-vs-not), 358 | НЕ наша вина, не fixable |
Многие fails multi-label — пересечения категорий.
3 кандидата rescue стратегий ($0 budget, 2-4 часа)
1. Explicit FK pairs в schema prompt (HIGH ROI)
- Что: при schema retrieval добавить
PRAGMA foreign_key_list(table)для каждой из top-K retrieved tables. Инжектить в prompt отдельным блоком## Foreign keysперед## Tables. Формат:lapTimes.driverId → drivers.driverId. - Покрывает: 5-7 wrong-JOIN-key cases (qids 207, 902, 866, и аналоги).
- Стоимость: 2-3 часа (extend
src/nl_sql/schema_index/indexer.py+agent/graph.py:context_builder+ tests). - Ожидание: +1.5-3pp (3-6 rescues на 40 residue).
- Risk: low — additive context, не ломает existing prompts. Может сэкономить tokens если FK explicit важнее некоторых column descriptions.
2. Shape-aware critique on order_by_off bucket (MEDIUM ROI)
- Что: в
run_critique_retry.pyдля residue сcomparison_reason starts with "ordered row"добавить explicit hint: "Gold returns N columns: . Match exactly, do not concat with||, do not add aliases". Только targeted, не глобально. - Покрывает: qids 866, 988, 1144 (3 фейла).
- Стоимость: 1 час (bucket-specific prompt template).
- Ожидание: +0.5-1pp (1-2 rescues).
- Risk: low.
3. Question rephrasing на codestral (LOWER ROI)
- Что: для residue прогнать question через codestral с prompt "Rephrase this SQL question, making implicit DISTINCT / ORDER / GROUP hints explicit". Затем re-feed в pipeline.
- Покрывает: 2-4 cases с ambiguous formulation (qids 349, 484).
- Стоимость: 3-4 часа (new script + vote merge logic).
- Ожидание: +0.5-1.5pp (1-3 rescues).
- Risk: medium — rephrasing может drift'нуть semantics, потенциальные regressions если применять глобально (targeted only).
Top-1 quick win
№1 — Explicit FK pairs. ROI = +2pp / 2h = 1.0 lift/hour, vs №2 = 0.75, №3 = 0.4. Подтверждение из данных: 8 missing_join + 5 wrong_join_key = 13 fails где graph traversal mис'ит. FK list — это тот же сигнал что custom schema-linker P3.F даст, только без графа путей — простая лента pairs, дешёво в 2-3 часа.
Reality check
Memory feedback_bird_ceiling_physics фиксирует $0 ceiling ~65-70%. Мы на 80.0%. Что мы знаем:
- Residue концентрируется в 5 БД из 11 (27/40 fails). Это domain-specific, не universal model weakness.
- Wrong-JOIN-key bucket — это доказуемо фиксимый через explicit FK (gold uses
atom.atom_id = connected.atom_id, pred —bond.bond_id = connected.bond_id. Если pipeline видит FK list, выберет правильно). - Multi-source rescue saturation: voting через Sonnet + Groq уже добавил 12+ rescues. Каждый next pp требует exponentially больше попыток.
Verdict: 82.0% в досягаемости за 4 часа через FK pairs + shape critique. 83-84% — потенциально через все 3 стратегии за 6-8 часов. 85%+ — нет, нужен schema-linker (P3.F, дни) или paid SOTA model.
Что НЕ делать
- НЕ повторять wide-schema retry (saturated).
- НЕ trying mistral-large без throttling (TPD + structural unanimity).
- НЕ ждать GraceKelly bridge без Chrome confirm от юзера.
- НЕ refactor existing voting pipeline для new prompts — добавлять additive script.