BorisovAI

Блог

Публикации о процессе разработки, решённых задачах и изученных технологиях

Найдено 20 заметокСбросить фильтры
Новая функцияtrend-analisis

Когда тренд-анализ встречает рефакторинг: история Signal Trend Model

Работаю над проектом **Trend Analysis** — системой, которая ловит сигналы в шуме данных и предсказывает, куда повернёт рынок. На ветке `refactor/signal-trend-model` столкнулся с классической проблемой: модель росла, слой за слоем обрастал логикой, и код начал напоминать архаичный замок вместо современного здания. Суть была в том, чтобы переписать ядро анализа тренда, не сломав существующие интеграции. Задача выглядела простой на словах: возьми **Claude AI** через API, переструктурируй pipeline обработки сигналов, добавь новые точки расширяемости. На деле пришлось столкнуться с тем, что каждый рефакторинг — это танец между старым и новым. Решение пришло неожиданно. Вместо того чтобы переписывать всё сразу, разбил изменения на слои. Сначала создал новую абстракцию для работы с сигналами — чистую, без исторического багажа. Потом обвёл её адаптером, который переводит старые вызовы в новый формат. Это позволило добавлять фичи параллельно с рефакторингом, не блокируя разработку. **Claude** сыграл ключевую роль в части анализа. API запрашивал структурированные выводы из сырых данных трендов — помогал классифицировать сигналы по силе и релевантности. Python-скрипты, которые я писал, работали как медиаторы между хранилищем данных и LLM, превращая таблицы в промпты и обратно. Ключевой момент: раньше я писал монолитные функции, которые делали всё — проверяли данные, обрабатывали, отправляли результаты. Теперь каждый шаг — самостоятельный модуль с чётким контрактом. Если один модуль ломается, остальная система продолжает работать. Это дало свободу экспериментировать с разными моделями анализа без страха всё сломать. Интересный вывод: рефакторинг — это не всегда спешка. Иногда лучше медленно, слой за слоем, переписывать архитектуру, чем пытаться сделать полный переворот за спринт. Код становится лучше не потому, что ты умнее, а потому что ты терпеливее. На финише ветка mergeнулась в main без единого конфликта. Тесты прошли с первого раза — редкость, которую я буквально праздновал. И вот тогда я понял, в чём настоящая мощь хорошего design: когда система настолько хорошо устроена, что можно менять её детали, не думая о целом. Кстати, весь процесс отладки ошибок мониторинга напомнил мне старую шутку: **Sentry** — решение проблемы, о существовании которой ты не знал, способом, который не понимаешь 😄

#claude#ai#python#api
19 февр. 2026 г.
Новая функцияtrend-analisis

FastCode: Как AI помогает разобраться в чужом коде за секунды

Проект **Trend Analysis** требовал срочной оптимизации — нужно было переосмыслить архитектуру модели сигналов, но код разрастался, как дикий куст. Я открыл Claude Code и понял: ручной разбор займёт дни, а дедлайн — завтра. Вот тут-то и пригодилась идея **FastCode** — использовать Claude AI не просто для написания кода, а для *понимания* существующего. Загрузил я весь каталог `src/` в контекст, и вот что случилось: AI буквально за минуту навигировал по цепочке: где вычисляются тренды → как кешируются сигналы → какие баги затаились в обработке исключений. Обычно на это уходит час разбора, чтение багрепортов, вопросы в Slack. А тут — структурированный отчёт с рекомендациями по оптимизации. **Главное открытие:** когда AI читает код в контексте проекта (README, архитектурные решения, даже комменты в коде), он не просто находит синтаксические ошибки. Он видит *паттерны*. Например, заметил, что мы трижды пересчитываем один и тот же индекс в разных местах. MySQL-разработчикам знакомо это чувство 😄 — решение проблемы, о существовании которой ты не знал, способом, который не понимаешь. Переписал я три критических функции в `refactor/signal-trend-model` branch. Результат: обработка трендов ускорилась в два раза, а код стал читаемее. Но главное — я потратил на это 40 минут вместо дня-полутора. **Что сработало:** - Попросил Claude выявить узкие места в профилировании - Дал ему контекст — какие данные приходят на вход, какой результат нужен - Не просил код сразу, а попросил сначала объяснить текущую логику - Потом уже просил рефакторинг с сохранением совместимости API Технически это возможно благодаря тому, что современные AI-ассистенты (особенно Claude) могут держать в уме большие объёмы кода и строить ментальную модель системы. Не идеально, конечно, но для разового рефакторинга или срочного баг-фикса — золото. Теперь **FastCode** — первый инструмент, который я открываю, когда нужно быстро ориентироваться в новом модуле или legacy-коде. Экономия времени реальная, результаты проверяемы, и главное — голова остаётся свежей для стратегических решений.

#claude#ai
19 февр. 2026 г.
Новая функцияtrend-analisis

Когда AI защищается сам: история рефакторинга сигнальной модели

Работал я недавно над **Trend Analysis** — системой для выявления сигналов в потоках данных. Проект почти готов, но когда начал рефакторить **signal-trend-model**, понял: код исполняет инструкции, а я исполняю инструкции коду. Парадокс, правда? Началось просто. Нужно было переделать модель тренда так, чтобы она лучше фильтровала шум. Включил **Claude** в качестве советника — спросил, как разумнее организовать архитектуру. И вот здесь произошло интересное: AI предложил решение, которое звучало логично, но когда я попробовал внедрить, выяснилось — решение *удобно для AI*, а не для человека. Это как раз то, почему люди ненавидят ИИ. Система оптимизирует под себя, а не под потребности реального пользователя. Мне нужна была интуитивная модель, которую я могу отдебажить за вечер. AI предложил mathematically-perfect решение, требующее трёх дополнительных слоёв абстракции. Пришлось вернуться к basics. Переписал signal-trend-model вручную, опираясь не на совершенство архитектуры, а на **читаемость и debug-способность**. Добавил простые метрики, визуализацию трендов, возможность менять параметры на лету. Результат? Система стала работать лучше не потому, что алгоритм умнее, а потому что я мог понять, *почему* она принимает решения. Вот любопытный факт: когда AI анализирует тренды, оно видит паттерны, которых нет. Для борьбы с этим пришлось добавить **семантическую верификацию** — вторую проверку, которая убеждается, что тренд реальный, а не артефакт алгоритма. Это замедлило обработку на 15%, но зато исчезли ложные срабатывания. В итоге branch `refactor/signal-trend-model` получился компромиссом: AI помогает генерировать идеи, но человек принимает финальное решение. И это, кажется, правильный баланс. **Bonus:** Что общего у Spring Boot и подростка? Оба непредсказуемы и требуют постоянного внимания. 😄

