Агенты работают,
даже когда я сплю

если есть бэклог или есть что улучшать —
в том числе по секьюрити

L1
L2
L3
L4
L5
L6
L7
L8
L9

обо мне

Константин Рядов

Константин Рядов

Сооснователь и CTO Bulka.AI — AI-копилот для платёжных операций.

JVM-инженер, ставший AI-инженером: 19 лет в платежах, затем безопасность JVM в Azul, теперь агенты. SDLC — моя жизнь.

блог · подкаст · музыка · github.com/kryadov

откуда этот доклад

Для заказчиков — то, что нельзя показать.
Для себя — то, что можно

Для заказчиков: внутренние продукты

Делаю AI-агентов для внутренних продуктов заказчиков. Один из публичных примеров:

Azul Intelligence Cloud AI Assistant (23.09.2026): вопросы на естественном языке о Java в проде, где прячутся риски по лицензиям и безопасности. Режим read-only.

Для себя: выйти за рамки

Во всех смыслах: другой домен (игры), другой стек (3D в браузере), другие правила (никакого бюджета на инфраструктуру).

Без цели заработать: ни магазинов, ни рекламы, ни монетизации. Игры бесплатные.

Всё, что тут показываю, открыто: код, git log, демо.

правила эксперимента

Вериги: $20 + $100

$20
подписка Claude Pro, с её лимитами
$100
OpenRouter: GLM, Kimi — open-weight модели

Заплатить за Max — не проблема. Проблема в том, что тогда не узнаешь главного.

Вопрос, ради которого всё затевалось

Для какого класса задач effort medium даёт то же, что x-high?

Лимит заставляет считать: дешёвая модель и низкий effort везде, где их хватает, а дорогой — только там, где без него никак.

карта местности

Лестница L1 → L9

Лестница уровней AI-разработки: L1 ручной код, L2 бесплатные чаты, L3 платные чаты, L4 агент под присмотром, L5 полный доступ, L6 параллельные агенты, L7 команда агентов, L8 рой, L9 экосистема

Девять уровней эволюции AI-разработки — по курсу Алексея Литвинова «AI-Assisted Engineering»: alekseilitvinau.com/edu

о чём доклад

Три проекта, три ступеньки

L4→L5

Race the City

июль 2026

Гонки по любому городу мира. Один агент с полным доступом, релиз каждые полчаса.

узкое место — я сам

L5→L6

claude-remote-vm-dev

август 2026

Сессии Claude Code на VM внутри периметра. Работают, пока ноутбук закрыт.

инфраструктура для следующей ступеньки

L6→L7

itffm 🍄

сентябрь 2026

Грибной лес по реальному месту. Параллельные агенты в worktree, модели по ролям.

узкое место — ревью

QR: github.com/kryadov/race-the-cityрепозиторий

ступенька L4 → L5 · Race the City

Введи название города и поезжай

  • Low-poly версия реального города: дороги, дома, мосты, рельсы, вода, рельеф
  • 19 машин, соперники, заезды на время, автопилот
  • Трафик, пешеходы, трамваи, корабли, погода, день и ночь
  • Всё в браузере, без бэкенда

▶ race-the-city.games

демо вживую:

Батуми → 🎲 случайный город → V неоновый вид

Race the City в цифрах (git log)

164 релиза за первые три дня

100
тегов-релизов в первый день, 16 июля
435
коммитов, 360 из них за первые 4 дня
28.6k
строк TypeScript в src/
104
файла тестов (Vitest)

v0.1 → v0.149: 310 тегов, каждый тег — задеплоенная сборка и GitHub Release.

352 из 435 коммитов с соавтором Claude Opus. Мой вклад: спеки, плей-тесты и решения.

почему это вообще возможно

Весь мир — это исходные данные

Nominatim«Batumi» → координаты
→
OverpassOSM в bbox 1 км
→
Terrain Tilesрельеф AWS, формат Terrarium
→
Three.jsмеши, коллизии, граф дорог
→
IndexedDBгород в кеше

Что даёт

  • Бесконечный контент без левел-дизайнеров
  • Агенту есть с чем работать: формат данных стандартный и хорошо описанный

