Repository navigation
Closed
Description
Goal Anchor
- Outcome: FE 편집 프로토콜 리뷰에서 확인한 조합 결함을 해결하여, 공개 editor를 local·독립 JSONDocument·collaboration과 조합해도 변경 동등성, domain identity, selection과 undo의 의미를 보존합니다.
- Done: 아래 1~6의 재현과 실제 consumer 검증을 닫고, 변경한 공개 계약의 owner reference·Usage·source registration을 갖춘 PR을 엽니다.
- Don't: Core의 six-member·23-symbol 표면, JSON Patch 의미와 Collaboration wire를 확장하지 않습니다. Domain별 selection 의미와 플랫폼 경계를 유지하며 Host에 history·mapping 우회를 만들지 않습니다. 기존 Annotation Annotation Hand 책임을 정본 모듈로 수렴한다 #588/refactor(annotation): 선택·gesture·출력의 정본 경계 통합 #589 및 Database Database saved-view와 편집 표현 책임을 정본 모듈로 수렴한다 #586/#587의 미병합 작업을 포함하지 않습니다. npm 배포와 merge는 하지 않습니다.
승인 근거와 범위
사용자가 FE 편집의 표준 프로토콜 관점 review/smell check 결과를 받은 뒤 “진행해 도와줘”로 실행을 요청했습니다. 이 이슈는 리뷰 1~6과 그 계약을 완성하는 데 필요한 public closure를 담당합니다. A2UI 책임 배치(리뷰 7)는 독립 이슈/PR로 처리합니다. Temporal dependency는 검토 후보이며 이 이슈에서 배포 구조를 재편하지 않습니다.
완료 조건
- Core: 최종 JSON 값이 동일한 복합 add/remove/replace batch는 빈 applied change와 무통지를 반환합니다. reference와 독립 구현의 관찰 결과가 같아야 합니다.
- Editing transaction/history: commit 중 subscriber가 만든 외부 변경을 자기 변경으로 흡수하지 않습니다. move/copy의 undo가 다른 필드의 변경을 지우지 않고, subscriber 등록 순서에 관계없이 결과 snapshot과 notification의 시점/순서가 일관되어야 합니다.
- Domain identity: Document·Order·Object·Tree·Calendar의 기본 ID 생성이 동시 replica 생성·병합 및 재생성 뒤에도 충돌하지 않습니다. 기존 createId 주입점과 domain identity 유효성을 유지하고 ID 기반 명령의 대상이 유일해야 합니다.
- Selection: Document·Order·Object·Sheet·Tree·Database·Kanban·Calendar·Annotation은 외부 삭제 뒤 유효한 selection을 publish합니다. Rich Text는 외부 text 변경을 통과한 위치를 보존합니다. 공통 Editing이 변경 전 값·applied change·변경 후 값의 mapping 경계를 소유하고 domain별 해석은 domain owner에 둡니다.
- History 연결: 기존 Editing과 Collaboration selective history를 공식 API로 연결해 toolbar·Cmd/Ctrl+Z·native history input·canUndo/canRedo·selection 복원이 같은 history를 사용하도록 합니다. Local 기본 사용은 계속 지원하고, 협업 문서를 넣는 것만으로 local inverse history가 selective history인 것처럼 동작하지 않게 합니다.
- 검증: 같은 실제 editor 시나리오를 local·독립 구현·collaboration에 주입해 조합 계약을 검증합니다. 영향을 받는 실제 사이트 입력 경로를 확인하고, synthetic 이벤트와 native/실기기 증거를 구분합니다. 사용할 수 없는 브라우저/실기기 기능을 성공이나 지원 증거로 보고하지 않습니다.
재현 근거
{ x: 1 }에/tempadd 후 remove: reference는 applied 2개·notification 1회, 독립 구현은 applied 0개·무통지.- 목록 move의 document subscriber가
other: 0 → 99를 commit하면 session undo가other까지 0으로 복원. - 두 Document replica에서 각각 block.insert: 병합 후
block-1이 중복되고 text.replace가 첫 블록만 수정. - 선택한 블록을 외부에서 삭제하면 snapshot.selection이 삭제된 blockId를 보존.
ab|cd앞에 외부X삽입 뒤!를 입력하면Xa!bcd가 됨.- remote change 뒤 editor.undo는 history.empty이지만 같은 runtime.history.undo는 내 변경만 정상 취소. Rich Text Web은 editor.undo를 직접 호출.
완료 증거
- 각 원인에 대한 실패→통과 회귀 및 구현 간 동일 시나리오.
- 영향 package test/typecheck/build, standard:check, workspace:check, API reference/문서·site guard.
- 전체 diff와 기존 consumer의 호환성 검토, 실제 사이트 경로 및 사용 불가 검증 기록.
- Issue↔PR의 완료 조건과 구현/검증 대응 확인.
Metadata
Metadata
Assignees
Labels
No labels
Activity
developer-1px commentedon Sep 7, 2026
작업 시작
Goal Anchor
이슈 본문의 1~6 완료 조건과 재현을 원격 read-back으로 확인했습니다. 기준은 최신
origin/main의058422f3964d3be9b0ffeb4310aa21270e991649, 작업 branch는issue-713-editing-protocol-composition입니다. 기존 사용자 checkout의 untracked 자료와 미병합 PR은 보존합니다.검증은 각 반례의 실패→통과, local/independent/collaboration 공통 consumer, 영향 package typecheck/build/tests, standard/workspace/docs/site guards와 실제 사이트 입력을 사용합니다. 브라우저는 기존 Chrome profile을 우선 사용하며 synthetic/native/unavailable을 구분합니다. 외부 팀 채택이나 실기기 지원을 새로 주장하지 않습니다. A2UI의 독립 작업은 #714가 소유합니다.
developer-1px commentedon Sep 7, 2026
검증 중간 기록
원래 Goal Anchor와 완료 조건은 유지합니다. #714 A2UI는 이 PR에 포함하지 않습니다.
EditingHistory계약과 Collaboration의/editing연결을 추가했습니다. local 기본은 유지하며, 협업 provider의 undo 단위는 native history와 같은 인과 commit 하나입니다. localhistoryGroup으로 wire 기여를 합치지 않습니다. external history에서 기록을 생략하려는 plan은 변경 전에 명시적으로 거절합니다.큰 snapshot 조합에서 확인한 필수 후속 수정
성능 검사의 두 번째 block split/undo에서 Core가 만든 큰 배열 snapshot을
createJSONDocument(snapshot)에 재입력하면 Proxy descriptor 예외가 재현되었습니다. 새 inverse가 공개 Core snapshot을 정상 소비하는 데 필요한 경계이므로 완료 조건 1~2 및 구현 교체 invariant의 필수 의존성으로 수정합니다. Editing에 별도 JSON 복사 우회를 넣지 않고 Core의 기존 shared-array owner에서 내부 slot 읽기를 제공하여 JSON validation/clone이 동일 owner를 사용하게 했습니다. 64/512/4096 항목 snapshot 재입력 및 반복 split/undo 회귀를 추가했으며 검증 중입니다. 공개 Core/wire 계약은 바꾸지 않습니다.브라우저 증거 구분
기존 사용자의 Chrome profile에서 이 작업트리 서버의 Rich Text 협업 모드를 열었습니다. 실제 React 페이지에서 합성 beforeinput으로
Ca!nonical Rich Text입력 → 원격 삽입remote · Ca!nonical Rich Text→ toolbar Undo로remote · Canonical Rich Text/offset 11 → historyRedo로 내 입력과 offset 12 복원을 확인했습니다. 합성 Meta+Z도 처리되며 페이지 error/unhandledrejection 기록은 비어 있습니다.macOS System Events 키 입력은 권한 오류 1002로 unavailable입니다. 새 Chrome profile을 만들거나 로그인 상태를 바꾸지 않았습니다. 이 기록은 실제 페이지의 합성 입력 검증이지 OS 키 입력·실기기 IME 지원 증거가 아닙니다. 전체 Playwright browser suite 실행 완료로 보고하지 않습니다.
남은 일: 최신 Core 회귀/성능·전체 diff self-review, source UI 확인, 최종 검증·commit·push·PR, 이후 독립 #714 구현.
developer-1px commentedon Sep 7, 2026
PR 열림
PR: #715 —
51265ea926005608b7981d1048ce51e7793e2f69이슈 본문과 PR 원격 read-back, 54개 changed path, 실제 테스트·build 증거를 대응 확인했습니다. 완료 조건 1~6은 PR의 결과 표에 연결되어 있습니다. merge·npm 배포는 하지 않았습니다.
test:projects: 142 files, 1317 passed / 4 skipped.CI는 PR 생성 직후 진행 중입니다. 작업트리는 clean이며 로컬 HEAD와 원격 PR head가 일치합니다. 독립 #714 A2UI 정본화는 이어서 진행합니다.
developer-1px commentedon Sep 7, 2026
CI 후속 검증
완료 조건 5~6의 공개
/editing소비 경로가 clean CI에서 typecheck되지 않는 설정 누락을 확인했습니다. 로컬 build 산출물이 문제를 가렸으며 Sitetsconfig.paths에도 source entry를 등록해 수정했습니다.aa8a43ab402835e91b76ec551f70e2f2fefe02f6Verify site단계(typecheck·tests·Pages 검증)는 통과했으며 browser 단계는 진행 중입니다.PR은 열린 상태이며 merge는 하지 않았습니다.
developer-1px commentedon Sep 7, 2026
리뷰·merge 단계 시작
사용자가 “리뷰 하고 merge”로 두 PR의 리뷰·merge를 명시적으로 승인했습니다.
승인된 contract delta
PR #715의 원격 본문·head·리뷰·CI와 로컬 diff를 다시 확인했습니다. 현재 외부 리뷰/inline comment는 없습니다. 이슈 범위의 구현·public closure를 검토하고 CI 실패를 재현·분류합니다. 관리자 우회 없이 검증된 head만 merge합니다.
External kit의 keyboard focus 실패는 첫 실행에서는 통과했고 마지막 runtime 변경 없는 재실행에서 실패했습니다. 완료된 job을 재실행하여 일시 실패인지 확인하며, 새 기능 변경의 근거로 사용하지 않습니다.
developer-1px commentedon Sep 7, 2026
리뷰 발견: 배열 조상 위치로 move한 뒤 undo 불일치
P1 / 완료 조건 2의 직접 gap.
{ a: [{ x: 1 }] }에서move /a/0/x → /a/0는{ a: [1, {}] }가 됩니다. 현 inverse는 조상 경로라는 이유로replace /a/0만 생성하여 undo 결과가{ a: [{ x: 1 }, {}] }로 남습니다.원인은 조상 destination이 object/root replacement인지 array insertion인지 구분하지 않은 것입니다. 새 추상화 없이 기존 inverse owner에서 destination container를 구분하고 array insertion은 이미 있는 역방향 move 경로를 사용합니다. root snapshot fallback은 추가하지 않습니다.
4개 document fixture의 유효한 move/copy 884개를 대조하여 동일 원인의 실패 8개를 확인했습니다. source 자체가 없는 self-move는 이 새 inverse의 유효 입력 검증 범위에서 제외했으며 Core의 기존 유효성 동작을 이 수정에 섞지 않습니다.
회귀 추가 → 실패 확인 → owner 수정 → 전체 matrix/관련 package 검증 순서로 진행합니다. 별개 External kit CI의 포커스 실패는 재실행에서 통과했고 검사 코드를 바꾸지 않았습니다.
fix(editing): 배열 조상으로 이동한 값의 undo를 복원한다 (#713)
developer-1px commentedon Sep 7, 2026
merge 전 리뷰 수정·검증
원래 완료 조건 2에 해당하는 배열 조상 move의 inverse 결함을 수정했습니다. 회귀 4개가 모두 실패함을 확인한 뒤 수정하여 통과했습니다.
remove destination→add original source로 복원합니다. 처음 검토한 단일 역방향 move는 자기 하위 경로로의 이동이 되어 JSON Patch에서 거절되므로 사용하지 않습니다. root snapshot fallback이나 새 공개 API를 추가하지 않았습니다.test:projects: 142 files, 1321 passed / 4 skipped.git diff --check통과. 수정은 inverse owner와 기존 regression table 두 파일뿐입니다.doubt관점에서 public history 연결·identity owner·domain mapping은 각각 이슈의 직접 계약을 소유하므로 유지했습니다. 이번 역변환 수정은 기존 owner 안에서 해결하여 별도 abstraction·fallback을 만들지 않았습니다.사용자의 “리뷰 하고 merge”에 따라 원래 PR-open 종료 조건만 review·merge·merged workspace 정리로 확장됐고 npm 배포 제외는 유지됩니다.
최신 main의 A2UI Connector를 편집 프로토콜 검증 기준에 반영한다 (#713)
developer-1px commentedon Sep 7, 2026
최신 main과 조합 검증
#716의 최종 CI 통과와 merge를 확인한 뒤, 그 merge commit
f281280151742d947047d3f12edacf4ce7660527을 #715 branch에 일반 merge로 반영했습니다. force push는 하지 않았습니다. #715의 기준 diff는 여전히 원래 편집 조합 계약 55개 path이며 별도 A2UI 구현 변경을 추가하지 않았습니다.98e4505f0b79dd346a0b9f3d22fbae46c19b1c8b.npm 배포 제외와 Core 공개 계약 보존은 유지합니다.
developer-1px commentedon Sep 7, 2026
merge 확인
PR #715을 최신 main과 조합한 검증 head
98e4505f0b79dd346a0b9f3d22fbae46c19b1c8b에서 squash merge했습니다. 관리자 우회는 사용하지 않았습니다.5df3b687555eb9aa9cd6a2e93db7ec02dc9c200fMERGED, 이슈 편집 프로토콜의 구현 간 동등성과 조합 안전성을 보장한다 #713CLOSED확인.mainfast-forward와 검증된 merged 작업트리/branch 정리를 마무리합니다.developer-1px commentedon Sep 7, 2026
작업 공간 정리 완료 — landed-clean
MERGED, #713과 #714는 모두CLOSED입니다.main과origin/main은5df3b687555eb9aa9cd6a2e93db7ec02dc9c200f로 일치합니다. 최종 PR 검증 head와 merge 후 main의 파일 tree가 동일함을 확인했고 main 전체 build도 통과했습니다.