Sprint Truth — большой день 3 мая 2026
Контекст: Bear-таймлайн ставил Sprint Truth Tier 1 на 2-3 weekends (Weekend 1 = 10-11 мая). Камал начал на неделю раньше, в одно воскресенье (3 мая), и закрыл всю Tier 1 + Tier 2 (Citations Phase 2 + Verbatim mode + #74 foundation) + KZ corp filter — 16 эпиков за день.
Закрытые эпики (16)
Утренняя смена — Tier 1 (11 эпиков)
| # | Эпик | Эффект |
|---|---|---|
| #71 | Eval cleanup | exam_qa_v1.jsonl: n=82→79, 9 verified через SQL lookup, 3 dropped (нет источника). Backup сохранён. |
| #67 | Sprint Direct | Anthropic direct API. Models: Haiku 4.5 (3.5 deprecated), Sonnet 4.5 (4 deprecated), Opus 4.7 (exact match). Retry на 429 (5s/10s/20s exponential backoff). Prompt caching работает (cached: 16472 в логах). |
| #68 | Refuse mode MVP | should_refuse() в bot.py: top<0.4 AND coverage<2 AND no SQL/web/docs → fallback. Threshold 0.4 для итерации по логам после прода. |
| #4 | PROD-BUG fix blacklist | 3 false phantoms removed: Приказ 1019 (Правила обучения по БиОТ), ҚР ДСМ-16 (Санитарные правила общепита), Приказ №344 (PTW Form 344). Главный contributor +13pp на NPA-450. |
| #5/#10 | URL __ regex cleanup |
fix_url_wrapping применён в _split_for_telegram + 3 streaming progressive edits + reflection corrected. |
| #6 | KZ corp v2 cleanup | Промпт-правило для корп-кодов TRU-LP-HS / TCO-XX / KPO-XXX. v1 cleanup на сервере 28 апреля удалил 638 чанков. |
| #7 | Reflection threshold 0.75→0.95 | Hot-fix: Reflection стирал реальные ст.181/182 ТК РК и ҚР ДСМ-131/2020 как фантомы. Теперь edit'ит только при conf 0.95+. |
| #8 | JSON parse json5 fallback | Сначала json strict=False raw_decode, при failure → json5.loads. Покрывает «Expecting , delimiter» errors. |
| #9 | Reflection через direct | reflection.py использует _call_openrouter (не свой httpx) → автоматически routing на Anthropic direct. |
| #69 | Citations API Phase 1 | Anthropic Citations API server-side enforcement. build_citation_documents helper в anthropic_client.py + bot.py wire-up. USE_CITATIONS_API=true. |
| #11 | Numerical verification MVP | regex extract HSE-чисел → log unverified в metrics_*.jsonl event numerical_unverified. Не блокирует, собирает данные. |
Вечерняя смена — Tier 2 + KZ filter (5 эпиков)
| # | Эпик | Эффект |
|---|---|---|
| #12 | Structured metrics logging | новый metrics_logger.py → log_metric(event, **fields) пишет в /app/logs/metrics_YYYY-MM-DD.jsonl. События: refuse, reflection_found/applied/skipped, citations_used/received, numerical_unverified, rate_limit_retry, json5_recovered, verbatim_injected. |
| #13 | Citations API Phase 2 | парсинг CitationBlock из stream content_block_delta. accumulated_citations в usage_out["citations"]. Foundation для Verbatim mode. |
| #72 | Verbatim quote mode (full) | inject_verbatim_quotes() — впечатывает дословно cited_text из Citations метаданных рядом со связанными предложениями ответа. Stemming для русских словоформ. Флаг USE_VERBATIM_QUOTES=true в проде. |
| #74 | Retrieval honesty FOUNDATION | decompose_query() в llm.py — Haiku разбивает multi-claim запрос на атомарные subqueries. Foundation, не интеграция — bot.py wire-up ждёт следующий weekend. |
| — | KZ corp filter в Verbatim | regex _KZ_CORP_RE ловит ТШО/Тенгиз/Кашаган/КТК/НКОК/КМГ/Самрук/ENRC/Казахмыс/Казцинк/ArcelorMittal + внутренние коды TRU-LP-HS/TCO-XX/KPO-N. Применяется в 2 местах: _build_citation_documents_from_results (chunks ДО Anthropic) + inject_verbatim_quotes (defense in depth). 20/20 тестов прошли локально. |
Боевая проверка (3 мая 13:30, прод)
4 живых запроса в Telegram, специально подобранных чтобы провоцировать корп-утечку:
| # | Запрос | Citations | Verbatim | Корп-имена |
|---|---|---|---|---|
| 1 | Кто такая Люми | — | — | ✅ Нет |
| 2 | Наряд-допуск на нефтегазе | 10 | 10 | ✅ Нет |
| 3 | Стандарты у крупных операторов РК | 4 | 2 | ✅ Нет (+ Reflection warning «часть ссылок не подтверждена») |
| 4 | План эвакуации в нефтянке | 13 | 4 | ✅ Нет |
Итого: 27 citations, 16 verbatim quotes injected, 0 утечек ТШО/TCO/Кашагана.
KZ corp filter за 3 запроса не сработал — значит Apr 28 cleanup действительно убрал проблему на уровне базы, filter теперь страховка.
Eval baseline NPA-450
Через OR Sonnet 4 (apples-to-apples с May 2 baseline через docker exec -e USE_ANTHROPIC_DIRECT=false):
| Метрика | 2 мая baseline | 3 мая после fix'ов | Δ |
|---|---|---|---|
| Accuracy | 83.7% (350/418) | 96.7% (438/453) | +13.0 pp 🚀 |
| NPA grounding (eval-script) | 35.9% | 44.6% | +8.7 pp |
| NPA grounding (loose key match) | 45.0% | 62.7% | +17.7 pp |
| Parse failures | 54 | 0 | retry на 429 спас 100% запросов |
Cost: ~$15-20 через OR (с prompt caching ~70%).
Главные wins по категориям (NPA-450)
5 категорий с прыжком +35-50 pp — все жертвы противоречивого blacklist:
| Категория | 2 мая | 3 мая | Δ |
|---|---|---|---|
| gz_rk (газовое) | 50.0% | 100% | +50.0 |
| ek_rk (Экологический кодекс) | 50.0% | 95.5% | +45.5 |
| koap_rk (КоАП РК) | 57.1% | 100% | +42.9 |
| tr_siz_ts (ТР ТС СИЗ) | 47.1% | 94.1% | +47.0 |
| voda_rk (Водный кодекс) | 60.7% | 96.4% | +35.7 |
Технические инсайты
Sprint Truth тезис подтверждён на цифрах: - «Promt rule weaker than mechanical filter» — мы применили mechanical fixes (cleanup blacklist, threshold tuning, json5 fallback, retry, KZ corp regex) и получили +13pp acc + 0 corp leaks. - Architecture > Coverage — добавили 0 новых документов, fix'или обёртку — и получили скачок. - Promt противоречия → random behavior — blacklist с false positives заставлял бота random-вести себя на КоАП/Водный/Экологический. Удаление противоречий = stable behavior.
Latency: - Sprint Direct не дал -300-500мс как ожидалось. Anthropic direct ≈ OR в реальной нагрузке. Главный win — prompt caching сохраняется + Citations API возможен. - Reflection через direct работает нормально (через _call_openrouter routing).
Side-effect requirements.txt rebuild: - json5 добавление вызвало pip resolve без upper bounds → transformers 4 → 5.7, torch 2.11, chromadb 1.5.8, pydantic 2.12, numpy 2.4. Без regression на bge-m3 / ChromaDB. Удача — могли поломаться. - TODO: добавить upper bounds в requirements.txt чтобы избежать неожиданных bumps.
Прогноз стоимости
При текущей нагрузке (16-20 запросов/день, 48 active users): - Hetzner AX41-NVMe: $38 - Anthropic direct (Sonnet+Haiku+Opus, cache hit 56.7%): $30-35 - Voyage rerank-2.5: $4 - Sonar/Citations/B2: $5-6 - ИТОГО: ~$80-85/мес
Бюджетный потолок Камала: $200/мес = 100K₸ (включая будущий модуль расследований + Lyumi News редакцию).
Архитектура на конец 3 мая
Production AX41 (/opt/lyumi), все feature flags ON:
- USE_ANTHROPIC_DIRECT=true
- USE_CITATIONS_API=true
- USE_VERBATIM_QUOTES=true
- KZ corp filter в 2 layer'ах
- Reflection threshold 0.95
- json5 fallback
- Retry on 429
- Numerical verification logging
- Structured metrics in JSONL
Связанные wiki
lyumi/observation-week-2026-05-04-10— план observation week + post-week backloglyumi/verbatim_quote_mode_design— design doc для Verbatimlyumi/sprints/2026-05-02-sprint-truth-roadmap— изначальный планlyumi/sprints/2026-05-02-biot-eval— BiOT n=82 baselinelyumi/sprints/2026-05-01-sql-acgih-ax41— SQL lookup foundationlyumi/v4_structured_retrieval— текущая SQL архитектураlyumi/trust_first_principle— философия Trust First
Что Камал говорит
«6 эпиков + 5 фиксов за день — это outstanding темп» «Все хочу))))» (когда я предлагал A → B → closing) «По ссылке не принципиально, главное чтобы где прямо ссылается точно писала и ок» (про URL
__cleanup) «Ну да, это то что я осилю)» (про $200/мес budget cap) «В общем мы подпрыгнули))))» (итог дня)
Это был день когда planned roadmap на месяц схлопнулся в один воскресный день. Теперь — observation week 4-9 мая, метрики, потом Tier 3 (#74 integration, photo Citations, #73 per-claim).