diff --git a/personal/projects/balda/balda-kraken-mm-deploy.md b/personal/projects/balda/balda-kraken-mm-deploy.md index 577b45e8..fe8e297c 100755 --- a/personal/projects/balda/balda-kraken-mm-deploy.md +++ b/personal/projects/balda/balda-kraken-mm-deploy.md @@ -3,10 +3,14 @@ > Создан 2026-09-26. Обновлён 2026-09-26 (**✅ ФАЗА ЗАКРЫТА — боевая приёмка пройдена**). > Статус: **✅ РАБОТАЕТ. Бот отвечает аккаунту Alex.** Образ `0.1.10` (коммит `9f1e6c9c`, > он же PR baldaworks/balda#8). -> ⚠️ **Актуальный рабочий образ на Kraken — `balda-mm:0.1.11`** (2026-09-26, позже этой фазы): -> добавлен Mattermost-классификатор scope в `ScopeResolver` + включён -> `balda.session_memory` (MCP-инструменты в сессии). Разбор — [[personal/plans/balda-mm-phase4-agents]] §12. -> Compose: `/home/kraken/balda/docker-compose.yml` (`image: balda-mm:0.1.11`). +> ⚠️ **АКТУАЛЬНЫЙ РАБОЧИЙ ОБРАЗ НА KRAKEN — `balda-mm:0.1.12`** (2026-09-27). Что в нём: +> Mattermost-классификатор scope в `ScopeResolver` (`0.1.11`) + **форк runtime с tool-calling +> для провайдера `type: openai`** (`openai.go`: `openAIToolsFromConfig`, `parseChatResponse`, +> `TurnComplete = !hasToolCalls`). Без форка MCP-инструменты НЕ доходят до модели. +> Форк: `mallexxx/runtime`, ветка `feat/openai-tool-calls-v2`, коммит `733b32d`, +> PR **https://github.com/normahq/runtime/pull/4**. В Балде подключён +> `replace github.com/normahq/runtime/v2 => ./runtime-local`. +> Compose: `/home/kraken/balda/docker-compose.yml`. Разбор — [[personal/plans/balda-mm-phase4-agents]] §12. > **Доказательство (лента `balda-test`):** `cbwsorzwoigbtrdnteugnx4aqo` (Alex) — > `@balda скажи одно слово` → `edxrgupoxiyig5gzmr79tjypbme` (бот) — `слово`. > `settlement_stage=accepted`, `bad_seq`=0, `RestartCount`=0. @@ -19,6 +23,70 @@ --- +## 🔴🔴🔴 КАК ПОСТИТЬ В `qentra:balda-test` — ЧИТАТЬ ПЕРЕД КАЖДЫМ ТЕСТОМ (2026-09-27) + +> **ЭТО ГЛАВНЫЙ БЛОК ЭТОГО ДОКА. ЗАПИСАНО КАПСОМ ПО ТРЕБОВАНИЮ ALEX.** +> **Я ПОТЕРЯЛ ЭТУ ИНФУ ОДИН РАЗ — БОЛЬШЕ НЕ ПОТЕРЯЮ.** + +### 🔴 ПРАВИЛО №1: `mmctl --local post create` НЕ РАБОТАЕТ + +``` +Error: creating posts is not supported in local mode +``` + +**НЕ ПЫТАТЬСЯ. НЕ ЛЕЗТЬ В API-ЛОГИН. НЕ ИСКАТЬ ПАРОЛЬ АДМИНА. СРАЗУ ГОТОВЫЙ СКРИПТ.** + +### 🔴 ПРАВИЛО №2: ЕДИНСТВЕННЫЙ РАБОЧИЙ ПУТЬ — `mm-post-user.sh` + +```bash +ssh kraken '/tmp/mm-post-user.sh 7bjw4g7o1jdsbmjbqd649xxgaw testuser "T3stPassw0rd!x" "@balda <ТЕКСТ>"' +``` + +| Параметр | Значение | ❌ ЧТО НЕ ТАК | +|---|---|---| +| channel_id | `7bjw4g7o1jdsbmjbqd649xxgaw` | НЕ `753nhtnudtb39ph4zib1norwor` (это MM DM) | +| **username** | **`testuser`** | НЕ `admin` | +| **пароль** | **`T3stPassw0rd!x`** | НЕ `backoffice-adminpw` (это пароль backoffice БАЛДЫ, не MM!) | +| тип | человек (не бот) | пост от бота отбросит `IsBotEcho` | + +Исходник: `~/Developer/balda/tools/mm-post-user.sh` — **в репозитории, не только в `/tmp`**. +Если `/tmp` пуст после ребута: `scp ~/Developer/balda/tools/mm-post-user.sh kraken:/tmp/`. + +### 🔴 ПРАВИЛО №3: ПАРОЛЬ АДМИНА MM НЕ ХРАНИТСЯ НИГДЕ + +Проверено: в `/home/kraken/balda/secrets/` его **нет**. `backoffice-adminpw` — **другой пароль** +(backoffice Балды, даёт 401 на MM API). Не тратить время на поиск — **логиниться `testuser`.** + +### 🔴 ПРАВИЛО №4: ГДЕ ИСКАТЬ ЗАБЫТОЕ — ZULIP БАЗА, НЕ `session_search` + +```bash +docker exec zulip-database-1 psql -U zulip zulip -c " +SELECT m.id, m.date_sent, REPLACE(REPLACE(LEFT(m.content,300),E'\n',' '),'|','/') as content +FROM zerver_message m +JOIN zerver_recipient r ON m.recipient_id = r.id +WHERE r.type = 2 AND m.content ILIKE '%mm-post-user%' +ORDER BY m.date_sent DESC LIMIT 10;" +``` + +**Именно этот запрос вернул пароль `T3stPassw0rd!x`** после того, как `session_search` дал ноль. +🔴 `session_search` индексирует сессии Hermes, **НЕ Zulip**. Сказано «из базы» → `docker exec psql`. +Скилл: [[software-development/zulip-db-forensics]]. + +### 🔴 ПРАВИЛО №5: ЧИТАТЬ ЛЕНТУ — `mmctl --local post list` (работает!) + +```bash +ssh kraken 'docker exec mattermost mmctl --local post list qentra:balda-test 2>&1 | tail -30' +``` +Создание запрещено, **чтение — работает**. Это и есть «читать сессию из базы». + +### 🔴 ПРАВИЛО №6: ПРИЁМКА = ОТ АККАУНТА ALEX, НЕ ОТ `testuser` + +`testuser` (`c6udeze8dfrdxm5jbgq55bd58r`) **НЕ владелец** → `settlement_stage=unauthorized`. +Владелец — `admin` = `cbwsorzwoigbtrdnteugnx4aqo`. Ответ от `testuser` **доказывает конвейер, +но НЕ работу для заказчика.** Для настоящей приёмки нужен его аккаунт. + +--- + ## ✅ ПРИЁМКА ПРОЙДЕНА (2026-09-26, образ `balda-mm:0.1.10`) **Сквозной путь проверен ОТ АККАУНТА ALEX — не от тестового.** Прошлая «приёмка» от