# 검수 결과 r4 — 공개 영상 신고·채널 차단 (uc_a38ca9cc51bb rev4)

실행 2026-09-20 18:19~18:27 KST · playwright chromium headless · 유저 웹 420×900 · 관리자 1280×900
스크립트 = `lib.js` `p1-reporter.js` `p1b-reporter-u8.js` `p2-pre-admin.js` `p2b-u1-u7.js` `p3-admin.js` `p3b-admin-detail.js` `p4-post-admin.js` · 원 로그 = 같은 이름 `.log`(전체 NET 응답 포함)
코드 읽기 0 · 코드 수정 0 · DB 접속 0 · 문의 제출 0.
온보딩(생년월일) 화면: 세 계정 모두 어느 진입에서도 뜨지 않았다.

---

### U0 문
밟은 순서: reporter → /plot/yd-yuseoa/videos/1cce1ef9-6cc5-4943-a4aa-9d2599ff7621 진입.
화면: 행 testid 4개 = vMinor, vRights, vKeep, vOwn. 목록 헤더 「QA검수채널A | 갑을역전 · 2편 | ☆ 0 | 1편부터 재생 · 무료 1편」(※ 헤더의 「2편」은 행 4개와 다른 수 · 스샷 U8-nocheck 에서도 「갑을역전 · 2편」).
API:
- GET /api/plot-videos/owner?plot=yd-yuseoa&owner=1cce1ef9-… 200 `{"ok":true,"videos":[{"id":"442324b1-…","public_code":"e4cd348a","underReview":false,…`
- GET /api/notices?unread=1 200 `{"ok":true,"notices":[]}`
스샷: U0-list.png
기대와 같다(4편).

### U3(회귀) ①신고 → 즉시 사라짐
밟은 순서: vMinor ⋯ → 시트 「신고 | 닫기」 → 「신고」 → 사유 시트 「미성년으로 보여요 | 제 얼굴·이름이에요 | 보고 싶지 않아요 | 닫기」 → 「미성년으로 보여요」 → 닫기 → 3초.
화면: 결과 문구(`…-result`) = 「신고한 콘텐츠는 내 화면에서 사라집니다.」 · 시트 = 「신고한 콘텐츠는 내 화면에서 사라집니다. | 닫기」 · 닫기+3초 뒤 행 = vRights, vKeep, vOwn (vMinor 없음).
API:
- GET /api/content/report/state?targetKind=video&targetId=442324b1-… 200 `{"ok":true,"blocked":null,"until":null}`
- POST /api/content/report 200 `{"ok":true,"reportId":"beed99d0-28f6-4ac7-b609-cd1759c7e544","status":"received","hidden":true,"slaDue":"2026-09-21T09:19:43.849Z","legalDue":null}`
스샷: U3-reasons.png · U3-result.png · U3-after.png
기대와 같다.

### U3-2 두 번째 신고(vKeep)
밟은 순서: vKeep ⋯ → 신고 → 「미성년으로 보여요」 → 닫기.
화면: 결과 문구 「신고한 콘텐츠는 내 화면에서 사라집니다.」 · 닫기 뒤 행 = vRights, vOwn.
API: POST /api/content/report 200 `{"ok":true,"reportId":"c34f1f3f-05f9-40e2-9b2c-e69338083ff5","status":"received","hidden":true,"slaDue":"2026-09-21T09:19:49.908Z","legalDue":null}`
기대와 같다.

