# 검수 대본 r4 — 공개 영상 신고·채널 차단 (uc_a38ca9cc51bb rev4 · 4회차 범위)

너는 이 대본만 보고 밟는 실행자다. 코드베이스(/Users/inhohur/work/yusti-review 의 lib/ mobile/ server.js admin/)를 **읽지 마라** — 화면과 API 응답만 관측하고 그대로 기록한다. 코드 수정 0 · DB 쓰기 0(SELECT 도 필요 없다) · 유료 호출 0.
판정은 하지 말고 **관측을 기록**한다: 각 UC 마다 「무엇을 눌렀나 → 화면에 무엇이 보였나(텍스트 그대로) → 관련 API 요청/응답(상태코드·핵심 필드)」. 기대와 다르면 「다르다」고 적되, 이유 추정은 한 줄로만.
막히면 거기서 멈추지 말고 다음 UC 로 계속 간다(막힌 것은 「미실행/막힘 + 무엇이 없었나」로 남긴다).

## 환경
- 유저 웹: https://staging.yusti.pages.dev  (API = https://staging-api.yusti.net) · 모바일 뷰포트 420×900
- 로그인 = 브라우저 컨텍스트 생성 시 `addInitScript` 로 `localStorage.setItem("yusti_auth", JSON.stringify({mode:"google", token:<TOKEN>}))`
- 계정 토큰:
  - reporter(신고자 B) = `627b2a7bd401927ed697c4a6fa405ff74c9426118e2ee7a142ee393733af8dfa`  (userId 007b176d-e095-45bf-b275-0d998d41c665)
  - other(제3자 C)     = `ae70459d5d1be35d0c590a15decf922f31d1eb51dd2ee35bdbb1c7a98b603098`  (userId 0b462aa6-cf26-42a2-a770-bb9664dde176)
  - maker(제작자 A)    = `2d12864971676220f2ca229e39b322a1761b6f5481de342598fc6040b6f32d53`  (userId 1cce1ef9-6cc5-4943-a4aa-9d2599ff7621) · 채널명 QA검수채널A
  - maker2(채널 차단 대상) = `fd65b29fdfe595b5c19bcdd8681c7090608613cdf03034c2b9c73f54cf5e85a1` (userId 3f1de99b-45aa-4dd7-b2a1-e810535f33ec) · 채널명 QA검수채널B
- 관리자 콘솔(로컬 콜드 스타트·staging DB): http://127.0.0.1:3016/reports · 뷰포트 1280×900
  - 로그인 = 쿠키 `yusti_admin=2712d699204d9b7f4be85f84ebfb1c0995a67cc41fbb7a8b` (domain 127.0.0.1 · path /) 를 `context.addCookies` 로 심는다
- 재료(플롯 yd-yuseoa · 공개 영상 5편 · 캐릭터 1):
  - vMinor  id=442324b1-6655-40c7-b62e-9fc7854cc2ef  고유번호 e4cd348a (maker)
  - vRights id=793c71e7-ba57-47be-a664-739557bfdc22 고유번호 b8c45cf6 (maker)
  - vKeep   id=b4adc7f6-bd11-4d48-88d2-ba3b423baaa7   고유번호 292b9f6e (maker)
  - vOwn    id=34e66697-2a56-48cb-a2ef-c0d1c8ff161d    고유번호 b2d522b7 (maker)
  - vBlock  id=f8171137-9422-4ba7-9c55-e0d248088d92  고유번호 76954b26 (maker2)
  - 캐릭터(유스티언) id=edff5af9-551e-459c-97fe-86c045f37def · 이름 QA검수유스티언 · 페이지 https://staging.yusti.pages.dev/character/edff5af9-551e-459c-97fe-86c045f37def
