Skip to content

Editing 세션의 관찰·오류 복구·History 귀속·구독 수명을 보완한다 - #720

Merged
developer-1px merged 2 commits into
mainfrom
issue-719-editing-session-contract
Sep 7, 2026
Merged

Editing 세션의 관찰·오류 복구·History 귀속·구독 수명을 보완한다#720
developer-1px merged 2 commits into
mainfrom
issue-719-editing-session-contract

Conversation

@developer-1px

Copy link
Copy Markdown
Owner

Goal Anchor

  • Outcome: Host가 구독 순서나 별도 방어 코드에 의존하지 않고 EditingSession과 Collaboration History를 안전하게 조합할 수 있게 합니다.
  • Done: 리뷰에서 재현한 알림 누락, 선택 보정 예외 후 외부 변경을 덮어쓰는 undo, 협업 undo의 타 작업 변경 오귀속, 오래된 unsubscribe의 새 구독 제거를 정본 구현에서 수정하고 회귀 테스트·공개 계약·실제 소비자 검증을 갖춘 PR을 엽니다.
  • Don't: Core의 six-member API와 collaboration wire, 정상 편집·선택·로컬/선택적 history 의미를 바꾸지 않습니다. Host 우회 구현, 제품 UI 재설계, 무관한 정리, Database saved-view와 편집 표현 책임을 정본화한다 #587·refactor(annotation): 선택·gesture·출력의 정본 경계 통합 #589 작업, npm 배포는 포함하지 않습니다. 기존 사용자 파일을 보존하며 merge는 별도 승인 대상으로 둡니다.

Closes #719

원인과 수정

리뷰 반례 정본 수정·검증
먼저 등록된 document 구독자의 snapshot 읽기가 Editing 알림을 소비 동기화가 확정한 revision은 읽기·명령·observer 경로 모두 통지. Core·Collaboration·React 실제 소비자 및 FIFO 재진입 회귀
선택 mapping/reconciliation 예외 뒤 오래된 inverse가 외부 변경을 덮어씀 콜백 결과를 지역 값으로 계산한 뒤 관측 상태를 함께 확정. 실패 중 모든 새 명령은 동기화 재시도에서 차단. 마지막 일관된 선택에서 복구하며 local history 무효화
history-only undo가 replica 구독자의 별도 쓰기를 자기 change로 오인 History owner가 자기 change와 통지 전 status를 반환하고 Editing 연결이 전달. undo/redo × 문서 변경/history-only × 관찰/비관찰 재진입 검증
이전 unsubscribe 재호출이 같은 콜백의 새 구독 제거 Core와 같은 idempotent 해제. 양쪽 연결 해제·재구독·editor 재생성 검증

협업 undo/redo가 이미 성공한 뒤 선택 복원만 실패하면 작업 결과와 선택 기준을 보관합니다. 다음 읽기는 선택 복원만 재시도하며 history 작업을 반복하지 않습니다. 콜백 예외는 programming error이며 commit 거절인 { ok: false }와 구분합니다. 정상 완료된 편집은 후속 외부 변경의 선택 보정 실패로 실패 결과가 되지 않습니다.

공개 계약과 호환성

  • EditingHistory 성공 결과는 { ok: true, target, change, status }입니다. 직접 구현한 target-only history owner는 change: JSONAppliedChange | null과 작업 직후 EditingHistoryStatus를 공급해야 합니다.
  • Collaboration HistoryResult에도 자기 change와 불변 status가 추가됩니다. status는 해당 작업의 target·depth·revision·canUndo·canRedo이며 구독자 실행 전에 캡처합니다.
  • 기존 editor 소비자는 호출을 바꿀 필요가 없습니다. Core 공개 API, collaboration wire·checkpoint, selection wire 의미는 변경하지 않습니다. package publish/version 변경도 하지 않았습니다.
  • owner README, 공개 History 문서, API reference를 갱신했습니다. 변경하는 HistoryResult가 누락되지 않도록 기존 registry에 /history를 추가했고 generator는 동일한 root re-export를 중복 설명하지 않습니다. 이에 대한 문서 회귀도 추가했습니다.
  • 기존 Rich Text Usage와 Source 등록을 사용하며 Demo/Host 보정 구현이나 UI 변경은 없습니다.

