[bug][mcp] hardBreak непредставим в markdown-каноне: сериализатор молча пропускает узел, импортер не создаёт его из br — поддержать в обе стороны #503
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?
Суть
Из агентского фидбека:
hardBreak, отправленный черезupdatePageJson, «тихо вырезался — без ошибки, перенос не появился». Агент был вынужден раскладывать строки по отдельным параграфам.Диагноз (полный, по коду)
Трассировка пути
update_page_json:docmostExtensions(docmost-schema.ts) включает StarterKit v3 без отключения HardBreak →PMNode.fromJSON(docmostSchema, …)в collaboration.ts#L181 принимает его; неизвестные типы там бросают labelled-ошибку (unstorableYjsError), т.е. «тихость» — не отсюда.br-токена marked → из markdown hardBreak не создать вообще.Итог: узел легален в редакторе (Shift+Enter) и схеме, но непредставим в markdown-каноне MCP. Потеря у агента произошла либо при markdown-канонизации записи, либо как «записан, но невидим при markdown-чтении» — фикс обязан закрыть обе стороны, тогда точная сторона не важна (первый шаг реализации — 5-минутный репро, чтобы знать, что пишем в CHANGELOG).
Решение
\\\n) внутри параграфа/listItem. Snapshot-тесты вывода.br-токен marked (двойной пробел+\n,\\\n,<br>) → узелhardBreak.update_page_jsonc hardBreak →getPageпоказывает\\-перенос →get_page_jsonвозвращает узел. Это закрывает и «no second canon»-инвариант: узел больше не теряется на канонизации.unstorableYjsErrorдля реально неизвестных нод доходит до агента как понятное сообщение со списком допустимых типов (опыт «тихо» из фидбека намекает, что мог не дойти) — тест на{type:"blink"}.Крайние случаи
\\) — это исправление потери данных, не регрессия; git-sync/export дифф разовый, отметить в CHANGELOG.\\в конце строки в СУЩЕСТВУЮЩЕМ markdown начнёт парситься как hardBreak — это CommonMark-семантика, корректно; text-режим чтения (#502) hardBreak отдаёт как\n.\n, проверить, что поиск не склеивает слова.Тесты / приёмка
{type:"blink"}→ понятная ошибка, не тишина.Связанное
Фидбек-пакет: #501 (токен), #502 (литеральные режимы). Пересборка
packages/mcp/build/*иpackages/prosemirror-markdown/build/*— оба пакета затронуты.[bug][mcp] updatePageJson молча выкидывает hardBreak: тихая нормализация вместо ошибки — агент думает, что записал, а там не тоto [bug][mcp] hardBreak непредставим в markdown-каноне: сериализатор молча пропускает узел, импортер не создаёт его из br — поддержать в обе стороны