fix(mcp): drawio — авто-стрип XML-комментариев вместо lint-ошибки [no-comments], убрать цикл ретраев #505

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

Баг: агент постоянно спотыкается о [no-comments] и пересоздаёт диаграмму

Стадия 1 (#423) в проде. Наблюдение с живого использования in-app агента: модель органически вставляет <!-- комментарии --> в mxGraph-XML (несмотря на запрет в tool description — это природа LLM, бороться промптом бесполезно). Линтер отвечает жёсткой ошибкой:

drawio lint failed: [no-comments] XML comments (<!-- -->) are not allowed in diagram XML

→ модель делает полный ре-генерейт диаграммы. Лишний целый tool-вызов с полным XML на ровном месте, и так почти на каждой первой генерации.

Где

packages/mcp/src/lib/drawio-xml.ts:780-786 — правило no-comments проверяется по сырой строке и возвращает error.

Фикс (согласован): авто-стрип + warning

Комментарии не несут семантики — вырезать их безопасно всегда:

  1. В общем prepare-пути диаграммного XML (тот, что зовут drawioCreate / drawioUpdate / drawioEditCells при приёме сырого XML) до линта вырезать комментарии: xml.replace(/<!--[\s\S]*?-->/g, "").
    • Регэксп безопасен: <!-- внутри значения атрибута обязан быть entity-экранирован (&lt;!--), т.е. под регэксп не попадает; CDATA в drawio-XML не используется.
  2. В warnings[] результата добавить stripped N XML comment(s) (только если N > 0) — модель видит, но не ретраит.
  3. Само правило no-comments оставить как defense-in-depth после стрипа (нормальным путём оно теперь недостижимо).
  4. Упоминание запрета комментариев в tool description оставить (меньше мусора — меньше токенов), но это больше не блокер.

Критерии приёмки

  1. XML с <!-- --> проходит drawioCreate/drawioUpdate/drawioEditCells без ошибки; в результате warning stripped N XML comment(s).
  2. В сохранённом XML (и в drawio_get) комментариев нет.
  3. XML без комментариев не получает лишний warning.
  4. Тест на многострочный комментарий и на несколько комментариев подряд; существующий негативный тест правила переориентировать на «недостижимо после стрипа» / прямой вызов линтера.
# Баг: агент постоянно спотыкается о `[no-comments]` и пересоздаёт диаграмму Стадия 1 (#423) в проде. Наблюдение с живого использования in-app агента: модель органически вставляет `<!-- комментарии -->` в mxGraph-XML (несмотря на запрет в tool description — это природа LLM, бороться промптом бесполезно). Линтер отвечает **жёсткой ошибкой**: ``` drawio lint failed: [no-comments] XML comments (<!-- -->) are not allowed in diagram XML ``` → модель делает полный ре-генерейт диаграммы. Лишний целый tool-вызов с полным XML на ровном месте, и так почти на каждой первой генерации. ## Где `packages/mcp/src/lib/drawio-xml.ts:780-786` — правило `no-comments` проверяется по сырой строке и возвращает error. ## Фикс (согласован): авто-стрип + warning Комментарии не несут семантики — вырезать их безопасно всегда: 1. В общем prepare-пути диаграммного XML (тот, что зовут `drawioCreate` / `drawioUpdate` / `drawioEditCells` при приёме сырого XML) **до линта** вырезать комментарии: `xml.replace(/<!--[\s\S]*?-->/g, "")`. - Регэксп безопасен: `<!--` внутри значения атрибута обязан быть entity-экранирован (`&lt;!--`), т.е. под регэксп не попадает; CDATA в drawio-XML не используется. 2. В `warnings[]` результата добавить `stripped N XML comment(s)` (только если N > 0) — модель видит, но не ретраит. 3. Само правило `no-comments` **оставить** как defense-in-depth после стрипа (нормальным путём оно теперь недостижимо). 4. Упоминание запрета комментариев в tool description оставить (меньше мусора — меньше токенов), но это больше не блокер. ## Критерии приёмки 1. XML с `<!-- -->` проходит `drawioCreate`/`drawioUpdate`/`drawioEditCells` без ошибки; в результате warning `stripped N XML comment(s)`. 2. В сохранённом XML (и в `drawio_get`) комментариев нет. 3. XML без комментариев не получает лишний warning. 4. Тест на многострочный комментарий и на несколько комментариев подряд; существующий негативный тест правила переориентировать на «недостижимо после стрипа» / прямой вызов линтера.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#505