[2026-10-15] eagle: personal/plans/balda-callee-prism-plan.md personal/projects/archive/balda-callee-prism-plan-through-2026-10-14.md personal/projects/archive/balda-mattermost-connector-design-2026-09.md personal/projects/archive/callee-prism-contracts-2026-09-29.md personal/projects/balda/balda-mattermost-connector.md personal/projects/personal-os/personal-os-status-2026-10.md personal/tech/callee-prism.md
This commit is contained in:
1 parent
0301d4408a
commit
2ad9bba688
7 files changed
+1904
-1848
No files matched your search
Executable → Regular
+21
-656
@@ -1,665 +1,30 @@
|
||||
> [!WARNING] Исторический документ
|
||||
> Не использовать как runbook текущей Balda. Актуальная локальная схема, пути и команды: [[personal/projects/balda/setup|Balda — актуальный локальный запуск]].
|
||||
> Текущий контейнер: `balda-mm-mac`; config: `/Users/admin/Docker/balda-mm-mac/config/config.yaml`; Obsidian MCP: `type: http`, `http://host.docker.internal:3101/mcp`.
|
||||
> Материал ниже сохранён только как история.
|
||||
> Актуальные результаты локального прогона 2026-10-14, статус кандидата rc.26 и незавершённые планы: [[personal/projects/balda/execution-broker|Execution Broker — текущий локальный контур]]. Старые NO-GO и SHA ниже относятся к указанным историческим запускам.
|
||||
# Balda / Execution Broker — план приёмки
|
||||
|
||||
# Текущее состояние — Balda / Broker — 2026-10-03 22:41 Бишкек
|
||||
Проверено: **2026-10-15**. Общая release-ready приёмка ещё не закрыта. Точные работающие версии и доказательства: [[personal/projects/balda/execution-broker]]. Запуск двух Balda: [[personal/projects/balda/setup]].
|
||||
|
||||
Статус: **приёмочный Docker-прогон выполнен на прежнем образе; автоматическая публикация исправлена, а Balda запущена из текущего исправленного HEAD PR #12 (`73e02156`). Общий release остаётся NO-GO до нового end-to-end прогона, подтверждающего публикацию и уведомления на образе из текущего HEAD `73e02156`.** Записи ниже — история и могут содержать устаревшие статусы.
|
||||
## Контур
|
||||
|
||||
- **Прогон:** `run-fbe2cb459fe2965554402aba1bd5fcd0` стартовал с `a030ce3`, завершился `succeeded`, `cleanup=done`, `quality.passed=true`. Worker создал `4dafb9d` для команды `hi`. В исходном Mattermost треде `jqor5w1qd3n5irizqd1jqued1a` Balda durable outbox хранит два разных отправленных сообщения с provider ID: запрос апрува (event 13) и финал (event 30). Повторы webhook шли с теми же dedupe keys; cleanup (event 31) не создал третий финальный пост.
|
||||
- **Доставка кода:** после успеха Balda не вызвала `execution_publish_artifacts`. Коммит `4dafb9d` опубликован вручную через проверяющий API Broker в Git-зеркало и чистый локальный `/Users/admin/Developer/go-cli-test`. После публикации `go test ./...` прошёл, `go run . hi` напечатал `hello world!`, `add 2 3` — `5`. Причина пропуска найдена: MCP давал Balda ссылки на артефакты, но требовал недоступный ей SHA из `commit.json`; webhook prompt также не называл публикацию явно. Broker теперь сам проверяет commit/quality/bundle, а `expected_head` в MCP необязателен. Активный Broker обновлён, Balda webhook prompt требует публикацию перед закрытием Story, плагин обновлён до rc.19. Idempotent вызов действующего API без `expected_head` вернул HTTP 200 и прежнюю ревизию `4dafb9d`; новый автоматический end-to-end прогон ещё не проведён.
|
||||
- **PR [#12](https://github.com/baldaworks/balda/pull/12):** открыт, не draft, HEAD `73e02156`; локальные проверки прошли, все 8 GitHub CI checks этого HEAD прошли, ревьюер запросил исправление ошибки HTTP 404/503, которое включено в новый коммит. Изменение маршрутизирует header-authenticated webhook по `chat_id`, даёт fallback для отсутствующей/неактивной сессии и receipt после реальной отправки. Чистый checkout PR находится на `73e02156`. Прежний вывод о другом SHA Balda был неверен: `d094943b` в Go metadata относился к внешнему репозиторию Broker, а `deepseekfix` был унаследованной меткой старого образа. Теперь Balda запущена на образе `balda-mm:pr12-73e02156-20261003`, собранном из чистого текущего HEAD PR #12; хеш запущенного бинарника совпадает с build artifact `7673f939…`. Текущий конфиг прошёл `balda validate`, плагин rc.19 установлен. Ревьюер `metalgman` оставил `CHANGES_REQUESTED` из-за HTTP 404 при временном сбое чтения session. Исправление отправлено в PR коммитом `73e02156`: 404 остаётся только для `ErrSessionUnavailable`, прочие ошибки resolver дают 503, HTTP-регрессия добавлена. Локально `go test -race ./...` и `go tool golangci-lint run` прошли; все 8 checks нового HEAD прошли. После CI нужен повторный сквозной прогон.
|
||||
- **Следующий контроль:** проверить автоматическую публикацию без ручного API-вызова в новом прогоне и повторить уведомления на образе из `c5186037`. PR и Broker-изменения не слиты автоматически.
|
||||
Balda ведёт исходную беседу и durable waits; Broker управляет admission, одноразовым worker, credentials, deadline и артефактами. Callee выполняет закреплённый workflow через выбранный ACP executor. Prism проецирует факты выполнения в локальные Story/Task Beads. Прикладные iPad/UI-сценарии и права Obsidian относятся к вызывающему проекту и Balda.
|
||||
|
||||
---
|
||||
## Подтверждено
|
||||
|
||||
# Live state — Broker/Balda workspace run — 2026-10-02 21:42 Бишкек
|
||||
- Оба Balda обновлены, общие инструменты и policy выровнены; Eagle дополнительно имеет Asana readonly. Модели, аккаунты и история сохранены.
|
||||
- Native runtime archives проверены на Darwin/Linux ARM64/AMD64, включая физический Intel Mac с Monterey и физический Linux x86_64.
|
||||
- Generic tooling для Make/C, Python, Node, JVM и Go, immutable repository cache, artifact inputs и opt-in environment checkpoints реализованы и проверены.
|
||||
- Реальная Mattermost-беседа прошла owner approval через Telegram, outage/restart, возврат в ту же сессию, проверенные артефакты и cleanup.
|
||||
- Linux Claude/OpenCode прошли реальные Story и reuse/restart. Codex прошёл две полные Story на свежих macOS VM, включая restart Broker/issuer. Тесты из артефактов выполнены независимо.
|
||||
- Read-only permission-handler Claude/OpenCode отклоняет инъецированные ACP-запросы записи; тестовый файл не создаётся. У OpenCode native plan policy не менялась.
|
||||
- Исправленные macOS bootstrap развёрнуты; прежние архивы и конфиг сохранены для отката. Подготовлен защищённый GPG escrow; шесть тестов используют синтетические ключи.
|
||||
|
||||
Статус: **live Balda → Broker продвинут дальше: local-git checkout, Docker network, status webhook и writable workspace root исправлены; нужен повторный Mattermost `/execute` для end-to-end приёмки. Public stable ещё NO-GO.**
|
||||
## Открытые границы
|
||||
|
||||
## Что произошло
|
||||
| Область | Условие завершения |
|
||||
| --- | --- |
|
||||
| Linux Codex | Совместимый nested sandbox при сохранённой изоляции Docker worker; сейчас namespace creation завершается отказом |
|
||||
| Recovery рабочих аккаунтов | Независимый recovery public key или secret store, off-host escrow и проверенное восстановление реальных аккаунтов; рабочие ключи пока не экспортированы |
|
||||
| Provider failure lifecycle | Реальные expiry/upstream revocation и повторная авторизация на отдельных тестовых identity; рабочую Claude-сессию отзывать запрещено |
|
||||
| Codex read-only | Отдельная проверка фактического отказа записи и итоговый production-прогон закреплённого bootstrap |
|
||||
|
||||
Пользователь гонял Mattermost-задачу `go-cli-test/go-cli-test2` через Balda. Первые отказы были не пользовательскими: Broker требовал HTTPS origin/allowlist, Docker worker не мог checkout локальный Broker Git remote, OpenCode+DeepSeek не был доступен в Linux-container профиле, статусы не возвращались в текущий thread, а `developer` root был смонтирован в Broker как read-only. Это live-инцидент интеграции, а не ошибка пользователя.
|
||||
Задачи и их статусы ведутся в локальном Beads/Prism, корневая Story `eb-71b7971ac3fdd03b8ff6b198`. Этот документ задаёт границы приёмки, а не второй backlog. Контракты и команды — в `docs/work-plan.md`, `docs/support.md`, `docs/recovery.md`, `docs/executors.md` репозитория Broker.
|
||||
|
||||
## Исправлено в live
|
||||
|
||||
1. **Local Git checkout.** Для `/local-git/` URL Runner больше не делает shallow fetch, потому что dumb HTTP не поддерживает `--depth=1`; local Git object writer переведён на SHA-1. Проверенный local-git revision для `go-cli-test`: `b6ea84fcbacdd509aec7ce43efe1fe3aa044abe0`.
|
||||
2. **Docker/OpenCode/DeepSeek.** Добавлен Linux worker profile `linux-opencode-deepseek`; worker умеет создавать disposable контейнеры в `execution-broker_control`, чтобы они видели Broker как `http://broker:7791`. Образ worker/executor обновлён до `sha256:5dd416c40c69821c53f9cd5436238cc145da9ea0c746a03fb282004914ecfe55`.
|
||||
3. **Status delivery.** Broker добавлен в обе сети `execution-broker_control` и `balda-mm-mac_default`; Balda config получил webhook `/webhook/execution-acceptance-current` на текущий Mattermost thread `7bjw4g7o1jdsbmjbqd649xxgaw:c96xswjbufnj7rtm3exny81xwc`; Broker notification route временно wildcard `chat_id="*", topic_id="*"` на этот webhook, чтобы не зависеть от смены Mattermost session id.
|
||||
4. **Workspace root creation.** Live override `state/deploy/compose.chat-login.yaml` исправлен с `/Users/admin/Developer:/workspace-roots/Developer:ro` на `rw`; Broker container пересоздан вручную с writable mount. Проверено внутри Broker: `/workspace-roots/Developer` показывает `RW=true`, временная папка создаётся и удаляется.
|
||||
5. **Container topology.** `execution-broker-broker-1` слушает `:7791`, `execution-broker-worker-1` в `execution-broker_control`, `balda-mm-mac` в `balda-mm-mac_default`; Broker имеет alias `broker` в обеих сетях.
|
||||
|
||||
## Проверено
|
||||
|
||||
1. `git fetch` + `git checkout` из disposable executor container по `http://broker:7791/local-git/0f18a21313cad59068830293b7817883.git` на commit `b6ea84fcbacdd509aec7ce43efe1fe3aa044abe0` прошли успешно.
|
||||
2. Изнутри Broker успешно создана и удалена probe-папка в `/workspace-roots/Developer`; ошибка `read-only file system` для создания `go-cli-test2` должна быть снята.
|
||||
3. `env GOCACHE=/private/tmp/eb-go-cache go test ./internal/store ./internal/config ./internal/worker` прошёл.
|
||||
4. Unit tests `internal/broker` на notification path не были полностью прогнаны в sandbox: `httptest` bind на loopback запрещён текущим окружением; это test-environment limitation, не runtime-доказательство.
|
||||
|
||||
## Открыто прямо сейчас
|
||||
|
||||
1. Повторить из Mattermost: `@balda /execute в репо go-cli-test2 собери Go CLI проект через Docker + OpenCode + DeepSeek`.
|
||||
2. Убедиться, что Balda больше не просит ручной `mkdir`, HTTPS origin или ручной status; ожидаемый flow: request/grant folder access → local managed Git remote → `execution_start` → Docker/OpenCode/DeepSeek run → terminal status в той же теме.
|
||||
3. Если следующий run снова падает, смотреть новый `run_id`, Broker events и Balda webhook logs; не ретраить старый failed run.
|
||||
4. После успешной live-приёмки убрать временный wildcard notification route и заменить его нормальной маршрутизацией статуса по фактическому Mattermost session/thread.
|
||||
5. Закрепить все live hotfixes в репозиторной конфигурации/compose, чтобы `docker-compose up` не вернул read-only mount или старые network settings.
|
||||
|
||||
## Файлы/настройки, затронутые live-фиксами
|
||||
|
||||
- `/Users/admin/Developer/execution-broker/internal/runner/runner.go` — non-shallow fetch для local Git remotes.
|
||||
- `/Users/admin/Developer/execution-broker/internal/broker/repository_local.go` — SHA-1 Git object IDs.
|
||||
- `/Users/admin/Developer/execution-broker/internal/config/config.go` — `container_network`, wildcard notification validation и workspace config fields.
|
||||
- `/Users/admin/Developer/execution-broker/internal/worker/worker.go` — worker-created containers получают configured Docker network.
|
||||
- `/Users/admin/Developer/execution-broker/internal/store/store.go` — wildcard notification lookup.
|
||||
- `/Users/admin/Developer/execution-broker/deploy/compose.yaml` — Broker alias `broker` в control/balda networks.
|
||||
- `/Users/admin/Developer/execution-broker/state/deploy/broker.json` — live worker image/network и notification route.
|
||||
- `/Users/admin/Developer/execution-broker/state/deploy/worker.json` — live worker image/network.
|
||||
- `/Users/admin/Developer/execution-broker/state/deploy/compose.chat-login.yaml` — Developer root теперь `rw` для Broker.
|
||||
- `/Users/admin/Docker/balda-mm-mac/config/config.yaml` — добавлен webhook route `execution_acceptance_current`.
|
||||
|
||||
---
|
||||
|
||||
# Balda + Prism/Beads + Execution Broker + Callee + Codex / Claude / OpenCode
|
||||
|
||||
> Обновлено: 2026-10-02 после push ветки workspace.
|
||||
> Статус: **локальный Docker/OpenCode сценарий принят; live Balda → Broker → Prism/Mattermost и public stable ещё NO-GO.** Удалённая ветка `codex/broker-workspace-repos` проверена на GitHub: HEAD `f237556` (основная реализация `7eda0d6`). Удалённый `main` — `cb9d54b`; workspace-ветка в него не слита.
|
||||
> Канонический смежный проект Virfield: [[personal/projects/virfield]]. Исторические результаты ниже сохраняются как хронология; текущие статус и приоритеты — в этом блоке.
|
||||
|
||||
### Текущий handoff — создание локального репозитория Broker
|
||||
|
||||
**Реализовано и запушено:** MCP `execution_repository_create` и HTTP `POST /v1/workspaces` создают идемпотентный Git-репозиторий под настроенным `workspace_root` (на этом Mac — `/Users/admin/Developer`). Balda выбирает короткий `name_hint` сама, передаёт текущие `chat_id/topic_id`, получает `workspace://` и полный commit SHA, затем передаёт их в `execution_start`. Нельзя просить пользователя заранее создавать или называть репозиторий. Gateway проверяет принадлежность chat/topic, чистый checkout и точный revision; одноразовый worker получает mount только конкретного repo в `/workspace`. Docker worker остаётся с отдельным образом установленного OpenCode/Callee/Runner; issuer разрешает workspace IDs только при явном `--workspace-repositories`. Плагин содержит инструкцию Balda использовать новый инструмент. Код и тесты находятся в удалённой ветке `codex/broker-workspace-repos`.
|
||||
|
||||
**Проверено локально:** отдельный Broker/gateway/issuer создали `workspace://balda-go-cli-d427a5a9a939` в `~/Developer/balda-go-cli-d427a5a9a939`. Synthetic Story `run-7d10077b345641df09bb9af459c2dd7e` с OpenCode/DeepSeek прошёл роли, Human approval, verifier (9 выполненных проверок), reviewer, quality gate, 6 SHA-проверенных артефактов и cleanup `done`; финальный run — `succeeded`. В репозитории локальный commit `dbb2519`, checkout чистый, remote не добавлялся. Отдельная сборка `docker build --network=none` из созданного Dockerfile прошла на хосте; образ напечатал `Hello, Ada!`, пустое имя завершилось с ожидаемым кодом 2. `make check` прошёл в изолированной рабочей копии `state/isolated/broker-workspace-repos`. Тестовый стек остановлен, credential lease освобождён.
|
||||
|
||||
**Граница доказательства:** это прямой изолированный вызов Broker, не сообщение Balda из Mattermost и не Prism Story. Живые Broker/gateway/Balda на новый workspace-профиль и MCP tool не переключались. Пушнутая workspace-ветка основана на RC9 `6091a61`, а проверенные Docker/OpenCode runtime-исправления находятся отдельно в локальном `codex/claude-release-fixes` (`5792cff`): в запушенном Dockerfile worker пока нет Go/Python, `GOTMPDIR` и нужных runtime-настроек. Проверенный успешный прогон использовал собранный локально образ с этими исправлениями. Поэтому одного push `f237556` недостаточно для live-развёртывания. В логах успешного Story встречался ACP `fs/write_text_file: Method not found`; на результате этого прогона не сказалось, но совместимость ACP требует проверки.
|
||||
|
||||
**Следующие шаги:**
|
||||
|
||||
1. Свести workspace-ветку с проверенными Docker/OpenCode изменениями `5792cff`, закрепить workflow digest и worker image ID, прогнать `make check` и Docker Story на точном объединённом commit.
|
||||
2. Развернуть этот commit в live Broker/gateway: отдельный `linux-container` профиль с `workspace_root=/Users/admin/Developer`, mount корня только в gateway, workspace scope в issuer; обновить managed plugin Balda и проверить, что она видит `execution_repository_create`.
|
||||
3. Попросить Balda в Mattermost создать новый проект **без имени repo и без готового checkout**. Проверить фактическую цепочку: MCP create → Prism Story → `execution_start` → Human approval в той же теме → события/артефакты в Mattermost/Prism → terminal cleanup и чистый локальный Git commit.
|
||||
4. После live-приёмки проверить ACP-ошибку, CI точного SHA, release/rollback и оставшиеся security gates; только затем считать public stable готовым.
|
||||
|
||||
## 1. Цель
|
||||
|
||||
Balda принимает задачу в Mattermost, ведёт Story через Prism/Beads и запускает выполнение через Execution Broker. Класс выполнения выбирается по задаче: обычная разработка — изолированный Docker worker; Xcode и macOS API — одноразовая VM Virfield; изменение управляемого хоста — отдельный capability lease.
|
||||
|
||||
```text
|
||||
Mattermost → Balda → Broker → Docker gateway → disposable Linux worker → Callee → OpenCode/Claude/Codex ACP
|
||||
↘ Virfield → macOS VM → Runner → Callee → ACP
|
||||
Balda → Prism adapter → bd → Dolt/Beads
|
||||
ACP result → Callee event → Broker event log → Balda → Prism/Beads + Mattermost
|
||||
```
|
||||
|
||||
При создании локального проекта Broker/Gateway создаёт Git-репозиторий в настроенном каталоге Mac. В worker монтируется только этот репозиторий; Docker socket, credential vault и весь каталог `~/Developer` внутрь worker не передаются. Для macOS VM действуют отдельные правила без host shared folders.
|
||||
|
||||
## 2. Подтверждённый статус и оставшаяся интеграция
|
||||
|
||||
### Balda v0.4.2 + RC10 plugin — 2026-10-02, 01:08 Бишкек
|
||||
|
||||
- Рабочая Balda обновлена с `0.1.16-session-feedback` до официального `v0.4.2` (`86f9139`) через локальный образ из SHA-проверенного release binary; прежний образ и полный snapshot состояния сохранены для отката. Плагин обновлён с `rc.6` до `0.1.0-rc.10`. После restart: `balda validate: ok`, Mattermost transport configured, ошибок запуска нет. GitHub Actions и push не выполнялись.
|
||||
- Первый пользовательский `/execute` вернул `Unknown command`: Balda CLI установила файлы плагина, но не активировала его в managed-каталоге. После второй полной резервной копии официальный startup-import Balda активировал RC10. В live DB: enabled plugin, 1 command, 1 skill, 0 diagnostics; snapshot содержит `execute`, Mattermost запущен без ошибок. Повторная пользовательская команда ещё нужна для end-to-end приёмки. Старые сессии сохраняют прежний каталог возможностей. Детали и резервные копии: `/Users/admin/Developer/execution-broker/state/private-publication-audit-20261001/release-readiness-rc10.md`.
|
||||
- Повторный пользовательский `/execute` распознан, но после пяти 30-секундных таймаутов модели попал в deadletter; Broker run не стартовал. Старое имя `deepseek-chat` официально выведено из эксплуатации. У того же ключа доступны `deepseek-flash` и `deepseek-v4-pro`; Flash не завершил короткие пробы, Pro дал ответ за 8,6 с и tool call за 6,9 с. Тестовая Balda теперь использует Pro и документированный URL через локальную сборку `v0.4.2+deepseekfix`: timeout 180 с, режим размышления для DeepSeek выключен. Adapter tests и `balda validate` прошли, плагин RC10 активен, Mattermost переподключён. Это локальный hotfix, не официальный бинарник; свежая end-to-end команда ещё нужна.
|
||||
|
||||
### RC10 OpenCode permission и локальный релиз-кандидат — 2026-10-01, 23:20 Бишкек
|
||||
|
||||
- Чистый publication commit `ef1af48d33bf4e25d053c8d5d1fab62d5afa9c8b` создан только локально. GitHub Actions и push не запускались по решению оператора. Исходники проверены (`make check` в обоих checkout, Callee race, publication scan 215 файлов). Локальный release kit из пяти архивов прошёл SHA256 и exact-SHA проверку; Darwin ARM64 принят без Go, Linux ARM64 запущен без сети и записи. Доказательства: `/Users/admin/Developer/execution-broker/state/private-publication-audit-20261001/release-readiness-rc10.md`. Это не CI/signing evidence.
|
||||
- Предыдущий OpenCode build/deny тест реально выполнил запрещённую команду и экспортировал созданный файл. После исправления ACP diagnostic `run-3d420f795cdfcedac909b75167ded1b6` записал отказ `tool_kind=execute`; файл и patch отсутствовали, VM удалена. Штатный read-only OpenCode теперь использует `plan/deny` со строгим policy, пишущий — `build/allow` через ACP; остальные пары отклоняются до inference.
|
||||
- Обычный `macos-opencode-deepseek` профиль обновлён на credential-free bootstrap policy-v5 и workflow digest `sha256:f24146978e3c2a8792d98ab5d960e3032e51aa93f20dda3505e43f090f55a355`. Live Broker обновлён на локальный образ из точного RC10 релизного бинарника; `/healthz` вернул `0.1.0-rc.10`. Full Story `run-bc593b5eab0c18c49f2a16b395387b53` прошёл шесть ролей, Human approval, пять выполненных проверок verifier, review, quality gate, restart Broker/issuer, checkpoint и cleanup; шесть артефактов SHA-проверены. DeepSeek vault свободен, VM pool 2/2 свободен. Mattermost-сообщений не отправлялось.
|
||||
- Public stable по-прежнему не объявлен: CI отложен, а Docker sandbox/live provider, upstream revoke, Mattermost-origin и реальные managed-host проверки остаются открытыми.
|
||||
|
||||
|
||||
|
||||
### Проверка chat login — 2026-10-01, 13:36 Бишкек
|
||||
|
||||
- Clean publication HEAD `4dc0615`, исходная локальная repo `5875e5a`, ветка `codex/multi-executor-profiles`, PR https://github.com/mallexxx/execution-broker/pull/1 (draft/private). Изменения запушены и синхронизированы в Developer. Полный `make check`, реальный synthetic Keychain probe/checkpoint и Gitleaks по полной публикационной истории прошли. Оба CI-запуска нового HEAD `4dc0615` завершились успешно (branch и PR).
|
||||
- Реализован полноценный `claude auth login --claudeai`: profile/inference scopes, native access/refresh cache, привязка account+organization при checkpoint. Старый setup-token сохраняется до успешного обновления. Terminal handle очищается; остаётся только несекретная метка формата. Existing Codex vault не изменялся.
|
||||
- v2 сохранил static OAuth, создал VM и запустил первую роль; server-managed organization policy отклонила setup-token. Cleanup/checkpoint исправлены и подтверждены. v3 `run-36c7622122d50c626c17c3e913acf3a7` завершился `authentication_failed`, cleanup `done`: временный HOME скрывал системный Keychain. Это воспроизведённая ошибка окружения, а не подтверждённая задержка пользователя или expiration.
|
||||
- Исправление Keychain развернуто в issuer helper и worker bootstrap: системный HOME нужен macOS Security.framework, CLAUDE_CONFIG_DIR и CLAUDE_SECURESTORAGE_CONFIG_DIR остаются отдельными для login/run. Default Keychain/search-list не меняются. Проверены native write/read/auth status/export/delete и чтение обновлённого synthetic cache Runner с private HOME; эти проверки не заменяют реальный network refresh/inference.
|
||||
- Balda создал v4 Story `eb-73afda6e242885a0ff4503e3`, run `run-558545102ec40e23c6562eb2c4bf85fd`, key `chat-login-claude-account-20261001-v4`. Human auth доставлен в существующую тестовую тему; native browser consent уже завершён, полная account session сохранена в encrypted vault. Тот же run возобновился автоматически. Блокировка `image_in_use` снята соседней задачей; VM выделена, Claude ACP прошёл session initialization. Первая роль `specify` завершилась без final text (`callee_failed`, peer connection closed); точная причина ещё не установлена. Run failed, артефакты сохранены, cleanup done. Успешный Claude inference пока не принят. Образ и работу соседней задачи не меняли. UI automatic redirect, native local callback без copy/paste, success/failure состояния реализованы. Неверная версия Балди про expiration v3 исправлена в теме и ограничена правилом в plugin skill.
|
||||
|
||||
### Проверка Claude onboarding и ACP — 2026-10-01, 14:58 Бишкек
|
||||
|
||||
- Для валидированной Claude account-сессии Runner теперь восстанавливает `hasCompletedOnboarding` вместе с OAuth account metadata. Development commit `2cee913`, чистая публикация `f10d103`; полный `make check` прошёл. Credential-free bootstrap с новым Runner развернут в обычный `macos-claude`; Broker доступен.
|
||||
- Полный Claude Story повторно не прошёл: v5 `run-dfcd654b35e5e2dfeccf9e738f914ae4`, v6 `run-dd66bb66eacb1bda7b59a170775ea071` и warm-up Story `run-a7b2982dcf494c463f595944db4869a6` остановились в первом `specify` без final text. Все VM удалены. Диагностический Callee подтвердил пустые provider error code/message при полном prompt: `run-04fe781d89f9ccc3c172b7677e8c67b1`.
|
||||
- Короткие native CLI и ACP `specify` прошли в одной VM `run-8fc39c972340f894b30405aa06008a52`. Тот же полный prompt отдельно прошёл native Claude CLI в новой VM `run-b8f4f3970264eeffadafbc0040849692`: exit 0, непустой ответ, cleanup done. Лог title generation error был также в успешном ACP probe, поэтому сам по себе он не доказывает отказ auth. Похоже на сбой ACP session lifecycle на содержательных запросах; первопричина не установлена. Профиль Claude не принят для full Story. Временные диагностические профили удалены из Broker. Соседний образ Virfield не менялся.
|
||||
- Текущий кандидат — `0.1.0-rc.5`, clean publication commit `12a5add`. Канонический комплект из четырёх платформенных CI-архивов, plugin архива и SHA256SUMS загружен в приватный draft release. Все пять SHA256 совпали с CI, проверки прошли нативно на четырёх платформах, распакованные файлы прошли publication/Gitleaks. Локальные платформенные архивы отличаются из-за версии Go и дополнительных лицензий из кеша и не используются для публикации. Clean-machine install и Mattermost first-command остаются открытыми. Remote Git ref уже `12a5add`; [CI для точного SHA](https://github.com/mallexxx/execution-broker/actions/runs/36842265997) прошёл все 14 jobs через отдельный нерелизный validation tag. Private draft PR #1 всё ещё показывает прежний head `f10d103`, поэтому его старые checks не используем как доказательство RC5. Подробная запись: `/Users/admin/Developer/execution-broker/state/private-publication-audit-20261001/claude-onboarding-20261001.md`. Решение по RC5 и полный список release gates: `/Users/admin/Developer/execution-broker/state/private-publication-audit-20261001/release-readiness-rc5.md`.
|
||||
|
||||
Balda PR [#11](https://github.com/baldaworks/balda/pull/11) смержен в `main` 2026-10-01 15:00 Бишкек (`86f9139`); восемь CI checks успешны. Это закрывает upstream gate для исправления session-preparation feedback, но установленная Balda требует отдельной сверки с merge commit.
|
||||
|
||||
Production/stable release остаётся незакрытым: Claude Story и повторная свежая VM после рестарта issuer/Broker теперь проходят без входа (v4 `run-bd291c97e5e098ed2e2ca57b876a0b1a`, обычный профиль `run-1039e027ec5c7862367cb95a7fc02a51`; оба quality gate passed, cleanup done, Prism completed). Код исправления — dev commit `05e7c44`; RC5 draft устарел. Открыты provider-side expiration/revocation, OpenCode login/inference, Docker/remotes credential lifecycle и ранее перечисленные full-stack gates. Credentials и login capabilities в этой заметке не сохраняются.
|
||||
|
||||
### RC9 Docker credential lifecycle — 2026-10-01, 19:26 Бишкек
|
||||
|
||||
- Dev commit `74a10f2`, чистый publication commit `6091a610992c83abdf706c3721d2c5d75c117e56` запушен в приватный PR #1. Docker worker теперь получает credential от host issuer при первом start после durable admission, checkpoint-ит остановленный Runner до удаления container/volume и освобождает identity только после подтверждённого cleanup. Потерянный worker или отклонённый checkpoint удерживает владельца до явного revoke/recovery. Remote-host fixed plans остаются отдельными без provider credentials.
|
||||
- Синтетические DeepSeek-тесты покрывают reuse в двух свежих Docker run, запрет замены API key, capacity refusal без утечки owner, lost-worker revoke cleanup и private gateway checkpoint RPC. Полный `make check` в dev и publication checkout прошёл; publication scan — 214 файлов. Live Docker provider Story и Codex sandbox на совместимом хосте не приняты.
|
||||
- Локальный RC9 release kit точного SHA собран для Darwin/Linux ARM64/AMD64 и plugin; все 5 SHA256SUMS совпали. Darwin ARM64 check-release прошёл в fresh HOME без Go в PATH (7 бинарников, vault import/revoke, Broker MCP/auth, SQLite backup); Linux ARM64 семь бинарников запустились в изолированном контейнере без сети. Это локальные артефакты, не exact-CI и не подпись.
|
||||
- Push CI `36868572492` и PR CI `36868579280` для точного RC9 SHA завершились до первого шага: GitHub annotation указывает failed account payments или spending limit. RC9 CI assets и подписанной provenance нет; public release остаётся no-go. OpenCode/DeepSeek disposable run `run-ab12be94116626bc5e2ed8d42889d7b1` завершился `succeeded`, patch пустой, cleanup done, vault owner null; модель в plan mode прямо сообщила, что не вызывала `touch`, поэтому tool-level denial ещё не принят. Второй build-mode/permissions-deny bootstrap подготовлен, но новая Virfield image operation снова держит `available=0`. Временный профиль удалён, обычный Broker `healthz=200`.
|
||||
|
||||
### RC8 retry/backoff fix — 2026-10-01, 19:00 Бишкек
|
||||
|
||||
- В OpenCode denied-write probe Virfield вернул `image_in_use` из-за отдельной image_build операции, которая при лимите 2 VM намеренно устанавливает `available=0` для всех новых leases. Run был отменен до получения VM; чужая загрузка не прерывалась. Обнаружен Broker bug: промежуточная выдача credential snapshot сбрасывала exponential backoff, поэтому issuer выполнял частые issue/abort циклы. Исправлено в dev `f937ccc`, добавлен regression test; полный `make check` прошёл.
|
||||
- Live Broker image собран из точного RC8 commit и развернут только для Broker. Синтетический run `run-594708d118987f24a406c9410d3814ae` во время Virfield image lock показал retry_count 0 → 1 → 2, затем был отменён с `cleanup=done`; DeepSeek inference и Mattermost-сообщений не было. Evidence: `/Users/admin/Developer/execution-broker/state/private-publication-audit-20261001/rc8-live-backoff-probe.json`.
|
||||
- Дополнительный Linux ARM64 архив RC8 точного SHA собран локально; все семь бинарников запустились в контейнере без сети, Go и provider credentials. Это не exact-CI артефакт. Docker Codex в credential-free диагностике прошёл дальше только при отключённых seccomp и AppArmor, затем упёрся в `RTM_NEWADDR: Operation not permitted`; production изоляция не менялась.
|
||||
- Соседний Virfield image job `job-a56dffdf456ecf269dc7c18bce963a97` после полной загрузки IPSW и установки macOS перешёл в `needs_attention` на `assistant_dispatched` с `image_command_failed`. Общий maintenance lock остаётся, `available=0`; OpenCode denied-write VM ждёт восстановления владельцем Virfield job.
|
||||
- Clean publication RC8 `6984bc67e4a9b991ae66acf06d91578ffcff586b` запушен в приватный PR. Push CI `36863848919` и PR CI `36863854456` не стартовали из-за GitHub Billing & plans, подтверждено annotation. Локальный Darwin ARM64 архив точного commit прошёл binary-only check-release с Go вне PATH и SHA256SUMS, но не является exact-CI release asset. Public stable no-go.
|
||||
- Docker Engine 29.2.1 диагностирован отдельно: узкий seccomp профиль разрешает только user namespace и сохраняет запрет mount/network namespaces, но полный Codex bwrap sandbox всё ещё не запускается; даже одноразовый `seccomp=unconfined` дошёл до `Failed to make / slave: Permission denied`. Production worker flags не ослаблены.
|
||||
- Подробный ledger: `/Users/admin/Developer/execution-broker/state/private-publication-audit-20261001/release-readiness-rc8.md`.
|
||||
|
||||
### RC7 exact-SHA gate — 2026-10-01, 18:35 Бишкек
|
||||
|
||||
- Clean publication commit `5c213bb98b0caaa24bc7bb07ba73bd8589bdd07a` запушен в существующий приватный PR #1. Его push CI `36862025838` и PR CI `36862030297` не выполнили ни одного шага: GitHub annotation сообщает failed account payments или недостаточный spending limit. Старый RC6 CI не является доказательством для RC7. Обновление Billing & plans необходимо до публикации exact-CI release assets.
|
||||
- Локально в чистом checkout прошли `make check`, Callee race test, проверка 213 публичных файлов, plugin version `0.1.0-rc.7`. Локальный Darwin ARM64 RC7 архив из точного SHA прошёл `check-release.py` в чистом временном состоянии без Go в PATH, включая версии, vault, Broker MCP/auth и SQLite backup. Это локальный архив без подписи, не замена native CI artifacts.
|
||||
- Подробный release ledger: `/Users/admin/Developer/execution-broker/state/private-publication-audit-20261001/release-readiness-rc7.md`. Public stable по-прежнему no-go.
|
||||
|
||||
### OpenCode DeepSeek acceptance — 2026-10-01, 18:25 Бишкек
|
||||
|
||||
- Существующий DeepSeek provider Balda использован без вывода ключа: ключ через private pipe импортирован в отдельный зашифрованный `opencode-deepseek-work` vault. Нативный OpenCode 1.18.34 вернул `OK` на реальном `deepseek/deepseek-flash` запросе. Credential-free VM bootstrap и постоянный issuer на `127.0.0.1:7796` установлены; рабочий профиль `macos-opencode-deepseek` подключен к Broker.
|
||||
- Два полных синтетических Story (`run-cf83a0a3a0768d45f82199ae8db4176e`, `run-6b12f6189bc2e9b32fccadb596fc06b5`) прошли шесть ролей, Human approval, quality gate, шесть SHA-256-verified artifacts, Prism completion и cleanup. Второй запустился в новой VM и пережил перезапуск Broker/issuer на approval без browser login.
|
||||
- Между ними был отказ `run-c6d2008abe6308000375c2a4e55c0c3e` только из-за добавленного моделью поля `notes` в валидный отчет verifier. Узкое исправление parser в dev `396eb5a` принимает `notes`, но всё ещё отвергает другие неизвестные поля и неисполненные/ошибочные проверки; Callee race и полный `make check` прошли. Для публикации нужен новый exact-SHA кандидат.
|
||||
- OpenCode denied-write probe не дошёл до VM: Virfield зарезервирован соседней операцией image export (`image_in_use`). Проверочный run отменен с cleanup done, временный профиль удален. Upstream revocation/expiry ещё не проверены; static DeepSeek API key не имеет OAuth refresh.
|
||||
|
||||
### RC6 candidate и актуальная приёмка — 2026-10-01, 17:25 Бишкек
|
||||
|
||||
- Clean publication commit `2d786c4`, [CI 36854040694](https://github.com/mallexxx/execution-broker/actions/runs/36854040694) 14/14, приватный [draft RC6](https://github.com/mallexxx/execution-broker/releases/tag/untagged-4a40999515a9662c914c): четыре native CI-архива, plugin archive и SHA256SUMS побайтно сверены. GitHub draft SHA256 совпадают с локальным bundle. Remote main ещё не обновлён, публичного релиза нет.
|
||||
- Claude full Story прошёл в двух свежих macOS VM, включая обычный профиль после restart issuer/Broker без browser login; reviewer/verifier/quality gate passed, cleanup done, Prism completed. Запрещённая запись в read-only роли отклонена. Managed plugin `0.1.0-rc.6` установлен в рабочую Balda из CI архива.
|
||||
- Оставшиеся gates, доказательства и решение no-go: `/Users/admin/Developer/execution-broker/state/private-publication-audit-20261001/release-readiness-rc6.md`. До их закрытия RC6 остаётся приватным draft.
|
||||
|
||||
|
||||
Базовый релиз Virfield v2.0.0 опубликован. На Mac установлен более новый versioned-images/GHCR кандидат, который ещё не принят как production release. Актуальные Git/runtime, матрица golden/clone E2E и полный оставшийся план поддерживаются только в [[personal/projects/virfield]]. Сервисы используют deployment вне checkout; публикация архива и коммит исходников не обновляют runtime автоматически.
|
||||
|
||||
Локально подтверждено 2026-09-30:
|
||||
|
||||
- отдельный `execution-broker` repo и sidecar deployment; доступ из реального Balda container через MCP;
|
||||
- Virfield v2 lease → pinned SSH tunnel → Runner/Callee; чистый clone выполняет XCTest и отдаёт xcresult до cleanup;
|
||||
- полный Codex workflow с шестью свежими ролями и Human approval; реальный локальный commit и пять unittest проходят;
|
||||
- persistent OAuth vault/Keychain и host issuer: две последовательные свежие VM работают без нового browser login, checkpoint сохраняется до удаления VM; последняя проходит quality gate, restart Broker/issuer и Story completion;
|
||||
- Prism/Beads projection и local Story lifecycle. Доказательства: `/Users/admin/Developer/execution-broker/state/private-publication-audit-20261001/acceptance.md`.
|
||||
|
||||
До production/public stable release остаются Mattermost-origin/delivery, совместимый Docker Codex sandbox, приёмка credential lifecycle на Docker/remotes, реальные managed-host identities/TLS/rollback, согласованное восстановление всего стека, remote CI/clean-machine distribution/signing. Встроенные роли пока sequential; параллельные worktrees и модельные бюджеты не реализованы. Полный аудит: `/Users/admin/Developer/execution-broker/state/private-publication-audit-20261001/production-review.md`.
|
||||
|
||||
Статус остальных проектов и provider-конфигурация проверяются в их собственных источниках; релиз Virfield не является подтверждением их готовности.
|
||||
|
||||
Подтверждено 2026-10-01:
|
||||
|
||||
- Чистый publication repo: `/Users/admin/Developer/execution-broker-public`, remote `https://github.com/mallexxx/execution-broker` (private), коммит `cb9d54b8369bfd7437b98ccf76b9ff3d2df397f5`. Частная development history не отправлена. Аудитные истории перенесены из public docs в private state.
|
||||
- CI `36815717157`: 10/10 успешных заданий. Нативное исполнение Darwin/Linux ARM64/AMD64; Linux дополнительно устанавливается из архива без Go, собирает четыре образа, проходит real Callee/Beads Human, рестарт Broker/Prism, проверку пяти артефактов и cleanup. Пять именно CI-архивов и SHA256SUMS загружены в private draft `v0.1.0-rc.4`; подписи отсутствуют.
|
||||
- Managed plugin `execution-broker` 0.1.0-rc.4 установлен через штатный Balda CLI. Старый standalone skill сохранён вне discovery roots. Файл Balda с MCP credentials имеет mode 0600; OAuth vault/Keychain сохранены.
|
||||
- Balda PR 10 принят upstream. Исправление bounded user-visible preparation failure отправлено в PR 11; локальные race/lint/architecture проверки прошли. Рабочая Balda обновлена до `0.1.16-session-feedback`, подключение Mattermost подтверждено. Первый PR 11 CI выявил отдельную гонку старого restart-теста; исправлена в `e0e953bc`, 50 повторов под race detector прошли. Финальный PR 11 CI `36817575956`/`36817575952`: 8/8 успешных проверок. PR открыт; upstream merge ещё не выполнен.
|
||||
|
||||
Весь стек нельзя объявлять полностью production-ready: свежий Mattermost-origin запуск нового managed `/execute` ещё не принят; Docker provider sandbox/автоматический OAuth на Docker и remotes, реальные host identities/TLS/rollback, per-role worktrees/model budgets и официальное подписанное распространение остаются отдельными незакрытыми границами. Имеющаяся приёмка Mattermost recovery и drained backup/restore не заменяет эти проверки.
|
||||
|
||||
|
||||
### Дополнение 2026-10-01: Claude CLI и OpenCode
|
||||
|
||||
В целевой объём включены Claude CLI и OpenCode с несколькими моделями. Balda выбирает allowlisted agent_profile из каталога Broker; executor/model задаются оператором. Секреты не входят в конфиг профиля, плагин, репозиторий или VM image. Callee остаётся владельцем workflow, а профиль не может ослабить authored permissions.
|
||||
|
||||
Реализовано в ветке `codex/multi-executor-profiles`, clean publication commit `35cbe3ad5710f8eb5a52147da068ac016fb137c6`:
|
||||
|
||||
- отдельные encrypted identities/Keychain accounts с backward compatibility существующего Codex vault; типизированные cache leases, проверка executor/provider/account и сохранение обновлённых credentials до освобождения VM;
|
||||
- automated enrollment: Claude official setup-token через private PTY без печати токена; OpenCode auth login в отдельном HOME/XDG с импортом только выбранного provider; API-key ввод скрыт; браузерное согласие остаётся одноразовым действием человека;
|
||||
- integrity-locked optional runtimes: Claude Code 2.1.286, Claude ACP 0.84.0, OpenCode 1.18.34; конфигурации и workflow packs, выбор модели, поддержка в каталоге и skill Balda; backup проверяет все identities;
|
||||
- локально прошли race/vet/build, Callee, credential/enrollment/backup/publication checks; реальный credential-free CLI/ACP probe на macOS ARM64 прошёл, npm audit и полный clean-history Gitleaks без находок. CI на четырёх платформах: https://github.com/mallexxx/execution-broker/actions/runs/36820468335 — 14/14 успешных заданий; native optional executor probe прошёл на всех четырёх платформах. Draft PR: https://github.com/mallexxx/execution-broker/pull/1.
|
||||
|
||||
Это ещё не принятые production-профили: нужны реальные Claude/OpenCode login/inference, повторная свежая VM без логина, expiration/revocation, проверка read-only режима и полный Balda Story. OpenCode OAuth без стабильного accountId отклоняется; Anthropic subscription OAuth не переносится в OpenCode. Автоматический issuer для Docker/remotes по-прежнему не реализован. RC4 и live Codex deployment не изменены.
|
||||
|
||||
Документация: `/Users/admin/Developer/execution-broker/docs/executors.md`. Подготовлены private launchers `/Users/admin/Developer/execution-broker/state/executor-enrollment/enroll-claude.command` и `enroll-opencode.command`; пока не запускались и не обращались к действующим credentials.
|
||||
|
||||
## 3. Владельцы ответственности
|
||||
|
||||
### Balda — оркестратор верхнего уровня
|
||||
|
||||
Balda:
|
||||
|
||||
- принимает задачу и уточнения из Mattermost;
|
||||
- создаёт и обновляет Story в Prism/Beads;
|
||||
- выбирает разрешённый workflow по его идентификатору;
|
||||
- запускает выполнение через Broker;
|
||||
- показывает запросы Human и итог пользователю.
|
||||
|
||||
Balda не управляет процессами внутри VM напрямую. Она работает только через контракты Prism adapter и Execution Broker.
|
||||
|
||||
### Prism adapter + Beads — долговременное состояние
|
||||
|
||||
Prism adapter принадлежит контуру Balda и физически может быть отдельным sidecar-контейнером.
|
||||
|
||||
Он:
|
||||
|
||||
- предоставляет Balda узкие операции Story/Task/phase;
|
||||
- вызывает `bd`;
|
||||
- подключается к Dolt/Beads database в соседнем контейнере;
|
||||
- обеспечивает идемпотентную запись событий Broker;
|
||||
- остаётся единственным писателем предметного состояния задачи.
|
||||
|
||||
Broker, Callee и Codex не пишут в Beads напрямую. Они возвращают факты выполнения, а Balda решает, как отразить их в Story.
|
||||
|
||||
### Execution Broker — инфраструктурный исполнитель
|
||||
|
||||
Broker — отдельный проект и отдельный репозиторий `execution-broker`. В production он живёт отдельным sidecar-контейнером рядом с Balda.
|
||||
|
||||
Он:
|
||||
|
||||
- получает от Balda команду запуска;
|
||||
- арендует VM через Virfield;
|
||||
- запускает VM runner и Callee;
|
||||
- хранит техническое состояние run и журнал событий;
|
||||
- передаёт ввод, отмену и ссылки на артефакты.
|
||||
|
||||
Broker не выбирает workflow, не исполняет его граф и не меняет Prism/Beads.
|
||||
|
||||
### Virfield — граница управления хостом
|
||||
|
||||
Virfield работает на Mac-хосте и владеет жизненным циклом VM:
|
||||
|
||||
- clone/start/stop/delete;
|
||||
- IP и SSH readiness;
|
||||
- сетевые туннели;
|
||||
- lease и принудительная уборка VM.
|
||||
|
||||
Аутентифицированный HTTP API `/api/v1` и HTTP MCP `/mcp` реализованы; daemon слушает loopback. Для Broker остаются проверяемая сетевая доступность и integration contract. Произвольного host shell в API нет.
|
||||
|
||||
### Callee и Codex — выполнение внутри VM
|
||||
|
||||
Callee исполняет workflow: фазы, ветвления, циклы, Human-паузы и запуск ролей.
|
||||
|
||||
`implementer`, `reviewer`, `verifier` — роли Callee. Каждая роль запускает новую Codex ACP-сессию с отдельным prompt и контекстом.
|
||||
|
||||
Codex изменяет код, запускает `xcodebuild`, тесты и другие команды внутри VM. Codex не запускает Callee и не управляет Story.
|
||||
|
||||
## 4. Prism и prism-callee
|
||||
|
||||
Официальный `prism-callee` — плагин к coding-agent host. В штатной схеме он делает coding agent владельцем Beads и запускателем Callee:
|
||||
|
||||
```text
|
||||
Codex → prism-callee skill → Callee → дочерние Codex sessions
|
||||
```
|
||||
|
||||
Эта штатная топология не является целевой, потому что верхним оркестратором должен оставаться Balda.
|
||||
|
||||
В целевой схеме используются отдельно:
|
||||
|
||||
- lifecycle и правила Prism — как основа skill/адаптера Balda;
|
||||
- Callee workflow pack — как версионируемые workflow-файлы внутри VM;
|
||||
- Beads — через отдельный Prism adapter;
|
||||
- Codex — только как исполнитель ролей Callee.
|
||||
|
||||
До реализации требуется проверить, какие части официального плагина можно импортировать без изменений, а какие нужно адаптировать для Balda.
|
||||
|
||||
## 5. Прямой data flow
|
||||
|
||||
1. Пользователь даёт Balda задачу в Mattermost без готового репозитория.
|
||||
2. Balda читает `execution_profiles`, выбирает `workspace_enabled` Docker worker и вызывает `execution_repository_create` со стабильным idempotency key, текущими `chat_id/topic_id` и собственным коротким `name_hint`.
|
||||
3. Broker через gateway создаёт локальный Git-репозиторий под настроенным workspace root и возвращает `workspace://` ID с полным commit SHA; Balda создаёт Prism Story.
|
||||
4. Balda вызывает `execution_start` с этим ID/revision, `story_id`, теми же chat/topic и allowlisted workflow/agent profile.
|
||||
5. Broker durable-записывает run, gateway монтирует только выбранный repo в одноразовый Linux worker, Runner запускает Callee и установленный ACP-исполнитель. Для Xcode вместо Docker используется отдельная VM Virfield.
|
||||
6. События, Human response, артефакты и cleanup идут через Broker; Prism/Beads и Mattermost обновляет Balda.
|
||||
|
||||
Пример полей запуска после создания репозитория:
|
||||
|
||||
```json
|
||||
{
|
||||
"idempotency_key": "story-42-attempt-1",
|
||||
"story_id": "story-42",
|
||||
"chat_id": "mattermost-chat-id",
|
||||
"topic_id": "mattermost-topic-id",
|
||||
"workflow_id": "opencode/story",
|
||||
"workflow_version": "sha256:<точный digest установленного workflow>",
|
||||
"repository": "workspace://broker-created-name",
|
||||
"revision": "<полный Git commit SHA>",
|
||||
"runtime_class": "linux-container",
|
||||
"worker_profile": "docker-dev",
|
||||
"agent_profile": "opencode-deepseek",
|
||||
"task": "Добавить Go CLI и тесты",
|
||||
"ttl_seconds": 3600
|
||||
}
|
||||
```
|
||||
|
||||
Broker возвращает `run_id` после надёжной записи команды; выполнение продолжается асинхронно.
|
||||
|
||||
## 6. Обратный data flow
|
||||
|
||||
1. Codex возвращает результат роли в Callee по ACP.
|
||||
2. Callee переводит workflow в следующее состояние и отдаёт структурированное событие VM runner.
|
||||
3. VM runner передаёт событие Broker; Broker сохраняет его до ответа Balda.
|
||||
4. Balda читает события через `execution_events(run_id, after_event_id)` и подтверждает курсор.
|
||||
5. Balda обновляет Story через Prism adapter и публикует значимые изменения в Mattermost.
|
||||
|
||||
События доставляются как минимум один раз. Повторная доставка безопасна благодаря уникальному `(run_id, event_id)`.
|
||||
|
||||
Минимальное событие:
|
||||
|
||||
```json
|
||||
{
|
||||
"event_id": 17,
|
||||
"run_id": "run-123",
|
||||
"story_id": "bd-42",
|
||||
"type": "role_completed",
|
||||
"phase": "review",
|
||||
"role": "reviewer",
|
||||
"status": "passed",
|
||||
"summary": "Tests pass",
|
||||
"artifacts": [
|
||||
{"kind": "git_commit", "ref": "abc123"},
|
||||
{"kind": "xcresult", "ref": "artifact://run-123/tests"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Тяжёлые логи и `.xcresult` не помещаются в журнал. Broker хранит только ссылки, checksum, размер и срок жизни.
|
||||
|
||||
## 7. Human approval
|
||||
|
||||
1. Callee доходит до Human node и приостанавливает workflow.
|
||||
2. VM runner отправляет `human_required` с вопросом и вариантами.
|
||||
3. Broker фиксирует состояние `waiting_human`.
|
||||
4. Balda показывает вопрос в Mattermost и получает ответ в том же session/topic.
|
||||
5. Balda вызывает `execution_respond`; Broker доставляет ответ в конкретный paused run.
|
||||
|
||||
Связка обязательна: `chat_id/topic_id ↔ story_id ↔ run_id ↔ human_request_id`.
|
||||
|
||||
Ответ должен быть идемпотентным: повторный `human_request_id` не возобновляет workflow дважды.
|
||||
|
||||
## 8. Execution Broker: контракт
|
||||
|
||||
### Где живёт
|
||||
|
||||
Отдельный контейнер в одном Docker network с Balda. У Broker собственный persistent volume с SQLite.
|
||||
|
||||
Northbound: HTTP MCP для Balda.
|
||||
Southbound: Docker gateway для `linux-container`, Virfield API и scoped SSH для `macos-vm`, отдельный host-runner для `remote-host`.
|
||||
Внутри одноразового worker: Runner → Callee → выбранный ACP-исполнитель.
|
||||
|
||||
### Основные MCP tools
|
||||
|
||||
1. `execution_profiles` — workflow, worker и agent allowlist.
|
||||
2. `execution_repository_create` — идемпотентно создать новый локальный Git repo для chat/topic.
|
||||
3. `execution_start`, `execution_status`, `execution_events`, `execution_ack` — durable run и события.
|
||||
4. `execution_respond`, `execution_cancel`, `execution_artifacts` — Human response, отмена и артефакты.
|
||||
5. `execution_remote_plan` и отдельные Virfield image tools — управляемые host/VM сценарии.
|
||||
|
||||
### Состояния run
|
||||
|
||||
```text
|
||||
accepted
|
||||
→ provisioning
|
||||
→ booting
|
||||
→ running
|
||||
→ waiting_human
|
||||
→ running
|
||||
→ succeeded | failed | canceled | expired
|
||||
```
|
||||
|
||||
Каждый переход записывается транзакционно вместе с событием. После рестарта Broker продолжает незавершённые run или переводит их в явно диагностируемое состояние.
|
||||
|
||||
### Внутреннее состояние Broker
|
||||
|
||||
Broker хранит только технические данные:
|
||||
|
||||
- `run_id`, `story_id`, idempotency key;
|
||||
- VM id, IP, lease deadline;
|
||||
- workflow id/version и process/session id;
|
||||
- event cursor, terminal status и error code;
|
||||
- artifact references и cleanup status.
|
||||
|
||||
### VM runner
|
||||
|
||||
Нужен небольшой процесс внутри образа VM. Он отделяет Broker от консольного формата Callee.
|
||||
|
||||
Runner:
|
||||
|
||||
- проверяет входной manifest и allowlist workflow;
|
||||
- запускает Callee в рабочей директории репозитория;
|
||||
- преобразует lifecycle/output в стабильные JSON events;
|
||||
- принимает cancel и Human response;
|
||||
- возвращает terminal result и artifact manifest.
|
||||
|
||||
Broker не должен парсить человекочитаемый ANSI/TTY-вывод Callee. Если Callee уже имеет стабильный machine-readable API, runner становится тонким адаптером.
|
||||
|
||||
## 9. Execution workers и распределение ресурсов
|
||||
|
||||
Broker планирует не только macOS VM. Все среды исполняют один versioned Runner protocol, но имеют разные `runtime_class`:
|
||||
|
||||
- `linux-container` — обычный код, CLI, Go build/test и статическая проверка Dockerfile; Docker socket в worker не передаётся, фактическая сборка образа требует отдельного host/builder шага;
|
||||
- `macos-vm` — Xcode, macOS APIs, GUI и UI tests;
|
||||
- `remote-host` — изменение конкретного хоста после Human approval.
|
||||
|
||||
Минимальный WorkerSpec:
|
||||
|
||||
```json
|
||||
{
|
||||
"runtime_class": "macos-vm",
|
||||
"worker_profile": "xcode-27",
|
||||
"agent_profile": "codex-default",
|
||||
"workflow_id": "prism/story",
|
||||
"repository": "git@host:org/repo.git",
|
||||
"revision": "main"
|
||||
}
|
||||
```
|
||||
|
||||
### Параллельные задачи
|
||||
|
||||
Balda поддерживает несколько независимых chat sessions. Turns внутри одной session сериализуются, разные sessions могут работать параллельно.
|
||||
|
||||
Callee поддерживает `Parallel`, но это fan-out Role visits внутри одного workflow. VM создаёт и распределяет Broker, не Balda и не Callee.
|
||||
|
||||
Политика пула:
|
||||
|
||||
1. Одна изменяющая macOS Story получает одну эксклюзивную VM.
|
||||
2. Implementer, reviewer и verifier используют ту же VM, но свежие ACP-сессии.
|
||||
3. Отдельная VM на каждый Role не создаётся.
|
||||
4. Одновременно работают максимум две macOS VM; остальные run стоят в очереди.
|
||||
5. Linux containers масштабируются отдельно и не занимают macOS VM slots.
|
||||
|
||||
Параллельные read-only роли могут работать в одной VM. Параллельные изменения получают отдельные Git worktrees; запись нескольких агентов в один checkout запрещена политикой Runner.
|
||||
|
||||
Ограничение в две macOS VM задаёт Apple Virtualization.framework, а не Balda. Практический лимит дополнительно зависит от RAM и CPU.
|
||||
|
||||
## 10. Изоляция, shared folder и секреты
|
||||
|
||||
Для `macos-vm` основная граница — одноразовая VM: исходники и Xcode build живут на её локальном диске, без host shared folders. Virfield выдаёт scoped lease/SSH, а VM удаляется после выгрузки результатов.
|
||||
|
||||
Для `linux-container` граница — одноразовый worker с read-only root, UID 65532, ограниченными capabilities и отдельным `/state`. Gateway имеет Docker socket и mount настроенного workspace root; сам worker получает только bind mount одного проверенного локального Git repo в `/workspace`. Broker и Balda не получают этот host mount. Запуск с `workspace://` требует `workspace_enabled`, соответствия chat/topic, точного commit SHA и чистого checkout. Credential issuer выдаёт scoped lease только после durable admission, checkpoint и cleanup завершают владение. Docker CLI/socket внутри worker отсутствуют.
|
||||
|
||||
Ни Balda, ни модель не получают пользовательский `~/.ssh`, credential vault или произвольный host shell.
|
||||
|
||||
### Credential management — обязательный scope (2026-09-30)
|
||||
|
||||
OAuth-вход выполняется один раз при enrollment или при необходимости повторной авторизации у провайдера. Перезапуск или пересоздание VM сам по себе не должен требовать нового входа.
|
||||
|
||||
Владелец provider credentials — отдельный host credential issuer Execution Broker. Virfield управляет VM/SSH leases, но не хранит OAuth пользователя. Balda, Prism/Beads и Callee-события получают только состояние; токены в их сообщения не передаются.
|
||||
|
||||
Обязательные свойства:
|
||||
|
||||
- долговременное зашифрованное хранилище вне VM и Git; на macOS master key находится в Keychain; права 0700/0600, atomic write и fsync;
|
||||
- выдача в конкретный run, repository и agent profile после durable admission; приватный файл в HOME гостя, не в checkout, environment, argv или golden/bootstrap;
|
||||
- одна OAuth identity арендуется одним run одновременно, чтобы VM не конкурировали за refresh token; ownership переживает restart Broker/issuer;
|
||||
- перед release VM обновлённый cache сохраняется обратно через приватный канал только после остановки ролей; блокировка снимается после подтверждённого удаления VM;
|
||||
- local revoke, provider-side revoke как отдельная операция, безопасное восстановление после утраты VM, отсутствие токенов в публичных API/артефактах; TTL Broker не считается upstream revocation.
|
||||
|
||||
Приёмка: новый clone выполняет реальные Codex роли без браузерного login; Broker/issuer переживают restart; checkpoint сохраняется до cleanup; следующий clone использует сохранённую сессию. Отдельно тестируются конфликт владельца, повреждение vault, отказ refresh, revoke и невозможность восстановить отозванный токен поздним checkpoint. Потерянный checkpoint блокирует повторную выдачу до явного восстановления, а не молча использует старый token.
|
||||
|
||||
Реализация и границы текущей версии: `/Users/admin/Developer/execution-broker/docs/credentials.md`. Live macOS приёмка завершена: `run-f94853e932ef9b620a28412b609c62c7`, все 6 ролей и quality gate пройдены, 5 unittest, cleanup done, encrypted checkpoint generation 6. Активный профиль Balda — `macos-codex` + `prism/story`; enrollment-only профиль отключён. Поддержка автоматического issuer сначала включена для macOS VM; Docker/remotes требуют отдельной приёмки того же жизненного цикла. OAuth может требовать нового входа после provider revoke/refresh rejection; это не штатный шаг каждого запуска VM.
|
||||
|
||||
### Workspace и артефакты
|
||||
|
||||
Текущий recipe Virfield создаёт VM без shared host folders. Код, mutable workspace и Xcode build живут на локальном диске VM; перенос исходников/результатов — через scoped SSH и Git либо `rsync/scp`. Артефакты выгружаются до release lease и получают уникальный путь `run_id/...`.
|
||||
|
||||
Добавление host mounts потребует отдельного решения по изоляции и проверки согласованности данных; это не часть принятого recipe.
|
||||
|
||||
### Изменение других хостов
|
||||
|
||||
Задачи настройки Mac, Kraken, TrueNAS и других машин используют `runtime_class: remote-host`.
|
||||
|
||||
1. Agent в контейнере формирует plan и выполняет read-only preflight.
|
||||
2. Balda показывает точный diff действий и запрашивает Human approval.
|
||||
3. Broker выдаёт capability lease на конкретные host, identity, operations и TTL 15–30 минут.
|
||||
4. Runner применяет изменения через dedicated service account или установленный host-runner.
|
||||
5. Verify, audit log и rollback закрывают lease.
|
||||
|
||||
Личные ключи из пользовательского `~/.ssh` не передаются. Для managed host используется небольшой Go host-runner. Для первичного bootstrap допускается отдельный SSH account с short-lived certificate и ограниченным `sudo`.
|
||||
|
||||
Изменения самого Mac выполняет отдельный native launchd helper. Он принимает подписанный capability lease; Balda и модель не получают постоянный host shell.
|
||||
|
||||
## 11. Неподтверждённое
|
||||
|
||||
### Блокирует прототип
|
||||
|
||||
1. Есть ли у Callee стабильный machine-readable event stream и программный resume Human node.
|
||||
2. Можно ли запустить workflow pack `prism/story` отдельно от stock plugin host.
|
||||
3. Как Codex ACP получает workspace/cwd и сохраняет его между Role visits.
|
||||
4. Как передавать cancel в Callee без повреждения terminal result.
|
||||
5. Как подключить Broker к реализованному Virfield API через TLS/routing и проверить lease/SSH contract из его окружения.
|
||||
|
||||
### Требует проверки до production
|
||||
|
||||
- credential-free установка Codex; отдельное долговременное credential management с выдачей в каждую disposable VM (авторизация в golden image запрещена);
|
||||
- доступность Dolt/Beads из Prism adapter после рестартов;
|
||||
- формат и размер Xcode артефактов;
|
||||
- восстановление Broker после падения во время `waiting_human`;
|
||||
- параллельные Story и лимиты VM/CPU/RAM на Mac.
|
||||
|
||||
## 12. Варианты
|
||||
|
||||
### A. Sidecar Broker + VM runner — выбран
|
||||
|
||||
Balda остаётся оркестратором, Broker изолирует инфраструктуру, Callee владеет workflow, Codex работает в VM. Это целевая схема.
|
||||
|
||||
### B. Broker как host daemon
|
||||
|
||||
Меньше сетевых переходов к Virfield и SSH, но Broker получает более широкую поверхность хоста. Использовать только если контейнерный sidecar не может надёжно управлять VM.
|
||||
|
||||
### C. Stock prism-callee plugin
|
||||
|
||||
`Codex → plugin → Callee → Codex`. Быстрее для проверки Prism, но Balda перестаёт быть владельцем lifecycle. Подходит как временный reference test, не как production topology.
|
||||
|
||||
### D. Native remote ACP
|
||||
|
||||
Будущая transport abstraction в `runtime + acpagent` позволит Balda или Callee подключаться к ACP по WebSocket/Streamable HTTP. Она может заменить SSH-транспорт, но не заменяет Broker, VM lifecycle, durable events и cleanup.
|
||||
|
||||
## 13. Virfield v2 — реализовано и опубликовано
|
||||
|
||||
Релиз [v2.0.0](https://github.com/mallexxx/virfield/releases/tag/v2.0.0) опубликован 2026-09-30, commit `ee3aa1d`. Текущая карточка — [[personal/projects/virfield]]; команды и контракты принадлежат документации репозитория.
|
||||
|
||||
Реализованы единый Go control plane, SQLite journal, reconciliation, leases/idempotency, resource admission, image pipeline, scoped SSH, cleanup, CLI/MCP и embedded console. Лимит двух VM и неизвестные состояния обрабатываются явно; неопределённая мутация не повторяется автоматически. Personal SSH keys/PAT storage и client-side lifecycle fallback в текущей реализации отсутствуют.
|
||||
|
||||
Исторический релиз v2.0.0 использовал Lume 0.5.3; его CI и golden/clone acceptance относятся к release commit 2026-09-30. С 2026-10-08 установленный Virfield использует Tart + SSH nodes. В hardening-кандидате 2026-10-14 Lume backend/factory/wrapper/build/install code удалён; старый отдельный Lume LaunchDaemon отключён и выгружен 2026-10-14 после проверки пустого inventory. Новый кандидат ещё не принят для релиза; текущие Tart/factory live результаты записаны отдельно. Текущие evidence и gates — в [[personal/projects/virfield]] и [Verification](https://github.com/mallexxx/virfield/blob/codex/retire-lume-release-hardening/docs/VERIFICATION.md).
|
||||
|
||||
### Граница проектов и репозиториев — принятое решение
|
||||
|
||||
`virfield` и `execution-broker` — два независимых проекта. Их нельзя объединять в один репозиторий или один daemon.
|
||||
|
||||
Репозиторий `virfield` содержит host control plane: корневой Go module, `cmd/virfieldd`, `cmd/virfield`, `cmd/virfield-mcp`, реализации в `internal/`, deployment в `deploy/`. Актуальная карта модулей — [Architecture](https://github.com/mallexxx/virfield/blob/codex/retire-lume-release-hardening/docs/ARCHITECTURE.md); отдельного каталога приложения v2 нет.
|
||||
|
||||
Целевая структура отдельного `execution-broker` (реализацию сверять в его репозитории):
|
||||
|
||||
```text
|
||||
cmd/broker
|
||||
cmd/runner
|
||||
cmd/host-runner
|
||||
internal/scheduler
|
||||
internal/execution
|
||||
internal/events
|
||||
internal/drivers/virfield
|
||||
internal/drivers/container
|
||||
internal/drivers/remotehost
|
||||
api/
|
||||
```
|
||||
|
||||
Границы ответственности:
|
||||
|
||||
1. `virfield` управляет VM, images, leases и host-level cleanup; он ничего не знает о Callee, Prism, Beads и model providers.
|
||||
2. `execution-broker` выбирает execution class, запускает Runner/Callee, управляет agent profiles и хранит run event log; он не управляет Lume напрямую.
|
||||
3. `balda` вызывает Broker по MCP и отражает события в Prism/Beads; Virfield напрямую из Balda не вызывается.
|
||||
4. `execution-broker → virfieldd` использует versioned authenticated HTTP API `/api/v1`; текущие модели и маршруты — `internal/domain`, `internal/httpapi`, `internal/client`. Отдельная OpenAPI-спецификация Virfield в v2.0.0 не опубликована.
|
||||
5. Общих Go-пакетов между репозиториями нет; совместимость обеспечивается API contract и contract tests.
|
||||
|
||||
## 14. Agent profiles и модельная политика
|
||||
|
||||
Broker и Runner не содержат vendor-specific workflow logic. Run выбирает `agent_profile` из статического allowlist.
|
||||
|
||||
Для Callee напрямую подтверждены Codex, Claude, Copilot, Grok, OpenCode и Cursor. Gemini и GLM подключаются через `generic_acp` или отдельный ACP adapter и считаются неподтверждёнными до integration test.
|
||||
|
||||
Worker image содержит Runner, Callee и нужные provider binaries. Credentials выбранного provider выдаются только на срок run. Node отсутствует в Virfield/Broker control plane; он допускается внутри специализированного worker image, если конкретный agent CLI без него не работает.
|
||||
|
||||
### Распределение моделей
|
||||
|
||||
Схема `Balda → Callee → coding agent` остаётся правильной. Provider для Balda и профили исполнителей настраиваются в соответствующих проектах; конкретное назначение не фиксируется в плане Virfield.
|
||||
|
||||
Рекомендуемая раскладка:
|
||||
|
||||
- Balda — надёжное понимание запроса, выбор workflow, управление state и Human interaction;
|
||||
- specify/design/review — сильная reasoning-модель;
|
||||
- implementation — Codex или другой сильный coding agent;
|
||||
- build/test/SSH apply — детерминированные Script/Runner operations;
|
||||
- дешёвая модель — routing, summarization и простая диагностика.
|
||||
|
||||
DeepSeek подходит для ограниченного routing и простых операций с жёсткими tool schemas. Он не принимает самостоятельные решения о privileged SSH-командах и сложной архитектуре.
|
||||
|
||||
Оптимизация стоимости строится на deterministic routing, token/run budgets, bounded retries и escalation: после повторной неудачи задача повышает model tier, а не повторяет дешёвую модель бесконечно.
|
||||
|
||||
## 15. Pitfalls
|
||||
|
||||
### Архитектура
|
||||
|
||||
1. Смешивание двух топологий: stock `Codex → Callee` и целевой `Balda → Broker → Callee`.
|
||||
2. Перенос workflow-логики в Broker превращает его во второй оркестратор.
|
||||
3. Прямая запись Broker/Callee/Codex в Beads создаёт несколько владельцев состояния.
|
||||
4. Запуск Callee вне VM переносит Script nodes и часть команд на хост.
|
||||
5. Парсинг консольного вывода Callee вместо стабильного event protocol ломает resume и диагностику.
|
||||
|
||||
### Надёжность
|
||||
|
||||
1. Потеря события между Callee и Balda без durable event log.
|
||||
2. Двойной запуск VM без idempotency key.
|
||||
3. Повторный Human response возобновляет workflow дважды.
|
||||
4. Падение Broker оставляет VM без lease и cleanup.
|
||||
5. Большие build-логи забивают SQLite или MCP-ответы.
|
||||
|
||||
### Безопасность
|
||||
|
||||
1. Непроверенный `workflow_id`, repository URL или revision превращается в выполнение произвольного ввода.
|
||||
2. Общий SSH/Git credential между VM расширяет последствия компрометации.
|
||||
3. Секреты в prompt, events или build logs попадают в Mattermost/Beads.
|
||||
4. Host path, переданный как ACP cwd, не существует или указывает не туда внутри VM.
|
||||
5. VM с доступом в локальную сеть может атаковать хостовые сервисы; egress и host API нужно ограничить.
|
||||
|
||||
### Исполнение и ресурсы
|
||||
|
||||
1. Mutable build через virtiofs может прочитать stale content; workspace должен жить на локальном диске worker.
|
||||
2. Более двух активных macOS VM невозможны; Broker обязан иметь очередь и admission control.
|
||||
3. Parallel Callee roles, пишущие в один checkout, создают file conflicts даже внутри одной VM.
|
||||
4. Свободный provider command или agent-generated `cmd` превращает профиль в arbitrary code execution.
|
||||
5. Установка всех provider credentials в один golden image нарушает isolation и усложняет rotation.
|
||||
|
||||
## 16. План работ после push `f237556`
|
||||
|
||||
Предыдущие этапы Broker/Runner, Virfield v2 и credential lifecycle выполнены частично и описаны выше как история. Текущий критический путь относится к новому локальному repo и Docker/OpenCode:
|
||||
|
||||
1. **Свести исходники и принять точный build.** Ветка `codex/broker-workspace-repos` (`f237556`) основана на RC9, поэтому соединить её с Docker/OpenCode runtime-исправлениями `5792cff`; зафиксировать plugin version, workflow digest, Runner/Callee и immutable worker image ID. Проверить `make check` и повторить изолированный Story на этом exact commit.
|
||||
2. **Развернуть live контур.** Настроить выделенный Docker worker profile, `workspace_root=/Users/admin/Developer`, mount корня только в gateway и `--workspace-repositories` у issuer; установить новую версию Broker/gateway и managed plugin Balda. Проверить MCP discovery и отсутствие регрессии действующих VM профилей.
|
||||
3. **Принять пользовательский Mattermost flow.** Сообщение Balda не содержит repo name/path. Она сама вызывает `execution_repository_create`, создаёт Prism Story, запускает run, доставляет Human approval и события в исходный chat/topic, публикует артефакты и фиксирует cleanup. Проверить Git commit в новом repo и отсутствие двойного создания при повторе idempotency key.
|
||||
4. **Закрыть release gates.** Разобрать наблюдённый ACP `fs/write_text_file: Method not found`, выполнить CI/publication checks на точном SHA, проверить rollback и оставшиеся credential/managed-host ограничения. Public stable объявлять только после live приёмки.
|
||||
|
||||
### Дополнительные задачи — 2026-10-11: альтернативные аппрувы и ACP-контекст
|
||||
|
||||
- [x] **Telegram для Broker workflows и worker ACP.** Реализованы привязка к run/Human/владельцу, выбор единственного канала запроса, возврат результата в исходную беседу, срок действия, обновление кнопок, restart recovery и competing-channel deduplication. Текущий контракт и доказательства: [[personal/projects/balda/execution-broker]].
|
||||
- [ ] **Прямые ACP-разрешения хостовых агентов Balda.** Единая межканальная доставка этих разрешений не покрывается Telegram-механизмом Broker; это отдельная незавершённая часть плана.
|
||||
- [ ] **Прогон субагента для автоаппрува и сбора дополнительного контекста команд ACP-субагентов.** Перед решением по запросу разрешения запускать отдельного субагента: собрать цель команды, cwd, аргументы, затрагиваемые файлы/ресурсы, ожидаемые побочные эффекты и связь с текущей задачей. Использовать собранный контекст для автоаппрува в пределах настроенной политики; при недостатке данных или необходимости решения пользователя направлять запрос на ручной аппрув, включая Telegram. Сохранять решение и обоснование в событиях run.
|
||||
- [ ] **Приёмочный прогон.** Проверить связку ACP-запрос → сбор контекста субагентом → автоаппрув либо ручной ответ через Telegram → возобновление нужного ACP-субагента. Покрыть недостаточный контекст, отказ, таймаут и повторный ответ.
|
||||
|
||||
## 17. Критерии готовности
|
||||
|
||||
1. Balda сама создаёт новый локальный Git repo под настроенным workspace root из обычной Mattermost-задачи; пользователь не передаёт заранее repo name/path.
|
||||
2. Один chat/topic получает одну Prism Story и идемпотентный Broker run с полным pinned commit SHA, allowlisted workflow и agent profile.
|
||||
3. Docker worker запускает установленный ACP-исполнитель без Docker socket и host secrets; Xcode/macOS задачи остаются в VM Virfield.
|
||||
4. Human approval возвращается в исходную тему, события и артефакты доходят до Balda/Prism/Mattermost, terminal cleanup и credential checkpoint завершаются.
|
||||
5. Повторный запрос/рестарт не создаёт второй repo или run; отказ, cancel и rollback дают диагностируемое состояние.
|
||||
6. CI и release доказательства относятся к одному exact SHA объединённого кода; remote-host задачи требуют отдельный capability lease.
|
||||
|
||||
## Связанные заметки
|
||||
|
||||
- [[personal/projects/virfield]] — текущий релиз, подтверждённый scope и каноническая документация.
|
||||
|
||||
- [[personal/tech/callee-prism]] — контракты Callee, ACP и Prism.
|
||||
Исторические исследования и PR-дневник сохранены отдельно: [[personal/projects/archive/balda-callee-prism-plan-through-2026-10-14]]. Они не описывают текущую установку.
|
||||
Reference in new issue
Block a user