Files
obsidian-vault/personal/projects/balda/execution-broker.md
T
2026-10-15 09:50:58 +00:00

17 KiB
Executable File
Raw Blame History

Execution Broker — эксплуатация

Проверено: 2026-10-15 по исходникам, работающим контейнерам и реальным запускам. Полная release-ready приёмка ещё не завершена.

Развёрнутый комплект

Компонент Текущее состояние
Репозиторий /Users/admin/Developer/execution-broker, codex/production-readiness; основной комплект fee5409, Broker hotfix 1b09e0f
Broker execution-broker:1b09e0f, версия 0.1.0-rc.32+approval30.1b09e0f, immutable SHA256 pin в Compose
Gateway execution-broker-gateway:fee5409, версия 0.1.0-rc.32
Prism execution-prism-adapter:fee5409, версия 0.1.0-rc.32
Smoke worker execution-broker-worker:fee5409; один SHA256 image pin в Broker и gateway
OpenCode worker execution-broker-executors:fee5409; один SHA256 image pin в Broker и gateway, Go SDK 1.26.9
macOS bootstrap Четыре пакета *-fee5409.tar.gz с Runner/Callee этого комплекта
Оба Balda Source 6238856b: upstream 6621b189 + исправление контекста канала; image balda-balda:upstream-6621b189-channel-fix; подробности в personal/projects/balda/setup
Managed plugin rc32 у обоих, Enabled=true, Drifted=false; прежние plugin data, revisions и marketplace сохранены
Release archives 0.1.0-rc.32, source fee5409; четыре платформенных архива и plugin в dist/, SHA256 проверены

Docker socket и daemon group отсутствуют у coding workers. Административный доступ к Docker остаётся у gateway. Основные модели, home volumes и история обоих Balda сохранены; сессии не сбрасывались. Серверная проверка Codex auth: models endpoint отвечает HTTP 200 у обоих инстансов. У @balda дополнительно проверена реальная генерация в ephemeral read-only сессии: AUTH_OK, turn.completed, exit 0. Исходный аккаунт сохранён; Balda перечитал credentials после обычного перезапуска.

Инструменты и артефакты

execution_profiles показывает разрешённые tooling profiles. Подготовка окружения задаётся декларативно: platform, версии, approved packages/archives, SHA256 и readiness probes. Новый стек требует подходящего operator profile; Makefile сам по себе не устанавливает зависимости.

В текущем контуре Go 1.26.9 задан стандартным profile для Linux OpenCode и четырёх macOS workers. Специального Go installer в Runner больше нет. Tooling cache хранит проверенные immutable archives, ограничен 4 GiB; фактические версии сохраняются в tooling.json. Временные build products выполняются внутри приватного каталога run; общий Linux /tmp остаётся noexec.

Отдельный Git cache хранит immutable bundles по repository/commit с лимитом 4 GiB, durable deadline holds и отдельными run-scoped токенами. Disposable checkouts не разделяют mutable worktree и upstream credentials. В production linux-smoke подключён к внутренней control-сети Broker; cache/inputs/tooling требуют рабочего маршрута к Broker, одного публичного HTTPS clone недостаточно.

Durable смена окружения использует явно заданный operator checkpoint: остановка Callee и credential fence → snapshot исходников с сохранением base ancestry → cleanup старого worker → execution_reconfigure → отдельный owner approval → новая immutable среда и фиксированный continuation. Task и исходный deadline сохраняются; максимум две замены, один admission на checkpoint, отмена охватывает цепочку. Ожидание approval не резервирует worker capacity. Это opt-in политика workflow; в стандартных coding packs checkpoints по умолчанию не включены. Произвольный live graph не сериализуется и не переигрывается. Требуется execution/v3.

Artifact inputs реализованы и развёрнуты через execution/v2: до восьми файлов, суммарно до 1 GiB, точные source run/name/SHA256 и исходная сессия. Source run должен быть терминальным с cleanup=done; transactional retention holds защищают принятые зависимости. Передача возобновляется до начала исполнения.

Продолжения и одобрения

