---
name: investpilot-overview
description: "КодИнвест (@InvestCodoCeh_bot) — owner-only советник по Мосбирже на mini; самостоятельный код, PF 1.40, e2e-скилл investpilot-e2e"
metadata: 
  node_type: memory
  type: project
  originSessionId: 6f344612-b945-4107-b457-8ad2163cd988
---

**КодИнвест (investpilot)** — Telegram-советник по РФ-бирже, owner-only (tg 1005954706); + sandbox-автоторговля Т-Банка (см. [[investpilot_tinvest_sdk]]; слита в дев-дерево 2026-07-07 после инцидента rsync --delete×параллельная сессия — деплой ТОЛЬКО из ~/Разработки/investpilot). Дев `~/Разработки/investpilot`, прод mini `~/Services/investpilot`, launchd `com.cebers.investpilot`, тайл ops_dashboard `investpilot`. Запущен 2026-07-06.

- **Самостоятельный код** — пользователь явно отверг форк/bridge [[cryptopilot]]/Делора; переносим идеи, не код.
- Мультиактив: акции IMOEX + CNYRUB/GLDRUB/SLVRUB_TOM (алиасы «юань»/«золото»; USD/EUR спот мёртв с 06.2024 — курс у ЦБ) + ОФЗ-советник. Торговля будет в Т-Банке (задел `tinkoff_token`).
- 💰 Портфель под сумму (D16): детерминированная разбивка 50 ОФЗ/30 акции из прошедших гейты сигналов/20 юань+золото, целые лоты; «сколько заработать» рефреймлено во «сколько вкладываю»; ✅ → акции на мониторинг+обучение.
- LLM: **single-режим** (`llm_panel_mode="single"`) — консенсус СНЯТ, одна модель + челленджер-скептик + цепочка фолбэков (как Делор-спорт). Primary с 2026-07-13 = **codex/gpt-5.5-low** (gc/grok-composer флапал «пустой ответ» — в фолбэк; grok-build 2-й). Дистилляция → gc/grok-build. Conf-гейт: LONG ≥70, SHORT ≥80. Deadline 150с. Подробнее → [[investpilot-universe-junk-fix]] (довесок). Панель из 3 voters осталась кодом под `panel_mode="panel"`, но не используется.
- Гейты: план кодом (LLM судит), LONG ≥2/3+conf85, SHORT единогласие+90+не через отсечку, челленджер (скептик после консенсуса, идея TradingAgents), режим-фильтр IMOEX/SMA200, RR≥2.5, mom3м≥10%, трейлинг-выход 2.5×риска (идентичен в бэктесте и в outcome_loop).
- **Калибровка**: PF 1.40 gross 2020–2026 (потолок ядра; гейт регресса 1.3, scripts/calibrate*.py). Пользователю честно проговорено: «90% успеха» не существует, метрика — profit factor. Урок: цель нельзя подгонять под RR — гейт мертвеет.
- KB: свой kb.db, yt-dlp+VTT через SOCKS :2080, RAG e5-small локально, тезисы TTL 120 дн; 5 каналов: @kokorevinvest + @harmfulinvestor + @TimMartynov + @particular_trader + @BrokerRu. ✅ на сигнале = позиция → недельный пересмотр.
- «Каждый день зарабатывать» → пакет D18: свинг-режим ⚡ на карточке (входы те же, trail 1.0/7дн, PF 1.41 — гейт пройден; signals.mode) + интрадей-алерты по всей вселенной + 📅 лесенка ОФЗ (купоны 10 мес/год) + Т-Банк ждёт readonly-токен владельца. KB-дистилляция на grok (NIM дохнет под общей нагрузкой).
- Вечерний отчёт приходит ВСЕГДА (и без сигналов: макро+причины отсева+«куда деньги»+обучение) — фидбэк «бот молчит=выглядит мёртвым». Голоса: JSON-ретрай при markdown-съезде. Грабли: dataclass slots=True не имеет __dict__ — только dataclasses.asdict (краш 19:15 в v0.2.1).
- **v0.5 фоновое интрадей-обучение** (D20): `signals/intraday.py` — детерминированный детект сетапа на ЧАСОВЫХ свечах (пробой дня на объёме, ATR-стоп RR1.5), тихие paper `kind=intraday_paper` (0 сообщений, 0 LLM на вход/выход → квота цела), оценка сразу на 30-мин тике, исходы → батч-дистилляция уроков; капы 4 откр/12 день. Пост-мортемы (D21): LLM-разбор только РЕАЛЬНЫХ sandbox-минусов, кап 5/день (`feedback/postmortem.py`, `outcomes.postmortem`). Минутки отвергнуты (шум+дорого).
- **v0.9 свой брокер-песочница** (D26, 2026-07-10): T-Invest sandbox лёг стороной на дни → отвязаны совсем. `PaperBroker` — бот набирает виртуальный портфель на РЕАЛЬНЫХ ценах MOEX (ISS), состояние в БД (kv `paper:cash` 500к + `paper_positions`); drop-in замена sandbox-клиента (executor не тронут), инжект в main.py вместо TinvestClient. Живой прогон: сам собрал 48/28/17. Детали → [[investpilot_tinvest_sdk]].
- **v0.11.1 новости в KB** (2026-07-11): per-ticker новости в досье были и раньше (RSS-матчинг + ddgs kind=news через CebersResearch), а KB читала только YouTube → добавлены 4 новостные RSS (РБК export/Финам/Прайм/Smart-Lab) в kb_sources+SEED_SOURCES, NEWS_FEEDS досье 3→6, `kb_distill_batch` 4→8 (новости ~60 док/день). За ночь: 131 статья → 2 тезиса + 126 skip (мусор-фильтр общих новостей = норм; но 153×gc-401 — primary-дистиллятор мёртв, фолбэк codex тянет). ⚠️ gc/grok реконнект — ТОЛЬКО руками владельца в дашборде OmniRoute :20129 (вернёт и 3-й голос панели). Грабля: рестарт бота раньше universe_save → в памяти старая вселенная (`if not self.universe` не перечитывает) — после смены вселенной рестартовать ПОСЛЕ записи в БД.
- **v0.8.1 чистота исходов** (2026-07-10): WAIT-сигнал не должен давать исход. `evaluate_signal` теперь гейтит `direction in (LONG,SHORT)` иначе None (дыра: WAIT с ненулевыми уровнями оценивался как ШОРТ→фейк-исход в позиц.контур); вечерний paper-скан пишет учёт только для `plan.direction in (LONG,SHORT) and target>0 and stop>0`. Легаси #21 SBER WAIT (нулевые уровни, от ручной `rec:run`) → voided. Смысл-статус контуров: позиционный = 3 валидных paper-SHORT копятся, дадут уроки для панели через 1-2 нед (панель читает position+swing); ИНТРАДЕЙ = 16 исходов→3 урока, но потребителя НЕТ (панель их не читает, вход детерминирован) — копятся «в стол» под будущий интрадей-слой.
- **v0.8 анти-переобучение** (D25, 2026-07-09): `lessons.evidence_n/wr/retired` — уроки-из-исходов тегаются НАКОПИТЕЛЬНОЙ выборкой контура; рендер `[гипотеза, мало данных: 13 исходов, винрейт 38%]` vs `[правило]` при n≥`LESSON_RULE_MIN_N=20`; свежая дистилляция ретайрит старые гипотезы горизонта (правила выживают); тезисы из доков <1200 симв. (рилсы) cap confidence 55, confidence рендерится в тезис-блок панели (раньше вообще не показывался). Отвергнуто: поднимать OUTCOMES_BATCH_MIN (душит быстрый цикл) и TTL по календарю (устаревание — от данных).
- **v0.7.1 рилсы/Shorts в KB** (2026-07-09): краулер каналов обходит И `/videos`, И `/shorts` (дедуп по video_id); `/kb_add youtube <ссылка-на-рилс>` тянет ОДИН ролик отдельным документом (`video_id_from_url`+`fetch_video_ref` в ingest_youtube); порог транскрипта 500→**250** (`min_len`). Живой e2e: рилс про замещающие облигации → 2 тезиса (BONDS bullish 82 / RUB bearish 78); в логе боевого бота идёт инжест рилсов на 376/391 симв. Грабля: T-Invest sandbox периодически отдаёт HTTP 500 gRPC-13 `70001` на ВСЕХ эндпоинтах — серверный outage их стороны (не токен/не наш код), бот переживает штатно.
- **v0.7 ребалансировка портфеля** (D24): `rebalance_budgets` — целевые 50/30/20 от ВСЕГО портфеля, докупаем недовес пропорционально разрыву на free-кэш (ОФЗ не продаём, hold-to-maturity); FX-подушка получает крупную долю → хватает на лот (старая free×20% давала <лота → подушка не покупалась, портфель скашивался в 88% ОФЗ). `ensure_base_portfolio` = ребаланс на тиках монитора, session/идемпотентность/ретрай.
- **v0.6 обучение по горизонтам** (D23): `lessons.horizon` (position|swing|intraday|any); дистилляция ПОФ-ГОРИЗОНТНО — свой водяной знак `outcomes_distilled_at:<h>` на контур (интрадей учится ежедневно из своего потока, позиционный — по накоплению); `lessons_for(ticker, horizons=...)`, панель зовёт ("position","swing") → интрадей-уроки НЕ пыляют длинный анализ. Доказано живьём: интрадей-урок с тегом intraday, панель видит 0. `_horizon_of` в feedback/learn.py.
- **Отказоустойчивость v0.5** (D22): `bot/supervisor.py` — фоновые циклы под `supervise()` (рестарт backoff 5→300с, алерт владельцу после 3 падений, сброс после 10мин здоровья); `bot/safe_html.py` HtmlFallbackMiddleware — битый HTML→плоский текст+ERROR (сообщение не теряется); kv-дедуп алертов ПОСЛЕ отправки. Индексное ядро в портфеле (топ-IMOEX добор доли акций, без сигнала/стопов) — «маловато бумаг». verify.sh: ERROR-чек только за текущий запуск, без транзиентных сетевых.
- Проверка: скилл **investpilot-e2e** (`tools/verify.sh [--sync --llm --tg]`); tg-web-e2e бесполезен (owner-only молчит чужим). Вечерние петли: digest 19:15, outcome 19:40 MSK.
- Грабли: aiogram+proxy требует aiohttp-socks; rsync сбрасывает +x у start.sh И scripts/*.sh (2026-07-09 это молча убило вечерний обзор 20:05, код 126 — verify.sh --sync теперь чинит оба); env-маппинг в start.sh (`INVESTPILOT_NVIDIA_API_KEY=$DELOR_IMAGE_API_KEY`); **OpenAI-клиенты OmniRoute ходят на :20128 (не :20127 — там /v1/messages, будет 404) и обязателен `"stream": false`** (иначе SSE); NIM llama держит ~16 воркеров на ВСЕХ ботов mini — батч-дистилляции нужны паузы.

Полные доки: Obsidian `Projects/investpilot/` (5 файлов).
