[2026-10-14] eagle: personal/projects/balda/execution-broker.md
This commit is contained in:
1 parent
810c4f4c81
commit
380a0c2b42
1 file changed
+46
-77
@@ -1,97 +1,66 @@
|
||||
# Execution Broker — текущий локальный контур
|
||||
# Execution Broker — эксплуатация
|
||||
|
||||
Проверено: **2026-10-14** по репозиториям, конфигурации и работающим контейнерам.
|
||||
Проверено: **2026-10-14** по исходникам, работающим контейнерам и локальным проверкам. Полная release-ready приёмка ещё не завершена.
|
||||
|
||||
## Текущий статус
|
||||
## Развёрнутый комплект
|
||||
|
||||
**Broker ещё не полностью реализован и не прошёл production-приёмку нового кандидата.** Локальные проверки rc.26 завершены; работающий контур использует прежние образы.
|
||||
|
||||
## Репозитории и действующие образы
|
||||
|
||||
| Компонент | Подтверждённое состояние |
|
||||
| Компонент | Текущее состояние |
|
||||
| --- | --- |
|
||||
| Broker repository | `/Users/admin/Developer/execution-broker`; `main` и `origin/main`: `437cbf8` |
|
||||
| Broker candidate | `0.1.0-rc.26`; код проверен на `b64a1ba83c82475b08276ea3fb6a54c99d4a1509`; текущая `codex/production-readiness`: `b7106b5` с последующими изменениями документации |
|
||||
| Broker production | `execution-broker:production-a3594c3` |
|
||||
| Gateway production | `execution-broker-gateway:quality-437cbf8` |
|
||||
| Prism production | `execution-prism-adapter:session-fix-20261004` |
|
||||
| Balda production | контейнер `balda-mm-mac`, образ `balda-balda`, image ID `sha256:56c00100258b1a478484ef20e044981ed0a569ec0ae7d6ba8608e8878a9e1f95` |
|
||||
| Репозиторий | `/Users/admin/Developer/execution-broker`, `codex/production-readiness`, HEAD `18b224a`; исходники закоммичены |
|
||||
| Broker | `execution-broker:a260a9a` |
|
||||
| Gateway | `execution-broker-gateway:a260a9a` |
|
||||
| Prism | `execution-prism-adapter:a260a9a` |
|
||||
| Smoke worker | `execution-broker-worker:a260a9a`; один immutable image pin в Broker и gateway |
|
||||
| OpenCode worker | `execution-broker-executors:rc27-go1269`; один immutable image pin в Broker и gateway; Go SDK 1.26.9 |
|
||||
| macOS bootstrap | Четыре пакета `*-a260a9a.tar.gz`; актуальные Runner/Callee, workflow присутствует, digest совпадает с конфигурацией |
|
||||
| Оба Balda | Upstream `2eed2ce8`, image `balda-balda:upstream-2eed2ce8`; подробности в [[personal/projects/balda/setup]] |
|
||||
| Release candidate | `0.1.0-rc.27`, исходники архивов `18b224a`; четыре платформенных архива и plugin в `dist/` |
|
||||
|
||||
Кандидат Broker остаётся локальным; работающие контейнеры не обновлены.
|
||||
Docker socket и daemon group удалены из всех coding worker profiles. Docker administrative access остаётся только у gateway. Прежние несовпадения image pins устранены; перед обновлением незавершённых runs не было.
|
||||
|
||||
## Что проверено у Broker rc.26
|
||||
## Продолжения и одобрения
|
||||
|
||||
На принятой ревизии прошли `make check build` и проверки Callee на macOS ARM64 и Linux ARM64, race-тесты, adapter/plugin checks, source/binary govulncheck и gitleaks истории. Reachable vulnerabilities — 0; недостижимые findings сохранены в отчётах.
|
||||
В текущем upstream Balda generic webhook запускает изолированное задание и не продолжает исходную сессию. Старые callback routes Broker приостановлены; недоставленные cursors и история сохранены, доставкой они не считаются.
|
||||
|
||||
Реальный изолированный Docker/Callee flow прошёл Human pause → restart → resume → пять артефактов → cleanup. Linux ARM64 архив отдельно установлен без Go и source checkout: четыре сервисных образа, MCP, перезапуск Broker, пять артефактов, `succeeded`, `cleanup=done`. Закреплённые Claude/OpenCode/Node и ACP initialize проверены на macOS/Linux ARM64 без provider inference.
|
||||
Новый плагин rc27 использует `balda.state` и `balda.session.wait`: состояние попытки и возврат в исходную сессию сохраняются до Start/retry. Broker поддерживает `execution_lookup` и атомарное закрытие потерянного admission, включая поздний Start/retry. Функциональные race/restart-тесты прошли. **Managed upgrade плагина обоих Balda пока не завершён: остаётся rc26, применение rc27 ждёт отдельного разрешения автоматической проверки. Conversational delivery нового контура ещё не принята.**
|
||||
|
||||
Четыре платформенных архива rc.26 и отдельный plugin находятся в `dist/` с SHA256SUMS. Runtime probes архивов прошли; результаты AMD64 получены через эмуляцию. Native AMD64 этим не подтверждён. Старые live coding runs ниже относятся к прежним образам.
|
||||
Настроенный Telegram approval bot получает вопрос исключительно в выбранных исходных сессиях; в остальных вопрос принадлежит исходной беседе. Модель не отвечает за владельца. Подлинный ответ передаётся через bound `execution_respond`; cancellation через `execution_cancel`. Повтор coding task — `execution_retry` с исходным run_id и новым ключом: Broker сохраняет точный task, Story, revision, executor и действительное прежнее одобрение. Изменение scope требует нового решения.
|
||||
|
||||
## Что остаётся у Broker
|
||||
## Проверки
|
||||
|
||||
| Область | Состояние |
|
||||
- macOS ARM64 и Linux ARM64: полный race/vet; Callee adapter и security checks.
|
||||
- Реальный Docker/Callee: Human → restart → resume → пять проверенных артефактов → cleanup.
|
||||
- Реальный Beads/Dolt: Story projection и replay.
|
||||
- Managed plugin lifecycle и native one-shot wait: исходная сессия, restart, новая generation без потери следующего wait.
|
||||
- Source/binary govulncheck: reachable vulnerabilities — 0; история gitleaks чистая.
|
||||
- Runtime checks rc27: Darwin ARM64 и Linux ARM64 — native; Darwin AMD64 — emulated. Linux AMD64 под эмуляцией показал непостоянный startup-сбой и исследуется. Native AMD64 не проверен.
|
||||
|
||||
Это раздельные свидетельства. Сервисный fixture не доказывает, что модель в реальной беседе правильно выберет tools и доставит результат.
|
||||
|
||||
## Незавершённый объём
|
||||
|
||||
| Область | Что остаётся |
|
||||
| --- | --- |
|
||||
| Согласованное развёртывание | Не выполнено для кандидата: Broker/gateway, Runner/Callee, workflow/config pins, VM bootstrap и plugin должны составлять один принятый комплект |
|
||||
| Финальная live-приёмка | После обновления нужны реальный conversational run, артефакты, credential settlement, cleanup и outage/restart на совместимой версии Balda |
|
||||
| Универсальная подготовка стеков | В плане: версии инструментов, проверенные источники, readiness probes и восстановимое изменение окружения для Make/C/C++, CMake/Ninja, Python, Node, Rust/JVM на Linux/macOS |
|
||||
| Immutable caches | Общие tooling/Git caches остаются в плане; существующий Go SDK cache не является универсальным provisioning |
|
||||
| Артефакты между запусками | Digest-bound inputs и retention holds остаются в плане |
|
||||
| Платформы и recovery | Native AMD64 и восстановление после потери хоста/Keychain не подтверждены |
|
||||
| Balda boundary | Завершить plugin upgrade, принять реальный conversational run и outage/restart с видимым результатом |
|
||||
| Универсальные стеки | Декларативные Linux/macOS tooling profiles, версии и approved sources, probes, безопасное восстановимое изменение окружения |
|
||||
| Caches | Общие immutable tooling/Git caches; существующий Go SDK cache их не заменяет |
|
||||
| Артефакты между runs | Digest-bound inputs и retention holds |
|
||||
| Платформы и recovery | Native AMD64, устранение/классификация AMD64 emulation failure; off-host/Keychain loss recovery не подтверждён |
|
||||
|
||||
В текущих `broker.json` и `worker.json` сохраняется drift image pins для `linux-smoke` и `linux-opencode-deepseek`; три coding-профиля содержат Docker socket. Защиты rc.26 запрещают такой доступ и отклоняют несовпадение pin до allocation, но прежний production-контур этих новых защит не получает.
|
||||
Источник требований — `docs/work-plan.md`. iPad, прикладные UI/PR workflows и права Obsidian относятся к вызывающему проекту или Balda.
|
||||
|
||||
Источник объёма работ — `/Users/admin/Developer/execution-broker/docs/work-plan.md`. Настраиваемый remote-action API — отдельное будущее расширение. iPad, прикладные UI/PR workflows, search/Obsidian и общая политика прав локального агента принадлежат Balda или конкретному проекту.
|
||||
## Конфигурация и восстановление
|
||||
|
||||
## Навигация
|
||||
Приватный Compose: `state/deploy/compose.production.json`; конфиги `broker.json`, `worker.json`, assets в `state/deploy/assets`. Токены остаются только в secret-файлах.
|
||||
|
||||
- [[personal/projects/balda/setup|Balda: действующая конфигурация и перезапуск]]
|
||||
- [[personal/projects/balda/balda|Balda: обзор]]
|
||||
- [[personal/plans/balda-callee-prism-plan|Архив прежнего плана]]
|
||||
- [[personal/projects/archive/balda-reference-before-2026-10-14|Архив прежней карточки и шаблонов]]
|
||||
После выбора проверенного образа применять из репозитория:
|
||||
|
||||
### История приёмки действующих версий
|
||||
```bash
|
||||
docker-compose -f state/deploy/compose.production.json -p execution-broker up -d --no-build worker broker prism
|
||||
```
|
||||
|
||||
Проверка продолжения: `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). Код не создан и не опубликован.
|
||||
Git commit сам по себе deployment не меняет. До обновления завершить runs/cleanup и сохранить согласованные state/config/image pins.
|
||||
|
||||
Native CLI обнулил оба токена и expiresAt в private cache, из-за чего прежний checkpoint застрял. Восстановление распознаёт этот явный результат с привязкой к аккаунту/организации: сохраняет предыдущий зашифрованный cache, отмечает необходимость входа и разрешает cleanup остановленного worker. Реальный cleanup=done подтверждён; issuer не revoked, owner освобождён, reauthentication_required=true. Владелец вошёл по ссылке из Mattermost; issuer подтвердил `credentials_saved` 2026-10-14 08:20:37 UTC, и `run-3fcbd9a52b55e9c750671ea4357b705a` автоматически продолжился с прежним утверждённым планом. Реализация, тесты и ревью прошли, но quality gate отклонил verifier: ACP склеил поясняющий текст с финальным JSON. Конкретная ошибка доставлена в Mattermost (`g4nbxpzff78s8e5jjwgwxoxcjo`). Исправление 437cbf8 допускает текст перед первым JSON, сохраняет исходный отчёт и по-прежнему отвергает несколько объектов, trailing content, failed и невыполненные проверки. Реальный отчёт воспроизведён исправленным шлюзом успешно.
|
||||
|
||||
Итоговый `run-a1b236aaff2e3d877049cf790262ac37` той же Story завершился `succeeded`, `cleanup=done` 2026-10-14 около 08:36 UTC. Он начал сразу с implementer, без нового планового Human. На Darwin 27.0.0 / Go 1.26.9 ARM64 прошли gofmt, go vet, go test -count=1 ./..., сборка и smoke (--version, --help, greet, отсутствие имени и неизвестная команда с ожидаемым exit=2), ревью без findings, quality.json passed=true. SHA256 всех артефактов проверены. `execution_publish_artifacts` опубликовал `b5a238cd478ae89923cdbb4908c4f26fd7ddabfc` в `/Users/admin/Developer/go-cli-claude-test`, checkout чистый. Через Prism закрыты Task `eb-9840de48c9a2090fdb1b6a4f`, затем Story `eb-bae3eaa3bfcaeb17678c1bc7`; обе операции вернули completed=true, а read-only Beads подтвердил status=closed. Broker → Balda → [исходный Mattermost-тред](https://mm.qentra.top/qentra/pl/51m7gwce1pyyuebeya19wdrfqe) доставил итог: коммит опубликован, Task и Story закрыты. Это проверенный coding flow; первоначальный повтор потерянной MM-команды запускал оператор через штатный Broker retry, поэтому восстановление conversational ingress после NATS outage отдельно не объявляется проверенным. Эфемерные 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 перезапущен. Новая ошибка запуска после этого доставлена. Повышение max_store было только восстановлением ёмкости. Реальный conversational outage/recovery в Mattermost после этого восстановления не проверен.
|
||||
|
||||
## Конфигурация и перезапуск
|
||||
|
||||
- Действующий 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, а не файл в репозитории. Кандидат rc.26 усиливает quality gate: каждый verifier command повторно исполняется в disposable reviewed checkout, фактические exit/output сохраняются в private quality.json; изменение HEAD, tracked source или index блокирует публикацию. Любая проверка должна сама завершиться с exit=0; `expected_exit_code != 0` отвергается. Отрицательный CLI-сценарий оформляется shell assertion, которая проверяет ненулевой код и сообщение приложения, а сама возвращает 0. Эта новая защита пока относится к кандидату, а исторические live-прогоны выше выполнены прежним Callee.
|
||||
|
||||
`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`. Собственные задачи Broker и границы релиза перечислены в `docs/work-plan.md`. iPad, search/Obsidian, общие права локального агента и персональные workflows относятся к вызывающему проекту или Balda; они не являются release gates Broker.
|
||||
Backup перед этим обновлением: `state/backups/20261014-before-rc27`. Проверены SHA256, 30 SQLite databases и inert restore шести компонентов, включая зашифрованный credential vault. Все три identity были освобождены и checkpointed. Master keys Keychain в backup отсутствуют; это проверка восстановления на том же хосте, не после его потери.
|
||||
|
||||
Контракты и процедуры: `docs/protocol.md`, `docs/operations.md`, `docs/telegram-approvals.md`, `docs/recovery.md`, `docs/testing.md`. Существующие Balda сессии сохраняют capability snapshot; новая беседа принимает обновлённый плагин без изменения старой истории.
|
||||
Reference in new issue
Block a user