[2026-10-19] eagle: personal/plans/balda-remote-agent.md personal/projects/balda/setup.md personal/projects/balda/ssh-permissions-2026-10-19.md work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md work/projects/cpm-status-2026-10-15.md work/projects/cpm-web-extension-code-guide-2026-10-09.md
This commit is contained in:
1 parent
2d5590e747
commit
bd68420a5d
6 files changed
+97
-41
No files matched your search
@@ -1,14 +1,14 @@
|
||||
# Balda — актуальный локальный запуск
|
||||
|
||||
## Текущее состояние — Balda сверена 2026-10-19 20:25 UTC+6 (Asia/Bishkek)
|
||||
## Текущее состояние — 2026-10-19 22:19 UTC+6 (Asia/Bishkek)
|
||||
|
||||
| Компонент | Проверенное состояние |
|
||||
| --- | --- |
|
||||
| SSH Manager | 0.3.2, `a86df58`, 8 MCP-инструментов, `127.0.0.1:17796` |
|
||||
| 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-19T14:21:56.807163574Z` |
|
||||
| Проверка установленного SSH-ключа | UID 1000 из обновлённой Balda, случайный маркер получен; принятый ключ и volume сохранены; 2026-10-19 20:25 UTC+6 (Asia/Bishkek) |
|
||||
| Исходники / runtime | Balda: чистый upstream `138cc4a7`, `vcs.modified=false`; активный `/proc/1/exe` совпадает со сборкой. SSH/Workspace commits прежние |
|
||||
| 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 в выборе маршрута нет.
|
||||
|
||||
@@ -24,13 +24,19 @@ MCP: `obsidian`, `virfield`, `workspace-manager`, `ssh-manager` и встрое
|
||||
|
||||
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 не отправлялись.
|
||||
Проверено на этом этапе: 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 не отправлялись.
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
# SSH Manager — постоянные и разовые права
|
||||
|
||||
Проверено и развёрнуто: 2026-10-19 22:19 UTC+6 (Asia/Bishkek).
|
||||
|
||||
SSH Manager **0.4.0**, implementation commit `d2806ac150363712b8baa9c40dbd37f2946b8c13`. Рабочее дерево чистое при сборке, `vcs.modified=false`. Активный binary SHA256 `536d389a4261e186fce8dfabe4a3adfe605d190d84ef188cdf105c3e8ee079bd`, inode работающего процесса совпадает с установленным файлом. HTTP MCP `127.0.0.1:17796/mcp` отдаёт **13 инструментов**.
|
||||
|
||||
Balda остаётся на чистом upstream `138cc4a71d6889de30fe90e368f27f129fd8d792`, binary SHA256 `31c448af84428f83491d5fb8317549466f814f51c453de11fc8f6c9bd0836672`. Каталог/кэш MCP обновлён штатным перезапуском: `2026-10-19T16:15:26.785581969Z`. Config/env/mounts, OAuth login, SSH inventory и ключи сохранены; health/login 200, Mattermost websocket подключён. Все 49 runtime sessions и metadata, 28 questions, 2 users/bindings и 24 archive sessions из остановленного snapshot сохранены. Workspace Manager не менялся.
|
||||
|
||||
## Что исправлено
|
||||
|
||||
В [разобранном треде](https://mm.qentra.top/qentra/pl/skeyf33mx3f6tcnmx11qukgs5r) штатный ключ уже работал, но bubblewrap закрывал сеть хоста, Docker socket и sudo. Модель попыталась использовать sandbox-доступ Mac как административный и запустить вложенный `ssh kraken`; он завершился DNS-ошибкой. Прав не поменялось. У менеджера тогда отсутствовало API изменения профиля. Сбой произошёл до обновления Balda на upstream.
|
||||
|
||||
Теперь изменения выполняются через SSH Manager существующим операторским bootstrap-доступом, без передачи его ключей агенту и без хардкода хоста. Менеджер не получил инструмент произвольного выполнения команд: он выдаёт разрешение и native SSH-команду, которую запускает клиент своим установленным ключом.
|
||||
|
||||
## Права
|
||||
|
||||
- `network`: сеть хоста вместо отдельного Linux network namespace; на Mac — IP networking через Seatbelt.
|
||||
- `read_paths` / `write_paths`: конкретные канонические пути. Manager control state, личные SSH credentials, системные корни и каталоги с socket-файлами не выдаются обычным файловым grant. Linux использует проверенные открытые FD для bind mounts.
|
||||
- `docker`: `none`, `read` или `manage`. Read разрешает просмотр/логи/инспекцию, но не изменения. Docker CLI работает с фиксированным локальным daemon endpoint и закрытым control HOME/config; socket не появляется в sandbox.
|
||||
- `admin`: прямой `sudo` с уже существующими noninteractive правами оператора. Sudoers не изменяется. Native timeout запускается с теми же привилегиями, чтобы остановить обычную root-команду.
|
||||
|
||||
`docker=manage` и произвольный sudo могут обойти файловые/сетевые ограничения; форма подтверждения сообщает об этом. Это отдельные явно разрешённые исключения. Завершение вызова не откатывает его побочные эффекты и не обещает отозвать намеренно оставленную привилегированную работу.
|
||||
|
||||
## Постоянное изменение
|
||||
|
||||
1. `ssh_permissions` возвращает профиль и revision.
|
||||
2. `ssh_permissions_update`: полный новый профиль плюс `expected_revision`.
|
||||
3. Native owner form показывает before/after; затем выполняются реальная приёмка изоляции, CAS только managed key line и SSH-проверка из настроенного клиента. Ключ и маршрут сохраняются.
|
||||
4. Ошибка активации/проверки восстанавливает и проверяет прежний профиль либо явно сообщает, что rollback не подтверждён.
|
||||
|
||||
Новые вызовы используют новый профиль. Старые запущенные процессы не завершаются; неиспользованные разовые допуски инвалидируются. Действующие production `mac` и `kraken` пока возвращают `managed=false`: их прежние принятые ограничения при deployment не заменялись. Первый переход на управляемый профиль — отдельное явное `ssh_permissions_update` с owner confirmation, выполняемое самой Balda через MCP; ручная настройка JSON/хоста не требуется.
|
||||
|
||||
## Разовый вызов
|
||||
|
||||
`ssh_call_request` принимает хост, точный argv и только временные overrides профиля. Например: command `["docker","ps","-a"]`, permissions `{"docker":"read"}`.
|
||||
|
||||
Одно owner confirmation связывает хост, argv, эффективные права и сроки. Затем Balda запускает возвращённый `ssh_command` своим установленным ключом. Сервер атомарно потребляет id **до запуска**, включая ошибочные вызовы; повтор/гонка второго подключения не дают второго запуска. Argv исполняется буквально, stdin закрыт. Start TTL 1–900 секунд (default 300), runtime 1–600 секунд (default 60). Часы — общесистемные на целевом хосте, включая macOS system Python.
|
||||
|
||||
`ssh_call_status` читает серверную квитанцию; issued не означает выполнение, consumed без result не означает, что процесс ещё работает. Успех — finished и exit_code 0 после реального SSH. `ssh_call_cancel` подтверждённо отменяет неиспользованный допуск, но не останавливает запущенную команду. Изменение профиля и revoke не воскрешают старые разрешения при повторной регистрации.
|
||||
|
||||
Постоянный профиль при разовом вызове не меняется. Штатная политика Balda для запуска локальной SSH-команды остаётся отдельным уровнем; SSH grant не выключает её. Старые диалоги с кэшированной MCP schema обновляются обычной новой сессией / `/reset`; история автоматически не сбрасывалась.
|
||||
|
||||
## Проверено
|
||||
|
||||
- Go race и vet, diff --check — pass.
|
||||
- Native macOS + MCP + временный sshd: **22 проверки**, включая отказы, stale revision, rollback после сбоя SSH-проверки, буквальный argv, закрытый stdin, race двух соединений, consumption после ошибки, TTL/timeout/cancel, постоянные file/network права и отзыв/re-authorize.
|
||||
- Linux strict bubblewrap в Colima: **10 проверок**, в том числе Docker read/manage отдельно, отказ управления при read, sudo от **обычного пользователя** с получением host root и остановка root-команды по тайм-ауту. Kernel/AppArmor/proc protection не ослаблялись. Временный Docker volume удалён.
|
||||
- Прежний native lifecycle произвольных хостов/ProxyJump/pin/restart/revoke/remove: **14 проверок**.
|
||||
- Реальная модель в работающей Balda: session `01a154e9-5b6a-7a32-ae5b-d5efcdc03ca6`. Постоянный update → one-call → проверка серверной квитанции → восстановление профиля. Ровно 3 native owner forms для этих 3 изменений, без generic MCP approval. Harness выполнил pinned native SSH из реального контейнера UID 1000 установленным **временным fixture-ключом**; успех подтверждён, повтор запрещён, исходная сеть восстановлена.
|
||||
- После deployment свежий Codex ACP вызвал новый `ssh_permissions` на production Mac/Kraken: session `01a154f0-1bb2-7932-aa2d-cf2907fc4ed0`, **0 подтверждений**. Это read-only проверка установленного API, без миграции профилей.
|
||||
- После перезапуска Balda прежние production-ключи к Mac и Kraken ещё раз проверены native SSH из настоящего UID 1000 Balda; оба вернули случайный marker.
|
||||
|
||||
Тесты используют случайные aliases/порты, временные ключи и отдельные private пути. Тестовые сообщения в Mattermost не отправлялись. Никакие bootstrap keys/passwords не передавались модели или в agent volume.
|
||||
|
||||
Evidence: `/Users/admin/.local/share/balda-workspace/candidate/ssh-permissions-20261019`. Backup менеджера: `/Users/admin/.local/share/balda-workspace/backups/ssh-permissions-20261019T161039Z`. Согласованный state backup Balda: `/Users/admin/.local/share/balda-workspace/backups/ssh-permissions-balda-20261019T161515Z`. Backup изменённых заметок: `/Users/admin/.local/share/balda-workspace/backups/obsidian-ssh-permissions-20261019T221941+0600`.
|
||||
|
||||
Исходники и contract: `/Users/admin/Developer/ssh-manager/README.md`, `docs/permissions-2026-10-19.md`. Текущий setup: [[personal/projects/balda/setup]]. План: [[personal/plans/balda-remote-agent]].
|
||||
Reference in new issue
Block a user