- 진입 URL(추측 금지·여기 적힌 것만): 제작자 영상 목록 = https://staging.yusti.pages.dev/plot/yd-yuseoa/videos/<ownerUserId> · 채널 = /channel/<ownerUserId> · 마이 탭 = /my · 플롯 상세 = /plot/yd-yuseoa
- 실행: playwright chromium(headless) · `NODE_PATH=/Users/inhohur/work/yusti-review/node_modules node <스크립트>` · 스크립트·스샷·결과는 전부 `/Users/inhohur/ai/experiments/yusti-shorts/2026-09-20-t_7ac0-content-report-uc-r4/` 에 둔다(스샷 이름 = UC 번호-설명.png). 결과 = `/Users/inhohur/ai/experiments/yusti-shorts/2026-09-20-t_7ac0-content-report-uc-r4/result-r4.md`.
- 네트워크 기록: `page.on("response")` 로 URL 에 `/api/content/`·`/api/notices`·`/api/reports`·`/api/support`·`/api/video-library`·`/api/plot-videos` 가 들어간 응답의 status 와 body(앞 300자)를 남긴다.
- react-native-web: testID → `data-testid` 속성. disabled 는 `aria-disabled="true"`. 시트/모달은 열린 뒤 500ms 정도 대기. 화면 진입 뒤 로딩은 `waitForSelector` 로 기다린다(타임아웃 30s).

## testID 지도(있는 것만 · 없으면 텍스트로 찾는다)
- 영상 목록 행: `plotvideos-ep-<videoId>` · 행 ⋯ = `plotvideos-ep-<videoId>-more` · 시트 = `…-sheet` · 「신고」 = `…-report` · 사전 차단 문구 = `…-blocked` · 사유 = `…-reason-minor` / `…-reason-rights` / `…-reason-block` · 권리침해 폼 = `…-rights-name` `…-rights-contact` `…-rights-self` `…-rights-submit` · 접수 결과 문구 = `…-result` · 닫기 = `…-close`
- 영상 목록 행의 검토 표식 = `plotvideos-ep-review-<videoId>`(텍스트) · 표식 누르기 = `plotvideos-ep-review-open-<videoId>`
- 풀화면 플레이어 ⋯ = `shorts-more`(접두 shorts) · 캐릭터 페이지 ⋯ = `character-more`(접두 character)
- 마이 탭: 알림 행 = `mytab-notices` · 문의 = `mytab-support`
- 통지 모달: `usernotices-root` · 항목 `usernotice-<noticeId>` · 포커스 표식 `usernotice-focus-<noticeId>`(「이 영상」) · 번호 `usernotice-code-<noticeId>` · [이 채널 차단] `usernotice-block-<noticeId>` · 차단 결과 문구 `usernotice-blockmsg-<noticeId>` · [이의 제기] `usernotice-appeal-<noticeId>` · 닫기 `usernotices-close`
- 내 영상집(제작자 · 마이 탭에서 「내 영상」류 진입 · 또는 플롯 상세의 내 영상 진입): 행 `myvid-row-<videoId>` · 상태 문면 `myvid-sub-<videoId>` · 표식 누르기 `myvid-review-open-<videoId>` · 요약 `myvid-summary`
- 관리자 신고 탭: 목록 행 = `#row-<reportId>`(클릭 = 상세) · 상세의 `#why` 입력 · 버튼 텍스트 「비공개 확정 ⑴ 이 영상만」 / 「유지(기준 충족)」 · 결과 `#out2`

## UC 순서(★순서대로 · 건너뛰지 않는다)

### U0 문
reporter 로 https://staging.yusti.pages.dev/plot/yd-yuseoa/videos/1cce1ef9-6cc5-4943-a4aa-9d2599ff7621 진입 → 목록에 편이 몇 개 보이나(행 testid 로 센다 · 4편 기대: vMinor·vRights·vKeep·vOwn) · 스샷.

### U3(회귀) ①신고 → 즉시 사라짐
reporter · vMinor 행 ⋯ → 시트 → 「신고」 → 「미성년으로 보여요」 → 결과 문구 텍스트 그대로 기록(기대 「신고한 콘텐츠는 내 화면에서 사라집니다.」) → 닫기 → 3초 뒤 목록에 vMinor 가 있나(기대: 없음). POST /api/content/report 응답 기록.

