70a9e2a9cb
Правки по ревью #480. F1 (мёртвые метрики): счётчики mcp_getpage_cache_hits_total/_misses_total эмитились через onMetricFn, но серверный синк mcp.service.ts диспатчил по имени через if/else-if БЕЗ default и знал только 2 имени → мои дропались молча; в metrics.registry их вообще не было. Починка по существующему 3-частному паттерну (как collab_connect_timeouts_total): имена-константы в metrics.constants.ts; два Counter'а + incGetPageCacheHit/Miss в metrics.registry.ts; два else-if в mcp.service.ts, роутящие ровно эти имена (существующие 2 ветки не тронуты). Проверено end-to-end: скрейп prom-реестра показывает hits=2/misses=1 после прогона роутинга. F2 (нет теста на пропуск конверсии): добавлен overridable seam convertPageMarkdown в read.ts (идиома проекта для юнит-тестируемости ESM-импортов); getPage miss-ветка идёт через него. Тест мокает convertPageMarkdown и ассертит callCount===1 через MISS→HIT одной страницы (конверсия один раз на промахе, ноль на хите). Мутационно доказан: пропатчил hit-ветку на повторную конверсию → тест покраснел (callCount=2), откатил → зелёный. mcp node --test 814/814 (+1); pmd+mcp tsc чисто; серверные metrics-файлы компилируются изолированно, runtime-тест счётчиков зелёный. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>