Files
obsidian-vault/personal/plans/balda-callee-prism-plan.md
T

103 lines
21 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 в чат.