Шесть изменений в день: как устроена разработка chess.rodeo

С 6 мая 2026 года в chess.rodeo влито 1159 пул-реквестов, в среднем шесть в день, в самый плотный день — 58. Из 4988 коммитов 3695 написаны вместе с Claude. Делаю сервис один. Как он рос, я уже рассказывал, а здесь — как устроена сама работа. Готовых файлов не будет: правила и промпты написаны под конкретный код. Подход переносится на любой проект.

2025-10-06: 0 окт 2025 2025-10-07: 0 2025-10-08: 8 2025-10-09: 0 2025-10-10: 0 2025-10-11: 0 2025-10-12: 0 2025-10-13: 15 2025-10-14: 26 2025-10-15: 0 2025-10-16: 8 2025-10-17: 5 2025-10-18: 13 2025-10-19: 3 2025-10-20: 22 2025-10-21: 1 2025-10-22: 4 2025-10-23: 0 2025-10-24: 0 2025-10-25: 0 2025-10-26: 0 2025-10-27: 0 2025-10-28: 0 2025-10-29: 0 2025-10-30: 0 2025-10-31: 0 2025-11-01: 0 2025-11-02: 0 2025-11-03: 0 ноя 2025-11-04: 9 2025-11-05: 20 2025-11-06: 17 2025-11-07: 28 2025-11-08: 4 2025-11-09: 6 2025-11-10: 2 2025-11-11: 11 2025-11-12: 4 2025-11-13: 8 2025-11-14: 1 2025-11-15: 1 2025-11-16: 3 2025-11-17: 8 2025-11-18: 20 2025-11-19: 0 2025-11-20: 4 2025-11-21: 7 2025-11-22: 1 2025-11-23: 1 2025-11-24: 12 2025-11-25: 5 2025-11-26: 28 2025-11-27: 0 2025-11-28: 21 2025-11-29: 0 2025-11-30: 0 2025-12-01: 4 дек 2025-12-02: 0 2025-12-03: 0 2025-12-04: 21 2025-12-05: 7 2025-12-06: 0 2025-12-07: 0 2025-12-08: 0 2025-12-09: 0 2025-12-10: 0 2025-12-11: 0 2025-12-12: 0 2025-12-13: 0 2025-12-14: 5 2025-12-15: 16 2025-12-16: 21 2025-12-17: 11 2025-12-18: 14 2025-12-19: 8 2025-12-20: 1 2025-12-21: 0 2025-12-22: 0 2025-12-23: 0 2025-12-24: 7 2025-12-25: 1 2025-12-26: 1 2025-12-27: 1 2025-12-28: 1 2025-12-29: 1 2025-12-30: 1 2025-12-31: 0 2026-01-01: 0 2026-01-02: 1 2026-01-03: 3 2026-01-04: 7 2026-01-05: 1 янв 2026 2026-01-06: 8 2026-01-07: 0 2026-01-08: 0 2026-01-09: 0 2026-01-10: 0 2026-01-11: 0 2026-01-12: 0 2026-01-13: 6 2026-01-14: 0 2026-01-15: 0 2026-01-16: 8 2026-01-17: 4 2026-01-18: 0 2026-01-19: 0 2026-01-20: 0 2026-01-21: 2 2026-01-22: 1 2026-01-23: 0 2026-01-24: 0 2026-01-25: 0 2026-01-26: 0 2026-01-27: 0 2026-01-28: 0 2026-01-29: 0 2026-01-30: 12 2026-01-31: 0 2026-02-01: 0 2026-02-02: 0 фев 2026-02-03: 0 2026-02-04: 9 2026-02-05: 6 2026-02-06: 0 2026-02-07: 0 2026-02-08: 0 2026-02-09: 7 2026-02-10: 3 2026-02-11: 1 2026-02-12: 0 2026-02-13: 2 2026-02-14: 1 2026-02-15: 0 2026-02-16: 0 2026-02-17: 0 2026-02-18: 16 2026-02-19: 0 2026-02-20: 0 2026-02-21: 0 2026-02-22: 0 2026-02-23: 15 2026-02-24: 1 2026-02-25: 0 2026-02-26: 0 2026-02-27: 0 2026-02-28: 0 2026-03-01: 0 2026-03-02: 0 мар 2026-03-03: 0 2026-03-04: 0 2026-03-05: 1 2026-03-06: 0 2026-03-07: 2 2026-03-08: 0 2026-03-09: 8 2026-03-10: 3 2026-03-11: 0 2026-03-12: 0 2026-03-13: 4 2026-03-14: 0 2026-03-15: 1 2026-03-16: 1 2026-03-17: 8 2026-03-18: 1 2026-03-19: 0 2026-03-20: 1 2026-03-21: 1 2026-03-22: 6 2026-03-23: 3 2026-03-24: 5 2026-03-25: 0 2026-03-26: 2 2026-03-27: 0 2026-03-28: 0 2026-03-29: 2 2026-03-30: 5 2026-03-31: 18 2026-04-01: 50 2026-04-02: 33 2026-04-03: 14 2026-04-04: 0 2026-04-05: 2 2026-04-06: 7 апр 2026-04-07: 9 2026-04-08: 4 2026-04-09: 2 2026-04-10: 8 2026-04-11: 0 2026-04-12: 0 2026-04-13: 0 2026-04-14: 4 2026-04-15: 0 2026-04-16: 5 2026-04-17: 1 2026-04-18: 0 2026-04-19: 0 2026-04-20: 0 2026-04-21: 0 2026-04-22: 23 2026-04-23: 10 2026-04-24: 7 2026-04-25: 7 2026-04-26: 4 2026-04-27: 6 2026-04-28: 13 2026-04-29: 21 2026-04-30: 15 2026-05-01: 0 2026-05-02: 2 2026-05-03: 0 2026-05-04: 0 май 2026-05-05: 0 2026-05-06: 1 2026-05-07: 19 2026-05-08: 1 2026-05-09: 3 2026-05-10: 0 2026-05-11: 2 2026-05-12: 1 2026-05-13: 10 2026-05-14: 17 2026-05-15: 9 2026-05-16: 0 2026-05-17: 0 2026-05-18: 7 2026-05-19: 0 2026-05-20: 0 2026-05-21: 7 2026-05-22: 3 2026-05-23: 18 2026-05-24: 0 2026-05-25: 1 2026-05-26: 8 2026-05-27: 0 2026-05-28: 0 2026-05-29: 0 2026-05-30: 0 2026-05-31: 0 2026-06-01: 9 июн 2026-06-02: 9 2026-06-03: 0 2026-06-04: 0 2026-06-05: 5 2026-06-06: 0 2026-06-07: 0 2026-06-08: 2 2026-06-09: 0 2026-06-10: 3 2026-06-11: 4 2026-06-12: 1 2026-06-13: 7 2026-06-14: 8 2026-06-15: 2 2026-06-16: 5 2026-06-17: 18 2026-06-18: 10 2026-06-19: 9 2026-06-20: 5 2026-06-21: 1 2026-06-22: 0 2026-06-23: 5 2026-06-24: 0 2026-06-25: 7 2026-06-26: 0 2026-06-27: 13 2026-06-28: 16 2026-06-29: 4 2026-06-30: 9 2026-07-01: 22 2026-07-02: 13 2026-07-03: 25 2026-07-04: 0 2026-07-05: 5 2026-07-06: 5 июл 2026-07-07: 0 2026-07-08: 5 2026-07-09: 2 2026-07-10: 3 2026-07-11: 3 2026-07-12: 1 2026-07-13: 2 2026-07-14: 10 2026-07-15: 0 2026-07-16: 6 2026-07-17: 22 2026-07-18: 8 2026-07-19: 0 2026-07-20: 3 2026-07-21: 0 2026-07-22: 4 2026-07-23: 1 2026-07-24: 0 2026-07-25: 2 2026-07-26: 3 2026-07-27: 0 2026-07-28: 2 2026-07-29: 4 2026-07-30: 0 2026-07-31: 10 2026-08-01: 11 2026-08-02: 18 2026-08-03: 51 авг 2026-08-04: 15 2026-08-05: 41 2026-08-06: 45 2026-08-07: 21 2026-08-08: 9 2026-08-09: 25 2026-08-10: 4 2026-08-11: 23 2026-08-12: 30 2026-08-13: 1 2026-08-14: 26 2026-08-15: 29 2026-08-16: 0 2026-08-17: 27 2026-08-18: 24 2026-08-19: 9 2026-08-20: 29 2026-08-21: 22 2026-08-22: 2 2026-08-23: 4 2026-08-24: 6 2026-08-25: 0 2026-08-26: 39 2026-08-27: 28 2026-08-28: 10 2026-08-29: 2 2026-08-30: 1 2026-08-31: 39 2026-09-01: 46 2026-09-02: 7 2026-09-03: 22 2026-09-04: 14 2026-09-05: 7 2026-09-06: 0 2026-09-07: 38 сен 2026-09-08: 90 2026-09-09: 13 2026-09-10: 52 2026-09-11: 42 2026-09-12: 0 2026-09-13: 1 2026-09-14: 50 2026-09-15: 52 2026-09-16: 52 2026-09-17: 9 2026-09-18: 61 2026-09-19: 0 2026-09-20: 0 2026-09-21: 75 2026-09-22: 28 2026-09-23: 59 2026-09-24: 52 2026-09-25: 6 2026-09-26: 12 2026-09-27: 0 2026-09-28: 72 2026-09-29: 14 2026-09-30: 76 2026-10-01: 88 2026-10-02: 17 2026-10-03: 1 2026-10-04: 6 2026-10-05: 21 окт 2026-10-06: 64 2026-10-07: 39 2026-10-08: 65 2026-10-09: 4 2026-10-10: 29 2026-10-11: 18 2026-10-12: 33 2026-10-13: 46 2026-10-14: 9 2026-10-15: 25 2026-10-16: 21 2026-10-17: 5 2026-10-18: 4 2026-10-19: 50 2026-10-20: 0 2026-10-21: 0 2026-10-22: 0 2026-10-23: 0 2026-10-24: 0 2026-10-25: 0 2026-10-26: 3 2026-10-27: 0 2026-10-28: 0 2026-10-29: 0 2026-10-30: 0 2026-10-31: 0 2026-11-01: 0 2026-11-02: 1 2026-11-03: 0 2026-11-04: 80 2026-11-05: 182 2026-11-06: 21 2026-11-07: 4 2026-11-08: 0 2026-11-09: 1 2026-11-10: 6 пн ср пт меньше больше

