[2026-09-26] eagle: personal/plans/music-tags-review/1-needs-decision.md personal/plans/music-tags-review/2-medium-confidence.md personal/plans/music-tags-review/3-high-confidence.md personal/plans/music-tags-review/music-tags-review.md personal/projects/balda/balda-mattermost-connector.md personal/tech/balda-go-fx-pitfalls.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-26 14:32:09 +06:00
1 parent 519f7c443c
commit 14e9f5703f
6 files changed
+25992

No files matched your search

@@ -0,0 +1,88 @@
---
title: Music Tags — Требует решения
type: task
namespace: personal
tags: [music, jellyfin, tags, review, truenas]
status: awaiting-approval
block: cannot
---
# Требует решения
**Файлов:** 9 · **Папок:** 5
> [!info] Исполнителя неоткуда взять — теги уничтожены, в путях его нет.
[[music-tags-review|← к обзору]]
## Оглавление
- `!A Not sorted` — 1 → [[#A-Not-sorted|перейти]]
- `!Pop, Club, Любэ` — 1 → [[#Pop-Club-Любэ|перейти]]
- `!Retro` — 5 → [[#Retro|перейти]]
- `!Детские` — 1 → [[#Детские|перейти]]
- `!Классика` — 1 → [[#Классика|перейти]]
## !A Not sorted
`!A Not sorted` — 1 файлов
> - [ ] **НАШЕСТВИЕ 2009 - ДЕНЬ ВТОРОЙ.mp3**
> - `title`: — → **НАШЕСТВИЕ 2009 - ДЕНЬ ВТОРОЙ**
> - _title<-filename_
## !Pop, Club, Любэ
`!Pop, Club, Любэ` — 1 файлов
> - [ ] **detskiy_hor_benassi_satisfaction.mp3**
> - `title`: ⟨повреждено⟩ → **detskiy hor benassi satisfaction**
> - `artist`: ⟨повреждено⟩ → **—**
> - `album`: ⟨повреждено⟩ → **—**
> - _title<-filename_
## !Retro
`!Retro` — 5 файлов
> - [ ] **Казанова.mp3**
> - `title`: ⟨повреждено⟩ → **Казанова**
> - `artist`: ⟨повреждено⟩ → **—**
> - _title<-filename_
> - [ ] **Кольщик.mp3**
> - `title`: ⟨повреждено⟩ → **Кольщик**
> - `artist`: ⟨повреждено⟩ → **—**
> - `album`: ⟨повреждено⟩ → **—**
> - _title<-filename_
> - [ ] **Младший лейтенант.mp3**
> - `title`: ⟨повреждено⟩ → **Младший лейтенант**
> - `artist`: ⟨повреждено⟩ → **—**
> - _title<-filename_
> - [ ] **Остаёмся зимовать.MP3**
> - `title`: ⟨повреждено⟩ → **Остаёмся зимовать**
> - `artist`: ⟨повреждено⟩ → **—**
> - `album`: ⟨повреждено⟩ → **—**
> - _title<-filename_
> - [ ] **Пропаганда-Супер детка.mp3**
> - `title`: ⟨повреждено⟩ → **Пропаганда-Супер детка**
> - `artist`: ⟨повреждено⟩ → **—**
> - _title<-filename_
## !Детские
`!Детские` — 1 файлов
> - [ ] **Из чего же.mp3**
> - `title`: Èç ÷åãî æå, èç ÷åãî æå, èç ÷åãî æå → **Из чего же, из чего же, из чего же**
> - `artist`: Íåèçâåñòíûé èñïîëíèòåëü → **—**
> - `album`: Íåèçâåñòíîå íàçâàíèå → **—**
> - _кодировка CP1251→UTF-8_
## !Классика
`!Классика` — 1 файлов
> - [ ] **Пахмутова — Нежность.mp3**
> - `title`: ⟨повреждено⟩ → **Пахмутова — Нежность**
> - `artist`: ⟨повреждено⟩ → **—**
> - _title<-filename_
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,20 @@
---
title: Music Tags — Review
type: task
namespace: personal
tags: [music, jellyfin, tags, review, truenas]
status: awaiting-approval
---
# Music Tags — проверка тегов
**К правке:** 4961 файлов · **без изменений:** 2945
> [!warning] Ничего не изменено
> Это план. Ставь галочки, что одобряешь. После «go» — бэкап в `Music/backup/` и применение.
| Блок | Файлов |
|---|---:|
| [[1-needs-decision\|Требует решения]] | 9 |
| [[2-medium-confidence\|Средняя уверенность]] | 2611 |
| [[3-high-confidence\|Высокая уверенность]] | 2341 |
@@ -31,6 +31,46 @@
> «транспорт работает». Живой запуск обязателен. Текущий статус Фазы 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]].
**Исправлено в коде (не в данных):**
| Дефект | Фикс |
|---|---|
| 🔴 Двойной префикс `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'ы:
`writeEvent` всегда с `seq` и уникальный `seq` под 16 горутинами (`bad_seq`),
plain-fallback только на content-rejection (не на 5xx), идемпотентность subject'а,
тред = одна сессия ≠ канальной, `/start` доступен до авторизации.
**Доки:** README + `docs/balda.md` + новый **`docs/mattermost.md`** (создание бота,
минтинг токена, membership, 5 ключей, поведение, troubleshooting).
**Все гейты зелёные на закоммиченном дереве:**
```
go build ./... → 0
go vet ./... → 0
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`) —
**это апстримная база**, проверено `git stash` (те же 4 теста падают без правок).
⚠️ `tools/mm-*.sh` + `tools/deltas-*.json` оставлены **незакоммиченными** — локальный
инструментарий, в PR не идёт.
---
## Статус Фазы 2: код закрыт (исторический раздел ниже)
> Разделы ниже — сначала контракт/разведка, затем **фактически написанные файлы**. Ищи
> §«Что фактически написано» для реестра файлов.
>
+41
View File
@@ -1119,6 +1119,47 @@ MM отвечал раз в 30 секунд, ровно на каждый пин
---
## 🔴 Тест-ассерт — это гипотеза, а не истина (PR-проход 2026-09-26)
Дважды за сессию падал **новый** тест, и оба раза неверным оказывался **ассерт**,
а не код. Соблазн «поправить код под тест» — прямой путь сломать работающее.
| Падающий тест | Моя гипотеза | Реальность |
|---|---|---|
| «тред и корневой пост дают одну сессию» | тред — часть канальной сессии | тред — **отдельная** сессия: корневой пост = `mm-c-a4aa02ef`, тред = `mm-t-89bbf64f`; при этом два **разных** ответа в треде дают ОДНУ сессию `mm-t-89bbf64f` — это и есть контракт |
| «`NewIngress` фолбэчит `botUserID` из клиента» | есть fallback | `onStart` **отказывается стартовать** без `bot_user_id` (guard в ingress.go) |
**Процедура при падении нового теста:**
1. Написать одноразовый пробник, печатающий **фактическое** поведение
(`t.Logf` всех вариантов), а не утверждающий желаемое.
2. Сверить с комментарием/доком функции — там часто уже написано, чему код
**обязан** соответствовать.
3. Только потом решать: ассерт или код.
⚠️ Пробник класть в пакет и **удалять** после (`rm mm_locator_probe_test.go`) —
иначе мусор в PR.
## 🔴 `goconst` / `dupword` в новых тестах
`golangci-lint` валит даже тестовые файлы. На MM-тестах поймано 4 замечания,
все — в моём новом коде:
| Линтер | Что | Фикс |
|---|---|---|
| `goconst` | `"channel-1"` — 15 вхождений, `"user-1"` — 3, `"dm-channel-1"` — 3 | константы `testTeamID`/`testChannelID`/`testDMChannelID`/`testUserID` в пакете |
| `dupword` | `"thread channel = %q, channel channel = %q"` — повтор слова `channel` | переформулировать: «thread and channel locators resolve to different channels» |
📌 Линтер **подсказывает** имя существующей константы:
`string 'channel-1' has 4 occurrences, but such constant 'testChannelID' already exists`.
Заводить константы сразу при написании тестов дешевле, чем добивать потом.
## 📌 Артефакты деплоя — вон из PR
`tools/mm-*.sh` (9 ops-скриптов) и `tools/deltas-*.json` (15 файлов дельта-групп)
— **локальный инструментарий**, в PR в апстрим не идут. Оставлять
незакоммиченными и явно перечислять в доке, чтобы не потерять.
В коммиты PR шли только: код транспорта, wiring, тесты, доки.
## Связанные заметки
- [[personal/projects/balda/balda-mattermost-connector]] — Фаза 2, где всё это найдено