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?
Часть A — баги потери данных (остаток #206)
Два реально подтверждённых бага, в PR #230 осознанно оставлены неисправленными (их фикс — изменение поведения) и лишь задокументированы характеризующими тестами (
it.fails/it.failing).mdrt-2 — Экспорт в Markdown молча выкидывает узлы без turndown-правила (high)
Страница с
transclusionReference/mention/status/pageBreakпри Export to Markdown / copy-as-markdown:transclusionReferenceиpageBreakисчезают полностью;mention/statusтеряют идентичность (data-id/color). Нарушен инвариант «никогда молча не терять блок».packages/editor-ext/src/lib/markdown/utils/turndown.dataloss.test.ts(характеризация +it.fails).turndown.utils.ts,transclusion-reference.ts,mention.ts.persist-6 — Пустой live-документ перезаписывает непустой контент (high)
В
onStoreDocumentнет empty-guard передupdatePage(в отличие отonLoadDocument). Если liveY.Docна мгновение сериализуется в пустой/почти-пустой — пустой контент проходит и затирает страницу.apps/server/src/collaboration/extensions/persistence-store.spec.ts(it.failing).persistence.extension.ts(isEmptyParagraphDocиспользуется только для boundary-снимка).DoD части A
turndown.dataloss.test.tsit.fails→ зелёный.persistence-store.spec.tsit.failing→ зелёный.Часть B — оставшиеся фазы тест-стратегии (остаток #204)
Уже сделано (PR #230)
mcp-clients.lease.spec.ts(lease/refcount/eviction MCP-клиента).it.failsнаJSON.parse), sort-cells,normalizeTableColumnWidths; mcp htmlEmbed/pageBreak data-loss + footnote-diff; server exportgetInternalLinkPageName(исправлен + тест).Остаток
Фаза 2 (хвост)
guardedFetch/lookup,decideClose;decryptHeadersfail-open.recreateTransform-инвариант (apply(diff)=target),moveRow/moveColumn,getSelectionRangeInColumn,addUniqueIdsToDoc.decideTurnEnd/sendNow.video/youtube/embed/excalidraw/audio/pdf), cookie-парсингperformLogin,applyAnchorInDoc.Фаза 3 — серверная безопасность/доступ (нужен DB-харнесс Postgres + R-core)
getShareForPageнаследование,isSharingAllowedtoggle,getShareTreerestricted-ancestor,lookupTransclusionForShareaccess-граф,acceptInvitationатомарность.AiSettingsService(секреты write-only, неутечка ключей),environment.validation(после снятияprocess.exit).yjs.util(setYjsMark/removeYjsMarkByAttribute/updateYjsMarkAttribute) — 0 тестов.Фаза 4 — добивка и контракты
applyUpdateOne, tree-utils,formatRelativeTime),transclusion-lookup-context.SHARED_TOOL_SPECS↔ in-app/MCP; дрейфrecreate-transform(vendored editor-ext vs npm вmcp/diff.ts).storage.service.spec.ts,environment.service.spec.ts) на проверки делегирования.findBreadcrumbPath-мутации входа.Инфраструктура
@vitest/coverage-v8и/или починка istanbul на ESM-импорте@docmost/editor-ext, порог покрытия (сейчас coverage-gate отсутствует).Полный детальный план по модулям — в истории #204.
Ghost referenced this issue2026-06-28 03:43:29 +03:00
[bug][data-loss] Экспорт Markdown теряет ноды (mdrt-2) + пустой live-документ затирает контент (persist-6)to [bug+test] Остаток после QA/тестов: 2 бага потери данных (#206) + оставшиеся фазы тест-стратегии (#204)Ghost referenced this issue2026-06-28 03:46:13 +03:00
Часть B — крупный no-DB чанк сделан в PR #257 (
f9b58a0e): +193 теста (editor-ext recreateTransform/move-row/col/getSelectionRange/uniqueId; mcp auth-cookie/media-attrs/applyAnchor/recreate-drift; client findBreadcrumbPath-non-mutation/applyUpdateOne/formatRelativeTime/sortPositionKeys; server SSRF guardedFetch+decryptHeaders/yjs.util[было 0]/SHARED_TOOL_SPECS-контракт[76]/storage-делегирование) + fix findBreadcrumbPath-мутации + behavior-identical вынос extractAuthTokenFromSetCookie.Остаётся в #244 (deferred, follow-up):
Часть A (mdrt-2/persist-6) закрыта в #248.