# 검수 결과 r2 — 공개 영상 신고·채널 차단·신고 처리 탭 (uc_a38ca9cc51bb rev 4 · 2회차 · 2026-09-18 20:27~20:50 KST)

환경: WEB=https://staging.yusti.pages.dev · API=https://staging-api.yusti.net · ADM=http://127.0.0.1:3009(본서버 :3012, staging DB `neondb@yusti-staging…rds`) · Playwright headless chromium 420×900(관리자 1280×900) · fixture uniq rv844048.
전건 처음부터 측정(이전 회차 미참조). 유료 호출 0 · prod 무접촉 · 코드 수정 0 · task CLI 0 · DB 쓰기 0(psql SELECT 만 · 상태 변화는 전부 화면/API 조작으로만).

## 결과표

| UC | 판정 | 실측(요청→응답·화면 텍스트) | 비고(결함/미착지/미확정 가르기) |
|---|---|---|---|
| U0 | ✅ | reporter 로그인 → `/plot/yd-yuseoa/videos/<maker>` 열림. 목록 헤더 「b1aa9jte · 갑을역전 · 4편」, 행 4개(1편~4편 · 고유번호 55a4f48f/24e42f72/f0dade4a/a80c8bcf). 플롯 페이지 하단 「이 작품의 공개 영상 5편 · 더보기」 스트립(채널 2개), 채널 페이지 `/channel/<maker>` 「영상함 1 · 공개 4편」, 캐릭터 페이지 `/character/<charId>` 열림. API `GET /api/plot-videos/owner` 200 · `GET /api/channel` 200 | 타인 공개 영상이 보이는 화면 실재 |
| U1 | ✅ | 목록 각 행 우측 「⋯」(testid `plotvideos-ep-<id>-more`) 클릭 → 시트 항목 = 「신고」「닫기」 2개뿐. 풀화면 플레이어(vKeep 재생)에도 「⋯」(`shorts-more`) → 「신고」「닫기」. 캐릭터 페이지 「⋯」(`character-more`) → 「신고」「닫기」 | 채널 페이지·플롯 하단 스트립은 영상 단위가 아니라 채널/영상함 카드라 「⋯」 없음(영상 자리 아님으로 봄). 제작자 본인 영상의 「⋯」에도 「신고」가 뜬다(본인 영상 신고 가능 — 대본 밖 관측) |
| U2 | ✅ | 「신고」 → 선택지 정확히 3개: 「미성년으로 보여요」「제 얼굴·이름이에요」「보고 싶지 않아요」 + 「닫기」. 「불법」「기타」 없음 | 캐릭터 축도 동일 3개 |
| U3 | ✅ | ① 클릭 → `POST /api/content/report {targetKind:video,targetId:vMinor,reason:minor}` → 200 `{reportId:eea24077…,status:received,hidden:true,slaDue:+24h,legalDue:null}`. 시트에 「신고한 콘텐츠는 내 화면에서 사라집니다.」 1회. 시트 열린 채 3초 대기 = 행 그대로(시트가 자동으로 닫히지 않음) → 새로고침 후 vMinor 행 사라짐(「갑을역전 · 3편」). U8/U4 에서 「닫기」 누른 뒤 3초 = 목록 재조회로 행 즉시 사라짐 확인 | 「즉시 사라짐」은 시트 닫기 직후 성립. 시트 자체는 닫기를 눌러야 닫힘 |
| U4 | ✅ | maker2 목록(a18ccc98)에서 ③ → `POST /api/content/report {reason:block}` → 200 `{status:resolved,blockedOwnerId:maker2}`. 「신고한 콘텐츠는 내 화면에서 사라집니다.」 → 닫기 후 3초: 목록 비어 이용권 안내 화면, `GET /api/plot-videos/owner?owner=maker2` → `videos:[]`. 새로고침: 플롯 스트립 「공개 영상 2편」(maker2 채널 카드 사라짐 · `owners` 에 maker 만), 채널 페이지 `/channel/maker2` 「영상함 0 · 공개 0편 · 아직 공개된 영상함이 없어요.」 | 유스티언 페이지 노출은 maker2 소유 캐릭터가 fixture 에 없어 미측정(charId 는 maker 것) — 관측 한계 |
| U5 | ✅ | `/my` 에 「🚫 차단한 채널 1 ›」(`lib-blocked-channels`, `GET /api/content/blocks` → blocks 1) → 펼치면 「채널 · 해제」(`unblock-<maker2>`) → 해제 클릭 → `POST /api/content/unblock {ownerId}` → 200 `{blocked:false}` · `GET /api/content/blocks` → `[]`. maker2 목록 재진입: a18ccc98 행 다시 보임, 스트립 「채널 1편」 복귀 | DB channel_blocks 도 행 0(해제됨) |
| U6 | ❌ | 영상 축: 신고한 vMinor 는 reporter 목록에서 사라져 화면 재신고 진입 자체가 없음(비활성 버튼도 「검토 중입니다」 문구도 볼 자리 없음). **대체 측정** `POST /api/content/report {vMinor,minor}` 재호출 → 409 `{error:"daily_limit"}`. 캐릭터 축(U7)에서 화면 재신고 = 버튼 활성 그대로 · 3선택지 그대로 열림 · ① 누르면 409 → 「오늘 이미 신고했어요. 내일부터 다시 할 수 있어요.」 | 서버 하루 1회 규칙은 성립. 화면은 「버튼 비활성/검토 중입니다」가 아니라 사후 에러 문구 — 대본 기대(사전 비활성)와 다름 |
| U7 | ⚠(부분 ❌) | 캐릭터 페이지 「⋯」→「신고」→ 3선택지 → ① → `POST /api/content/report {targetKind:yustian,targetId:charId,reason:minor}` → 200 `{reportId:bcbaf6e9…,status:received,hidden:false}` · 「신고한 콘텐츠는 내 화면에서 사라집니다.」 표시. 닫기 후 3초·새로고침: 캐릭터 페이지 그대로 보임(사라지지 않음). 같은 날 재신고 → 409 daily_limit · 「오늘 이미 신고했어요. 내일부터 다시 할 수 있어요.」 | 하루 1회 규칙 ✅. 결함: 「사라집니다」 문구를 내고 실제로는 안 사라짐(`hidden:false`) — 문구/동작 불일치. 재신고 버튼 비활성 아님(U6 과 동일) |
| U8 | ❌ | ② → 폼 = 「이름」「연락처(이메일 또는 전화)」 입력 2칸 + 「☐ 본인 또는 정당한 권리자입니다」 체크 + 「접수」「닫기」(사진/신분 칸 없음 ✅). (a) 빈 폼으로 접수 → `POST …/report {contact:{name:"",contact:"",self:false}}` → 400 `contact_required` → 화면 **「지금은 접수할 수 없어요. 잠시 후 다시 시도해 주세요.」**. (b) 이름·연락처 입력·체크 없이 접수 → 400 **`self_declaration_required`** → 화면 **「지금은 접수할 수 없어요. 잠시 후 다시 시도해 주세요.」**(폼 사라지고 이 문구+닫기만 남음). (c) 체크 후 접수 → 200 `{reportId:d8acceba…,status:received,hidden:true,slaDue:+24h,legalDue:+30d}` → 「신고한 콘텐츠는 내 화면에서 사라집니다.」 → 닫기 3초 후 vRights 행 사라짐(재조회) · 새로고침도 동일 | 폼 구성 ✅ · 접수 ✅. **❌ = `self_declaration_required`(및 `contact_required`) 에 시간 귀책 문구** — rev 3 정본의 「1:1 사전·시간 귀책 금지」 위반. 에러 뒤 폼이 사라져 입력값을 잃고 처음부터 다시 열어야 함 |
| U9 | 폐기·미실행 | — | rev 4 지시대로 밟지 않음 |
| U10 | ❌ | 관리자 해소 뒤 reporter 화면 전부(홈·/my·목록·플롯 상세) 에서 「비공개 처리됨」「기준 충족·유지」「이 채널 차단」 문구/버튼 0 · 화면이 알림 API 를 부르지 않음. **대체 측정** `GET /api/notices`(reporter) → 200 `notices:[{kind:report_kept,refId:d8acceba,payload:{publicCode:24e42f72}},{kind:report_hidden,refId:eea24077,payload:{publicCode:55a4f48f}}]` | 서버 통지 행은 생성(user_notices 2건). 유저 화면 표면 = 없음(`/my/notices` 는 공지사항 모달로 감). [이 채널 차단] 버튼 관측 불가 |
| U11 | ❌ | maker 화면(홈·/my·/my/notices·목록·내 영상집) 어디에도 알림 항목·[이의] 버튼 0. 목록엔 「임시 비공개(검토 중)」 표식(원인 0) · 표식 클릭 → `POST /api/video-library/view` 404 → 「열지 못했어요」. 내 영상집 행 = 「1편 · 회사 비공개 · 공개할 수 없음 · 5초」(클릭해도 아무 것도 안 열림). **대체 측정** `GET /api/notices`(maker) → `video_hidden` 2건(payload `{reason:minor|rights, videoId, publicCode:null}`) — 사유·30일·복구/외형 교체·잉크 환급 안내 필드 없음 | 즉시 알림 행은 DB 에 생김(bdc7a9ed·1c06f574). 화면 미착지 + [이의] 0. 「회사 비공개」 문구가 검토 중 단계에서 제작자에게 노출됨(수동 비공개와 구분 안 됨) |
| U12 검토 중 | ✅ | other 계정 목록: vMinor 행 「🔒 임시 비공개(검토 중)」(`plotvideos-ep-review-<id>`) · 원인/「위반」 문구 0 · 신고 안 된 vKeep 등엔 표식 0. maker 계정 목록 동일 표식. API `underReview:true, locked:true`. 채널 페이지 「공개 3편」 | ✅ |
| U12 확정 | ❌ | 관리자 ⑴ 확정(11:44) 뒤 → ⓐ other 목록: vMinor 행 **여전히 「임시 비공개(검토 중)」**(API `underReview:true`) · 목록에서 안 빠짐. 미해소 신고를 0으로 만든 뒤(유스티언 신고도 유지 처리 11:47) 재측정해도 동일. 직접 링크: `/v/55a4f48f`·`/video/<id>` → 홈으로 리다이렉트(라우트 없음) · 목록에서 행 클릭 → `POST /api/video-library/view` 404 → **「열지 못했어요」**(「볼 수 없는 영상입니다」 아님). ⓑ maker 목록: 「비공개 처리됨」 표식 없음 · 「임시 비공개(검토 중)」 그대로 · 누를 통지 항목 없음 | ⓐⓑ 모두 미성립. 서버 술어(reviewing/hidden 2값) 가 화면에 안 닿음. ⓓ 수동 비공개 축은 미측정(관리자 「영상함」 탭 조작 없음) |
| U13 | ✅ | 공개 표면 이름 = 채널명 「b1aa9jte」(시스템 생성 · maker2 는 이름 없어 「채널」), 항목명 「1편·2편…」, 플레이어 캡션 「b1aa9jte / 갑을역전 · 1편 · 5초」. 유저 자유 텍스트 0. 캐릭터 페이지 name null 이라 이름 미노출 | 룩북·앨범 표면은 fixture 에 없어 미측정 |
| U14 | ✅ | 플레이어: `<video controls=false controlslist=nofullscreen>` · `a[download]` 0 · 다운로드 버튼 0. 비로그인 컨텍스트로 목록·채널·플롯·`/v/<code>` 열면 전부 「Google로 로그인」 화면(`GET /api/auth/options` 만 호출) | ✅ |
| U15 | ✅ | 목록 각 행 「고유번호 55a4f48f」(8자 · `plotvideos-ep-code-<id>`) 1줄 | ✅ |
| U16 | ✅ | 플롯 상세: 「⋯」 메뉴 자체 없음(hero = ‹ ♡ ↗ 19) · 텍스트에 「신고」「차단」 0. `/my` 「문의하기」 카테고리 = 버그 제보·개선 요청·환불 요청·기타(「신고」 없음). admin 토큰으로 플롯 상세 열어도 owner 「강제 차단」 카드 0 | owner 카드는 admin 계정이 staging API 상 owner 인지 불명 → 「관측 한계」(카드 없음만 확인) |
| A0 | ✅ | admin-cookie.sh 핸드셰이크 쿠키 `yusti_admin` 로 ADM 진입. 사이드바 「👤 유저 상대하는 일 › 🛡 신고 — 영상·유스티언 신고 — 목록·상세·결과(유지 / 비공개 확정 ⑴)」 클릭 → `#/reports`(내용은 iframe `/reports`). **pageerror 0 · console.error 0** | 콘솔 헤더 「STAGING 🌐 운영DB(yusti-staging…)」 + 하단 「🔧 로컬DB — 운영 무접촉(ADMIN_DB_LOCAL=1)」 두 표기 공존(혼동 소지) |
| A1 | ✅(결함 2) | `GET /api/reports` 200 → 「3건」: 「미성년 의심 · 갑을역전 · 55a4f48f · b1aa9jte / 접수 · 자동검사 — · 접수 9/18/2026, 8:30:17 PM / SLA 23시간 48분」, 「권리침해 · … 24e42f72 …」, 「미성년 의심 · 채널 e1c60d44-…(캐릭터 id)」. 상태 필터 select(전체/received/reviewing/resolved) + 「불러오기」. **pageerror 0** | 결함: ⓐ 유스티언 신고 행이 「채널 <캐릭터 uuid>」 로 표기(상세는 「채널 — · undefined」) ⓑ ③차단 신고(4fe9263b·resolved hidden_channel)는 목록에 없음(설계면 표기 필요) ⓒ 해소 뒤에도 「SLA 23시간 …」 카운트가 계속 표시 |
| A2 | ✅(⑵⑶·외형 교체 = 미구현(발주 대기)) | 상세 = id·사유·상태 / SLA / (권리침해는 법정 기한 10/18) / 대상 「갑을역전 · 고유번호 55a4f48f · 채널 b1aa9jte 임시 비공개 중」 / 자동 검사(참고) `{}` / 본인 확인 JSON / 입력 「비공개 사유(확정 시 필수)」 / 버튼 **「비공개 확정 ⑴ 이 영상만」「유지(기준 충족)」** 2개뿐. vMinor: 사유 입력 → ⑴ → `POST /api/reports/resolve {resolution:hidden_video,reason}` 200 `{noticeId:b2efb438}` → 「해소 hidden_video · 판정 hidden_video · qa-rv-admin … / 이미 해소된 신고다 — 결과는 다시 바꾸지 않는다.」. vRights: 유지 → `{resolution:kept}` 200 `{noticeId:3d83165f}` → 대상 「공개 중」(hidden_by_company_at null 로 되돌아감). pageerror 0 | 화면 상단 안내가 「⑵⑶·외형 교체는 다음 슬라이스(ⓑ)」 라고 명시. 관측: ⑴ 확정 뒤 상세 대상 문구가 「임시 비공개 중」 그대로 · video_library.hidden_reason 이 관리자 입력 문면으로 덮어써짐(원래 `report:minor:<id>`) |
| A3 | 미구현(발주 대기) | ⑵ 버튼 없음 → vExtra 신고 생성·실행 안 함 | 관측만 |
| A4 | 미구현(발주 대기) | 콘솔에 플롯 강제 차단 항목 없음(사이드바 전수 확인) | 관측만 |
| A5 | ⚠ | 상세 「자동 검사(참고)」 칸 = `{}` · 목록 배지 「자동검사 —」. API `autoCheck:{}` | 칸은 있으나 값이 비어 「참고 자료로 붙는가」 는 못 봄 — 외견 미성년 검사 결과를 넣는 배치/센서(ⓒ 축)가 있어야 관측 가능 |
| X1 | ❌(부분) | ①·② 접수 즉시 `hidden:true` · DB `hidden_by_company_at` 즉시 기록 · 다음 조회부터 other/maker 에 「임시 비공개(검토 중)」 ✅. ops 큐 task: DB `routed_task` 전 신고 NULL · 관리자 API `routedTask:null` | 임시 비공개 ✅ · ops 큐 task 1건(dedup) 미착지 |
| X2 | ❌(부분) | resolve 시 서버가 통지 자동 생성(신고자 report_hidden/report_kept · 만든 사람 video_hidden 은 접수 시점) — DB user_notices 5건 · `/api/notices` 로 조회됨. 유저 화면 어디에도 표시 없음(U10·U11) | 통지 생성 ✅ · 앱 조회 표면 0 |
| X3 | ⚠ | [이의] 버튼이 maker 화면 어디에도 없어 누를 수 없음. 관리자 목록에서 reopen 관측 불가 | 있어야 할 것: 제작자 통지 항목의 [이의] 버튼(U11) |
| X4 | 미구현(발주 대기) | ② 접수 시 `legalDue` +30일 기록·SLA +24h 기록은 됨. live 큐 route-add·텔레그램 SEV2·감사 표는 관측 수단 없음(큐 CLI 0·DB 쓰기 0 이라 SLA 초과 시각 조작도 안 함) | 관측만 |

