Files
obsidian-vault/personal/projects/balda/setup.md
T

29 KiB
Executable File
Raw Blame History

Balda — актуальный локальный запуск

Текущее состояние — сверено 2026-10-19 08:06 UTC

Компонент Проверенное состояние
SSH Manager 0.3.2, a86df58, 8 MCP-инструментов, 127.0.0.1:17796
Workspace Manager 0c82b8f, четыре функции, native SMB3, 127.0.0.1:17795; root только developer, recipient balda
Balda eee69fc5, balda-mm-mac, provider pool, permissions ask; старт 2026-10-19T08:05:42.795540715Z
Проверка установленного SSH-ключа Реальный контейнер Balda, registered, client_verified_at=2026-10-19T06:29:15.692883Z; прежний key id сохранён
Исходники / runtime Все три checkout чистые; build metadata обоих исправленных binaries указывает на эти чистые commits; активные hashes/inode проверены

SSH Manager импортирует существующий Mac SSH alias из native config/Include и доверенных known_hosts, проверяя существующую аутентификацию; повторно присылать server key для такого хоста не требуется. Для клиента отдельно проверяется маршрут: без via сначала pinned no-auth handshake из настроенного client_container; при сетевом отказе выбирается единственный зарегистрированный relay. Неизвестный или неверный pin не вызывает fallback; при нескольких relay нужен явный via. Owner-form включает точную замену relay key line с ограниченным permitopen. Хардкода Kraken или mac-relay в выборе маршрута нет.

Успех ssh_authorize теперь требует свежего SSH-вызова из фактического клиента его установленным dedicated key с проверкой случайного маркера. Ошибка сохраняет installed_unverified и возвращает tool error; удаление host до отзыва такого ключа запрещено. Существующий принятый доступ можно проверить/исправить без замены целевого ключа и sandbox policy. В operator config указан client_container: balda-mm-mac, volume проверяется read-only.

Inventory сейчас: mac, mac-relay, kraken. Kraken добавлен владельцем через Balda в сессии по ссылке ниже; маршрут исправлен самим менеджером на mac-relay → kraken, relay ограничен текущим endpoint. Новый target key при исправлении не устанавливался, прежняя identity и изоляция сохранены. Отдельный независимый SSH-вызов UID 1000 из Balda вернул ожидаемый маркер.

Треды Mattermost DM: eee69fc5 сохраняет root_id пользовательского сообщения в адресе доставки; обычные ответы, progress и вопросы идут в его тред, дальнейшие replies сохраняют этот root. DM/group session IDs остаются прежними. Это поведение транспорта в коде; настройки переключения нет. Отдельный approval-тред не создаётся. 254f3e29 откачен коммитом 3f6a1363: обработчик обычного числового ответа без треда и изменения хранилища удалены. Узкое сопоставление raw user ID для штатного threaded reply исправлено отдельно в eee69fc5. Исправление двойного меню 3e86b995 сохранено. 9018e7a3 исправляет transport routing; c061e266 исправляет выбор pending-вопроса в общем root вместо уже отвеченного; неоднозначные параллельные pending-вопросы не подтверждаются. eee69fc5 сохраняет прежнюю классификацию лички в архиве. Приёмка и ограничения: personal/projects/balda/mattermost-dm-threads-2026-10-19.

Balda: меню подтверждения рендерится один раз — permission layer передаёт готовую presentation, questions layer сохраняет structured options для ответа, но не дописывает второе меню. Regression проходит через permission review, session question delivery и decision resolution. Добавление host и установка ключа остаются двумя разными owner confirmations; дополнительные generic MCP approvals у Codex выключены, native изменения доступа подтверждаются владельцем.

MCP: obsidian, virfield, workspace-manager, ssh-manager и встроенный balda. Legacy Broker/Prism MCP отсутствуют в runtime, plugin execution-broker выключен, оригинальные Prism/Prism Callee 0.7.0 включены. Codex: workspace-write, дополнительный writable root только grants получателя, --mcp-approval-policy=allow.

Workspace: workspace_folders, workspace_connect, workspace_disconnect, workspace_lease; discovery только папок, выдача конкретной папки RO/RW с TTL. Downloads и общий Developer/home mount не включены. Lease journal пуст. Приняты SMB revoke существующих FD/expiry и shared Beads fixture; runtime Workspace в этом исправлении не менялся.

Проверено: SSH race/vet/build; 15 native SSH lifecycle checks и 16 checks на случайных aliases в сети реальной Balda, включая alias-only import без via, автоматический relay, pin failure, retry, restart/revoke/remove. Историческая model-проверка после deployment SSH-маршрута 06:28 UTC: 01a152d9-7d04-7f21-9597-91c259813c7c, ровно одна Owner confirmation существующего key id, без generic MCP approval; client receipt выше. Полный race-прогон Balda: 142 пакета с тестами; golangci-lint и architecture checks — pass; launchd Workspace/SSH/Beads-Dolt running, health/login 200. Внешние тестовые сообщения Mattermost не отправлялись.

Первичный провал приёмки: сессия Mattermost. Причины и исправление: personal/projects/balda/ssh-client-route-2026-10-19. Evidence: ~/.local/share/balda-workspace/candidate/client-route/; backup: ~/.local/share/balda-workspace/backups/client-route-20261019T062059Z.

Оставшийся исходный объём: полноценные удалённые Mac model runs с отдельными CLI credentials/OpenCode network решениями, полный модельный Prism lifecycle и реальные project Beads DB. Host Docker/socket/sudo authority не добавлялась: установленный target key по-прежнему ограничен принятой песочницей. Эти пункты не объявляются выполненными этим исправлением.

Текущие пути и эксплуатация — 2026-10-19

Параметр Значение
Compose /Users/admin/Docker/balda-mm-mac/docker-compose.yml
Активный config /Users/admin/.local/share/balda-workspace/candidate/config/config.yaml
Config mount /workspace/.config/balda, read-only
Запускаемый binary /workspace/.config/balda/bin/balda; SHA256 88dc7349c4eff1aae79daa95381d33e79c3bbb0097b95fde92834e4479392000
State / work /Users/admin/Docker/balda-mm-mac/state и /Users/admin/Docker/balda-mm-mac/work
Home / SSH volumes balda_balda-home → /home/node; balda-ssh-manager → /run/ssh-manager:ro
Инструкции Codex Отдельный runtime.providers.codex.system_instructions не задан; personal/projects/balda/workspace-context

Обычное добавление/удаление SSH-хоста и Workspace lease выполняется MCP-инструментами и не требует ручной правки config или restart. После изменения самого Balda config нужен разрешённый restart. После изменения MCP schema также обновляются сессии клиента. При restart Balda дождаться внутреннего /backoffice/healthz:200, затем пересоздать существующий webui-proxy, поскольку он использует network_mode: service:balda; проверить host health/login. Изменение Compose/env/mounts применяется через docker-compose up -d, а не одним restart.

Активный Balda binary берётся из config mount; изменение checkout само по себе его не заменяет. Для обновления нужен build выбранного source, атомарная установка binary и разрешённый restart с backup. Изменения managed plugin revisions не вносятся вручную. Eagle в этой сверке не изменялся и не перепроверялся; старые сведения о совпадении двух инстансов ниже исторические.

Исторические снимки установки

Историческое обновление — 2026-10-18

Новый сервис подключения папок: personal/plans/workspace-gateway, /Users/admin/Developer/workspace-gateway; создан каркас, реализации пока нет. Проверка исходящего SSH и Seatbelt: personal/projects/balda/ssh-seatbelt-2026-10-18; сетевой SSH из контейнера доступен, production логин и sandbox launch ещё не приняты.

План удалённого исполнения: personal/plans/balda-remote-agent. Проверка штатного ACP поверх SSH: personal/projects/balda/ssh-acp-verification-2026-10-18.

  • Основной balda-mm-mac: image balda-prism:20261018, база balda-upstream:a908ee1a; проверенный checkout Balda — a908ee1a5ff2.
  • balda-mm-eagle работает на balda-upstream:a908ee1a; добавления Prism/Virfield в этой сессии выполнялись только для основного инстанса.
  • В основном конфиге выбран balda.provider: pool; настроены также провайдеры Codex, Claude Code, OpenCode и hosted API.
  • В основном инстансе установлены оригинальные managed plugins prism и prism-callee версии 0.7.0.
  • Установлен bd 1.3.1; npm-пакет Callee 0.22.2 содержит бинарник, сообщающий 0.22.1.
  • Оригинальный Callee pack импортирован в постоянный /home/node/.config/callee; обычный каталог разрешает prism/lifecycle как Router, prism/story и prism/epic как Sequential.
  • Virfield MCP подключён напрямую: http://host.docker.internal:7780/mcp, доступен провайдерам основного инстанса; проверены discovery 20 tools и чтение virfield_status.
  • В native catalog сохранились execution-broker, execution-prism, obsidian и plugin execution-broker; это отдельные прежние интеграции.
  • balda.permissions.mode: allow_all, working_dir: /workspace, workspace.mode: off.
  • Уже подключён /Users/admin/Docker/balda-mm-mac/work:/workspace/work; общего mount /Users/admin/Developer в Balda нет.
  • Установка сохранила 49 прежних session bindings и их capability snapshot IDs; историю и авторизации не сбрасывали.
  • Новые сессии выбирают текущий каталог; существующие сохраняют закреплённый snapshot до штатного reset, который автоматически не выполнялся.
  • Рабочие Balda, WebUI proxy и Eagle после SSH-проверки продолжают работать; временные проверочные контейнеры и производный образ удалены.
  • Production-конфигурация на удалённый SSH provider ещё не переключалась; полный Prism lifecycle и реальные удалённые Claude/Codex не приняты.

Операторские версии и backup: /Users/admin/Docker/balda-mm-mac/prism-runtime/setup.json и state/setup-backups/prism-20261018T151411/. SSH-проверка не вызывала модели и не отправляла сообщения в реальные чаты. Доказательства проверки сохранены в самой заметке personal/projects/balda/ssh-acp-verification-2026-10-18, включая JSON, логи и SHA256 исходных файлов.

История установки до обновления 2026-10-18

Далее сохранены датированные сведения прежней установки; старые одинаковые image/provider/MCP обоих инстансов относятся к указанным старым проверкам.

Проверено: 2026-10-16 по обоим работающим контейнерам, Compose, binary hashes, сохранённому state и authenticated Broker/Prism MCP.

Обзор: personal/projects/balda/balda. Broker, версии и границы приёмки: personal/projects/balda/execution-broker.

Снимок установки 2026-10-16

Параметр Фактическое значение
Хост / контейнер Mac / balda-mm-mac
Канал Mattermost
Provider codex, type codex_acp, reasoning effort medium
Образ обоих инстансов sha256:ee0567594b8f8422d71b3bb37aa47ef1222b089af6b24e17d50ac9c63a4ef22f
Balda source Чистый upstream/main — 3a58254bb05747fdeecde070b1828e770ed589a4, без локальных патчей; Linux ARM64 binary SHA256 9baff2c85757e839c6df3bd516518cc3d06bde2ad298a3dfdcdad1479ae186b7
Compose /Users/admin/Docker/balda-mm-mac/docker-compose.yml
Активный конфиг /Users/admin/Docker/balda-mm-mac/config/config.yaml
State / plugins /Users/admin/Docker/balda-mm-mac/state
Workspace /Users/admin/Docker/balda-mm-mac/work
Home volume balda_balda-home, mounted в /home/node

Config bind-mounted в /workspace/.config/balda read-only для контейнера; state и work доступны ему на запись. Файл ~/Developer/balda/.config/balda/config.yaml относится к отдельному dev checkout и не управляет этим контейнером.

Eagle и общие инструменты — исторический снимок 2026-10-15

Eagle работает на том же Mac в balda-mm-eagle; Compose, config, state и work находятся в /Users/admin/Docker/balda-mm-eagle/, service — eagle, отдельный home volume — balda_eagle-home. Образы обоих инстансов одинаковы. Авторизации Codex раздельные; при обновлении home volumes сохранены. Историческая серверная проверка 2026-10-15: models endpoint отвечает HTTP 200 у обоих. У @balda реальная генерация в отдельной ephemeral read-only сессии завершилась ответом AUTH_OK и turn.completed; исходный аккаунт сохранён. После перечитывания credentials Mattermost websocket подключён, существующие беседы не сбрасывались. Не копировать auth между разными аккаунтами.