Generic webhook в текущем Balda запускает изолированное задание. Канонический канал исходной сессии остаётся Mattermost; Telegram approval не меняет её locator. Продолжение исходной сессии использует balda.state и balda.session.wait; попытка и наблюдатель сохраняются до Start/retry. Потерянный admission восстанавливается через execution_lookup, отмена закрывает и поздний идентичный запрос. Прежние callback routes Broker приостановлены; недоставленные cursors сохранены.

Telegram approval bot получает вопрос только для явно выбранных сессий; иначе вопрос принадлежит исходной беседе. В текущем контуре telegram_approvals.timeout_seconds=1800: окно ответа — 30 минут. min_run_ttl_seconds=3600 требует для новых запусков выбранных сессий общий TTL не меньше часа; более короткий запрос получает approval_window_too_short до admission. TTL включает очередь, планирование, ожидание ответа и исполнение; исходный deadline остаётся жёсткой границей и при появлении вопроса не продлевается. Сообщение сначала отправляется без кнопок, message ID сохраняется в state, затем публикуются controls. Рестарт завершает прерванную публикацию или renewal без повторного callback. Устаревшая копия очищается при callback до сохранения update cursor. Ответ владельца передаётся через bound execution_respond; модель не подменяет его. execution_retry сохраняет точный task, Story, revision, executor и действительное одобрение; новый scope требует нового решения. Для environment checkpoint используется execution_reconfigure; обычный retry таких runs запрещён.

Managed lifecycle и native wait restart проверены на развёрнутом Balda. Реальный conversational smoke прошёл: модель использовала исходные Story/Task, подтвердила observer/recovery waits, дождалась фактического Telegram-ответа владельца и получила succeeded, cleanup=done. Все шесть артефактов скачаны с проверкой SHA256; единственный итоговый ответ подтверждён через Mattermost API в исходной беседе, оставшиеся waits отменены. Приватные доказательства: state/balda-channel-context-20261015/. Outage/restart реальной модельной беседы также прошёл: Balda получила HTTP 502, затем Broker/Prism/Balda были перезапущены; сохранились тот же run/Story, provider thread и исходный deadline. После фактического Telegram approval подтверждены succeeded, шесть скачанных SHA256-проверенных артефактов, cleanup=done, закрытие Story/Task и единственное сообщение о завершении restart-приёмки в исходном Mattermost. Native waits отменены, duplicate admission и остаточных worker container/volume нет. Существующие сессии принимают новый capability snapshot через обычный /reset; обновление само их не сбрасывает.

Проверки

  • Полные race/vet Broker на macOS ARM64 и Linux ARM64; Callee adapter, source/binary govulncheck — 0 reachable vulnerabilities, secret scan — без находок.
  • Развёрнутый Balda source 6238856b: полный race, lint, architecture gate и govulncheck (0 reachable); SQLite/PostgreSQL migration regressions, оба migration validators, managed plugin lifecycle и native wait restart. Существующий Codex thread продолжился с исправленным Mattermost-контекстом.
  • Production service acceptance: настоящий Callee Human → restart Broker/Prism → resume → шесть артефактов с проверенными SHA256 и provenance Git cache → succeeded, cleanup=done; Task и Story закрыты.
  • Реальная Balda-сессия: исправленный Mattermost-контекст → durable waits → Broker smoke → фактический Telegram approval → шесть скачанных артефактов с проверенными SHA256 → cleanup=done → итог в исходной Mattermost-беседе. Доставка и отсутствие дубликата подтверждены readonly API.
  • Настоящая macOS VM: verified Go archive через scoped tunnel, tooling.json, один XCTest без ошибок и сохранённый xcresult; восемь артефактов с проверенными SHA256, включая repository.json, VM cleanup подтверждён.
  • Реальные Make/C, Python, Node и JVM проекты на macOS и Linux; Docker builder/Runner/Callee cache hit и изменение Node SDK; durable смена окружения с двумя рестартами и одним выполнением внешнего действия; отдельная проверка реального go run при /tmp noexec.
  • Artifact input transfer/restart/cleanup и установка из Linux ARM64 release archive без исходников и Go прошли.
  • Runtime archives: все четыре платформы — native. Linux AMD64 проверен на физическом htpc x86_64; Darwin AMD64 — на MacBook Pro 13″ 2014, Intel i5-4278U, macOS 12.6.8 (21G725), Python 3.8.9 через pinned Virfield SSH. Оба AMD64-прогона проверили семь binaries, MCP/auth rejection, synthetic vault import/revoke, SQLite backup и graceful shutdown; рабочие provider credentials не использовались.

