32 KiB
Executable File
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. Причины и исправление: 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, /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: imagebalda-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-пакет Callee0.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и pluginexecution-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; после 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, 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.