검증

  • 신규 회귀 30건. 최초 고정한 반례 중 수정 전 20건 실패를 확인했고 수정 후 통과했습니다.
  • 전체 테스트: 147 files / 1,377 passed / 4 skipped. 마지막 테스트 assertion 정리 후 해당 9건과 Editing typecheck도 재통과했습니다.
  • Editing·Collaboration·React·Site typecheck, 전체 package build, Site 정본/스타일 guards 통과.
  • workspace:check: 29 libraries. standard:check: Core 1 entrypoint / 23 exports / six-member / 0 runtime peers 유지, conformance 347 passed / 4 skipped.
  • docs:api:check: 29 packages / 1,032 exports. /history 고유 7개 API가 owner reference에 포함되고 root re-export 중복 없음. docs:evaluate 통과.
  • site:verify:pages: build·artifact 평가·HTTP smoke 통과. git diff --check 통과.
  • 기존 Chrome 프로필에서 실제 /editing/rich-text?history=collaboration 경로를 제어했습니다. DOM beforeinput(insertText) → 원격 변경 수신 → Toolbar Undo → DOM historyRedo를 실행해 원격 텍스트 보존, undo 후 caret offset 11, redo 복원을 확인했습니다. 해당 흐름 browser error 0건.
  • Usage의 공개 연결 API import/호출, editing-index.ts Source의 자기 change 전달, /docs/api/collaboration reference 링크를 확인했습니다.

OS 키 입력 자동화는 권한이 없어 unavailable입니다. 권한 변경·새 Chrome 프로필 생성 없이 DOM input event와 실제 toolbar 경로를 검증했습니다. 로컬에서 전체 native-keyboard/cross-browser Playwright suite를 실행한 것으로 보고하지 않습니다. 원격 CI 상태는 PR checks에서 확인할 수 있습니다.

상태

수정 PR 생성까지의 승인 범위이며 merge하지 않았습니다. #587·#589 및 기존 사용자 자료는 보존했습니다. 별도 승인된 contract delta나 독립 후속 목표는 없습니다.

@developer-1px

Copy link
Copy Markdown
Owner Author

재리뷰 발견 — merge 전 보완

사용자의 “리뷰 후 merge” 승인으로 landing 검토를 시작했습니다. 기존 head 934a7170의 Plan·Package·Site·External kit CI는 모두 통과했고 외부 review/inline comment와 보안·개인정보 지적은 없습니다.

P1: 동기화 알림 중 재진입 변경을 새 명령이 건너뜀

먼저 등록된 document observer에서 session.apply()를 호출하고, 그 명령 직전 동기화가 보내는 Editing 알림에서 다른 observer가 다시 document를 쓰는 경우를 재현했습니다. 두 번째 외부 변경의 선택 callback이 실패해야 하는 상태인데도 apply가 실행됩니다. 실제 재현은 외부 n: 1 → 2 이후 차단되어야 할 명령이 n: 99를 기록했고 callback은 n: 1에 대해서만 실행됐습니다.

이번 diff의 동기화 내 publish()가 만든 재진입 경계이므로 Done 1의 재진입 알림 및 Done 2의 일관된 상태 전 새 mutation 차단에 직접 대응하는 회귀입니다. 독립 후속 목표나 contract delta가 아닙니다.

기존 정본 동기화가 알림으로 생긴 후속 변경까지 확인한 뒤 반환하도록 보완하고, snapshot·apply·select·reconcile·undo·redo 경로에서 차단 및 복구를 검증합니다. 새 Host 보정, public API, 상태 flag는 추가하지 않습니다. 수정·CI 재검증 후 merge합니다.

@developer-1px

Copy link
Copy Markdown
Owner Author

재리뷰 대응 완료 — fa8543d0

