Автономный конвейер дня

Схема контура и развилки · задача в ПФ #10175 · обновлено 2026-08-19 · развилки 1–11 утверждены

✅ решено 🟡 предложено, ждёт «да» ⬜ открыто ⛔ блокер

Смысл затеи: убрать диспетчеризацию кусками по 15 минут через весь день. Участие Антона сжимается в два окна — согласование состава и один блок ответов, — плюс приёмка готовой работы тогда, когда ему удобно.

Как это работает целиком

Один день конец-в-конец, чтобы было видно стыки.

Контур дня

Вход · кодовое слово

Антон открывает сессию и говорит кодовое слово

Переключатель режима: сессия понимает, что запускается конвейер, а не идёт обычный разговор. Слово произносится перед фазой 1, дальше весь разбор идёт в этой же сессии — повторять его не нужно.

Где: спецпроект «Автономный конвейер»

Фаза 1 · вечер

Согласование состава

Обсуждаем, что делается завтра: проекты, сервисы, доработки. Задаём приоритет линий — он решает, что успеет, если лимита не хватит на всё.

Опирается на: план дня из Mini App + добавленное в чате · На выходе: очередь работ в демоне

Фаза 2 · ночь

Разведка боем

Не «подумать, какие могут быть вопросы» — так получаются выдуманные. Линия прогоняет работу до конца черновой реализацией в изолированной копии, без деплоя, и записывает каждое место, где реально уперлась. Плюс планирует наперёд: где вопросы возникнут в принципе.

Глубина — до первого упора, который правда требует Антона. Дальше линия не гадает «а что бы он ответил», а фиксирует упор и идёт к следующей ветке работы.

Не деплоит и не трогает боевые данные — продукт фазы это черновик и список упоров · Шаги с чекпоинтом, чтобы пауза по лимиту стоила не больше одного шага

Ночные вопросы в Кэтчер не уходят вообще — их место только утренний перечень. Ночью человек спит; дневные вопросы и ночные это разные категории.

Фаза 3 · утро, 1–2 часа

Один блок ответов

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

Рядом с вопросами — свёрнутый список «решил по умолчанию так»: всё, что не спросили. Запрет утаивать сильнее, чем экономия вопросов.

Чат остаётся для разбора того, что не влезло в кнопки

Фаза 4 · день

Автономная реализация

Не «допил черновика», а полноценная работа с уже снятой неопределённостью. Обращения — только через судью и только когда без Антона правда нельзя. Проблемы решаются автономно по каталогу тупиков.

Фаза 4б · по факту завершения, не «вечером»

Проверка, деплой, приёмка

Календарный вечер тут ни при чём — линия может закончить в любое время. Перед объявлением «готово» линия сама проверяет результат: тесты после слияния, чек-лист проекта, и там, где есть интерфейс — поднимает headless-браузер и прокликивает сценарии.

Задеплоила — сразу пишет отчёт в свою задачу ПланФикса простым человеческим языком и сообщает Антону «готово, можно принимать». Он садится, когда появится время, проверяет, принимает работу и даёт обратную связь.

Журнал линии — экран приёмки: что спросили и что ответил Антон · что решено по дефолту из-за молчания · где линия решила сама · что не влезло

В Кэтчер: «готово, можно принимать» + ссылка на журнал + кнопки «Принял» / «Есть замечания». Нажал «Принял» — ветка и рабочая копия удаляются. Не принял — они ждут, автоудаления по таймеру нет.

Chrome на сервере будет — его приносит Playwright: тот же Chromium, только управляемый кодом, кликает и снимает скриншоты так же. Не переносится именно расширение claude-in-chrome, ему нужен живой рабочий стол.

Роли внутри линии

Один агент на всё — неправильно: тот, кто писал код, плохой проверяющий собственного кода. Линия это цепочка ролей, каждая своим субагентом.

Строить с нуля не надо: в проекте уже есть code-reviewer, test-reviewer, qa-checker, skeptic, reality-checker. Задача — собрать их в цепочку линии.

Три уровня строгости — полная цепочка нужна не всем

