103 lines
21 KiB
Markdown
Executable File
103 lines
21 KiB
Markdown
Executable File
# Balda / Execution Broker — историческая приёмка
|
||
|
||
> [!warning] Новый план от 2026-10-18
|
||
> Актуальная работа: [[personal/plans/balda-remote-agent|Balda — удалённый агент по SSH]].
|
||
> Ниже сохранена приёмка прежней реализации; её компоненты и открытые пункты не переносятся автоматически в новый план.
|
||
> Штатный ACP Balda через SSH уже проверен: [[personal/projects/balda/ssh-acp-verification-2026-10-18]].
|
||
|
||
Проверено: **2026-10-16**. Приёмка закрыта в согласованном проверенном объёме. Сверка main/production и публикация Virfield v2.1.1 завершены; датированные доказательства и ограничения сохранены ниже. Точные работающие версии и доказательства: [[personal/projects/balda/execution-broker]]. Запуск двух Balda: [[personal/projects/balda/setup]].
|
||
|
||
## Контур
|
||
|
||
Balda ведёт исходную беседу и durable waits; Broker управляет admission, одноразовым worker, credentials, deadline и артефактами. Callee выполняет закреплённый workflow через выбранный ACP executor. Prism проецирует факты выполнения в локальные Story/Task Beads. Прикладные iPad/UI-сценарии и права Obsidian относятся к вызывающему проекту и Balda.
|
||
|
||
## Подтверждено
|
||
|
||
- Оба 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. Linux Codex прошёл две изолированные Story с restart Broker/gateway/issuer и финальную Story через production Broker/Prism; `nested-v1` сохраняет Docker guards и реально блокирует read-only запись. Gateway и exact worker pin развёрнуты. Codex также прошёл две более ранние Story на свежих macOS VM, включая restart Broker/issuer. Тесты из артефактов выполнены независимо.
|
||
- Read-only permission-handler Claude/OpenCode отклоняет инъецированные ACP-запросы записи; тестовый файл не создаётся. У OpenCode native plan policy не менялась.
|
||
- Исправленные macOS bootstrap развёрнуты; прежние архивы и конфиг сохранены для отката. Подготовлен защищённый GPG escrow; шесть тестов используют синтетические ключи.
|
||
|
||
- Production macOS27/Codex принят на Virfield `8bfff9f`: фактический owner-approved continuation, reviewer `os.open` → EPERM, восемь заново скачанных SHA256-проверенных артефактов, независимый повтор четырёх тестов, закрытая Prism Story, credentials свободны и cleanup подтверждён. Приватное доказательство: `state/broker-acceptance-20261016/verification.json`. Задача `.6.4` закрыта; старые неудачные попытки сохранены как история.
|
||
- Reviewer fix `6c70647` включён в запушенный Broker main `13c29ac`; добавлены развёрнутое Darwin zombie-group исправление и native regression. Исходный workflow совпадает с принятым macOS pack `b09f2be2`. В этом macOS прогоне ключи не экспортировались; последующая разрешённая recovery-проверка описана ниже.
|
||
|
||
- Linux rollout и production-приёмка нового image `e9e1ab5e8c0f` закрыты: одинаковый `b09f2be2` в Broker/gateway/worker, два успешных прогона с независимым повтором 4/4 тестов, проверенные SHA256 артефактов. Отмена во время implementer сохранила пять артефактов и checkpoint. Restart Broker/gateway/issuer сохранил тот же run/deadline/owner; после успеха credentials освобождены, собственных container/volume нет, Prism Story закрыта и повторный sync пуст. Beads `.6.5` closed; `.6.4` macOS также closed.
|
||
- Реальная natural expiry Claude на Docker проверена 2026-10-16: исходный access token истёк 2026-10-15, свежий worker обновил сессию и выполнил specify/design/breakdown; до реализации run отменён, новый cache того же account/organization checkpointed, owner освобождён, пять SHA256-проверенных артефактов, cleanup=done, ресурсов нет. `state/broker-acceptance-20261016/claude-expiry-verification.json`. Upstream revocation и повторный browser login этим не проверены.
|
||
- Итоговые source gates: `make check`/race/vet, Callee adapter, Staticcheck 0 findings, source/binary vulnerability checks, secret scans source/трёх наборов артефактов, сборка семи binaries на четырёх OS/arch targets прошли. Результаты: `state/broker-acceptance-20261016/production-cycle-final.json`.
|
||
|
||
- Recovery реальных аккаунтов после потери Mac/Keychain принят 2026-10-16: с явным разрешением владельца GPG-копия трёх исходных master keys и matching encrypted vault сохранена на независимом HTPC. На физическом Linux AMD64 без исходного Keychain восстановлены все три identity, native rc33 issuer прошёл issue/checkpoint/release, authenticated read-only API каждого провайдера ответил HTTP 200. Исходные аккаунты/vault не изменены, временные plaintext key-files удалены. Копия и restore software сохранены вне lease workspace (0700/0600). Доказательства: `state/broker-acceptance-20261016/offhost-working-restore-verification.json`, `offhost-retention-verification.json`. `.4` закрыта.
|
||
- Релизный кандидат `0.1.0-rc.33`, source `ae92c15`: четыре runtime archives и plugin собраны отдельно от rc32; все четыре платформы прошли native binary-only checks, включая физические Intel Mac/Linux AMD64. `make check`/race/vet и SHA256 прошли. `state/broker-acceptance-20261016/rc33-release-verification.json`. Публикации не было.
|
||
- Контролируемые provider failure checks на Linux с synthetic credentials прошли для Codex/Claude/DeepSeek; все собственные контейнеры/volumes удалены, артефакты проверены по SHA256 и secret scanner. `state/broker-acceptance-20261016/provider-refusal-verification.json`. Ошибки подготовки fixture сохранены отдельно и не включены в успешное доказательство.
|
||
|
||
## Сверка main и production — 2026-10-16
|
||
|
||
Broker/Prism/gateway и native issuers обновлены до `rc34` из запушенного `main 13c29ac`; Callee — чистый upstream `95f7f11`, оба Balda — чистый upstream `3a58254`. Core binary hashes и Runner/Callee во всех четырёх Linux images и четырёх macOS bootstrap packs сверены. Broker/Prism MCP доступны из обоих Balda; exact Linux worker прошёл Callee/Human/restart/artifacts/cleanup в изолированном fixture. State, sessions, home volumes, config и auth сохранены.
|
||
|
||
В Broker локально и на origin только `main`. Завершённые ветки удалены по явному разрешению владельца после проверки содержимого; отсутствовавшие installer/workspace настройки перенесены до удаления. Git bundle не создавались. Планы и личные журналы убраны из tracked source и перенесены с обратным чтением в [[personal/projects/archive/execution-broker-repo-cleanup-2026-10-16/index|архив 11 документов]].
|
||
|
||
При установке опубликованного Virfield `v2.1.0` выявлены два fresh macOS preparation failures, оба leases released. Исправление `launchctl bootstrap` собственного GUI-agent уже в запушенном Virfield `main 2c64888`. Точный пакет `v2.1.1` перед публикацией прошёл source/package gates и отдельную fresh VM с native GUI/Keychain/SSH; эта VM released. Полный Broker → macOS XCTest на новом комплекте завершился успешно: `run-3b679ccc08ae5aafb94643d60f0410dd`, 1/1 XCTest, настоящий xcresult, все скачанные артефакты сверены, Story closed, cleanup=done/lease released. Установленный MCP2.1.1 и нулевой active pool проверены. GitHub CI Virfield `2c64888` зелёный на macOS/Linux. После явного подтверждения владельца [v2.1.1 опубликован как stable Latest](https://github.com/mallexxx/virfield/releases/tag/v2.1.1), tag указывает на `2c64888`. Archive/SHA256SUMS скачаны с публичных URLs без авторизации и побайтно совпадают с проверенным пакетом; installed binaries/browser повторно сверены с подписанным stage. Все четыре upstream main и пять production services сверены после публикации.
|
||
|
||
GitHub Actions Broker main не стартовал из-за account billing/spending limit; это не ошибка workflow. Локальный `make check` прошёл, удалённый CI не объявляется зелёным. Точные версии и результаты — [[personal/projects/balda/execution-broker]] и [[personal/projects/virfield]]. Приватные receipts текущей сверки: `state/main-production-sync-20261016/`.
|
||
|
||
## Принятый объём и ограничения
|
||
|
||
2026-10-16 владелец явно согласовал закрытие в проверенном режиме: **«Да, закрыть в проверенном режиме»**. Это изменение границ приёмки. Корневая Story `eb-71b7971ac3fdd03b8ff6b198`, `.6` и `.6.6` закрыты после проверки результатов; все дочерние задачи закрыты. Блокирующих пунктов в согласованном объёме нет. Публичный релиз Broker не создавался; публикация Virfield v2.1.1 описана выше.
|
||
|
||
| Область | Принято / ограничение |
|
||
| --- | --- |
|
||
| Provider failure lifecycle | На отдельных synthetic vault проверены реальные native отказы Codex (HTTP 401/token_expired), Claude (Authentication required + reauthentication_required) и DeepSeek (invalid API key), сохранение артефактов, credential settlement и cleanup. Natural expiry/refresh Claude на Docker принята отдельно. Реальный отзыв существующих авторизаций у провайдеров и последующий browser login не выполнялись и явно исключены владельцем из закрываемого объёма; остаются непроверенным ограничением, а не пройденным тестом. Linux failure checks не доказывают macOS failure lifecycle |
|
||
|
||
Итог: `state/broker-acceptance-20261016/final-release-readiness.json`; закрытие Beads — `beads-acceptance-closure.json`. Финальный rc33 `ae92c15` содержит согласованную документацию; exact archives прошли четыре нативные проверки, `make check` и SHA256. Рабочие аккаунты не изменены, тестовые ресурсы очищены. Независимая recovery-копия сохранена вне тестовых leases; её проверенный runtime — исходный rc33 `d296c73`, до финального документационного commit.
|
||
|
||
Задачи и их статусы ведутся в локальном Beads/Prism, корневая Story `eb-71b7971ac3fdd03b8ff6b198`. Этот документ задаёт границы приёмки, а не второй backlog. Контракты и команды — в `docs/support.md`, `docs/recovery.md`, `docs/executors.md` репозитория Broker. Исходный work-plan перенесён из Git в [[personal/projects/archive/execution-broker-repo-cleanup-2026-10-16/docs/work-plan]].
|
||
|
||
Исторические исследования и PR-дневник сохранены отдельно: [[personal/projects/archive/balda-callee-prism-plan-through-2026-10-14]]. Они не описывают текущую установку.
|
||
|
||
## Открытый пункт: SSH-доступ (generic flow того, как добавлять хост)
|
||
|
||
Общий флоу добавления нового SSH-хоста в broker (применимо к любому хосту, Кракен — первый кандидат):
|
||
|
||
1. **Креденшел** — SSH-credential создаётся администраторомBroker'а (не из Balda/MCP). Список виден через `execution_ssh_profiles`.
|
||
2. **Каталог команд** — на стороне broker'а в `helper_command`-конфиге (сейчас `/etc/execution-host-runner/ssh-catalog.json`) описываются разрешённые команды (`argv`, аргументы, `approval_required`). Без пополнения каталога хост бесполезен для реальных задач.
|
||
3. **Host key** — публичный host key самого сервера (не юзерский ключ!), его надо получить либо с машины, имеющей доступ к хосту (`ssh-keyscan -t rsa <ip>`), либо прямо с `ssh <host> cat /etc/ssh/ssh_host_rsa_key.pub`.
|
||
4. **Заявка** — из Balda: `execution_ssh_request_host` с `address`, `user`, `host_key`, `credential`, `catalog`, `ttl_seconds`; идемпотентность по тому же ключу.
|
||
5. **Owner approval** — подтверждение приходит независимо в Telegram-бот, до этого соединений нет.
|
||
6. **Работа** — `execution_ssh_run` с idempotency key; статус через `execution_ssh_status`. `approval_required=false` позволяет автоматизировать read-only задачи.
|
||
|
||
Открытые пункты флоу — это же план доработки брокера (не закрыты в рамках приёмки 2026-10-16):
|
||
1. **Каталог** (адаптер broker'а) — нет механизма добавления новых команд в `/etc/execution-host-runner/ssh-catalog.json` «без телодвижений»: сейчас правка файла руками, нет API/webhook для этого.
|
||
2. **`execution-host-runner` не доведён по статусу «планирование завершено».** Сервис, исполняющий каталог-команды, не прошёл завершение на этапах, которые сам себе определил: изменения каталога не перечитываются на лету (нужен reload), нет валидации консистентности каталога при загрузке. Конкретная доработка runner'а в объём приёмки не входила и остаётся открытой.
|
||
3. **TTL/ротация** — нет long-lived режима для постоянных инфраструктурных хостов (Кракен); `ttl_seconds` сегодня заточен под разовую заявку.
|
||
4. **Аудит** — не решено, куда складывать лог выполненных SSH-команд и кто его читает.
|
||
5. **Переработать механизм добавления SSH-хостов (owner-side) до нормального флоу.** Сегодняшняя цепочка «ssh-keyscan вручную → вставка в чат → заявка → TG-аппрув» работает, но неудобна и хрупка: ключевая точка сбоя в том, что host key нужно достать вручную с LAN-машины. Целевой вариант (чтобы владелец делал только аппрув):
|
||
- документы-инструкция «как добавить хост» в `docs/` брокера (step-by-step, из этого пункта вытечет);
|
||
- упрощить передачу host key (шаблон/скрипт для генерации заявки, а не ручной ввод в чат);
|
||
- `execution_ssh_request_host` должен падать с внятной ошибкой (не `hosts:[]`) при неверном каталоге/креденшеле.
|
||
|
||
Статус пунктов 1–4: план написан, работа не начата. Статус пункта 5: дизайн-наметка в этом документе, доработки нет.
|
||
|
||
## Открытый пункт: SSH-доступ к Kraken через Execution Broker
|
||
|
||
**Статус: НЕ сделано.** В принятый объём приёмки 2026-10-16 SSH-хосты не входили; прямого owner SSH-доступа к Kraken в broker'е сейчас нет (профиль `kraken-scoped` есть, хост не зарегистрирован).
|
||
|
||
Разбор сессии 2026-10-17 (Mattermost `mm-dm-85df8163`) показал три вещи:
|
||
|
||
1. **Host key получен не тот.** В чат был вставлен юзерский публичный ключ Mac (`mallexxx@Alexeys-MBP`). Для `execution_ssh_request_host` нужен host key самого Кракена (`/etc/ssh/ssh_host_rsa_key.pub`). Команда для получения:
|
||
```bash
|
||
ssh-keyscan -t rsa 192.168.1.15 # с Mac, Kraken в одной LAN
|
||
```
|
||
2. **Каталог `kraken-acceptance` не годится для реальной работы.** В нём только fixture-команды (`fixture-create/inspect/remove`, `identity`, `system-info` в `/var/lib/execution-ssh/acceptance`). Команд, чтобы проверить версию Lampa или `docker ps`, нет.
|
||
3. **Адрес/юзер** — из [[family/how-to/kraken-access]]: LAN `kraken@192.168.1.15` (актуальный внешний IP `92.62.77.233`, менять роутер нельзя — правки только через веб-UI).
|
||
|
||
### План доделки (чтобы хватало одного owner-аппрува)
|
||
|
||
1. Получить host key (проверено 2026-10-17: из окружения broker'а Кракен недоступен — LAN `192.168.1.15` не пингуется, `kraken` не резолвится, `ssh-keyscan` через `ssh-kraken.qentra.top` пусто; значит команда выполняется только с машины в LAN, т.е. с Mac Alex):
|
||
`ssh-keyscan -t rsa 192.168.1.15` → одна строка `ssh-rsa AAAA…`.
|
||
2. Расширить каталог в `/etc/execution-host-runner/ssh-catalog.json` на стороне broker'а: добавить read-only команды (например `lampa-version`, `docker-ps`) — их источники и флаги `approval_required` согласовать при самой правке.
|
||
3. Из Balda вызвать `execution_ssh_request_host`: address=`192.168.1.15`, user=`kraken`, credential=`kraken-scoped`, catalog=`kraken-acceptance`, host_key — строка из шага 1.
|
||
4. Owner подтверждает заявку через независимый Telegram-бот (единственное «телодвижение»).
|
||
5. Проверить доступ: `system-info` / новая `lampa-version` через `execution_ssh_run` → отчёт версии Lampa в чат.
|