[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:
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: код закрыт (исторический раздел ниже)
|
||||
|
||||
> Разделы ниже — сначала контракт/разведка, затем **фактически написанные файлы**. Ищи
|
||||
> §«Что фактически написано» для реестра файлов.
|
||||
>
|
||||
|
||||
@@ -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, где всё это найдено
|
||||
|
||||
Reference in new issue
Block a user