Repository navigation
Core와 주변 편집 경로의 중복 복사·반복 탐색을 줄인다 #737
Copy link
Copy link
Closed
Description
Goal Anchor
- Outcome: 기존 core 정리와 같은 렌즈로 주변 실행 경로의 불필요한 복사·반복 탐색을 줄이고 production 코드를 순감한다.
- Done: P1–P9 수정/상류 해결을 검증하고 U1–U11을 최적화 또는 계약상 필요한 처리라는 근거와 회귀 검증으로 모두 판정한다. 변경 범위의 동작·소유권·history parity와 대량 비용을 확인한다. 공개 capability를 추가하면 owner API·문서·실행 Usage·source 등록을 함께 완성한다.
- Don't: JSON 허용 범위, 오류 우선순위, 입력/스냅샷 격리, history 및 재진입 계약을 약화하지 않는다. 불필요한 fast path나 구조를 추가하지 않는다. 원래 dirty checkout의 문서/다른 작업, 다른 PR, 전체 도메인 알고리즘 재설계는 포함하지 않는다. 새 PR 병합은 별도 승인 전 수행하지 않는다.
승인된 범위
사용자의 same-lens 조사 후 “전부 해결해”, 선행 PR #732에 대해 “merge 하고 진행하자” 승인을 실행한다. #732는 병합되어 Core readPointer/JSON 검증 정본을 사용할 수 있다. 원래 작업 폴더는 보존하고 별도 clean clone에서 기존 core 변경만 선별 이관한다.
확인된 문제
| 묶음 | 책임 | 완료 조건 |
|---|---|---|
| P1 | Editing identity, Object/Tree/Order/Document/Calendar | 배치당 ID 집합 1회, 예약 ID 누적. provider/100회 충돌 제한/parent remap 보존, 정본 API로 통일 |
| P2 | Rich Text snapshot 읽기 | #732 상류 해결의 nested identity/cache, escaped/fragment/외부/history 조회 회귀 확인 |
| P3 | React Hook Form syncPointers | 중복·ancestor 정리의 쌍 비교 제거, root/move/copy/escape/draft 보존 |
| P4 | Collaboration object patch | object key lookup 인덱스와 변경 일관성, MemberId/move 의미 보존 |
| P5 | React Hook Form 초기값 | 같은 snapshot의 rerender 전체 clone 0, 문서/session/formControl 교체와 mutable form 격리 보존 |
| P6 | Editing selection 소유화 | Core 직전 중복 clone 제거, retained snapshot/metadata/undo와 mutable reconciler 격리 유지 |
| P7 | inverse builder | 누적 prefix 복사 제거, operation 역순·step 내부 순서·순차 pre-state/오류 보존 |
| P8 | private history stack | push/pop의 전체 stack 복사 제거, 원자성·재진입·group·외부 무효화 보존 |
| P9 | checkpoint 준비 | 처음 소유화한 payload의 base/membership 재사용, JSON/shape/digest/proof/입력 격리 보존 |
추가 판정 대상
- U1 Rich Text generic apply의 후보와 commit
- U2 Collaboration RFC patch/causal projection/authoritative commit
- U3 Rich Text 내부 patch payload 사전 clone
- U4 React Hook Form diff의 JSON 변환
- U5 다중 caret 치환 오프셋 반복 스캔
- U6 markedSegments interval 반복 비교
- U7 earlierPoint의 반복 logical order 구축
- U8 replacement ID 검증의 removedPaths 반복
- U9 Collaboration 구조 이동 bookkeeping
- U10 history ignore의 inverse 생성
- U11 normalization 반환 value/operations 격리
필요한 경계(C1–C15)는 유지한다: mutable reconciler/form/clipboard 격리, 외부·재진입 transition 재검증, 순차 inverse scratch, Ajv 격리, normalization input 소유권, topology cache, raw source 초기화, 외부 bundle 검증 등.
검증 계획
- 최신 main과 기존 core 변경을 안전하게 통합하고 기존 회귀 테스트를 이관한다.
- 소유 모듈별 원인 수정과 collision/ownership/history/move/JSON 변환 회귀 테스트를 추가한다.
- 대량 입력은 시간뿐 아니라 집합 생성·누적 복사·조회/clone 횟수로 비용을 비교한다. 기존 단일 진단 시간은 제품 end-to-end latency나 성능 보장으로 표현하지 않는다.
- build 후 전체 테스트, package/site typecheck·guard, public API·문서·source 검사 및 diff/순감 확인.
- 결과·필요하여 유지한 경로·검증 한계를 기록하고 commit/push/PR을 연다.
참고 진단: ID 50k+1k 복사에서 Set 1,000회/기존 ID 50,499,500회 처리, form 포인터 5k에서 25,000,000회 비교, object key 5k에서 12,502,500회 비교, 같은 form snapshot 11 rerender에서 전체 clone 11회. 최적화 전 private helper/계측 진단이다.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
developer-1px commentedon Sep 8, 2026
실행 계획 / Goal Anchor 유지
Outcome은 core와 주변 경로의 경량화, Done은 P1–P9 및 U1–U11의 근거 있는 해소와 production 순감이다. JSON/소유권/history 계약과 원래 dirty checkout은 보존한다.
아직 미해결 Done은 본문 P1–P9/U1–U11 전체와 최종 검증이다.
developer-1px commentedon Sep 8, 2026
구현 및 추가 판정
P1 ID 예약 정본과 5개 소비자, P3 form pointer Set/ancestor 확인, P4 object key index, P5 snapshot별 defaultValues 재사용, P6 metadata 중복 복사, P7 inverse 역순 누적, P8 private history push/pop, P9 owned checkpoint 재사용을 구현했다. P2는 #732를 재사용하며 1k/10k nested/fragment snapshot의 topology 생성 0 회귀를 추가했다.
조사 당시 D10으로 본 selection clone은 테스트에서 판정이 뒤집혔다. Calendar/Grid의 anchor/focus/points가 객체를 공유하므로 serialization이 Core가 허용하는 JSON 트리로 변환한다. 이를 제거하면 273개 회귀가 실패했다. 복원을 통해 모두 통과했으며 이 변환은 유지한다. 이미 소유한 selection을 metadata에 다시 복사하던 D11만 제거했다. JSON 허용 범위를 넓히거나 경계를 약화하지 않는 원래 Done에 따른 수정이다.
현재 확인: 전체 157 files / 1,582 tests 통과(기존 4 skipped), 변경 package/site typecheck와 canonical/UI guard 통과, 30 package/1,050 exports 문서 검사 및 standard 검사 통과. 추가한 form 테스트의 optional undefined 타입 표기 오류 1건도 수정 후 재검증했다. 최종 diff, 새 Usage 테스트, 동일 환경 benchmark와 PR 검증은 진행 중이다.
developer-1px commentedon Sep 8, 2026
PR 등록 및 검증
PR #738을 열었다: #738
pr-open, 새 PR merge는 미수행.issue-737-core-adjacent-optimization, head9be88b4f가 remote와 일치한다.성능 재현
Node 24.16.0, 이전 main
be192b20와 이후 head9be88b4f를 각각 자체 lockfile로 설치/build했다. 네 benchmark 파일은 양쪽에서 동일하다. 아래는 warmup 2회, Core 측정 7회, 나머지 5회의 p50/p95다. 초대형 bulk는 개별 helper가 아니라 benchmark에 명시된 실제 호출을 측정했다.Form 5k bulk 전체는 11.03→10.11초로 여전히 느리다. 별도
syncPointers만의 p50은 362.80→1.87ms(1k: 8.27→0.30ms)로 감소했지만, RHFsetValue의 필드별 전체 값 복사가 전체 비용을 지배한다. peer 호환 범위 변경이나 field-state 동기화 재설계는 이번 Done에 추가하지 않았고 새 후속 이슈도 만들지 않았다.초기화 재측정은 순서 교대/매 sample GC/20 sample에서 50k p50 26.65→27.19ms, p95 30.78→29.67ms였다. 모든 경로에 일률적인 개선을 주장하지 않으며, 개선하지 않은 경로의 변동도 원시 출력에 남긴다.
Core 원시 출력 (이전 → 이후)
Editing 원시 출력 (이전 → 이후)
React Hook Form 원시 출력 (이전 → 이후)
Collaboration 원시 출력 (이전 → 이후)
developer-1px commentedon Sep 8, 2026
최종 검증 완료 / pr-open
9be88b4f일치. 새 PR은 병합하지 않았다.developer-1px commentedon Sep 8, 2026
병합 완료
사용자의
merge승인에 따라 PR #738을main에 squash merge했다.a36ab5ebabfc6903ebb7aa57ad8212efe5272d109be88b4f를 고정해 병합했으며, Plan / Package / Site / External kit 모두 통과한 상태였다. 차단 리뷰와 충돌은 없었고 관리자 우회는 사용하지 않았다.MERGED, 이슈 #737은CLOSED임을 확인했다. 별도 프로젝트 항목은 없다.main을 fast-forward하고 clean 상태를 확인했다. 병합 결과의 전체 tree는 검증한 PR head와 동일하다.