ddb37376a4
Фаза 1б (#445/#446/#447/#448) влилась ПЕРЕД этим PR, поэтому явная проводка drawio через registerShared/sharedTool конфликтовала с реестровыми циклами. Фолд: - drawioGet/Create/Update → канонический execute в спеке (это client-методы): execute возвращает сырой результат, цикл оборачивает jsonContent на MCP и отдаёт как есть in-app — байт-в-байт как старые тела, overrides не нужны. layout сохранён: добавлен в buildShape create/update + 5-м аргументом (layout as 'elk'|undefined) в обоих execute. - drawioShapes/drawioGuide → остаются inline на ОБОИХ хостах. Гайд архитектора «execute в спеке с импортом searchShapes/getGuideSection в tool-specs.ts» оказался невозможен: drawio-shapes.ts использует import.meta.url, а tool-specs.ts тайпчекается из исходника под module:commonjs (contract-спека) → TS1343 на статический value-import, а import.meta не индиректится. Введён флаг спеки inlineBothHosts: спеки остаются в SHARED_TOOL_SPECS (contract пинит имя/описание/схему), но без execute; ОБА цикла их пропускают (добавлен симметричный guard в MCP-цикл), каждый хост регистрирует их inline через чистые хелперы — поведение байт-в-байт как до ребейза. - docmost-client.loader: взята develop-форма DocmostClientLike = Pick< DocmostClient> (#446); ручное зеркало убрано, паритет layout наследуется из реальной сигнатуры client. - ROUTING_PROSE: drawio intent-подсказки (shapes-first, guide, layout:elk); инвентарные строки убраны (генерируются из catalogLine). Гейт: mcp node --test 674/674; server jest ai-chat-tools.service + contract (211, все 5 drawio на обоих хостах, идентичная схема) + tool-tiers → 264; tsc чисто; layout-passthrough тест 3/3. ELK DoS-кап и layout-фикс из round 3/4 сохранены. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>