Клики в браузере — на всех трёх уровнях. Есть интерфейс — он прокликивается всегда. Уровни различаются только составом проверяющих ролей.

Кто проверит, что уровень выбран верно

Проверка Telegram

Задач по Телеграму много, без способа «зайти и проверить» линия их не закроет.

Номер под тестовый аккаунт есть — из проекта Аутрич (Антон, 2026-08-19).
⛔ Сломать Аутрич нельзя: берём свободный номер, а не задействованный в рабочих сценариях · файлы сессий и конфиги Аутрича не трогаем вообще, своя папка и свои креды · перед реализацией читаем его код, а не действуем по аналогии.
Telegram Web через Playwright рассматривался и отклонён: сессия протухает и требует ручного кода, для автономной работы негодно.

Путь вопроса

Речь про вопросы, возникшие в ходе уже запущенной работы. Судья — отдельный субагент, не исполнитель: исполнитель всегда заинтересован не блокироваться и будет занижать важность.

1. Ответ уже есть?

Во второй мозг и проектную память ходит сам исполнитель — это его обязанность, а не судьи. Судья существует потому, что исполнитель может забыть или срезать угол: он перепроверяет, что тот реально сходил.

Нашли → вопрос не задаётся, ответ идёт исполнителю со ссылкой на источник.

Не сходил → судья возвращает наработку с конкретной причиной. Не бесконечно: счётчик возвратов в журнале, максимум 2 по одному поводу, Каждый возврат стоит лимита — счётчик ровно поэтому.

Что происходит на третий раз — не «как получится», а по той же анкете: развилка обратима и дёшева → судья ставит точку сам и пишет это в журнал как своё решение. Развилка необратима или дорога → эскалация Антону обязательна, даже когда возвраты исчерпаны. Исчерпание меняет только то, кто закрывает мелочь, — права самому решить важное оно не даёт.

Честно: когда судья решает сам, по результату получается то же, что сделал бы исполнитель — решение принято без Антона. Ценность в другом: судья не заинтересован не блокироваться, его решение фиксируется явно с обоснованием, а не растворяется в коде, и попадает в утренний список «решил без тебя». На мелочи разница невелика — смысл судьи в том, чтобы важное не проскочило.

2. Стоит ли вопрос того — и кто проверит обратный перекос

Критерий: разные ответы дают разную реализацию. Числовой нормы вопросов нет намеренно — норма заставит выкидывать важное ради счёта.

Опасность симметричная: линия может решить «не стоит», а стоило. Поэтому исполнитель обязан регистрировать каждую развилку, а не только вынесенные — с дефолтом и причиной, почему не спросил. Судья смотрит весь список и вправе поднять любую запись в вопрос.

Хук на границе «работа завершена» не пропускает линию с пустым журналом развилок — пустой журнал считается несделанной работой.

А если исполнитель срежет угол и просто не запишет? Полной защиты нет — честно. Есть три слоя: хук ловит журнал, подозрительно короткий относительно объёма изменений · судья сверяет журнал с диффом и возвращает то, что не объяснено · журнал и список «по умолчанию» читает человек на приёмке. Гарантии не даёт ни один, вместе они делают срезание угла дорогим и заметным.

Исполнитель запускает субагентов — это прямое средство против переполнения контекста, а переполненный контекст и есть источник ошибок вроде «забыл записать».

3. Дефолт и таймаут

Вопрос без предложенного дефолта задавать нельзя: «вижу развилку, предлагаю так; не ответишь за N — сделаю так». Молчание становится осознанным согласием, а не тупиком. Таймаут — параметр вопроса, считается по цене отката:

Ночью таймауты не тикают. Вопросы ночной фазы копятся к утреннему блоку — иначе конвейер за ночь примет пачку решений по молчанию спящего человека.

4. Доставка и ответ

Чат-сессия

Утренний блок и весь разбор.

Кэтчер

Дневные вопросы, когда Антона нет в чате.

Как ответ привязывается к вопросу:

Единственное уязвимое место — «напишу сам» + следующее сообщение: постороннее сообщение может съесться как ответ. Защита: режим ожидания живёт ~10 минут и виден в шапке («жду текст по вопросу N · отменить»); получив текст, Кэтчер отвечает «записал как ответ на вопрос N» с кнопкой «нет, это не ответ». Свободный текст активен только для одного вопроса — следующий тап переключает.

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

