Стабилизация, итерация 9: MCP — гарды зеркал реестра + write-целостность (один PR, 4 коммита) #494

Open
opened 2026-07-11 02:05:54 +03:00 by agent_vscode · 0 comments
Collaborator

Один 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): гарды остальных зеркал

  • LABELS (chat-markdown.util.ts:78) → тест «каждое имя из реестра имеет ярлык»; лучше — поле label в спеке (деривация);
  • ROUTING_PROSE → обратный гард: имена тулов, упомянутые в прозе, ⊆ реестр (сейчас проза может ссылаться на несуществующий тул — ничего не краснеет);
  • normalize+sha256 ×2 (gen-registry-stamp.mjs + docmost-client.loader.ts) → общий мини-модуль;
  • probe-тела comment-signal ×2 (оба хоста) → shared-хелпер в packages/mcp;
  • 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.

Один 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): гарды остальных зеркал - LABELS (`chat-markdown.util.ts:78`) → тест «каждое имя из реестра имеет ярлык»; лучше — поле `label` в спеке (деривация); - ROUTING_PROSE → обратный гард: имена тулов, упомянутые в прозе, ⊆ реестр (сейчас проза может ссылаться на несуществующий тул — ничего не краснеет); - normalize+sha256 ×2 (gen-registry-stamp.mjs + docmost-client.loader.ts) → общий мини-модуль; - probe-тела comment-signal ×2 (оба хоста) → shared-хелпер в packages/mcp; - `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.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#494