## 스크린샷(SHOTS=/private/tmp/claude-501/-Users-inhohur-work-yusti-review/40b6860a-9641-4bbc-8f2e-fc0c6216f104/scratchpad/shots)
U0-list/plot/channel/char · U1-menu-vMinor · U2-report-options · U3-after-select-1/after-3s/after-reload · U4-maker2-list-before/after-select-3/after-close-3s/after-reload/plot-strip/maker2-channel · U5-my-before/block-list/after-unblock/maker2-list-after · U7-char-menu/options/after-1/after-close/reload/menu-2/options-2/rereport · U8-form/submit-nocheck/submit-filled-nocheck/filled-nocheck/filled-nocheck-result/checked/submitted/after-close-3s/after-reload · U11-maker-home/notices/click-reviewmark/more-own/mylib/mylib-plot/mylib-confirmed/mylib-click-row · U12-reviewing-other-list/other-channel/maker-list/maker-my · U12-confirmed-other-list/maker-list · U12-confirmed2-other-list/maker-list · U12-direct-v-code/video-id/list-v · U12-other-click-vMinor · U14-player/player-more/anon-list/anon-channel/anon-plot/anon-code · U16-plot-detail/support/admin-plot · X2-reporter-home/my/list/plot · A0-admin-home · A1-reports-list/list-after/list-resolved-filter · A2-detail-vMinor/vMinor-before-hide/vMinor-after-hide/detail-vRights/vRights-after-keep/detail-yustian/yustian-after-keep (총 84장)

