---
name: investpilot-universe-junk-fix
description: КодИнвест — фикс замусоренной вселенной скана (экзотика CETS + фьючи в move-alert)
metadata: 
  node_type: memory
  type: project
  originSessionId: 6f344612-b945-4107-b457-8ad2163cd988
---

**КодИнвест ([[investpilot-overview]]) — регресс full-режима вселенной, фикс 2026-07-13.**

Симптом (живой скан пн 10:15): скан молотил ~165 тикеров с десятками ERROR-трейсбэков «мало истории (0 свечей)» на экзотике CETS (USDTRY/USDZAR/UZSRUB/ZARRUB) и плейсхолдере `XXXXXX`.

Три корня, все в `marketdata/universe_builder.py` + `signals/scheduler.py`:
1. CETS-ветка full звала `_passes_turnover(min_rub=0)` → при `min_rub<=0` всегда True → любая торгуемая валютная пара без порога. Фикс: `cets_min_turnover_rub=50M` + требование `"RUB" in ticker`. Фикс-тройка CNY/GLD/SLV добавляется отдельно.
2. `XXXXXX` («Рентал ПРО») — плейсхолдер-secid ISS без свечей → `_JUNK_SECIDS` в `_add`.
3. move-alert `_monitor` перебирал `sorted(app.universe)`, а тот содержит FORTS-реестр (370 фьючей под шорт-исполнение, свечей нет) → фьючи падали в анализ. Фикс: `app.scan_tickers()` (только SCAN_SEGMENTS).

Плюс «мало истории» (ValueError) понижен с `logger.exception` до WARNING в `_scan`+move-alert — дыра данных, не баг, не пачкает ERROR-чек ops_dashboard.

**Грабля:** после смены логики вселенной живой бот держит СТАРУЮ вселенную в кеше БД (refresh раз в 24ч) — надо форсить `build_universe`+`universe_save` и рестартить ПОСЛЕ записи, иначе в память грузится старый мусор. Итог: скан 352 (было 165 мусора в проходе), мусора ноль, 154 pytest.

---

**Довесок 2026-07-13 — предфильтр молодых + надёжность LLM + RR 2.2:**
- **Предфильтр ≥60 свечей:** молодые бумаги (свежие корп-облиги, <60 дн истории для build_features) кешируются в kv `scan_thin_history` (+30 дн recheck), на сканах пропускаются без фетча, дозреют — вернутся сами. Убрало 41 «мало истории» из лога.
- **«Редко пушит» — НЕ винрейт (важно!).** Консенсус в КодИнвесте ДАВНО снят: `llm_panel_mode="single"` (одна модель + челленджер + фолбэки), как в Делор-спорте. Корень тишины — **primary gc/grok-composer флапает («пустой ответ» через grok-cli/OmniRoute)**. Зонд цепочки: codex/gpt-5.5 стабилен (1.5–4с), grok-build жив (5–9с), nim/dashscope таймаут 40с, grok-composer пустой.
- **Фикс:** primary сигналов → `codex/gpt-5.5-low` (сильный, стабильный, non-Claude); grok-build 2-й фолбэк; дистилляция → gc/grok-build (bulk, экономит codex-квоту). Проверено: codex отдаёт валидный analyst-JSON.
- **RR 2.5→2.2** (calibrate_swing): +16% сигналов, PF 1.40→1.33 (>гейт 1.3), винрейт 44.5% без изменений — RR торгует частоту на PF, НЕ на винрейт (винрейт структурен ~44%, как у [[cryptopilot-winrate-ceiling]]).
- **Следующий связывающий гейт — conf≥70** (codex дал 68 на сильном бычьем кейсе). Не трогал без замера.
