[2026-09-28] eagle: personal/plans/balda-mm-pr-plan.md personal/plans/balda-mm-pr8-review-fixes.md personal/projects/balda/balda-mattermost-connector.md personal/tech/balda-go-fx-pitfalls.md
This commit is contained in:
1 parent
e8addc7298
commit
bbdc3c3785
4 files changed
+92
-21
No files matched your search
@@ -3,10 +3,12 @@
|
||||
> Обновлён 2026-09-28. Обновлён 2026-09-28 (ревизия: убраны дубли, оставлены факты).
|
||||
> Статус: **PR ОТКРЫТ — baldaworks/balda#8 · OPEN · MERGEABLE · 8/8 CI PASS · ревью апстрима НЕТ.**
|
||||
> https://github.com/baldaworks/balda/pull/8
|
||||
> 🔧 **2026-09-28: правки по ревью Alex применены — коммит `cd4ce4bc`, CI 8/8 PASS.**
|
||||
> Закрыты: slash-команды (HTTP-приёмник), `/locator` (`locatorref`), групповой DM (сессия
|
||||
> по чату) + **регистрация в `ScopeResolver`, которой не было в PR**. Разбор —
|
||||
> [[personal/plans/balda-mm-pr8-review-fixes]].
|
||||
> 🔧 **2026-09-28: правки по ревью применены — голова `05342c5a` (9 коммитов), CI 8/8 PASS.**
|
||||
> Ревью `metalagman` опубликовано в PR (`reviews`, state `COMMENTED`, inline-комментов **0**).
|
||||
> Закрыты: slash-команды (HTTP-приёмник + setup в доке), `/locator` (`locatorref` +
|
||||
> guard-тест), групповой DM (сессия по чату + тест двух отправителей) + **регистрация в
|
||||
> `ScopeResolver`, которой не было в PR**. Сверка построчно —
|
||||
> [[personal/plans/balda-mm-pr8-review-fixes]] §0a.
|
||||
> Часть [[personal/projects/balda/balda-mm-delegation-plan]] (Фаза 2 → PR в апстрим).
|
||||
|
||||
---
|
||||
@@ -18,8 +20,8 @@
|
||||
| PR | **baldaworks/balda#8** — `feat(mattermost): add Mattermost channel transport` |
|
||||
| Состояние | `OPEN` · `MERGEABLE` · `reviewDecision` **пустой** |
|
||||
| База / голова | `baldaworks/balda:main` ← `mallexxx:feat/mattermost-channel` |
|
||||
| Объём | **46 файлов, +6760 / −27**, 8 коммитов |
|
||||
| CI | **8/8 PASS** (на `cd4ce4bc`) |
|
||||
| Объём | **46 файлов, +6850 / −27**, 9 коммитов |
|
||||
| CI | **8/8 PASS** (на `05342c5a`) |
|
||||
|
||||
```
|
||||
architecture-lint pass 2m2s
|
||||
@@ -32,11 +34,12 @@ sqlite-integration pass 1m15s
|
||||
test pass 6m0s ← главный: полный go test на чистом раннере
|
||||
```
|
||||
|
||||
**Ничего не изменилось с 26.09** — новых проверок нет, ревью апстрима не состоялось.
|
||||
**Ревью состоялось 2026-09-28** (`metalagman`, state `COMMENTED`) — правки применены, голова
|
||||
`05342c5a`, CI 8/8 на новом коммите. См. §0a [[personal/plans/balda-mm-pr8-review-fixes]].
|
||||
|
||||
🔴 **Блокер: `reviewDecision` пустой = PR никто не смотрел.** Мержа не будет, пока внешний
|
||||
ревьюер не заглянет. Наш ход тут — только периодически перепроверять
|
||||
`gh pr view 8 --repo baldaworks/balda --json reviewDecision`.
|
||||
🔴 **Блокер: `reviewDecision` пустой = ревью было COMMENTED, а не APPROVED.** Мержа не будет,
|
||||
пока ревьюер не сменит состояние на approval. Наш ход — после правок дождаться ре-ревью;
|
||||
периодически перепроверять `gh pr view 8 --repo baldaworks/balda --json reviewDecision,reviews`.
|
||||
|
||||
🔴 **Целевой репозиторий — `baldaworks/balda`, НЕ `normahq/balda`.** Проверено через API,
|
||||
не по названию remote'а:
|
||||
|
||||
@@ -1,16 +1,37 @@
|
||||
# Balda — PR #8 review fixes: slash commands, /locator, group DM session
|
||||
|
||||
> Создан 2026-09-28. Статус: **✅ РЕАЛИЗОВАНО, ЗАПУШЕНО, CI 8/8 PASS.**
|
||||
> Коммит **`cd4ce4bc`** в `feat/mattermost-channel` → PR **baldaworks/balda#8** обновлён.
|
||||
> 46 файлов, +6760/−27, база `0 позади / 8 впереди`. MERGEABLE.
|
||||
> **CI 8/8 PASS:** architecture-lint 2m12s · ingress-e2e 33s · jetstream-integration 1m1s ·
|
||||
> lint 2m45s · postgres-integration 1m7s · projection-replay 24s · sqlite-integration 1m21s ·
|
||||
> test 4m6s.
|
||||
> Источник: ревью Alex на PR #8 + **четвёртый дефект, найденный мной** (§5).
|
||||
> Голова PR: **`05342c5a`** (9 коммитов). Основная правка — `cd4ce4bc`, тесты — `05342c5a`.
|
||||
> PR **baldaworks/balda#8**: 46 файлов, +6850/−27, MERGEABLE.
|
||||
> **CI 8/8 PASS:** architecture-lint · ingress-e2e · jetstream-integration · lint ·
|
||||
> postgres-integration · projection-replay · sqlite-integration · test.
|
||||
> Источник: ревью **`metalagman`** (опубликовано в PR 2026-09-28T06:02:48Z, state COMMENTED,
|
||||
> **inline-комментариев 0** — всё в теле ревью) + **четвёртый дефект, найденный мной** (§5).
|
||||
> Часть [[personal/plans/balda-mm-pr-plan]] (PR #8).
|
||||
|
||||
---
|
||||
|
||||
## 0a. Сверка с текстом ревью — построчно
|
||||
|
||||
Ревью `metalagman` **опубликовано в PR** (не «оставлено локально»). Inline-комментариев нет:
|
||||
`gh api repos/baldaworks/balda/pulls/8/comments` → `length: 0`. Три пункта в теле ревью:
|
||||
|
||||
| # | Дословное требование ревью | Статус |
|
||||
|---|---|---|
|
||||
| 1 | «Please add a supported command ingress (and its setup), or change the user-facing invocation to one that arrives as a normal post» | ✅ HTTP-приёмник + раздел «Slash command setup» в `docs/mattermost.md` |
|
||||
| 1b | «needs a real Mattermost integration check because the current command test injects a synthetic `posted` frame» | ✅ тесты идут через `httptest.NewRequest` (реальный HTTP), `processPosted`/`PostedData` — **0 вхождений** |
|
||||
| 2 | «Please add transport-neutral Mattermost parsing **and a round-trip test**» | ✅ `locatorref` + `TestMattermostLocatorSatisfiesCommandGuard` — воспроизводит **точный** guard handler'а: `Parse(Format(l))` и `Format(parsed) == ref` |
|
||||
| 3 | «give group DMs a stable channel-based session identity **and cover posts from two senders in one group channel**» | ✅ `TestGroupChannelPostsFromTwoSendersShareOneSession` + 2 теста изоляции сессий |
|
||||
|
||||
📌 **Важно:** требование 3 изначально закрыто **не было**. Существовавший
|
||||
`TestLocatorForPostUsesDirectLocatorForDMAndGroupChannels` брал **одного** `user-1` для `D` и
|
||||
`G` и не проверял двух отправителей — то есть именно тот случай, о котором писал ревьюер.
|
||||
Добавлены 3 теста в `inbound_test.go` + 1 в `locatorref/mattermost_test.go`.
|
||||
📌 Требование 2: тест был, но проверял `Parse → Format`, а handler требует
|
||||
`Parse(Format(l))` + `Format(parsed) == ref` — другой порядок. Добавлен точный.
|
||||
|
||||
---
|
||||
|
||||
## 0. Итог
|
||||
|
||||
Ревью Alex подтверждено в коде — все три пункта. Плюс найден **четвёртый дефект**,
|
||||
@@ -223,13 +244,47 @@ warn … "no session-memory classifier is registered for \"mattermost\""
|
||||
|
||||
| # | Шаг | Статус |
|
||||
|---|---|---|
|
||||
| 1 | CI на `cd4ce4bc` (8 джобов) | ✅ **8/8 PASS** |
|
||||
| 2 | Внешнее ревью PR #8 (`reviewDecision` пустой) | ⛔ внешний блокер |
|
||||
| 1 | CI на `05342c5a` (8 джобов) | ✅ **8/8 PASS** |
|
||||
| 2 | **Ре-ревью PR #8** — `reviewDecision` пустой, ревью было `COMMENTED` ≠ APPROVED | ⛔ внешний блокер |
|
||||
| 3 | Живая приёмка slash на Kraken (публичный HTTPS для Request URL!) | ⏳ следующий шаг |
|
||||
| 4 | Фаза 4 — исполнитель (делегирование) | 🎯 основной фронт |
|
||||
|
||||
⚠️ **Б1 требует публичного HTTPS** для Request URL slash-команды. Стенд Kraken —
|
||||
проверить достижимость эндпоинта **до** приёмки; иначе нужен туннель.
|
||||
⚠️ **Команды PR (воспроизводимо):**
|
||||
```bash
|
||||
gh pr checks 8 --repo baldaworks/balda
|
||||
gh api repos/baldaworks/balda/pulls/8/reviews | jq -r '.[] | "\(.user.login) \(.state)"'
|
||||
gh api repos/baldaworks/balda/pulls/8/comments | jq 'length' # inline-комменты; 0 = всё в теле ревью
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. Конфиг — точные значения (для Фазы 3/приёмки)
|
||||
|
||||
`cmd/balda/balda.yaml`, блок `balda.mattermost` (все 4 ключа **обязаны** быть в файле,
|
||||
иначе env молча игнорируется):
|
||||
```yaml
|
||||
balda:
|
||||
mattermost:
|
||||
enabled: true
|
||||
server_url: "http://mattermost:8065"
|
||||
token: "${BALDA_MATTERMOST_TOKEN}"
|
||||
bot_user_id: "${BALDA_MATTERMOST_BOT_USER_ID}"
|
||||
bot_username: "balda"
|
||||
commands_enabled: true # ← HTTP-приёмник slash, НЕЗАВИСИМ от enabled
|
||||
commands_listen_addr: ":8093"
|
||||
commands_path: "/mattermost/commands"
|
||||
commands_token: "${BALDA_MATTERMOST_COMMANDS_TOKEN}"
|
||||
```
|
||||
Env-имена (проверено, `appconfig/loader.go` `SetEnvPrefix("BALDA")` + `"." → "_"`):
|
||||
```
|
||||
BALDA_MATTERMOST_COMMANDS_ENABLED / _LISTEN_ADDR / _PATH / _TOKEN
|
||||
```
|
||||
DI-провайдеры в `internal/apps/balda/app.go` (`name:`-теги, иначе fx `missing types`):
|
||||
`balda_mattermost_commands_{enabled,listen_addr,path,token}`.
|
||||
⚠️ `commands_enabled` и `enabled` — **разные переключатели**: `enabled` = websocket-поток
|
||||
(разговоры), `commands_enabled` = HTTP-приёмник (slash). Без второго команды не работают.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
# Balda — Mattermost коннектор (архитектура)
|
||||
|
||||
> Создано 2026-09-26. Обновлено 2026-09-26 (PR открыт).
|
||||
> Создано 2026-09-26. Обновлено 2026-09-28 (правки по ревью применены).
|
||||
> Статус: **✅ PR ОТКРЫТ — baldaworks/balda#8, 8/8 CI PASS, MERGEABLE.**
|
||||
> 🟢 **PR:** https://github.com/baldaworks/balda/pull/8 — 41 файл, +5622/−18, 7 коммитов.
|
||||
> Фаза 2 закрыта полностью: код, 103 новых теста, доки, зелёный CI.
|
||||
> 🟢 **PR:** https://github.com/baldaworks/balda/pull/8 — 46 файлов, +6850/−27, 9 коммитов.
|
||||
> Фаза 2 закрыта полностью: код, 103+ новых теста, доки, зелёный CI.
|
||||
> Блокер `tools/` снят: `/tools/` в `.gitignore` + `git rm -r --cached tools/`.
|
||||
> Детали — [[personal/plans/balda-mm-pr-plan]].
|
||||
> 🔧 **2026-09-28 — правки по ревью `metalagman`:** голова `05342c5a`, CI 8/8 PASS.
|
||||
> Закрыты slash-команды (новый HTTP-приёмник `command_server.go`), `/locator`
|
||||
> (`locatorref` + guard-тест), групповой DM (сессия по чату), и **`ScopeResolver`-регистрация,
|
||||
> которой не было в PR**. Разбор — [[personal/plans/balda-mm-pr8-review-fixes]].
|
||||
> Часть проекта [[personal/projects/balda/balda-mm-delegation-plan]] (Фаза 2).
|
||||
> Требование Alex: поддержка **всех** функций Балды, по новым API, production-качество.
|
||||
>
|
||||
|
||||
@@ -41,6 +41,15 @@
|
||||
> §«Два линтера спорят на одной строке теста» — `staticcheck ST1023` vs `unconvert`;
|
||||
> решение «убрать конструкцию, а не выбирать сторону» + побочный неиспользуемый импорт.
|
||||
> Там же проверенные гейты перед PR в `runtime` и питфолл таймаута `go test -race ./...` (>600 с).
|
||||
> 🔴🔴🔴 **Добавлено 2026-09-28 (правки по ревью PR #8) — четыре новых раздела:**
|
||||
> §«Новый транспорт = ЗЕРКАЛО Slack» — правило Alex, 5 расхождений без причины, таблица
|
||||
> «что брать по Slack» + ровно 2 допустимых отличия (верификация, форма ответа);
|
||||
> §«Slash-команды Mattermost: только HTTP» — WS их не видит, разделять «команда есть» и
|
||||
> «до неё есть вход»; §«Групповой DM (`G`): сессия по ЧАТУ» — каскад из 8 мест, отдельный
|
||||
> префикс `g:`; §«Регистрация в `ScopeResolver` — проверять в COMMIT, а не в рабочем дереве» —
|
||||
> `grep` по файлу врёт, `git show HEAD:<file> | grep` — истина для PR.
|
||||
> Плюс: имена типов/префиксов сверять с `locator_codec.go`, а не выдумывать (декодер с
|
||||
> `"direct"` вместо `"dm"` молча ломает транспорт).
|
||||
> Источник: работа над Mattermost-адаптером Балды (Фаза 2) + деплой на Kraken (Фаза 3).
|
||||
> Проектные доки: [[personal/projects/balda/balda-mattermost-connector]],
|
||||
> [[personal/projects/balda/balda-kraken-mm-deploy]],
|
||||
|
||||
Reference in new issue
Block a user