# VibePeer 구현 체크리스트

공식 출처는 `https://vibepeer.app`입니다. 도메인은 설정 파일의 `VIBEPEER_ORIGIN`이며 관리자 화면에서 바꾸지 않습니다.

## 완료

- [x] Laravel 13, SQLite 로컬/테스트, MariaDB용 compose 예시
- [x] 회원, 이메일 인증, 세션 재발급, 로그인 시도 제한, 관리자 TOTP
- [x] 앱 소개 초안·발행 예약·승인·철회·수정·버전 소식
- [x] AI 사용 유형은 게시자가 고르는 `full` 또는 `partial`만 허용
- [x] 스토어 URL 정규화와 `(store, store_app_id)` 중복 거부
- [x] 피드백 상태, 증거 레벨 E0/E1/E2/E3/P, 비공개 디스크, 열람 로그
- [x] 이미지 재인코딩, EXIF 제거, SVG/HTML/PHP 거부, dHash
- [x] append-only 크레딧 원장, 예약/지출/회수/부채, 멱등 키
- [x] 정책 버전. 변경은 이후 거래에만 적용
- [x] 관리자 검수, 감사 로그, 신고, 콘텐츠, 회원 역할
- [x] canonical, robots, sitemap, manifest, 보안 헤더
- [x] 비운영 `noindex`, 운영이 아니면 sitemap URL을 비움
- [x] HSTS는 `SECURITY_HSTS`가 켜진 뒤에만
- [x] `www.vibepeer.app`와 평문 HTTP(해당 호스트)를 HTTPS로 보냄
- [x] 한국어 UI, 시간대 `Asia/Seoul`
- [x] 법률 초안 4종. 화면과 문서에 법률 검토 필요를 표시
- [x] `vibepeer:make-admin`, `vibepeer:maintain`
- [x] 수용 테스트 22건 통과 (2026-10-11)

## 코드에 있고 외부 자격이 없으면 동작하지 않는 것

- [ ] Cloudflare Turnstile. 키가 없으면 캡차를 요구하지 않음
- [ ] Tesseract OCR. `OCR_ENABLED`가 아니면 건너뜀. OCR 결과는 최종 증거가 아님
- [ ] 직접 영상 업로드. 기본 꺼짐. FFmpeg가 없으면 거부하고 YouTube/Vimeo 주소만 받음
- [ ] 소셜 로그인. 정책을 켜도 공급자 연동은 없고, 이메일 로그인만 가능하다는 안내만 표시
- [ ] S3. 공개 이미지는 `public` 디스크, 증거는 `storage/app/evidence`

## 운영 전에 사람이 확인해야 하는 것

- [x] 배포 후 서버 `.env`에 MariaDB 접속 정보를 넣고 `php artisan vibepeer:install`로 스키마를 준비. 비밀번호는 저장소에 없음
- [ ] DNS A/AAAA 또는 CNAME을 실제 서버에 연결. 이 저장소는 IP를 단정하지 않음
- [ ] `vibepeer.app` TLS 인증서. `.app`은 HTTPS가 필수
- [ ] HTTPS 응답을 확인한 뒤 `SECURITY_HSTS=true`
- [ ] SMTP, SPF, DKIM, DMARC. 현재 코드는 발송 어댑터만 있고 도메인 인증은 하지 않았음
- [ ] 약관·개인정보 법률 검토와 수탁사 기재
- [ ] 첫 공개 앱. 가입 보너스가 0이므로, 사이트가 비어 있으면 관리자가 일시적으로 “첫 글 전 피드백 필수”를 끄고 기준 앱을 올린 뒤 다시 켜야 함
- [ ] 큐 워커와 `schedule:run` 크론
- [ ] 백업과 `vibepeer:maintain reconcile` 결과 확인

## 하지 않은 것

스토어 설치를 기기에서 증명하는 기능은 없습니다. 화면 문구도 “제출 증거 검토”, “사용 화면 검토”, “미출시 프리뷰 의견”으로 둡니다.
