Решение: Добавить has_cancelled_for_market() проверку в executor.py
Причина: Stale cancel (STALE_ORDER_MINUTES=30) удаляет pending ордер из active_trades, но CLOB мог уже заполнить его on-chain. Idempotency check видит только pending/filled → cancelled невидим → новый ордер проходит. Reconcile потом находит shares → 2 позиции на одном маркете. Подтверждено логами: Seoul (#9892→cancelled→reconciled + #9894), Buenos Aires (#9889→cancelled→reconciled + #9891)
Альтернативы: 1) Не отменять stale если маркет open (капитал заморожен дольше), 2) Проверять on-chain перед cancel (лишние RPC calls)
Итог: Вариант A — проверяем cancelled трейды при создании нового ордера. Простой, точечный, 19 строк кода
25 May 2026
WB: CLOB resolver proxy fallback
Решение: Добавить direct fallback в _fetch_clob_market() когда SOCKS proxy фейлит
Причина: SOCKS proxy (46.149.128.71) сдох → Connection refused → resolver не мог получить market data → 9 трейдов зависли нерезолвленными. CLOB API доступен напрямую из Vancouver
Альтернативы: 1) Починить/заменить прокси (не контролируем), 2) Убрать прокси полностью (может понадобиться для executor)
Итог: Try proxy → fallback direct. Executor по-прежнему использует proxy для ордеров
WB: Builder Profile + fee integration
Решение: Создать Builder Profile "SZHub" на Polymarket, добавить BUILDER_CODE в OrderArgs
Причина: Builder fees 0.5% с каждого трейда = пассивный доход. При $30-40/день ≈ $0.15-0.20/день
Итог: Fees pending: maker 0.5% с 28 May, taker 0.5% с 1 Jun (cooldown 7 дней)
Video Gen: SageAttention удалён
Решение: Полностью убрать SageAttention из пайплайна
Причина: v1.0.6 полностью сменил API. Старый патч sageattn_qk_int8_pv_fp8_cuda→sageattn_qk_int8_pv_fp16_cuda находит 0 matches. int8 QK quantization на Qwen fp8 модели = overflow → чёрные картинки
Альтернативы рассмотрены: 1) Установить SageAttention 2.x (нет на pip), 2) Рестартить ComfyUI между фазами (сложно), 3) Monkey-patch runtime (хрупко)
Итог: PyTorch SDPA + FlashAttention2 на RTX 4090 почти та же скорость, 0 проблем с квантизацией
Video Gen: BasicGuider для refine
Решение: Отдельный BasicGuider (1 forward pass) для refine вместо общего STGGuider (3 passes)
Причина: STGGuider делает 3 прохода (conditional + unconditional + STG) на каждый шаг. На 1536×864 (4x токенов после upscale) это ~9s/step vs ~3s/step
Почему безопасно: Refine = лёгкий denoise (0.25), не генерация нового контента. Guidance не нужен.
Video Gen: RTX 5090 vs 4090
Факт: 22B DiT модель: 100s на 5090, 200s на 4090 (2x разница)
Причина: fp16 TFLOPS 210 vs 83, bandwidth GDDR7 1.8TB/s vs GDDR6X 1TB/s
Вывод: Для продакшна выбирать 5090 на vast.ai (+$0.20-0.40/hr, но 2x быстрее = меньше total cost)
Факт: SQLite хранит datetime "YYYY-MM-DD HH:MM:SS" в UTC без таймзоны. new Date() в браузере парсит это как LOCAL → для Ванкувера (UTC-7) время уезжало на +7ч в будущее → отрицательный diff → «-419m ago».
Решение: на бэке sqlite_utc_to_iso() (routes.rs) нормализует в RFC3339 (...TZ) для всех detectedAt; на фронте единый timeAgo() сам добавляет Z для tz-less строк (страховка для whale timestamp, которые я не трогал на бэке).
Почему так: один фикс у источника лечит все ленты. Frontend-нормализация = defensive, переживёт если бэк где-то отдаст без Z.
«100% объёма китов» → реальный кластер
Факт: при одном directional ките whale_yes_pct=1.0 → всегда «100%», читается как консенсус толпы (липа).
Решение: новые колонки edge_scores.whale_count + whale_volume_usd (идемпотентный ALTER в edge.rs, т.к. db.rs гоняет CREATE IF NOT EXISTS и не добавляет колонки). Карточка: «$33.4K · 4 сделки».
Трейдофф: count = число сделок (whale_trades), НЕ уникальных кошельков → текст «N сделок», не «N китов» (честнее). Distinct-кошельки = ещё подзапрос, не делал.
Фильтр силы (вариант А)
Решение: 3 пилюли (Любая/Сильные/Очень сильные) → одна кнопка-переключатель циклична. 2 ряда фильтров вместо 3 — на мобиле первая карточка выше.
Почему не шторка: проще, ничего не прячем глубоко (Принцип 2).
TopBar кнопка кошелька
Факт: RainbowKit ConnectButton с locale=ru рендерит «Подключить кошелек» → перенос на 2 строки, четверть шапки.
Решение:mask-image: linear-gradient(to right, #000 calc(100%-28px), transparent) на .category-pills. Без правки JSX (::after внутри scroll-контейнера скроллился бы вместе с контентом).
Коммиты: 2dc1b47, 3f28107, d86ee4d, 62e7a19, 9bd7865, 770a643, 03da988. Pushed → origin/master.
Грабли:cargo не в PATH сэндбокса → export PATH="$HOME/.cargo/bin:$PATH". Edit требует свежий Read после out-of-band записи.
13 Jun 2026 — PolyCopy: гейт-чистка китов + 5 UI-фич
Position-card «ended» badge → по redeemable (commit ee58b7f)
Факт: бейдж завершён ⌛ считался по timeUntil(endDate), а endDate=дата без времени (полночь UTC) → срабатывал за часы до реальной резолюции, пока цена ещё скачет. Сбивал с толку (казалось куш зафиксирован).
Решение (TradePage.tsx):завершён только при pos.redeemable===true; иначе почасовой отсчёт как раньше; в окне расчёта (endDate прошёл, не redeemable) → <1 ч вместо «завершён».
Профиль 14 активных по whale_wallets/whale_trades (win_rate-колонка БЕСПОЛЕЗНА — хранится долей, округляется в 0/1; avgBuy/crypto%/fav% считал сам из whale_trades).
Снято 5 (status=paused): cf6c5492(−$5 окно,фав32%), 56c9fbdec(avgBuy0.78,фав65%), 84cb17a5(lifetime −$124k!), 0346afae($7.4k<$15k), 8c77f051($4k,23сделки). Потом вернул 0346afae (Rick) — после паузы его USA−2.5 копия выстрелила +$23 (12x лонгшот, открыта ДО паузы 06-13 00:36 UTC). Пауза стопит только НОВЫЕ копии, открытые доезжают (mirror-exit) = by design. Итог: 10 активных.
🔑 Окно замера разбито A(14)→B(10): при след. гейте фильтровать по новому старту. Детали в data/edge-measurement/README.md.
Archive-статус «уже копировал» (commit ba8f0de)
Дыра: «Стоп» в Мои копии = hard-delete → стирал историю → кит не узнаваем при повторе в Лидерах.
Решение: статус archived (фронт-only, бэк не трогал — /api/copy/active уже фильтрует status='active'). «Стоп»→archive (строка сохраняется), Мои копии скрывают archived, Лидеры показывают 🟠🕘 «копировался ранее».
Попап трафика «+N исходов» (commit 15cbf66)
Слив: ссылка вела на polymarket.com → теряли юзера+builder fee. Висело в TODO с 11 Jun (Rick думал что сделано — НЕ было).
Решение: новый GET /api/screener/events/{event_id}/outcomes (тот же запрос исходов без обрезки до 3) + попап в EventsList, клик→внутренний /market/:id. .ev-more→
Холдинги китов на карточках поз (commit c10369c) — Вариант B
Идея Rick: «🐋 Whale #N держит $X» на карточке — за каким слоном едешь.
🔑 Решение БЕЗ касания демона:useLeaderHoldings фетчит позиции подписанных лидеров через Data API (CORS открыт), матч по conditionId (если рынок держат несколько — крупнейший холд). Анонимно через whaleCodename. Проверено: 4/5 наших поз сматчились (84cf $157k Knicks, 224a $178k Switzerland).
TODO Вариант C (после гейта): точная привязка «кит→размер входа в момент копии» = демон пушит positions(conditionId→leader) в /api/copy/pnl. Правка торгового демона → строго после гейта.
Клички ростера (commit c10d155)
Решение: мапа WHALE_NICKNAMES в whaleCodename (прилагательное+существительное, по стилю/объёму). Surface везде (Лидеры/Мои копии/карточки). Анонимно, приоритет над raw-label. Жадный Левиафан(f883)/Стальной Бульдозер(84cf)/Хладнокровный Снайпер(492442)/Быстрая Ракета(224a)/Точный Метроном(6db5)/Мудрый Оракул(f396)/Вездесущий Спрут(1eaf)/Цифровой Хамелеон(c44f)/Жадный Чалкоед(c1a9)/Фартовый Лонгшот(0346).
Грабли:cargo не в PATH → $HOME/.cargo/bin/cargo. data/ в .gitignore (edge-measurement+screener.db не в git). Data API режет urllib (403) → curl с User-Agent. vite build НЕ тайпчекает → всегда npm run build (tsc -b).
13 Jun 2026 (продолжение) — i18n клички + мульти-кит + маркеры на графике
Клички двуязычные (commit 241d2fa)
Были RU-only → лезли в EN UI. WHALE_NICKNAMES теперь {ru,en}, whaleCodename(label,addr,lang='en') берёт по lang. Все 5 вызовов (Leaders/MyCopies/TradePage/WhaleProfilePage/WhaleProfile) передают lang из useT().
Проверка паритета i18n: парсер ключей EN-блока vs RU-блока в translations.ts → 266=266, сирот нет.
Мульти-кит на карточках поз (commit ea9ad29)
Раньше useLeaderHoldings отдавал ОДНОГО кита (крупнейший холд) на conditionId. Теперь массив ВСЕХ подписанных лидеров в рынке, дедуп по адресу (крупнейшая нога), сортировка по value desc. Карта: шапка «🐋 N в этой сделке» (pf.whalesIn, счётчик после эмодзи — без склонения) + список. Сигнал консенсуса. Switzerland −2.5 → 4 кита.
Маркеры входов китов на графике рынка (commit b8f09d9)
Бэк:GET /api/screener/market/{id}/whale-entries — JOIN whale_trades × copy_subscriptions(active), GROUP BY address+side, size-weighted avg price + MIN(timestamp). 🔑 ключ джойна screener_markets.id = whale_trades.market_id (оба conditionId-формат 0x…). win по lower() обеих сторон.
Фронт (PriceChart, LWC v5): маркеры через createSeriesMarkers(series,markers) (в v5 заменил series.setMarkers), markersRef сбрасывается при ребилде/смене темы. BUY ▲зелёный belowBar / SELL ▼красный aboveBar, текст «🐋 кличка цена». timestamp ISO без Z → парсить как UTC (+'Z'). markers сортировать по time asc (требование LWC).
🔑 Покрытие (НЕ баг): только 96 активных рынков имеют заходы наших 10 китов (1323 — у всех топ-40 китов; 13 из 15 топ-рынков с нашими китами = active=0 завершённые). Детальная страница открывает только active=1 → на большинстве рынков 0 маркеров = норма. Rick решил: пока только наши (редкие маркеры by design). Расширение на всех китов (наши ярко/прочие серо) = отложено.
TODO добавлен (commit dfd13de)
Скрытая страница «Анализ пользователей» рядом с Builder Analytics (admin-only, контент позже) → polymarket-screener/CLAUDE.md.
Грабли: LWC v5 — createSeriesMarkers (не series.setMarkers). whaleCodename(label,addr,lang) — забыл бы lang → EN-клички не показались бы. i18n паритет: парсить оба блока и диффать ключи.