Repository navigation
Closed
Description
Goal Anchor
- Outcome: Core 위의 편집 확장들을 조합해도 수정 범위, 노드 identity, domain 유효성, 선택과 관찰 계약이 보존됩니다.
- Done:
- RichText의 escaped subtree 경로가 정확한 대상만 수정합니다.
- Document selection.move와 RichText node.move가 원래 노드 identity를 유지하여 동시 속성 편집을 잃지 않습니다.
- RichText가 잘못된 구조를 만드는 node.remove/node.move 및 public apply를 성공 처리하지 않습니다. 정상 Intent 경로의 같은 검증 누락도 확인하고 막습니다.
- Editing subscriber의 예외와 재진입이 완료된 편집 결과나 알림 순서를 깨지 않으며 snapshot selection 변경이 내부 상태와 history를 오염시키지 않습니다.
- 외부 변경 후 RichText 선택을 현재 topology에 맞게 보정하고, editor 내부 document 구독이 사용 종료 뒤 남지 않습니다.
- 두 RangeSelection family에서 앞 range가 제거되어도 살아남은 primary range identity를 유지합니다.
- Web clipboard binding이 지원하는 편집을 거절했을 때 browser 기본 동작으로 우회하지 못하도록 이벤트를 취소합니다. 지원하지 않는 형식의 pass-through는 유지합니다.
- 각 결함의 pre-fix 실패 / post-fix 성공 회귀 테스트와 관련 전체 테스트·타입·문서 검증으로 확인합니다.
- Don't: Core나 Collaboration wire/schema를 확장하지 않습니다. 외부 변경 시 local inverse history를 초기화하는 기존 정책을 유지하며, 협업 selective history 통합과 의미 기반 외부 selection mapping 프로토콜의 전체 설계는 이번에 포함하지 않습니다. Composer의 인접 JSON 필드 apply, 정상 편집·undo/redo, 기존 public API, incremental typing 성능을 보존합니다. Calendar·Database·Annotation의 미병합 작업을 가져오거나 수정하지 않습니다. merge는 별도 승인 대상입니다.
근거와 정본 경계
사용자 요청: Core 밖 프로토콜 리뷰 후 “개선해줘”.
기준: origin/main 276c955. 기존 1,175 테스트는 통과하지만 public API 재현에서 위 계약 위반이 확인되었습니다.
- RichText diff.ts의 자체 경로 파싱 → Core parsePointer 소비.
- Editing document.ts / RichText editor.ts의 remove+add 이동 → identity 보존 이동.
- RichText validation/topology/editor → domain 성공·실패와 선택 유효성 및 구독 lifecycle.
- Editing session.ts → snapshot/history 소유권과 알림 전달.
- Selection range/index.ts, range/materialized.ts → primary range 대응.
- Web clipboard.ts → 처리 소유권과 default cancellation.
새 보편 Editor/history 추상화나 Host 보완 코드를 만들지 않고 각 기존 owner에서 닫습니다.
검증 범위
public API 회귀 테스트(일반·fresh snapshot·협업 document), 이동과 동시 변경 통합, 구조 실패 원자성, 재진입·구독 해제, 두 range family, clipboard 거절 및 pass-through, 전체 package tests/build, 관련 Site consumer 및 문서 검사.
브라우저 확인 시 기존 Chrome 연결을 우선합니다. 미확인 native 동작은 확인된 것으로 보고하지 않습니다.
Metadata
Metadata
Assignees
Labels
No labels
Activity
developer-1px commentedon Sep 7, 2026
작업 계획
원격 이슈를 다시 읽어 사용자 개선 요청과 Outcome / Done 1–8 / Don't의 양방향 대응을 확인했습니다. 이슈 본문 Goal Anchor를 그대로 실행 계약으로 유지합니다.
기존 Core parsePointer/applyPatch 및 RichText validation/topology, EditingSession, Selection family, Web binding을 재사용합니다. 공통 새 editor/history 계층은 도입하지 않습니다.
pending frontier
위험 게이트
developer-1px commentedon Sep 7, 2026
검증 중간 지점
developer-1px commentedon Sep 7, 2026
구현·검증 완료 후보
원격 Goal Anchor의 Done 1–8 및 Don't와 최종 diff를 다시 대조했습니다. 승인된 계약 변경은 없습니다.
276c955eaad57ef1dbfec4e0462a7540c29f8c4d5114b7d951841e495cbcda7169455140a48e5e37cbd506b05b8e8e11518757b4e0618f0876b14aec완료 근거
parsePointer를 사용해 escaped RichText subtree의 실제 public apply/Intent 수정 범위를 확인했습니다.selection.move와 RichTextnode.move를 JSON Patchmove로 전환했습니다. 원래 노드 identity·동시 속성 수정·추적 pointer·반복 그룹 이동 undo/redo 및 React DOM 순서 회귀를 확인했습니다.실행 결과
npm run test:projects: 131 files / 1,206 passed / 4 skipped. 마지막 source 등록 보완 뒤 재실행했습니다.npm run build, 관련 5개 package test tsconfig: 통과. 마지막 commit은 README·Site source 등록·테스트만 변경하여 package 구현 검증과 동일한 코드를 유지합니다.npm run standard:check: 통과. Core conformance 345 passed / 4 skipped, RichText requirement/vector 검사 통과.npm run docs:api:check(28 packages / 1,008 exports),npm run docs:evaluate,npm run workspace:check: 통과.git diff --check: 통과.성능·호환성·복구 경계
PERF_RICH_TEXT_BLOCKS=100,1000,10000 node packages/json-document-rich-text/benchmarks/editor.mjs는 base와 후보 모두 기존 Core proxy getOwnPropertyDescriptor 오류로 실패합니다.json-document/dist/foundation/json/clone.js:187→ Editing inverse 계산 경로입니다. 이 전체 benchmark를 통과했다고 판단하지 않으며 Core 수정은 이번 Don't 밖입니다.정본·자가 검토와 pending frontier
canonical-module-audit / doubt 관점에서 중복 pointer parser와 shallow validator를 제거하고 기존 owner API를 확장했습니다. 새 보편 Editor/history 계층, Host 우회, 독립 제품 기능은 없습니다.
appliedOperationsFor.from의 실제 React 소비 소스까지 기존 Site 등록 방식으로 연결했습니다.push 직전 remote/base와 모든 worktree·open PR을 다시 확인했습니다. #704 eba5017 / #587 f0d0b09 / #589 4c89fbc7는 그대로이며 기존 unrelated / boundary-overlap 분류를 유지합니다. 후보와의 merge-tree도 각각 3 / 8 / 20개 충돌로 combined 실행은 unavailable입니다. 다른 PR 변경을 가져오거나 충돌을 해결하지 않았습니다. foreign worktree와 untracked 자료는 보존했고, 이번 검증용 임시 baseline worktree만 제거했습니다.
다음은 이 후보를 push하고 PR로 게시하는 단계입니다. merge 권한은 없으며, concurrency/data ownership의 별도 qualified owner review도 merge 전 필요합니다. 자가 검토를 그 승인으로 대체하지 않습니다.
developer-1px commentedon Sep 7, 2026
PR 게시 완료
PR #710을 열었습니다.
5114b7d951841e495cbcda7169455140a48e5e37로 일치합니다. 전용 branchcodex/issue-709-extension-protocol은 push되었고 worktree는 clean입니다.developer-1px commentedon Sep 7, 2026
self-review·merge 후속 승인 및 CI 원인
사용자 후속 요청: “PR하고 self review하고 merge”.
기존 “merge는 별도 승인” 조건에 대해 이번 요청으로 merge 권한을 받았습니다. 직전 보고한 별도 qualified owner review 조건은 이번 요청의 명시적인 self-review 방식으로 이 PR에 한해 대체합니다. GitHub의 강제 승인·보호 규칙을 우회하는 것은 아닙니다. 현재 main protection은 Branch not protected, rulesets는 빈 목록이며 공식 review/comment는 없습니다. 기존 기능 Outcome / Done 1–8 / Don't의 코드 범위는 그대로입니다.
현재 base
276c955e, PR/local head5114b7d9, treecbd506b0는 이전 검증 후보와 동일합니다. #704 / #587 / #589와 다른 worktree의 상태도 변하지 않았습니다.CI는 Site·External kit 통과, Package 실패입니다. 로그에서 추가한
tests/editor-protocol.test.ts가@interactive-os/json-document-collaboration/history를 import하지만 RichText의 devDependencies에 없어서, clean checkout의 선택적 dependency build 후 TS2307이 발생함을 확인했습니다. 이전 전체 build는 이를 가렸습니다.Done 2의 실제 Collaboration 조합 회귀와 Done 8의 clean package 검증에 필요한 test-only dependency를 기존 manifest/lockfile에 선언하겠습니다. runtime peer, public API, Collaboration 구현과 CI 정책은 변경하지 않습니다. 수정 후 dependency build부터 확인하고 원격 CI를 다시 통과시킵니다.
developer-1px commentedon Sep 7, 2026
self-review 발견: public validation의 unknown parent 회귀
validateRichTextNodeAt를 recursive validator로 통합하면서 이전 standalone validator의 unknown parent 검사가 사라졌습니다.schema.nodes에 부모 타입이 없는 provider 조합에서 public 함수가rich-text.schema-violation대신Cannot read properties of undefined (reading 'content')를 throw하는 것을 현재 후보에서 재현했습니다.이는 이 PR의 validator 통합이 만든 회귀이며 Done 3과 Don't의 기존 public API 보존에 직접 해당합니다. 기존 guard를 정본 validator에 복원하고
validateRichTextNodeAt/validateRichTextPath회귀 테스트로 판별하겠습니다. 새 API나 fallback 정책을 만들지 않습니다.developer-1px commentedon Sep 7, 2026
self-review 발견: 비연속 Document 선택 이동 순서
이동 계획을 1–6개 block의 모든 비어 있지 않은 선택 집합·양방향으로 검증하던 중,
[0,1,2,3,4,5]에서[0,3,4]선택을 아래로 옮기면 기존 결과[1,0,3,4,2,5]대신[1,0,3,2,4,5]가 되는 회귀를 재현했습니다. 단순 역순 move는 앞/뒤 방향 이동이 섞인 비연속 선택에서 이미 배치한 노드를 다시 밀었습니다.Done 2의 identity-preserving move 전환이 만든 기존 선택 이동 의미의 회귀이므로 현재 PR에서 수정합니다. 목표 위치보다 뒤에 있는 멤버는 앞에서부터, 앞에 있는 멤버는 뒤에서부터 배치하여 선택한 멤버만 각각 최대 한 번 이동합니다. 새 abstraction 없이 기존 planner 내부에서 닫고, 240개 선택/방향 조합으로 기존 순서·경계 거절·undo/redo·move-only 계약을 확인하겠습니다.
developer-1px commentedon Sep 7, 2026
Merge·정리 완료 — landed-clean
facc55d1418b179cbf121bcf5210623b54dbf39d.8719626f74e669bbc830d97616247254f1143e36와 정확히 같습니다.8bf79847c9024bd22c56b258a6027299f62eb221의 Plan / Package(전체 release graph) / Site(전체 browser suite) / External kit가 모두 통과했습니다./Users/user/Desktop/@interactive-os/json-document-issue-709는 clean 상태 확인 후 제거했고, 등록과 디스크에서 모두 사라진 것을 확인했습니다. 로컬·원격codex/issue-709-extension-protocolbranch도 제거했습니다. 소스와 원래 후보 commit은 merged PR 기록에서 복구할 수 있습니다.json-document-issue-705의 local main checkout은 다른 workflow 소유이므로 fast-forward하지 않았습니다. authoritativeorigin/main은 위 merge commit으로 갱신했습니다.기존 RichText 전체 benchmark의 Core proxy 오류와 공개 배포본/native 입력 검증 제한, 전체 의미 기반 selection mapping·selective collaborative history 제외는 앞선 기록 그대로이며, 이를 이번 merge로 해결했다고 주장하지 않습니다.