Оркестратор — два слоя

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

Демон (systemd, сервер)

Тупой и надёжный. Держит очередь на диске, запускает claude -p в папке нужного проекта, следит за живостью, ловит завершение, стартует следующую линию, считает расход, переживает перезагрузку. Ничего не «понимает» — исполняет.

Сессия конвейера

Умная и эфемерная. Живёт в спецпроекте, приходит на согласование состава и утренний блок, разговаривает с Антоном, кладёт решения в очередь и читает состояние. Упала — очередь цела, работы идут.

Для Антона это выглядит ровно как он описал: сказал кодовое слово в проекте конвейера и общается с одной сессией. Разница только в том, где физически живёт очередь.

Линия — последовательность шагов, а не один бесконечный запуск

Отсюда берётся весь контроль. Один запуск = один шаг, между шагами линия отчитывается чекпоинтом, и демон решает, пускать ли дальше. Демону не нужно уметь прерывать работающую сессию — он просто не начинает следующий шаг. Проще и надёжнее.

Исполнитель про лимит не знает и знать не должен — знает демон, и контроль стоит на границе шага. Демон работает круглосуточно: ночная фаза самая тяжёлая, там контроль критичнее всего.

Состояния линии

Работает

Внутри одного проекта — строго одна линия. Разные проекты — параллельно, каждая в своей копии.

Ждёт ответа

Только класс «никогда молча». Остальные вопросы линию не останавливают — она идёт по дефолту после таймаута.

Пауза по лимиту — штатное состояние

Демон — процесс, а не сессия: он просто спит до сброса окна и пробует снова. Ждать, когда вернётся Антон, не нужно.

Зависла — другое состояние

Механизм уже написан и работает в раннере заявок: он не убивает по часам молча, а собирает следы работы (коммиты в ветке, прирост лога), выносит вердикт «двигается / не двигается» и спрашивает Антона кнопками «продолжать / закрывать». Убивается только то, что висит целый рабочий день.

Автономное решение проблем

Оркестратор должен уметь то, что сделал бы Антон за компом — не встать, а придумать, как продолжить. Честная граница: качеством суждения это полностью не гарантируется. Кодом даётся:

Лимиты

Поправка: мы на подписке, а не на API. Стоимость из вывода запуска — не деньги и не счёт, а прокси-метрика расхода. Годится как относительный измеритель «эта фаза тяжелее той», но не как бюджет. Реальные лимиты подписки — 5-часовое окно и недельный потолок, в долларах они не выражены.

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

А если демон промахнулся и лимит кончился посреди шага? Шаг падает, работа откатывается к последнему чекпоинту — потеря не больше одного шага, ровно ради этого они режутся мелко. Демон корректирует оценку этого типа шага вверх: промах становится данными. Сессия никуда не девается — после сброса поднимается через --resume. Промахи системные — сигнал резать шаги мельче, а не наращивать запас.

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

Гейт деплоя

Проверка не прошла — что дальше. Провал гейта означает, что линия не завершена: она не деплоится и не уходит на приёмку, а получает новый шаг «починить» с описанием того, что упало, и идёт на второй круг сама. Человек не участвует. Потолок — 3 неудачных прохода подряд, дальше линия встаёт и Антону уходит вопрос «не могу пройти проверку, падает вот это, пробовал вот это». Провал health-check уже после деплоя — откат на предыдущую версию и тот же шаг «разобраться».

Кто проверит, что не сломалось то, что ломаться не должно — самый слабый узел, отвечаем честно. Регрессия гоняется целиком, а не по месту правки (в Jarvis 2.0 это ~2400 тестов). Сквозные сценарии интерфейса — весь «золотой путь», а не только затронутый экран. Дыра, которую признаём: непокрытое ни тестами, ни чек-листом автоматически не проверится никак — поэтому линия, тронувшая такую область, обязана либо добавить проверку, либо записать в журнал «область без покрытия, проверял руками так-то». Хук перед деплоем требует одного из двух.

