You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
동기화가 확정한 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 통과.
기존 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나 독립 후속 목표는 없습니다.
사용자의 “리뷰 후 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합니다.
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·작업 공간 정리를 진행합니다.
검토 대상 head: fa8543d06c0e1332631676f864c60a1a04dfc81e
재리뷰에서 확인한 P1(동기화 알림 중 재진입 변경을 새 명령이 건너뜀)을 수정했고, 보완 과정의 patch 귀속·협업 선택 복구 조합까지 회귀로 고정했습니다. 미해결 blocking finding은 없습니다.
공개 계약의 상태·복구 책임은 기존 Editing/Collaboration owner에 남아 있으며 Host 우회나 불필요한 새 개념을 추가하지 않았습니다. custom EditingHistory의 change/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 권한 제한은 유지했고 권한·프로필을 변경하지 않았습니다.
최신 head/base, CI, CLEAN mergeability, review/inline comment, 적용 branch rule을 재확인했습니다. 사용자의 “리뷰 후 merge” 승인에 따라 관리자 우회 없이 squash merge합니다. Site 지연은 runner의 Ubuntu 의존성 다운로드 단계였고 재실행·설정 변경 없이 최종 통과했습니다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Goal Anchor
Closes #719
원인과 수정
change와 통지 전status를 반환하고 Editing 연결이 전달. undo/redo × 문서 변경/history-only × 관찰/비관찰 재진입 검증협업 undo/redo가 이미 성공한 뒤 선택 복원만 실패하면 작업 결과와 선택 기준을 보관합니다. 다음 읽기는 선택 복원만 재시도하며 history 작업을 반복하지 않습니다. 콜백 예외는 programming error이며 commit 거절인
{ ok: false }와 구분합니다. 정상 완료된 편집은 후속 외부 변경의 선택 보정 실패로 실패 결과가 되지 않습니다.공개 계약과 호환성
EditingHistory성공 결과는{ ok: true, target, change, status }입니다. 직접 구현한 target-only history owner는change: JSONAppliedChange | null과 작업 직후EditingHistoryStatus를 공급해야 합니다.HistoryResult에도 자기change와 불변status가 추가됩니다.status는 해당 작업의 target·depth·revision·canUndo·canRedo이며 구독자 실행 전에 캡처합니다./history를 추가했고 generator는 동일한 root re-export를 중복 설명하지 않습니다. 이에 대한 문서 회귀도 추가했습니다.검증
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통과./editing/rich-text?history=collaboration경로를 제어했습니다. DOMbeforeinput(insertText)→ 원격 변경 수신 → Toolbar Undo → DOMhistoryRedo를 실행해 원격 텍스트 보존, undo 후 caret offset 11, redo 복원을 확인했습니다. 해당 흐름 browser error 0건.editing-index.tsSource의 자기 change 전달,/docs/api/collaborationreference 링크를 확인했습니다.OS 키 입력 자동화는 권한이 없어 unavailable입니다. 권한 변경·새 Chrome 프로필 생성 없이 DOM input event와 실제 toolbar 경로를 검증했습니다. 로컬에서 전체 native-keyboard/cross-browser Playwright suite를 실행한 것으로 보고하지 않습니다. 원격 CI 상태는 PR checks에서 확인할 수 있습니다.
상태
수정 PR 생성까지의 승인 범위이며 merge하지 않았습니다. #587·#589 및 기존 사용자 자료는 보존했습니다. 별도 승인된 contract delta나 독립 후속 목표는 없습니다.