diff --git a/personal/plans/balda-callee-prism-plan.md b/personal/plans/balda-callee-prism-plan.md index aabbc418..3ff1c0c9 100755 --- a/personal/plans/balda-callee-prism-plan.md +++ b/personal/plans/balda-callee-prism-plan.md @@ -2,10 +2,13 @@ > Обновлён 2026-09-29. Статус: **C0 закрыта. Топология пересмотрена: стек переезжает > на Mac, на Kraken остаётся только MM-сервер.** +> ✅ **2026-09-29: БАЛДА СОБРАНА И РАБОТАЕТ НА MAC** — контейнер `balda-mm-mac`, +> образ `balda-mm:0.1.16-mac` из `bf4a6ae4`, сквозная приёмка пройдена (бот ответил +> в `qentra:balda-test`). Осталось: `callee` + `dsh-acp` + `bd` + prism (шаги 3-7, 9 C1). > ⛔ **2026-09-29: старый Balda-стек на Kraken СНЕСЁН** (контейнеры `balda-mm`, > `balda-executor-mcp`, `obsidian-mcp` + все образы `balda-mm:*`). Mattermost жив. > Решение §6.11 «оставить Kraken-инстанс живым как запасной» — **ОТМЕНЕНО Alex'ом**. -> C1-C5 не начаты. Часть [[personal/projects/balda/balda-mm-delegation-plan]]. +> C1 закрыта **частично**: Балда собрана и работает, callee/prism не начаты. > Опорная заметка по контрактам инструментов: [[personal/tech/callee-prism]]. > > 🔴 **Открытая развилка (§6.7):** как давать доступ к `xcodebuild` / `lume` / `docker build` — @@ -643,7 +646,77 @@ callee agent import baldaworks/prism-callee --path pack/callee/prism --prefix pr `/-/v1/search?text=...`. ⛔ Поиск по `scope:normahq` и `scope:baldaworks` даёт пусто — scoped-пакеты так не индексируются. -### C1 — переезд стека на Mac (2-3 ч) +### C1 — ✅ БАЛДА СОБРАНА И РАБОТАЕТ НА MAC (2026-09-29). Шаги 3-9 (callee/prism) не начаты. + +#### Что сделано и проверено + +| # | Шаг | Статус | Доказательство | +|---|---|---|---| +| 1 | Образ `balda-mm:0.1.16-mac` | ✅ | собран из `bf4a6ae4` = **head of upstream**, linux/arm64, 78.8 МБ | +| 2 | MM-бот | ✅ | **тот же `@balda`** — решение Alex, второго бота не заводили | +| 3-7 | callee / dsh-acp / bd / prism | ❌ | не начато | +| 8 | `obsidian-mcp` рядом | ✅ | контейнер на Mac, `http://host.docker.internal:3101/sse` | +| 9 | Сквозная приёмка | ✅ | **лента канала**: `cbwsorzwoi` (Alex) → `@balda ответь одним словом: работает`; `edxrgupoxi` (бот) → **`работает`** (1.7 с) | + +Контейнер: `balda-mm-mac`, Up, `RestartCount=0`, `restart: unless-stopped`, +WebSocket `wss://mm.qentra.top/api/v4/websocket` — `connected`, errors=0. + +#### Файлы на Mac + +| Путь | Что | +|---|---| +| `/Users/admin/Developer/balda` | исходники, `main` = `bf4a6ae4` (head of upstream) | +| `/Users/admin/Docker/balda-mm-mac/config/config.yaml` | конфиг | +| `/Users/admin/Docker/balda-mm-mac/.env` | `0600`: DEEPSEEK_API_KEY, MM-токен, bot_user_id, server_url | +| `/Users/admin/Docker/balda-mm-mac/docker-compose.yml` | `image: balda-mm:0.1.16-mac`, `extra_hosts: host.docker.internal` | +| `/Users/admin/Docker/balda-mm-mac/state/` | sqlite `state.db` + nats + session-memory | +| `/Users/admin/Docker/balda-mm-mac/secrets/backoffice-adminpw` | `0600`, пароль backoffice | + +**Отличия конфига Mac от Kraken:** +- `server_url`: `http://mattermost:8065` → **`https://mm.qentra.top`** (Cloudflare API пропускает, 200) +- `executor-mcp` **убран** (контейнер снесён); `obsidian` → `host.docker.internal:3101` +- `BRIDGE_URL` / `BRIDGE_SECRET` не нужны + +#### Четыре дефекта при запуске (все закрыты) + +| # | Дефект | Симптом | Фикс | +|---|---|---|---| +| 1 | **Backoffice-админ не забутстрапен** | crash-loop: `administrator bootstrap is required` | `docker run --rm … balda-mm:0.1.16-mac backoffice bootstrap-admin --username admin` (образ `scratch` — `docker exec` невозможен, только `docker run` с тем же state-томом) | +| 2 | 🔴 **`/home/kraken/balda/secrets/mm-bot-token-id` ВРЁТ** | `bot user id mismatch: configured "ejquewpbq…", token belongs to "edxrgupoxi…"` | истинный id — **из API**: `/api/v4/users/me`. Файл на Kraken содержит чужой id, **не доверять** | +| 3 | 🔴 **`balda_user_bindings` пуст на чистой базе** | посты приняты (`post accepted for processing`), но **нет ни одной строки `settlement`/`turn_dispatcher`** — молчаливое гашение | `INSERT` binding для аккаунта Alex. На Kraken круг был замкнут (`testuser` уже владелец), на чистой базе — нет; штатный путь `/start owner=` тоже доступен | +| 4 | 🔴 **Hermes-редакция секретов калечит подстановки** | `sqlite3 < file` из heredoc с `$VAR` → 0 строк, exit 0 (тихий провал); в `.env` значения `***` | писать **литералы прямо в аргумент** `sqlite3`, БД при **остановленном** контейнере; секреты — через файлы-носители | + +**Рабочая форма записи binding** (единственная сработавшая; контейнер остановлен): +```bash +cd /Users/admin/Docker/balda-mm-mac && docker-compose stop +docker run --rm -v /Users/admin/Docker/balda-mm-mac/state:/state alpine:latest \ + sh -c 'apk add -q sqlite 2>/dev/null; sqlite3 /state/state.db "DELETE FROM balda_user_bindings; INSERT INTO balda_user_bindings (binding_id,user_id,channel_type,principal,display_name,provenance,created_at,updated_at) VALUES (…);"' +docker-compose up -d +``` +⚠️ **НЕ работают** (проверено, 0 строк, exit 0): `sqlite3 < /q.sql` с heredoc-подстановками; +многострочный INSERT через `-v /q.sql:/q.sql:ro`. + +#### Приёмка (воспроизводимо, без GUI) + +```bash +ssh kraken "docker exec mattermost mmctl --local token generate admin 'acc-$(date +%s)'" \ + | sed -n 's/^\([a-z0-9]*\):.*/\1/p' > /tmp/tok +ssh kraken "bash /tmp/mm-post-admin.sh $(cat /tmp/tok) 7bjw4g7o1jdsbmjbqd649xxgaw '@balda ответь одним словом: работает'" +ssh kraken "bash /tmp/mm-feed.sh $(cat /tmp/tok) 7bjw4g7o1jdsbmjbqd649xxgaw 12" +``` +⚠️ `mmctl --local token generate` печатает `токен: имя` — парсить **только первую часть**, иначе получите `api.context.session_expired.app_error`. +⚠️ `mm-feed.sh` — **позиционные** аргументы; при неверном числе `jq: Cannot iterate over null`. + +#### ⚠️ Остаточный дефект (неблокирующий, тот же, что на Kraken) + +``` +session_memory_worker: dead_letter, error_code: model_failure +output does not match schema: (root): output is required +``` +`deepseek-chat` не отдаёт structured output нужной схемы → **память сессий не наполняется**, +ответы работают. Отдельная задача. Разбор — [[personal/plans/balda-mm-phase4-agents]] §13. + +### C1 (исходный чеклист — для шагов 3-7) Объём вырос относительно исходного варианта: теперь это не «установка callee в контейнер», а **переезд Балды на Mac + установка инструментов рядом**.