Стабилизация, итерация 11: suggestions и комментарии — audit trail, целостность apply (один PR, 5 коммитов) #496

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

Один PR. Зависимостей от других итераций нет. Координаты — develop@363f20ab.

Коммит 1 — feat(audit): DB-backed audit trail вместо Noop

audit.module.ts:5-13: события летят в NoopAuditService с payload {pageId}; childless Apply/Dismiss при этом hard-delete'ит комментарий — восстановить, кто и что решил, невозможно. Правка: минимальный DB-backed AuditService — одна таблица audit_events(actor, action, page_id, payload jsonb, ts); payload дополнить suggestedText/selection/commentAuthor/decidedBy. Биндинг модуля уже существует.

Коммит 2 — fix(comments): suggestion с вечным 409

packages/mcp/src/client.ts:2883-2908: expectedText берётся из debounced REST-снапшота, а метка ставится в live-доке — расхождение даёт 409 на каждый apply. Правка: в transform-фазе (там уже есть live-док) перечитывать фактическую подстроку под меткой и сохранять её как expectedText.

Коммит 3 — fix(comments): apply не стирает форматирование

yjs.util.ts:261-262: вставка только с {comment: markAttrs} — bold/link/code исходного run'а теряются молча. Правка v1: захватывать marks доминирующего run'а заменяемого диапазона и применять к вставке. До полного фикса — предупреждение в UI-превью диффа («форматирование будет сброшено»).

Коммит 4 — fix(comments): orphan-anchor reconcile + docstring

comment.service.ts:630-710: при исчерпании ретраев очереди метка остаётся без строки комментария; docstring обещает инвариант «FIRST and FATALLY», который уже не выполняется. Правка: поправить docstring; reconcile-джоб «метка есть, строки комментария нет → снять метку» — тихая дивергенция становится самозаживающей; тот же джоб закрывает fire-and-forget resolve/unresolve (:330).

Коммит 5 — fix(comments): дедуп двойного WS-broadcast при apply треда с ответами (косметика).

Тест итерации: e2e с живым hocuspocus «человек печатает внутри marked-run во время apply» — наблюдаемое свойство, не мок.

Один PR. Зависимостей от других итераций нет. Координаты — develop@363f20ab. ### Коммит 1 — feat(audit): DB-backed audit trail вместо Noop `audit.module.ts:5-13`: события летят в NoopAuditService с payload `{pageId}`; childless Apply/Dismiss при этом hard-delete'ит комментарий — восстановить, кто и что решил, невозможно. Правка: минимальный DB-backed AuditService — одна таблица `audit_events(actor, action, page_id, payload jsonb, ts)`; payload дополнить suggestedText/selection/commentAuthor/decidedBy. Биндинг модуля уже существует. ### Коммит 2 — fix(comments): suggestion с вечным 409 `packages/mcp/src/client.ts:2883-2908`: `expectedText` берётся из debounced REST-снапшота, а метка ставится в live-доке — расхождение даёт 409 на каждый apply. Правка: в transform-фазе (там уже есть live-док) перечитывать фактическую подстроку под меткой и сохранять её как expectedText. ### Коммит 3 — fix(comments): apply не стирает форматирование `yjs.util.ts:261-262`: вставка только с `{comment: markAttrs}` — bold/link/code исходного run'а теряются молча. Правка v1: захватывать marks доминирующего run'а заменяемого диапазона и применять к вставке. До полного фикса — предупреждение в UI-превью диффа («форматирование будет сброшено»). ### Коммит 4 — fix(comments): orphan-anchor reconcile + docstring `comment.service.ts:630-710`: при исчерпании ретраев очереди метка остаётся без строки комментария; docstring обещает инвариант «FIRST and FATALLY», который уже не выполняется. Правка: поправить docstring; reconcile-джоб «метка есть, строки комментария нет → снять метку» — тихая дивергенция становится самозаживающей; тот же джоб закрывает fire-and-forget resolve/unresolve (`:330`). ### Коммит 5 — fix(comments): дедуп двойного WS-broadcast при apply треда с ответами (косметика). **Тест итерации:** e2e с живым hocuspocus «человек печатает внутри marked-run во время apply» — наблюдаемое свойство, не мок.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#496