## 건드린 DB 행(전부 화면/API 조작으로 생성 · psql 은 SELECT 만)
- content_reports: `eea24077-1898-4fbf-ab33-c386418a330f`(video vMinor · minor · resolved/hidden_video) · `d8acceba-d5d3-4758-91df-087fafbe1f44`(video vRights · rights · resolved/kept · reporter_contact {name,contact,self:true} · legal_due 10/18) · `4fe9263b-f650-4199-8474-5b28e5ead194`(video vBlock · block · resolved/hidden_channel) · `bcbaf6e9-d2bf-40c4-9c34-d54de655cb6e`(yustian charId · minor · resolved/kept — 「검토 중」 표식 교란 배제용으로 유지 처리). 전건 routed_task NULL
- user_notices: maker `bdc7a9ed…`(video_hidden/minor) · `1c06f574…`(video_hidden/rights) / reporter `b2efb438…`(report_hidden) · `3d83165f…`(report_kept) · `56d75958…`(report_kept · yustian). 전건 read_at NULL
- channel_blocks: reporter→maker2 1행 생성 후 해제(현재 0행)
- video_library: `a27fd285…`(vMinor) hidden_by_company_at=11:30:17 · hidden_reason=「검수 2회차 · 외견 미성년 의심 확인」(관리자 입력으로 덮어써짐) / `31b9b410…`(vRights) 임시 비공개 후 유지로 복원(null) / 나머지 3편 변화 없음