Коммиты chess.rodeo по дням с октября 2025 года: чем темнее клетка, тем больше коммитов. С августа почти каждый день тёмный, самый плотный — 5 ноября 2026 года, 182 коммита. В конце октября пусто: я был в отпуске и не работал.

Сколько агентов работает одновременно

Открыто бывает до 15 сессий с агентами, но активно я работаю обычно с пятью. Внутри каждой агент может запускать сколько угодно подагентов.

Сколько сессий вести, зависит от того, сколько контекста я готов держать в голове. Задачи бывают разные. Дебютный курс готовится несколько дней, и я нужен только в конце, чтобы проверить готовый курс. Правки на экране анализа делаются быстро и помногу: каждую нужно посмотреть, ответить на исправления, которые другие агенты делают на соседних страницах, и вернуться, если я просил что-то поправить.

Каждый агент работает в своей копии репозитория, поэтому они не мешают друг другу. Так было не сразу. Вот как это правило записано в инструкции для агентов, в переводе:

git stash запрещён, пока параллельно работают несколько копий. Стек stash один на весь репозиторий: агент A делает git stash push, агент B — git stash pop, и B получает работу A, а свою теряет. 8 сентября 2026 года три агента на четырёх ветках сделали это друг с другом, и в двух копиях из четырёх оказалась чужая работа. Ничего не потерялось, но распутывать вышло дороже самой работы. Агент, которому нужно чистое дерево, сначала коммитит или заводит ещё одну копию.

