Skip to content

캘린더 정본 프로토콜의 안전성과 편집 경로 일관성을 완성한다 #743

Closed

Description

@developer-1px

목적

캘린더가 기존 정본 모듈을 소비하면서 입력·편집·선택·gesture·clipboard·조회·문서 계약을 일관되게 지키도록 한다. 앞선 구조 감사와 프로토콜 안정성 감사의 발견을 이 이슈의 실행 범위로 보존한다.

Outcome

동일한 Calendar 편집은 입력 경로와 preview/commit에 관계없이 같은 의미를 갖고, 잘못되거나 오래된 요청은 해당 요청의 문서·선택·History·성공 후처리를 남기지 않는다. Host에는 조합·제품 정책·fixture·표현만 남긴다.

Done / 수용 기준

  • 알 수 없는 런타임 Intent가 삭제로 떨어지지 않고 안전하게 거절된다.
  • 생성·수정·반복 편집·붙여넣기가 같은 Calendar 유효성 규칙을 지키며 성공한 문서를 다시 열고 조회할 수 있다. 잘못된 종료 시각, 소속 calendarId, 비정수 반복 간격을 검증한다.
  • clipboard parser와 paste가 잘못된 구간을 거절한다. 다른 문서의 calendarId는 기본적으로 거절하고 명시적인 대상 소속 정책만 기존 도메인 API로 처리한다.
  • drag capture 이후 대상 변경·삭제를 실행 전에 재검증하여 길이 덮어쓰기와 삭제된 발생분 재생성을 막는다.
  • Cut은 clipboard에 확정한 대상을 제거한다. clipboard writer 재진입으로 선택이 바뀌어도 다른 대상을 삭제하지 않는다.
  • 종일 반복 일정 전체 resize의 Inspector/pointer 의미를 일치시키고 preview/commit의 반복 범위 계산을 정본 도메인에서 공유한다.
  • 단일 반복 일정 drag의 this/this-and-following/all 회귀를 복구하고 그룹 반복 이동의 범위·중복 시리즈 처리 정책을 명시하고 검증한다.
  • pointer 편집은 기존 commitIntent의 성공 후처리 계약을 사용한다.
  • selection 이동 planner의 uniqueId 우회를 기존 createEditingIdAllocator로 이행하고 충돌 반복이 유한하게 끝난다.
  • 반복 projection의 숨겨진 400회 제한을 없애고 요청 구간 기준 계산으로 먼 미래에도 결과가 누락되지 않는다. 성능을 위해 의미를 조용히 바꾸지 않는다.
  • Calendar binding의 hit target과 resize 측정을 해당 인스턴스로 제한하고 너비가 다른 두 인스턴스를 검증한다.
  • README의 selection.set / keyboard / nullable clipboard 예제를 현재 공개 API와 일치시키고 Temporal 직접 의존성을 선언한다.
  • 현재 Calendar profile에 시간 단위·exclusive end·반복 범위·실패·stale·clipboard 호환성과 지원 범위를 owner 위치에 기록한다. 공개 API reference·site Usage·source registration이 실제 구현에 연결된다.
  • 관련 owner 행동 테스트, 타입·빌드·문서 검사, 실제 Calendar 경로 검증, 최종 diff 검토 후 PR을 연다. 사용할 수 없는 검사는 통과로 기록하지 않는다.

원인과 정본 위치

  • Editing/Calendar: 도메인 유효성, 반복 의미와 순수 계획, source 재검증, clipboard, projection, 공통 ID 할당기 소비.
  • Calendar Hands: 성공 후처리, 캡처한 Cut 대상 연결, scoped Web binding, 제품 표면의 실패·미지원 전달.
  • Web / Affordance / Selection / EditingSession / Core: 기존 정본과 공통 보장을 재사용한다.

Don't / 제외

Core API·계층, 전역 command bus/registry, 공통 version envelope를 새로 만들지 않는다. AI·협업 wire protocol·영속화·외부 캘린더 연동을 추가하지 않는다. 자동 전체 CI를 되살리거나 수동 CI를 관례적으로 실행하지 않는다. 기존 사용자 checkout의 수정과 별도 PR #740, #734, #730, #726, #587을 보존하며 임의로 병합하지 않는다. 이번 인계의 종료점은 PR 생성이며 merge는 별도 요청에 따른다.

기준과 검증 증거

감사 기준 main: dabbe80.
기존 관련 59개 파일 886건 통과·4건 skip, Calendar React 9개 파일 40건 소스 진입점으로 통과. 통과 여부와 별개로 공개 API 메모리 fixture에서 unknown Intent 삭제, stale drag 길이 덮어쓰기/발생분 재생성, Cut 대상 불일치, 잘못된 clipboard 구간, 반복 간격 1.5, 400회 이후 조회 누락을 재현했다.
구현에서는 이 반례를 owner 회귀 테스트로 남기고 실제 consumer 경로와 함께 검증한다. 외부 History 및 브라우저 증거의 범위를 과장하지 않는다.

Activity

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

    @developer-1px
    OwnerAuthor

    구현과 로컬 검증을 진행했습니다. unknown Intent, 입력 유효성, stale drag, 캡처 cut, 반복 범위/preview 정본화, 인스턴스별 DOM 범위, bounded ID 할당, 400회 조회 제한을 회귀 테스트로 닫았습니다. 그룹 following은 시리즈별 가장 이른 선택 발생분을 기준으로 하고 종료일/이후 제외 날짜를 보존합니다.

    관련 owner 테스트 972건 통과·기존 4건 skip, site 141건 통과, owner/site 타입 검사와 빌드·API reference·문서 검사를 확인했습니다. 추가 점검에서 JSON 확장 metadata를 가진 발생분 분리도 재현하여 보존 테스트를 더했습니다. 기존 Chrome의 실제 Calendar 경로에서 편집/거절/이력 흐름을 확인 중이며, 독립 tarball 설치에서 Temporal 직접 의존성과 public import도 통과했습니다. 자동/수동 원격 전체 CI는 실행하지 않았습니다.

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

    @developer-1px
    OwnerAuthor

    구현·검증 완료

    PR #744: #744

    • 검증 revision: ba323d53e7eae70b18cf733df0248622826224e2. 로컬 worktree와 원격 PR head가 일치하고 worktree는 깨끗합니다.
    • 관련 owner 981건 통과·기존 4건 skip, 사이트 143건 통과. 타입·빌드·문서·30개 workspace 계약 검사와 workspace 밖 tarball 설치를 확인했습니다.
    • 최종 검토에서 월말·윤년 구간이 0/음수가 되는 문제와 단일 all 편집의 표현 불가능한 선택도 재현하고 같은 정본에서 해결했습니다.
    • 기존 Chrome에서 잘못된 종료 입력 거절, 5개 반복 발생분의 all resize, 한 번의 undo/redo, 선택 발생 날짜 보존과 runtime error 0건을 확인했습니다. 패키지 API 라우트·Calendar profile·Usage Source 연결도 확인했습니다.
    • 새 정본 모듈을 포함해 Editing·Calendar 구현은 338줄 순감했습니다. 현재 지원 계약과 TBD를 owner 문서에 공개했습니다.
    • 자동/수동 full CI·장시간 soak와 네이티브 포인터 E2E는 미실행입니다. 화면 캡처는 검은 프레임이므로 픽셀 검증 통과로 기록하지 않았습니다. 관련 근거와 제한은 PR 본문에 보존했습니다.

    PR은 열려 있고 병합하지 않았습니다. 이 이슈는 PR 병합 시 닫히도록 연결했습니다.

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