Сервисные fixtures не подтверждают выбор tools и доставку результата моделью в настоящей беседе.

Незавершённый объём

Область Что остаётся
Recovery Выбран порядок: unattended восстановление рабочих ключей из защищённой копии, затем OAuth при неудаче восстановления/refresh. Production escrow ещё не настроен: нужен независимый recovery public key или secret store. Native перенос тестового vault проверен; рабочие master keys не экспортировались
Docker providers Для настроенных Linux OpenCode/DeepSeek, Codex и Claude нужны отдельные реальные Story, повтор на свежем worker, restart, credential checkpoint/reuse и проверка sandbox/запрета записи. Синтетические lifecycle-тесты не закрывают эту приёмку
Provider lifecycle Для macOS Claude не закрыта реальная expiry/upstream revocation; для macOS OpenCode/DeepSeek — denied-write и upstream revocation. Claude умеет сохранить явный отказ native cache как reauthentication-required и запросить OAuth при следующем admission; это не доказательство реальной provider-приёмки

Источник требований — docs/work-plan.md. iPad, прикладные UI/PR workflows и права Obsidian принадлежат вызывающему проекту или Balda.

Конфигурация и восстановление

Приватный Compose: state/deploy/compose.production.json; конфиги broker.json, worker.json, assets в state/deploy/assets. Токены находятся только в secret-файлах.

После выбора согласованного проверенного комплекта применять из репозитория:

docker-compose -f state/deploy/compose.production.json -p execution-broker up -d --no-build worker broker prism

До смены комплекта завершить runs/cleanup, сохранить state/config/image pins и исходные immutable assets. Сам Git commit deployment не меняет.

Backup перед текущим обновлением: state/backups/20261015-before-rc32. Проверены SHA256, 31 SQLite database и inert restore шести компонентов, включая encrypted credential vault. Все три credential identity были освобождены и checkpointed. Restore не запускал сервисы; master keys Keychain в backup отсутствуют. Это подтверждение восстановления production snapshot на том же хосте. Отдельная native-проверка перенесла синтетический encrypted vault с macOS ARM64 на физический Linux AMD64: отсутствие и подмена ключа отклоняются без перезаписи ciphertext, отдельный escrow key восстанавливает запись, revoke работает, fresh enrollment в новый vault с новым ключом проходит. Production credentials и Keychain keys в этом тесте не использовались. Он не заменяет escrow или повторную авторизацию реальных аккаунтов после потери хоста.

Актуальные согласованные state/config backups обоих Balda, exact image/binary hashes и доказательства restart/native/off-host fixture проверок: state/balda-upstream-hooks-20261015/. Более ранние state/home backups обоих Balda: state/balda-upstream-rollout-20261015/. Рабочие account/config hashes после обновления совпали с исходными. Приватные отчёты проверок основного комплекта: state/broker-rc32-rollout-20261015/. Broker hotfix: state/telegram-timeout-20261015/, включая консистентный broker.before.db с успешными integrity/foreign-key checks и сохранённый Compose для отката. Hotfix прошёл полный make check, Linux ARM64 race для Broker/config/HTTP API и govulncheck без достижимых уязвимостей. Release archives rc32 остаются неизменными и содержат исходный fee5409; hotfix развёрнут отдельным Broker image. Native Darwin AMD64 proof: state/balda-pr62-review-20261015/native-darwin-amd64.json. Проверочный скрипт поддерживает штатный Python 3.8; публичные rc32 archives не перезаписывались. Приватные отчёты не входят в release archives.

Контракты и процедуры: docs/protocol.md, docs/tooling.md, docs/environment-changes.md, docs/repository-cache.md, docs/operations.md, docs/telegram-approvals.md, docs/recovery.md, docs/testing.md.