[2026-09-28] eagle: personal/plans/balda-runtime-rebuild-mm-validation.md personal/plans/runtime-pr5-toolset-dedup-review-fixes.md personal/projects/balda/balda-kraken-mm-deploy.md personal/tech/adk-hostedagent-openai-mcp.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-28 20:34:03 +06:00
1 parent 3ae2f056d4
commit 1480fa8d95
4 files changed
+410 -106

No files matched your search

@@ -23,8 +23,11 @@
> Создан 2026-09-26. Обновлён 2026-09-27 (**✅ ФАЗА ЗАКРЫТА — боевая приёмка пройдена, включая
> ВЫЗОВ ИНСТРУМЕНТОВ**).
> 🔄 **ОБНОВЛЕНО 2026-09-28: задеплоен `balda-mm:0.1.14`** — runtime переведён с локального
> форка на **апстрим `v2.1.0`** (PR #4 + #5 влиты), приёмка тулинга и MM пройдена повторно.
> Разбор: [[personal/plans/balda-runtime-rebuild-mm-validation]].
> Статус: **✅ РАБОТАЕТ. Бот отвечает аккаунту Alex и исполняет MCP-инструменты.**
> Текущий образ на Kraken — **`balda-mm:0.1.13`** (см. блок ниже). Первая приёмка боевого
> Текущий образ на Kraken — **`balda-mm:0.1.14`** (см. блок ниже). Первая приёмка боевого
> пути была на `0.1.10` (коммит `9f1e6c9c`, он же PR baldaworks/balda#8) — но тогда
> инструменты не исполнялись.
> 🔴 **КОРЕНЬ (исправлено 2026-09-27, проверено кодом):** Balda регистрирует bundled MCP-сервер
@@ -224,17 +227,70 @@ display_name = mattermost:cbwsorzwoigbtrdnteugnx4aqo ← ОДИНАРНЫЙ п
| Скрипт (в `~/Developer/balda/tools/`, git-ignored) | Назначение |
|---|---|
| `mm-switch-image.sh` | смена тега образа в compose + бэкап + recreate (идемпотентно) |
| `mm-switch-image.sh` | смена тега образа в compose + бэкап + recreate (идемпотентно). 🔄 **2026-09-28: тег теперь аргумент** — `mm-switch-image.sh balda-mm:0.1.15`. Раньше был хардкод на строке 9 |
| `mm-whoami.sh` | какой MM-аккаунт у PAT (`/users/me`) — **обязательно перед приёмкой** |
| `mm-post-as.sh`, `mm-post-user.sh` | пост от человека (единственный валидный тест ингресса) |
| `mm-post-admin.sh` | пост от **владельца** через PAT (`mmctl --local token generate`) — настоящая приёмка |
| `mm-feed.sh` | чтение ленты канала |
| `mm-get-owner-token.sh` | `owner_auth_token` из `state.db` через `strings` |
| `mm-fix-owner-principal.sh` | снятие транспортного префикса с `principal` (легаси-фикс) |
🔴 **Питфоллы скриптов приёмки (найдены 2026-09-28):**
1. **`chmod +x` обязателен** после `ssh kraken 'cat > /tmp/x.sh' < tools/x.sh`.
Без него: `bash: /tmp/mm-post-admin.sh: Permission denied`.
2. 🔴 **НЕ пайпить `docker exec curl` в host `jq`:**
```bash
# ❌ падает: jq: error (at <stdin>:0): Cannot iterate over null (null)
docker exec mattermost curl -s -H "$HD" ".../posts" | jq -r '...'
# ✅ писать в файл и парсить из файла
docker exec mattermost curl -s -H "$HD" ".../posts?per_page=$N" > "$OUT"
jq -r '.posts as $p | .order[] | $p[.] | "\(.create_at) | \(.message)"' "$OUT"
```
Причина — гонка потока `docker exec` со stdin `jq`.
3. 📌 **jq-форма для posts-endpoint MM:** `.posts as $p | .order[] | $p[.] | …`.
Вариант `.order[] as $o | .posts[$o]` падает на вложенном контексте.
4. ⚠️ Проверять `md5` локального и залитого файла — редакция секретов Hermes умеет портить
файл молча. И `bash -n` **на хосте**, не глазами.
🔴 **Приёмка обязывает сверять аккаунт PAT ДО постинга** (`mm-whoami.sh /tmp/admin-tok` →
`cbwsorzwoigbtrdnteugnx4aqo | admin`). Иначе тест уходит от чужого аккаунта = ложная приёмка.
### 🔄 Runtime: с локального форка на апстрим (2026-09-28)
Раньше: `replace github.com/normahq/runtime/v2 => ./runtime-local` — локальная копия форка
с tool_calls (PR #4). Копия была **снапшотом файлов runtime**, снятым руками, без `.git`,
и **протухла**: `DedupKey` (PR #5) в ней отсутствовал.
После мержа PR #4 и #5 в апстрим (тег **`v2.1.0`** = `c41939f` = `upstream/main`):
- `go.mod`: `require github.com/normahq/runtime/v2 v2.1.0`, директива **`replace` удалена**;
- `Dockerfile.release`: удалён `COPY runtime-local/ ./runtime-local/`;
- каталог `runtime-local/` **вынесен из дерева** (был git-ignored).
📌 **Проверка перед удалением такой копии:** `diff -rq runtime-local <чистый upstream-чекаут>`.
В нашем случае отличались ровно 3 файла, и апстрим был новее во всех трёх → потери нет.
⚠️ **Осиротевший каталог чужого модуля ломает `go-arch-lint`.** Пока `runtime-local/` лежал
в корне, arch-lint давал **56 notices** `File /runtime-local/taskmaster/core.go not attached to
any component in archfile`, хотя каталог не участвовал в сборке. После выноса →
**`OK - No warnings found`**.
### 🔴 Известный не-блокер: bridge `balda-executor-mcp` (2026-09-28)
Инструмент `executor_health` возвращает:
```
rejected by transport: sending "tools/call": Internal Server Error
```
Диагноз: контейнер `balda-executor-mcp` на Kraken — `Up`, но `HTTP 000`, в логах
`json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)`.
Локальный Mac-бридж `balda-executor` — `Up 2 days (healthy)`.
📌 **Конвейер тулинга при этом ЦЕЛ** — `get_vault_stats` из того же тулсета исполняется штатно
(`function_response_part_count=1`). Сломан конкретно bridge к executor, это **отдельная**
инфраструктурная задача, не дефект Balda/рантайма.
---
## 🔴 ИСТОРИЧЕСКИЙ РАЗДЕЛ: как искали причину тишины (все закрыто)
> Ниже — путь диагностики. Все причины устранены, приёмка пройдена (см. выше).