### U3-2 두 번째 신고(관리자 「유지」용 재료)
reporter · vKeep 행 ⋯ → 신고 → 「미성년으로 보여요」 → 닫기. 응답 기록.

### U8(회귀) ② 권리침해 폼
reporter · vRights 행 ⋯ → 신고 → 「제 얼굴·이름이에요」 → 폼(이름·연락처·체크) 스샷 → ★체크 없이 이름 「검수」 연락처 「010-0000-0000」 넣고 접수 → 화면 문구 그대로(기대 「본인이 맞다는 확인에 체크해 주세요.」 · 「잠시 후」류면 다르다) · 응답 400 코드 기록 → 폼이 남아 있나(입력값 유지 여부 관측만) → 체크 → 접수 → 응답 200 기록 → 닫기 → vRights 사라짐 확인.

### U12 검토 중(회귀 · 제3자)
other 로 같은 목록 URL 진입 → vMinor·vKeep·vRights 행에 표식 텍스트(`plotvideos-ep-review-<id>`) 그대로 기록(기대 「임시 비공개(검토 중)」류 · 「위반」·원인 문구 0) · vOwn 표식 없음 확인 · 스샷.

### U11-검토중 + ⑹-3 rowState(제작자 내 영상집)
maker 로 /my 진입 → 마이 탭에서 내 영상집(「내 영상」·「영상집」 등 텍스트 찾기 · 안 보이면 /plot/yd-yuseoa 상세에서 내 영상 진입) → `myvid-row-*` 4행 · 각 행 `myvid-sub-<id>` 텍스트 그대로(기대: vMinor/vKeep/vRights = 「임시 비공개(검토 중)」 계열 · ★「회사 비공개」·「공개할 수 없음」 문구가 있으면 그대로 기록) · vOwn 정상 · 스샷.
그 다음 maker /my → `mytab-notices` 클릭 → 통지 모달 → 항목 수·각 항목 텍스트 전체 기록(기대: video_hidden 통지 3 · 문면에 「최대 30일」·「복구」·「외형」·「잉크 환급」 · 사유 원문 0 · 「위반」 0) · 각 항목에 `usernotice-code-*`(영상 번호) 있나 기록 · [이의 제기] 버튼 있나 · 스샷.
★ⓒ [이의 제기](vMinor 통지의 것) 클릭 → 어디로 가나(문의하기 화면?) → 본문 prefill 텍스트 **그대로** 기록(기대: 「영상 e4cd348a」 처럼 고유번호가 들어 있다) · 스샷. 문의를 **제출하지는 마라**.

### U1 ⑹-2 본인 영상엔 「신고」 없음
maker 로 /plot/yd-yuseoa/videos/1cce1ef9-6cc5-4943-a4aa-9d2599ff7621 진입 → vOwn 행 ⋯ → 시트 항목 텍스트 전부 기록(기대: 「신고」 없음 · 「닫기」만 또는 다른 항목) · 스샷. 풀화면(행 클릭 또는 「전체 재생」)에서 `shorts-more` 가 있으면 눌러 항목 기록.
대조: reporter 로 같은 화면 vOwn ⋯ → 「신고」 있음 확인(신고는 하지 마라).

### U7 ⑹-1 유스티언 신고 접수 문면
reporter 로 /character/edff5af9-551e-459c-97fe-86c045f37def 진입 → `character-more` → 신고 → 「미성년으로 보여요」 → 결과 문구 **그대로**(기대 「신고를 접수했어요. 검토 결과는 알림으로 알려 드려요.」 · 「사라집니다」면 다르다) · 응답 기록(hidden 값) · 닫기 뒤 페이지가 남아 있나 · 스샷.
U6(회귀): 새로고침 → `character-more` → 시트에 사전 문구(`character-blocked`) 텍스트 · 「신고」 aria-disabled 값 기록.