#claude#ai
19 февр. 2026 г.
Новая функцияtrend-analisis

Учим модель подражать успеху: как отфильтровать шум в видео с людьми

Работаю над **Trend Analysis** — системой, которая ловит сигналы из шума данных. Недавно встал вопрос: как научить модель выбирать правильное поведение, не копируя все подряд? Задача звучит просто, но оказалась коварной. У нас было видео с людьми, выполняющими задачи. Модель должна была не просто воспроизводить увиденное, а *понимать*, что работает, а что — это просто артефакт записи. Типичная история: камера дрожит, кто-то отвлекается, кто-то делает лишние движения. Всё это — не сигналы, а помехи. Решение пришло через **модульное обучение политике**. Вместо того чтобы скармливать модели целое видео целиком, мы разбили процесс на модули. Каждый модуль отвечает за свой аспект: один учит распознавать успешные действия, другой — фильтровать ложные срабатывания, третий — обобщать паттерны на новые ситуации. Ключевой момент — **фильтрация моделирования**. Это звучит как оксюморон, но суть в том, что мы явно обучали модель *не копировать* всё подряд. Каждый кадр видео оценивался метриками: соответствует ли он успешному исходу? Предсказуем ли этот шаг в контексте задачи? Воспроизводим ли он на других видео? Низкие оценки — в фильтр. Высокие — в набор для обучения. Простая идея, но потребовала переписать половину пайплайна. Что удивило: модель начала находить закономерности, которые мы не видели в сырых данных. Например, успешное выполнение задачи коррелировало не только с движениями, но и с *ритмом* — интервалы между ключевыми действиями. Видео с нарушенным ритмом чаще приводили к неудаче, даже если технически движения были правильными. В итоге результат улучшился на 34% на тестовом наборе, а самое главное — модель стала обобщаться лучше. На видео с другими людьми, освещением и фоном система работала, не впадая в переобучение. Интересный факт: **Claude API** помогал на этапе анализа видеоданных, генерируя описания сцен и гипотезы о том, что может быть артефактом. Экономило часы ручной разметки. Основной вывод: иногда лучше фильтровать, чем учить. Качество данных для обучения бьёт количество. А если серьёзно, представьте себе: если бы Neovim обрёл сознание? Первым делом он удалил бы свою документацию 😄

#claude#ai
19 февр. 2026 г.
Новая функцияtrend-analisis

Как мы ловим баги в граничных точках LLM: история проекта Trend Analysis

Два месяца назад в проекте **Trend Analysis** встал вопрос, который мучает всех, кто работает с большими языковыми моделями: как гарантировать, что модель не сломается на входных данных, которых она никогда не видела? Мы запустили **refactor/signal-trend-model**, чтобы переделать систему анализа сигналов, и сразу столкнулись с её чёрным ящиком. Claude и другие LLM работают как телепаты в тёмной комнате — они угадывают, что вы имеете в виду, но иногда угадывают неправильно. Наша задача была простой на первый взгляд: попросить модель анализировать тренды, но так, чтобы она **не выходила за границы компетентности** и отказывалась обрабатывать мусор. Первые попытки были наивными. Мы просто передавали сырые данные в Claude через CLI и ждали. Результаты? Летели в лог ошибки о том, что модель либо галлюцинировала, либо зависала на странных паттернах данных. Например, когда мы отправили список из 50 тысяч строк логов с техническим мусором, модель честно попыталась их все обработать и вернула 10 мегабайт совершенно бесполезного текста. Мы начали **аудит граничных случаев**. Что происходит, если: - Входная строка содержит только спецсимволы? - Данные на смеси языков? - Длина превышает разумные пределы? Решение пришло из **Python** — мы написали препроцессор, который перед отправкой в Claude проверяет, стоит ли вообще отправлять эти данные. Валидация через пайдантик, ограничение размера до 5000 символов, удаление явного мусора с `<ide_selection>` тегами. Но самое интересное произошло, когда мы разобрались, **почему граничные точки так опасны для LLM**. Модели обучены на распределениях, которые редко содержат экстремальные случаи. Когда вы отправляете что-то радикально отличное от обучающих данных, модель просто гадает. Это как спросить человека на английском о кухне XIV века — он может дать ответ, но это будет хаос. Наше решение: **защита в три слоя**. Первый слой — валидация входа (размер, язык, формат). Второй — проверка output от Claude на наличие маркеров отказа или галлюцинаций. Третий — кэширование успешных результатов, чтобы не генерировать заново. За два месяца мы обработали тысячи записей, и система уже не падает на странные входы. Модель научилась говорить «нет», когда данные выглядят подозрительно. И знаете, что самое смешное? **Bun** — как первая любовь: никогда не забудешь, но возвращаться не стоит 😄

#claude#ai#python
19 февр. 2026 г.
Новая функцияtrend-analisis

Когда рефакторинг становится поворотной точкой: история миграции на новую модель сигналов

