Repository navigation
Closed
Labels
bugSomething isn't workingSomething isn't working
Description
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는 별도 승인 대상으로 둡니다.
승인과 근거
사용자는 위 4건의 리뷰와 “이 4건의 회귀 테스트와 정본 구현·계약 보완” 제안 뒤 “응 진행해”라고 실행을 승인했습니다. 기준 main은 08de2da6f45dd42714c89046b95e18963763a62f입니다.
- 먼저 등록된 document 구독자가
session.snapshot을 읽으면 상태·revision은 바뀌지만 Editing 구독자 알림이 누락됩니다. Core와 Collaboration 문서 모두 재현했습니다. - 로컬
n: 0 → 1, 외부1 → 2에서reconcileSelection예외를 주입하면 관측값만 갱신되고 local inverse history가 남습니다. 뒤따르는 undo가 외부 값2를0으로 덮어씁니다. 관찰 중이면 document의 observer 격리가 예외를 삼킵니다. - 문서 값이 바뀌지 않는 인과적 undo 도중 replica 구독자가
/other = 99를 기록하면 undo 결과의change와 snapshot이 그 별도 쓰기를 자기 작업으로 흡수합니다. 세션이 첫 document 알림을 자기 변경이라고 추정합니다. - 같은 콜백으로 구독 → 해제 → 재구독 → 이전 해제 함수 재호출을 하면 새 구독까지 제거됩니다. Core의 해제 함수는 재호출을 방어하지만 Editing은 방어하지 않습니다.
완료 조건
- 다른 구독자의 snapshot 읽기 순서가 Editing 알림을 누락시키지 않으며 재진입 알림의 revision 순서와 자기 작업 결과를 보존합니다.
- 선택 mapping/reconciliation 실패가 부분 상태나 안전하지 않은 local undo를 남기지 않습니다. 실패 후 읽기·편집·undo/redo 및 복구 의미를 정본 계약으로 설명하고 관찰/비관찰 경로에서 검증합니다.
- 협업 undo/redo 결과는 자기 작업의 변경만 나타내며, 값이 바뀌지 않는 history 작업과 재진입 외부 쓰기를 구분합니다. 필요한 계약 보완은 기존 Editing/Collaboration owner와 공개 연결부에 둡니다.
- 구독 해제는 반복 호출해도 새 구독을 끊지 않으며 마지막 observer 해제, 재구독, editor 재생성의 정상 수명을 보존합니다.
- 관련 package 회귀, React 소비자, typecheck/build, 문서/API reference 및 기존 Usage/Source 연결을 검증합니다. 기존의 잘못된 patch·test·validator 거절 원자성과 선택적 undo의 원격 변경 보존도 유지합니다.
범위
주요 owner는 packages/json-document-editing의 session/history와 packages/json-document-collaboration의 history/runtime 공개 연결부입니다. 소비 검증은 기존 React 연결 및 협업 Rich Text Usage를 사용합니다. 수정 책임을 Demo나 Host로 이동하지 않습니다. 전체 저장소의 별도 Host 우회 감사나 새로운 기능은 이 이슈의 완료 조건이 아닙니다.
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working
Activity
developer-1px commentedon Sep 7, 2026
작업 계획 — 진행 중
Goal Anchor
원격 issue 본문을 다시 읽고 승인된 4개 반례·완료 조건과 양방향 대조했습니다. 연결된 Project 항목은 없으므로 이 댓글로 진행 상태를 기록합니다.
관찰/비관찰, 읽기/쓰기 재진입, history-only/문서 변경 undo·redo를 구분해 검증합니다. 기존 patch/validator 거절 원자성, 원격 쓰기 보존, 불변 snapshot, FIFO 알림, 정상 구독 해제·editor 재생성을 회귀 경계로 유지합니다.
현재 main의 tracked/staged 변경은 없고 개인 untracked 자료 4개는 보존합니다. 별도 worktree에서 자체 lockfile로 의존성을 설치합니다. 필요한 history 결과 계약 보완은 owner의 API reference와 기존 Usage/Source 등록까지 함께 확인하며 Core/wire에 새 식별자를 넣지 않습니다. 승인된 contract delta와 별도 후속 목표는 없습니다.
developer-1px commentedon Sep 7, 2026
구현 경과
승인된 반례를 고정한 신규 테스트에서 수정 전 20건이 실패했고(Editing 8, Collaboration 11, React 소비자 1), 수정 후 관련 420건 및 이후 전체 1,372건이 통과했습니다. 4개 기존 skip은 유지했습니다. 신규 테스트의 숫자 literal 추론 오류도 고쳐 Editing·Collaboration·React typecheck를 다시 통과시켰습니다.
change(history-only면null)와 통지 전status를 제공하고 공식 Editing 연결이 이를 전달합니다.EditingHistory의 target-only 구현체는 두 필드를 공급해야 합니다. Core와 collaboration wire는 그대로입니다.문서 연결의 필수 보완
Done 3·5의 HistoryResult 계약을 문서화하는 과정에서 기존 API reference 등록이 Collaboration root와
/editing만 포함하고/history를 누락한 것을 확인했습니다. 변경하는 HistoryResult의 owner reference를 닫기 위해/historyentrypoint를 기존 등록에 추가합니다. 기존 root re-export를 중복 설명하지 않도록 generator는 같은 export symbol을 제외합니다. 새 API catalog나 다른 subpath 감사로 범위를 넓히지 않습니다.남은 검증은 기존 Chrome 프로필의 협업 Rich Text 실제 경로, 수정된 API reference/문서 검사, 최종 diff·범위 대조입니다. 승인된 contract delta와 독립 후속 작업은 없습니다.
developer-1px commentedon Sep 7, 2026
완료 조건 검증
workspace:check: 29 libraries.standard:check: Core 1 entrypoint / 23 exports / six-member / 0 runtime peers 유지, Core conformance 347 passed / 4 skipped.docs:api:check: 29 packages / 1,032 documented exports./history의 7개 고유 export를 owner reference에 포함했고 root re-export 중복은 없습니다.docs:evaluate,site:verify:pages의 build·artifact 평가·HTTP smoke 통과.beforeinput(insertText)→ 원격 변경 수신 → Toolbar Undo → DOMhistoryRedo를 실행해remote · Ca!nonical Rich Text→remote · Canonical Rich Text→ 원상 복원 및 undo 후 caret offset 11을 확인했습니다. 해당 흐름의 browser error는 0건입니다.createCollaborationEditingHistory(local)소비, 연결부 Source 등록과 owner API reference 링크를 확인했습니다. Demo/Host에 보정 로직을 추가하지 않았습니다.OS 수준 키 입력 자동화는 현재 권한이 없어 unavailable입니다. 권한을 변경하거나 새 Chrome 프로필을 만들지 않았으며, 위 브라우저 증거는 DOM input event·실제 toolbar 흐름입니다. 로컬에서 새 Playwright 프로필의 전체 native-keyboard/cross-browser suite를 실행한 것으로 보고하지 않습니다.
전체 diff를 4개 반례와 필수 문서 연결에 대조했습니다. Core/wire, lockfile, 제품 UI, #587·#589 및 사용자 개인 파일은 변경하지 않았습니다. 이제 commit·push·PR read-back을 진행하며 merge는 하지 않습니다.
developer-1px commentedon Sep 7, 2026
PR 생성 — pr-open
PR: #720
Branch:
issue-719-editing-session-contractCommit:
934a71701421d62a7159077c73443f08e5173058원격 issue 본문, PR 본문·17개 변경 파일·closing issue 연결·head를 다시 읽었습니다. 완료 조건 1~4는 정본 구현과 신규 회귀에, 조건 5는 React/브라우저 소비자·owner 문서 등록·검증 결과에 연결됩니다. 모든 변경이 승인된 4개 반례 또는 그 계약의 필수 문서 연결에 대응하며 별도 목표를 추가하지 않았습니다.
로컬 worktree는 clean이고 PR head와 같습니다. 전체 테스트 1,377 passed / 4 skipped, 관련 typecheck/build·문서·Pages 검증과 기존 Chrome DOM/Toolbar 경로 검증을 완료했습니다. 직접 구현한 EditingHistory owner의
change/status추가 요구는 PR 호환성 항목에 명시했습니다.원격 CI가 시작됐으며 완료 결과는 아직 대기 중입니다. OS native keystroke 검증 제한은 이전 보고와 같습니다. Project 연결 항목은 없으며 issue는 PR 대기 상태로 열어 둡니다. Merge는 승인 범위가 아니므로 수행하지 않았고, 검증 화면과 작업 공간은 유지합니다.
fix: 동기화 알림의 재진입 변경을 명령 전에 처리한다
Editing 세션의 관찰·오류 복구·History 귀속·구독 수명을 보완한다 (#720)
developer-1px commentedon Sep 7, 2026
완료 — landed-clean
PR #720을 사용자 승인에 따라 squash merge했습니다.
c051f380a4867b6734f42f4b86c7182d13c321c5fa8543d06c0e1332631676f864c60a1a04dfc81eMERGED, 이슈CLOSED를 확인했고 연결된 Project 항목은 없습니다.미해결 blocking finding이나 승인된 별도 후속 목표는 없습니다. custom
EditingHistory의change/status구현 요구는 공개 계약의 호환성 주의점으로 유지됩니다.