diff --git a/personal/plans/balda-callee-prism-plan.md b/personal/plans/balda-callee-prism-plan.md index 27e0bd0a..460327ad 100755 --- a/personal/plans/balda-callee-prism-plan.md +++ b/personal/plans/balda-callee-prism-plan.md @@ -2,6 +2,7 @@ > Не использовать как 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 / Broker — 2026-10-03 22:41 Бишкек @@ -643,7 +644,8 @@ DeepSeek подходит для ограниченного routing и прос ### Дополнительные задачи — 2026-10-11: альтернативные аппрувы и ACP-контекст -- [ ] **Получение аппрувов через альтернативный канал — Telegram.** Добавить в Balda + Execution Broker доставку запроса подтверждения в Telegram для задачи, запущенной из другого канала. Ответ привязывать к исходным Story/run и конкретному запросу аппрува; результат отражать в исходном канале. Проверить идентификацию подтверждающего пользователя, отказ, таймаут, повторную доставку и одновременные ответы из нескольких каналов без двойного возобновления выполнения. +- [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-субагента. Покрыть недостаточный контекст, отказ, таймаут и повторный ответ. diff --git a/personal/projects/balda/execution-broker.md b/personal/projects/balda/execution-broker.md index b7fce153..3182387e 100644 --- a/personal/projects/balda/execution-broker.md +++ b/personal/projects/balda/execution-broker.md @@ -4,7 +4,33 @@ ## Состояние приёмки -Main и origin/main — `437cbf8`; единственный worktree чистый. Broker `execution-broker:production-a3594c3` и native Claude issuer остаются на a3594c3: их исходники последним исправлением не менялись. Gateway `execution-broker-gateway:quality-437cbf8`; адаптер Callee 437cbf8 развёрнут в четырёх macOS пакетах, обоих статических Linux images и динамических build contexts. В активном broker.json закреплены реальные image IDs Linux исполнителей; все четыре macOS preflight прошли. Полный `make check` прошёл для a3594c3; для последующего изменения только Callee повторно прошёл `scripts/check-callee.sh` с `-race` на закреплённом движке и воспроизведение настоящего отчёта. Новые PR не создавались. +`main` и `origin/main` Broker остаются на `437cbf8`. Локальный кандидат `0.1.0-rc.26` зафиксирован в `codex/production-readiness` на `b64a1ba83c82475b08276ea3fb6a54c99d4a1509`. Смежные исправления Balda — отдельная ветка `codex/production-readiness` на `223b85ad213f77edebd452147d0058588813fe6c`, checkout `/private/tmp/execution-broker-balda-production`. Кандидат не развёрнут и не опубликован; новых PR нет. + +Действующий Broker — `execution-broker:production-a3594c3`, gateway — `execution-broker-gateway:quality-437cbf8`, Prism — `execution-prism-adapter:session-fix-20261004`. Сверка обнаружила drift: `broker.json` и `worker.json` выбирают разные immutable images для `linux-smoke` и `linux-opencode-deepseek`; три coding-профиля worker.json по-прежнему содержат Docker socket/group. В исходниках rc.26 этот доступ запрещён, а несовпадение image pin отклоняется до выделения worker с освобождением недоставленного credential. До применения кандидата старый работающий контур этих защит не получает. macOS bootstrap-пакеты и dynamic build contexts также требуют согласованного обновления Runner/Callee/config/workflow pins. Проверки из предыдущей приёмки ниже относятся к прежним развёрнутым версиям. + +### Локальная приёмка rc.26 — 2026-10-14 + +По решению владельца GitHub Actions заменены локальным прогоном. Все запущенные финальные проверки прошли: полный Broker `make check build` на macOS ARM64 и Linux ARM64 (Colima), race-тесты Callee на обеих ОС, Balda `go test -race ./...`, golangci-lint и architecture check, проверка плагина на закреплённой версии Balda, source/binary govulncheck и gitleaks всей истории. Для Broker, Callee и Balda — 0 вызываемых уязвимостей; недостижимые findings остаются отдельно видны в полных отчётах. Исправлены Go 1.26.8 → 1.26.9 и x/net 0.58 → 0.60 у Balda/Callee. Gitleaks исключает только точный fingerprint ложного срабатывания на старый Mattermost post ID. + +Проверены реальные Docker/Callee Human pause → restart → resume → 5 артефактов → cleanup, embedded Beads и signed host-plan с rollback. Отдельно Linux ARM64 архив установлен без Go и source checkout: 4 сервисных образа, MCP, перезапуск Broker, 5 артефактов, succeeded и cleanup=done. Чистая установка закреплённых Claude/OpenCode/Node и ACP initialize прошла на macOS/Linux ARM64 без provider inference. Все четыре release-архива выполнили проверки версий, vault import/revoke, MCP, отказа без авторизации и SQLite backup; AMD64 на обеих ОС проверен через эмуляцию, не на native AMD64. Пять архивов rc.26 и SHA256SUMS лежат в `dist/`. + +Полный отчёт и логи: `/Users/admin/Developer/execution-broker/state/production-readiness-20261014/local-checks.json`. Задача Balda `balda-7w4` закрыта в локальном Beads-трекере. Обе ветки и коммиты сохранены локально, checkout чистые; автоматическая проверка запретила push исходников и истории без явного разрешения владельца. + +### Что этим прогоном не завершено + +- Согласованное развёртывание кандидата, worker image pins, bootstrap-пакетов и plugin в действующем контуре; свежая live-приёмка conversational NATS recovery. Сейчас работающий код прежний. +- Native AMD64-приёмка; текущие AMD64 runtime результаты получены через эмуляцию. +- Per-agent OS/tool/MCP/fs/network grants, независимые точные owner capabilities, grants на внешние записи и применение одобренного config diff. +- Typed SSH target/command catalog, bootstrap и reconciliation неопределённого remote outcome. +- Run-to-run artifact inputs/retention holds и общие immutable macOS tooling/Git caches сверх установленного Go SDK. +- Полный iPad sign/upload/install/unlock/launch с физическим устройством и отказами. +- Configured search/extraction, scoped Obsidian grants, exact-head PR/CI review, idempotent publication и миграция Hermes/scheduled/browser/media/attachment flows. +- Guest-scoped UI/AX/recording, OS boundary, реальная red/green UI-регрессия, exact-head CI, последнее passing video и крупные recording artifacts. +- Прямые ACP autoapproval/context-subagent flows Balda и восстановление после потери хоста/Keychain. + +Исходные требования: `docs/work-plan.md`, `docs/ipad-deployment-plan.md`, `docs/hermes-workflow-gap-analysis.md`, [[work/wiki/apple-browsers/vm-ui-testing]]. Локальный кандидат принят в проверенном объёме; полная дорожная карта и обновление production не объявляются завершёнными. + +### История приёмки действующих версий Проверка продолжения: `run-0175c98134e42a9d912dcc2626264bcd` получил точный план из одобрения `human-1` запуска `run-3a21ab05f78f688abc923d0946728233` (SHA256 `994b9c5492136ff1710ace38aef33767658585fd597f553d74f85a3122f287dc`). Реальная macOS VM начала с implementer, без specify/design/breakdown и нового Human. Claude ответил `Authentication required`; конкретная ошибка доставлена в [Mattermost](https://mm.qentra.top/qentra/pl/s3q8k6uk8py1uqcz7ss55brpmr). Код не создан и не опубликован. @@ -12,7 +38,7 @@ Native CLI обнулил оба токена и expiresAt в private cache, и Итоговый `run-a1b236aaff2e3d877049cf790262ac37` той же Story завершился `succeeded`, `cleanup=done` 2026-10-14 около 08:36 UTC. Он начал сразу с implementer, без нового планового Human. На Darwin 27.0.0 / Go 1.26.9 ARM64 прошли gofmt, go vet, go test -count=1 ./..., сборка и smoke (--version, --help, greet, отсутствие имени и неизвестная команда с ожидаемым exit=2), ревью без findings, quality.json passed=true. SHA256 всех артефактов проверены. `execution_publish_artifacts` опубликовал `b5a238cd478ae89923cdbb4908c4f26fd7ddabfc` в `/Users/admin/Developer/go-cli-claude-test`, checkout чистый. Через Prism закрыты Task `eb-9840de48c9a2090fdb1b6a4f`, затем Story `eb-bae3eaa3bfcaeb17678c1bc7`; обе операции вернули completed=true, а read-only Beads подтвердил status=closed. Broker → Balda → [исходный Mattermost-тред](https://mm.qentra.top/qentra/pl/51m7gwce1pyyuebeya19wdrfqe) доставил итог: коммит опубликован, Task и Story закрыты. Это проверенный coding flow; первоначальный повтор потерянной MM-команды запускал оператор через штатный Broker retry, поэтому восстановление conversational ingress после NATS outage отдельно не объявляется проверенным. Эфемерные login URL в документации не хранить. -Молчание по [команде владельца](https://mm.qentra.top/qentra/pl/ae7rzayekjf9iquwx1duzs1dew) подтверждено: 2026-10-14 06:24:56 UTC Mattermost принял post, NATS вернул 503 insufficient resources, после трёх попыток ingress прекратил dispatch без ответа. История BALDA_EVENTS заняла около 1.9 ГБ при account max_store=2gb. Локальный max_store повышен до 16gb, история сохранена, Balda перезапущен. Новая ошибка запуска после этого доставлена. Это восстановление ёмкости; долговременные ограничения отдельных streams и уведомление при исчерпании ingress retries в коде Balda этим изменением не реализованы. +Молчание по [команде владельца](https://mm.qentra.top/qentra/pl/ae7rzayekjf9iquwx1duzs1dew) подтверждено: 2026-10-14 06:24:56 UTC Mattermost принял post, NATS вернул 503 insufficient resources, после трёх попыток ingress прекратил dispatch без ответа. История BALDA_EVENTS заняла около 1.9 ГБ при account max_store=2gb. Локальный max_store повышен до 16gb, история сохранена, Balda перезапущен. Новая ошибка запуска после этого доставлена. Повышение max_store было только восстановлением ёмкости. В локальной ветке Balda `223b85ad` теперь реализованы durable ingress outbox на AppKV, сохранение исходного envelope до публикации, повтор после рестарта, dedupe receipts, FIFO внутри сессии и ограниченные retry/retention. Для NATS добавлены отдельные бюджеты streams с резервом для Commands и отказом при попытке установить лимит ниже уже хранимых данных. После исчерпания входных retries Mattermost получает безопасный ответ в исходной теме со стабильным pending_post_id. SQLite restart, переполнение настоящего NATS и доставка через HTTP-fixture проверены. В работающий Balda эти исходники в этом прогоне не устанавливались; реальный conversational outage/recovery в Mattermost заново не запускался. ## Конфигурация и перезапуск @@ -44,7 +70,7 @@ VM принадлежит run. Терминальный исход заверш Go `1.26.9` Darwin ARM64 автоматически загружается Broker, проверяется по SHA256, кешируется и устанавливается только в disposable VM. Golden image и пользовательский Mac не меняются. SDK wrapper задаёт правильный GOROOT и доступные права каталогов. -Detached HEAD — штатный checkout закреплённой ревизии; локальные коммиты сохраняются в `commits.bundle`. Одобрение — факт workflow journal, переданный subsequent roles, а не файл в репозитории. Quality gate требует выполненных проверок и отсутствия нерешённых findings. `exit_code` должен совпадать с `expected_exit_code` (по умолчанию 0); ожидаемая ошибка CLI допустима только с явным ожиданием и evidence. Сборка/test suites ожидают 0. +Detached HEAD — штатный checkout закреплённой ревизии; локальные коммиты сохраняются в `commits.bundle`. Одобрение — факт workflow journal, переданный subsequent roles, а не файл в репозитории. Кандидат rc.26 усиливает quality gate: каждый verifier command повторно исполняется в disposable reviewed checkout, фактические exit/output сохраняются в private quality.json; изменение HEAD, tracked source или index блокирует публикацию. Любая проверка должна сама завершиться с exit=0; `expected_exit_code != 0` отвергается. Отрицательный CLI-сценарий оформляется shell assertion, которая проверяет ненулевой код и сообщение приложения, а сама возвращает 0. Эта новая защита пока относится к кандидату, а исторические live-прогоны выше выполнены прежним Callee. `execution_diagnostics` проверяет checksum артефактов и извлекает bounded причину Callee или Runner из `callee.log`, даже без `quality.json`, для failed, expired и canceled. Реальный expired run проверен через MCP после развёртывания fd29974. Отдельным тестом воспроизведён прежний отказ журнала для длинного Human: теперь вопрос до 256 КиБ сохраняется целиком, Human event ограничен 512 КиБ, остальные события — 32 КиБ. Конкретная ошибка обработки события сохраняется в редактированном логе Runner. Ошибки cleanup записываются отдельно в cleanup_error и не заменяют исходную причину исполнения. Cleanup, завершившийся во время отложенной доставки terminal, получает отдельное уведомление; более поздний receipt не скрывает его. diff --git a/personal/projects/balda/setup.md b/personal/projects/balda/setup.md index 82238118..afd99f75 100755 --- a/personal/projects/balda/setup.md +++ b/personal/projects/balda/setup.md @@ -2,6 +2,8 @@ Execution Broker, Telegram-одобрения и текущая приёмка: [[personal/projects/balda/execution-broker|Execution Broker — текущий локальный контур]]. +Локальный кандидат 2026-10-14: Broker `0.1.0-rc.26` / `b64a1ba`, Balda `223b85ad`, ветки `codex/production-readiness`. Локальные race/lint/security/integration/release проверки прошли; изменения не развёрнуты, работающий контейнер `balda-mm-mac` остаётся на прежнем образе. Выбор ветки или коммит не меняет действующий сервис. Подробные доказательства и оставшиеся планы — в карточке выше. + _Проверено: 2026-10-09._ > Это основной runbook для текущей Balda на Mac. Старые документы про `balda-agent-valera-1`, Zulip и Kraken — исторические.