From bbdc3c3785e46a2e20d778562a88dc80c466d483 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Mon, 28 Sep 2026 14:07:37 +0600 Subject: [PATCH] [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 --- personal/plans/balda-mm-pr-plan.md | 23 +++--- personal/plans/balda-mm-pr8-review-fixes.md | 71 ++++++++++++++++--- .../balda/balda-mattermost-connector.md | 10 ++- personal/tech/balda-go-fx-pitfalls.md | 9 +++ 4 files changed, 92 insertions(+), 21 deletions(-) diff --git a/personal/plans/balda-mm-pr-plan.md b/personal/plans/balda-mm-pr-plan.md index a3c0dd27..7b5a2e1e 100755 --- a/personal/plans/balda-mm-pr-plan.md +++ b/personal/plans/balda-mm-pr-plan.md @@ -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'а: diff --git a/personal/plans/balda-mm-pr8-review-fixes.md b/personal/plans/balda-mm-pr8-review-fixes.md index 4efc154b..424539ee 100755 --- a/personal/plans/balda-mm-pr8-review-fixes.md +++ b/personal/plans/balda-mm-pr8-review-fixes.md @@ -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). Без второго команды не работают. --- diff --git a/personal/projects/balda/balda-mattermost-connector.md b/personal/projects/balda/balda-mattermost-connector.md index 3a8f566f..29962aed 100755 --- a/personal/projects/balda/balda-mattermost-connector.md +++ b/personal/projects/balda/balda-mattermost-connector.md @@ -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-качество. > diff --git a/personal/tech/balda-go-fx-pitfalls.md b/personal/tech/balda-go-fx-pitfalls.md index 96094c48..e6f74499 100755 --- a/personal/tech/balda-go-fx-pitfalls.md +++ b/personal/tech/balda-go-fx-pitfalls.md @@ -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: | grep` — истина для PR. +> Плюс: имена типов/префиксов сверять с `locator_codec.go`, а не выдумывать (декодер с +> `"direct"` вместо `"dm"` молча ломает транспорт). > Источник: работа над Mattermost-адаптером Балды (Фаза 2) + деплой на Kraken (Фаза 3). > Проектные доки: [[personal/projects/balda/balda-mattermost-connector]], > [[personal/projects/balda/balda-kraken-mm-deploy]],