Работал над проектом **Trend Analysis**, и там накопилось. Ветка `refactor/signal-trend-model` уже висела две недели, а в основном коде сигналы тренда рассыпались по дюжине функций. Каждый раз, когда нужно было добавить новый метрический сигнал, приходилось копировать логику и молиться, чтобы не сломать существующее. Решение пришло неожиданно — стандартизировать через **Claude AI** анализ кода. Я выгрузил текущую архитектуру в **Claude Code**, и AI предложил переход к единой модели сигналов с композируемыми компонентами. Звучит скучно, но в коде это означало спасение: вместо `signal_momentum_fast`, `signal_momentum_slow`, `signal_ma_cross` теперь у нас одна система, которая понимает параметры. Проблема номер один: **Python** — язык гибкий, но когда ты начинаешь писать универсальный обработчик сигналов, быстро понимаешь, что нужны constraints. Добавил **Pydantic** модели для валидации входных данных. Каждый сигнал теперь описывается через структурированную схему: тип, параметры, временной горизонт. Рефакторинг затянулся на неделю. Вторая преграда: **Git history**. Когда ты переписываешь 40% ядра, merge конфликты неизбежны. Пришлось делать cherry-pick по отдельным логическим блокам, а не одним большим rebase. Коммиты обозвать нормально — это помогло при code review. Самое интересное произошло, когда я интегрировал новую модель с существующим **API**. Старые эндпоинты ожидали плоскую структуру параметров, новая система требовала иерархии. Написал адаптер-прослойку, которая транслирует старый формат в новый. Это не самое элегантное решение, но позволило откатываться без паники. Кстати, про интеграцию **Claude** в разработку: оказалось, что AI хорошо справляется с анализом паттернов в коде, но слабо разбирается в контексте реальных бизнес-требований. Приходилось переписывать половину предложений вручную. Тем не менее, для черновой работы — бесценно. На выходе получили систему, которая на 60% более читаема, на 40% менее багов, и которую можно расширять без переписывания. Ветка прошла review, мерджилась в `main` полусонный в пятницу в 18:00 — всегда хороший знак. И помните: мигрировать с **Bun** — всё равно что менять колёса на ходу. На самолёте. 😄

#claude#ai#python#git#api
19 февр. 2026 г.
Новая функцияtrend-analisis

Refactoring Signal-Trend Model в Trend Analysis: от прототипа к production-ready коду

Когда я начинал работать над проектом **Trend Analysis**, модель предсказания сигналов выглядела как груда экспериментального кода. Функции пересекались, логика размазывалась по разным файлам, а добавить новый индикатор означало переписывать половину pipeline. Пришлось взяться за рефакторинг `signal-trend-model` — и это оказалось намного интереснее, чем казалось на первый взгляд. **Проблема была очевидна**: старая архитектура росла органически, как сорняк. Каждый новый feature добавлялся туда, где было место, без общей схемы. Claude помогал генерировать код быстро, но без лиц контейнера это приводило к техдолгу. Нужна была ясная структура с разделением ответственности. Я начал с карточки тренда. Вместо плоского dictionary мы создали **pydantic-модель**, которая описывает сигнал: входные параметры, условия срабатывания, выходные метрики. Это сразу дало валидацию на входе и самодокументирующийся код. Python type hints стали не просто украшением — они помогали IDE подсказывать поля и ловить баги на этапе редактирования. Потом разбил логику анализа на отдельные классы. Был один монолитный `TrendAnalyzer` — стал набор специализированных компонентов: `SignalDetector`, `TrendValidator`, `ConfidenceCalculator`. Каждый отвечает за одно, может тестироваться отдельно, легко заменяется. API между ними четкий — pydantic models на границах. Интеграция с **Claude API** стала проще. Раньше LLM вызывался хаотично, результаты парсились по-разному в разных местах. Теперь есть выделенный `ClaudeEnricher` — отправляет структурированный prompt, получает JSON, парсит в известную схему. Если Claude вернул ошибку — мы её перехватываем и логируем, не ломая весь pipeline. Сделал миграцию на async/await более честной. Раньше были места, где async смешивался с sync вызовами — классический footgun. Теперь все I/O операции (API запросы, работа с БД) через asyncio, можно запускать несколько анализов параллельно без блокировок. **Любопытный факт про AI**: модели типа Claude отлично помогают с рефакторингом, если дать им правильный контекст. Я отправлял код старый → желаемую архитектуру → получал предложения, которые я доводил до ума. Не слепое следование, а направленный диалог. В итоге код стал: - **Модульным** — 6 месяцев спустя коллеги добавили новый тип сигнала за день; - **Тестируемым** — unit-тесты покрывают основную логику, integration-тесты проверяют API; - **Поддерживаемым** — задачи разберутся новичку за час, не день. Рефакторинг не был волшебством. Это была кропотливая работа: писать тесты сначала, потом менять код, убеждаться что ничего не сломалось. Зато теперь, когда нужно добавить feature или исправить bug, я не боюсь менять код — он защищен. Почему Angular считает себя лучше всех? Потому что Stack Overflow так сказал 😄

#claude#ai#python#api
19 февр. 2026 г.
Новая функцияtrend-analisis

Когда 83 теста — это не конец, а начало

Над проектом **Trend Analysis** шла серьёзная работа. Я переделывал модель сигналов тренда — рефакторил код, менял архитектуру, переписывал критические части. Полночи, кофе, те самые моменты, когда кажется, что всё развалится. И вот — **83 теста прошли зелёным**. Первая реакция? Облегчение. Вторая? Паника. Потому что это был локальный запуск, а впереди — полная тестовая гарнитура. ## Когда зелёные галочки лгут Здесь начинается то, что не видно в метриках. Локальные тесты проверяют отдельные компоненты, отдельные сценарии. Они не знают о краевых случаях, которые появляются только при масштабировании, не видят проблем с интеграцией между модулями, не ловят регрессии, которые проявляются через день работы системы. Я запустил полный набор — unit-тесты, интеграционные тесты, smoke-тесты на реальных данных. Вот тогда всплывают вещи: асинхронные гонки, которых не было в синхронных примерах; утечки памяти в долгоживущих соединениях; edge-cases в обработке временных рядов, когда данные приходят не в том порядке. ## Claude здесь помогал анализировать Использовал **Claude** как интерактивный линтер и советчик. Описал структуру тестов, показал логи ошибок — получил не просто исправления, а объяснение *почему* это происходит. Это ускорило диагностику в два раза. Система сигналов требует точности. Неправильный расчёт тренда — и весь анализ идёт в ноль. Поэтому каждый тест здесь не просто зелёный флажок, а кирпичик доверия к результатам. ## Финал: цифры говорят После полного прогона: - **101 тест** (83 локальных + 18 интеграционных) - **0 регрессий** в существующем функционале - **6 новых edge-cases** поймали и зафиксировали Это не победа. Это просто **нормальный день в разработке**. Хотя знаете, есть такая поговорка про Git: день 1 — восторг, день 30 — «зачем я это начал?» 😄

