비에이블컴퍼니
경력근거: 플랫폼 수요와 콘텐츠 특성을 연결하는 검색·추천·매칭 기능 개발
※ 실제 산출물이 아닌 AI 예측 시안입니다.
비에이블컴퍼니는 ShortFlow 로 숏폼드라마 IP 를 제작사와 글로벌 플랫폼 사이에 붙이는 B2B 플랫폼을 굴리고, 공고가 플랫폼 수요와 콘텐츠 특성을 잇는 매칭 기능 개발을 주요 업무로 적습니다. 편성 요건을 여러 플랫폼에서 모아 한 표로 쥔 회사라야 IP 한 편을 여섯 곳과 한꺼번에 견주는 일이 성립하고, 등록부터 제안과 계약까지 한 흐름으로 잇기 때문에 지난 거절 사유가 이번 등록본에서 고쳐졌는지 되짚는 판정이 뜻을 가집니다. 다만 이 포트폴리오는 흩어진 요건을 표로 세워 규칙으로 판정하고 그 결과를 화면으로 내는 일을 보여줍니다. 글로벌 콘텐츠 유통 실무나 플랫폼별 편성 협상의 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
공고는 ShortFlow 가 IP 등록과 메타데이터 분석, 플랫폼 매칭, 제안까지 하나의 흐름으로 잇는 운영 인프라를 지향한다고 밝힙니다. 등록본과 편성 요건을 견줘 낼 곳을 정하는 자리가 그 흐름의 한가운데입니다.
플랫폼 수요와 콘텐츠 특성을 연결하는 검색·추천·매칭 기능 개발이 주요 업무로 적혀 있고, 대본과 시놉시스, 기획안을 바탕으로 한 콘텐츠 분석 고도화가 그 앞에 놓여 있습니다.
개발팀 및 비즈니스팀과 협업해 AI 기능의 우선순위를 정리하고 실행하라고 적혀 있습니다. 판정 결과를 두 팀이 한 화면에서 같이 보고 어디에 낼지 정하는 구성이 그 일하는 방식과 맞물립니다.
등록한 IP 와 플랫폼 편성 요건, 지난 거래 이력을 올리면 IP 한 편과 플랫폼 한 곳을 짝지어 회차 규격과 장르 수요, 지난 거절 사유가 고쳐졌는지를 차례로 보고 네 갈래로 나눕니다. 거절 메일에 적힌 문구는 대응표를 거쳐 등록본의 어느 값을 다시 재야 하는지로 바뀌고, 범위 비교와 태그 교집합이 나머지를 가릅니다. 걸린 대목을 제작사에 돌려줄 한 줄만 클로드가 씁니다.
ShortFlow 에 대본과 기획안을 올려 IP 를 파는 숏폼드라마 제작사 담당자 — 플랫폼마다 원하는 장르도 회차 길이도 화면 비율도 다른데, 그 요건은 각 플랫폼과 주고받은 메일에만 흩어져 있어 어디에 낼지는 결국 감으로 고른다
제안이 헛도는 까닭은 플랫폼이 많아서가 아니라, 편성 요건이 메일에만 남아 IP 한 편을 올릴 때마다 담당자 머릿속에서 다시 맞춰 보기 때문입니다. 요건을 표로 세워 등록본과 짝지어 두면, 담당자는 낼 수 있는 곳부터 순서대로 열어 봅니다.
제작사 담당자가 IP 를 올린 날 여는 화면 하나가 돕니다. 등록본과 편성 요건, 거래 이력, 거절 사유 대응표를 올리면 IP 와 플랫폼 짝마다 네 갈래 중 하나가 붙고 어느 값에 걸렸는지 근거가 열립니다. 장르 태그는 담당자가 등록본에 적어 둔 값을 그대로 쓰는 것으로 시작하고, 대본 원문에서 태그를 뽑는 일은 3주차로 미룹니다.
담당자가 지난 분기에 실제로 제안을 넣은 80건을 정답으로 붙여 판정 일치를 자동으로 세고, 갈라진 짝을 사유별로 리포트로 냅니다. 같은 화면에서 플랫폼별로 몇 편이 걸리고 무엇에 걸렸는지도 봅니다.
대본과 기획안 원문에서 장르 태그와 소재를 뽑아 등록본 태그와 나란히 보여주고, 바로 제안 가능으로 나온 짝은 그 플랫폼 요건에 맞춘 제안서 초안으로 뽑습니다. 초안은 담당자가 고쳐 보내는 문서까지만 만듭니다.
제작사 담당자가 등록본과 요건을 올리면 IP 와 플랫폼 짝마다 판정이 붙고, 걸린 짝은 회차 수인지 길이인지 비율인지 그 자리에서 읽습니다.
더빙 언어가 비거나 화면 비율 표기가 뒤섞이거나 거절 사유 칸이 빈 줄을 섞은 입력 30종을 올려도 목록이 사라지지 않고, 판정을 멈춘 짝만 근거가 빈 채로 남습니다.
회차 길이가 요건 범위의 위아래 끝에 딱 걸치는 IP 를 넣어도 들어옴과 벗어남이 규칙대로 갈라집니다.
담당자가 지난 분기에 실제로 넣은 제안 80건과 화면 판정을 맞춰 일치를 셉니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 수치는 더미데이터 자가채점이며 실제 판정 적중률은 비에이블컴퍼니의 실제 ShortFlow 등록본과 플랫폼별 편성 요건이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
판정 일치 수치는 제가 만든 등록본과 요건에 제가 정답을 붙여 낸 것이라 성능 증명이 아닙니다. 면접에서는 실제 ShortFlow 등록본을 받았을 때 어느 사유부터 다시 세어야 하는지로 이야기하겠습니다.
판정이 잘 맞는 까닭의 절반은 제가 등록본도 정답도 함께 만들었다는 데 있습니다. 더빙 언어가 비거나 화면 비율 표기가 뒤섞이거나 거절 사유 칸이 빈 줄, 회차 길이가 요건 범위의 끝에 딱 걸치는 편을 더미에 일부러 섞어 쉬운 짝만 골라 푸는 함정을 피합니다.
바로 제안 가능이라는 판정이 곧 팔린다는 뜻은 아닙니다. 편성은 담당자 취향과 그달 라인업에 따라 갈리므로 판정은 순서를 정하는 후보로 읽고 마지막은 담당자가 정합니다.
편성 요건은 메일과 통화로 오가며 분기마다 바뀝니다. 표에 적힌 요건이 지난 분기 것이면 판정이 통째로 어긋나므로 요건 줄마다 받은 날짜를 남기고, 받은 지 90일이 지난 줄로 내린 판정은 화면에서 요건이 오래됐다는 표시와 함께 보여줍니다.
이 포트폴리오는 흩어진 요건을 표로 세워 규칙으로 판정하는 구성을 보여줍니다. 글로벌 콘텐츠 유통 실무와 플랫폼별 편성 협상의 전문성은 주장하지 않습니다.
계약과 납품, 정산은 법인 사이의 계약 절차가 있어야 다룰 수 있어 범위 밖입니다. 여기서는 어디에 낼지 정하고 제안서 초안을 만드는 데까지만 갑니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
제작사가 ShortFlow 에 올린 숏폼드라마 IP 한 편입니다. 대본과 기획안에서 뽑아 둔 장르 태그와 회차 규격이 같이 있고, 더빙 언어가 아직 비어 있는 편도 섞입니다.
| ip_id | title | synopsis | genre_tags | episode_count | episode_sec | vertical_ratio | language |
|---|---|---|---|---|---|---|---|
| IP-0001 | 폐하의 계약직 황후 | 빚에 쫓기던 궁녀가 일 년짜리 계약으로 황후 자리에 앉으면서 벌어지는… | ["로맨스","사극"] | 60 | 75 | 9:16 | ko |
| IP-0002 | 좀비 고교 3학년 | 수능 백일 전 학교에 감염이 퍼지고 남은 학생들이 교실을 하나씩 되찾… | ["좀비","스릴러"] | 58 | 70 | 9:16 | ko |
| IP-0003 | 재벌집 셋째 사위 | 무시받던 데릴사위가 숨겨 둔 경영 감각을 드러내며 집안 서열을 뒤집습… | ["재벌","로맨스"] | 72 | 65 | 9:16 | ko |
| IP-0004 | 은퇴한 용병의 편의점 | 전직 용병이 야간 편의점을 맡으면서 동네 사건을 하나씩 정리합니다. | ["액션","코미디"] | 55 | 80 | 9:16 | ko |
| IP-0005 | 달빛 아래 재회 | 십 년 만에 고향으로 돌아온 첫사랑이 같은 병원에 배정되며 다시 얽힙… | ["로맨스"] | 40 | 90 | 9:16 | ko |
아래 JSON Schema 를 그대로 지키는 IP 줄을 30행 더 만듭니다. {"type":"object","properties":{"ip_id":{"type":"string"},"title":{"type":"string"},"synopsis":{"type":"string"},"genre_tags":{"type":"array","items":{"type":"string"}},"episode_count":{"type":"integer"},"episode_sec":{"type":"integer"},"vertical_ratio":{"type":"string"},"language":{"type":["string","null"]}},"required":["ip_id","title","synopsis","genre_tags","episode_count","episode_sec","vertical_ratio"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: language 가 null 인 줄을 3~4행 섞고, vertical_ratio 가 16:9 나 4:5 인 줄도 2~3행 둡니다. episode_count 는 20~120 사이, episode_sec 은 40~120 사이로 흩뜨리되 플랫폼 요건 범위의 위아래 끝에 딱 걸치는 값을 여러 행 넣습니다. genre_tags 는 로맨스·재벌·사극·복수·판타지·무협·호러·스릴러·좀비·액션·코미디·드라마·늑대인간에서 1~3개 고르고, 어느 플랫폼 수요와도 겹치지 않는 조합을 3~4행 만듭니다. synopsis 는 두 문장 안쪽 한국어로 씁니다. 형식을 깨뜨리는 시도 3건(episode_sec 을 '75초' 로 적기·genre_tags 를 쉼표 문자열로 적기·vertical_ratio 를 9/16 으로 적기)은 데이터가 아니라 파서 시험용으로 따로 만듭니다.{"type":"object","properties":{"ip_id":{"type":"string"},"title":{"type":"string"},"synopsis":{"type":"string"},"genre_tags":{"type":"array","items":{"type":"string"}},"episode_count":{"type":"integer"},"episode_sec":{"type":"integer"},"vertical_ratio":{"type":"string"},"language":{"type":["string","null"]}},"required":["ip_id","title","synopsis","genre_tags","episode_count","episode_sec","vertical_ratio"]}글로벌 플랫폼이 이번 분기에 받겠다고 밝힌 편성 요건입니다. 원하는 장르와 회차 규격, 화면 비율, 노리는 시장이 여기 있어 판정의 잣대가 되고, 그 요건을 받은 날짜를 함께 남겨 오래된 줄로 내린 판정을 가려냅니다. 지원자는 플랫폼별 편성 담당자와 주고받은 메일을 분기마다 한 줄로 옮겨 이 표를 만듭니다.
| platform | wanted_genre | min_episode_count | episode_sec_range | required_ratio | audience_region | slate_received_at |
|---|---|---|---|---|---|---|
| DramaBox | ["로맨스","재벌","사극"] | 60 | [60,90] | 9:16 | 글로벌 | 2026-07-02 |
| ReelShort | ["로맨스","늑대인간"] | 50 | [45,60] | 9:16 | 북미 | 2026-07-15 |
| ShortMax | ["로맨스","재벌"] | 55 | [50,80] | 9:16 | 북미 | 2026-08-01 |
| NetShort | ["로맨스","드라마"] | 60 | [60,90] | 9:16 | 북미 | 2026-06-30 |
| FlexTV | ["액션","코미디"] | 45 | [60,100] | 9:16 | 동남아 | 2026-05-20 |
아래 JSON Schema 를 그대로 지키는 편성 요건 줄을 20행 더 만듭니다. {"type":"object","properties":{"platform":{"type":"string"},"wanted_genre":{"type":"array","items":{"type":"string"}},"min_episode_count":{"type":"integer"},"episode_sec_range":{"type":"array","items":{"type":"integer"},"minItems":2,"maxItems":2},"required_ratio":{"type":"string"},"audience_region":{"type":"string"},"slate_received_at":{"type":"string"}},"required":["platform","wanted_genre","min_episode_count","episode_sec_range","required_ratio","audience_region","slate_received_at"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: min_episode_count 는 30~80 사이, episode_sec_range 는 아래 끝과 위 끝의 사이가 15~50초가 되도록 잡습니다. required_ratio 는 9:16 을 기본으로 두되 4:5 를 쓰는 플랫폼도 1~2행 만듭니다. audience_region 은 북미·일본·동남아·유럽·중남미·글로벌 여섯 값을 쓰고, wanted_genre 는 1~4개로 둡니다. 장르 수요가 아주 좁아 대부분의 IP 가 걸리는 플랫폼도 한둘 넣습니다. slate_received_at 은 2026-03-01 부터 2026-09-01 사이 날짜로 흩뜨리되, 2026-06-10 보다 앞선 줄을 4~5행 두어 받은 지 90일이 지난 요건으로 판정하는 경우를 만듭니다.{"type":"object","properties":{"platform":{"type":"string"},"wanted_genre":{"type":"array","items":{"type":"string"}},"min_episode_count":{"type":"integer"},"episode_sec_range":{"type":"array","items":{"type":"integer"},"minItems":2,"maxItems":2},"required_ratio":{"type":"string"},"audience_region":{"type":"string"},"slate_received_at":{"type":"string"}},"required":["platform","wanted_genre","min_episode_count","episode_sec_range","required_ratio","audience_region","slate_received_at"]}그 IP 를 이미 그 플랫폼에 냈던 기록입니다. 거절 사유가 어느 항목을 가리켰는지가 남아 있어 이번에 그 자리가 고쳐졌는지 되짚는 근거가 되고, 사유 칸이 빈 줄도 섞입니다.
| ip_id | platform | status | reject_reason | closed_at |
|---|---|---|---|---|
| IP-0001 | MiniDrama JP | 거절 | 회차 길이 초과 | 2026-01-22 |
| IP-0002 | GoodShort | 계약 | — | 2026-02-11 |
| IP-0003 | NetShort | 거절 | 영어 더빙 없음 | 2026-03-04 |
| IP-0004 | FlexTV | 검토중 | — | — |
| IP-0005 | DramaBox | 거절 | 회차 수 부족 | 2026-02-28 |
아래 JSON Schema 를 그대로 지키는 거래 이력 줄을 25행 더 만듭니다. {"type":"object","properties":{"ip_id":{"type":"string"},"platform":{"type":"string"},"status":{"type":"string","enum":["계약","거절","검토중"]},"reject_reason":{"type":["string","null"]},"closed_at":{"type":["string","null"]}},"required":["ip_id","platform","status"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: status 가 거절인데 reject_reason 이 null 인 줄을 2~3행, status 가 검토중이라 closed_at 이 null 인 줄을 3~4행 섞습니다. reject_reason 은 회차 수 부족·회차 길이 초과·화면 비율 불일치·장르 수요 없음·영어 더빙 없음 다섯 값에서 고릅니다. 한 IP 가 서로 다른 플랫폼에 여러 번 나간 이력과 같은 플랫폼에 두 분기 연속 나간 이력을 둘 다 만듭니다. closed_at 은 2025-10-01 부터 2026-03-31 사이 날짜로 씁니다.{"type":"object","properties":{"ip_id":{"type":"string"},"platform":{"type":"string"},"status":{"type":"string","enum":["계약","거절","검토중"]},"reject_reason":{"type":["string","null"]},"closed_at":{"type":["string","null"]}},"required":["ip_id","platform","status"]}플랫폼이 메일에 적어 보낸 거절 사유 문구를 등록본의 어느 값으로 다시 재야 하는지 적어 둔 대응표입니다. reject_reason 은 사람이 쓴 자유 문구라 이 표 없이는 「영어 더빙 없음」이 language 를 가리킨다는 것을 기계가 알 수 없습니다. 지원자는 지난 분기 거절 메일에 실제로 쓰인 문구를 모아 등록본·요건 컬럼과 짝지어 이 표를 만듭니다.
| reject_reason | check_field | compare_field | unfixed_if |
|---|---|---|---|
| 회차 수 부족 | episode_count | min_episode_count | 작으면 그대로 |
| 회차 규격 미달 | episode_count | min_episode_count | 작으면 그대로 |
| 회차 길이 초과 | episode_sec | episode_sec_range | 위 끝보다 크면 그대로 |
| 회차 길이 미달 | episode_sec | episode_sec_range | 아래 끝보다 작으면 그대로 |
| 화면 비율 불일치 | vertical_ratio | required_ratio | 다르면 그대로 |
아래 JSON Schema 를 그대로 지키는 대응표 줄을 15행 더 만듭니다. {"type":"object","properties":{"reject_reason":{"type":"string"},"check_field":{"type":"string"},"compare_field":{"type":["string","null"]},"unfixed_if":{"type":"string","enum":["작으면 그대로","위 끝보다 크면 그대로","아래 끝보다 작으면 그대로","다르면 그대로","겹치지 않으면 그대로","en 이 아니면 그대로","비어 있으면 그대로"]}},"required":["reject_reason","check_field","compare_field","unfixed_if"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: 같은 항목을 가리키는 다른 문구를 두세 개씩 두어(「화면 비율 불일치」와 「세로 영상 아님」처럼) 문구가 흔들려도 같은 컬럼으로 이어지게 합니다. compare_field 가 null 인 줄(등록본 값 하나만 보면 되는 사유)을 3~4행 둡니다. unfixed_if 는 선언된 일곱 값만 쓰고, 새 조건이 필요한 문구는 지어내지 말고 남겨 두어 어느 문구가 아직 표에 없는지 드러나게 합니다.{"type":"object","properties":{"reject_reason":{"type":"string"},"check_field":{"type":"string"},"compare_field":{"type":["string","null"]},"unfixed_if":{"type":"string","enum":["작으면 그대로","위 끝보다 크면 그대로","아래 끝보다 작으면 그대로","다르면 그대로","겹치지 않으면 그대로","en 이 아니면 그대로","비어 있으면 그대로"]}},"required":["reject_reason","check_field","compare_field","unfixed_if"]}| Python | 판정 엔진의 언어입니다. 범위 비교와 태그 교집합, 이력 되짚기가 여기 모여 있습니다. |
| FastAPI | 등록본과 요건을 받아 판정을 돌리고 결과를 내주는 API 서버입니다. 규칙은 이 한 곳에만 둡니다. |
| PostgreSQL | 등록 IP 와 편성 요건, 거래 이력, 거절 사유 대응표를 담습니다. 요건을 받은 날짜를 남겨 지난 제안을 그때 요건으로 되짚습니다. |
| React | 제작사 담당자와 비즈니스팀이 같이 보는 매칭판입니다. 왼쪽에 갈래를 세우고 짝을 누르면 걸린 값이 오른쪽에 열립니다. |
| LangChain | 3주차에 대본과 기획안을 문단으로 잘라 장르와 소재를 뽑는 추출 단계를 엮습니다. |
| LangGraph | 추출과 태그 대조, 초안 생성을 단계로 나눠 어디서 멈췄는지 화면에 드러냅니다. |
| Vector DB | 3주차에 시놉시스를 임베딩해 비슷한 IP 가 어느 플랫폼과 계약됐는지 찾아 담당자에게 참고로 붙입니다. |
| Claude API | 판정이 정해진 뒤 걸린 대목을 제작사에 돌려줄 한 줄과 제안서 초안 문장을 씁니다. |
| LLM 평가 | 뽑아낸 장르 태그를 담당자가 붙인 태그와 맞대 어긋난 편을 세고, 그 수치를 화면에 남깁니다. |
| 문서 자동화 | 바로 제안 가능으로 나온 짝을 플랫폼 요건에 맞춘 제안서 초안 문서로 뽑습니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 담당자가 실제로 넣은 제안과 맞대 보는 단계로 넘어갑니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 대본에서 장르를 뽑고 제안서 초안까지 내는 단계로 확장합니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · ip_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
바로 제안 가능제안 가능회차 규격 안 맞음규격 미달장르 수요 없음장르 미수요지난 거절 사유가 안 고쳐짐거절 사유 그대로IP 한 편과 플랫폼 한 곳의 짝을 네 갈래 중 하나로 판정하고 그 근거가 된 등록본 값과 요건 값을 함께 남기는 형식입니다. 갈래는 규칙이 정하고 문장만 모델이 씁니다.
{"type":"object","properties":{"ip_id":{"type":"string"},"title":{"type":"string"},"platform":{"type":"string"},"verdict":{"type":"string","enum":["바로 제안 가능","회차 규격 안 맞음","장르 수요 없음","지난 거절 사유가 안 고쳐짐"]},"spec_misses":{"type":["array","null"],"items":{"type":"string"},"description":"요건을 벗어난 규격 항목 이름. 회차 수·회차 길이·화면 비율 셋 가운데 걸린 것만 담습니다"},"matched_genre":{"type":["array","null"],"items":{"type":"string"},"description":"genre_tags 와 wanted_genre 에 함께 있는 태그"},"unfixed_reason":{"type":["string","null"],"description":"지난 거절 사유 가운데 reject_reason_map 이 가리킨 항목을 다시 재도 값이 그대로인 사유 문구"},"last_closed_at":{"type":["string","null"],"description":"그 IP 와 그 플랫폼의 마지막 거래가 끝난 날짜"},"target_region":{"type":["string","null"],"description":"그 플랫폼이 노리는 시장. platform_slate 의 audience_region 을 그대로 옮깁니다"},"slate_received_at":{"type":["string","null"],"description":"판정에 쓴 편성 요건 줄을 받은 날짜입니다"},"evidence":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string","enum":["ip_submission","platform_slate","deal_history","reject_reason_map"]},"field":{"type":"string"},"agg":{"type":["string","null"],"enum":["count","sum","avg","min","max",null]},"value":{"type":["string","number","null"]}},"required":["source","field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["ip_id","title","platform","verdict","evidence","summary"]}[
{
"ip_id": "IP-0001",
"title": "폐하의 계약직 황후",
"platform": "DramaBox",
"verdict": "바로 제안 가능",
"spec_misses": [],
"matched_genre": [
"로맨스",
"사극"
],
"unfixed_reason": null,
"last_closed_at": null,
"target_region": "글로벌",
"slate_received_at": "2026-07-02",
"evidence": [
{
"source": "ip_submission",
"field": "episode_count",
"value": 60
},
{
"source": "platform_slate",
"field": "min_episode_count",
"value": 60
},
{
"source": "ip_submission",
"field": "episode_sec",
"value": 75
},
{
"source": "ip_submission",
"field": "vertical_ratio",
"value": "9:16"
},
{
"source": "platform_slate",
"field": "required_ratio",
"value": "9:16"
}
],
"summary": "60화에 75초, 세로 화면까지 요건에 들어맞고 원하는 장르에 로맨스와 사극이 둘 다 있습니다.",
"hedge": null
},
{
"ip_id": "IP-0001",
"title": "폐하의 계약직 황후",
"platform": "ReelShort",
"verdict": "회차 규격 안 맞음",
"spec_misses": [
"회차 길이"
],
"matched_genre": [
"로맨스"
],
"unfixed_reason": null,
"last_closed_at": null,
"target_region": "북미",
"slate_received_at": "2026-07-15",
"evidence": [
{
"source": "ip_submission",
"field": "episode_sec",
"value": 75
},
{
"source": "ip_submission",
"field": "episode_count",
"value": 60
},
{
"source": "platform_slate",
"field": "min_episode_count",
"value": 50
}
],
"summary": "회차 수는 넉넉한데 한 회 75초라 45초에서 60초만 받는 편성 요건을 벗어납니다.",
"hedge": null
},
{
"ip_id": "IP-0002",
"title": "좀비 고교 3학년",
"platform": "ShortMax",
"verdict": "장르 수요 없음",
"spec_misses": [],
"matched_genre": [],
"unfixed_reason": null,
"last_closed_at": null,
"target_region": "북미",
"slate_received_at": "2026-08-01",
"evidence": [
{
"source": "ip_submission",
"field": "episode_count",
"value": 58
},
{
"source": "platform_slate",
"field": "min_episode_count",
"value": 55
},
{
"source": "ip_submission",
"field": "genre_tags",
"value": "좀비"
},
{
"source": "platform_slate",
"field": "audience_region",
"value": "북미"
}
],
"summary": "규격은 다 통과했지만 북미 편성이 원하는 로맨스와 재벌에 좀비 스릴러가 겹치지 않습니다.",
"hedge": null
},
{
"ip_id": "IP-0003",
"title": "재벌집 셋째 사위",
"platform": "NetShort",
"verdict": "지난 거절 사유가 안 고쳐짐",
"spec_misses": [],
"matched_genre": [
"로맨스"
],
"unfixed_reason": "영어 더빙 없음",
"last_closed_at": "2026-03-04",
"target_region": "북미",
"slate_received_at": "2026-06-30",
"evidence": [
{
"source": "deal_history",
"field": "reject_reason",
"value": "영어 더빙 없음"
},
{
"source": "reject_reason_map",
"field": "check_field",
"value": "language"
},
{
"source": "reject_reason_map",
"field": "unfixed_if",
"value": "en 이 아니면 그대로"
},
{
"source": "ip_submission",
"field": "language",
"value": "ko"
},
{
"source": "deal_history",
"field": "closed_at",
"value": "2026-03-04"
},
{
"source": "platform_slate",
"field": "audience_region",
"value": "북미"
}
],
"summary": "3월 거절 문구가 영어 더빙 없음이었고 대응표가 그 문구를 language 로 잇는데, 이번 등록본도 한국어 하나라 같은 자리에서 또 걸립니다.",
"hedge": null
},
{
"ip_id": "IP-0007",
"title": "무협 학원 전설",
"platform": "TopShort",
"verdict": "지난 거절 사유가 안 고쳐짐",
"spec_misses": [
"화면 비율"
],
"matched_genre": [],
"unfixed_reason": "화면 비율 불일치",
"last_closed_at": "2026-03-01",
"target_region": "북미",
"slate_received_at": "2026-08-05",
"evidence": [
{
"source": "deal_history",
"field": "reject_reason",
"value": "화면 비율 불일치"
},
{
"source": "reject_reason_map",
"field": "check_field",
"value": "vertical_ratio"
},
{
"source": "ip_submission",
"field": "vertical_ratio",
"value": "16:9"
},
{
"source": "platform_slate",
"field": "required_ratio",
"value": "9:16"
},
{
"source": "deal_history",
"field": "closed_at",
"value": "2026-03-01"
}
],
"summary": "3월 거절 문구가 가리킨 자리는 화면 비율인데 이번에도 가로 화면 그대로 올라와 다시 낼 자리가 아닙니다.",
"hedge": null
},
{
"ip_id": "IP-0008",
"title": "이혼 예정입니다",
"platform": "Kalos TV",
"verdict": "바로 제안 가능",
"spec_misses": [],
"matched_genre": [
"로맨스"
],
"unfixed_reason": null,
"last_closed_at": "2026-02-20",
"target_region": "유럽",
"slate_received_at": "2026-03-18",
"evidence": [
{
"source": "ip_submission",
"field": "episode_count",
"value": 61
},
{
"source": "platform_slate",
"field": "min_episode_count",
"value": 60
},
{
"source": "ip_submission",
"field": "episode_sec",
"value": 78
},
{
"source": "platform_slate",
"field": "slate_received_at",
"value": "2026-03-18"
},
{
"source": "deal_history",
"field": "status",
"value": "계약"
}
],
"summary": "61화에 78초로 요건 안에 들어오고 지난 분기에 같은 플랫폼과 계약까지 마친 이력이 있습니다.",
"hedge": "이 판정에 쓴 Kalos TV 요건은 2026-03-18 에 받은 줄이라 판정을 돌린 날 기준 90일이 지났습니다. 이번 분기 요건을 다시 받아 확인해야 합니다."
},
{
"ip_id": "IP-0010",
"title": "괴담 배달부",
"platform": "GoodShort",
"verdict": "바로 제안 가능",
"spec_misses": [],
"matched_genre": [
"호러"
],
"unfixed_reason": null,
"last_closed_at": "2026-02-05",
"target_region": "글로벌",
"slate_received_at": "2026-08-12",
"evidence": [
{
"source": "ip_submission",
"field": "episode_count",
"value": 50
},
{
"source": "platform_slate",
"field": "min_episode_count",
"value": 40
},
{
"source": "ip_submission",
"field": "episode_sec",
"value": 55
},
{
"source": "deal_history",
"field": "reject_reason",
"value": null
}
],
"summary": "50화에 55초로 요건을 넘기고 원하는 장르에 호러가 있어 이번 분기에 다시 낼 만합니다.",
"hedge": "지난 거절 사유 칸이 비어 있어 같은 자리가 고쳐졌는지는 확인하지 못했고, 담당자가 메일을 찾아 채워야 합니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 네 값 가운데 하나인지 확인합니다. 판정은 규칙이 정하므로 모델이 새 값을 적으면 그 응답을 버립니다. 2. ip_id·title·platform·verdict·evidence·summary 여섯 칸이 모두 차 있는지 봅니다. 3. spec_misses 를 다시 계산합니다. episode_count 가 min_episode_count 보다 작으면 회차 수, episode_sec 이 episode_sec_range 밖이면 회차 길이, vertical_ratio 가 required_ratio 와 다르면 화면 비율을 담고, 목록이 비지 않은 경우에만 회차 규격 안 맞음이 붙었는지 맞춰 봅니다. 4. matched_genre 를 genre_tags 와 wanted_genre 의 겹치는 값으로 다시 계산해 같은 목록인지 보고, 비었을 때만 장르 수요 없음이 붙었는지 봅니다. 5. unfixed_reason 은 그 ip_id·platform 의 거절 이력에 적힌 reject_reason 을 reject_reason_map 에서 찾아 다시 잽니다. 표가 가리킨 check_field 의 이번 등록본 값을 compare_field 의 요건 값과 견주고, unfixed_if 가 말하는 조건에 걸리면 그 문구를 그대로 unfixed_reason 에 담습니다 — 「작으면 그대로」는 등록본 값이 요건 값보다 작을 때, 「위 끝보다 크면 그대로」와 「아래 끝보다 작으면 그대로」는 범위의 위·아래 끝을 벗어날 때, 「다르면 그대로」는 두 값이 글자로 다를 때, 「겹치지 않으면 그대로」는 두 목록에 같은 값이 하나도 없을 때, 「en 이 아니면 그대로」는 language 가 en 이 아닐 때, 「비어 있으면 그대로」는 language 가 비었을 때입니다. 조건에 안 걸리면 그 사이에 고쳐진 것이라 unfixed_reason 은 비웁니다. 6. 거절 이력의 reject_reason 이 reject_reason_map 에 없는 새 문구이면 판정을 세우지 않고 unfixed_reason 을 비운 채 hedge 에 그 문구를 그대로 적습니다. 표에 없는 문구를 아무 컬럼에나 붙이지 않습니다. 7. episode_count 와 episode_sec 이 0보다 큰지, last_closed_at 이 날짜 꼴인지 봅니다. 8. reject_reason 이 null 이면 unfixed_reason 도 null 이고 hedge 에 그 사정이 적혀 있는지 봅니다. 9. slate_received_at 을 판정에 쓴 요건 줄에서 그대로 옮겼는지 보고, 판정을 돌린 날(2026-09-08)보다 90일 넘게 앞선 줄로 내린 판정이면 hedge 에 요건이 오래됐다는 사실이 적혀 있는지 봅니다. 10. evidence 의 field 이름이 네 표의 컬럼에 실제로 있는 이름인지 대조합니다. 없는 이름을 인용하면 요약이 지어낸 문장이라는 뜻이라 규칙이 써 둔 기본 문장으로 되돌립니다. 11. agg 가 없는 evidence 의 value 가 인용한 그 줄의 값과 글자 그대로 같은지 봅니다. 12. summary 가 존댓말 한 문장으로 끝나는지 봅니다. [판정 순서 · 규칙이 지키는 차례] 지난 거절 사유가 안 고쳐짐을 가장 먼저 보고, 그다음 회차 규격 안 맞음, 장르 수요 없음 차례로 봅니다. 셋 다 걸리지 않으면 바로 제안 가능입니다. 앞에서 걸리면 뒤 사유는 고르지 않지만 근거 칸(spec_misses·matched_genre)은 그대로 채워 둡니다. 다만 거절 이력의 사유 칸이 비어 있으면 그 칸을 없는 것으로 두고 나머지 차례로 내려갑니다. [평가 러너 · 2주차] 1. 담당자가 지난 분기에 실제로 제안을 넣은 IP 와 플랫폼 짝 80건을 정답으로 붙여 판정이 같은지 세고, 갈라진 짝을 사유별로 모읍니다. 2. 바로 제안 가능으로 나온 짝 가운데 실제 회신이 온 비율을 분기 끝에 되짚습니다. [수동 검증 · 사람이 봅니다] 1. 장르 태그가 대본과 맞는지 표본 20편을 기획 담당자가 읽고, 태그가 좁게 붙어 수요가 없다고 나온 편을 가려냅니다. 2. 대응표에 없는 새 거절 문구가 hedge 로 쌓인 것을 분기마다 모아, 어느 컬럼으로 이을지 담당자와 정하고 reject_reason_map 에 한 줄씩 더합니다.