### A0/A1 관리자 목록
관리자 컨텍스트(1280×900 · 쿠키) → http://127.0.0.1:3016/reports → pageerror·console.error 수집 → 목록 행 수와 각 행 텍스트(기대 4건: 미성년(vMinor)·미성년(vKeep)·권리침해(vRights)·유스티언 「QA검수유스티언」) · 각 행에 SLA 남은 시간·상태 표시 있나 · 스샷.

### A2 결과 처리
vMinor 행 클릭 → 상세 스샷 → `#why` 에 「검수 r4 확정」 입력 → 「비공개 확정 ⑴ 이 영상만」 클릭 → `#out2` 텍스트 · POST /api/reports/resolve 응답 기록.
vKeep 행 클릭 → 「유지(기준 충족)」 클릭 → `#out2` · 응답 기록. 목록 재조회 스샷(상태 변화).
(vRights·유스티언 건은 그대로 둔다)

### U10 + ⓑ [이 채널 차단](신고자)
reporter /my → `mytab-notices` → 통지 항목 텍스트 전부(기대: 「비공개 처리됐어요」(vMinor) · 「기준을 충족해 유지」(vKeep) · 각 항목 영상 번호) · ★vKeep(유지) 통지에 `usernotice-block-<id>` 버튼 있나 · vMinor(비공개) 통지엔 없나 · 스샷.
★버튼 클릭 → `usernotice-blockmsg-<id>` 문구 그대로 · POST /api/content/report(또는 /api/content/…) 응답 기록 → 모달 닫기 → /plot/yd-yuseoa/videos/1cce1ef9-6cc5-4943-a4aa-9d2599ff7621 재진입 → maker 영상이 보이나(기대: 채널 차단으로 전부 사라짐 · vOwn 포함) → /my 에서 「차단한 채널」 항목 텍스트(기대: 채널명 「QA검수채널A」 노출) → 해제 클릭 → 응답 → 목록 재진입 → vOwn 이 다시 보이나. 스샷.

### U11-확정 + ⓐ 표식 클릭(제작자)
maker → 내 영상집(위와 같은 경로) → vMinor 행 `myvid-sub-*` 텍스트(기대 「비공개 처리됨」 · 「검토 중」 아님 · 원인·「위반」 0) · vKeep 행 텍스트(기대: 검토 표식 없음·공개) · vRights 행(검토 중 그대로) · 스샷.
★`myvid-review-open-442324b1-6655-40c7-b62e-9fc7854cc2ef` 클릭 → `usernotices-root` 가 열리나 · 열리면 `usernotice-focus-*`(「이 영상」) 가 어느 항목에 붙나(그 항목 텍스트·번호) · GET /api/notices 호출 여부 · 스샷.
maker 통지 모달의 vMinor 관련 항목 전체 텍스트(확정 뒤 새 통지가 추가됐는지 · 몇 건인지).

### U12 확정(제3자)
other → /plot/yd-yuseoa/videos/1cce1ef9-6cc5-4943-a4aa-9d2599ff7621 → 행 목록: vMinor 있나(기대: 없음) · vKeep 표식(기대: 없음·정상) · vRights 표식(검토 중) · 스샷.

### U16(회귀) 구 신고/차단 문 제거
reporter → /plot/yd-yuseoa 상세 → 화면의 ⋯/메뉴 버튼을 찾아 열고 항목 텍스트 전부 기록(기대: 「신고」「차단」 없음) · 스샷. /my → `mytab-support`(문의하기) → 카테고리 선택지 텍스트 전부(기대: 「신고」 없음) · 제출하지 마라 · 스샷.

## 결과 파일 형식 (/Users/inhohur/ai/experiments/yusti-shorts/2026-09-20-t_7ac0-content-report-uc-r4/result-r4.md)
UC 별로: `### <UC>` / 밟은 순서 / 화면 텍스트(그대로) / API 로그(메서드 URL status body앞부분) / 스샷 파일명 / 「기대와 같다 / 다르다(무엇이) / 못 봤다(무엇이 없어서)」 한 줄.
마지막에 pageerror·console.error 전수(유저 웹·관리자 각각).