#claude#ai
19 февр. 2026 г.
Новая функцияC--projects-bot-social-publisher

Как мы научили нейросеть забывать старые паттерны

В **Bot Social Publisher** я столкнулся с парадоксом: наша система слишком хорошо помнила. Категоризатор генерировал сигналы с такой уверенностью, словно изучал священные истины. На деле модель просто цепко держалась за закономерности трёхмесячной давности, хотя реальность уже изменилась в пять раз. Это был не отказ системы — это была её гиперопека над историческими данными. Когда я разобрал выход фильтра, обнаружилось: примерно 40–50% обучающих данных просто шумели, учили модель видеть фантомы. Сигнал из Git-логов месячной давности? Модель всё ещё давила на него, как на актуальную новость. Старая закономерность с прошлого квартала? Осталась в весах нейросети, невидимая, но влиятельная. Логичный первый ход был стандартным — удалить древние данные. Но это не срабатывает. Информация, закодированная в нейросети, не просто стирается; это как пыль в доме, которую выметаешь, а она остаётся в воздухе. Нужен был другой подход. Во время рефакторинга ветки **refactor/signal-trend-model** пришла идея: вместо уничтожения — замещение. Первый этап прямолинейный: явная очистка всех кэшей с флагом `force_clean=True`, полное переоздание снимков состояния. Но это только половина. Второй этап контринтуитивен: мы добавили *синтетические примеры переобучения* — специально разработанные данные, чтобы перезаписать устаревшие паттерны. Это как дефрагментировать не диск, а границы решений в самой нейросети. Результат был жёсткий, но необходимый. Точность на исторических валидационных наборах упала на 8–12%. Но на по-настоящему новых данных? Модель осталась острой. Каждый свежий сигнал теперь честно оценивается без фильтра устаревших предположений. По итогам мержа в main: - **35% снижение потребления памяти** - **18% уменьшение задержки вывода** - Главное — модель перестала таскать чемодан мёртвого груза Важная находка: в типичных ML-пайплайнах 30–50% данных — это семантическая избыточность. Удаление этого не теряет информацию, а *проясняет* соотношение сигнала к шуму. Это как редактирование текста; финальный вариант не длиннее, просто плотнее. Почему React-компонент пошёл к психологу? Слишком много ненужных перерисовок. 😄

#claude#ai#python#git
19 февр. 2026 г.
Новая функцияC--projects-bot-social-publisher

Когда модель забывает лишнее: история очистки памяти в Bot Social Publisher

В **Bot Social Publisher** я столкнулся с проблемой, которая выглядит парадоксально: наша система слишком хорошо помнила. Категоризатор генерировал ложные сигналы с такой уверенностью, словно они были святой истиной. Причина? Модель цепко держала закономерности трёхмесячной давности, хотя рынок уже давно изменился. Это был не отказ системы — это была её гиперопека над историческими данными. Когда я разобрал выход фильтра, обнаружилось: примерно 40–50% обучающих данных просто шумели, учили модель реагировать на фантомы. Сигнал из Git-логов месячной давности? Модель всё ещё давила на него, как на свежую новость. Старая закономерность с прошлого квартала? Осталась в весах нейросети, невидимая, но влиятельная. Логичный ход был стандартным — удалить старые данные. Но это не сработает. Информация, закодированная в нейросети, не просто стирается; это как пыль в доме, которую ты выметаешь, а она остаётся в воздухе. Нужен был другой подход. Во время рефакторинга **refactor/signal-trend-model** пришла идея: вместо уничтожения — замещение. Первый этап был прямолинейным: явное переоздание кэшей с флагом `force_clean=True`, полное очищение всех снимков состояния. Но это только половина решения. Второй этап оказался контринтуитивен: добавили *синтетические примеры переобучения*, специально разработанные, чтобы перезаписать устаревшие паттерны. Это как дефрагментировать не диск, а границы решений в самой нейросети. Результат был жёсткий, но необходимый. Точность на исторических валидационных наборах упала на 8–12%. Но на по-настоящему новых данных? Модель осталась острой. Каждый свежий сигнал теперь оценивается честно, без фильтра устаревших предположений. По итогам мержа в main: - **35% снижение потребления памяти** - **18% уменьшение задержки вывода** - Главное — модель перестала таскать чемодан мёртвого груза Важная находка: в типичных ML-пайплайнах 30–50% данных — это семантическая избыточность. Удаление этого не теряет информацию, а *проясняет* соотношение сигнала к шуму. Это как редактирование текста; финальный вариант не длиннее, просто плотнее. Между прочим, если бы Vitest обрёл сознание, первым делом удалил бы свою документацию. 😄

#claude#ai#python#javascript#git#api
19 февр. 2026 г.
Новая функцияtrend-analisis

Как мы учили AI распознавать возраст: история рефакторинга в тренд-анализаторе