Никогда автономно, независимо от чек-листов: движение денег · отправка писем и сообщений наружу от имени Антона · удаление боевых данных · изменение схемы боевой базы · публикация в публичный доступ · правки в ПланФиксе вне задачи своей линии · смена доступов и токенов.

Хуки-контролёры стоят на трёх границах: перед отправкой вопроса, перед объявлением работы завершённой, перед деплоем. Инструкцию в промпте можно не выполнить, хук — нельзя.

Дом конвейера — сервер в Алматы

Мак спит на батарее и для ночной фазы не годится в принципе. Проектируем сразу под сервер. Хождение сервера на Мак — временный костыль на переходный период, а не часть архитектуры: цель — перенести на сервер всё, что осталось на Маке, и убрать зависимость целиком.

Открытые вопросы к механике

Десять развилок — все утверждены 2026-08-19

1 Критерий судьи
Переделано после возражения Антона: в первой версии «да хотя бы на один пункт» пропускало почти всё. Теперь так:
· Вето: есть очевидный дефолт → не спрашиваем, что бы ни говорили остальные пункты. Ответ нашёлся в памяти → тем более.
· Самостоятельные основания дёрнуть — только два: необратимость и «цена ошибки выше цены ожидания».
· «Меняет ЧТО получится» — основание только в связке с тем, что дёшево откатить нельзя.
· Дедупликация: несколько развилок одной темы = один вопрос.
· Днём дёргаем только по двум основаниям; остальное идёт по дефолту и копится в утренний перечень.
2 Канал вопросов
Чат по кодовому слову + Кэтчер с кнопками. Привязка ответа — по id вопроса в кнопке, «напишу сам» и реплай для свободного текста.
3 Значения таймаутов
30 минут / 2 часа / без таймаута — по цене отката. Ночью таймауты не тикают и ночные вопросы в Кэтчер не уходят — только в утренний перечень.
4 Где живёт оркестратор
Демон systemd на сервере + эфемерная сессия конвейера в спецпроекте. Очередь на диске, сессия — только интерфейс разговора.
5 Изоляция линий
git worktree на линию, ветка line/<проект>-<дата>-<слаг>. Не-git проект → копия папки. Внутри проекта — одна линия в любом случае.
6 Учёт лимитов
Считает демон. Метрика — относительная тяжесть фазы плюс факт отказа, не деньги. Порог: не начинать фазу, которая не влезает в остаток окна. Возобновление через --resume.
7 Глубина ночной фазы
До первого упора, который правда требует Антона. Шаги с чекпоинтом. Не все пять проектов сразу — по приоритету, сколько влезает в окно. Ночь не деплоит и боевых данных не трогает.
8 Формат утреннего перечня
Страница со ссылкой, блок на проект, ответы тапом, свободный текст по кнопке. Порядок — по приоритету линий: дошёл до половины — отвечено самое важное.
9 Автодеплой без кнопки
Допуск: тесты после слияния + чек-лист проекта + клики браузером + хук пропустил. Откат по health-check. Список «никогда автономно» — в блоке «Гейт деплоя» выше.
10 Где хранятся решения
<проект>/decisions/<дата>-<тема>.md, одна тема — один файл. Судья читает их наравне со вторым мозгом. Наружу, во второй мозг, уходит только то, что переживает проект — и не молча, а с предложением.

Развилка 11 — чем является линия ✅ решена

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

Цепочка одноразовых запусков — принято

Демон контролирует полностью, лимит считается точно на границах шагов, переживает падение сессии и перезагрузку машины.
Минус: прогрев контекста на каждом шаге — замер даёт ~0,7 условных единиц только на разогрев.

отклонено Живая сессия в цикле

Линия сама себя ведёт, накладных на перезапуск нет, демон дёргается реже.
Минусы: умирает от падения · хуже контролируется по лимиту, нет естественных границ · 7-дневный потолок · требует, чтобы сессия была не занята.

Второй вариант остаётся возможной оптимизацией на потом, когда станет видно, сколько реально съедает прогрев.

Цикл самопроверки — внутри шага, а не между шагами

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