Стабилизация, итерация 9: MCP — гарды зеркал реестра + write-целостность (один PR, 4 коммита) #494
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Один PR. Зависит от #489 (коммит 2 — поле write-класса в спеках вводится там; здесь добавляется assert на него). Принцип: комментарий «mirror this» гардом не считается — каждое ручное зеркало получает либо деривацию, либо parity-тест в CI. Координаты — develop@363f20ab.
Коммит 1 — fix(mcp): registration-time asserts реестра
(а)
spec.execute!без гарда (packages/mcp/src/index.ts:302,ai-chat-tools.service.ts:569): спек без execute падает TypeError'ом (MCP-хост) или молча пропускается (in-app). Assert «каждый не-inline спек несёт execute/mcpExecute». (б) Assert «каждый спек объявляет write-класс» (readOnly/idempotent— поле из #489). Тест по реестру.Коммит 2 — refactor(mcp): гарды остальных зеркал
chat-markdown.util.ts:78) → тест «каждое имя из реестра имеет ярлык»; лучше — полеlabelв спеке (деривация);countAnchorMatches×2 → единый резолвер.Коммит 3 — fix(mcp): drawio_create — error-on-success
packages/mcp/src/client.ts:4098-4108: при вставке во вложенный контейнер узел УЖЕ записан, но тул кидает ошибку → retry-склонный агент вставляет дубликат диаграммы. Правка: возвращать успех с warning «written, but no addressable handle» вместо throw.Коммит 4 — fix(mcp): LRU-eviction не реджектит чужой in-flight mutate
packages/mcp/src/lib/collab-session.ts:551-555: эвикция реджектит чужой in-flight mutate, чей update мог уже дойти до сервера → false-failure → ретрай агента → дубликат записи (тот же механизм, что в инциденте #435). Правка: не эвиктить сессии с pending-операциями (брать следующего кандидата); если эвикция неизбежна — возвращать «indeterminate: verify before retry», а не failure.