Так записаны многие правила: рядом с запретом — случай, из-за которого он появился.

Как правка доходит до прода

  1. Агент делает правку в своей ветке и открывает пул-реквест в ветку staging.
  2. Новое поведение я прошу прятать за флаг, который могу сам включить или выключить на стенде.
  3. У каждого пул-реквеста есть свой стенд — живая копия сайта с тестовой базой и девятью тестовыми пользователями с разными ролями.
  4. Автоматика проходит демо-сценарий дважды, на стенде основной ветки и на стенде пул-реквеста, и кладёт в пул-реквест кадры «было / стало» и видео прохода с подписями и озвучкой. Часто я решаю по ним, не открывая стенд.
  5. В staging правки вливаются без согласований. Ночью по всему, что накопилось, прогоняются тесты.
  6. Релиз — отдельный пул-реквест из staging в main. В нём написано, что войдёт, что произойдёт при деплое и как откатываться. Вливается он только после моего «ок».
  7. Новая версия поднимается рядом со старой, и трафик переключается, когда она начинает отвечать. После этого деплой проверяет, что на проде работает именно новый образ. Эту проверку добавили после случая, когда пять слияний прошли с зелёными проверками, а прод два дня отдавал старый фронтенд.
  8. Каждые 5 минут канарейка проходит тесты на живом сайте, в том числе с домашней линии в России: часть поломок видна только оттуда.