Подвох

  • Overpass отвечает 429 → таймаут 30 с, три зеркала, протухший кеш как запасной вариант
  • Грязные данные: вода на 4 м выше реки, мосты без высоты

архитектура, не про агентов

OSM + высоты + погода без сервера

openstreetmap.orgNominatim, Overpass
AWS Terrain TilesS3, Terrarium PNG
Open-Meteoживая погода
→
браузерThree.js + IndexedDB, статика на Pages

$0 и ноль ops

Нечего мониторить, патчить и масштабировать. Нагрузку раздаёт CDN, данные отдают открытые API. Нет счёта за инфраструктуру → не нужно монетизировать.

Нечего утечь

Нет базы, нет аккаунтов, нет секретов. Прогресс игрока остаётся в его браузере.

Деплой = тег

Откат — на предыдущий тег. Форк — и у тебя своя копия игры, тоже бесплатно.

чтобы это работало, а не падало

Цена: ты гость в чужой инфраструктуре

  • Только API без ключей. Ключ в статике сразу становится публичным
  • Уважай usage policy. Nominatim: 1 запрос в секунду; Overpass отвечает 429
  • Кеш обязателен. Город, загруженный один раз, живёт в IndexedDB
  • Зеркала и таймауты. 3 Overpass-зеркала, 30 с, протухший кеш как запасной
  • Честный fallback. Нет рельефа → плоская земля; нет OSM → процедурный лес
  • Атрибуция. Данные OSM под ODbL, © OpenStreetMap contributors

И бонус для агентов

Нет сервера → нет миграций, окружений и секретов. Агенту можно доверить релиз целиком.

Границы слоёв записаны в AGENTS.md: geo/ не знает про Three.js, world/ не знает про сеть.

темп как часть архитектуры

Релиз каждые ~30 минут — и не развалиться

Версия = деплой

Каждый bump — тег, Release и запись в CHANGELOG.md с пометкой 👀 «что проверить при плей-тесте».

boot-check

Тесты зелёные, типы чистые, сборка прошла — а на экране чёрный экран. Headless Chrome грузит собранное приложение и падает, если оно не стартовало.

TODO как живой бэклог

Плей-тест → баг записан сразу → «сначала баги, потом полировка». Роадмапа на бумаге нет.

кто на самом деле писал коллизии

Где агент ошибался — и как это ловили

«Невидимая стена посреди обычной дороги»
баг-репорт с плей-теста, Париж, остров Сите, v0.148.1

  • Агент добавил в паузу отладочный readout: solid: quay@1.3m
  • Причина: ограничение по набережной было только снизу. 1593 стены → 25
  • Тот же класс бага всплыл в третий раз

Вывод

Инвариант записан прямо в TODO: solid ⇒ visible.

Агент не помнит прошлую сессию. Помнит репозиторий: AGENTS.md, TODO, CHANGELOG, тесты.

процесс L4 → L5

Спека → план → код → релиз

brainstormдиалог: что строим и зачем
→
specdocs/superpowers/specs
→
planзадачи с тестами
→
code + TDDагент
→
play-testчеловек

Делегировалось

  • Код, тесты, рефакторинг
  • Релизы, CHANGELOG
  • Диагностика по репорту

Оставалось за мной

  • Что строим и в каком порядке
  • «Посмотреть глазами»
  • Когда остановиться

Бонус: агент в CI

Комментарий /oc в issue или PR → opencode на GLM через OpenRouter, с теми же superpowers-скиллами.

почему понадобилась следующая ступенька

Узкое место — я и мой ноутбук

Коммиты Race the City по часу суток, всего 435

137 коммитов — с полуночи до 7 утра.

Сессия агента живёт, пока открыт ноутбук. Закрыл крышку — работа встала.

Агенты должны работать, пока я сплю. А не я вместе с ними.

QR: github.com/kryadov/claude-remote-vm-devрепозиторий

ступенька L5 → L6 · claude-remote-vm-dev

Сессии Claude Code на VM внутри периметра

  • tmux держит каждую сессию, systemd + linger переживают дисконнект и ребут
  • Каждая сессия — свой git worktree и своя ветка: агенты не делят индекс
  • rd-tui: список сессий, attach, stop, новая
  • Провайдер на выбор: Vertex AI, Bedrock, Anthropic API
  • GitLab и GitHub, включая Enterprise Server
