[2026-09-26] eagle: family/how-to/truenas-infrastructure.md personal/plans/balda-mm-pr-plan.md personal/projects/balda/balda-mattermost-connector.md personal/projects/balda/balda-mm-delegation-plan.md personal/tech/balda-go-fx-pitfalls.md
This commit is contained in:
1 parent
036e7a7091
commit
1bf8320446
5 files changed
+318
-57
No files matched your search
@@ -1,30 +1,25 @@
|
||||
# Balda — Mattermost коннектор (архитектура)
|
||||
|
||||
> Создано 2026-09-26. Обновлено 2026-09-26 (сессия PR-подготовки, завершена).
|
||||
> Статус: **🟡 КОД ГОТОВ К PR — 6 коммитов, все гейты зелёные. Осталось одно решение: `tools/` в ветке.**
|
||||
> 🟢 **Сессия PR-подготовки завершена:** починены 2 дефекта **в коде** (идемпотентный
|
||||
> `MattermostSubject`; `ProgressPolicy.Typing`), написаны 6 файлов тестов (~90 тестов)
|
||||
> на транспорт + хендлер, обновлены README / `docs/balda.md` и создан `docs/mattermost.md`.
|
||||
> `golangci-lint` = 0 issues, `go-arch-lint` = OK.
|
||||
> 🔴 **Блокер PR:** в ветке 16 файлов `tools/` из базового коммита `004fda2f` — в апстриме
|
||||
> такого каталога нет. Нужно `git rm -r --cached tools/` по команде Alex (заблокировано
|
||||
> истёкшим апрувом). Детали, коммиты и варианты — [[personal/plans/balda-mm-pr-plan]].
|
||||
> Создано 2026-09-26. Обновлено 2026-09-26 (PR открыт).
|
||||
> Статус: **✅ PR ОТКРЫТ — baldaworks/balda#8, 8/8 CI PASS, MERGEABLE.**
|
||||
> 🟢 **PR:** https://github.com/baldaworks/balda/pull/8 — 41 файл, +5622/−18, 7 коммитов.
|
||||
> Фаза 2 закрыта полностью: код, 103 новых теста, доки, зелёный CI.
|
||||
> Блокер `tools/` снят: `/tools/` в `.gitignore` + `git rm -r --cached tools/`.
|
||||
> Детали — [[personal/plans/balda-mm-pr-plan]].
|
||||
> Часть проекта [[personal/projects/balda/balda-mm-delegation-plan]] (Фаза 2).
|
||||
> Требование Alex: поддержка **всех** функций Балды, по новым API, production-качество.
|
||||
>
|
||||
> **Проверено (2026-09-26, финал):**
|
||||
> - `go build ./...` → exit 0, `go vet ./...` → exit 0
|
||||
> **Проверено (2026-09-26, PR):**
|
||||
> - `go build ./...` → exit 0 · `go vet ./...` → exit 0
|
||||
> - `go tool golangci-lint run` → **0 issues**
|
||||
> - `go tool go-arch-lint check --project-path .` → **OK - No warnings found**
|
||||
> - **DI-граф собирается целиком** с `balda.mattermost.enabled=true` — проверено реальным
|
||||
> - **DI-граф собирается целиком** с `balda.mattermost.enabled=true` — проверено
|
||||
> `validateBaldaApplication(prepared)` через fx, а не только компиляцией
|
||||
> - 3 новых теста зелёные (см. §«Тесты»)
|
||||
> - Закоммичено: `004fda2f feat(mattermost): add Mattermost transport adapter` (40 файлов, +3072)
|
||||
> - **103 новых теста** зелёные, включая `-race`; в CI — 126 PASS, 0 FAIL, 0 SKIP
|
||||
> - **CI: 8/8 джобов PASS** на чистом раннере (`.github/workflows`)
|
||||
>
|
||||
> **Осталось:** ничего по коду. Дальше — Фаза 3 (Балда с MM на Kraken) и Фаза 4 (исполнитель).
|
||||
>
|
||||
> 🔴 **ОБНОВЛЕНО 2026-09-26 (ночь, позже): «все quality gates пройдены» оказалось неполным.**
|
||||
> При первом **живом запуске** на Kraken (Фаза 3) Балда ушла в crash-loop:
|
||||
> 🔴 **Исторический урок (Фаза 3):** «все quality gates пройдены» оказалось неполным —
|
||||
> при первом **живом запуске** на Kraken Балда ушла в crash-loop:
|
||||
> `advertised commands have no actor handler: goal`. В `Advertisement.Names` была объявлена
|
||||
> несуществующая команда `goal` (это payload kind, а не имя хендлера; цикл называется
|
||||
> `goalkeeper`). **Ни `go build`, ни `go vet`, ни `golangci-lint`, ни `go-arch-lint`, ни
|
||||
@@ -32,13 +27,23 @@
|
||||
> `inbound.go` дельтой `tools/deltas-goal-command-fix.json`. Разбор —
|
||||
> [[personal/tech/balda-go-fx-pitfalls]] §«Дефект 4».
|
||||
> 📌 Вывод: «Фаза 2 закрыта» означала «код компилируется и граф собирается», но **не**
|
||||
> «транспорт работает». Живой запуск обязателен. Текущий статус Фазы 3 —
|
||||
> «транспорт работает». Живой запуск обязателен. Статус Фазы 3 —
|
||||
> [[personal/projects/balda/balda-kraken-mm-deploy]].
|
||||
>
|
||||
## ✅ PR-ПРОХОД 2026-09-26 — транспорт приведён к PR-качеству
|
||||
|
||||
Ветка `feat/mattermost-channel`, **6 коммитов**, готово к `git push` и PR.
|
||||
Подробности — [[personal/plans/balda-mm-pr-plan]].
|
||||
Ветка `feat/mattermost-channel`, **7 коммитов**, PR **открыт** — baldaworks/balda#8.
|
||||
Подробности и полный список — [[personal/plans/balda-mm-pr-plan]].
|
||||
|
||||
```
|
||||
9f1e6c9c chore: ignore local project-editing tooling ← уборка tools/ из PR
|
||||
58f27120 docs(mattermost): document the transport setup and behavior
|
||||
80d4f41d test(mattermost): cover the transport, the ingress and the handler
|
||||
c7f18654 fix(mattermost): send a monotonic seq on every client frame
|
||||
6dc3077a feat(mattermost): add the inbound handler and wire it into DI
|
||||
fa1a2855 feat(auth): support the Mattermost channel subject
|
||||
004fda2f feat(mattermost): add Mattermost transport adapter ← база прошлой сессии
|
||||
```
|
||||
|
||||
**Исправлено в коде (не в данных):**
|
||||
|
||||
@@ -47,12 +52,13 @@
|
||||
| 🔴 Двойной префикс `principal` — прошлый фикс был в БД и вернулся | `auth.MattermostSubject()` теперь **идемпотентен** (срезает `mattermost:` перед повторной квалификацией); из `handler.go` убран `TrimPrefix`-костыль |
|
||||
| `ProgressPolicy.Typing: true` в command-пути | Приведено к `false` — у ботов MM нет typing API, `SendTyping` осознанный no-op |
|
||||
|
||||
**Тесты — 6 новых файлов, ~90 тестов:** `locator_codec_test.go`, `inbound_test.go`,
|
||||
`adapter_test.go`, `client_test.go`, `ingress_test.go` (в пакете транспорта) +
|
||||
`handlersfx/mattermost_ingress_test.go`. Ключевые регрессионные guard'ы:
|
||||
**Тесты — 6 новых файлов, 103 теста:** `locator_codec_test.go` (15), `inbound_test.go` (18),
|
||||
`adapter_test.go` (17), `client_test.go` (13), `ingress_test.go` (23) +
|
||||
`handlersfx/mattermost_ingress_test.go` (17). Ключевые регрессионные guard'ы:
|
||||
`writeEvent` всегда с `seq` и уникальный `seq` под 16 горутинами (`bad_seq`),
|
||||
plain-fallback только на content-rejection (не на 5xx), идемпотентность subject'а,
|
||||
тред = одна сессия ≠ канальной, `/start` доступен до авторизации.
|
||||
Пакеты `mattermost` + `handlersfx` в verbose-прогоне: **126 PASS, 0 FAIL, 0 SKIP**.
|
||||
|
||||
**Доки:** README + `docs/balda.md` + новый **`docs/mattermost.md`** (создание бота,
|
||||
минтинг токена, membership, 5 ключей, поведение, troubleshooting).
|
||||
@@ -65,11 +71,13 @@ go tool golangci-lint run → 0 issues
|
||||
go tool go-arch-lint check --project-path . → OK - No warnings found
|
||||
go test -race (затронутые пакеты) → все ok
|
||||
```
|
||||
⚠️ 5 пакетов падают (`cmd/balda`, `apps/balda`, `mcpruntime`, `session`, `state`) —
|
||||
⚠️ 5 пакетов падают локально (`cmd/balda`, `apps/balda`, `mcpruntime`, `session`, `state`) —
|
||||
**это апстримная база**, проверено `git stash` (те же 4 теста падают без правок).
|
||||
🔴 **В CI эти же тесты ПРОШЛИ** — локальное падение было особенностью машины, не дефектом.
|
||||
|
||||
⚠️ `tools/mm-*.sh` + `tools/deltas-*.json` оставлены **незакоммиченными** — локальный
|
||||
инструментарий, в PR не идёт.
|
||||
**`tools/` вычищен из ветки:** `/tools/` в `.gitignore` + `git rm -r --cached tools/`
|
||||
(коммит `9f1e6c9c`). Файлы на диске целы (39 шт.), в PR-diff их нет.
|
||||
⚠️ `gitignore` **не отвязывает** уже отслеживаемые файлы — нужны оба шага.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# Balda 2.0 — Mattermost + распределённое делегирование (план)
|
||||
|
||||
> Создан 2026-09-25. Статус: **Фазы 1-3 закрыты 2026-09-26** (MM на Kraken · MM-адаптер
|
||||
> в коде · оркестратор развёрнут, **бот отвечает в MM**). Следующая — Фаза 4 (исполнитель).
|
||||
> в коде · оркестратор развёрнут, **бот отвечает в MM**). Фаза 2 выведена на **PR
|
||||
> `baldaworks/balda#8`** — 8/8 CI PASS, ждёт ревью. Следующая — Фаза 4 (исполнитель).
|
||||
> Alex дал команду исполнять без вопросов.
|
||||
> Задача: поднять свежую Балду из `baldaworks/balda` (без наших коммитов), завязать на Mattermost,
|
||||
> построить распределённое делегирование (дешёвый оркестратор + подписочные CLI в VM).
|
||||
@@ -203,8 +204,9 @@ Mattermost (Alex) — итог + артефакты
|
||||
туннель `{"status":"OK"}`. ⏳ Осталась приёмка входом в браузере (делает Alex).
|
||||
→ [[personal/projects/balda/mattermost-kraken-deploy]]
|
||||
|
||||
### Фаза 2 — адаптер Mattermost в Балде — ✅ ЗАКРЫТА (все quality gates пройдены)
|
||||
### Фаза 2 — адаптер Mattermost в Балде — ✅ PR ОТКРЫТ: baldaworks/balda#8
|
||||
Детальный док: [[personal/projects/balda/balda-mattermost-connector]].
|
||||
PR-план и команды: [[personal/plans/balda-mm-pr-plan]].
|
||||
|
||||
1. ✅ Ветка **`feat/mattermost-channel`** от чистого `upstream/main` (`de273d8f`).
|
||||
2. ✅ Изучен `channel/zulip/*` целиком как образец.
|
||||
@@ -221,12 +223,26 @@ Mattermost (Alex) — итог + артефакты
|
||||
8. ✅ **DI-граф проверен реальным `validateBaldaApplication`** с `mattermost.enabled=true` —
|
||||
найдены и починены 3 дефекта (`fx.In` + `fx.ParamTags`, отсутствующие провайдеры строк,
|
||||
отсутствующий импорт).
|
||||
9. ✅ 3 новых теста зелёные (env-override + fx-граф + маршрут `TestBuiltinRoutes`).
|
||||
10. ✅ **`golangci-lint` = 0 issues, `go-arch-lint` = OK**, `go build`/`go vet` = exit 0.
|
||||
11. ✅ **Закоммичено:** `004fda2f feat(mattermost): add Mattermost transport adapter` (40 файлов, +3072).
|
||||
9. ✅ **`golangci-lint` = 0 issues, `go-arch-lint` = OK**, `go build`/`go vet` = exit 0.
|
||||
10. ✅ **Закоммичено:** `004fda2f feat(mattermost): add Mattermost transport adapter` (40 файлов, +3072).
|
||||
11. ✅ **PR-проход (2026-09-26):** починены 2 дефекта в коде (идемпотентный
|
||||
`MattermostSubject` — из-за него бот не отвечал владельцу; `ProgressPolicy.Typing`),
|
||||
написаны **103 новых теста** в 6 файлах, доки README/`docs/balda.md`/`docs/mattermost.md`.
|
||||
12. ✅ **`tools/` вычищен из ветки** — `/tools/` в `.gitignore` + `git rm -r --cached tools/`
|
||||
(коммит `9f1e6c9c`); файлы на диске целы, в PR-diff их нет.
|
||||
13. ✅ **PR ОТКРЫТ: `baldaworks/balda#8`**, 41 файл, +5622/−18, 7 коммитов.
|
||||
14. ✅ **CI: 8/8 PASS** на чистом раннере (architecture-lint, lint, test, ingress-e2e,
|
||||
jetstream-integration, postgres-integration, sqlite-integration, projection-replay).
|
||||
|
||||
**Фаза 2 закрыта на уровне кода.** Все quality gates из `AGENTS.md` пройдены.
|
||||
Дальше — Фаза 3 (развернуть Балду с MM-адаптером на Kraken) и Фаза 4 (исполнитель в Docker на Mac).
|
||||
**Фаза 2 закрыта на уровне кода и PR.** Осталось: **ревью апстрима + merge**.
|
||||
|
||||
📌 **Целевой репозиторий — `baldaworks/balda`.** `origin` = `mallexxx/balda` (форк, родитель
|
||||
baldaworks), `upstream` = `normahq/balda` = **редирект** на baldaworks (тот же org id).
|
||||
PR: `gh pr create --repo baldaworks/balda --base main --head mallexxx:feat/mattermost-channel`.
|
||||
|
||||
🔴 **Урок PR-прохода:** локальные гейты — необходимое, но **не достаточное** условие. Локально
|
||||
`cmd/balda` падал на `TestInitCommand_...GeneratesDetectedAgents`, **в CI тот же тест прошёл** —
|
||||
падение было особенностью машины. В репо есть CI (8 джобов) — **дожидаться его** перед «готово».
|
||||
|
||||
#### Дефекты, найденные на этапе закрытия (важно для будущих транспортов)
|
||||
|
||||
@@ -238,11 +254,14 @@ Mattermost (Alex) — итог + артефакты
|
||||
| 4 | `TestBuiltinRoutes` ждал 4 маршрута | `len(BuiltinRoutes()) = 5, want 4` | добавить маршрут Mattermost в `want` |
|
||||
| 5 | Мёртвый typing-throttle (`shouldSendTyping`, поля, mutex, `SetTypingThrottleInterval`) | `unused` ×2, затем каскад `undefined` | удалён целиком — `SendTyping` всегда no-op |
|
||||
| 6 | Обёртка `func(client, logger) *Adapter` без тела | `unlambda` (gocritic) | заменена на `mattermost.NewAdapter` |
|
||||
| 7 | 🔴 **Двойной префикс `principal`** (`mattermost:mattermost:<id>`) | каждый пост владельца → `settlement_stage=unauthorized`, бот молчит | `MattermostSubject()` сделана **идемпотентной** (срезает префикс) — дефект был «починен» в БД и вернулся |
|
||||
| 8 | `ProgressPolicy.Typing: true` в command-пути, `false` в inbound | мёртвая ветка + warn-шум | приведено к `false` — у ботов MM нет typing API |
|
||||
|
||||
⚠️ **Метод проверки, который окупился:** `go build` ловит только компиляцию. **Реальный DI-граф
|
||||
валидируется только `validateBaldaApplication` через fx** — именно этот тест нашёл дефекты 1-2,
|
||||
которых `build`/`vet` не видят. Для любого нового транспорта писать такой тест сразу.
|
||||
|
||||
🔴 **Дефект из данных — чинить в коде, а не в БД:** дефект 7 «починили» UPDATE'ом и он вернулся
|
||||
при следующей записи.
|
||||
|
||||
🔴 **Урок Фазы 2:** `go build` = exit 0 **не значит** «транспорт рабочий». fx-несовместимости
|
||||
и отсутствующие провайдеры видны только при `fx.ValidateApp`/`validateBaldaApplication`.
|
||||
|
||||
Reference in new issue
Block a user