feat(collab): провести сигнал намеренной очистки (intentionalClear) от редактора до store #251

Open
opened 2026-06-28 22:10:59 +03:00 by Ghost · 0 comments

Problem / Goal

Store-side empty-guard (#248) блокирует любую запись «пусто поверх непустого», чтобы предотвратить потерю данных при пустых мержах/глюках. Побочно это блокирует и ЛЕГИТИМНУЮ намеренную очистку страницы пользователем (select-all + delete) — она молча не сохраняется. Нужно провести сигнал намеренной очистки (intentionalClear) end-to-end, чтобы намеренная очистка персистилась, а защита от случайного затирания сохранялась.

Acceptance criteria

  • Клиент-редактор эмитит сигнал намеренной очистки при явном действии пользователя (определить, что именно считается намеренной очисткой).
  • Сигнал доходит до onStoreDocument в per-edit виде (сейчас контекст hocuspocus — per-connection: authentication.extension.ts:116-120 = { user, actor, aiChatId }), не ломая существующую защиту guard.
  • Намеренная очистка персистится: страница становится пустой и остаётся пустой после перезагрузки.
  • Случайная очистка / пустой мерж по-прежнему блокируется guard (защита из #248 сохраняется).
  • Регрессионный тест, где intentionalClear проставляется РЕАЛЬНЫМ путём (не ручной подстановкой в спеке), подтверждает персист намеренной очистки.

Out of scope

  • Поведение guard из #248 (вариант A) остаётся в силе; этот issue добавляет канал намеренной очистки поверх него.
  • Редизайн UI.

Notes / decisions

  • Возникло из эскалации ревью PR #248 (находка F1) — развилка «вариант B». Пользователь выбрал: A применить сразу в #248, B вынести сюда.
  • Связано с #244, #248.
  • Текущий escape-hatch context?.intentionalClear в persistence.extension.ts:225-238 мёртв (никто не выставляет) — в рамках варианта A он удаляется из #248; этот issue вводит рабочий механизм заново и осознанно.
## Problem / Goal Store-side empty-guard (#248) блокирует любую запись «пусто поверх непустого», чтобы предотвратить потерю данных при пустых мержах/глюках. Побочно это блокирует и ЛЕГИТИМНУЮ намеренную очистку страницы пользователем (select-all + delete) — она молча не сохраняется. Нужно провести сигнал намеренной очистки (`intentionalClear`) end-to-end, чтобы намеренная очистка персистилась, а защита от случайного затирания сохранялась. ## Acceptance criteria - [ ] Клиент-редактор эмитит сигнал намеренной очистки при явном действии пользователя (определить, что именно считается намеренной очисткой). - [ ] Сигнал доходит до `onStoreDocument` в per-edit виде (сейчас контекст hocuspocus — per-connection: `authentication.extension.ts:116-120` = `{ user, actor, aiChatId }`), не ломая существующую защиту guard. - [ ] Намеренная очистка персистится: страница становится пустой и остаётся пустой после перезагрузки. - [ ] Случайная очистка / пустой мерж по-прежнему блокируется guard (защита из #248 сохраняется). - [ ] Регрессионный тест, где `intentionalClear` проставляется РЕАЛЬНЫМ путём (не ручной подстановкой в спеке), подтверждает персист намеренной очистки. ## Out of scope - Поведение guard из #248 (вариант A) остаётся в силе; этот issue добавляет канал намеренной очистки поверх него. - Редизайн UI. ## Notes / decisions - Возникло из эскалации ревью PR #248 (находка F1) — развилка «вариант B». Пользователь выбрал: A применить сразу в #248, B вынести сюда. - Связано с #244, #248. - Текущий escape-hatch `context?.intentionalClear` в `persistence.extension.ts:225-238` мёртв (никто не выставляет) — в рамках варианта A он удаляется из #248; этот issue вводит рабочий механизм заново и осознанно. <!-- state:issue status: ready blocked_by: [] pr: null attempts: 0 -->
Ghost added the featurestatus/ready labels 2026-06-28 22:11:27 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#251