[2026-09-28] eagle: family/plans/lidarr-taiga-deploy.md personal/projects/balda/balda.md personal/tech/adk-hostedagent-openai-mcp.md personal/tech/flaresolverr-taiga.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-28 15:24:26 +06:00
1 parent 5f3bdf6bff
commit f3dacaaa39
4 files changed
+185 -22

No files matched your search

+62 -2
View File
@@ -3,6 +3,9 @@
> Создано 2026-09-27. Зеркало скилла [[software-development/adk-hostedagent-openai-mcp|`adk-hostedagent-openai-mcp`]].
> Здесь — **исправление к скиллу** и разбор дефекта, найденного на Балде.
> Проект: [[personal/plans/balda-mm-phase4-agents]] §19, [[personal/projects/balda/balda-kraken-mm-deploy]] §19.
>
> 🔴 **ОБНОВЛЕНО 2026-09-28:** первая версия фикса дедупа (§4) и два теста (§5, §6)
> **отклонены ревью PR #5**. Правки помечены в §4a / §5 / §6 — читать их вместе с §4.
---
@@ -94,7 +97,12 @@ extraMCPServerIDs = append(extraMCPServerIDs, binding.ID)
---
## 4. Фикс — дедуп по эндпоинту
## 4. Фикс — дедуп по эндпоинту ⚠️ (ОТВЕРГНУТ ревью PR #5, 2026-09-28)
> 🔴 **Статус: первая версия фикса отклонена ревьюer'ом metalagman в
> [[personal/plans/runtime-pr5-toolset-dedup-review-fixes|PR #5]] (`CHANGES_REQUESTED`).**
> Ниже — как было сделано; что именно неверно и чем заменяем — см. §4a. Не копировать
> этот раздел в новые реализации.
**Файл:** `runtime-local/agentfactory/agentfactory.go`, функция `hostedToolsets`.
@@ -119,6 +127,29 @@ extraMCPServerIDs = append(extraMCPServerIDs, binding.ID)
---
## 4a. Почему версия из §4 неверна (ревью PR #5, 2026-09-28)
Три замечания ревьюer'а, все подтверждены фактами. Разбор и план — [[personal/plans/runtime-pr5-toolset-dedup-review-fixes]].
| # | Severity | Что не так |
|---|---|---|
| P1 | **blocking** | `mcpEndpointKey` стирает **все** query-параметры, а `Headers` в ключе не участвуют. Query и headers выбирают тенанта / авторизационный контекст. `/mcp?tenant=a` vs `/mcp?tenant=b`, или один URL с разными `Authorization` → схлопываются в один произвольный конфиг = **доступ к чужому tool-set**. Вывод идентичности из host/path — небезопасен. |
| P2 | test gap | `selectScopedOnly` (§5) **дублирует алгоритм продакшена** и сам вычисляет «ожидаемого» победителя → не проверяет фактически удержанный конфиг. Вакуумный ассерт. |
| P2 | test gap | Пробник `ProcessRequest(ctx any, req any)` (§6) — Go требует **точных** типов, реальная подпись `(agent.Context, *model.LLMRequest)` его **не** удовлетворяет → проверка не может сработать. |
📌 **Направление замены (ожидает одобрения Alex):**
- generic-слой (`agentfactory`) **перестаёт выводить** идентичность из формы URL;
- схлопывание только по **явному** ключу — предлагается `DedupKey string` в
`agentconfig.MCPServerConfig` (альтернатива — `Aliases []string`);
- Balda объявляет свой дубль **сама** в composition layer — `internal/apps/balda/agent/runtime_manager.go:344`
(`registry.Set(binding.ID, binding.Config)`) — ровно этого просит ревьюer («resolve the Balda-specific
duplicate in the Balda composition layer»);
- победитель — **детерминированный** (lexicographic) или явное поле, но **не** эвристика по наличию query.
⚠️ Разные `?tenant=`/`Authorization` в общем слое обязаны оставаться **разными серверами**.
---
## 5. Проверка (что реально подтверждает фикс)
| Проверка | Команда | Ожидание |
@@ -138,6 +169,15 @@ extraMCPServerIDs = append(extraMCPServerIDs, binding.ID)
не ломало). Добавлен `selectScopedOnly` — теперь тест падает, если выживает не scoped-запись.
Слабый тест = ложная уверенность.
🔴 **НО: `selectScopedOnly` тоже признан вакуумным (ревью PR #5, §4a P2).** Он **копирует цикл
`hostedToolsets`** внутри теста и возвращает «ожидаемого» победителя сам — проверяется копия
алгоритма, а не реально удержанный конфиг (`hostedToolsets` отдаёт непрозрачные `tool.Toolset`;
тест считает только `len()`). Если поменять приоритет синхронно в проде и в копии — тест останется
зелёным. **Правильная форма:** ассертить фактически использованный endpoint — либо через
инъектируемый конструктор транспорта (тестовый хук, подмена в тесте + проверка `Transport.Endpoint`),
либо подняв реальные httptest-MCP-серверы с разными tool-листами. Урок усиливается: **копия логики
в тесте — тот же класс ошибки, что терпимый ассерт.** Тест обязан наблюдать **результат продакшена**.
---
## 6. Метод: исполняемый пробник вместо чтения
@@ -146,13 +186,32 @@ extraMCPServerIDs = append(extraMCPServerIDs, binding.ID)
за секунду:
```go
import (
"google.golang.org/adk/v2/agent"
"google.golang.org/adk/v2/model"
)
type requestProcessor interface {
ProcessRequest(ctx any, req any) error
ProcessRequest(ctx agent.Context, req *model.LLMRequest) error
}
if _, ok := toolset.(requestProcessor); ok {
t.Fatal("unexpected: premise changed")
}
```
🔴 **Типы должны быть ТОЧНЫМИ (ревью PR #5, §4a P2).** Изначальная форма
`ProcessRequest(ctx any, req any) error` — **вакуумная**: Go требует точного совпадения типов,
поэтому реальный метод `(agent.Context, *model.LLMRequest)` такой интерфейс **не** реализует,
`ok` всегда `false`, `t.Fatal` **недостижим**. Пробник выглядел как проверка, но не проверял
ничего — ровно та же болезнь, что «терпимый ассерт» в §8. Полезное дополнение: **позитивный
контроль** — рядом проверить, что интерфейс реализуется заведомо подходящим типом; если сигнатура
разъедется, тест это покажет.
⚠️ Тип `agent.Context` в `adk/v2` — **интерфейс** (`github.com/google/uuid`-подобных полей нет).
Продакшн-подписи подтверждены в модульном кэше:
`adk/v2@v2.4.0/internal/toolinternal/tool.go:41` и `tool/tool.go:192`:
```go
ProcessRequest(ctx agent.Context, req *model.LLMRequest) error
```
📌 **Правило:** когда гипотеза касается **интерфейса или пути вызова** — писать исполняемый
пробник, а не читать дальше. Чтение даёт правдоподобные версии; тест даёт факт.
@@ -233,6 +292,7 @@ runtime. Правки в `~/Developer/runtime-local` **не доезжают**
## Связанные заметки
- [[personal/plans/runtime-pr5-toolset-dedup-review-fixes]] — **PR #5: 3 дефекта ревью дедупа MCP-тулсетов**, план замены (§4a)
- [[personal/plans/runtime-pr4-openai-toolcalls-fixes]] — PR #4: 4 дефекта, фиксы, тесты
- [[personal/plans/balda-mm-phase4-agents]] — §19 (корень, фикс, тесты, приёмка), §16.2 и §18 опровергнуты
- [[personal/projects/balda/balda-kraken-mm-deploy]] — Фаза 3, образ `balda-mm:0.1.13`