Skip to content

편집 입력의 host 소유권과 composition 수명을 보존한다 #711

Closed

Description

@developer-1px

Goal Anchor

  • Outcome: Web·contenteditable·React를 조합해도 입력은 올바른 editing host에서 한 번만 처리되고, IME 중 DOM 소유권과 종료 뒤 최신 model의 일치를 보존합니다.
  • Done:
    1. Rich Text 안의 input·textarea·select 및 별도 editable host의 keyboard/beforeinput/clipboard가 바깥 문서와 history를 변경하지 않습니다. 정상 root 입력은 유지합니다.
    2. React Rich Text surface는 composition 중 model ingestion을 계속하면서 composing DOM의 render를 유예하고, 종료·취소·target 삭제 뒤에는 최신 model로 복구합니다. 정상 typing locality를 보존합니다.
    3. 같은 editor/root에서 onAction·createId callback만 바뀌어도 진행 중 composition을 보존하고 최신 callback을 사용합니다. 실제 editor/root 변경과 unmount는 수명을 해제합니다.
    4. Rich Text replacement 입력은 data와 dataTransfer/target-range 형태를 모두 canonical semantic intent로 처리합니다. 기존 replacement/yank/transpose 처리 범위의 같은 payload 누락을 함께 닫습니다.
    5. local contenteditable은 composition tail을 timer 또는 trailing input으로 끝낼 때 지연한 최신 model과 selection을 publish하여 다음 입력이 stale DOM을 덮어쓰지 않게 합니다.
    6. RichTextEditorSurface의 public as 변경 시 제거된 root의 listener를 해제하고 새 root에 다시 연결합니다.
    7. 6건의 pre-fix 실패와 post-fix 성공, owner 회귀 테스트와 관련 build/type/문서/Site 검증으로 확인합니다. 공개 capability가 바뀌면 정본 export·owner reference·Site Usage·source registration까지 닫습니다.
  • Don't: 새 범용 Editor/store/composition framework를 만들거나 Host에 보완 로직을 넣지 않습니다. Core/Collaboration wire·schema, 전체 collaborative selection mapping/history는 변경하지 않습니다. Local replace, collaborative capture-plan-commit, Rich Text semantic Intent의 서로 다른 model 계약을 유지합니다. native 근거 미확인인 non-cancelable replacement(H1)와 composition removed-span 재변환(H2)은 제외합니다. Calendar 캘린더 콘텐츠와 플로팅 컨트롤 레이어를 분리한다 #704·Database Database saved-view와 편집 표현 책임을 정본화한다 #587·Annotation refactor(annotation): 선택·gesture·출력의 정본 경계 통합 #589 미병합 변경은 가져오지 않습니다. merge는 별도 승인 대상입니다.

승인 근거와 현상

사용자는 위 6건의 후속 리뷰와 “기존 정본 모듈에서 이 6건을 닫는다”는 개선 제안에 “진행해”로 실행을 승인했습니다.
기준은 #710 병합 후 facc55d1418b179cbf121bcf5210623b54dbf39d입니다.

  • 중첩 control에서 Backspace → 바깥 abc가 ab로 변경됩니다.
  • IME DOM abcㅎ 중 외부 model 갱신 → React가 composing DOM을 덮어씁니다.
  • callback-only rerender → compositionend가 model에 반영되지 않습니다.
  • dataTransfer의 X로 abc의 b 교체 → model이 abc 그대로입니다.
  • local compositionend 뒤 외부 latest commit → tail 종료 뒤에도 DOM은 이전 값입니다.
  • as article→section 교체 → 새 root 입력 listener가 없습니다.
    기존 관련 20 files / 133 tests는 통과했으나 위 6건의 synthetic 회귀 9개는 실패했습니다. 이는 native IME·system clipboard·spellchecker 지원 증거가 아닙니다.

정본 경계와 검증

  • Web: editing-host target/event 소유권 판별. 세 native binding의 동등한 판별을 한 정본 API로 소비하되 model reconciliation 자체는 합치지 않습니다.
  • Rich Text Web: input payload 번역, composition 시작/종료와 failure recovery.
  • Contenteditable: local native lease/tail release와 latest render.
  • Rich Text React: callback freshness, 실제 root 수명, composition 동안 render 유예와 catch-up.
  • Site: 기존 API의 Usage·source 등록과 실제 소비 검증만 담당합니다.

관련 정상 입력·nested control·composition 두 event 순서·외부 변경/삭제·callback/root 변경·unbind·history·typing locality를 검증합니다. 브라우저는 기존 Chrome 연결을 우선하며 native와 synthetic 증거를 구분합니다. 제품 시각/정책을 새로 설계하는 작업은 없습니다.