$ rd-start backend --session new-search
$ rd-start backend --session login-fix \
    --type bugfix
$ rd-start backend --session try \
    --provider bedrock
# закрыть ноутбук 💤
$ rd-list --all

github.com/kryadov/claude-remote-vm-dev

почему VM, а не просто облачный агент

Для корпоративной разработки

Периметр

Код и токены не уезжают из сети организации. VM — граница изоляции, агент спокойно гоняет docker compose.

Секреты

Креды провайдера лежат в файле с правами 0600. В tmux уходит только имя провайдера, в ps их не видно.

Грабли Bedrock

Без закреплённых моделей алиас opus тихо падает на младшую модель. WebSearch там недоступен.

Один bootstrap-скрипт, идемпотентный. Спека 15 августа, рабочая версия через две недели. Тоже с агентом.

QR: коммит 1fd1933 в kryadov/race-the-cityкоммит

«в том числе по секьюрити»

Что дать агенту, пока сплю: npm audit 9 → 0

race-the-city v0.149.1, 15 октября 2026, один коммит:

  • 9 уязвимостей → 0: 2 critical, 3 high, 4 moderate, все в dev/build-тулчейне
  • Vite 5 → 8, Vitest 2 → 5: RCE в tinypool, path traversal в @vitest/mocker, утечка в dev-сервере esbuild
  • Breaking change починен по дороге: Vite 8 собирает на Rolldown, manualChunks → codeSplitting
  • boot-check получил BOOT_CHECK_PORT, чтобы параллельные чекауты не конфликтовали

Почему это идеальная задача на ночь

  • Чёткий критерий: npm audit = 0
  • Страховка: тесты + boot-check
  • Скучно человеку, не скучно агенту

В CHANGELOG: 👀 «ничего не должно выглядеть иначе».

QR: github.com/kryadov/itffmрепозиторий

ступенька L6 → L7 · itffm 🍄

Тихая прогулка по настоящему лесу

  • Игра от первого лица про сбор грибов плюс энциклопедия
  • Лес строится по реальному месту: тот же OSM + Terrain Tiles
  • Подберёзовик растёт под берёзой, вешенка на валежнике
  • Хижина, костёр, рыбалка, квесты, квадрокоптер, шахта

▶ kryadov.github.io/itffm

3D-моделей нет вообще

data/species/*.yaml
 ├─ morphology → 3D-модель
 ├─ ecology   → где и когда растёт
 └─ name/text  → энциклопедия

Новый вид — это строчка данных, а не задача для 3D-художника.

itffm в цифрах (git log)

17 дней от спеки до v0.103

375
коммитов, 150 из них за второй день
126
тегов-релизов, v0.1 → v0.103
57
видов в YAML: грибы, ягоды, травы, находки
109
файлов тестов, 25k строк TS

9 спек, 6 планов. Спека начинается с раздела 0: «где код оказался умнее спеки».

Перенесено из RTC без изменений: boot-check, CHANGELOG, FEATURES.md, деплой по тегу.

побочный эффект №1

«А можно карту побольше?» → бесконечный лес

Race the City, v0.92мир — квадрат 2×2 км вокруг центра, на краю пустота
→
просьба игроков«расширьте радиус от центра»
→
itffm, 10 сентябрялес нарезается чанками, ходи в любую сторону

Как это решалось

Брейншторм вечером, дальше 6 часов автономной работы, пока я спал. В спеке записано: решения, не утверждённые до сна, агент принимает консервативно и выносит в follow-up, а не угадывает.

Что получилось

Чанк, для которого OSM или рельеф не загрузились, достраивается процедурно с того же seed. Стены нет, ошибки на экране нет.

L6 → L7 на практике · itffm, git log

11 сентября: одно решение, семь веток

06:04план: 11 баг-репортов с плей-теста + старые TODO одной пачкой → моё решение: параллельно
06:12убран экран дисклеймера, мешавший на мобильных
06:22рельсы проваливались в рельеф, деревья росли сквозь путь
06:25швы земли между чанками
06:27коллизия двери хижины
06:38Esc открывает меню паузы
06:42синтезированный звук воды: ручей слышно раньше, чем видно
06:54perf: отсечение по дистанции

каждая строка после плана — мерж своей ветки worktree-agent-<id>

Моё — одно решение

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

Claude Code — всё остальное

  • 7 субагентов в одном сообщении
  • 7 worktree и 7 веток
  • тесты в каждой, 7 мержей по одной

что на самом деле поменялось между L6 и L7

Один примитив — git worktree — и два оркестратора

L6

claude-remote-vm-dev

я → rd-start … --session A
я → rd-start … --session B
я → rd-start … --session C

Worktree на каждую сессию написал я. Сколько агентов и над чем — решает человек.

L7

itffm, Claude Code

я → «параллельно»
агент → Agent(isolation: worktree) ×7
агент → merge ×7

Worktree создаёт инструмент. Как разложить работу — решает агент, я только разрешаю.

Где запущен агент — уже не важно:

своя VMtmux + systemd
облакоclaude.ai/code
телефонпульт к любой из них

новое узкое место

Что тесты не ловят

  • Вешенка рисовалась плоским блином: генератор ставил ножку по центру
  • Химеры: шляпка 25 см на ножке 6 см
  • 243 гриба по 5 мешей → тысяча draw calls, повис даже headless-браузер

Ответ — инструмент «посмотреть глазами»: npm run silhouette-sheet, все силуэты видов на одном листе.

Узкое место сместилось

С «написать код» на «проверить результат».

Агенты пишут быстрее, чем я успеваю посмотреть. Ревью и визуальная проверка — это теперь главная работа человека.

возвращаемся к вопросу про вериги

Medium или x-high: зависит от класса задачи

класс задачипримергипотеза
Исполнение по планузадача из плана с готовыми тестамиmedium ≈ x-high, а часто хватает и GLM/Kimi
Механика по образцуещё одна машина, ещё один вид гриба в YAMLmedium ≈ x-high
Диагностиканевидимая стена на набережной, третий разx-high окупается
Спека и планбесконечный мир, квесты, шахтаx-high и дорогая модель

Чем лучше спека и тесты, тем меньше нужен effort на исполнении. Платишь один раз на этапе плана.

побочный эффект №2

Лес на шаренном экране против крика на синке

Синк стартапа. Фаундеры орут друг на друга. Кто-то шарит экран, а там тихий лес: шаги, птицы, ручей, гриб под берёзой.

Градус спадает.

Такого в спеке не было.

Вывод для продукта

Ценность находится там, где её не планировал. Дешёвый релиз (тег → Pages) позволяет быстро показать вещь людям и посмотреть, как они используют её на самом деле.

итого по ступенькам

Что поменялось от проекта к проекту

Race the Cityremote-vm-devitffm
СтупенькаL4 → L5L5 → L6L6 → L7
Агентоводин, в моём терминалеN сессий на VMсубагенты в worktree + облако
МоделиOpus на всёлюбой провайдерOpus планирует, Sonnet делает
ПамятьAGENTS.md, TODOветка = сессияCLAUDE.md, спеки с разделом 0
Узкое местомой сонноутбукревью и «посмотреть глазами»

что можно унести в свою команду завтра

Пять правил

  • Спека до кода. Агент исполняет план. Пустой промпт порождает импровизацию
  • Контракт в репозитории. AGENTS.md / CLAUDE.md, инварианты, грабли. Агент не помнит, репозиторий помнит
  • Проверка запуска, а не только тестов. boot-check ловит то, что зелёный CI пропускает
  • Один агент — один worktree. Без этого параллельность превращается в конфликты
  • Инструменты для глаз. Сжимайте ревью: контактные листы, readout, 👀 в changelog

что дальше

L8 и L9: рой и экосистема

L5полный доступ
L6параллельно
L7я здесь
L8рой
L9экосистема

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

Из бэклога

  • Живая погода и сезонность из реальных данных
  • Новые слои OSM
  • LAN-мультиплеер в RTC (ветка уже есть)
  • Фото видов через ETL в itffm

спасибо!

Вопросы?

QR: github.com/kryadov/race-the-city

🚗 Race the City

kryadov/race-the-city
играть: race-the-city.games

QR: github.com/kryadov/itffm

🍄 itffm

kryadov/itffm
играть: kryadov.github.io/itffm

Константин Рядов · github.com/kryadov