## 못 한 것(하려 했으나 막힘)
- U6 영상 축 화면 재신고(신고 즉시 목록에서 빠져 진입 없음 → API 대체 측정)
- U10/U11 통지 화면·U11 [이의]·X3 reopen(유저 화면에 통지 표면·[이의] 버튼이 없음)
- U12 확정 ⓐ 직접 링크 「볼 수 없는 영상입니다」(공개 영상 직접 링크 라우트 자체를 못 찾음 — `/v/<code>`·`/video/<id>` 는 홈으로) · ⓓ 수동 비공개 축(관리자 「영상함」 탭 조작은 대본 밖이라 안 함)
- A5 자동 검사 값(비어 있음)
- U4 「유스티언 페이지 노출 사라짐」(maker2 소유 캐릭터 fixture 없음) · U13 룩북·앨범(fixture 없음) · U16 owner 카드(admin 이 owner 인지 불명)

## 안 한 것(규칙상)
- U9(폐기) · A3 ⑵ 실행·vExtra 신고 생성(버튼 없음) · A4 · X4 SLA 초과 드릴(DB 시각 조작 = 쓰기) · 큐/발주 CLI · 코드 열람 · 관리자 「영상함」 수동 비공개

## 한계
- 픽셀·레이아웃은 못 봄(innerText·testid·API 응답이 근거 · 스크린샷은 남김). 시각 판단(표식 위치 「같은 위치」)은 미평가
- 관리자 pageerror/console 수집 = 신고 탭 iframe 포함 페이지 단위 · 전 관리자 세션 0건
- 유저 웹 console.error 는 404/400/409 리소스 로드 실패 로그와 `<video>` 「no supported source」 pageerror(내 영상집 썸네일 mp4 · fixture 파일 부재로 추정) 만
- 같은 세션 id 를 공유하는 다른 에이전트가 corpos_engine(localhost) 에 psql 접속한 고지가 섞여 들어왔음 — 이 검수의 psql 은 전부 staging `neondb` 였음
