11 KiB
Execution Broker — текущий локальный контур
Проверено: 2026-10-14. Репозиторий: /Users/admin/Developer/execution-broker.
Состояние приёмки
Main и origin/main — a3594c3; единственный worktree чистый. Broker execution-broker:production-a3594c3, Gateway execution-broker-gateway:reauth-a3594c3; четыре macOS пакета и Linux Runner/build contexts обновлены. Native Claude issuer также обновлён. Полный make check прошёл; проверки Callee engine прошли для неизменившегося после 4166542 адаптера. Новые PR не создавались.
Проверка продолжения: run-0175c98134e42a9d912dcc2626264bcd получил точный план из одобрения human-1 запуска run-3a21ab05f78f688abc923d0946728233 (SHA256 994b9c5492136ff1710ace38aef33767658585fd597f553d74f85a3122f287dc). Реальная macOS VM начала с implementer, без specify/design/breakdown и нового Human. Claude ответил Authentication required; конкретная ошибка доставлена в Mattermost. Код не создан и не опубликован.
Native CLI обнулил оба токена и expiresAt в private cache, из-за чего прежний checkpoint застрял. Восстановление распознаёт этот явный результат с привязкой к аккаунту/организации: сохраняет предыдущий зашифрованный cache, отмечает необходимость входа и разрешает cleanup остановленного worker. Реальный cleanup=done подтверждён; issuer не revoked, owner освобождён, reauthentication_required=true. Новая попытка run-3fcbd9a52b55e9c750671ea4357b705a в той же Story eb-bae3eaa3bfcaeb17678c1bc7 ожидает browser authentication до выделения VM. Успешное завершение Go CLI, публикация и закрытие Story пока не подтверждены. Эфемерные login URL в документации не хранить.
Молчание по команде владельца подтверждено: 2026-10-14 06:24:56 UTC Mattermost принял post, NATS вернул 503 insufficient resources, после трёх попыток ingress прекратил dispatch без ответа. История BALDA_EVENTS заняла около 1.9 ГБ при account max_store=2gb. Локальный max_store повышен до 16gb, история сохранена, Balda перезапущен. Новая ошибка запуска после этого доставлена. Это восстановление ёмкости; долговременные ограничения отдельных streams и уведомление при исчерпании ingress retries в коде Balda этим изменением не реализованы.
Конфигурация и перезапуск
- Действующий Compose-файл:
/Users/admin/Developer/execution-broker/state/deploy/compose.production.json(приватный, не коммитить). Это полный снимок действующей конфигурации вместо цепочки временных override. - Broker config:
state/deploy/broker.json; worker config:state/deploy/worker.json; bootstrap assets:state/deploy/assets. - Контейнеры Broker/gateway/Prism:
execution-broker-broker-1,execution-broker-worker-1,execution-broker-prism-1. Balda:balda-mm-mac. - Применение выбранного образа:
docker-compose -f state/deploy/compose.production.json -p execution-broker up -d --no-deps brokerиз каталога репозитория. Изменение Git само по себе ничего не разворачивает. - Перед изменением активной конфигурации сохранять образ, config и согласованный Broker backup; не прерывать чужие задачи.
Одобрения
Для явно запрошенного повторного запуска использовать execution_retry: исходный run_id, chat/topic и новый idempotency_key. Broker выводит точный прежний scope и сохраняет одобрённый текст, вместо пересказа задачи моделью. Тот же Story/task/repository revision/worker/image/agent не требует нового одобрения плана. Изменение scope или позднейшие замечания владельца требуют нового решения. Сохранённый план — приватный admission snapshot; публичный status его не раскрывает. Native sign-in и ACP permissions остаются отдельными механизмами.
telegram_approvals.enabled=true и выбранная исходная сессия: запрос только в @balda_approval_bot; при выключенном Telegram — в исходном канале Balda. Результат, причина сбоя и очистка приходят в исходный Mattermost-тред. Original execution_respond сохранён для восстановления. После истечения срока самого Telegram-запроса кнопка «Обновить запрос» создаёт свежие кнопки для того же ожидающего Human в том же run и VM, пока не истёк исходный deadline запуска; она не одобряет задачу и не продлевает run. Токены находятся только в приватных secret-файлах.
Бот отправляет одно читаемое сообщение с кнопками. Длинный план явно помечен как preview; полный файл отправляется только по кнопке «Полный план». Просмотр не одобряет задачу. Reply на сообщение с кнопками передаёт замечания к плану: до трёх доработок в том же run с повторным одобрением. Обычное сообщение или Reply на вложение не считается ответом. Для ACP permission нужно выбрать предложенный вариант, для остановки — «Отменить задачу».
Это одобрения Broker workflows и worker ACP. Прямые ACP-запросы хостовых агентов Balda и operator grants для существующих папок/managed hosts — отдельные механизмы. Контекстный субагент для autoapproval остаётся плановой работой.
VM и доработка
VM принадлежит run. Терминальный исход завершает её после сбора артефактов; открытая Story сама по себе VM не удерживает. Claude/OpenCode теперь выполняют до трёх циклов implementation → verification → review в одном checkout и VM, с передачей проверок и findings в доработку. Исчерпанный цикл блокирует публикацию финальным quality gate. Инфраструктурный сбой, отмена и исходный deadline остаются терминальными.
Тестом на двух независимых соединениях воспроизведён SQLite database is locked / SQLITE_BUSY_SNAPSHOT (517). Запись теперь резервирует writer до чтения через BEGIN IMMEDIATE. Это доказанный дефект, но он не объявляется установленной причиной четвёртого запуска: его исходная ошибка не записана.
Автоматическое окружение и качество
Новые Broker-managed проекты не требуют ручного allowlist в каждой VM: Broker выводит guest config для своей Git namespace, а run-bound Git capability ограничивает доступ конкретным проектом. Digest пакета и версии workflow проверяются до запуска.
Go 1.26.9 Darwin ARM64 автоматически загружается Broker, проверяется по SHA256, кешируется и устанавливается только в disposable VM. Golden image и пользовательский Mac не меняются. SDK wrapper задаёт правильный GOROOT и доступные права каталогов.
Detached HEAD — штатный checkout закреплённой ревизии; локальные коммиты сохраняются в commits.bundle. Одобрение — факт workflow journal, переданный subsequent roles, а не файл в репозитории. Quality gate требует выполненных проверок и отсутствия нерешённых findings. exit_code должен совпадать с expected_exit_code (по умолчанию 0); ожидаемая ошибка CLI допустима только с явным ожиданием и evidence. Сборка/test suites ожидают 0.
execution_diagnostics проверяет checksum артефактов и извлекает bounded причину Callee или Runner из callee.log, даже без quality.json, для failed, expired и canceled. Реальный expired run проверен через MCP после развёртывания fd29974. Отдельным тестом воспроизведён прежний отказ журнала для длинного Human: теперь вопрос до 256 КиБ сохраняется целиком, Human event ограничен 512 КиБ, остальные события — 32 КиБ. Конкретная ошибка обработки события сохраняется в редактированном логе Runner. Ошибки cleanup записываются отдельно в cleanup_error и не заменяют исходную причину исполнения. Cleanup, завершившийся во время отложенной доставки terminal, получает отдельное уведомление; более поздний receipt не скрывает его.
Подробные контракты: docs/telegram-approvals.md, docs/operations.md, docs/protocol.md, docs/testing.md. Будущие host permissions, SSH command catalog, iPad и прочие миграционные задачи — отдельные планы в docs/work-plan.md; они не объявлены реализованными этой приёмкой.