P1 재현을 기존 synchronizeExternalChange에서 수정했습니다. publish 이후 발생한 문서/history 변경을 다시 확인하고, 이미 성공한 reentrant undo의 선택 복구가 남아 있다면 그 결과를 먼저 완성합니다. 후속 transition에는 최초 알림의 patch를 재사용하지 않습니다.

  • 이번 재리뷰의 신규 회귀 8건: 6개 진입 경로의 실패 차단·복구, 같은 모양의 후속 patch 귀속, subscriber undo의 보류된 선택 복구. 처음 6건은 수정 전 모두 실패했고, 복구 조합 테스트도 실패를 확인한 뒤 수정했습니다.
  • 최종 전체 테스트: 147 files / 1,385 passed / 4 skipped. PR 전체 신규 회귀는 38건입니다.
  • Editing·Collaboration typecheck, 전체 package build, docs:api:check(29 packages / 1,032 exports), docs:evaluate, git diff --check 및 pre-push build 통과.
  • 불필요한 구조 관점도 검토했습니다. 관측된 history status는 자기 결과의 귀속에, 보류된 복구 상태는 성공한 history 작업의 중복 실행 방지에 필요합니다. 새 public API/flag/module이나 Host 우회 구현 없이 기존 owner 안에서 수정했습니다.

기존 head의 전체 CI는 통과했지만 최신 head의 결과를 대신하지 않습니다. 현재 fa8543d0의 CI와 기존 Chrome 소비자 경로를 재검증 중이며, 완료 후 승인된 merge·작업 공간 정리를 진행합니다.

@developer-1px

Copy link
Copy Markdown
Owner Author

최종 리뷰 — merge 진행

검토 대상 head: fa8543d06c0e1332631676f864c60a1a04dfc81e

  • 재리뷰에서 확인한 P1(동기화 알림 중 재진입 변경을 새 명령이 건너뜀)을 수정했고, 보완 과정의 patch 귀속·협업 선택 복구 조합까지 회귀로 고정했습니다. 미해결 blocking finding은 없습니다.
  • 공개 계약의 상태·복구 책임은 기존 Editing/Collaboration owner에 남아 있으며 Host 우회나 불필요한 새 개념을 추가하지 않았습니다. custom EditingHistorychange/status 요구는 문서와 PR 호환성 항목에 명시했습니다.
  • 최종 로컬 전체 테스트 1,385 passed / 4 skipped, PR 신규 회귀 38건. 관련 typecheck/build·API reference·문서 검사 통과.
  • 동일 head의 CI Plan / Package / Site / External kit 모두 SUCCESS. Site 단위 테스트 138 passed, Chrome·Firefox·WebKit 브라우저 검증 212 passed / 4 skipped를 확인했습니다.
  • 기존 Chrome 프로필의 실제 Rich Text에서 DOM 입력 → 원격 변경 → Toolbar Undo → DOM Redo, 원격 텍스트·caret 복원, browser error 0건을 재확인했습니다. Usage의 공개 API import/호출, canonical Source, owner reference 연결도 확인했습니다. 로컬 OS keystroke 권한 제한은 유지했고 권한·프로필을 변경하지 않았습니다.
  • 승인된 Done과 17개 변경 파일을 다시 대조했습니다. Core/wire·제품 UI·Database saved-view와 편집 표현 책임을 정본화한다 #587·refactor(annotation): 선택·gesture·출력의 정본 경계 통합 #589·사용자 자료에 무관한 변경은 없으며 contract delta도 없습니다.

최신 head/base, CI, CLEAN mergeability, review/inline comment, 적용 branch rule을 재확인했습니다. 사용자의 “리뷰 후 merge” 승인에 따라 관리자 우회 없이 squash merge합니다. Site 지연은 runner의 Ubuntu 의존성 다운로드 단계였고 재실행·설정 변경 없이 최종 통과했습니다.

@developer-1px
developer-1px merged commit c051f38 into main Sep 7, 2026
4 checks passed
@developer-1px
developer-1px deleted the issue-719-editing-session-contract branch September 7, 2026 14:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Editing 세션의 관찰·오류 복구·History 귀속·구독 수명을 보완한다

1 participant