Skip to content

Core와 주변 편집 경로의 중복 복사·반복 탐색을 줄인다 #737

Closed

Description

@developer-1px

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 검증 등.

검증 계획

  1. 최신 main과 기존 core 변경을 안전하게 통합하고 기존 회귀 테스트를 이관한다.
  2. 소유 모듈별 원인 수정과 collision/ownership/history/move/JSON 변환 회귀 테스트를 추가한다.
  3. 대량 입력은 시간뿐 아니라 집합 생성·누적 복사·조회/clone 횟수로 비용을 비교한다. 기존 단일 진단 시간은 제품 end-to-end latency나 성능 보장으로 표현하지 않는다.
  4. build 후 전체 테스트, package/site typecheck·guard, public API·문서·source 검사 및 diff/순감 확인.
  5. 결과·필요하여 유지한 경로·검증 한계를 기록하고 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/계측 진단이다.

Activity

  1. developer-1px commented on Sep 8, 2026

    @developer-1px
    OwnerAuthor

    실행 계획 / Goal Anchor 유지

    Outcome은 core와 주변 경로의 경량화, Done은 P1–P9 및 U1–U11의 근거 있는 해소와 production 순감이다. JSON/소유권/history 계약과 원래 dirty checkout은 보존한다.

    아직 미해결 Done은 본문 P1–P9/U1–U11 전체와 최종 검증이다.

  2. developer-1px commented on Sep 8, 2026

    @developer-1px
    OwnerAuthor

    구현 및 추가 판정

    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에 따른 수정이다.

    추가 항목 최종 판정
    U1 임시 JSONDocument/commit을 기존 stateless applyPatch/readPointer로 대체. Rich Text 후보 검증과 authoritative commit은 각각 유지
    U2 유지. RFC 결과, MemberId 기반 causal translation/projection, canonical commit은 다른 계약. 6-member API 밖 prepared transaction을 추가하지 않음. validation/atomicity/convergence 회귀로 검증
    U3 내부 Rich Text patch 사전 clone 제거. Core payload 소유화가 경계이며 입력·retained change·undo/redo 격리 회귀 추가
    U4 유지. Date→문자열 및 optional undefined 제거라는 form JSON 변환을 수행. 회귀 추가
    U5 누적 그룹 배열 copy와 caret별 전체 재탐색 제거. stable 정렬과 같은 start 그룹별 누적 shift, 동시/겹친 range 회귀
    U6 정렬·병합된 disjoint interval을 cursor로 한 번 통과. 겹친/분리 range의 mark 결과 회귀
    U7 selection range마다 구축하던 logical order를 batch당 한 번으로 이동. incremental topology의 order는 새 노드에서 -1일 수 있어 그대로 대체하지 않음
    U8 유지. private caller 3곳의 removedPaths는 0–2개로 고정되어 대량 쌍 비교가 아님. 살아 있는 중복 ID, split/join/insert 회귀로 검증
    U9 object key/staging key lookup은 P4로 개선. array 위치·retain/vacate는 이동 중 현재 상태와 rescue 순서의 책임이므로 유지. key swap, escaped/mixed moves, parent replacement 회귀
    U10 local history ignore는 사용하지 않는 inverse 생성 생략. canonical 실패/redo 유지와 inverse 조회 0 회귀. external history ignore 거절 유지
    U11 유지. public normalization value와 operations는 독립 결과다. 한쪽 payload/원본을 변경해도 다른 쪽이 보존되는 회귀 추가

    현재 확인: 전체 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 검증은 진행 중이다.

  3. developer-1px commented on Sep 8, 2026

    @developer-1px
    OwnerAuthor

    PR 등록 및 검증

    PR #738을 열었다: #738

    • 상태: pr-open, 새 PR merge는 미수행.
    • branch issue-737-core-adjacent-optimization, head 9be88b4f가 remote와 일치한다.
    • Core와 주변 편집 경로의 중복 복사·반복 탐색을 줄인다 #737 연결, 47개 변경 파일과 계약/검증의 양방향 대응을 확인했다.
    • 전체 157 files / 1,583 tests(기존 4 skipped), build/typecheck/guard, 문서/표준/tarball/site 정적·HTTP 검증 통과.
    • 무작위 patch 10,000건 결과/오류/commit/value parity 및 협업 soak 24×96 통과.
    • production −1,389줄(기존 core −1,360, 주변 −29); 테스트 등을 포함한 전체 −585줄.
    • P1–P9/U1–U11의 해소·필요 처리 재분류는 앞의 항목별 판정과 PR에 기록했다. original dirty checkout은 보존했다.
    • GitHub CI는 현재 실행 중이며 아직 통과로 보고하지 않는다. 실제 Chrome 조작은 기존 profile로 확인 중이다.

    성능 재현

    Node 24.16.0, 이전 main be192b20와 이후 head 9be88b4f를 각각 자체 lockfile로 설치/build했다. 네 benchmark 파일은 양쪽에서 동일하다. 아래는 warmup 2회, Core 측정 7회, 나머지 5회의 p50/p95다. 초대형 bulk는 개별 helper가 아니라 benchmark에 명시된 실제 호출을 측정했다.

    PERF_ITEMS=1000,10000,50000 PERF_ROUNDS=7 PERF_WARMUPS=2 node packages/json-document/benchmarks/core.mjs
    PERF_EDITING_ITEMS=1000,10000,50000 PERF_ROUNDS=5 PERF_WARMUPS=2 node packages/json-document-editing/benchmarks/editors.mjs
    PERF_RHF_ITEMS=1000,5000 PERF_ROUNDS=5 PERF_WARMUPS=2 node packages/json-document-react-hook-form/benchmarks/form.mjs
    PERF_COLLABORATION_ITEMS=1000,5000 PERF_COLLABORATION_CHANGES=100,1000 PERF_ROUNDS=5 PERF_WARMUPS=2 node packages/json-document-collaboration/benchmarks/runtime.mjs

    Form 5k bulk 전체는 11.03→10.11초로 여전히 느리다. 별도 syncPointers만의 p50은 362.80→1.87ms(1k: 8.27→0.30ms)로 감소했지만, RHF setValue의 필드별 전체 값 복사가 전체 비용을 지배한다. peer 호환 범위 변경이나 field-state 동기화 재설계는 이번 Done에 추가하지 않았고 새 후속 이슈도 만들지 않았다.

    초기화 재측정은 순서 교대/매 sample GC/20 sample에서 50k p50 26.65→27.19ms, p95 30.78→29.67ms였다. 모든 경로에 일률적인 개선을 주장하지 않으며, 개선하지 않은 경로의 변동도 원시 출력에 남긴다.

    Core 원시 출력 (이전 → 이후)
    이전
    json-document v3 public-root benchmark
    items=1000,10000,50000 rounds=7 warmups=2
    
    items=1000
    createJSONDocument: p50=0.477ms p95=0.991ms
    applyPatch single leaf replace: p50=0.794ms p95=1.041ms
    commit single leaf replace: p50=0.019ms p95=0.028ms
    commit 1000 leaf replaces: p50=52.669ms p95=57.821ms
    commit 1000 equivalent leaf replaces: p50=52.973ms p95=55.213ms
    commit 1000 root object writes: p50=1.574ms p95=1.792ms
    commit 1000 appends and descending removes: p50=2.501ms p95=2.841ms
    query direct item: p50=0.002ms p95=0.020ms
    
    items=10000
    createJSONDocument: p50=3.161ms p95=4.257ms
    applyPatch single leaf replace: p50=4.593ms p95=7.990ms
    commit single leaf replace: p50=0.007ms p95=0.008ms
    commit single leaf replace budget: 0.007ms <= 6.000ms
    commit 1000 leaf replaces: p50=53.285ms p95=65.152ms
    commit 1000 equivalent leaf replaces: p50=47.466ms p95=48.314ms
    commit 1000 root object writes: p50=17.676ms p95=17.917ms
    commit 1000 appends and descending removes: p50=2.519ms p95=3.322ms
    query direct item: p50=0.002ms p95=0.003ms
    
    items=50000
    createJSONDocument: p50=15.956ms p95=19.269ms
    applyPatch single leaf replace: p50=25.211ms p95=30.086ms
    commit single leaf replace: p50=0.057ms p95=0.075ms
    commit single leaf replace budget: 0.057ms <= 30.000ms
    commit 1000 leaf replaces: p50=110.919ms p95=113.432ms
    commit 1000 equivalent leaf replaces: p50=108.847ms p95=114.169ms
    commit 1000 root object writes: p50=278.361ms p95=368.708ms
    commit 1000 appends and descending removes: p50=6.130ms p95=9.508ms
    query direct item: p50=0.001ms p95=0.001ms
    
    leaf commit scaling
    1000->10000: size=10.0x p50=0.37x p95=0.28x
    10000->50000: size=5.0x p50=8.23x p95=9.43x
    
    이후
    json-document v3 public-root benchmark
    items=1000,10000,50000 rounds=7 warmups=2
    
    items=1000
    createJSONDocument: p50=0.486ms p95=0.607ms
    applyPatch single leaf replace: p50=0.554ms p95=0.974ms
    commit single leaf replace: p50=0.020ms p95=0.026ms
    commit single leaf replace budget: 0.020ms <= 0.600ms
    commit 1000 leaf replaces: p50=45.475ms p95=47.579ms
    commit 1000 equivalent leaf replaces: p50=0.952ms p95=1.039ms
    commit 1000 root object writes: p50=0.668ms p95=1.477ms
    commit 1000 appends and descending removes: p50=1.038ms p95=2.832ms
    query direct item: p50=0.002ms p95=0.012ms
    
    items=10000
    createJSONDocument: p50=2.986ms p95=3.913ms
    applyPatch single leaf replace: p50=4.528ms p95=8.666ms
    commit single leaf replace: p50=0.010ms p95=0.020ms
    commit single leaf replace budget: 0.010ms <= 6.000ms
    commit 1000 leaf replaces: p50=45.073ms p95=50.834ms
    commit 1000 equivalent leaf replaces: p50=0.972ms p95=2.079ms
    commit 1000 root object writes: p50=2.273ms p95=3.046ms
    commit 1000 appends and descending removes: p50=1.620ms p95=3.041ms
    query direct item: p50=0.003ms p95=0.004ms
    
    items=50000
    createJSONDocument: p50=18.612ms p95=27.587ms
    applyPatch single leaf replace: p50=27.129ms p95=32.709ms
    commit single leaf replace: p50=0.052ms p95=0.082ms
    commit single leaf replace budget: 0.052ms <= 30.000ms
    commit 1000 leaf replaces: p50=102.839ms p95=109.196ms
    commit 1000 equivalent leaf replaces: p50=0.943ms p95=1.031ms
    commit 1000 root object writes: p50=18.568ms p95=20.624ms
    commit 1000 appends and descending removes: p50=5.064ms p95=7.887ms
    query direct item: p50=0.001ms p95=0.001ms
    
    leaf commit scaling
    1000->10000: size=10.0x p50=0.48x p95=0.77x
    10000->50000: size=5.0x p50=5.46x p95=4.10x
    
    
    Editing 원시 출력 (이전 → 이후)
    이전
    json-document editing benchmark
    items=1000,10000,50000 rounds=5 warmups=2
    
    items=1000
      object batch paste: p50=56.168ms p95=71.386ms
      tree selection resolve: p50=0.042ms p95=0.058ms
      tree deep snapshot setup: p50=0.731ms p95=1.074ms
      sheet leaf commit: p50=0.117ms p95=0.173ms
      sheet full-column copy: p50=0.817ms p95=1.619ms
      database sorted topology: p50=0.068ms p95=0.194ms
      database cached topology: p50=0.003ms p95=0.076ms
      database full-column selection: p50=0.922ms p95=1.587ms
    
    items=10000
      object batch paste: p50=520.621ms p95=547.040ms
      tree selection resolve: p50=0.276ms p95=0.307ms
      tree deep snapshot setup: p50=7.257ms p95=10.733ms
      sheet leaf commit: p50=0.120ms p95=0.201ms
      sheet full-column copy: p50=2.998ms p95=3.243ms
      database sorted topology: p50=0.533ms p95=0.538ms
      database cached topology: p50=0.001ms p95=0.005ms
      database full-column selection: p50=6.516ms p95=7.494ms
    
    items=50000
      object batch paste: p50=3465.480ms p95=7046.446ms
      tree selection resolve: p50=1.303ms p95=1.380ms
      tree deep snapshot setup: p50=58.733ms p95=64.778ms
      sheet leaf commit: p50=0.306ms p95=0.406ms
      sheet full-column copy: p50=25.289ms p95=27.732ms
      database sorted topology: p50=3.838ms p95=4.958ms
      database cached topology: p50=0.011ms p95=0.064ms
      database full-column selection: p50=69.141ms p95=76.890ms
    
    object batch paste
    scaling
      1000->10000: size=10.0x p50=9.27x p95=7.66x
      10000->50000: size=5.0x p50=6.66x p95=12.88x
    
    tree selection resolve
    scaling
      1000->10000: size=10.0x p50=6.58x p95=5.33x
      10000->50000: size=5.0x p50=4.72x p95=4.50x
    
    tree deep snapshot setup
    scaling
      1000->10000: size=10.0x p50=9.92x p95=9.99x
      10000->50000: size=5.0x p50=8.09x p95=6.04x
    
    sheet leaf commit
    scaling
      1000->10000: size=10.0x p50=1.02x p95=1.16x
      10000->50000: size=5.0x p50=2.55x p95=2.01x
    
    sheet full-column copy
    scaling
      1000->10000: size=10.0x p50=3.67x p95=2.00x
      10000->50000: size=5.0x p50=8.43x p95=8.55x
    
    database sorted topology
    scaling
      1000->10000: size=10.0x p50=7.78x p95=2.77x
      10000->50000: size=5.0x p50=7.20x p95=9.22x
    
    database cached topology
    scaling
      1000->10000: size=10.0x p50=0.45x p95=0.06x
      10000->50000: size=5.0x p50=7.26x p95=14.15x
    
    database full-column selection
    scaling
      1000->10000: size=10.0x p50=7.06x p95=4.72x
      10000->50000: size=5.0x p50=10.61x p95=10.26x
    
    이후
    json-document editing benchmark
    items=1000,10000,50000 rounds=5 warmups=2
    
    items=1000
      object batch paste: p50=18.116ms p95=19.655ms
      tree selection resolve: p50=0.041ms p95=0.055ms
      tree deep snapshot setup: p50=0.640ms p95=1.607ms
      sheet leaf commit: p50=0.124ms p95=0.140ms
      sheet full-column copy: p50=0.349ms p95=0.560ms
      database sorted topology: p50=0.087ms p95=0.123ms
      database cached topology: p50=0.001ms p95=0.003ms
      database full-column selection: p50=0.790ms p95=1.064ms
    
    items=10000
      object batch paste: p50=94.405ms p95=102.239ms
      tree selection resolve: p50=0.297ms p95=0.659ms
      tree deep snapshot setup: p50=9.092ms p95=20.281ms
      sheet leaf commit: p50=0.201ms p95=0.340ms
      sheet full-column copy: p50=3.381ms p95=7.823ms
      database sorted topology: p50=0.739ms p95=1.062ms
      database cached topology: p50=0.004ms p95=0.026ms
      database full-column selection: p50=7.790ms p95=8.990ms
    
    items=50000
      object batch paste: p50=464.310ms p95=467.987ms
      tree selection resolve: p50=1.314ms p95=1.862ms
      tree deep snapshot setup: p50=57.756ms p95=60.349ms
      sheet leaf commit: p50=0.291ms p95=0.483ms
      sheet full-column copy: p50=32.544ms p95=43.844ms
      database sorted topology: p50=3.999ms p95=4.451ms
      database cached topology: p50=0.011ms p95=0.028ms
      database full-column selection: p50=72.193ms p95=74.788ms
    
    object batch paste
    scaling
      1000->10000: size=10.0x p50=5.21x p95=5.20x
      10000->50000: size=5.0x p50=4.92x p95=4.58x
    
    tree selection resolve
    scaling
      1000->10000: size=10.0x p50=7.29x p95=11.95x
      10000->50000: size=5.0x p50=4.42x p95=2.82x
    
    tree deep snapshot setup
    scaling
      1000->10000: size=10.0x p50=14.19x p95=12.62x
      10000->50000: size=5.0x p50=6.35x p95=2.98x
    
    sheet leaf commit
    scaling
      1000->10000: size=10.0x p50=1.62x p95=2.42x
      10000->50000: size=5.0x p50=1.45x p95=1.42x
    
    sheet full-column copy
    scaling
      1000->10000: size=10.0x p50=9.69x p95=13.98x
      10000->50000: size=5.0x p50=9.63x p95=5.60x
    
    database sorted topology
    scaling
      1000->10000: size=10.0x p50=8.50x p95=8.61x
      10000->50000: size=5.0x p50=5.41x p95=4.19x
    
    database cached topology
    scaling
      1000->10000: size=10.0x p50=3.52x p95=9.50x
      10000->50000: size=5.0x p50=2.67x p95=1.05x
    
    database full-column selection
    scaling
      1000->10000: size=10.0x p50=9.86x p95=8.45x
      10000->50000: size=5.0x p50=9.27x p95=8.32x
    
    
    React Hook Form 원시 출력 (이전 → 이후)
    이전
    json-document React Hook Form connector benchmark
    items=1000,5000 rounds=5 warmups=2
    
    items=1000
      unchanged rerender: p50=0.422ms p95=0.710ms
      external 1000 leaf sync: p50=441.618ms p95=464.630ms
      external leaf sync: p50=1.428ms p95=1.508ms
      whole form submit: p50=1.619ms p95=1.855ms
    
    items=5000
      unchanged rerender: p50=1.281ms p95=4.392ms
      external 5000 leaf sync: p50=11033.987ms p95=11077.511ms
      external leaf sync: p50=6.528ms p95=6.853ms
      whole form submit: p50=7.135ms p95=9.837ms
    
    external leaf sync
    scaling
      1000->5000: size=5.0x p50=4.57x p95=4.55x
    
    whole form submit
    scaling
      1000->5000: size=5.0x p50=4.41x p95=5.30x
    
    unchanged rerender
    scaling
      1000->5000: size=5.0x p50=3.04x p95=6.19x
    
    external batch sync
    scaling
      1000->5000: size=5.0x p50=24.99x p95=23.84x
    
    이후
    json-document React Hook Form connector benchmark
    items=1000,5000 rounds=5 warmups=2
    
    items=1000
      unchanged rerender: p50=0.288ms p95=1.114ms
      external 1000 leaf sync: p50=421.142ms p95=433.505ms
      external leaf sync: p50=1.370ms p95=2.306ms
      whole form submit: p50=1.548ms p95=1.870ms
    
    items=5000
      unchanged rerender: p50=0.127ms p95=1.980ms
      external 5000 leaf sync: p50=10114.870ms p95=11086.214ms
      external leaf sync: p50=6.220ms p95=7.752ms
      whole form submit: p50=7.348ms p95=11.421ms
    
    external leaf sync
    scaling
      1000->5000: size=5.0x p50=4.54x p95=3.36x
    
    whole form submit
    scaling
      1000->5000: size=5.0x p50=4.75x p95=6.11x
    
    unchanged rerender
    scaling
      1000->5000: size=5.0x p50=0.44x p95=1.78x
    
    external batch sync
    scaling
      1000->5000: size=5.0x p50=24.02x p95=25.57x
    
    
    Collaboration 원시 출력 (이전 → 이후)
    이전
    json-document collaboration benchmark
    items=1000,5000 rounds=5 warmups=2
    
    items=1000
      remote leaf ingest: p50=9.171ms p95=10.642ms
      remote wide object leaf ingest: p50=5.344ms p95=5.547ms
      export one-change bundle: p50=0.001ms p95=0.002ms
    
    items=5000
      remote leaf ingest: p50=47.624ms p95=54.468ms
      remote wide object leaf ingest: p50=79.411ms p95=90.276ms
      export one-change bundle: p50=0.000ms p95=0.001ms
    
    remote leaf ingest
    scaling
      1000->5000: size=5.0x p50=5.19x p95=5.12x
    
    remote wide object leaf ingest
    scaling
      1000->5000: size=5.0x p50=14.86x p95=16.28x
    
    ledger replay
      100 change ingest: p50=0.770ms p95=1.120ms
      100 prior changes -> new actor commit: p50=0.275ms p95=0.348ms
      1000 change ingest: p50=9.097ms p95=10.075ms
      1000 prior changes -> new actor commit: p50=2.412ms p95=2.778ms
    scaling
      100->1000: size=10.0x p50=11.82x p95=9.00x
    
    continued editing after remote history
    scaling
      100->1000: size=10.0x p50=8.79x p95=7.99x
    
    이후
    json-document collaboration benchmark
    items=1000,5000 rounds=5 warmups=2
    
    items=1000
      remote leaf ingest: p50=10.250ms p95=12.492ms
      remote wide object leaf ingest: p50=2.927ms p95=3.801ms
      export one-change bundle: p50=0.001ms p95=0.001ms
    
    items=5000
      remote leaf ingest: p50=40.881ms p95=43.214ms
      remote wide object leaf ingest: p50=23.221ms p95=30.165ms
      export one-change bundle: p50=0.000ms p95=0.002ms
    
    remote leaf ingest
    scaling
      1000->5000: size=5.0x p50=3.99x p95=3.46x
    
    remote wide object leaf ingest
    scaling
      1000->5000: size=5.0x p50=7.93x p95=7.94x
    
    ledger replay
      100 change ingest: p50=0.965ms p95=1.126ms
      100 prior changes -> new actor commit: p50=0.413ms p95=0.519ms
      1000 change ingest: p50=7.825ms p95=12.907ms
      1000 prior changes -> new actor commit: p50=2.791ms p95=4.358ms
    scaling
      100->1000: size=10.0x p50=8.11x p95=11.46x
    
    continued editing after remote history
    scaling
      100->1000: size=10.0x p50=6.76x p95=8.40x
    
    
  4. developer-1px commented on Sep 8, 2026

    @developer-1px
    OwnerAuthor

    최종 검증 완료 / pr-open

    • PR Core와 편집 주변 경로의 중복 복사·배치 재탐색을 줄인다 #738, remote/local head 9be88b4f 일치. 새 PR은 병합하지 않았다.
    • GitHub CI의 Plan, Package, Site, External kit 모두 통과했다.
    • 기존 Chrome profile의 실제 Clipboard에서 복사 후 두 번 붙여넣어 3→5 blocks, 5개 ID 모두 고유함을 확인했다.
    • React Hook Form 실제 화면에서 draft 중 canonical 값 유지, 저장 후 revision 1, Undo 2, Redo 3 및 입력값 동기화를 확인했다. 두 흐름의 error/unhandledrejection은 0이었다.
    • 공개 ID allocator의 정본 API·문서·Usage·source 등록과 실행 경로까지 검증했다. 미리보기는 해당 PR head의 별도 작업 공간에서 실행 중이다.
    • 기존 전체 1,583 tests·10,000 patch parity·soak·typecheck·문서/표준 검증 결과는 유지된다. 로컬 작업 트리는 clean이며 원래 작업 폴더의 미커밋 변경은 보존했다.
    • 앞서 기록한 RHF 5k bulk 동기화 약 10.1초와 peer 호환 범위 제약은 남은 성능 관찰이다. 이번 계약의 수정/필요 처리 판정과 검증에는 미완료 항목이 없다.
  5. developer-1px commented on Sep 8, 2026

    @developer-1px
    OwnerAuthor

    병합 완료

    사용자의 merge 승인에 따라 PR #738을 main에 squash merge했다.

    • 병합 커밋: a36ab5ebabfc6903ebb7aa57ad8212efe5272d10
    • 검증된 head 9be88b4f를 고정해 병합했으며, Plan / Package / Site / External kit 모두 통과한 상태였다. 차단 리뷰와 충돌은 없었고 관리자 우회는 사용하지 않았다.
    • PR은 MERGED, 이슈 #737은 CLOSED임을 확인했다. 별도 프로젝트 항목은 없다.
    • 별도 작업 공간의 main을 fast-forward하고 clean 상태를 확인했다. 병합 결과의 전체 tree는 검증한 PR head와 동일하다.
    • 원래 작업 폴더의 미커밋 변경과 비교용 작업 공간은 보존했다. 기존 코드와 검증 자료를 삭제하지 않았다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions