---
name: cryptopilot_overview
description: CryptoPilot — TG крипто-советник (спот/лонг/шорт/ликвидации) с обучением на фидбэке; reuse движка Делора
metadata: 
  node_type: memory
  type: project
  originSessionId: 2c635be3-235a-4c6a-8f7e-26c1c3928ce8
---

CryptoPilot — Telegram крипто-советник (создан 2026-06-22). Бот **@CryptoBotCodoCeh_bot** (id 8577729411, «КриптоБот»), repo `~/Services/cryptopilot` на mini (dev `~/Разработки/cryptopilot` на MacBook → `scripts/sync.sh` rsync), launchd `com.cebers.cryptopilot` (KeepAlive). Python 3.12 свой venv.

**Button-first** (единственная команда — /start; всё остальное inline-кнопками: меню Сигнал сейчас / Мои монеты / Заявки; добавление монеты кнопкой→ввод тикера текстом). Watchlist стартово **BSB** (реальный токен на Bybit, НЕ BNB — bsb это не опечатка). По каждой монете: детерминированный TA **по свечам Bybit** (`engine/bybit_ta`, чистые функции Делора — т.к. BSB нет на Binance) + деривативы Bybit (funding/OI/long-short ratio REST + **ликвидации по WS** `allLiquidation`, прямой доступ без прокси) → **мульти-голосный LLM-консенсус** (groq+gemini-cli+mistral через OmniRoute :20127) → вердикт LONG/SHORT/SPOT_BUY/WAIT с why/risks/sources. Inline ✅/❌/✏️; отказ/правка текстом или **голосом** (PyAV→WAV16k→Riva canary nvapi) → LLM дистиллирует в **урок** → подмешивается в будущие промпты (обучение без ретрейна). **Слой знаний «как ветеран 10 лет» (v0.1.2)**: экспертный промпт-плейбук рынка (ADVISOR_SYSTEM) + per-coin досье (`knowledge/coin_profiles.py` + таблица coin_profiles: ddgs-поиск+Bybit→LLM-ресёрчер→что/сектор/токеномика/риски/data_confidence; кэш, рефреш раз/нед; кнопка 📓 Профиль) + уроки. Файнтюна нет (free LLM) — раскрытие претрейна+grounding; facts-first, малоизвестный токен→честный низкий data_confidence. BSB=Block Street (RWA/DeFi-протокол). **База знаний рынка (v0.1.3)**: `knowledge/market_kb.py` — RSS крипто-новости (CoinDesk/Cointelegraph/Decrypt via делоровский fetch_rss) → дистилляция в дата́рованные тезисы (MACRO/BTC/ALTS/SECTOR/COIN) в таблицу market_theses, фоновый _kb_loop раз/6ч (≤8 статей), чтение 0-LLM подмешивается в сигнал (футер «🌐 контекст рынка»). Деп feedparser/trafilatura. Свою базу, НЕ зашифрованную advisor.db Делора (privacy). Объяснения двухуровневые: why (просто) + why_pro в `<blockquote expandable>` (термины/цифры). Порог уведомлений min_confidence=75 (confidence — честный выход, не крутилка; вялый рынок→молчит). **Самооценка итогов (v0.1.5)**: `engine/outcomes.py`+`signals/outcome_loop.OutcomeEvaluator` (фон раз/30мин) оценивает дозревшие сигналы по реальным свечам Bybit (first-touch target/stop, realized/MFE/MAE→WIN/LOSS/FLAT, честно: стоп до отскока=LOSS), репортит итог реплаем в чат, при ≥6 итогах `distill_outcomes`→уроки (2-я петля обучения на объективных данных). Таблица signal_outcomes, кнопка «📈 Итоги» (винрейт/средн./по монетам). **Автономный paper-режим (v0.1.6)**: `signals.kind` push|paper; Scanner на каждом тике 1 LLM-вердикт на монету → либо пуш (conf≥75+материальный), либо по paper-каденсу (3ч/монета, `paper_interval_s`) молча пишет направленный вердикт kind=paper — обучение идёт БЕЗ активности в чате. Watchlist читается живьём → добавленная кнопкой монета авто-попадает в автоанализ/обучение без правок кода. Итоги раздельно push vs paper. Тумблер paper_trading_enabled. **Вкладки рекомендаций (v0.1.7, как sport в Делоре)**: «📊 Рекомендации» rec:overview → обзор монет (latest_signal, без LLM) → тап rec:coin:{SYM} открывает детальную вкладку «что делать» (edit_text того же сообщения, как вкладки) + ✅/❌/✏️ + 🔄 rec:fresh + 📓 профиль + «Назад. callback-дерево rec:*, НЕ Web App. **Постоянная нижняя панель (v0.1.9)**: `main_reply_kb()` ReplyKeyboardMarkup is_persistent (📊 Рекомендации/📋 Мои монеты/📈 Итоги), ставится на /start+аппрув; текстовые хендлеры panel_* (F.text==BTN_*) перед on_input; reply-панель + inline-вкладки сосуществуют. /start слать не нужно. **Каскад v0.2.1 (2026-06-22)**: 3 голоса via OmniRoute — `groq/llama-3.3-70b-versatile`+`cerebras/gpt-oss-120b`+`mistral/mistral-medium-latest`, фолбэк mistral-medium/groq + **JSON-repair**. Выкинуты `fmd/gpt-5.4` (мёртв, HTTP 000) и `siliconflow/deepseek-V3.2` (виснет на реальной нагрузке) — оба молча сваливались на mistral, убивая разнообразие. ⚠️ **Известная проблема: шина OmniRoute флапает под нагрузкой** (next-server heap-bloat ~396MB→порог 400 [[omniroute_heap_bloat_503]]) → даже groq иногда в таймаут→fallback mistral; resilience держит (всегда 3/3), но diversity местами вырождается. Фикс таймаутов = рестарт next-server. Каскад v0.2.0 (прежний) был fmd+deepseek+groq (если голос ответил не-JSON без ошибки — слот добирается workhorse-моделью; `_one_call`/`build_repair_llms`). agy/claude-sonnet-4-6 (Claude на шине, аналог aerolink) убран — стабильно не-JSON на тяжёлом промпте. **aerolink ПОЛНОСТЬЮ УДАЛЁН (2026-06-22)**: ключи `aero_live_…` лежали в plist Делора (`com.cebers.delor` EnvironmentVariables, НЕ keychain), но МЕРТВЫ — `capi.aerolink.lat` глушит сырой API заглушкой «Please use Claude Code CLI» (проверено: заголовки CLI/system-промпт/stream/JA3-импэрсонейт chrome+safari — всё `200`+заглушка), а настоящий бинарь `claude` отдаёт `401 Invalid token` (ключи отозваны). Серый реселлер Claude Code, против правила «серое не в прод». Удалён из Делора: config.py (поля aerolink_*), sport/llm_voters.py (voter#8), ключ из plist; Делор перезапущен (bootout+bootstrap) чисто — голоса #3/#5/#6 atessa/#7, без #8. atessa (voter#6, capi.atessa.top) НЕ тронут. Единственный рабочий путь для серого Claude-голоса (если будет ЖИВОЙ ключ) — обернуть бинарь `claude -p --output-format json --allowedTools ""` в изолированный subprocess; собирать только под живой ключ. В CryptoPilot aerolink НЕ добавлялся. Грей-провайдеры безопасны: удалённые HTTP-API, видят только промпт (публичные данные), вывод не исполняется, SDK не ставится → ПК не читают/не контролируют. **LLM-фолбэк (v0.1.8)**: каждый голос = primary в фолбэк-цепочке `ChainAdvisorLLM(primary→fb1→fb2)` (конфиг `llm_fallbacks`=mistral-medium,groq); при фейле primary тот же промпт на резерве → голос не выпадает. Та же цепь везде → покрывает анализ И обучение. Проверено: gemini-cli таймаутил → падает на mistral, консенсус 3/3 (было 1/1).

**⚠️ ТЕКУЩЕЕ СОСТОЯНИЕ ГОЛОСОВАНИЯ (v0.2.39, 2026-07-14): ОДНА МОДЕЛЬ, НЕ консенсус.** Юзер перерешил (отмена D5/D38) — «одна модель, чтобы качество было лучше». Модель выбрана слепым бенчем по 361 историч. сигналу (кто точнее берёт победителей/пропускает проигравших): qwen 43.4% / codex 42.9% — лидеры. НО живая проверка qwen-primary поймала регрессию: эндпоинт **qwen-NIM флаки как единственный слот** (тайм-аутил и раньше, параллельные glm/codex маскировали) → бот встал на 40 мин. Итог (15.07): **primary = `nim/qwen/qwen3.5-122b-a10b`** — ПРЯМОЙ NVIDIA (без шины/codex-аккаунта, юзер отверг и консенсус, и codex как рисковый). Живой NIM-бенч 9 моделей: qwen3.5-122b 3/3 валидный JSON за ~15с, стабилен; nemotron-49b/glm-5.2/gpt-oss/minimax/deepseek-v4/kimi/palmyra — timeout/404/BADJSON. Старший брат qwen3-next-80b (был №1 точности 43.4%). fallback glm-4.5-flash→dashscope→codex. `push_min_consensus` 2→1 (миграция). **Промежуточно был glm-4.5-flash (14.07), заменён** — он лонг-биас (7L/0S за сутки) молчал в медвежьем рынке; но лонг-биас у ВСЕЙ qwen-семьи (~2.4 L/S) → single-model в медвежьем рынке структурно тише (гарды режут лонги), это принятая цена. Диагноз молчания 14-15.07: glm лонг-биас × медвежий рынок × тренд-гарды = все лонги в shadow, 0 пушей. analyzer.py НЕ менялся (cap-60 самоотключается при `len(chain)==1`). Все гарды/память/grounding целы; тренд-вето D38 сохранено. Точность glm не измерена (8 историч. голосов) → замер к 19.07; если хуже qwen — вернуться (быстрый прямой qwen-эндпоинт или гибрид). Всё, что НИЖЕ про «мульти-голосный консенсус» и составы голосов (v0.2.1–v0.2.38) — ИСТОРИЯ. [[Decisions#D40]].

Ключевые решения: движок Делора reused **live через sys.path на delor/src** (НЕ `pip install -e delor` — тянул бы riva/ytdlp/reportlab); **advisory-only** (нет биржевых ключей, нулевой риск — не путать с авто-торговым `bybit-trading-bot`); числа детерминированы (LLM не выдумывает). Telegram с mini через xray-прокси **127.0.0.1:2081** (api.telegram.org гео-блок). Админ-гейт как в Делоре (access_requests pending/approved/denied), admin id 1005954706. Полная докум. в Obsidian `Projects/cryptopilot/` (5 файлов). Связано с [[verstak_rename]] (Делор-движок), [[omniroute_cloud_bus]].

**Плановый дайджест 3×/день + еженедельная сводка (v0.2.5, 2026-06-23):** событийный пуш молчит в штиль → добавлены 2 расписания по ЛОКАЛЬНОМУ времени (мини=Europe/Moscow) в `Scanner._tick`. Дайджест `CRYPTOPILOT_DIGEST_HOURS=9,14,20` (МСК утро/обед/ужин): по каждой монете свежий анализ→kind='push'→карточка «🕐 Плановая рекомендация»+кнопки всем (add_signal_message), раз на слот day+hour. **БЕЗ ДУБЛЕЙ (v0.2.6):** WAIT пропускает; монету шлёт только если `(stance, conf//10)` изменилось с последнего отправленного в чат (общий дедуп `self._last=(stance,conf_bucket,ts)` с событийным пушем) — не присылает одну и ту же сделку повторно ни между слотами/днями, ни между event-push и дайджестом. Еженедельная сводка обучения `CRYPTOPILOT_WEEKLY_DOW=0 _HOUR=10` (пн 10:00): `_weekly_text` = outcome_stats+уроки+фидбэк, всем. ⚠️ объём = монеты×3×получатели (сейчас 4×3×2=24/день); крутится через DIGEST_HOURS. Проверено локальным E2E.

**Мульти-юзер = всё ОБЩЕЕ (v0.2.4, 2026-06-23):** добавлен партнёр. Watchlist глобальный (таблица symbol=PK, без фильтра по юзеру → монета от любого видна всем, дублей нет), анализ считается ОДИН раз на монету и рассылается всем approved+admin, уроки общие (scope=тикер/global, не по юзеру) → фидбэк партнёра кнопками учит общую модель, квота не дублируется. Это уже было by design; чинил только баг follow-up: `set_signal_message` перезатирал получателя → итог (WIN/LOSS) шёл лишь последнему. Добавлена таблица `signal_messages` (по строке на получателя) + `add_signal_message`/`signal_recipients`; `_report` шлёт всем, но текст+постмортем строит ОДИН раз (1 LLM-вызов, 1 общий урок, веером всем). approved сейчас = 2 юзера. Проверено локальным E2E (2 получателя, LOSS=1 LLM, WIN=0, paper молчит).

**Горизонт 24ч + выкладка к Азии (v0.2.11, 2026-06-28):** `config.horizon_hours` 6→**24** (6ч закрывал ещё живую сделку; юзер торгует свинг сутками — видел его BSB-шорт 25x +145%). Влияет на окно `evaluate_signal` (свечи 15-мин×96) и `due_for_outcome`. ⚠️ цель/стоп НЕ горизонт-зависимы (в Делор `build_trade_plan` они ATR-размерные, horizon — метка) → 24ч лишь даёт больше времени дойти до той же цели (меньше пустых «по сроку»). Размер цели НЕ меняли (юзер: только запрошенное; расширение под свинг — отложено). `digest_hours` [9,14,20]→**[3,11,19]** МСК (3:00=Азия). Проверено на проде (Tailscale-деплой, mDNS флапал): evaluate_signal(BSB,24ч)→WIN +4.57%, обучение не сломано. Деплой при флапе .local: `rsync -e "ssh -p 2222" cebers_mini@100.84.177.25:Services/cryptopilot/` + kickstart через тот же хоп; scp порт = `-P` не `-p`.

**v0.2.36 (2026-07-12):** dashscope/qwen3.6-flash — 1-й LLM-fallback (OmniRoute провайдер dashscope). [[D35]].

**Рекомендации v0.2.35 (2026-07-12):** EV по min(plan_R, median_MFE_R); horizon WIN при MFE≥partial; category-block wr 0.22/min_n 6 + fast-path SOL/SUI/BTC LONG; KB stale-refresh (48ч без тезисов → re-distill+RSS summary); macro 2027; monthly backtest (1-е вс 03:00); digest EV-метка. Hotfix: add_thesis UPSERT created_at + stale RSS без scrape. [[D34]].

**Win-rate пак v0.2.30–34 (2026-07-12):** гварды после LLM (btc/regime/support-trap/category/session/llm-skip в `engine/guards.py`), таргеты 3%/partial=1R+dynamic MFE, outcome_miner (авто-уроки без юзера), shadow trades при guard-WAIT, пуш 3/3, policy в БД (`engine/policy.py`: 13 knobs, shadow-cal, nightly tuner, weekly backtest golden/rollback PF≥1.5/<1.2). v0.2.34 компактификация: 7 модулей→policy/guards/bybit_ta. Деплой rsync+`kickstart -k com.cebers.cryptopilot`; лог `policy init: 13 params loaded`. Obsidian обновлён (Changelog/Decisions/Architecture). [[D29]]–[[D33]].

**Винрейт-план целиком (v0.2.37, 2026-07-12 вечер):** юзер сам задеплоил win-rate пак v0.2.30-36 (гварды btc-align/regime/support-trap/category/session, shadow-сделки, policy-слой с ночным тюнером и golden/rollback, динамические таргеты, dashscope-fallback). Многоагентный разбор нашёл 3 CRITICAL: (1) push_min_consensus=3 недостижим (кворум-брейк отменяет 3-го голосующего, 0×«3/3» за 7 дней) → пуши/digest были В НУЛЕ — исправлено: кворум=2, digest без гейта, админ-команда **/policy** (env-алиасы RUNTIME-параметров мертвы, истина только в policy_params БД); (2) shadow загрязнял regime_track_record/stat_prior/median_mfe → самоподдерживающийся блок — исключён везде + дедуп 3ч; (3) EV-метка горела на 100% категорий — модель переведена на shrinkage-среднее реализованного R (порог −0.1R), теперь ETH/DOGE/BTC чисто, SOL/SUI/BSB/WLFI метка. Плюс: session_guard на чистой выборке+MSK, категор-блок без хардкода (data-driven), llm_skip пишет shadow (реабилитация), knobs разведены, market_snapshot персистит фичи скоринга (top_trader/F&G/ATR/range_pos), детектор каскадов ликвидаций shadow-first (пуш только после WR≥55% на ≥30 shadow). **ГЛАВНОЕ — geometry sweep** (scripts/geometry_sweep.py, 300 сигналов, time-split): вход по рынку покупал локальный пик; внедрено **стоп 2×ATR + лимит-вход на откате 0.5×ATR_eff TTL 8ч** → на out-of-time WR 37.9→51.0%, EV −0.16→+0.06R; не налило → CANCELLED (⏹, вне статистик, «не догонять»); откат CRYPTOPILOT_LIMIT_ENTRY=0. 1m tie-break НЕ внедрён по замеру (0 конфликтов из 129). D36, D31 отменён. Отчёт разбора: tasks wcuxrwh9x.

**Expectancy-гейт на пуш (v0.2.29, 2026-07-12):** запрос «как поднять уверенность». Честный вывод (+ консультация codex/gpt-5.5): поднимать НЕЛЬЗЯ — реальный expectancy всего пула ОТРИЦАТЕЛЕН (−0.20R; винрейт <50% даже на conf 80+). Эдж сконцентрирован (ETH +0.02R единственный плюс, SOL/SUI стабильно минус). Юзер: монеты не отключать. Решение — резать не монету, а СЕТАП: пуш требует conf≥75 И **EV>0 в R** (`analyzer.push_expected_value` + гейт в scheduler): `EV=p_win·reward_R−(1−p_win)−cost`, p_win из regime_track_record с байес-сглаживанием к base 0.45. Поправка юзера тем же днём: «уведомлений столько же или больше» → гейт = МАРКИРОВКА, не блокировка: минус-EV пуш уходит с честной пометкой «карточка наблюдательная, матожидание −X.XXR, вход не рекомендован» первой строкой в рисках; объём пушей не падает. Проверено рендером карточки SUI LONG (EV −0.28R → метка в «Риски»); ETH p_win 0.56 идёт без метки. Откат push_ev_gate=False. ⚠️ ограничение: гейт по ПЛАНОВОМУ reward_R, а таргеты часто не берутся (MFE<1R у 78%) → EV оптимистичен; реализация награды (горизонт/партиал-TP) = отдельный трек. [[D28]]. codex-разбор целиком: где эдж РЕАЛЬНО (асимметрия RR, отбор режимов, развороты по ликвидациям, «когда НЕ лезть»), сдвиг продукта в risk-management-copilot.

**NIM-таймауты → 2-й голос z.ai glm-4.5-flash (v0.2.28, 2026-07-12):** оба NIM-голоса вечерами зависали до потолка раунда 75с (~33/сутки 1/3; NIM-таймаут 90с > бюджета 75с, fallback не успевал). Замер кандидатов на ТЯЖЁЛОМ промпте: gemini-web2api :1717 флаки (~50% валидных, пусто/болтовня), deepseek :1718 пуст, qwen :1719 мёртв, а **офиц. z.ai `glm-4.5-flash` — 4/4 валидный JSON за 0.8-1.0с**. Заменили флаковый meta-llama на `zai/glm-4.5-flash`: два быстрых надёжных голоса (z.ai<1с + codex) берут 2/3 за секунды даже при зависшем qwen → раунды ~17с вместо 75с. Три независимых инфры (NVIDIA/z.ai/ChatGPT). Реализация: `NIMClient` extra_body (z.ai нужен `thinking:disabled`) + анонимный режим; маршруты `zai/` и `gw/` в delor_bridge; `config.zai_api_key` (env ZAI_API_KEY в omniroute.env, ключ как у Делора voter#5, untrusted-posture как [[dahl_inference_provider]]). Проверено: glm голосует live (BTC 2/2 glm+codex). Watch: z.ai free может ратэлимитить под объёмом → codex-fallback. gemini-web2api оставлен как доступный бэкенд, но НЕ голос (флаки на тяжёлом промпте) — важный урок: замерять кандидата на БОЕВОМ промпте, игрушечный обманывает (gemini на «hi» летал 2с). Прод после переключения: 6 раундов подряд все 2/3, 16-40с, ноль 1/3. **+ `gc/grok-composer-2.5-fast` 2-м фолбэком** (модель из КодИнвеста [[investpilot_overview]], где gc/grok-* 9/9 жив+JSON; xAI Grok через OmniRoute ~2с) — укрепляет слабый хвост фолбэков (cerebras/groq/dahl ненадёжны); `gc/` роутится в OmniRoute по умолчанию.

**Фикс отравления regime-гварда (v0.2.27, 2026-07-11):** жалоба «уверенность упала/обучение сломалось». Диагноз: падение 72(04.07)→~54 в ОСНОВНОМ честное — 72 был раздутым баг-периодом одиночных голосов (починен v0.2.23), SUI/SOL реально плохи на многоголосных лонгах (10/12, 6/7 в минус) → подавление корректно. Но 1 реальный дефект: `db.regime_track_record` (предохранитель, режущий user-facing уверенность до 55) считал paper-режим с сольными голосами (1/N) как настоящие проигрышные сделки → несправедливо давил чистые сетапы (BTC 8/15 35%→жал; без сольных 4/6 40%→не жмёт). Фикс: к фильтру «широкий стоп ≥2.9%» добавлен «консенсус ≥2 согласных» (парс payload.consensus). Проверено вживую: SUI жмёт (заслуженно), BTC освобождён, ETH здоров. Фикс НЕ возвращает 72 (тот баг) — сырые голоса честно ~52-57. Урок [[D27]]: safety-гвард на user-facing метрике питается только push-качеством, не paper.

**ОТКАТ 3-го голоса dahl→codex (v0.2.26, 2026-07-09):** dahl/MiniMax как голос НЕ взлетел — за сутки таймаутил ~100% раундов (315× Errno 60, 0 голосов, раунды упирались в потолок 75с). Вернули `codex/gpt-5.5-low` 3-м голосом, MiniMax разжалован в хвост fallback. **Текущие голоса: `qwen · meta-llama · codex/gpt-5.5-low`.** Урок: разведочный бенч на лёгком промпте не предсказывает боевое поведение. Ниже — история v0.2.25 (по голосу отменена; мост/шина по-прежнему актуальны).

**3-й голос dahl/MiniMax + удалён мост OmniRoute (v0.2.25, 2026-07-08):** (1) codex/gpt-5.5-low как голос ЗАМЕНЁН на `dahl/MiniMaxAI/MiniMax-M2.7` ([[dahl_inference_provider]], inference.dahl.global, untrusted 3rd-party, только публичные данные) — codex зависел от одного ChatGPT-аккаунта (60-120с), MiniMax 2-8с с независимым окном деградации; codex→первый fallback, Kimi→хвост fallback. Роутинг `dahl/` через NIMClient (delor_bridge). (2) КОРЕНЬ повторных codex-зависаний найден: legacy system-мост `claude_omniroute_bridge` (:20127, 30 дней в ретрай-цикле, ~10k мусорных запросов/сутки) — УДАЛЁН; CryptoPilot+Делор переключены на шину :20128 напрямую (OmniRoute сам принимает /v1/messages); mindshub-proxy остановлен ([[omniroute_cloud_bus]]). После: консенсус стабильно 2/3 (был 1/3). (3) OmniRoute-апгрейд 3.8.45/3.8.46 отменён — оба битые у разработчика (chunks), остались на 3.8.44.

**Пакет «полноценный запуск» (v0.2.24, 2026-07-05):** по конкурентному исследованию (3 research-агента; выводы: «безошибочные конкуренты» — миф, TG-каналы прячут убытки, Alpha Arena — 6 LLM слили депо с винрейтом 25-30%; всё «платное» Coinglass раздают public-эндпоинты бирж; ниша честного трек-рекорда пуста). Сделано: (1) `engine/market_events.py` — Fear&Greed alternative.me (кэш 1ч) + Binance futures кросс-чек (predicted funding, TOP-trader position ratio — есть для ВСЕГО watchlist вкл. BSB) + статический макро-календарь CPI/FOMC 2026 (событие <30ч → LLM режет conf); в payload как `market_events` + doc в ADVISOR_SYSTEM; разлоки НЕ вошли — DefiLlama emissions стал платным (402), unlocks-страница за Cloudflare, бесплатного источника нет. (2) Кнопка «📜 Журнал сигналов» — ВСЕ пуши с исходами вкл. LOSS + winrate + profit factor (`db.journal`/`db.profit_factor`); честный трек-рекорд = позиционирование. (3) `scripts/backtest.py` — offline replay: реальная цепочка на исторических T, payload строго ≤T (klines/BTC-ctx/F&G дня/макро/плейбук; уроки+learned_stats+профили исключены — leakage), исход через evaluate_signal; гейт запуска: PF≥1.5. Проверено: смоук на mini, e2e web.telegram.org (Журнал PASS). Бэктесты: дневной (171 точка, параллельно сканам) PF 1.02 — конфаунд, кворум деградировал, всё в одиночных голосах; НОЧНОЙ ЧИСТЫЙ (07.07, бот на паузе, 178 точек/60 дней) — **ГЕЙТ ПРОЙДЕН: 43 сделки, WAIT 76%, винрейт 57.9%, PF 3.69**; SHORT PF 4.33 vs LONG 1.95 (падающее окно). Вывод: качество = качество консенсуса (та же система в деградированном режиме = безубыток, в чистом = сильный плюс) → кап одиночных голосов и кворум это несущие стены. Оговорка: conf≥75 в реплее пуст (реплей без деривативов/уроков консервативнее) — пуш-фильтр напрямую не измерен. Ночной прогон: /tmp/night_backtest.sh на mini (bootout→бэктест→trap-рестарт); пер-коин выводы между прогонами шумят — не тюнить. ГРАБЛИ: бэктест и сканы жрут одну NIM/codex-квоту — только ночью с паузой бота. Инлайн-меню приходит НЕ на /start (там только reply-панель), а на любой обычный текст.

**Codex-голос + адаптивный кворум (v0.2.22, 2026-07-04/05):** голоса ФИНАЛЬНО qwen+meta-llama(прямой NIM)+`codex/gpt-5.5-low` (вместо cerebras). ⚠️ ДВА codex-голоса НЕЛЬЗЯ по двум независимым причинам: (1) шина ≤3.8.33 сериализовала параллельные same-provider запросы — починено апгрейдом OmniRoute до 3.8.44; (2) КВОТА: 2 голоса×6 монет×10мин выедают 5h-окно пула за вечер → OpenAI ставит в очередь (оба codex 40-62с, «Worker limit 16/16» upstream). Принцип состава: 3 голоса с разными окнами деградации, кворум доберёт из живых. **v0.2.23 (05.07):** убыточная серия 04.07 = честный рынок + 2 наших усилителя, закрыты: (1) одиночный голос (1/1) с направленным стенсом капится до conf 60 — не доходит до пуша (порог 75); (2) push-кулдаун восстанавливается из БД при старте (рестарты его сбрасывали → спам одинаковых пушей 6×/час). Вечерняя деградация до 1/3 лечится не составом (у free-эндпоинтов «часы пик» гуляют: вчера висел codex-путь, сегодня оба NIM), а адаптивным продлением кворума: `_collect_votes(lone_extend_s=35)` — при <2 голосах к дедлайну 40с ждём до +35с ради второго. Диагностика per-voter — обёртка Timed поверх build_llm_chain (/tmp/vote_timing.py паттерн). Плюс scan_interval 300→600с: раунд 6 монет с продлениями ~7 мин не влезал в 5-мин интервал — бот сам кормил заторы непрерывной долбёжкой; 10 мин для 24ч-горизонта ничего не теряет. codex-голос жжёт квоту пула ~6 монет×10мин.

**Codex-фолбэк (v0.2.21, 2026-07-04):** юзер добавил codex-пул (ChatGPT) в OmniRoute → первый fallback теперь `codex/gpt-5.5-low` (бенч на боевом промпте: 20-25с 2/2 валидных; low reasoning = экономно; выделенный пул не троттлится вечером). Цепочка fallback: codex/gpt-5.5-low → nim/nemotron-49b → cerebras → groq; проверена рекурсивным обходом построенного ChainAdvisorLLM (матрёшка `_primary`/`_fallback` — плоский print обманывает, обходить рекурсивно).

**Fallback из арсенала + InvestCoin1 (2026-07-03 вечер):** (1) первый fallback консенсуса (до v0.2.21) `nim/nvidia/llama-3.3-nemotron-super-49b-v1.5` (прямой NIM, 2/2 валидных JSON за ~37с на боевом промпте; deepseek-v4-pro нестабилен, qwen3.5-397b/gemma-4 невалидны; вопреки старой зарубке avtero — ЭТОТ nemotron наш JSON отдаёт), за ним cerebras/groq по шине; задеплоено, бот перезапущен. (2) InvestCoin1 ЗАВЕРШЁН (v0.2.18, фоновый агент): из 595 видео канала отобрано 12 методических (~90% канала — промо/новости/датированные отчёты, отсеяны), 71 raw-правило; консолидация 199 raw (Шукин 128 + InvestCoin 71) → **25 core активны** (старые 24 деактивированы, прослеживаемость цела). Аудит агента: спот-чек 12/25 правил — все прослеживаются к raw без выдумок; доставка проверена стаб-LLM на копии БД (25 правил байт-в-байт MATCH; копировать БД только `sqlite3 .backup`, cp без WAL даёт старый снапшот); петля обучения здорова (34 lesson stored / 3 REJECTED гейтом / 7 self-review). ⚠️ уроки: батч-ингест конкурирует с живыми сканами за NIM-воркеры (OmniRoute 503 Worker limit → анализ деградировал до 1-2/3 голосов на время батча) — гонять вне часов сканов; `_PLAYBOOK_LIMIT=30` почти забит (25) — следующий канал заставит консолидатор жёстко резать; мелкий хвост: «Task exception never retrieved» в ensure_profile на несуществующем тикере (не ломает).

**BTC-якорь + watchlist 6 монет + понятные emoji (v0.2.19-20, 2026-07-03):** (1) `bybit_ta.btc_trend_context()` — тренд BTC 4h+1d, кэш 15 мин, в payload каждого анализа альты как `btc_context` + правило в ADVISOR_SYSTEM «сделка против дневного тренда BTC = проигрышная по умолчанию»; 0 LLM-квоты, fail-open. (2) Watchlist 3→6: +BTC/ETH/SOL (db.add_coin, ~48 paper-анализов/день) — больше честных исходов для приора; проверено: WS 6 монет, скан-раунд 6/6, первые ETH/SOL paper-сигналы записаны. (3) Emoji-редизайн: 📈ЛОНГ/📉ШОРТ/🛒СПОТ/⏸ЖДАТЬ + легенда, «✅ в плюс N», «✅ ПРИБЫЛЬ — цель взята»; reply-панель НЕ трогать (тексты матчатся хендлерами). Отложенные рекомендации: офлайн-реплей советника на исторических свечах (гонять ночью), отбор релевантных правил плейбука по топику вместо всех 25 (актуально при 3-м канале).

**Эксперт-плейбук + ускорение анализа v0.2.17 (2026-07-03):** (A) обучение на YouTube-канале трейдера @dmitry_shukin: `knowledge/expert_kb.py`+`scripts/ingest_expert_channel.py` — 14 видео→RU-субтитры (yt-dlp через прокси 2081)→дистилляция в условные эвристики→консолидация 128 raw в **24 core-правила** (таблицы expert_rules/expert_videos); инжект `expert_playbook` в каждый анализ (analyzer+ADVISOR_SYSTEM, «данные важнее эвристики»). Прогресс-бар в TG владельцу. ГРАБЛИ: консолидация max_tokens=1200→cerebras-reasoning отдавал пусто→0 правил, поднял до 4000 (те же грабли, что _one_call). Курировал read-only субагент. (B) ускорение живого анализа: профиль показал — groq/cerebras ЧЕРЕЗ ШИНУ на тяжёлом промпте (2000 токенов) = 60-118с (free-tier троттлинг генерации, НЕ размер промпта — на «скажи ок» groq=0.25с), а `gather` ждал всех. Фикс: `analyzer._collect_votes` кворум (ранний выход при большинстве 2/3, дедлайн 40с) + состав голосов = 2 ПРЯМЫХ NIM (qwen3-next-80b + meta/llama-3.3-70b, ~25-30с, мимо шины) + cerebras-арбитр; groq выбит в fallback. Было 40-118с → стало **22-32с** при согласии двух прямых. Client-timeout шины 100с (ускоряет батч, но для live латентности вреден — потому дедлайн в _collect_votes). См. D20/D21.

**Честность обучения v0.2.16 (2026-07-03, workflow-аудит 16 агентов, 9 подтверждённых находок):** ядро здоровое (пересчёт исходов с Bybit 6/6, очереди/расписания ок), но данные обучения врали в 3 местах — исправлено: (1) evaluate_signal теперь судит по РЕКОМЕНДОВАННОМУ stance (не по плану!) + синтетические уровни ±4.5%/3% для деривативных вызовов на SKIP-плане — фейковый FLAT #53 при пересчёте оказался WIN +4.5%; (2) stat_prior и track-рекорды считают ТОЛЬКО широкостопные (≥2.9%) исходы и исключают kind='manual' (узкостопный шум переворачивал бакеты в обе стороны; буст/кап временно спят — честно); (3) ничья голосов → WAIT (был hash-рандом); (4) сбой Bybit → ретрай ≤6, не вечный FLAT; (5) digest-тик не анализирует монету дважды (нет пар push+paper), rec:fresh → kind='manual'; (6) цель 3×ATR/пол 4.5% (была 4×/6% — бралась 1/79); (7) self_review на готовых агрегатах full_stats (не выдумывает цифры). Стоп 1.5×ATR/3% и горизонт 24ч НЕ тронуты. Новый режим ещё НЕ подтверждён результатами (первые 3 исхода — LOSS-stop) — вывод после 15-20 исходов. См. D19.

**«Дообучение» v0.2.15 (2026-07-02):** файнтюн отвергнут (замороженные API-модели; 115 сделок = оверфит) → `knowledge/stat_prior.py`: живой winrate по связкам (направление×funding×доля лонгов) из своих исходов — в промпт (`learned_stats`) + детерминированная поправка conf связки текущего сигнала (n≥15 wr≥55%→+8 cap85; n≥12 wr≤35%→cap55); порядок гардов discipline→stat_prior→track_record (safety последний). Майнинг: плюсовая категория одна — SHORT при funding<0 и LA>65% (55%, n=20); анти-паттерн LONG при funding<0 (7%!); WLFI ~15% в обе стороны (оставлена по выбору юзера, guard заглушит сам). + `ta.higher_tf` (4h+1d свечи → RSI/SMA/MACD-тренд) в промпт — дневной тренд главный фильтр 24ч-свинга. Горизонт 24ч НЕ трогать (явное условие юзера). Новый режим: BSB SHORT впервые взял ЦЕЛЬ +8.62%. См. D18.

**Гигиена обучения v0.2.14 (2026-07-01, аудит):** winrate был 32% (LONG 16%), база уроков засорялась (4 генератора против 1 мягкого куратора). Сделано: (1) **гейт качества уроков** `learn._lesson_quality_ok` — LLM-урок только с условием срабатывания, расплывчатые/безусловные отбрасываются (человеческий фидбэк НЕ фильтруется); (2) SELF_REVIEW_SYSTEM ужесточён (retire без-условных/дублей кросс-скоуп, база ≤6 global+≤4/монету); (3) разовая чистка 20→9 условных уроков; (4) `payload.track_record` — реальный W/L монеты по направлениям в промпт; (5) `analyzer._track_record_guard` — cap conf=55 если широко-стопная история (стоп≥2.9%, `db.regime_track_record`) даёт wr<35% при n≥8 (BSB SHORT 34% капится, DOGE SHORT 53% нет); кап < порога пуша 75 → категория не пушится, но paper-учится; (6) `bybit.symbol_listed` — валидация тикера при добавлении; **IPU удалён** (мёртвый, не на Bybit, добавил партнёр — уведомлены оба). Всё проверено live на проде. См. Decisions D17.

**Каскад v0.2.12–13 + цель/стоп под свинг (2026-06-28):** (1) **цель/стоп расширены под 24ч** — `engine/bybit_ta.bybit_analyze`: `target_atr_mult` 2.5→4.0, `stop_atr_mult` 1.0→1.5, полы `min_target_pct` 3.5→6.0, `min_stop_pct` 1.5→3.0 (стоп 1.5% = внутридневной шум на мелкачах; RR держится ≥2). Делора не трогал. Обучение цело: `evaluate_signal` берёт уровни ИЗ строки сигнала, старые по узким/новые по широким. (2) **mistral УБРАН** из voters+fallbacks по запросу («пока»); fallback перекрёстный groq↔cerebras. (3) **3-й голос = собственный NVIDIA NIM**, модель `nim/qwen/qwen3-next-80b-a3b-instruct`. ⚠️ **ГОЧА: NVIDIA через OmniRoute МЁРТВ** — весь `nvidia/*`-каталог HTTP 000/таймаут даже на тривиальный промпт (каталог OmniRoute шире реальной доступности). Поэтому NIM дёргаем **НАПРЯМУЮ** `integrate.api.nvidia.com` (OpenAI-shape) по `nvidia_api_key`(=DELOR_IMAGE_API_KEY). Реализация в cryptopilot (не Делор): `engine/nim_client.py` (утиная типизация `chat_text`, кидает `OmniRouteError`→общий 429-ретрай/fallback) + `delor_bridge._advisor_factory` маршрутит префикс `nim/`→NIMClient, остальное→OmniRoute. Из NIM под боевым промптом ответил ТОЛЬКО qwen3-next-80b (llama-3.3/gemma-4/deepseek-v4 = 000). Проверено на проде: консенсус 3/3, qwen голосует сам (без →fallback). См. Decisions D15/D16.

**Автономное самообучение — само-курация уроков (v0.2.10, 2026-06-26):** петля была «открытой» (только копила уроки, плодила дубли). Закрыто: (1) дедуп при `db.add_lesson` (токен-Jaccard≥0.7 в том же scope; идентичные не плодятся, семантику — на LLM); (2) ежедневный `learn.self_review`+`SELF_REVIEW_SYSTEM` (в `Scanner._maybe_self_review`, `CRYPTOPILOT_SELF_REVIEW_HOUR` деф 5:00 МСК): бот сам деактивирует дубли/противоречия/воду (консервативно, реверсивно active=0, ≤половины, только id из списка) и сводит в чёткие правила. Проверено вживую на проде: база 17→10, сохранены и тормозящие, и повышающие уверенность уроки. Автономная петля целиком: paper 3ч + per-signal WIN/LOSS-разбор + батч distill + само-курация. ЧЕСТНО: эджа из ниоткуда не создаёт, потолок в предсказуемости монет.

**«Моя рекомендация» — проактивный input по монете (v0.2.9, 2026-06-26):** кнопка 🗣 в карточке монеты (`myrec:{symbol}`, всегда видна) → бот просит расклад текст/голос → `_handle_own_rec`: signal-less feedback (verdict='recommend') + `distill_and_store` (контекст монеты) → урок по монете. Два канала обучения людьми: ✏️ под сигналом (реакция) + 🗣 проактивно. Зачем: эдж бота пока минусовой → input людей ценнее; за всё время был лишь 1 фидбэк (партнёр @di_gri=251295643 закинул 1 голос 24.06, дал верный урок; Сергей=8688355181 и третий 1005954706 — 0). Проверено реальным TG e2e (BSB → урок записан). Партнёр = @di_gri (присоединился 23.06).

**Симметричное обучение — учимся и на победах (v0.2.7, 2026-06-25):** раньше немедленный разбор был только на LOSS (гасил уверенность) → уверенность и винрейт падали вместе. Добавлено зеркало: `OUTCOME_WIN_SYSTEM` + `reinforce_signal` → на WIN разбирает «что сработало» и пишет confidence-ПОВЫШАЮЩИЙ урок (только если паттерн устойчив; везение → урок пустой). `_report` WIN→`_reinforce_block` (1 LLM на сигнал, всем). Цель (запрос юзера): уверенность растёт ЗАСЛУЖЕННО (как следствие точности), а не крутится напрямую. Проверено E2E+живой шиной. **ДИАГНОЗ шорт-перекоса (B):** 87% сигналов = SHORT, но TA-план сейчас SKIP по всем (trend/rsi=None у низколиквидных) — LLM игнорирует «SKIP→WAIT,conf≤35» и шортит на голом негативном моменте (BSB −41%/7д) у поддержки → отскок→стоп. Винрейт упал 55%→15% (свежая половина). **ИСПРАВЛЕНО (v0.2.8):** `analyzer._discipline_guard` после `_aggregate` — если TA-план=SKIP И деривативы слабые (|funding|<0.05 И |oi_1h|<3%) → направленный вердикт принудительно WAIT,conf≤35 (симметрично LONG; сильный дерив/реальный план пропускаются). + промпт «падение само по себе ≠ шорт, упавшая монета у поддержки = ловушка; нет trend/rsi→WAIT». Проверено вживую: BSB/DOGE/WLFI (все SKIP) теперь WAIT 30 вместо SHORT. Связка A+B: меньше убыточных шортов + рост уверенности на реальных сетапах.

**Follow-up по итогу пуш-сигнала + немедленное обучение (v0.2.2, 2026-06-22, ГОТОВО):** `OutcomeEvaluator._report` (`signals/outcome_loop.py`) даёт разные сообщения по исходу. **WIN** → подтверждение + закрепление (рефлексия первого why/sources сигнала, без LLM, `_reinforce`). **LOSS** → «📝 Беру на заметку» + немедленный пер-сигнальный LLM-разбор ОДНОГО промаха (`feedback/learn.py::postmortem_signal` → `signals/prompts.py::OUTCOME_POSTMORTEM_SYSTEM`): `why_missed`+`correct_read`+`lesson`, урок СРАЗУ в `db.add_lesson(scope=тикер/global)` → подмешивается в будущие сигналы (быстрое обучение, цель юзера). **FLAT** → нейтрально. Только kind='push' (есть chat_id); paper молчит, учится прежним батчем `distill_outcomes`(≥6, оставлен — ловит закономерности по всем). Промпт честно помечает «невезение при разумном сетапе», не выдумывает причину. Git у CryptoPilot НЕТ (деплой = `scripts/sync.sh` rsync→mini, сервис `kickstart -k`). Проверено: локальный E2E 3 веток (стаб-LLM+реальная БД) + реальный каскад на мини (groq/cerebras/mistral дал заземлённый разбор+урок). Obsidian Changelog v0.2.2.

**next-server ПЕРЕЗАПУЩЕН (2026-06-22):** killнут раздутый pid (omniroute_svc), супервизор поднял свежий; шина здорова (groq восстановился, single-call 0.89с против прежних 30с-таймаутов). Базовый RSS свежего next-server ~450MB — это норма Next.js-standalone при старте, проблема была в НАКОПЛЕННОЙ утечке/траектории, не в самом числе.

**Настоящий 3-вендорный консенсус ВОССТАНОВЛЕН (v0.2.3, 2026-06-22):** каскад v0.2.1 вырождался в groq+mistral+mistral — cerebras стабильно подменялся mistral (JSON-repair). Прежний диагноз «флапает под нагрузкой» НЕВЕРЕН. Реальная причина (через захват сырого вывода): `cerebras/gpt-oss-120b` ЖИВ и отдаёт ЧИСТЫЙ JSON, но обрезался на ~278 симв. — reasoning-модель тратит бюджет токенов на «думание», при `max_tokens=1100` на видимый JSON не хватало → объект не закрывался → парсинг падал → тихий fallback на mistral. **Фикс = 1 строка `signals/analyzer.py::_one_call`: max_tokens 1100→2000** (потолок, не цель — groq/mistral не задеты; при 2000 JSON закрывается 4/4). Проверено боевым smoke_votes на мини: groq SHORT 68/62 + **cerebras SHORT 70/68** + mistral 65/65, все голосуют САМИ, 3/3 с естественным разбросом. Бот kickstart -k. Запасной вариант если cerebras позже отвалится: z.ai офиц. API голосом (`CebersResearchClient(base_url=zai, extra_body={"thinking":{"type":"disabled"}})` как в Делоре voter#5; на шине :20127 z.ai = 404, нужен отдельный клиент+ключ в plist). nvidia/meta/llama-3.3-70b жив но 11с и та же llama-семья; deepseek-V3.2 виснет.

**next-server утечка — РЕШЕНА авто-recycle (2026-06-22):** саму утечку убрать нельзя (next-server = чужой OmniRoute/mindshub под omniroute_svc, исходников/sudo-конфига нет). Сделано безвредной: дневной баунс заменён на **health-aware watchdog** (root LaunchDaemon `local.omniroute-bounce`, каждые 5 мин: бьёт omniroute-воркер при RSS>520MB ИЛИ если шина реально слегла — проба POST {} вернула 503/таймаут; супервизор поднимает свежий). Детали и E2E-проверка — в [[omniroute_heap_bloat_503]]. Краткий 500-блип на тёплом старте после баунса покрыт fallback-resilience голосов. Коммит каскада — ложный хвост (у CryptoPilot нет git-репо, источник истины = рабочее дерево + мини).

Проверено вживую: BNB end-to-end, Bybit live, голос real-words round-trip, обучение (урок подмешан в next signal), E2E в реальном TG (гейт→аппрув→button-флоу: меню→📊 Сигнал→карточка BSB→отказ→причина→урок). **BSB — реальный токен на Bybit (perp+spot), не BNB.** Остальные монеты юзер добавит позже (кнопкой). Связано с [[vakhunter_button_first]] (button-first UX).