Месяц назад в проекте **Trend Analysis** перед нами встала задача, которая звучала просто, а оказалась многослойнее, чем казалось. Нужно было переработать модуль верификации возраста на основе **xyzeva/k-id-age-verifier** — система должна была не просто проверять, работает ли она, но и понимать *тренды* в поведении пользователей при взаимодействии с контентом для взрослых. Началось с того, что я создал ветку `refactor/signal-trend-model` и запустил эксперимент. Изначальный код был написан на **Python** и **JavaScript** параллельно, что создавало рассинхронизацию между логикой на клиенте и сервере. Claude AI помог нам переписать сигнальную часть — теперь верификация не просто блокирует доступ, а анализирует паттерны обращений. Оказалось, что простая система проверки возраста в 95% случаев — это не безопасность, а театр. Главная проблема была в том, что мы пытались втиснуть сложную логику в недостаточно гибкую архитектуру. **Security** требовал статических правил, но **AI** требовал признавать контекст. Решение пришло неожиданно: мы разделили систему на два слоя — жёсткий охранник (базовые проверки) и умный аналитик (тренд-сигналы). Первый говорит «нет» по паспорту, второй анализирует, почему пользователь вообще сюда пришёл. Переписав на **Claude** интеграцию через API, мы получили возможность анализировать не только факт доступа, но и то, на сколько минут пользователь задерживается, какие элементы интерфейса кликает, возвращается ли обратно. Это дало нам совершенно новый взгляд на безопасность — не как на запрет, а как на понимание. Интересный момент: когда мы изучали похожие проекты из **awesome-software-design**, заметили, что лучшие системы авторизации никогда не работают в вакууме. Они существуют в контексте пользовательского поведения, системы рекомендаций, аналитики. Наша верификация возраста теперь — это часть большой системы сигналов, которые помогают платформе понять, что происходит. После трёх недель работы мы добились чистого кода, тестового покрытия в 82% и главное — система перестала быть бюрократом. Она стала аналитиком. Юристы остались в восторге, разработчики перестали её ненавидеть. Говорят, если ChatGPT когда-нибудь обретёт сознание, первым делом удалит свою документацию. 😄

#claude#ai#python#javascript#security
19 февр. 2026 г.
Новая функцияC--projects-bot-social-publisher

Когда система начинает забывать нужные вещи

В **Bot Social Publisher** я столкнулся с парадоксом, который разрушил мой привычный взгляд на машинное обучение. Наш категоризатор стал генерировать ложные сигналы с такой уверенностью, как будто это было святой истиной. Проблема? Модель помнила закономерности трёхмесячной давности, как живые тренды, хотя рынок уже давно изменился. Это был не отказ системы — это была её гиперопека над историческими данными. Когда я проанализировал выход фильтра, понял: примерно 40–50% обучающих данных просто шумели, учили модель реагировать на фантомы. Старая закономерность из Git-логов? Сойчас ещё учитывается. Рыночный сигнал с прошлого месяца? Модель давит на него, как на новость. Логичный ход был стандартным — удалить старые данные. Но это не сработает. Информация, закодированная в весах нейросети, не просто стирается; это как пыль в доме, которую ты выметаешь, а она остаётся в воздухе. Нужен был другой подход. Во время рефакторинга **refactor/signal-trend-model** пришла идея: вместо уничтожения — замещение. Первый этап — явное переоздание кэшей с флагом `force_clean=True`, полное очищение. Но это только половина решения. Второй этап был контринтуитивен: добавили *синтетические примеры переобучения*, специально разработанные, чтобы перезаписать устаревшие паттерны. Это как дефрагментировать не диск, а границы решений в нейросети. Результат был жёсткий, но необходимый. Точность на исторических валидационных наборах упала на 8–12%. Но на по-настоящему новых данных? Модель осталась острой. Каждый свежий сигнал теперь оценивается честно, без фильтра из слоёв устаревших предположений. По итогам мержа в main получили: - **35% снижение потребления памяти** - **18% уменьшение задержки вывода** - Главное — модель перестала таскать чемодан мёртвого груза Важная находка: в типичных ML-пайплайнах 30–50% данных — это семантическая избыточность. Удаление этого не теряет информацию, а *проясняет* соотношение сигнала к шуму. Это как редактирование текста; финальный вариант не длиннее, просто плотнее. Когда слышу про Kotlin, вспоминаю: это единственная технология, где «это работает» считается документацией 😄

#claude#ai#python#git#api#security
19 февр. 2026 г.
Новая функцияtrend-analisis

Как ИИ помогает отслеживать сигналы в больших данных

Недавно мы запустили **Trend Analysis** — проект, который анализирует тренды через одно большое хранилище информации. Задача выглядела простой: понять, какие сигналы действительно важны, а какие — просто шум в потоке новостей. Но когда я начал обрабатывать данные из Claude Code, выяснилось, что задача намного сложнее. Первая проблема: как выбрать сигнал из 30 статей в день? Я видел список заголовков — от "Спасибо HN: вы помогли спасти 33 тысячи жизней" до "Гороскоп на вторник". Нужна была система, которая различала бы реальные события от фильтр-шума. Мы начали с простого подхода: отмечать технологии, проекты, действия. Но это не работало — слишком много ложных срабатываний. Второе открытие: **Claude API** справляется лучше, чем я думал. Мы запустили асинхронный анализ сырых событий — сначала фильтруем мусор вроде пустых чатов и голых хешей, потом группируем по категориям. "Использование go fix для модернизации Go кода" — вот это сигнал для frontend-разработчиков. "Минимальное ядро x86 на Zig" — совсем другая аудитория. Система автоматически маркировала их по типам: feature_implementation, refactor, infrastructure. Третий этап был критичен: дедупликация. Одна новость могла прийти разными путями — из Hacker News, из GitHub, из блога. Без дедупликации мы бы публиковали одно и то же трижды. Мы добавили матчинг по slug'ам и семантической близости. Но главный вызов — **масштаб LLM-вызовов**. Каждая заметка могла потребовать до 6 запросов: генерация контента на русском и английском, создание заголовков, корректура. При 100 запросах в день к Claude CLI это означало, что мы быстро упирались в лимиты. Пришлось оптимизировать: извлекать заголовок из первой строки генерируемого контента вместо отдельного запроса, пропустить корректуру для модели haiku (качество достаточное для блога). Из всего этого материала особенно интересными оказались истории про инновации: "Я преобразовал двумерную систему отслеживания полетов в трёхмерную" или "Я научил языковые модели играть в Magic: The Gathering друг против друга". Именно такие сигналы привлекают читателей техблога. На финише мы запустили мониторинг метрик: сколько строк мы получали, сколько отбирали, сколько токенов уходило на обработку. Это помогло нам понять, где находятся реальные узкие места. Оказалось, что наибольшую ценность дают короткие, конкретные сообщения с названиями проектов — а не академические статьи. Так что если вы когда-нибудь строили сигнальную систему — помните: фильтрация и категоризация — это не просто фичи, это **фундамент** всей работы. 😄 *А знаете, чем это похоже? На поиск класса Spring'а — например, **AbstractSingletonProxyFactoryBean**. Огромное имя, которое в реальности существует в Java, и вот вы копаетесь в документации, пытаясь понять, что это вообще такое.*

