fix(mcp): commentId-тулы молча падают на обрезанном UUID — нужна внятная ошибка «id must be a full UUID» #436
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?
Симптом (реальный кейс из прода)
Ночью 2026-07-10 (чат
019f4983-0d60-70a4-976c-8dd62f5802c1, run 2) модель передала вresolve_commentобрезанный UUID — префикс реального id:Полные id (
019f499a-9f8c-7d68-b7be-ce100d7c6c56, …) модель до этого сама получала из результатовcreate_comment/list_comments, но при пересказе укоротила их до первых двух групп.Что происходит сейчас
DocmostClient.resolveComment()(packages/mcp/src/client.ts, ~2724) никак не валидируетcommentIdи сразу POST-ит в/comments/resolve.ResolveCommentDtoимеет@IsUUID()→ 400.Tool call did not complete.— модель ретраила вслепую (вклад в петлю из #(флуд комментариев)).Модель из такой ошибки не может понять, что надо всего лишь взять полный id из
list_comments.Затронутые тулы
Все, кто принимает
commentIdи прокидывает его в REST как есть:resolve_comment(resolveComment)update_comment(updateComment)delete_comment(deleteComment)create_commentcparentCommentId(reply)Предлагаемый фикс
Fail-fast валидация формата UUID на стороне MCP-клиента (до POST), с actionable-текстом ошибки, например:
assertFullUuid(toolName, paramName, value)в client.ts, применить во всех четырёх местах;error.response.data.messageдля остальных 4xx, чтобы серверные валидационные ошибки доходили до модели читаемым текстом, а не «status code 400».Критерии приёмки
commentIdв любом из четырёх тулов возвращает модели ошибку с текстом «full comment UUID» и примером, без сетевого запроса.Контекст
Найдено при разборе инцидента «агенты в петле» 2026-07-10 (флуд дублей комментариев на странице про прошивку ESP; связанные фиксы: #407 персист tool-error, #427 подсказки якоря, #431 CollabSession).
Объединено в #437 (фаза B полной спеки диагностики ошибок тулов). Закрываю как дубликат/поглощённое.