У обоих включены одинаковые Obsidian, Execution Broker и Prism MCP, одинаковые права runtime и managed plugin execution-broker rc.32. При настройке 2026-10-15 проверены реальные initialize/tools-list: Obsidian — 15, Broker — 26, Prism — 5 инструментов; списки совпадают. Eagle дополнительно имеет asana-readonly, URL http://asana-readonly:3100/mcp в приватной Docker-сети. Отдельный контейнер balda-eagle-asana-readonly не публикует порт на хост. Тогда реальное чтение Asana прошло; все пять операций изменения и запись заметок в файл отклоняются сервером.

В обоих конфигурациях provider codex_acp, reasoning medium, явный model отсутствует. Последние записи Codex подтверждают gpt-6.1-sol у обоих. При выравнивании инструментов настройки основной модели не менялись. balda.nats.max_store у обоих — 16gb.

Продолжение задач

Тип канала берётся из канонической привязки сессии. Для Mattermost он остаётся mattermost, включая native waits и возврат результата; human.delivery_channel=telegram меняет только доставку одобрения. SQLite/PostgreSQL migration исправляет прежний сгенерированный Telegram-заголовок в сохранённых ACP instructions без /reset, сохраняя provider thread, capability snapshot и историю. Согласованные Linux SQLite snapshots обоих инстансов прошли integrity/foreign-key checks; последнее обновление сохранило все 2277 прежних событий основного инстанса, locator, capability snapshots, provider threads и auth. Плагин rc32 совместим с текущей Balda и не требовал переустановки; immutable revisions сохранены. Согласованные state/home/config backups и отчёты обновления 2026-10-15: state/balda-upstream-merged-20261015/; полный race, lint, architecture, SQLite/PostgreSQL integration, migration validators, govulncheck, replay/NATS/ingress, managed plugin lifecycle и native wait restart тогда прошли на b5f7d5b4. Авторизация обоих инстансов после обновления подтверждена HTTP 200; backup миграции контекста также сохранён в state/balda-channel-context-20261015/.

В этой версии generic webhooks выполняют изолированные задания. Они не продолжают исходную сессию. Старые routes.*.path, envelope.target, key_from_body, mode и fallback_to удалены из конфигурации; listener задаётся через balda.http. Сейчас он слушает loopback 127.0.0.1:8095.

Плагин rc32 использует balda.state и штатный balda.session.wait: наблюдатель вооружается до Start/retry и возвращается в исходную сессию. Managed lifecycle и restart-контракт проверены. Реальный conversational smoke с моделью, фактическим Telegram Human ответом, шестью проверенными артефактами, cleanup=done и единственным итоговым сообщением в исходной Mattermost-беседе прошёл; Story/Task закрыты и waits отменены. Реальная беседа прошла также HTTP 502 и restart Broker/Prism/Balda во время Human pause: тот же run/Story, provider thread и deadline восстановились, фактический Telegram approval принят, шесть артефактов проверены, cleanup=done. Story/Task закрыты, waits отменены, сообщение о завершении restart-приёмки подтверждено через Mattermost API. Старые callbacks Broker на :8090 приостановлены, недоставленные cursors сохранены. Native wait acceptance не является подтверждением доставки сообщения провайдером.

Оба инстанса имеют также одинаковые пять глобальных Codex skills и одинаковую Codex tool policy; различий не найдено. Обновление плагина выполнено штатной переустановкой из нового operator source с сохранением plugin-data/execution-broker, старых revisions/catalog snapshots и содержимого прежнего marketplace. Существующие сессии не сбрасывались.

Обновление 2026-10-16

Оба инстанса развёрнуты на чистом upstream 3a58254; hash работающего binary сверён с точной сборкой. Сохранены config bytes, environment values, mounts, оба home volume, auth, все 2277 прежних событий основного инстанса и 49 session metadata/bindings. SQLite integrity и foreign keys прошли. На точном новом исходнике прошли полный race, lint, managed plugin lifecycle и native wait restart. Из обоих production network namespaces проверены 26 Broker tools, 5 Prism tools и execution_profiles. Новые проверки не вызывали модель и не отправляли сообщения; старые model/Asana/conversational receipts выше относятся к прежним датированным прогонам.

Актуальные snapshots и доказательства: state/main-production-sync-20261016/coordinated-stack-snapshot/, active-deployment-before/, production-deployment.json, live-baldda-mcp.json. Развёрнутый Broker/Prism/gateway — rc34/13c29ac; закреплённые managed plugin revisions и session capability snapshots сохранены.

Исторические процедуры перезапуска — перед применением сверить текущие пути выше

Изменение Действие
Только host config/config.yaml docker restart balda-mm-mac: процесс перечитывает конфигурацию при старте
.env, environment, mounts, service definition Из каталога Compose: docker-compose up -d balda
Новый image Сначала получить или собрать выбранный образ, затем docker-compose up -d balda; в действующем Compose нет build-секции
Код в checkout Сам по себе не обновляет образ; нужен отдельный build и применение выбранного image
Изменение catalog / skills существующей беседы Обычный /reset для выбора текущего capability snapshot

docker restart не применяет изменения Compose или .env. --force-recreate для изменения только config.yaml не требуется. До смены image сохраняют согласованный state backup и прежний image/config для отката.

Plugins, skills и инструкции

Managed plugin revisions неизменяемые; вручную редактировать их содержимое в state нельзя. Документация проекта описывает управление пакетами через Backoffice → Operations → Plugins: Installed/Marketplaces, review exact revision, install/upgrade/enable/disable/rollback/remove. Проверять доступность поверхности на используемой версии, а не переносить команды из архивных runbooks: plugins reference.

Management не сбрасывает существующие сессии. Новая сессия выбирает текущий catalog; существующая принимает capabilities через обычный /reset. Standalone skills также редактируются отдельно от уже закреплённого session snapshot.

personal/projects/balda/soul содержит сверенный снимок balda.global_instruction. personal/projects/balda/workspace-context описывает runtime.providers.codex.system_instructions; сейчас отдельное значение не настроено. Редактирование заметки не меняет работающий конфиг.

Codex ACP

Reasoning effort в активном конфиге — medium. Авторизация CLI хранится в home volume. Для восстановления существующего @balda: docker exec -it balda-mm-mac codex login --device-auth, завершить вход в исходный аккаунт и проверить реальный запрос к провайдеру. codex login status подтверждает только наличие локальной авторизации и сам по себе не доказывает действительность токена на сервере. При необходимости перезапустить Balda для перечитывания auth; /reset не требуется. Для отдельного headless-входа используется команда из каталога Compose:

docker-compose run --rm --entrypoint codex balda login --device-auth

Obsidian MCP

Проверенный блок активной конфигурации находится в runtime.mcp_servers:

runtime:
  mcp_servers:
    obsidian:
      type: http
      url: http://host.docker.internal:3101/mcp

Используется Streamable HTTP. Для Codex ACP SSE-конфигурацию из старых заметок не переносить. После изменения этого блока нужен перезапуск Balda.

Диагностика

docker ps --filter name=balda-mm-mac
docker logs --tail 120 balda-mm-mac

Проверять успешный startup provider и подключение Mattermost. Не копировать токены, cookie или login URLs из логов в заметки.

Архив старых схем и шаблонов: personal/projects/archive/balda-reference-before-2026-10-14.

Два upstream PR — 2026-10-19 08:51 UTC

Открыты независимые PR к baldaworks/balda:main: #77 — единичное меню подтверждения и #78 — ответы в тредах лички. У каждого один коммит от свежей публичной базы e0edbe58; checks race/lint/architecture прошли отдельно. Оператор подтвердил успешный прогон развёрнутой Balda в Mattermost.

Production остаётся на eee69fc5: этот этап готовил PR и не обновлял работающий binary. PR тредов дополнительно закрывает повтор старого ответа с сохранением точности времени; эта дополнительная защита проверена в PR-ветке и в production на этом этапе не устанавливалась. Подробности и CI-снимок: personal/projects/balda/upstream-prs-2026-10-19.