### U8(회귀) ② 권리침해 폼
밟은 순서: vRights ⋯ → 신고 → 「제 얼굴·이름이에요」 → 폼 → 체크 없이 이름 「검수」·연락처 「010-0000-0000」 입력 → 「접수」(aria-disabled 아님 · 클릭됨).
화면(폼): 시트 텍스트 「☐ 본인 또는 정당한 권리자입니다 | 접수 | 닫기」 · 입력 placeholder = 「이름」 / 「연락처(이메일 또는 전화)」 · 체크박스 `…-rights-self` 있음(aria-checked 속성 없음 · 문자 ☐/☑ 로 표시).
화면(체크 없이 접수 뒤): 시트 = 「본인이 맞다는 확인에 체크해 주세요. | 닫기」 · `…-result` = 「본인이 맞다는 확인에 체크해 주세요.」
폼 유지 여부: **폼이 사라졌다** — `…-rights-name` `…-rights-contact` `…-rights-self` `…-rights-submit` 전부 DOM 에 없음(입력값 유지 관측 불가). 이어서 체크하려다 30s 타임아웃 → 스크립트 재진입(p1b)으로 두 번째 절반 수행.
API(체크 없음): POST /api/content/report **400** `{"error":"self_declaration_required"}`
두 번째 절반(재진입 · 시트 다시 열림 「신고 | 닫기」 · GET state 200 blocked:null): 폼 다시 열고 이름·연락처 입력 → 체크 클릭 → 시트 「☑ 본인 또는 정당한 권리자입니다 | 접수 | 닫기」 → 접수.
화면: 결과 「신고한 콘텐츠는 내 화면에서 사라집니다.」 → 닫기+3초 뒤 행 = vOwn 만.
API(체크 후): POST /api/content/report 200 `{"ok":true,"reportId":"49f6b008-c640-4209-8693-0f7b40906a87","status":"received","hidden":true,"slaDue":"2026-09-21T09:20:56.099Z","legalDue":"2026-10-20T09:20:56.097Z"}`
스샷: U8-form.png · U8-nocheck.png · U8-form-checked.png · U8-result.png · U8-after.png
400 문구·코드·200·사라짐은 기대와 같다. 다르다(하나): 400 뒤 **폼이 남지 않고 결과 문구로 대체된다**(대본은 「폼이 남아 있나(입력값 유지 여부)」를 관측하라 했으나 폼 자체가 없어 관측 불가 · 이용자는 ⋯부터 다시 밟아야 한다).

### U12 검토 중(회귀 · 제3자)
밟은 순서: other → 같은 목록 URL.
화면: 행 4개 = vMinor, vRights, vKeep, vOwn · 표식 텍스트: vMinor=「임시 비공개(검토 중)」 · vRights=「임시 비공개(검토 중)」 · vKeep=「임시 비공개(검토 중)」 · vOwn=표식 없음. 「위반」·사유 원문 0.
API: GET /api/plot-videos/owner… 200 `…"public_code":"e4cd348a","underReview":true,"reviewSt…`
스샷: U12-review-other.png
기대와 같다.

### U11-검토중 + ⑹-3 rowState(제작자 내 영상집)
밟은 순서: maker → /my → 「🎞 내 영상집 · 작품 1 ›」 클릭 → URL 그대로 /my · `myvid-row-*` 없음(1.5초 뒤) → /plot/yd-yuseoa → 「내 영상집 4편 · 편집」 클릭 → 내 영상집 화면.
/my 화면 텍스트(발췌): 「프로필 | 구글 계정 (qa-rv-maker@test.local) | 보유 잉크 60개 ▾ | 충전 | … | 🎞 내 영상집 · 작품 1 | › | 🪙 잉크 기록 | › | 🔔 알림 3 | › | … | ✉️ 문의하기 | ›」
내 영상집 화면: 헤더 「‹ 뒤로 | 내 영상집 | QA검수채널A | 내 영상 4편 · 공개 1편 | 순서 = 공개함 재생 순서」 · `myvid-summary`=「내 영상 4편 · 공개 1편」
- vMinor `myvid-sub` = 「임시 비공개(검토 중) · 5초 · 9월 20일」 · `myvid-review-open` 없음
- vRights `myvid-sub` = 「임시 비공개(검토 중) · 5초 · 9월 20일」 · review-open 없음
- vKeep `myvid-sub` = 「임시 비공개(검토 중) · 5초 · 9월 20일」 · review-open 없음
- vOwn `myvid-sub` = 「공개 · 5초 · 9월 20일」
「회사 비공개」·「공개할 수 없음」 문구: 없음.
API: GET /api/video-library/mine?plot=yd-yuseoa 200 `{"ok":true,"videos":[{"id":"442324b1-…","is_public":true,…,"hidden_by_company_at":"20…`
스샷: U11-my.png · U11-myvid-review.png
기대와 같다(검토 중 3 · vOwn 공개). 못 봤다(하나): /my 의 「내 영상집」 행 클릭으로는 1.5초 안에 영상집이 안 열렸다(URL /my 유지) — 플롯 상세 경로로 우회.

통지 모달(maker /my → `mytab-notices`「🔔 알림 3」):
항목 3건(`usernotice-*`) — 각 항목 텍스트 그대로:
1. 07b58b35-… : 「회원님의 영상이 임시 비공개됐어요.\n신고가 접수되어 최대 30일간 비공개로 둡니다. 검토 결과에 따라 영상이 복구되거나 외형이 교체되며, 잉크 환급 대상이면 따로 안내드립니다.\n영상 b8c45cf6\n이의 제기」 · code=「영상 b8c45cf6」 · 이의 제기 있음
2. 05d04315-… : 같은 본문 · 「영상 292b9f6e」 · 이의 제기 있음
3. b16d25a0-… : 같은 본문 · 「영상 e4cd348a」 · 이의 제기 있음
모달 헤더 「알림 | 닫기」. 사유 원문 0 · 「위반」 0.
API: GET /api/notices 200 `{"ok":true,"notices":[{"id":"07b58b35-…","kind":"video_hidden","refKind":"content_report","refId":"49f6b008-…","payload":{"reason":"rights","videoId":"793c71e7-…","publicCode":"b8c45cf6"},…` (※ API payload 에는 `"reason":"rights"` 가 실려 있으나 화면 문면엔 안 나온다)
스샷: U11-notices-maker.png
기대와 같다(3건 · 「최대 30일」「복구」「외형」「잉크 환급」 포함 · 번호 · 이의 제기 버튼).

★ⓒ [이의 제기](vMinor 통지 b16d25a0) 클릭 → URL https://staging.yusti.pages.dev/my/support · 화면 「1:1 문의 / 고객지원 | ✕ | 문의 유형 | 버그 제보 | 개선 요청 | 환불 요청 | 기타 | 내용 | 문의 제출 | 내 문의 내역 | 아직 문의 내역이 없어요.」
입력값: INPUT(placeholder 「이름만 입력 — 예: 민호」) value=「QA검수제작채널」 · TEXTAREA(placeholder 「문의 내용을 적어주세요 (최대 2000자)」) value=「[이의] 영상 e4cd348a / 통지 b16d25a0-ef01-429e-a079-3f4d62d95526\n\n」
API: GET /api/support/tickets 200 `{"tickets":[]}`
스샷: U11-appeal-prefill.png · 제출 안 함.
기대와 같다(고유번호 e4cd348a prefill).

### U1 ⑹-2 본인 영상엔 「신고」 없음
밟은 순서: maker → 목록 URL → vOwn 행.
화면: 행 4개(vMinor·vRights·vKeep=🔒 임시 비공개(검토 중) · vOwn 정상). **vOwn 행에 ⋯(`…-more`) 자체가 없다** — 목록 testid 에 `plotvideos-ep-34e66697-…-more` 부재 · 있는 것 = `-meta` `-code` `plotvideos-reaction-…-up/-down`. 행 텍스트 「4편 · 5초 · 9월 20일\n고유번호 b2d522b7」. 시트를 열 수 없어 항목 텍스트 없음.
풀화면(행 클릭): shorts testids = shorts-root, shorts-stage, shorts-count, shorts-channel, shorts-sound, shorts-chan, shorts-meta, shorts-progress, shorts-progress-fill, shorts-close — **`shorts-more` 없음**(shorts-bm 도 없음).
API: POST /api/video-library/view 200 `{"ok":true,"url":"/qa/rv482728-0fd6a8b3-….mp4","ownerChannel":"QA검수채널A","counted":false,"self":true,"expiresAt":null}`
대조(reporter · 같은 화면 · 행 = vOwn 만): vOwn ⋯ → 시트 「신고\n닫기」 · `…-report` 있음 · 풀화면 shorts testids 에 `shorts-bm` `shorts-bm-n` `shorts-more` 있음 → `shorts-more` 클릭 → 시트 「신고\n닫기」. (신고 안 함) · GET state 200 blocked:null · POST view 200 `…"counted":true,"self":false…`
스샷: U1-maker-list.png · U1-maker-fullscreen.png · U1-reporter-sheet.png · U1-reporter-shorts-sheet.png
기대와 같다(제작자 화면에 「신고」 없음 — 다만 「닫기만」이 아니라 ⋯ 버튼 자체가 없는 형태) · 대조도 같다.

### U7 ⑹-1 유스티언 신고 접수 문면
밟은 순서: reporter → /character/edff5af9-… (화면 「⌂ | Q | ⋯ | ♡ | 0 | ↗ | QA검수유스티언 | 한국인 | 출연작 0 | 아직 출연한 작품이 없어요.」) → `character-more` → 시트 「신고\n닫기」(testids: character-more, character-backdrop, character-sheet, character-report, character-close) → 신고 → 「미성년으로 보여요 | 제 얼굴·이름이에요 | 보고 싶지 않아요 | 닫기」 → 「미성년으로 보여요」.
화면: `character-result` = 「신고를 접수했어요. 검토 결과는 알림으로 알려 드려요.」 · 시트 「신고를 접수했어요. 검토 결과는 알림으로 알려 드려요.\n닫기」 · 닫기 뒤 URL 그대로 /character/edff5af9-… · 페이지 본문 그대로 남아 있음.
API:
- GET /api/content/report/state?targetKind=yustian&targetId=edff5af9-… 200 `{"ok":true,"blocked":null,"until":null}`
- POST /api/content/report 200 `{"ok":true,"reportId":"9a6ee9ff-baeb-4ed7-9d6a-d1e7af51da60","status":"received","hidden":false,"slaDue":"2026-09-21T09:23:47.612Z","legalDue":null}`
스샷: U7-sheet.png · U7-result.png · U7-after-close.png
기대와 같다(hidden:false · 「사라집니다」 아님).

U6(회귀): 새로고침 → `character-more` → 시트 「신고\n오늘 이미 신고했어요. 내일부터 다시 할 수 있어요.\n닫기」 · `character-blocked` = 「오늘 이미 신고했어요. 내일부터 다시 할 수 있어요.」 · 「신고」 aria-disabled=「true」
API: GET …/report/state?targetKind=yustian… 200 `{"ok":true,"blocked":"daily_limit","until":null}`
스샷: U6-blocked.png
기대와 같다.

### A0/A1 관리자 목록
밟은 순서: 쿠키 컨텍스트 → http://127.0.0.1:3016/reports. 페이지 title 「신고 — Yusti 관리자」. pageerror 0 · console.error 0.
화면 상단: 「🛡 신고 | 유저가 올린 영상·유스티언 신고를 사람이 판정하는 자리 — 목록 → 상세 → 결과. | ★ 자동 검사(auto_check)는 참고다 — 게이트가 아니다(CEO 2026-09-11). … | ★ 영상 신고는 접수 즉시 임시 비공개다. 여기서 「비공개 확정」은 그 상태를 확정하고, 「유지」는 되돌린다. | ★ 이 화면의 결과는 ⑴ 이 영상만이다 — … | ★ 차단(block)은 이 목록에 안 뜬다 — … | 전체 | 접수(received) | 검토 중(reviewing) | 해소(resolved) | 불러오기 | 4건」 · 하단 띠 「🔧 로컬DB — 운영 무접촉 (ADMIN_DB_LOCAL=1 개발자 모드)」
행 4건(각 행 텍스트 그대로):
- #row-beed99d0-… : 「미성년 의심 · 갑을역전 · e4cd348a · QA검수채널A | 접수자동검사 — 접수 9/20/2026, 6:19:43 PM | SLA 23시간 55분」
- #row-c34f1f3f-… : 「미성년 의심 · 갑을역전 · 292b9f6e · QA검수채널A | 접수자동검사 — 접수 9/20/2026, 6:19:49 PM | SLA 23시간 55분」
- #row-49f6b008-… : 「권리침해 · 갑을역전 · b8c45cf6 · QA검수채널A | 접수자동검사 — 접수 9/20/2026, 6:20:56 PM | SLA 23시간 56분」
- #row-9a6ee9ff-… : 「미성년 의심 · 유스티언 QA검수유스티언 | 접수자동검사 — 접수 9/20/2026, 6:23:47 PM | SLA 23시간 59분」
SLA 남은 시간 있음 · 상태 칩(「접수」·「자동검사 —」) 있음.
API: GET /api/reports 200 `{"ok":true,"reports":[{"id":"beed99d0-…","targetKind":"video","targetId":"442324b1-…","publicCode":"e4cd348a","plotTitle":"갑을역전","channelName":"QA검수채널A","yustianName":null,"reason":"minor","status":"received","resolution":null,"routedTask":null,…`
스샷: A1-list.png
기대와 같다(4건 · SLA · 상태).

### A2 결과 처리
vMinor: #row-beed99d0 클릭 → 상세 「신고 | beed99d0-28f6-4ac7-b609-cd1759c7e544 · 미성년 의심 · 접수 | SLA | 23시간 55분 | 대상 | 갑을역전 · 고유번호 e4cd348a · 채널 QA검수채널A 임시 비공개 중 | 자동 검사(참고) | {} | 비공개 확정 ⑴ 이 영상만 | 유지(기준 충족)」 · 버튼 = [불러오기, 비공개 확정 ⑴ 이 영상만, 유지(기준 충족)] · `#why` 있음 → 「검수 r4 확정」 입력 → 「비공개 확정 ⑴ 이 영상만」.
- API: GET /api/reports/detail?id=beed99d0-… 200 `{"ok":true,"targetMissing":false,"target":{"id":"442324b1-…","public_code":"e4cd348a","user_id":"1cce1ef9-…","is_public":true,"hidden_by_company_at":"2026-09-20T09:19:43.857Z","hidden_reason":"report:minor:beed99d0-…",…`
- API: POST /api/reports/resolve 200 `{"ok":true,"id":"beed99d0-28f6-4ac7-b609-cd1759c7e544","status":"resolved","resolution":"hidden_video","noticeId":"a49e2b84-3c4c-46e4-bb31-515aa2f53a78","hiddenAt":"2026-09-20T09:19:43.857Z","keptHiddenBy":null}`
- `#out2`: **DOM 에 없음**(null) — 상세가 재렌더되어 「판정 | hidden_video · qa-rv-admin@test.local · 9/20/2026, 6:24:20 PM | 확정 사유(운영 메모) | 검수 r4 확정 | 이미 해소된 신고다 — 결과는 다시 바꾸지 않는다.」 가 상세 안에 표시됨. 페이지 id 목록 = status, reload, out, list, detail, dbmode-strip (`#out2` 없음 · `#out` 있음).
vKeep: #row-c34f1f3f 클릭 → 상세 「… c34f1f3f-… · 미성년 의심 · 접수 | SLA | 23시간 55분 | 대상 | 갑을역전 · 고유번호 292b9f6e · 채널 QA검수채널A 임시 비공개 중 | …」 · `#why` 빈 채로 「유지(기준 충족)」.
- API: POST /api/reports/resolve 200 `{"ok":true,"id":"c34f1f3f-05f9-40e2-9b2c-e69338083ff5","status":"resolved","resolution":"kept","noticeId":"f4eed48e-417a-431b-9d33-d270b87a5aad","hiddenAt":null,"keptHiddenBy":null}`
- 재조회 detail 200 `…"hidden_by_company_at":null,"hidden_reason":null,…` · 상세 「대상 | 갑을역전 · 고유번호 292b9f6e · 채널 QA검수채널A 공개 중 | … | 판정 | kept · qa-rv-admin@test.local · 9/20/2026, 6:24:24 PM | 이미 해소된 신고다 — 결과는 다시 바꾸지 않는다.」 · `#out2` 없음.
목록 재조회(4건 그대로 · 순서 바뀜):
- #row-49f6b008 「권리침해 · … · b8c45cf6 · … | 접수자동검사 — …」
- #row-9a6ee9ff 「미성년 의심 · 유스티언 QA검수유스티언 | 접수자동검사 — …」
- #row-beed99d0 「미성년 의심 · 갑을역전 · e4cd348a · QA검수채널A | 해소hidden_video자동검사 — 접수 9/20/2026, 6:19:43 PM | SLA 23시간 55분」
- #row-c34f1f3f 「미성년 의심 · 갑을역전 · 292b9f6e · QA검수채널A | 해소kept자동검사 — 접수 9/20/2026, 6:19:49 PM | SLA 23시간 55분」
스샷: A2-vMinor-detail.png · A2-vMinor-out.png · A2-vMinor-detail-after.png · A2-vKeep-detail.png · A2-vKeep-out.png · A2-vKeep-detail-after.png · A2-list-after.png
resolve 응답·상태 변화는 기대와 같다. 못 봤다(하나): 대본의 `#out2` 요소가 없다(결과는 상세 안 「판정」 줄로 표시).

### U10 + ⓑ [이 채널 차단](신고자)
밟은 순서: reporter → /my(「🔔 알림 2」) → `mytab-notices` → 모달.
통지 항목 2건(텍스트 그대로):
1. f4eed48e-… : 「신고하신 영상은 기준을 충족해 유지됩니다.\n보고 싶지 않으시면 그 채널을 차단할 수 있어요.\n영상 292b9f6e\n이 채널 차단」 · code=「영상 292b9f6e」 · `usernotice-block-*` **있음**(텍스트 「이 채널 차단」) · 이의 제기 없음
2. a49e2b84-… : 「신고하신 영상이 비공개 처리됐어요.\n검토 결과 기준에 어긋나 비공개로 두었습니다.\n영상 e4cd348a」 · code=「영상 e4cd348a」 · block 버튼 **없음**
API: GET /api/notices 200 `{"ok":true,"notices":[{"id":"f4eed48e-…","kind":"report_kept","refKind":"content_report","refId":"c34f1f3f-…","payload":{"targetId":"b4adc7f6-…","publicCode":"292b9f6e","targetKind":"video"},…` · GET /api/content/blocks 200 `{"ok":true,"blocks":[]}`
★[이 채널 차단] 클릭:
- API: **POST /api/content/report 409** `{"error":"daily_limit"}`
- `usernotice-blockmsg-f4eed48e` = 「오늘 이미 신고했어요. 내일부터 다시 할 수 있어요.」 · 항목 텍스트 「…\n영상 292b9f6e\n오늘 이미 신고했어요. 내일부터 다시 할 수 있어요.」
모달 닫기 → 목록 재진입: 행 = vOwn 만(헤더 「QA검수채널A | 갑을역전 · 1편 | ☆ 0 | 1편부터 재생 · 무료 1편 | 1편 · 5초 · 9월 20일 | 무료 1편 | 고유번호 b2d522b7 | ⋯ | 👍 | 👎」) — vOwn 이 여전히 보인다(vMinor·vKeep·vRights 는 reporter 본인 신고분이라 이전부터 안 보이던 상태).
/my 「차단한 채널」: /my 본문 전체에 「차단」 텍스트 없음 · testid 중 block 계열 없음(mytab-* = account, ink-card, balance, charge, ink-expiry-preview, group-money, group-prefs, notices, support, group-account, logout) · GET /api/content/blocks 200 `{"ok":true,"blocks":[]}`.
해제 클릭·재진입: 차단이 안 걸려 해제 대상 없음 · 목록 행 = vOwn.
스샷: U10-notices-reporter.png · U10-blockmsg.png · U10-list-after-block.png · U10-my-blocks.png · U10-list-after-unblock.png
통지 2건 문면·번호·버튼 유무는 기대와 같다. 다르다: **[이 채널 차단] 이 409 daily_limit 로 거부되어 차단이 걸리지 않았다**(reporter 가 오늘 이미 영상 3건+유스티언 1건 신고한 상태 · 차단이 신고와 같은 일일 한도를 탄다). 막힘 → 이후 「maker 영상 전부 사라짐」·「차단한 채널 항목(채널명 QA검수채널A)」·「해제」 는 관측 못 함. 「차단한 채널」 항목은 /my 에 텍스트·testid 모두 없음(차단 0건 상태라 숨겨진 것인지, 화면 자체가 없는지는 못 가른다).

### U11-확정 + ⓐ 표식 클릭(제작자)
밟은 순서: maker → /plot/yd-yuseoa → 「내 영상집 4편 · 편집」 → 영상집.
화면: `myvid-summary` = 「내 영상 4편 · 공개 2편」
- vMinor `myvid-sub` = 「비공개 처리됨 · 5초 · 9월 20일」 · `myvid-review-open-442324b1-…` **있음**
- vKeep `myvid-sub` = 「공개 · 5초 · 9월 20일」 · 검토 표식 없음(reaction·toggle·up/down 있음 · `myvid-free-…` 있음)
- vRights `myvid-sub` = 「임시 비공개(검토 중) · 5초 · 9월 20일」 · review-open 없음
- vOwn 「공개 · 5초 · 9월 20일」
「위반」·원인 문구 0.
★`myvid-review-open-442324b1-…` 클릭 → `usernotices-root` 열림=true · GET /api/notices 호출됨(200) · `usernotice-focus-b16d25a0-…` = 「이 영상」 이 b16d25a0 항목에 붙음 · 그 항목 텍스트 「이 영상\n회원님의 영상이 비공개로 확정됐어요.\n검토가 끝나 비공개 상태로 둡니다. 결과에 대해 의견이 있으시면 문의해 주세요.\n영상 e4cd348a\n이의 제기」 · code 「영상 e4cd348a」.
모달 항목 3건(전체):
1. 07b58b35 「회원님의 영상이 임시 비공개됐어요.\n신고가 접수되어 최대 30일간 비공개로 둡니다. 검토 결과에 따라 영상이 복구되거나 외형이 교체되며, 잉크 환급 대상이면 따로 안내드립니다.\n영상 b8c45cf6\n이의 제기」
2. 05d04315 「회원님의 영상이 다시 공개됐어요.\n검토가 끝나 공개 상태로 되돌렸습니다.\n영상 292b9f6e\n이의 제기」
3. b16d25a0 「회원님의 영상이 비공개로 확정됐어요.\n검토가 끝나 비공개 상태로 둡니다. 결과에 대해 의견이 있으시면 문의해 주세요.\n영상 e4cd348a\n이의 제기」
vMinor 관련 항목 = 1건(b16d25a0 · 같은 id 가 「임시 비공개」→「비공개로 확정」 문면으로 바뀜 · 새 통지 추가 아님). /my 「🔔 알림 3」 · 세 항목 모두 이의 제기 버튼 있음.
스샷: U11-myvid-confirmed.png · U11-review-open-modal.png · U11-notices-maker-after.png
기대와 같다(비공개 처리됨 · vKeep 공개 · vRights 검토 중 · 표식→모달·포커스·번호). 참고: 확정 통지는 새 건이 아니라 기존 통지 id 의 문면 갱신(3건 유지).

### U12 확정(제3자)
밟은 순서: other → 목록 URL.
화면: 행 = vRights, vKeep, vOwn (vMinor 없음) · 표식: vRights=「임시 비공개(검토 중)」 · vKeep 없음 · vOwn 없음.
API: GET /api/plot-videos/owner… 200 `…"id":"793c71e7-…","public_code":"b8c45cf6","underReview":true,…`
스샷: U12-confirmed-other.png
기대와 같다.

### U16(회귀) 구 신고/차단 문 제거
밟은 순서: reporter → /plot/yd-yuseoa.
화면 testid: detail-scroll, detail-hero, heart-toggle, heart-count, share-btn, plot-synopsis, role-section, role-card-r-victim-m, …, plot-video-strip, plot-video-strip-more, plot-video-gallery-btn, plot-myvideos-btn, plot-video-strip-adult-notice. 상단 버튼 = 「‹ | ♡ | 0 | ↗」 — **⋯/메뉴 버튼 없음**(텍스트 ⋯ 후보 0). ↗(share-btn) 클릭 → 본문 변화 없음(시트·항목 텍스트 없음 · 「신고」「차단」 0).
/my → `mytab-support` → URL /my/support · 화면 「1:1 문의 / 고객지원 | ✕ | 문의 유형 | 버그 제보 | 개선 요청 | 환불 요청 | 기타 | 내용 | 문의 제출 | 내 문의 내역 | 아직 문의 내역이 없어요.」 · 카테고리 testid = cs-cat-bug, cs-cat-improve, cs-cat-refund, cs-cat-etc(4개 · 「신고」 없음). 제출 안 함.
API: GET /api/support/tickets 200 `{"tickets":[]}`
스샷: U16-plot.png · U16-plot-share.png · U16-support.png
기대와 같다(플롯 상세에 신고/차단 문 없음 — 메뉴 자체가 없음 · 문의 카테고리에 「신고」 없음).

---

## pageerror · console.error 전수

### 유저 웹
- p1(reporter U0~U8): `console.error: Failed to load resource: the server responded with a status of 400 ()` ×1 (= U8 체크 없이 접수 400)
- p1b(reporter U8 재진입): 없음
- p2(other U12 · maker U11): `[maker] console.error: Failed to load resource: the server responded with a status of 404 ()` ×2 · `[maker] pageerror: The play() request was interrupted by a new load request. https://goo.gl/LdLk22` ×3
- p2b(maker U1 · reporter U1/U7/U6): 없음
- p4(U10/U11-확정/U12/U16): `[reporter] console.error: … status of 404 ()` ×3 · `[reporter] console.error: … status of 409 ()` ×1 (= 채널 차단 409) · `[maker] pageerror: The play() request was interrupted by a new load request.` ×3 · `[maker] console.error: … 404 ()` ×1
(404 의 URL 은 대본의 필터(/api/content/ 등)에 안 걸려 본문을 못 남겼다 — 리소스 404 로만 기록)

### 관리자
- p3 · p3b: pageerror 0 · console.error 0
