# Balda — актуальный локальный запуск ## Текущее состояние — 2026-10-19 22:19 UTC+6 (Asia/Bishkek) | Компонент | Проверенное состояние | | --- | --- | | SSH Manager | 0.4.0, `d2806ac`, 13 MCP-инструментов; постоянные/разовые права, `127.0.0.1:17796` | | Workspace Manager | `0c82b8f`, четыре функции, native SMB3, `127.0.0.1:17795`; root только `developer`, recipient `balda` | | Balda | `138cc4a7`, чистый upstream, `balda-mm-mac`, provider `pool`, permissions `ask`; старт `2026-10-19T16:15:26.785581969Z` | | Проверка установленного SSH-ключа | UID 1000 из Balda после refresh: Mac и Kraken вернули случайные markers; старые keys/route сохранены | | Исходники / runtime | Balda: чистый upstream `138cc4a7`, `vcs.modified=false`; активный `/proc/1/exe` совпадает со сборкой. SSH Manager `d2806ac`; Workspace `0c82b8f` | 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 и единичное меню подтверждения теперь штатные upstream-исправления #77/#78. Root пользовательского сообщения сохраняется для обычных ответов, progress и вопросов, DM/group identity прежняя. Ответы сравниваются со временем публикации вопроса от Mattermost; provider timestamp хранится в question/outbox, локальные часы не используются. Отдельный approval-тред не создаётся. История реализации: [[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; 22 native macOS, 10 Linux/bubblewrap и 14 прежних lifecycle проверок. Реальный Balda ACP прошёл update/one-call/status/restore; native SSH выполнен установленным временным fixture-ключом из UID 1000. Свежий ACP вызвал production ssh_permissions без approvals. Отдельно проверены прежние production ключи Mac/Kraken после refresh Balda, health/login, Mattermost websocket и OAuth login. Подробности и границы: [[personal/projects/balda/ssh-permissions-2026-10-19]]. Первичный провал приёмки: [сессия 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 по-прежнему ограничен принятой песочницей. Эти пункты не объявляются выполненными этим исправлением. ## Постоянные и разовые SSH-права — 2026-10-19 22:19 UTC+6 (Asia/Bishkek) SSH Manager 0.4.0 развёрнут из чистого коммита `d2806ac`, активный inode/SHA проверены. Добавлены `ssh_permissions`, `ssh_permissions_update`, `ssh_call_request`, `ssh_call_status`, `ssh_call_cancel`. Network, read/write paths, Docker read/manage и sudo — отдельные права. Разовый допуск связан с argv, сроками и revision, проверяется и потребляется на целевом хосте; постоянный профиль при этом сохраняется. Старые production профили не мигрировали автоматически: первое управляемое изменение подтверждается через MCP. История и все 49 session/metadata сохранены; Balda только штатно перезапущена для обновления кэша MCP, binary остаётся чистым upstream. Полный contract, доказательства и ограничения: [[personal/projects/balda/ssh-permissions-2026-10-19]]. ## Upstream развёрнут — 2026-10-19 20:25 UTC+6 (Asia/Bishkek) Основной `balda-mm-mac` работает на чистом upstream `138cc4a71d6889de30fe90e368f27f129fd8d792`; PR #77 и #78 смержены и входят в этот commit. Binary SHA256 `31c448af84428f83491d5fb8317549466f814f51c453de11fc8f6c9bd0836672`, `/proc/1/exe` совпадает; build metadata `vcs.modified=false`. Конфигурация, environment, mounts и выбранный Codex account сохранены. Миграция SQLite — 68, integrity/foreign keys — ok; все 49 sessions/metadata, 1952 events, 2 users/bindings и 28 questions из согласованного snapshot сохранены. Mattermost websocket подключён, health/login 200, `codex login status` успешен; SSH UID 1000 установленным ключом из Balda до зарегистрированного target прошёл. Тестовые сообщения в Mattermost и модельные запросы этим deployment не отправлялись. Рабочий runtime больше не использует частные патчи `eee69fc5`. Исторический checkout сохранён без reset/rebase; новая сборка сделана отдельно. Предыдущие снимки ниже относятся к прежним этапам. Актуальные проверки, CI и откат: [[personal/projects/balda/upstream-deploy-2026-10-19]]. ## Текущие пути и эксплуатация — 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 `31c448af84428f83491d5fb8317549466f814f51c453de11fc8f6c9bd0836672` | | 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]]. ## Два upstream PR — 2026-10-19 08:51 UTC Открыты независимые PR к `baldaworks/balda:main`: [#77 — единичное меню подтверждения](https://github.com/baldaworks/balda/pull/77) и [#78 — ответы в тредах лички](https://github.com/baldaworks/balda/pull/78). Первоначально у каждого был один коммит от свежей публичной базы `e0edbe58`; после review в #78 добавлен второй коммит (см. ниже); checks race/lint/architecture прошли отдельно. Оператор подтвердил успешный прогон развёрнутой Balda в Mattermost. Production остаётся на `eee69fc5`: этот этап готовил PR и не обновлял работающий binary. PR тредов дополнительно закрывает повтор старого ответа с сохранением точности времени; эта дополнительная защита проверена в PR-ветке и в production на этом этапе не устанавливалась. Подробности и CI-снимок: [[personal/projects/balda/upstream-prs-2026-10-19]]. ## Исправление clock domain #78 — 2026-10-19 09:34 UTC PR [#78](https://github.com/baldaworks/balda/pull/78), head `a693e4efcb94175777700d38d7cc83e7ecce971b`: время ответа сравнивается с серверным временем публикации вопроса Mattermost, сохранённым в question/outbox SQLite и PostgreSQL. Рассинхронизация часов, stale reply и recovery проверены; полный race, lint, architecture и diff --check прошли. В #78 два коммита; #77 не изменялся, production этим этапом не обновлялся. Точный CI-снимок и evidence: [[personal/projects/balda/upstream-prs-2026-10-19]].