Uploader는 Creator가 아니다 — PhotoGram에서 C2PA와 저작권 주장을 분리한 이유
PhotoGram에 C2PA를 붙이려다 “업로드한 계정을 creator로 서명해도 되는가?”라는 제품 정책 문제를 만났다. publication integrity와 사용자 권리 주장을 분리하고, 기본 게시 UX까지 다시 정한 과정을 정리했다.
PhotoGram에 C2PA를 붙이려다 “업로드한 계정을 creator로 서명해도 되는가?”라는 제품 정책 문제를 만났다. publication integrity와 사용자 권리 주장을 분리하고, 기본 게시 UX까지 다시 정한 과정을 정리했다.
반복되는 AI 디자인 피드백 대신 실제 React 앱의 38개 UI 상태를 desktop/mobile 각각 standalone HTML로 추출했다. 새 mock을 만드는 대신 현재 제품을 editable projection으로 바꿔 human visual review 비용을 낮춘 과정을 정리한다.
Git worktree로 source checkout은 분리했지만 local MariaDB는 공유하고 있었다. feature branch의 ddl-auto update가 남긴 NOT NULL 컬럼이 main의 회원가입을 깨뜨린 사건과, compatibility code 대신 실제 drift를 제거한 판단을 정리한다.
30일 보존 규칙 하나로 계정과 모든 콘텐츠를 처리하려고 하면 복구, 재가입, 개인정보, 미디어 정리가 서로 충돌한다. PhotoGram에서 계정 탈퇴와 비활성화, Photo/Story 휴지통, raw GPS 보존을 서로 다른 lifecycle로 분리한 이유를 정리한다.
Place V1 구현 보고서는 PASS였지만 실제 source review에서는 exact GPS 로그 노출, N+1 조회, visibility count 누출, 누락된 Root search, provider 종속 검색이 P0로 드러났다. 기능 존재 여부보다 경계의 의미를 확인한 코드 리뷰를 정리한다.
사진의 EXIF GPS는 좋은 장소 추천 신호지만 그대로 저장하거나 공개 위치로 취급하면 위험하다. 정확한 촬영 좌표는 transient observation으로만 쓰고 사용자가 선택한 Place snapshot만 남기는 구조를 정리한다.
AI가 디자인을 구현하는 과정에서 visual detail보다 더 쉽게 사라지는 것은 global/local hierarchy, interaction identity, route semantics 같은 의미였다. 디자인 의도를 implementation contract로 보존하는 방법을 PhotoGram 사례로 정리한다.
PhotoGram을 Java 17에서 Java 25로 옮기며 실제 워크로드를 비교했다. 여러 지표가 좋아졌지만 결론은 NO CLEAR DIFFERENCE였다. 측정값과 해석을 분리한 이유를 정리한다.