Пул-реквест агент открывает, когда работа уже готова, поэтому время до слияния — это в основном время моей проверки. Половина пул-реквестов вливается быстрее, чем за 14 минут, три четверти — в течение часа. Каждый квадратик — один пул-реквест, цвет — сколько он ждал слияния:

до 10 мин — 491 10–60 мин — 346 1–6 ч — 140 6–24 ч — 50 больше суток — 73

1100 пул-реквестов с мая 2026 года, без релизов и обратных слияний.

Одна правка от начала до конца

Вот одна правка из ноября. По отзыву «на экранах слишком много всего» агент начал со страницы партии:

  • убрал баннер «Превратите эту партию в видео»: кнопка «Создать видео» и так стоит под последним ходом;
  • спрятал «+ Блок» и «Сброс» в меню «Раскладка»;
  • в новой раскладке убрал график времени на ходы: время каждого хода уже есть в списке ходов;
  • на телефоне поставил ходы сразу под движком.

В описании пул-реквеста агент отдельно написал, чего не тронул и почему. Например, число линий движка: от него зависит расчёт всего разбора партии и то, сколько линий сохраняется у пользователей. Новую строку «Раскладка» он сразу перевёл на 14 языков, а в корейском заодно убрал два разных слова для одного понятия.

Вот как эта кнопка теперь называется на всех 16 языках:

Раскладка · Layout · Disposición · Disposition · Układ · Düzen · Joylashuv · Орналасу · लेआउट · Tata letak · Bố cục · レイアウト · 레이아웃 · 布局

Сценарий для альбома агент пишет в том же пул-реквесте. Это обычный тест, только вместо проверок в нём подписи к кадрам. Вот его начало:

/*
  Страница партии: меньше всего сразу (аудит интерфейса, 2026-11-04).
    • справа сверху больше нет баннера «Превратите эту партию в видео»:
      кнопка «Создать видео» и так стоит под последним ходом в списке;
    • «+ Блок (3)» и «Сброс» ушли в меню «Раскладка» …
*/
demo('страница партии: меньше всего сразу', async ({ page }) => {
  await page.setViewportSize({ width: 1440, height: 900 });
  await openGame(page);
  await say(page,
    'Партия открывается без баннера про видео. Справа сверху остались только булавка, колонки и «Раскладка».',
    'Партия · первый экран');

  await click(page, LAYOUT);
  await say(page,
    'В меню «Раскладка» убранные блоки и сброс. Блоки названы по именам, а не «+ Блок (3)».',
    'Партия · меню «Раскладка»');
  // … ещё пять шагов, последний — на экране телефона
});

Пул-реквест открыт вечером 4 ноября. Через 25 минут к нему пришёл альбом из пяти пар кадров. Вот первая.

Было:

Страница партии до правки: баннер про видео, кнопки «+ Блок» и «Сброс», график оценки и график времени

Стало:

Страница партии после правки: баннера нет, вместо кнопок меню «Раскладка», сразу под графиком оценки идут ходы

Ещё сценарий записывает видео прохода. Подписи из say() озвучивает наш сервис синтеза речи, он работает на NAS. По-русски говорит модель Silero, по-английски — Kokoro. Готовое видео приходит мне в Telegram. Ниже тот же проход: кадры из альбома, подписи из сценария и тот же голос.

Утром 5 ноября правка ушла в staging, а через два часа — на прод, в одном релизе с тремя другими. Описание релиза агент пишет по одной схеме: что входит, что произойдёт при выкатке и как откатываться. Вот релиз через пару дней, сокращённо:

Что входит

  • #1255: записи сессий Umami хранятся 90 дней. Каждый час скрипт уборки удаляет то, что вышло за срок.
  • #1256: миграция 167 удаляет пустую старую подпись функции, оставленную в 166 на минуты раската.

Что произойдёт при выкатке

  • Деплой бэкенда применит миграцию 167. Текущий код на проде вызывает только новую подпись, старую не вызывает никто.
  • Поведение сайта не меняется.

Откат. Только вперёд: образ без 167 на схеме с 167 стартует, а удалённая функция ему не нужна.

Правила для агента

Главная инструкция для агента, файл CLAUDE.md, выросла до 177 тысяч символов, и треть в ней была про коня — персонажа тренера. Её разрезали на 21 правило по частям кода. Правило про переводы агент видит, только когда трогает файлы переводов, правило про дизайн-систему — когда трогает интерфейс.

Вот часть списка: файл правила и к каким файлам кода он подключается.

backend.md            backend/**
i18n.md               *.tsx, frontend/messages/**
design-system.md      frontend/src/**/*.tsx, *.css
demo-scenarios.md     frontend/tests/demo/**
stockfish.md          движок и скрипты обновления
routines.md           scripts/routines/**
ci.md                 .github/**, стенды
coach-knight.md       всё, где есть «knight»: 798 строк про коня
… и ещё 13

Почти у каждого правила записано, после какой ошибки оно появилось. Несколько примеров:

  • Всё, что читает человек, агент пишет по-русски. Правило появилось после того, как английское описание пул-реквеста целиком ушло в рабочий чат в Telegram.
  • Тексты интерфейса проверяются на нейрослоп: тройки, парные отрицания, один ритм на все строки. Список появился после восьми пул-реквестов с репликами ботов, которые я вернул с пометкой «проверь на нейро слоп».
  • Каждый экран, который можно увидеть, приходит с демо-сценарием в том же пул-реквесте. Запасной «общий проход» по сайту убрали специально: без своего сценария альбом выглядел как проверка, хотя ничего не проверял.

Тесты и проверки

В проекте около 2600 тестов бэкенда, 5160 тестов фронтенда, 164 теста в браузере и 467 демо-сценариев для кадров «было / стало». Ещё 37 скриптов в CI проверяют сам код, у части из них есть собственные тесты.

Пример — переводы. Если в пул-реквесте меняется английская строка, в нём же должны поменяться все 14 переводов. Переводы делает отдельный агент: у него есть таблица обращения для каждого языка, глоссарий и список ловушек формата. В октябре он за один прогон обновил 4200 строк, которые отстали от русского и английского.

Задачи по расписанию

Около двадцати задач работают без меня, по расписанию, в контейнере на домашнем сервере. Самые полезные:

  • Раз в неделю приходит отчёт по трафику, пользователям, оплатам, поиску и ошибкам. В конце модель называет узкое место недели и две-три задачи на фокус.
  • Каждое утро — разбор ошибок за сутки: что завести задачей, что поднять мне, что пропустить.
  • Слежка за конкурентами. Пишет, только когда у кого-то что-то поменялось.
  • Продуктовый аналитик раз в неделю приносит 3⁠–⁠5 предложений. Сам он их не реализует.
  • Когда выходит новая версия Stockfish, задача обновляет движок, заново калибрует ботов и открывает черновик пул-реквеста. Раньше о новой версии я узнал от человека, который читает новости, почти через месяц после выхода.
  • Каждую неделю подтягиваются новые партии мастеров для каталога.
  • Агент Dispatch каждые 10 минут берёт задачу из трекера, делает её в своей копии репозитория и открывает пул-реквест. Таких пул-реквестов уже 71.

За самими задачами следит ещё одна: если какая-то перестала запускаться, я об этом узнаю.

Мой день

Работаю примерно с 8 утра до 7 вечера. Сложные задачи стараюсь решать с утра, на вечер оставляю что-то попроще. Задачи ставлю и разбираю весь день. Когда агентам ничего от меня не нужно, обсуждаю с Claude в браузере общие темы, смотрю конкурентов или играю в шахматы и заодно тестирую сервис.

пн 0:00 — 0 пн 1:00 — 0 пн 2:00 — 0 пн 3:00 — 0 пн 4:00 — 0 пн 5:00 — 0 пн 6:00 — 0 пн 7:00 — 1 пн 8:00 — 0 пн 9:00 — 8 пн 10:00 — 12 пн 11:00 — 46 пн 12:00 — 72 пн 13:00 — 58 пн 14:00 — 55 пн 15:00 — 55 пн 16:00 — 52 пн 17:00 — 61 пн 18:00 — 25 пн 19:00 — 16 пн 20:00 — 13 пн 21:00 — 14 пн 22:00 — 15 пн 23:00 — 5 пн вт 0:00 — 14 вт 1:00 — 3 вт 2:00 — 2 вт 3:00 — 0 вт 4:00 — 0 вт 5:00 — 0 вт 6:00 — 0 вт 7:00 — 0 вт 8:00 — 3 вт 9:00 — 16 вт 10:00 — 37 вт 11:00 — 31 вт 12:00 — 58 вт 13:00 — 59 вт 14:00 — 76 вт 15:00 — 46 вт 16:00 — 20 вт 17:00 — 15 вт 18:00 — 18 вт 19:00 — 23 вт 20:00 — 23 вт 21:00 — 6 вт 22:00 — 6 вт 23:00 — 1 вт ср 0:00 — 0 ср 1:00 — 0 ср 2:00 — 0 ср 3:00 — 1 ср 4:00 — 0 ср 5:00 — 0 ср 6:00 — 0 ср 7:00 — 3 ср 8:00 — 5 ср 9:00 — 19 ср 10:00 — 39 ср 11:00 — 28 ср 12:00 — 54 ср 13:00 — 49 ср 14:00 — 49 ср 15:00 — 42 ср 16:00 — 39 ср 17:00 — 51 ср 18:00 — 29 ср 19:00 — 23 ср 20:00 — 22 ср 21:00 — 33 ср 22:00 — 19 ср 23:00 — 16 ср чт 0:00 — 45 чт 1:00 — 12 чт 2:00 — 3 чт 3:00 — 3 чт 4:00 — 3 чт 5:00 — 1 чт 6:00 — 0 чт 7:00 — 8 чт 8:00 — 65 чт 9:00 — 48 чт 10:00 — 41 чт 11:00 — 60 чт 12:00 — 32 чт 13:00 — 62 чт 14:00 — 46 чт 15:00 — 67 чт 16:00 — 47 чт 17:00 — 24 чт 18:00 — 20 чт 19:00 — 33 чт 20:00 — 22 чт 21:00 — 26 чт 22:00 — 9 чт 23:00 — 7 чт пт 0:00 — 1 пт 1:00 — 0 пт 2:00 — 5 пт 3:00 — 3 пт 4:00 — 0 пт 5:00 — 0 пт 6:00 — 0 пт 7:00 — 21 пт 8:00 — 19 пт 9:00 — 21 пт 10:00 — 31 пт 11:00 — 26 пт 12:00 — 32 пт 13:00 — 34 пт 14:00 — 32 пт 15:00 — 19 пт 16:00 — 18 пт 17:00 — 16 пт 18:00 — 19 пт 19:00 — 14 пт 20:00 — 21 пт 21:00 — 11 пт 22:00 — 8 пт 23:00 — 2 пт сб 0:00 — 5 сб 1:00 — 0 сб 2:00 — 1 сб 3:00 — 0 сб 4:00 — 0 сб 5:00 — 2 сб 6:00 — 4 сб 7:00 — 4 сб 8:00 — 2 сб 9:00 — 8 сб 10:00 — 25 сб 11:00 — 10 сб 12:00 — 21 сб 13:00 — 20 сб 14:00 — 8 сб 15:00 — 8 сб 16:00 — 14 сб 17:00 — 8 сб 18:00 — 4 сб 19:00 — 4 сб 20:00 — 1 сб 21:00 — 7 сб 22:00 — 10 сб 23:00 — 4 сб вс 0:00 — 0 вс 1:00 — 0 вс 2:00 — 0 вс 3:00 — 0 вс 4:00 — 0 вс 5:00 — 5 вс 6:00 — 5 вс 7:00 — 7 вс 8:00 — 5 вс 9:00 — 1 вс 10:00 — 4 вс 11:00 — 3 вс 12:00 — 14 вс 13:00 — 3 вс 14:00 — 13 вс 15:00 — 7 вс 16:00 — 5 вс 17:00 — 8 вс 18:00 — 0 вс 19:00 — 7 вс 20:00 — 5 вс 21:00 — 5 вс 22:00 — 6 вс 23:00 — 8 вс 0:00 3:00 6:00 9:00 12:00 15:00 18:00 21:00 меньше больше

Коммиты по дням недели и часам, по Москве, с мая 2026 года. Больше всего — в будни днём, в выходные заметно меньше, ночью почти ничего: агенты работают, пока работаю я.

Что ломалось

Чаще всего — сеть в России. Бывали проблемы с сетью в дата-центре. Однажды сервер перезагрузили, сеть поднялась не в том порядке, и сервисы не смогли сами запуститься после перезагрузки. Это сразу исправили.

Из серьёзных случаев:

  • 3 июля агент Dispatch счёл свою правку тривиальной, проверки были зелёными, и правка влилась сама. На проде опустели все шахматные доски, на 1 час 45 минут. Заметил пользователь, а не мониторинг. После этого появились тест, который считает 64 клетки на доске, и канарейка, а правки в коде доски больше не вливаются без меня.
  • В начале 2026 года, когда агенты были слабее, один решил, что кэш оценок позиций не нужен: он ведь сам соберётся, если провести достаточно анализов. И удалил больше 300 миллионов записей. Этот кэш мы когда-то загрузили из открытой базы оценок Lichess, из неё же его и восстановили. На это ушло несколько часов, и всё это время анализ партий шёл медленнее: позиции, которые раньше брались из кэша, приходилось считать заново.

Вот как прошло 3 июля, по минутам (время UTC):

  • 09:37 — агент Dispatch сам вливает свой пул-реквест: правка «тривиальная», CI зелёный.
  • 09:56 — новый образ на проде, доски пустеют на всём сайте.
  • 11:15 — другой деплой пересобирает и снова выкатывает сломанный main.
  • ~11:30 — пользователь пишет «доска исчезла».
  • 11:33 — причина найдена, открыт исправляющий пул-реквест.
  • 11:42 — рядом со сломанной версией вручную поднята последняя рабочая, трафик переключился, доски вернулись.
  • 11:47 — исправление на проде.

Сломала всё одна строка. Агент добавил защиту от доски нулевой ширины:

if (!isBoardWidthValid(boardWidth)) return <div style={customBoardStyle} />;

Но ширину в этот компонент не передаёт никто: доска сама меряет свой контейнер. Пустое значение не проходило проверку, и вместо каждой доски рисовался пустой блок. Страница при этом отвечала 200, ошибок в консоли не было, а тесты проверяли только, что ошибок нет и нужный текст на месте.

В остальном всё работает стабильно: на каждую правку прогоняются тесты и сценарии, а канарейка круглые сутки проходит их на живом сайте. С августа откатить пришлось всего две правки.

Сколько это стоит

Подписку Claude Ultra за $200 в месяц я использую на все 100%. Для самого сервиса нужны два сервера: так в России стабильнее соединение. Без этого хватило бы одного мощного или нескольких попроще для надёжности.

Сборки идут на домашнем сервере (NAS). Он намного мощнее стандартных раннеров GitHub. На нём постоянно работают стенды и staging, а через Tailscale я захожу на них откуда угодно. Раньше часть проверок шла на раннерах GitHub, и одна семисекундная проверка на каждый пуш стала самой большой строкой в счёте: GitHub округляет каждый запуск до минуты.

Что из этого можно взять себе

  • Пусть агент показывает результат: кадры, видео, живой стенд. Посмотреть на правку быстрее, чем читать её описание.
  • Новое поведение прячьте за флаг, который вы сами включаете.
  • Проверяйте деплой по тому, что реально работает на сервере, а не по галочкам в CI.
  • Записывайте к каждому правилу, после какой ошибки оно появилось.
  • Ведите столько сессий, сколько помещается в голове. У меня это пять.
Помогу выстроить такой процесс в вашем проекте: менторство.