Activity

  1. self-assigned this
    on Sep 7, 2026
  2. developer-1px commented on Sep 7, 2026

    @developer-1px
    OwnerAuthor

    착수 계획: Goal Anchor Done 1–7과 Don’t를 본문 그대로 유지합니다. 사용자 승인 범위는 확정된 6건이며 H1/H2와 merge는 제외합니다.

    단계: pre-fix 회귀 확인 → Web 정본 host 판별 및 input payload → local tail release → React callback/root/render 수명 → owner 문서·Usage·source closure → 관련 전체 검증·self-review·PR.

    기준 facc55d1418b179cbf121bcf5210623b54dbf39d에서 독립 worktree codex/issue-711-input-lifecycle을 만들었습니다. 다른 workflow 소유의 local main은 이동하지 않고 정확한 origin/main에서 시작했습니다. #704는 unrelated, #587/#589는 등록/문서 일부 boundary-overlap으로 해당 domain 변경을 제외합니다. 두 PR은 main과 기존 충돌이 있어 전체 combined tree 검증은 현재 unavailable이며, 출판 전 exact head와 영향 경계를 재확인합니다.

    판별 책임은 기존 Web input owner를 확장하고 세 binding에서 소비합니다. 별도 Editor/store facade나 공통 model reconcile runtime은 만들지 않습니다. 공개 API를 소비하는 package dependency와 reference/Usage/source를 함께 갱신합니다.

    입력/DOM 소유권 변경이므로 recovery·version-skew·국제화/수명 검토를 활성화합니다. Wire/schema와 저장 형식은 유지하며 새 API를 소비하는 Draft package는 이를 제공하는 Web revision과 함께 사용해야 합니다. 런타임 관찰은 model/DOM 일치, commit 횟수, onAction failure, 구독 해제와 기존 browser corpus를 사용합니다. 별도 qualified owner review는 아직 없으며 merge 단계의 잔여 조건으로 남깁니다. Project API는 read:project 권한 부족으로 unavailable입니다.

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

    @developer-1px
    OwnerAuthor

    구현/검증 경계 업데이트입니다. Goal Anchor 변경은 없습니다.

    • 기존 3개 binding의 동등한 host 판별을 Web isWebEditingHostTarget으로 수렴했습니다. local/collaborative/Rich Text의 model 계약은 분리 유지합니다.
    • editor 전역 render-store cache를 surface별 기존 store 생성으로 바꾸어 다른 surface는 model을 계속 반영합니다. composition 해제 시 누적 model 변경을 따라잡고 해당 block만 복구합니다. callback freshness와 실제 root 수명을 분리했습니다.
    • endpoint가 변경/삭제된 composition은 rich-text.composition-stale로 거절합니다. validation 거절로 model 값이 그대로인 경우에도 native DOM과 caret을 복구하며, unrelated model 변경은 composition과 함께 보존합니다.
    • Pre-fix 회귀 9개 실패 → 수정 후 통과. 현재 전체 프로젝트 135개 파일 / 1,228개 테스트 통과, 기존 4개 skip. Site 23개 파일 / 121개 테스트, 관련 5개 package test typecheck, build, workspace/문서/API/standard, Site guard/typecheck/Pages build·HTTP 검사 통과.
    • 기존 Chrome profile의 실제 Rich Text route에서 중첩 control synthetic event 격리, 실제 DataTransfer를 쓰는 synthetic replacement, synthetic composition 중 제품 command로 model 변경 및 stale 종료 복구를 확인했습니다. 페이지 오류 0개. AppleScript isolated world의 fixture는 페이지 realm으로 교정해 실행했습니다. 이 증거를 OS native IME·spellchecker·system clipboard 검증으로 확대하지 않습니다.
    • React placeholder benchmark: 1,000→10,000 block에서 p50 0.207→0.271ms, p95 0.315→0.381ms. 국소 typing scan/render 회귀 유지. 내부 factory 변경의 benchmark 소비 누락도 self-review에서 수정했습니다.
    • 원격 main은 여전히 facc55d1418b179cbf121bcf5210623b54dbf39d. 캘린더 콘텐츠와 플로팅 컨트롤 레이어를 분리한다 #704/Database saved-view와 편집 표현 책임을 정본화한다 #587/refactor(annotation): 선택·gesture·출력의 정본 경계 통합 #589 head 및 다른 worktree 소유권은 그대로이며 제외합니다. Qualified owner review와 native IME 확인은 merge/release 전 잔여 조건, H1/H2는 범위 밖입니다.

    다음: 최종 source/Usage 표시 및 후보 tree 식별 → PR. merge하지 않습니다.

  4. developer-1px commented on Sep 7, 2026

    @developer-1px
    OwnerAuthor

    PR #712를 열었습니다: #712

    Issue 본문 ↔ PR 본문/31개 변경 파일/검증을 양방향 대조했습니다. Done 1–6은 각 owner의 수정과 실패 재현 회귀로, Done 7은 export·owner reference·실제 Site Usage/source 및 build/test/문서/브라우저 증거로 연결됩니다. 추가 Goal Anchor나 contract delta는 없습니다.

    최종 ceae5ceb13d1517da1426099de750a311c793128 / tree 41e46a2b6e87d1e32058f4a2d8ce1d4ae3a51589에서 build와 전체 프로젝트 1,228개 테스트를 재확인했습니다(기존 4개 skip). Push hook build도 통과했습니다. 원격 PR head와 로컬 HEAD가 일치하고 작업 worktree는 clean입니다.

    상태: pr-open, CI 시작됨. Project API 권한 부족은 그대로입니다. OS native 입력/전체 browser engine 검증과 qualified owner review의 미확인 범위를 PR에 명시했고, merge는 하지 않았습니다.

  5. developer-1px commented on Sep 7, 2026

    @developer-1px
    OwnerAuthor

    중단된 작업을 재개합니다. Issue 본문과 승인 범위, PR #712 diff/HEAD를 다시 대조했습니다. 계약 변경은 없습니다. Site CI는 212건 중 WebKit replacement DataTransfer 회귀 1건 실패(207 통과, 기존 4 skip)입니다. Done 4·7에 직접 연결되는 이 실패를 WebKit에서 재현하여 실제 입력 처리와 synthetic fixture 중 원인을 구분하고 수정·재검증합니다. 다른 PR 변경과 merge는 기존 제외 범위대로 유지합니다.

  6. developer-1px commented on Sep 7, 2026

    @developer-1px
    OwnerAuthor

    재개 작업 완료: PR #712의 WebKit CI 실패를 수정해 67632511e86dd6b205b409b1c899515a68113721로 push했습니다. Goal Anchor 변경은 없습니다. WebKit InputEvent 생성자가 dataTransfer를 누락해 fixture에 payload가 없던 것이 원인이며, 실제 DataTransfer를 합성 이벤트 property로 명시했습니다. 기존 replacement 문자열·target range 검증과 제품 구현은 유지했습니다.

    검증: 수정 전 WebKit 회귀 실패 → 수정 후 Firefox·WebKit Rich Text demo/corpus 33건 통과(기존 4 skip). 기존 Chrome profile은 깨끗이 reload한 페이지 realm에서 해당 replacement의 JSON Patch와 model/DOM 일치를 확인했습니다. pre-push build 및 diff 검사 통과. 최종 원격 CI 34093352073의 Plan·Package·External kit·Site 모두 통과했고, Site 전체 browser suite는 208건 통과 / 기존 4건 skip입니다.

    원격 PR head와 로컬 HEAD 일치, 작업 worktree clean, PR은 OPEN/CLEAN입니다. Issue↔PR 범위와 검증을 다시 대조하고 PR 본문을 최종 head/tree/CI 상태로 갱신했습니다. Native IME 전체 지원 및 qualified owner review 미확인 범위는 그대로이며 merge하지 않았습니다. 상태: pr-open.

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

    @developer-1px
    OwnerAuthor

    사용자의 후속 요청 “둘다 진행해서 마무리 해줘”에 따라 PR 병합과 완료된 작업 공간 정리를 진행합니다. 기존 Outcome·Done·기술 범위는 유지하며, 이전의 PR까지만 진행한다는 실행 단계 제한은 이번 요청으로 종료합니다. HEAD 67632511에서 Plan·Package·External kit·Site 모두 통과했고, main 기준 충돌과 formal blocking review는 없습니다. 저장소 AGENTS.md·branch protection·ruleset에는 별도 qualified owner review를 필수로 두는 규칙이 없으므로 이전 진행 문서의 자체 추가 대기 조건으로 병합을 보류하지 않습니다. 별도 도메인 검토와 OS native 입력 전체 검증을 수행하지 않았다는 사실은 그대로 유지합니다.

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

    @developer-1px
    OwnerAuthor

    마무리 완료: #712를 058422f3로 병합했고 #711이 완료 상태로 종료됐습니다. 병합 tree는 검증한 PR tree와 동일합니다. 작업 브랜치의 로컬·원격 참조와 clean worktree를 제거했고, 원본 저장소 main을 origin/main과 동기화했습니다. 최신 main에서도 pre-push build가 통과했습니다. 기존 미추적 문서·설정·캐시 4개는 전후 SHA-256 일치로 보존을 확인했습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions