WEB-417 · Дефект · — · web
Движок Gate D: расхождение на пробеле при записи ассистентом в документ (gdfix5)
Не чиним
P1 · важно
ведёт: —
эпик: WEB-283
Суть
ЛИНИЯ: движок редактора, ступень Gate D. Родитель — WEB-283 (ЭПИК: движок редактора Gate C / docsession).
ПРОБЛЕМА. Gated writer (запись ассистента прямо в документ пользователя) расходился с содержимым редактора на границе пробела: правка применялась не туда, каретка уезжала.
КОРЕНЬ — ДВЕ причины (раньше искали одну и латали 4 круга, gdfix5 нашёл обе):
1) contenteditable сериализует пробел на границе текстового узла как — сравнение видело разные строки при визуально одинаковом тексте;
2) editing snapshot сворачивал run whitespace, поэтому после двух пробелов подряд каретка вычислялась со смещением.
РЕШЕНИЕ. Новый модуль src/lib/editor/legacyHtmlWhitespace.ts (219 строк) — нормализация legacy HTML whitespace; правки в src/lib/editor/editorTextSnapshot.ts и src/lib/document-session/gated-writer.ts. Дополнительно src/lib/auth/clientAccountIsolation.ts сохраняет аварийный kill-switch писателя ЧЕРЕЗ очистку данных аккаунта — чтобы очистка не превратила «запрещено» в «разрешено»; при нечитаемом хранилище резолвер писателя закрывается (fail-closed). src/instrumentation.edge.ts + NormalModuleReplacementPlugin для edge-рантайма.
Чем закрывается (приёмка)
(1) 9 классов пробелов в ЖИВОМ браузере — без расхождения; (2) атрибуты сохраняются; (3) round-trip 10 правок стабилен; (4) прежнее не сломано: kill-switch, ZWJ, IME, OFF-путь; (5) регрессия ACCGD6 зелёная; (6) scoped tsc без диагностик.
Доказательства
ДУБЛЬ. Настоящий тикет ступени Gate D — WEB-324, туда перенесён весь трейл (слияние на линию прода, сборка l62, подпись, посадка, проверки). Сюда не писать.
Причина ошибки: искал по словам «Gate D» и «gated writer» в заголовках, а WEB-324 назван «controlled writer» — не совпало. На будущее: перед созданием тикета искать по НОМЕРУ эпика и по родителю, а не только по словам.
Связи
- связан → WEB-283 — ЭПИК: движок редактора Gate C (docsession) — леги 1-9 + продуктовые хвосты · ступень Gate D эпика движка
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-417","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-27T21:10:50.503Z