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

177 lines
27 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 — актуальный локальный запуск
## Текущее состояние — сверено 2026-10-19 06:30 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 | `3e86b995`, `balda-mm-mac`, provider `pool`, permissions `ask`; старт `2026-10-19T06:28:48.664493362Z` |
| Проверка установленного 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 вернул ожидаемый маркер.
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. Реальная модель после финального deployment: `01a152d9-7d04-7f21-9597-91c259813c7c`, ровно одна Owner confirmation существующего key id, без generic MCP approval; client receipt выше. Полные 173 Balda package checks под race, golangci-lint и architecture checks — pass; launchd Workspace/SSH/Beads-Dolt running, health/login 200. Внешние тестовые сообщения Mattermost не отправлялись.
Первичный провал приёмки: [сессия Mattermost](https://mm.qentra.top/qentra/pl/bjb4nhz6o3yoxqg9rs1qcpncjh). Причины и исправление: [[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|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|Balda]]. Broker, версии и границы приёмки: [[personal/projects/balda/execution-broker|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](https://github.com/baldaworks/balda/blob/main/docs/reference/plugins.md).
Management не сбрасывает существующие сессии. Новая сессия выбирает текущий catalog; существующая принимает capabilities через обычный `/reset`. Standalone skills также редактируются отдельно от уже закреплённого session snapshot.
[[personal/projects/balda/soul|Global instruction]] содержит сверенный снимок `balda.global_instruction`. [[personal/projects/balda/workspace-context|Provider 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:
```bash
docker-compose run --rm --entrypoint codex balda login --device-auth
```
## Obsidian MCP
Проверенный блок активной конфигурации находится в `runtime.mcp_servers`:
```yaml
runtime:
mcp_servers:
obsidian:
type: http
url: http://host.docker.internal:3101/mcp
```
Используется Streamable HTTP. Для Codex ACP SSE-конфигурацию из старых заметок не переносить. После изменения этого блока нужен перезапуск Balda.
## Диагностика
```bash
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]].