[2026-09-27] eagle: personal/projects/balda/balda-kraken-mm-deploy.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 00:39:53 +06:00
1 parent 627d06c07f
commit 304119a6d5
1 file changed
+72 -4
@@ -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 — не от тестового.** Прошлая «приёмка» от