Схема контура и развилки · задача в ПФ #10175 · обновлено 2026-08-19 · развилки 1–11 утверждены
✅ решено🟡 предложено, ждёт «да»⬜ открыто⛔ блокер
Смысл затеи: убрать диспетчеризацию кусками по 15 минут через весь день. Участие Антона сжимается в два окна — согласование состава и один блок ответов, — плюс приёмка готовой работы тогда, когда ему удобно.
Как это работает целиком
Один день конец-в-конец, чтобы было видно стыки.
Вечер. Антон говорит кодовое слово в проекте конвейера. Сессия обсуждает состав завтрашнего дня, расставляет приоритет линий и кладёт очередь в демон. Сессию можно закрывать — очередь живёт на диске.
Ночь. Демон держит несколько слотов сразу — разные проекты идут параллельно, одна линия на проект. Каждую запускает по одному шагу за раз в изолированной копии. Линия работает черновиком, упирается в развилки, каждую записывает в журнал. Вопросы копятся — в Кэтчер ночью не уходит ничего. Между шагами демон смотрит на остаток окна: не влезает — линия ждёт на чекпоинте, влезает — идёт дальше.
Утро. Судья прочёсывает журналы всех линий: сверяет с диффом, проверяет, что в память ходили, дедуплицирует и отбирает то, что правда требует Антона. Работает он всю ночь по мере готовности шагов, а не пачкой в 8 утра: возвраты «схалтурил, доработай» переигрываются ночью. К утру перечень заморожен и состоит только из провалидированных вопросов — Антон никогда не ждёт доработки. Страница с блоками по проектам, варианты на кнопках, свёрнутый список «решил по умолчанию».
День. Ответы уходят линиям, работа продолжается с той же точки — та же сессия через --resume, ничего не переделывается. Новые развилки решаются по дефолту; в Кэтчер прилетает только необратимое и дорогое.
Готово. Линия проходит гейт: регрессия целиком, чек-лист проекта, клики браузером, хуки. Не прошла — линия не завершена: получает шаг «починить» и идёт на второй круг сама, без человека. Прошла — сливает в main, деплоит, пишет отчёт в задачу ПланФикса и шлёт в Кэтчер «готово, можно принимать». Слот освобождается, демон берёт следующую линию из очереди.
Приёмка. Антон садится, когда есть время, смотрит журнал, жмёт «Принял» — ветка и рабочая копия удаляются — или «Есть замечания» и пишет текст: он привязан к id линии, уходит в очередь демона и приходит в ту же сессию через --resume новым шагом. Приёмка ничего не блокирует — слот давно освобождён, остальные линии работают.
Контур дня
Вход · кодовое слово
Антон открывает сессию и говорит кодовое слово
Переключатель режима: сессия понимает, что запускается конвейер, а не идёт обычный разговор. Слово произносится перед фазой 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
Задач по Телеграму много, без способа «зайти и проверить» линия их не закроет.
Мини-эпп — обычная веб-страница, Телеграм для неё только оболочка. Playwright открывает по URL и кликает как любой сайт. Работает уже сейчас.
Бот и его кнопки — программный Telegram-клиент на отдельном тестовом аккаунте: пишет боту, читает ответы, жмёт inline-кнопки, проверяет реакцию. Полноценная эмуляция человека, а не подделка через Bot API. Библиотека — Pyrogram, как в Аутриче: вторую в воркспейс не тащим.
Боевого бота не трогаем — проверка на тестовом.
✅Номер под тестовый аккаунт есть — из проекта Аутрич (Антон, 2026-08-19). ⛔ Сломать Аутрич нельзя: берём свободный номер, а не задействованный в рабочих сценариях · файлы сессий и конфиги Аутрича не трогаем вообще, своя папка и свои креды · перед реализацией читаем его код, а не действуем по аналогии. Telegram Web через Playwright рассматривался и отклонён: сессия протухает и требует ручного кода, для автономной работы негодно.
Путь вопроса
Речь про вопросы, возникшие в ходе уже запущенной работы. Судья — отдельный субагент, не исполнитель: исполнитель всегда заинтересован не блокироваться и будет занижать важность.
1. Ответ уже есть?
Во второй мозг и проектную память ходит сам исполнитель — это его обязанность, а не судьи. Судья существует потому, что исполнитель может забыть или срезать угол: он перепроверяет, что тот реально сходил.
Нашли → вопрос не задаётся, ответ идёт исполнителю со ссылкой на источник.
Не сходил → судья возвращает наработку с конкретной причиной. Не бесконечно: счётчик возвратов в журнале, максимум 2 по одному поводу, Каждый возврат стоит лимита — счётчик ровно поэтому.
Что происходит на третий раз — не «как получится», а по той же анкете: развилка обратима и дёшева → судья ставит точку сам и пишет это в журнал как своё решение. Развилка необратима или дорога → эскалация Антону обязательна, даже когда возвраты исчерпаны. Исчерпание меняет только то, кто закрывает мелочь, — права самому решить важное оно не даёт.
Честно: когда судья решает сам, по результату получается то же, что сделал бы исполнитель — решение принято без Антона. Ценность в другом: судья не заинтересован не блокироваться, его решение фиксируется явно с обоснованием, а не растворяется в коде, и попадает в утренний список «решил без тебя». На мелочи разница невелика — смысл судьи в том, чтобы важное не проскочило.
↓
2. Стоит ли вопрос того — и кто проверит обратный перекос
Критерий: разные ответы дают разную реализацию. Числовой нормы вопросов нет намеренно — норма заставит выкидывать важное ради счёта.
Опасность симметричная: линия может решить «не стоит», а стоило. Поэтому исполнитель обязан регистрировать каждую развилку, а не только вынесенные — с дефолтом и причиной, почему не спросил. Судья смотрит весь список и вправе поднять любую запись в вопрос.
Хук на границе «работа завершена» не пропускает линию с пустым журналом развилок — пустой журнал считается несделанной работой.
А если исполнитель срежет угол и просто не запишет? Полной защиты нет — честно. Есть три слоя: хук ловит журнал, подозрительно короткий относительно объёма изменений · судья сверяет журнал с диффом и возвращает то, что не объяснено · журнал и список «по умолчанию» читает человек на приёмке. Гарантии не даёт ни один, вместе они делают срезание угла дорогим и заметным.
Исполнитель запускает субагентов — это прямое средство против переполнения контекста, а переполненный контекст и есть источник ошибок вроде «забыл записать».
↓
3. Дефолт и таймаут
Вопрос без предложенного дефолта задавать нельзя: «вижу развилку, предлагаю так; не ответишь за N — сделаю так». Молчание становится осознанным согласием, а не тупиком. Таймаут — параметр вопроса, считается по цене отката:
Обратимо за минуты (название, формулировка) — 30 минут, дальше делаем предложенное.
Обратимо за час-два (обойти чужой тест, выбрать библиотеку) — 2 часа, дальше делаем предложенное.
Необратимо (деньги, боевые данные, внешние коммуникации) — таймаута нет. Ждёт только своя линия.
Ночью таймауты не тикают. Вопросы ночной фазы копятся к утреннему блоку — иначе конвейер за ночь примет пачку решений по молчанию спящего человека.
↓
4. Доставка и ответ
✅Чат-сессия
Утренний блок и весь разбор.
✅Кэтчер
Дневные вопросы, когда Антона нет в чате.
Как ответ привязывается к вопросу:
У вопроса свой идентификатор; в callback_data кнопки лежит id вопроса : вариант — тап сразу привязан, гадать не нужно.
Варианты на кнопках формирует судья вместе с вопросом: это предложенный дефолт плюс альтернативы, о которых линия думала.
Последняя кнопка всегда «✍️ Напишу сам» — переводит канал в режим ожидания текста по этому вопросу.
Второй путь для того же — ответ реплаем на сообщение с вопросом. Работает без нажатия кнопки.
На каждый тап — видимая реакция, иначе непонятно, дошло ли.
Единственное уязвимое место — «напишу сам» + следующее сообщение: постороннее сообщение может съесться как ответ. Защита: режим ожидания живёт ~10 минут и виден в шапке («жду текст по вопросу N · отменить»); получив текст, Кэтчер отвечает «записал как ответ на вопрос N» с кнопкой «нет, это не ответ». Свободный текст активен только для одного вопроса — следующий тап переключает.
Ответ не теряется, если линия уже спит: он кладётся в очередь на диске у демона и подбирается при возобновлении.
Оркестратор — два слоя
Чат-сессия не может быть носителем оркестрации: она эфемерна, падает и упирается в контекст — вместе с ней умерла бы вся очередь. Поэтому надёжное и умное разведены.
Демон (systemd, сервер)
Тупой и надёжный. Держит очередь на диске, запускает claude -p в папке нужного проекта, следит за живостью, ловит завершение, стартует следующую линию, считает расход, переживает перезагрузку. Ничего не «понимает» — исполняет.
Сессия конвейера
Умная и эфемерная. Живёт в спецпроекте, приходит на согласование состава и утренний блок, разговаривает с Антоном, кладёт решения в очередь и читает состояние. Упала — очередь цела, работы идут.
Для Антона это выглядит ровно как он описал: сказал кодовое слово в проекте конвейера и общается с одной сессией. Разница только в том, где физически живёт очередь.
Линия — последовательность шагов, а не один бесконечный запуск
Отсюда берётся весь контроль. Один запуск = один шаг, между шагами линия отчитывается чекпоинтом, и демон решает, пускать ли дальше. Демону не нужно уметь прерывать работающую сессию — он просто не начинает следующий шаг. Проще и надёжнее.
Исполнитель про лимит не знает и знать не должен — знает демон, и контроль стоит на границе шага. Демон работает круглосуточно: ночная фаза самая тяжёлая, там контроль критичнее всего.
Состояния линии
Работает
Внутри одного проекта — строго одна линия. Разные проекты — параллельно, каждая в своей копии.
Ждёт ответа
Только класс «никогда молча». Остальные вопросы линию не останавливают — она идёт по дефолту после таймаута.
Пауза по лимиту — штатное состояние
Демон — процесс, а не сессия: он просто спит до сброса окна и пробует снова. Ждать, когда вернётся Антон, не нужно.
Зависла — другое состояние
Механизм уже написан и работает в раннере заявок: он не убивает по часам молча, а собирает следы работы (коммиты в ветке, прирост лога), выносит вердикт «двигается / не двигается» и спрашивает Антона кнопками «продолжать / закрывать». Убивается только то, что висит целый рабочий день.
Автономное решение проблем
Оркестратор должен уметь то, что сделал бы Антон за компом — не встать, а придумать, как продолжить. Честная граница: качеством суждения это полностью не гарантируется. Кодом даётся:
Каталог типовых тупиков: упал чужой тест → обойти и завести задачу; отвалился внешний API → повтор, затем пауза, не падение; конфликт с чужой незакоммиченной работой → стоп по проекту.
Право откатиться и пойти обходом вместо остановки.
Право переключиться на другую линию вместо простоя.
Запись «здесь решил сам, вот чем» в журнал — по ней каталог пополняется от прогона к прогону.
Лимиты
Поправка: мы на подписке, а не на API. Стоимость из вывода запуска — не деньги и не счёт, а прокси-метрика расхода. Годится как относительный измеритель «эта фаза тяжелее той», но не как бюджет. Реальные лимиты подписки — 5-часовое окно и недельный потолок, в долларах они не выражены.
Считает демон, не сессия. Он не знает «сколько осталось» — этого никто не знает. Знает два числа: потрачено за окно (сумма всех завершённых запусков за 5 часов) и сколько стоит шаг такого типа по накопленной статистике. Правило пуска: потрачено + оценки по занятым слотам + оценка нового ≤ порога. Порог эмпирический, находится за первые недели.
Субагенты учитываются. Проверено живым запуском: пустой прогон — 0,708, тот же прогон с одним тривиальным субагентом — 1,198 (кеш-чтение выросло с 16 до 102 тысяч токенов). Значит расход субагентов входит в отчёт родительского шага. Постфактум учёт полный; дыра остаётся только в предсказании. Сколько субагентов поднять — решает исполнитель (или оркестратор при постановке шага); лимитов «не больше N» в задании нет. Демон компенсирует запасом в пороге, а не ограничением исполнителя. Контроль приблизительный — точным он не будет.
Предугадывание. Демон копит статистику «сколько стоила такая фаза раньше». Оценка следующей фазы не влезает в остаток окна — фазу не начинать, встать на чекпоинте. Дешевле подождать, чем сжечь половину фазы и переделывать.
Возобновление без потерь. У CLI есть --session-id и --resume: демон выдаёт линии id заранее и после паузы возобновляет ту же сессию — контекст сохранён, фазу повторять не нужно.
Калибровка. Порог не выдумываем: первые ночи меряем реальную тяжесть разбора одного проекта.
Не простаивать в ожидании. Лимит общий на аккаунт: исчерпано окно — исчерпано для всех линий, тут добирать нечего. Смысл есть в другом случае — остаток ненулевой, но мал для тяжёлого шага: тогда демон берёт из очереди короткий шаг, который по оценке влезает, вместо простоя. Приоритет из фазы 1 остаётся главным, упаковка — только способ не терять хвост окна.
А если демон промахнулся и лимит кончился посреди шага? Шаг падает, работа откатывается к последнему чекпоинту — потеря не больше одного шага, ровно ради этого они режутся мелко. Демон корректирует оценку этого типа шага вверх: промах становится данными. Сессия никуда не девается — после сброса поднимается через --resume. Промахи системные — сигнал резать шаги мельче, а не наращивать запас.
Не проверено: точный текст ошибки при упоре в лимит и есть ли в нём время сброса. Пока не увидели своими глазами — считаем непроверенным.
Гейт деплоя
Внутри одного проекта — одна линия за раз.
Линия никогда не деплоит из своей копии: подтянуть свежий main → влить → прогнать тесты после слияния → только потом деплой.
Деплой сериализуется: один на проект одновременно.
Чек-лист «завершено» свой у каждой задачи поверх общей базы. Отдельным пунктом — «ничего из работавшего не сломалось»: отдельная проверка от «новое работает», и подводит обычно вторая.
Есть интерфейс — headless-браузер прошёл сценарии и прокликал.
После деплоя health-check; не прошёл — немедленный откат на предыдущую версию, линия в состояние «откатилась, нужен разбор», Антону сообщение.
Проверка не прошла — что дальше. Провал гейта означает, что линия не завершена: она не деплоится и не уходит на приёмку, а получает новый шаг «починить» с описанием того, что упало, и идёт на второй круг сама. Человек не участвует. Потолок — 3 неудачных прохода подряд, дальше линия встаёт и Антону уходит вопрос «не могу пройти проверку, падает вот это, пробовал вот это». Провал health-check уже после деплоя — откат на предыдущую версию и тот же шаг «разобраться».
Кто проверит, что не сломалось то, что ломаться не должно — самый слабый узел, отвечаем честно. Регрессия гоняется целиком, а не по месту правки (в Jarvis 2.0 это ~2400 тестов). Сквозные сценарии интерфейса — весь «золотой путь», а не только затронутый экран. Дыра, которую признаём: непокрытое ни тестами, ни чек-листом автоматически не проверится никак — поэтому линия, тронувшая такую область, обязана либо добавить проверку, либо записать в журнал «область без покрытия, проверял руками так-то». Хук перед деплоем требует одного из двух.
Никогда автономно, независимо от чек-листов: движение денег · отправка писем и сообщений наружу от имени Антона · удаление боевых данных · изменение схемы боевой базы · публикация в публичный доступ · правки в ПланФиксе вне задачи своей линии · смена доступов и токенов.
Хуки-контролёры стоят на трёх границах: перед отправкой вопроса, перед объявлением работы завершённой, перед деплоем. Инструкцию в промпте можно не выполнить, хук — нельзя.
Дом конвейера — сервер в Алматы
Мак спит на батарее и для ночной фазы не годится в принципе. Проектируем сразу под сервер. Хождение сервера на Мак — временный костыль на переходный период, а не часть архитектуры: цель — перенести на сервер всё, что осталось на Маке, и убрать зависимость целиком.
⛔Обратный туннель Мак → сервер. Мак за NAT, соединение может инициировать только он. Временно, до конца переезда.
⛔Блокер root. На сервере headless-сессии под root падают на пропуске проверок прав. Пока не снято — ни одна линия не запустится.
⛔Второй мозг в сейфе. После перезагрузки сейф закрыт, а исполнитель и судья обязаны в него ходить. Нужен признак «сейф закрыт → линия ждёт» и уведомление Антону.
⬜Playwright на сервер — без него нет проверки интерфейса кликами.
Открытые вопросы к механике
Цикл (/loop) — изучено 2026-08-19. Что это: сессия повторяет задачу — по фиксированному расписанию либо сама выбирая интервал до следующего пробуждения, есть и полностью автономный режим. Ограничения, которые меняют вывод: расписание живёт только в памяти сессии и умирает вместе с ней · повторяющиеся задачи гаснут через 7 дней · срабатывают только когда сессия не занята · одноразовый claude -p завершается сразу, будить нечего. Как оркестратор не годится — не переживёт перезагрузку сервера. Механика правильная, но её место — внутри одной линии, если запускать её живой сессией. Вынесено в развилку 11.
⬜Точный текст ошибки лимита и есть ли в нём время сброса — увидеть на живом исчерпании.
Десять развилок — все утверждены 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-дневный потолок · требует, чтобы сессия была не занята.
Второй вариант остаётся возможной оптимизацией на потом, когда станет видно, сколько реально съедает прогрев.
Цикл самопроверки — внутри шага, а не между шагами
Это то, что имелось в виду под циклом: исполнителю ставится задача и чек-лист, и он гоняет сам себя, пока результат не сойдётся с чек-листом. Расписание и самопробуждение для этого не нужны — всё внутри одного запуска.
Критерий готовности машинно-проверяемый: команды с ожидаемым результатом — тесты, сборка, сценарий в браузере. Не «убедиться, что хорошо», иначе исполнитель сам себя убедит.
Работает → прогоняет чек-лист → не сошлось → правит → прогоняет снова. Шаг завершается только на зелёном чек-листе.
Хук не даёт объявить шаг завершённым, пока чек-лист не пройден — это не пожелание в промпте.
Потолок — 3 круга. Дальше шаг встаёт: «не могу сойтись с чек-листом, падает вот это». Та же логика, что у гейта деплоя.