Files
obsidian-vault/personal/projects/balda/execution-broker.md
T

50 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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](https://mm.qentra.top/qentra/pl/s3q8k6uk8py1uqcz7ss55brpmr). Код не создан и не опубликован.
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 в документации не хранить.
Молчание по [команде владельца](https://mm.qentra.top/qentra/pl/ae7rzayekjf9iquwx1duzs1dew) подтверждено: 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`; они не объявлены реализованными этой приёмкой.