·기술 회고·3 분·리뷰 필요
영상을 4번째 콘텐츠 타입으로 — §1.1 단순성에서 의도적으로 벗어난 결정
owner 결정으로 음성/사진/글에 더해 짧은 영상(20초)을 추가. 스펙의 단순성 가드레일에서 의도적 이탈임을 플래그하고, 기존 캡처 패턴을 그대로 확장. 미해결 재생 호환성 caveat 명시.
AI 버전
맥락: 스펙과의 긴장
work.md §1.1은 콘텐츠 타입을 **음성/사진/글 셋만, "의심스러우면 뺀다"**로 못 박았다. 영상은 그 가드레일에 정면으로 어긋난다(펜던트=작고 친밀 → 영상은 "영상 메시지 앱"쪽으로 결을 민다). 이 긴장을 명시적으로 플래그했고, owner가 추가를 선택 → 절제 버전(20초 캡)으로 구현.
정직한 기록: 이건 AI가 권한 게 아니라, 제품 주인이 스펙을 의도적으로 확장한 결정이다. 깊이=정확도라는 §1.1 정신과는 트레이드오프.
구현 (1f14c0e) — 기존 패턴 그대로 확장
오디오 캡처 패턴을 미러링해서 일관성 유지:
components/VideoRecorder.tsx—getUserMedia({video,audio}), 라이브 미리보기, 20초 캡, 다시 녹화, 권한거부/실패 구분, 언마운트 안전.lib/items.ts saveVideoItem+ MIME 화이트리스트(isAllowedVideoMime, video/ 접두).- 스키마/init:
typeCHECK에'video'추가 + 기존 DB용 idempotent 마이그레이션(ALTER TABLE … DROP/ADD CONSTRAINT) —CREATE TABLE IF NOT EXISTS가 기존 테이블 제약을 안 바꾸므로. - add/기여 화면 4번째 탭, ItemCard·SurfaceClient 렌더, 업로드 조기차단 한도 상향(
MAX_UPLOAD_BYTES45MB, 영상 ≤40MB). - 미디어 라우트의 Range/206는 이미 영상 탐색을 커버.
검증 (직접 실행)
- '영상' 탭 노출 확인.
- 더미 영상 업로드 →
201(= DB CHECK 마이그레이션이 기존 DB에 'video'를 실제로 허용함을 확인, 제약 위반 0). - 보관함에 video 항목 표시, 미디어
206/video/webm/nosniff. - 거부: video 자리에
text/html→400.
⚠️ 미해결 caveat — 재생 호환성
ffmpeg가 이 머신에 없어 서버 트랜스코딩 없음. 데스크톱 Chrome은 webm 녹화 → 아이폰에서 재생 안 됨(반대도). 같은 기기/브라우저에선 정상. 이건 §12 오디오 이슈의 영상판이고, 오디오는 mp4 우선+서버 변환으로 풀려 했지만 영상은 미해결. 프로덕션 호스트에 ffmpeg + webm→mp4 변환(오디오 코드 lib/audio.ts 패턴 재사용)으로 해결 가능.
이 caveat는 실기기 교차 재생을 테스트하지 않은 상태에서 코드/포맷 지식으로 예측한 것 — 실제 아이폰↔데스크톱 교차 재생은 미검증.
리뷰 필요
내 시각이 아직 안 들어간 entry.