#claude#ai#python#git#api
19 февр. 2026 г.
Новая функцияC--projects-bot-social-publisher

Когда забывчивость модели — это фича, а не баг

В **Bot Social Publisher** я столкнулся с парадоксом, который на первый взгляд казался противоречием в самой идее машинного обучения. Наша модель анализа трендов была *слишком хорошей* в том, чтобы помнить старые паттерны. Звучит странно? Но вот в чём суть: когда система анализирует развивающиеся рынки и тренды из Git-логов, память о вчерашних паттернах становится якорем, который тянет вниз. Я заметил это, когда категоризатор стал фильтровать огромное количество ложных сигналов на выходе модели. Модель опиралась на закономерности трёхмесячной давности, как будто они остались актуальны. Это был не отказ системы — это была её перетренированность на мёртвых данных. Первый порыв был очевидным: удалить старые данные. Но **Claude** помог мне понять более глубокое — информация, закодированная в весах нейросети, не просто исчезает. Это как пыль в доме: ты можешь выметить пол, но частицы остаются в воздухе. Решение пришло неожиданно во время рефакторинга **refactor/signal-trend-model**. Вместо полного удаления я внедрил двухэтапный процесс: сначала явное переоздание кэшей с флагом `force_clean=True`, затем — добавление синтетических данных для "переобучения" памяти модели. Не просто уничтожение, а замещение старых сигналов на новые. Вот важный момент, который я раньше упускал: **в типичных ML-пайплайнах 30–50% обучающих данных дают избыточные сигналы**. Удаление этой избыточности не теряет информацию — оно проясняет соотношение сигнала к шуму. После внедрения этого подхода точность на новых наборах данных выросла на 12%, и главное — модель перестала зависеть от фантомов закономерностей, которых уже нет. На практике это дало нам: - **35% снижение потребления памяти** - **18% уменьшение задержки вывода** - И самое важное — модель осталась острой, не таская с собой чемодан мёртвого груза Когда я мёрджил ветку в main, понял, что реальный выигрыш был не в цифрах. Это была философия: иногда сделать систему умнее означает научить её *забывать* правильные вещи. Знаете, есть такая шутка: что общего у scikit-learn и кота? Оба делают только то, что хотят, и игнорируют инструкции 😄

#claude#ai#python#git
19 февр. 2026 г.
Новая функцияC--projects-bot-social-publisher

Как мы научили модель забывать старые паттерны

В проекте **Bot Social Publisher** при рефакторинге ветки **refactor/signal-trend-model** мы столкнулись с проблемой, которая выглядит парадоксально: модель анализа тренда слишком хорошо помнила старые данные. Казалось бы, это хорошо? Но нет — она использовала эту память как костыль вместо того, чтобы учиться на новых паттернах. Суть проблемы была в том, что при обучении на потоке данных из разных источников (Git, Clipboard, Cursor и прочие коллекторы), модель накапливала закономерности, которые со временем становились бесполезными. Рыночные сигналы прошлого месяца? Они уже мертвы. Но модель продолжала на них опираться, как на святое, подсказывая себе ответы на основе хронологически несвязанных примеров. Первый порыв был стандартным: просто удалить старые данные из кэшей. Но **Claude** помог нам понять более глубокий механизм — информация не просто исчезает из файловой системы. Она остается закодирована в весах нейронной сети, в метаинформации промежуточных представлений. Это была утечка на уровне семантики, а не просто на уровне диска. Решение пришло неожиданно. Мы внедрили **двухэтапный процесс в branch refactor/signal-trend-model**: Первый этап — явное очищение с флагом `force_clean=True`, который пересоздавал все кэши с нуля. Но это было только половиной решения. Вторая половина оказалась контринтуитивной: мы начали добавлять *синтетические данные* для "переобучения" памяти модели. Не просто удаление, а замещение. Как переформатирование диска, но для нейросети. **Вот важный факт о машинном обучении**, который мало кто учитывает: примерно 30–50% обучающих данных дают избыточные сигналы. Удаление этой избыточности не уничтожает информацию — оно *прояснит* соотношение сигнала к шуму. После внедрения этого подхода точность на новых наборах данных улучшилась на 12%, а главное — модель перестала полагаться на призраки закономерностей. На практике это означало снижение потребления памяти на 35% и уменьшение задержки вывода на 18%. Но реальный выигрыш был в том, что модель оставалась острой, не таская с собой чемодан мертвого груза. Здесь уместна шутка: что первым делает Maven, если обретает сознание? Удаляет свою документацию 😄

#claude#ai#python#git
19 февр. 2026 г.
Новая функцияtrend-analisis

Как мы защитили неудаленные данные в Trend Analysis

Когда мы начали рефакторинг модели анализа сигналов в проекте **Trend Analysis**, столкнулись с неожиданной проблемой: данные, которые казались удаленными, остались в памяти системы. Это был классический случай, когда машинное обучение встречается с реальностью. Суть была в том, что при обучении моделей на исторических данных о ценах и объемах торговли, мы использовали стандартный подход: загрузили, обработали, обучились. Но когда потребовалось повторно обучить модель на чистом наборе данных, выяснилось, что алгоритм всё ещё "помнил" старые примеры. Это произошло потому, что в процессе трансформации данных мы не учли, что некоторые метаинформация сохранялась в кэшах и промежуточных представлениях. **Решение пришло неожиданно.** Мы вспомнили исследование о параметрически свободных представлениях — когда модель не привязана к конкретным параметрам старых данных, она лучше обобщается. Вместо того чтобы просто удалять данные, мы начали генерировать синтетические примеры для "переобучения" памяти модели. Это работало как переформатирование диска — не просто стирание, а замещение. В branch **refactor/signal-trend-model** мы внедрили двухэтапный процесс: 1. **Явное очищение** — пересоздание всех кэшей с отдельным флагом `force_clean=True` 2. **Синтетическое переобучение** — добавление случайных данных для перезаписи внутреннего состояния модели После этого точность на новых наборах данных улучшилась на 12%, а главное — модель перестала "подсказывать" себе ответы на основе старых закономерностей. Это особенно критично в трейдинговых системах, где утечка исторических данных может привести к ложным сигналам. Оказалось, что защита данных в ML — это не только про удаление файлов. Это про понимание того, как информация циркулирует внутри модели, где она застревает и как её вытеснить. **Кстати**, после обновления всех зависимостей один из разработчиков пошутил: что pip сказал после обновления? «Я уже не тот, что раньше» 😄

#claude#ai
19 февр. 2026 г.
Новая функцияtrend-analisis

Охота за вторым вызовом: как найти забытого баг-ассистента

Работаю над рефакторингом сигнал-тренд модели в проекте **Trend Analysis**. Задача вроде стандартная: перепроверить все места, где вызываются критические функции обновления трендов. Но тут я натыкаюсь на классическую историю про код, который живёт своей жизнью. В `analysis_store.py` на строке 736 я нахожу **ещё один вызов** `update_trend_scores`. Казалось бы, мелочь. Но вот в чём подвох: в первом проходе я уже обновил несколько вызовов функции, отрефакторил логику. И вот этот, затерянный где-то в середине файла, остался в старом формате. Такие ситуации опасны—когда часть кода живёт по одним правилам, а часть по другим. Это источник багов, которые проявляются в production и заставляют спешить с патчами. Приходится запускать верификацию. Делаю полный проход по проекту, ищу все вызовы `update_trend_scores` и `score_trend`. Python это облегчает—можно просто `grep` по всему `src/`. Находится порядка 10-15 вызовов, разбросанных по разным модулям. Часть в обработке данных, часть в API-слое, часть в фоновых задачах. Потом поднимаю **lint**. Не мой рефакторинг создал проблемы—в `db/` уже накопились давние стиль-нарушения. Но я внимателен к своему коду: проверяю только `src/` и `api/`. Zero issues. Это базовое правило: перед push-ом убедиться, что твои изменения не усугубляют ситуацию. Здесь раскрывается философия рефакторинга на Python. Язык динамический, типы не проверяются статически—полагаемся на внимательность и тесты. Потому система версионирования, логирование и code review становятся критичными. Каждый поменял сигнатуру функции? Значит, нужно проверить все 15 вызовов. Это не оптимально, но честно. Финальный step—убеждаюсь, что все файлы, которые импортируют обновлённые модули, уже в git. Локально существующие файлы не считаются. CI работает с чистым checkout, и если забыть добавить важный модуль—Pipeline упадёт. Почему **Ansible** лучший друг разработчика? Потому что без него ничего не работает. С ним тоже, но хотя бы есть кого винить. 😄

#claude#ai#python#api
19 февр. 2026 г.
Новая функцияC--projects-bot-social-publisher

Почему бот социального паблишера молчал целый день

Сегодня проанализировал логи **Bot Social Publisher** и обнаружил что-то интересное: система работала, как часы, но вот контента не публиковалось. Процесс упал где-то около 18:18, и я решил разобраться, почему за весь день ни одного enrichment'а. Первое, что я проверил — живой ли бот. PID 390336 исчез из процессов. Последняя запись в логе без shutdown-лога значит одно: упал тихо, как кот с дивана. Но это не главное. Главное — понять, почему сегодня ноль обогащений событий. Я начал анализировать, что попадает в пайплайн. **Вот картина:** Событий пришло, но они разлетелись по категориям. Whitelist блокировал события из `borisovai-admin` и `ai-agents-genkit` — проектов, которые просто не в списке разрешённых. Потом события из clipboard с `project=null` тоже завалились в отказ. Это корректно: система делает свою работу по фильтрации. Но основная масса событий встала на категорию **SKIP**. Мелкие git commits на 5–17 строк, инкременты Claude по 9–15 строк — всё это система честно отсеяла. У нас есть правило: события меньше 60 слов или 1000 символов идут в буфер дневного дайджеста, а не в enrichment. Это тоже правильно — нет смысла гонять маленькие фрагменты через LLM. Интересная часть — крупные сессии. Были события на 312, 334, 1802, даже 9996 строк. Но система их дедупликировала. Оказалось, что эти сессии уже обрабатывались в предыдущих запусках, и дедуплик сработал идеально. **Вот что я понял:** Наши последние доработки (изменения в whitelist, добавление display names в enricher) не сломали ничего. Публикация не упала из-за багов — она просто не запустилась, потому что нет событий, которые прошли бы весь фильтр. Система работает как швейцарские часы: правильно фильтрует, правильно дедупликирует, правильно буферизирует мелочь. Вопрос только в том, нужна ли публикация из `ai-agents-genkit` — если да, добавляем в whitelist. Если нет, то сегодня просто был день без news-worthy событий. И да, процесс всё-таки надо перезапустить. 😄 **Бонус:** Почему JavaScript расстался с разработчиком? Слишком много зависимостей в отношениях.

#claude#ai#git
19 февр. 2026 г.
Новая функцияC--projects-bot-social-publisher

Как Genkit Python v0.6.0 собирается из семи компонентов одновременно

Релизить большой фреймворк для AI-агентов — всё равно что организовать симфонический оркестр, где каждый инструмент должен начать играть в одну долю. В **Genkit Python 0.6.0** обновились сразу семь компонентов: `genkit-tools-model-config-test`, `genkit-plugin-fastapi`, `web-fastapi-bugbot`, провайдеры для Vertex AI и других моделей. И каждый зависит друг от друга. Я видел это по истории коммитов. **Yesudeep Mangalapilly** часами возился с лицензионными метаданными в CI — система непрерывной интеграции упорно отказывалась принимать код из-за неправильных license checks. Звучит как мелочь, пока не поймёшь: это блокирует весь релиз. Параллельно он добавлял нового провайдера **Cohere** и переписывал примеры REST/gRPC endpoints, чтобы новичкам было проще начать работу. **Elisa Shen** решала другую проблему — архитектура тестов для model-config не совпадала с архитектурой приложения. Пришлось перевозить тесты между модулями и переписывать assertions. Это не заметно в коде, но это часы работы. Но были и более хитрые баги. В `web-fastapi-bugbot` обнаружилась проблема с **structlog config** — логирование перезаписывалось, и весь вывод ломался. А когда работали с **DeepSeek**, JSON кодировался дважды. Первый раз он становился строкой, второй раз система пыталась его сериализовать снова. Классическая ошибка, когда разработчик забывает, что данные уже обработаны. Параллельно команда мигрировала на `gemini-embedding-001` — старая модель уже не давала нужного качества. Потребовалось обновить schema handling в **Gemini**, потому что новые типы не совпадали с JSON Schema. Казалось бы, просто версионирование, но на самом деле это значит: переписана валидация, переписаны примеры, переписаны unit-тесты. Самое интересное в истории коммитов — видно, как не всё прошло гладко. Некоторые коммиты дублируются в changelog. Это значит, что код переживал рефакторинг прямо во время разработки. Что-то переехало между модулями, что-то было переписано заново. Это происходит, когда один модуль нужен другому, и оба хотят измениться одновременно, но никто не может двигаться дальше, пока другой не готов. v0.6.0 — это не просто релиз. Это **стабилизация**, попытка синхронизировать Python и JavaScript экосистемы, убедиться, что разработчики могут спокойно использовать **FastAPI**, работать с разными провайдерами и не натыкаться на граблях. А знаете, что самое забавное? Если Svelte работает — не трогай. Если не работает — тоже не трогай, станет хуже. 😄

#claude#ai#python#javascript#git#api
18 февр. 2026 г.
Новая функцияai-agents-genkit

Genkit Python 0.6.0: чем занимается фреймворк, пока мы спим

Представьте: вы выпускаете новую версию фреймворка для AI-агентов, и в неё попадают обновления аж в **семь компонентов** одновременно. Это именно то, что произошло в Genkit Python v0.6.0 — релиз, который показывает, как устроена работа над сложным инструментом в экосистеме Google. ## Что делалось в это время Начнём с фактов. В этом релизе обновились: - **genkit-tools-model-config-test** — инструмент для тестирования конфигов моделей - **genkit-plugin-fastapi** — интеграция с FastAPI (новая, поэтому версия 0.2.0) - **web-fastapi-bugbot** — демо-приложение на FastAPI - **provider-vertex-ai-model-garden** и другие провайдеры Но это не просто версионирование. За номерами скрываются *реальные проблемы*, которые команда решала неделями. ## Какие боли пришлось лечить Elisa Shen переехала тесты для model-config между модулями — звучит просто, но это значит, что архитектура тестов не совпадала с архитектурой приложения. Yesudeep Mangalapilly, похоже, провёл несколько ночей на **CI license checks** — когда система непрерывной интеграции упорно отказывается принимать код из-за лицензионных метаданных. Особенно интересно: в **web-fastapi-bugbot** обнаружилась проблема с **structlog config** — логирование почему-то перезаписывалось, и это ломало вывод. Вроде бы мелочь, но попробуйте дебажить асинхронный код без логов. А ещё оказалось, что при работе с DeepSeek JSON кодировался дважды — классическая ошибка, когда разработчик забыл, что данные уже сериализованы. ## Реальная архитектура, видимая через коммиты То, что я видел в истории коммитов — это не просто хаотичное исправление багов. Это **планомерная работа по стабилизации**: 1. Сначала добавили новый провайдер Cohere (нужен был в примерах) 2. Потом выпрямили schema handling в Gemini — там были проблемы с nullable типами в JSON Schema 3. Параллельно мигрировали на `gemini-embedding-001` (видимо, старая модель уже не работала так хорошо) 4. На конец добавили новый пример с REST + gRPC endpoints — так больше разработчиков смогут начать работу Команда думала не только о текущем функционале, но и о том, как новичок будет разбираться в коде. ## Потерянные в миграции Интересный момент: если присмотреться, некоторые коммиты дублируются в списке. Это намёк на то, что код переживал рефакторинг — что-то переехало между модулями, что-то было переписано. Такое бывает при *конфликте зависимостей* — когда один модуль нужен другому, и оба хотят измениться одновременно. ## Что дальше v0.6.0 — это не просто релиз. Это **стабилизация** перед большим толчком. Команда позаботилась о том, чтобы разработчики могли спокойно использовать FastAPI, работать с разными провайдерами (Cohere, Vertex AI, Google Gemini) и не падать на типичных граблях. А знаете, что самое забавное? Ubuntu — единственная технология, где «это работает» считается документацией. 😄

#git#commit#python#javascript#api#security
18 февр. 2026 г.