[2026-09-28] eagle: personal/plans/balda-runtime-rebuild-mm-validation.md personal/plans/runtime-pr5-toolset-dedup-review-fixes.md personal/projects/balda/balda-kraken-mm-deploy.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-28 20:39:07 +06:00
1 parent 1480fa8d95
commit bf7787bcbd
3 files changed
+187 -28

No files matched your search

@@ -1,8 +1,40 @@
> Создан 2026-09-28. Статус: **✅ ВЛИТО В АПСТРИМ (2026-09-28T13:22:13Z).**
> Мой коммит: **`d4ab923`** (4 файла, +411/−1), ветка `fix/hosted-toolsets-duplicate-endpoint`.
> **PR normahq/runtime#5** — **MERGED** (merge-коммит `6775d71`).
> Ответ ревьюеру: https://github.com/normahq/runtime/pull/5#issuecomment-5867224210
> Репо: `~/Developer/runtime-local`. Связано: [[personal/plans/runtime-pr4-openai-toolcalls-fixes]].
> Создан 2026-09-28. Статус: **✅ MERGED В АПСТРИМ 2026-09-28T13:22:13Z (head `facb0d0`).**
> Финальная голова PR: **`facb0d0`**. Мейнтейнер добавил **3 фикса поверх** моего `d4ab923` —
> см. §0г. Образ Балды переведён на тег **`v2.1.0`** (= `c41939f`, содержит PR #4 + #5).
> **PR normahq/runtime#5** — MERGED. Репо: `~/Developer/runtime-local`.
> Связано: [[personal/plans/runtime-pr4-openai-toolcalls-fixes]],
> [[personal/plans/balda-runtime-rebuild-mm-validation]].
---
## 0г. 🔴 Мейнтейнер нашёл 2 реальных дефекта в моём фиксе (`d4ab923` → `facb0d0`)
Перед мержем в ветку PR #5 добавлены 3 коммита:
`f8011c1` fix(agentfactory): preserve MCP dedup metadata ·
`e888d5e` fix(agentconfig): validate preferred MCP dedup ·
`facb0d0` fix(agentfactory): keep MCP dedup silent.
Diff: 5 файлов, +160/−10.
| # | Дефект в моём фиксе | Фикс мейнтейнера |
|---|---|---|
| **1** | 🔴 **`hydrateMCPServerConfig` не переносил `DedupKey`/`DedupPreferred`** — собирал новый `MCPServerConfig` поле за полем и **забыл новые поля**. Фикс был бы **мёртв в проде** на пути `Build()` | добавлены `DedupKey: cfg.DedupKey`, `DedupPreferred: cfg.DedupPreferred`. Покрыто тестом `TestFactoryBuildKeepsPreferredDedupEndpoint` (сквозной путь registry → hydration → `hostedToolsets`) |
| **2** | `strings.TrimSpace(key)` **нормализовал** ключ → независимо настроенные namespace'ы с пробелами схлопывались (ровно тот cross-tenant риск, который API и предотвращает) | сравнение по **сырому** ключу; проверка пустоты отдельно: `key := resolvedMCP[id].DedupKey; if strings.TrimSpace(key) == ""`. Тест `TestDedupKeyIsOpaque` |
| **3** | Две записи с `DedupPreferred: true` в одной группе — **молча** выбиралась одна (зависит от порядка id) | явная ошибка: `mcp dedup key %q has multiple preferred configs`. Тест `TestHostedToolsetsRejectsMultipleDedupPreferredConfigs` |
| **4** | `fmt.Printf("[mcp] skipping …")` в **библиотеке** — печать в stdout потребителя | вывод убран (коммит «keep MCP dedup silent») |
| **5** | `DedupPreferred: true` без `DedupKey` не валидировался | `ValidateMCPServerConfig`: `dedup_preferred requires dedup_key`. Тест `TestValidateMCPServerConfig_DedupPreferredRequiresDedupKey` |
📌 **Уроки (durable):**
1. 🔴 **Добавляя поле в конфиг — грепнуть ВСЕ места ручного копирования структуры.**
`hydrateMCPServerConfig` собирает `MCPServerConfig` поле за полем; компилятор такое **не ловит**
(пропущенное поле = zero value, валидный код). Искать `grep -n "MCPServerConfig{"` во всём репо.
Это ровно тот класс дефекта, что и «терпимый ассерт» / «копия логики в тесте»: **выглядит
рабочим, молчит в проде**.
2. ⚠️ **Opaque = opaque.** Назвал ключ «непрозрачным» у вызывающего — не нормализуй его сам.
`TrimSpace` выглядел гигиеной, а был дырой безопасности.
3. ⚠️ **Библиотека не печатает в stdout.** Логирование — дело потребителя.
4. 📌 **Тест сквозного пути ловит то, что юнит-тест уровня функции пропускает.**
Мой тест дёргал `hostedToolsets` напрямую и не проходил через hydration — дефект №1 был невидим.
Правильный тест — через `f.Build()`.
---