글로지 (GloZ Inc.)
경력근거: AI 에이전트를 활용한 사용자 문의, 데이터, 내부 운영 이슈 분석 및 서비스 니즈 도출
※ 실제 산출물이 아닌 AI 예측 시안입니다.
글로지 공고는 사업을 소개하지 않고, Product Engineer 의 일을 AI 에이전트로 사용자 문의·데이터·내부 운영 이슈를 분석해 서비스 니즈를 끌어내고 기획부터 개발, 릴리즈, 출시 후 지표 모니터링까지 한 흐름으로 책임지는 것으로 적습니다. 회사 브리프에 따르면 글로지는 OTT 드라마·영화 자막을 70개 넘는 언어로 옮기고 번역가 네트워크와 작업을 TMS(E'nuff)로 굴리는 회사라서, 그 내부 운영 이슈 가운데 손해가 가장 큰 것이 회차 자막 하나가 OTT 납품일을 넘기는 일입니다. 언어마다 번역가와 검수자가 따로 있고 회차가 그들의 대기열에 줄지어 있어, 납기 예측은 한 사람의 감이 아니라 담당자별 완료 기록과 대기열 분량의 계산이 됩니다. TMS 가 단계별 완료 기록과 대기열 순서를 이렇게 남기는지는 공고로 확인할 수 없어, 재생 스크립트가 번역가·검수자별 속도 설정으로 그 기록을 만들어 냅니다. 이 포트폴리오는 완료 기록만으로 담당자별 하루 처리량을 내고 대기열을 따라 납품일을 판정하는 서비스와, 그 서비스를 기획부터 배포까지 혼자 끝내는 방식을 보여줍니다. OTT 현지화 납품 규격이나 번역 품질 관리 전문성은 주장하지 않습니다.
주요업무 첫 줄이 AI 에이전트로 사용자 문의, 데이터, 내부 운영 이슈를 분석해 서비스 니즈를 끌어내는 일입니다. 회차 자막이 납품일을 넘기는 일은 현지화 회사의 대표적인 내부 운영 이슈라, 그 이슈를 매일 아침 판정으로 바꾸는 화면이 이 자리의 일과 맞물립니다.
배포·릴리즈 전 과정의 책임과 출시 후 지표 모니터링, 개선 사이클 운영이 주요업무에 있고, 자격요건은 릴리즈 후 시연한 경험을 묻습니다. 판정을 매일 저장해 실제 납품과 맞았는지 세는 2주차 적중 기록이 그 모니터링의 자리입니다.
기술 스택에 Nest.js·Next.js 와 AWS/GCP/기타 Serverless Stack 이 있고, 우대사항에 프롬프트 엔지니어링과 LLM API 활용 경험이 있습니다. 매일 아침 판정을 서버리스 작업으로 돌리고 번역가에게 보낼 메시지 초안을 LLM API 로 받는 이 포트폴리오의 구성이 그 목록을 그대로 씁니다.
글로지 PM 이 아침에 이 화면을 열면 진행 중인 회차 자막마다 지금 단계의 담당자와 그 사람의 대기열을 따라 번역과 검수가 언제 끝날지 계산해, OTT 납품일 안에 끝나는지와 넘긴다면 원인이 번역인지 검수 대기열인지를 판정합니다. 담당자의 하루 처리량은 그 사람이 최근 끝낸 완료 기록 10건의 영상 분량 합을 첫 건부터 오늘까지의 날 수로 나눈 값이라, 프리랜서마다 들쭉날쭉한 작업 시간 기록이나 하루 8시간 같은 근무 가정이 들어가지 않습니다. 지금 단계에 담당자가 비었거나 완료 기록이 5건에 못 미치는 담당자의 회차는 납기를 계산하지 않고 그 이유로 따로 묶습니다. PM 은 번역이 늦는 회차의 번역가를 바꾸고, 검수 대기열에 막힌 회차는 검수 리드와 같은 화면을 보며 순서를 당깁니다.
글로지에서 OTT 시리즈 현지화를 맡는 PM. 매일 아침 같은 화면에서 언어별 회차 자막이 납품일 안에 끝날지 보고, 걸린 회차는 번역가를 바꾸거나 검수 순서를 당기며, 검수 리드와 같은 화면으로 순서를 맞춘다
PM 은 번역가에게 진행 상황을 물어 납기를 가늠하지만, 회차 하나가 늦는 원인은 그 번역가의 속도보다 그 사람 앞에 쌓인 회차나 검수자 대기열인 경우가 많고 그 셈은 머릿속에서 잘 되지 않습니다. 담당자마다 최근 완료 기록에서 하루 처리량을 내고 번역·검수 대기열의 분량을 그 처리량으로 나눠 끝나는 시각을 미리 계산하면, 납품 며칠 전에 번역가를 바꿀지 검수 순서를 당길지 정할 수 있습니다.
재생 스크립트가 번역가·검수자별 속도 설정으로 회차 배정과 완료 기록을 만들어 deliverables·assignments·work_log 를 채우고, Next.js 화면이 회차 자막마다 다섯 판정과 번역 끝·검수 끝 예상 시각을 보여줍니다. PM 은 걸린 회차를 펼쳐 담당자의 최근 완료 기록과 대기열 앞 회차를 읽고, 번역가를 바꿀 회차와 검수 순서를 당길 회차를 고릅니다. 회차·배정·완료 기록은 모두 재생 스크립트가 뱉은 행입니다.
AWS EventBridge 가 매일 09:00 에 Lambda 를 불러 그날 판정을 저장하고 Slack 에 걸린 회차 요약을 올립니다. 재생 스크립트가 실제 납품 시각까지 이어 만든 회차 60건으로, 각 회차가 납품 사흘 전에 받은 판정과 실제 납품을 견줘 맞은 회차를 판정 적중 기록 탭에 셉니다.
번역이 늦는 회차마다 같은 언어 번역가 중 자기 대기열 뒤에 이 회차를 붙여도 검수 날을 남기고 납품일 안에 끝내는 사람을 같은 처리량 식으로 골라 후보로 띄웁니다. PM 이 후보나 기존 번역가를 고르면 Claude Sonnet 4.5 가 그 번역가의 작업 언어로 일정 조율 메시지 초안을 쓰고, PM 이 고쳐 TMS 메시지로 보냅니다.
PM 이 10월 8일 09:00 에 받는 판정에서 〈밤의 정원〉 E07 일본어는 번역 지연입니다. T-JA1 이 하루 32분씩 125분을 옮기면 번역이 10/12 06:45에 끝나고, 바로 검수해도 마감(10/12 18:00)을 지난 10/13 07:13에 끝나기 때문입니다. 같은 아침 E06 태국어는 이 회차만 검수하면 10/10 20:12에 끝나지만, R-TH1 대기열 앞 세 회차를 먼저 처리하면 검수 끝이 10/15 14:34에 나와 검수 대기 지연에 섭니다.
검수 리드가 E06 태국어를 펼치면 R-TH1 의 대기열 앞에 〈한강 수사대〉 E02·E03 과 〈밤의 정원〉 E05 태국어가 177분 쌓여 있고, E05 태국어도 같은 대기열 때문에 검수 대기 지연에 서 있습니다.
11건 중 오래된 WL-3101 이 창 밖으로 빠진 T-JA1 은 하루 32분, 완료가 정확히 5건인 R-TH1 은 하루 37.14분으로 처리량이 서고, finished_at 이 빈 WL-3222 를 세지 않은 T-ID2 는 4건이라 기록 부족, 번역 담당자가 빈 스페인어 회차는 담당자 없음으로 따로 묶입니다.
납품일이 지난 회차 60건마다 사흘 전 아침의 판정과 실제 납품 시각이 적중 기록으로 쌓여, PM 이 어느 판정이 빗나갔는지 회차 단위로 돌아봅니다. 단, 번역가 속도와 납품 시각을 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 수치는 재생 스크립트가 만든 더미데이터 자가채점이며, 이 판정이 실제 납품 지연을 며칠 앞서 잡는지는 글로지 TMS 의 실제 배정·완료 기록과 OTT 납품 이력이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. T-JA1 의 하루 32분과 R-TH1 앞에 쌓인 177분은 제가 재생 설정에 적은 속도와 배정 순서에서 나왔으니, 이 판정이 글로지 번역가들의 실제 납기를 맞힌다는 뜻으로 읽으면 안 됩니다. E'nuff 의 실제 완료 기록을 넣으면 하루 처리량부터 달라지므로, 이 수치가 보여 주는 것은 끝나는 시각을 내는 계산 순서가 맞다는 데까지입니다.
처리량 창과 5건 문턱은 틀리게 짜도 대부분의 회차에서 판정이 그대로라 눈에 잘 띄지 않습니다. 11번째 완료 기록 WL-3101 까지 창에 넣으면 〈밤의 정원〉 E06 일본어가 검수 대기 지연으로 바뀌고, '5건 미만' 을 '5건 이하' 로 읽으면 완료가 정확히 5건인 T-TH1·R-TH1 이 맡은 태국어 네 회차가 모두 기록 부족으로 빠지며, finished_at 이 빈 WL-3222 를 완료로 세면 T-ID2 의 인도네시아어 회차가 처리량을 받습니다.
처리량을 완료 기록만으로 내므로 휴가로 일주일 쉰 번역가는 그 공백이 최근 10건 창에 들어 있는 동안 실제보다 느리게 잡힙니다. 작업 시간 기록을 쓰지 않는 대가이고, PM 은 펼침 패널의 완료 날짜 간격을 보고 이 경우를 가려냅니다.
검수 대기열 앞 회차를 번역이 끝난 뒤에 처리한다고 두는 식이라, 검수자가 번역 중에 앞 회차를 비우면 검수 대기 지연이 실제보다 일찍 뜹니다. 계약된 판정 식을 그대로 쓰고, 그 여유는 펼침 패널의 대기열 분량으로 PM 이 읽게 둡니다.
검수 단계 회차는 번역 끝 시각을 오늘 아침으로 두고 같은 식을 씁니다. 번역 단계 회차의 검수 담당자가 아직 없거나 검수 완료 기록이 5건에 못 미치면 검수에 드는 날을 낼 수 없는데, 이 경우는 다섯 판정의 식이 다루지 않아 화면은 그 회차를 목록 위에 따로 띄우고 PM 이 검수 담당자부터 정하게 둡니다.
번역·검수 단계별 완료 기록과 대기열 순서가 TMS 에 이런 모양으로 쌓인다는 것은 공고가 말하지 않는 가정입니다. E'nuff 의 실제 기록이 단계를 더 잘게 나누거나 대기열 순서를 따로 두지 않는다면, 도입 단계에서 대기열을 배정 시각 순으로 대신 세우는 것부터 정합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
지금 진행 중인 회차 자막입니다. 회차·언어마다 영상 분량과 OTT 납품일이 있고, 판정은 이 분량을 담당자의 하루 처리량으로 나눠 끝나는 시각을 냅니다.
| deliverable_id | series_title | episode | language | runtime_min | due_at |
|---|---|---|---|---|---|
| D-NG05-JA | 밤의 정원 | 5 | ja | 62 | 2026-10-10T18:00:00+09:00 |
| D-NG06-JA | 밤의 정원 | 6 | ja | 61 | 2026-10-12T18:00:00+09:00 |
| D-NG07-JA | 밤의 정원 | 7 | ja | 64 | 2026-10-12T18:00:00+09:00 |
| D-NG08-JA | 밤의 정원 | 8 | ja | 63 | 2026-10-19T18:00:00+09:00 |
| D-HG02-TH | 한강 수사대 | 2 | th | 58 | 2026-10-10T18:00:00+09:00 |
아래 JSON Schema 에 맞는 진행 중 회차 자막 행을 더 만들어 주세요. {"type":"object","properties":{"deliverable_id":{"type":"string"},"series_title":{"type":"string"},"episode":{"type":"integer","minimum":1},"language":{"type":"string","enum":["ja","th","es","id"]},"runtime_min":{"type":"integer","minimum":1},"due_at":{"type":"string","format":"date-time"}},"required":["deliverable_id","series_title","episode","language","runtime_min","due_at"]} 쉬운 데이터만 만들지 말 것 — 다음 경우를 의도적으로 섞으세요: (1) 같은 시리즈 두 회차가 같은 날 납품되는 주간 공개 묶음, (2) 20분 안팎의 숏폼과 90분 가까운 영화, (3) 납품일이 이틀 안으로 다가온 회차. 모든 행은 위 스키마를 통과해야 하고, 형식을 깨뜨리는 시도는 따로 3건만 표시해 두세요.{"type":"object","properties":{"deliverable_id":{"type":"string"},"series_title":{"type":"string"},"episode":{"type":"integer","minimum":1},"language":{"type":"string","enum":["ja","th","es","id"]},"runtime_min":{"type":"integer","minimum":1},"due_at":{"type":"string","format":"date-time"}},"required":["deliverable_id","series_title","episode","language","runtime_min","due_at"]}회차마다 번역·검수 두 단계의 담당자와 그 담당자 대기열 안 순서입니다. 끝난 단계는 queue_pos 가 비어 있고, 스페인어 회차(D-HG03-ES)는 번역 담당자가 비어 있습니다.
| deliverable_id | stage | assignee_id | queue_pos | status |
|---|---|---|---|---|
| D-NG05-JA | 번역 | T-JA1 | — | done |
| D-NG05-JA | 검수 | R-JA1 | 1 | in_progress |
| D-NG06-JA | 번역 | T-JA1 | 1 | in_progress |
| D-NG06-JA | 검수 | R-JA1 | 2 | queued |
| D-NG07-JA | 번역 | T-JA1 | 2 | queued |
아래 JSON Schema 에 맞는 단계별 배정 행을 더 만들어 주세요. {"type":"object","properties":{"deliverable_id":{"type":"string"},"stage":{"type":"string","enum":["번역","검수"]},"assignee_id":{"type":["string","null"]},"queue_pos":{"type":["integer","null"],"minimum":1},"status":{"type":"string","enum":["queued","in_progress","done"]}},"required":["deliverable_id","stage","assignee_id","queue_pos","status"]} 쉬운 데이터만 만들지 말 것 — 다음 경우를 의도적으로 섞으세요: (1) assignee_id 가 null 인 대기 단계, (2) 한 검수자의 대기열에 서너 회차가 쌓인 경우, (3) 번역은 done 이고 검수만 남은 회차, (4) queue_pos 가 1 인 진행 중 회차. 모든 행은 위 스키마를 통과해야 하고, 형식을 깨뜨리는 시도는 따로 3건만 표시해 두세요.{"type":"object","properties":{"deliverable_id":{"type":"string"},"stage":{"type":"string","enum":["번역","검수"]},"assignee_id":{"type":["string","null"]},"queue_pos":{"type":["integer","null"],"minimum":1},"status":{"type":"string","enum":["queued","in_progress","done"]}},"required":["deliverable_id","stage","assignee_id","queue_pos","status"]}번역가·검수자가 끝낸 작업의 완료 기록입니다. 처리량은 finished_at 이 있는 기록만으로 내고, 지금 작업 중인 기록(WL-3222)은 finished_at 이 비어 있습니다. 최근 10건 창 밖으로 밀려나는 오래된 기록(WL-3101)과 완료가 정확히 5건인 검수자가 들어 있습니다.
| log_no | assignee_id | stage | deliverable_id | runtime_min | finished_at |
|---|---|---|---|---|---|
| WL-3101 | T-JA1 | 번역 | D-HG01-JA | 61 | 2026-09-08T17:20:00+09:00 |
| WL-3140 | T-JA1 | 번역 | D-SF11-JA | 24 | 2026-09-23T15:10:00+09:00 |
| WL-3152 | T-JA1 | 번역 | D-HG02-JA | 58 | 2026-09-25T19:40:00+09:00 |
| WL-3158 | T-JA1 | 번역 | D-SF12-JA | 22 | 2026-09-26T13:05:00+09:00 |
| WL-3171 | T-JA1 | 번역 | D-HG03-JA | 60 | 2026-09-29T20:30:00+09:00 |
아래 JSON Schema 에 맞는 작업 완료 기록 행을 더 만들어 주세요. {"type":"object","properties":{"log_no":{"type":"string"},"assignee_id":{"type":"string"},"stage":{"type":"string","enum":["번역","검수"]},"deliverable_id":{"type":"string"},"runtime_min":{"type":"integer","minimum":1},"finished_at":{"type":["string","null"],"format":"date-time"}},"required":["log_no","assignee_id","stage","deliverable_id","runtime_min","finished_at"]} 쉬운 데이터만 만들지 말 것 — 다음 경우를 의도적으로 섞으세요: (1) finished_at 이 null 인 진행 중 기록, (2) 완료 기록이 4건이나 5건뿐인 새 담당자, (3) 11건 이상 쌓여 가장 오래된 기록이 최근 10건 밖으로 밀리는 담당자, (4) 일주일 넘게 완료가 없는 공백이 낀 담당자. 모든 행은 위 스키마를 통과해야 하고, 형식을 깨뜨리는 시도는 따로 3건만 표시해 두세요.{"type":"object","properties":{"log_no":{"type":"string"},"assignee_id":{"type":"string"},"stage":{"type":"string","enum":["번역","검수"]},"deliverable_id":{"type":"string"},"runtime_min":{"type":"integer","minimum":1},"finished_at":{"type":["string","null"],"format":"date-time"}},"required":["log_no","assignee_id","stage","deliverable_id","runtime_min","finished_at"]}| TypeScript | 판정 API 와 화면을 한 언어로 씁니다. |
| Next.js | PM 과 검수 리드가 아침에 여는 판정 화면입니다. 판정별 회차 묶음과 회차 펼침 패널을 둡니다. |
| Nest.js | deliverables·assignments·work_log 를 받는 API 와 판정 계산을 맡습니다. 시각 계산은 분 단위 분수로 해서 납품일 바로 앞뒤에서 반올림이 판정을 바꾸지 않게 합니다. |
| SQL (PostgreSQL) | 담당자·단계별 최근 완료 10건을 창 함수로 골라 처리량을 내고, 대기열 앞 회차의 분량 합을 냅니다. |
| AWS Lambda · EventBridge Scheduler | 2주차부터 매일 09:00 판정 계산과 저장을 서버리스 작업으로 돌립니다. |
| Slack | 2주차부터 매일 아침 걸린 회차 요약을 PM 채널에 올립니다. |
| Claude Code | 기획 문서와 스펙을 쓴 뒤 구현을 맡기고, 최근 10건 창과 납품일 경계 테스트로 결과를 받아 다듬습니다. |
| Claude Sonnet 4.5 (LLM API) | 3주차에 번역가의 작업 언어로 일정 조율 메시지 초안을 씁니다. |
✗ fail → 처리량이 어긋나면 날 수를 시각이 아니라 날짜로 세는지, 단계 구분 없이 완료 기록을 섞었는지부터 봅니다.
✓ pass → PM 의 아침 판단이 이 화면 하나로 끝나면 여기서 멈춰도 완결입니다. 더 키우려면 매일 판정을 저장하고 지난 회차로 적중을 세는 단계로 갑니다.
✗ fail → 빗나간 판정이 휴가 공백 뒤에 몰려 있으면 최근 10건 창을 바꾸기 전에 그 공백이 재생 설정에서 실제처럼 만들어졌는지부터 다시 봅니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 대체 번역가 후보와 번역가 언어 메시지 초안으로 넓힙니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · deliverable_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
납품일 안에 끝남납기 안번역이 납품일을 넘김번역 지연검수가 밀려 납품일을 넘김검수 대기 지연단계에 담당자가 없음담당자 없음속도를 잴 완료 기록이 모자람기록 부족회차 자막 납기 판정입니다. 진행 중인 회차·언어 하나가 다섯 판정 중 어디에 서는지와, 그 판정에 쓴 담당자별 하루 처리량, 대기열 분량, 번역 끝·검수만 했을 때·대기열까지 처리했을 때 세 시각을 남기는 형식입니다. summary 는 규칙이 시각과 분량을 채우는 고정 문형입니다.
{"type":"object","properties":{"deliverable_id":{"type":"string"},"verdict":{"type":"string","enum":["납품일 안에 끝남","번역이 납품일을 넘김","검수가 밀려 납품일을 넘김","단계에 담당자가 없음","속도를 잴 완료 기록이 모자람"]},"series_title":{"type":"string"},"episode":{"type":"integer","minimum":1},"language":{"type":"string"},"current_stage":{"type":"string","enum":["번역","검수"],"description":"assignments 에서 status 가 done 이 아닌 첫 단계입니다."},"as_of":{"type":"string","format":"date-time","description":"판정 기준 시각(오늘 아침)입니다. 날 수는 이 시각의 날짜로 셉니다."},"due_at":{"type":"string","format":"date-time"},"runtime_min":{"type":"integer","minimum":1},"translator_id":{"type":["string","null"]},"translator_completions":{"type":["integer","null"],"minimum":0,"description":"번역 담당자의 번역 단계 work_log 중 finished_at 이 있는 건수입니다. 5건 미만이면 처리량을 내지 않습니다."},"translator_min_per_day":{"type":["number","null"],"minimum":0,"description":"번역 담당자의 최근 완료 10건(10건 미만이면 전부) runtime_min 합 ÷ (as_of 날짜 − 그 첫 건 finished_at 날짜)의 날 수(0이면 1)를 소수 둘째 자리로 반올림한 값입니다. 작업 시간 기록이나 하루 근무 시간 가정은 쓰지 않습니다."},"translation_queue_min":{"type":["integer","null"],"minimum":0,"description":"번역 담당자의 done 이 아닌 번역 배정 중 queue_pos 가 이 회차 이하인 회차들의 runtime_min 합입니다."},"translation_done_at":{"type":["string","null"],"format":"date-time","description":"번역 단계면 as_of + translation_queue_min ÷ translator_min_per_day 일, 검수 단계면 번역이 이미 끝나 as_of 입니다. 분 단위로 반올림해 적고 비교는 반올림 전 값으로 합니다."},"reviewer_id":{"type":["string","null"]},"reviewer_completions":{"type":["integer","null"],"minimum":0},"reviewer_min_per_day":{"type":["number","null"],"minimum":0,"description":"검수 담당자에게 같은 식을 검수 단계 work_log 로 적용한 하루 처리량입니다."},"review_days_this":{"type":["number","null"],"minimum":0,"description":"runtime_min ÷ reviewer_min_per_day 입니다."},"done_at_review_only":{"type":["string","null"],"format":"date-time","description":"translation_done_at + review_days_this 일입니다. due_at 을 넘으면 번역이 납품일을 넘김입니다."},"review_queue_min":{"type":["integer","null"],"minimum":0,"description":"검수 담당자의 done 이 아닌 검수 배정 중 queue_pos 가 이 회차 이하인 회차들의 runtime_min 합입니다."},"done_at_with_queue":{"type":["string","null"],"format":"date-time","description":"translation_done_at + review_queue_min ÷ reviewer_min_per_day 일입니다. done_at_review_only 는 due_at 안인데 이 값이 due_at 을 넘으면 검수가 밀려 납품일을 넘김입니다."},"evidence":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string","enum":["deliverables","assignments","work_log"]},"field":{"type":"string"},"agg":{"type":"string","enum":["count","sum","avg","min","max"]},"value":{"type":["string","integer","null"]}},"required":["table","field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["deliverable_id","verdict","series_title","episode","language","current_stage","as_of","due_at","runtime_min","translator_id","translator_completions","translator_min_per_day","translation_queue_min","translation_done_at","reviewer_id","reviewer_completions","reviewer_min_per_day","review_days_this","done_at_review_only","review_queue_min","done_at_with_queue","evidence","summary","hedge"]}[
{
"deliverable_id": "D-NG07-JA",
"verdict": "번역이 납품일을 넘김",
"series_title": "밤의 정원",
"episode": 7,
"language": "ja",
"current_stage": "번역",
"as_of": "2026-10-08T09:00:00+09:00",
"due_at": "2026-10-12T18:00:00+09:00",
"runtime_min": 64,
"translator_id": "T-JA1",
"translator_completions": 11,
"translator_min_per_day": 32,
"translation_queue_min": 125,
"translation_done_at": "2026-10-12T06:45:00+09:00",
"reviewer_id": "R-JA1",
"reviewer_completions": 6,
"reviewer_min_per_day": 62.8,
"review_days_this": 1.02,
"done_at_review_only": "2026-10-13T07:13:00+09:00",
"review_queue_min": 187,
"done_at_with_queue": "2026-10-15T06:13:00+09:00",
"evidence": [
{
"table": "deliverables",
"field": "deliverable_id",
"value": "D-NG07-JA"
},
{
"table": "deliverables",
"field": "runtime_min",
"value": 64
},
{
"table": "deliverables",
"field": "due_at",
"value": "2026-10-12T18:00:00+09:00"
},
{
"table": "assignments",
"field": "assignee_id",
"value": "T-JA1"
},
{
"table": "assignments",
"field": "queue_pos",
"value": 2
},
{
"table": "work_log",
"field": "log_no",
"agg": "count",
"value": 10
},
{
"table": "work_log",
"field": "runtime_min",
"agg": "sum",
"value": 480
},
{
"table": "work_log",
"field": "finished_at",
"value": "2026-09-23T15:10:00+09:00",
"note": "최근 10건 창의 첫 건"
},
{
"table": "work_log",
"field": "log_no",
"value": "WL-3101",
"note": "최근 10건 밖이라 뺀 기록"
},
{
"table": "deliverables",
"field": "runtime_min",
"agg": "sum",
"value": 125
},
{
"table": "assignments",
"field": "assignee_id",
"value": "R-JA1"
},
{
"table": "work_log",
"field": "runtime_min",
"agg": "sum",
"value": 314
},
{
"table": "work_log",
"field": "finished_at",
"value": "2026-10-03T11:20:00+09:00"
}
],
"summary": "〈밤의 정원〉 E07 일본어는 T-JA1 이 하루 32분씩 앞 회차 E06 과 이 회차를 합한 125분을 옮겨 10/12 06:45에 번역을 끝내고, 바로 검수해도 10/13 07:13에 끝나 납품 마감(10/12 18:00)을 넘깁니다.",
"hedge": "T-JA1 의 완료 11건 중 가장 오래된 9월 8일 건(WL-3101)은 최근 10건 밖이라 처리량에 넣지 않았습니다. 넣으면 날 수가 30일로 늘어 하루 처리량이 18분대로 떨어지고, E06 일본어도 납품일을 넘기는 쪽으로 나옵니다."
},
{
"deliverable_id": "D-NG06-TH",
"verdict": "검수가 밀려 납품일을 넘김",
"series_title": "밤의 정원",
"episode": 6,
"language": "th",
"current_stage": "번역",
"as_of": "2026-10-08T09:00:00+09:00",
"due_at": "2026-10-11T18:00:00+09:00",
"runtime_min": 61,
"translator_id": "T-TH1",
"translator_completions": 5,
"translator_min_per_day": 74,
"translation_queue_min": 61,
"translation_done_at": "2026-10-09T04:47:00+09:00",
"reviewer_id": "R-TH1",
"reviewer_completions": 5,
"reviewer_min_per_day": 37.14,
"review_days_this": 1.64,
"done_at_review_only": "2026-10-10T20:12:00+09:00",
"review_queue_min": 238,
"done_at_with_queue": "2026-10-15T14:34:00+09:00",
"evidence": [
{
"table": "deliverables",
"field": "deliverable_id",
"value": "D-NG06-TH"
},
{
"table": "deliverables",
"field": "runtime_min",
"value": 61
},
{
"table": "deliverables",
"field": "due_at",
"value": "2026-10-11T18:00:00+09:00"
},
{
"table": "assignments",
"field": "assignee_id",
"value": "T-TH1"
},
{
"table": "work_log",
"field": "runtime_min",
"agg": "sum",
"value": 296
},
{
"table": "work_log",
"field": "finished_at",
"value": "2026-10-04T13:00:00+09:00"
},
{
"table": "assignments",
"field": "assignee_id",
"value": "R-TH1"
},
{
"table": "assignments",
"field": "queue_pos",
"value": 4
},
{
"table": "work_log",
"field": "log_no",
"agg": "count",
"value": 5
},
{
"table": "work_log",
"field": "runtime_min",
"agg": "sum",
"value": 260
},
{
"table": "work_log",
"field": "finished_at",
"value": "2026-10-01T18:00:00+09:00"
},
{
"table": "deliverables",
"field": "runtime_min",
"agg": "sum",
"value": 238
}
],
"summary": "〈밤의 정원〉 E06 태국어는 번역이 10/9 04:47에 끝나 이 회차만 검수하면 10/10 20:12에 납품되지만, R-TH1 이 대기열 앞 세 회차를 먼저 검수하면 10/15 14:34에 끝나 납품 마감(10/11 18:00)을 넘깁니다.",
"hedge": "검수 대기열 앞 회차를 번역이 끝난 뒤에 처리한다고 두는 계약 식이라, R-TH1 이 번역 중에 앞 회차를 비우면 실제로는 더 일찍 끝날 수 있습니다."
},
{
"deliverable_id": "D-HG03-ES",
"verdict": "단계에 담당자가 없음",
"series_title": "한강 수사대",
"episode": 3,
"language": "es",
"current_stage": "번역",
"as_of": "2026-10-08T09:00:00+09:00",
"due_at": "2026-10-16T18:00:00+09:00",
"runtime_min": 57,
"translator_id": null,
"translator_completions": null,
"translator_min_per_day": null,
"translation_queue_min": null,
"translation_done_at": null,
"reviewer_id": "R-ES1",
"reviewer_completions": null,
"reviewer_min_per_day": null,
"review_days_this": null,
"done_at_review_only": null,
"review_queue_min": null,
"done_at_with_queue": null,
"evidence": [
{
"table": "deliverables",
"field": "deliverable_id",
"value": "D-HG03-ES"
},
{
"table": "assignments",
"field": "stage",
"value": "번역"
},
{
"table": "assignments",
"field": "assignee_id",
"value": null
},
{
"table": "assignments",
"field": "status",
"value": "queued"
},
{
"table": "deliverables",
"field": "due_at",
"value": "2026-10-16T18:00:00+09:00"
}
],
"summary": "〈한강 수사대〉 E03 스페인어는 지금 단계인 번역에 담당자가 없어 납기를 계산하지 않습니다.",
"hedge": null
},
{
"deliverable_id": "D-HG01-ID",
"verdict": "속도를 잴 완료 기록이 모자람",
"series_title": "한강 수사대",
"episode": 1,
"language": "id",
"current_stage": "번역",
"as_of": "2026-10-08T09:00:00+09:00",
"due_at": "2026-10-14T18:00:00+09:00",
"runtime_min": 60,
"translator_id": "T-ID2",
"translator_completions": 4,
"translator_min_per_day": null,
"translation_queue_min": null,
"translation_done_at": null,
"reviewer_id": "R-ID1",
"reviewer_completions": null,
"reviewer_min_per_day": null,
"review_days_this": null,
"done_at_review_only": null,
"review_queue_min": null,
"done_at_with_queue": null,
"evidence": [
{
"table": "deliverables",
"field": "deliverable_id",
"value": "D-HG01-ID"
},
{
"table": "assignments",
"field": "assignee_id",
"value": "T-ID2"
},
{
"table": "work_log",
"field": "log_no",
"agg": "count",
"value": 4
},
{
"table": "work_log",
"field": "log_no",
"value": "WL-3222",
"note": "작업 중이라 완료로 세지 않은 기록"
},
{
"table": "work_log",
"field": "finished_at",
"value": null
},
{
"table": "work_log",
"field": "runtime_min",
"value": 60
}
],
"summary": "〈한강 수사대〉 E01 인도네시아어는 번역 담당 T-ID2 의 완료 기록이 4건이라 기준 5건에 못 미쳐 하루 처리량을 내지 않습니다.",
"hedge": "지금 번역 중인 이 회차의 작업 기록(WL-3222)은 finished_at 이 비어 있어 완료로 세지 않았습니다. 이 기록을 세었다면 5건이 되어 처리량이 나왔을 회차입니다."
},
{
"deliverable_id": "D-NG06-JA",
"verdict": "납품일 안에 끝남",
"series_title": "밤의 정원",
"episode": 6,
"language": "ja",
"current_stage": "번역",
"as_of": "2026-10-08T09:00:00+09:00",
"due_at": "2026-10-12T18:00:00+09:00",
"runtime_min": 61,
"translator_id": "T-JA1",
"translator_completions": 11,
"translator_min_per_day": 32,
"translation_queue_min": 61,
"translation_done_at": "2026-10-10T06:45:00+09:00",
"reviewer_id": "R-JA1",
"reviewer_completions": 6,
"reviewer_min_per_day": 62.8,
"review_days_this": 0.97,
"done_at_review_only": "2026-10-11T06:04:00+09:00",
"review_queue_min": 123,
"done_at_with_queue": "2026-10-12T05:45:00+09:00",
"evidence": [
{
"table": "deliverables",
"field": "deliverable_id",
"value": "D-NG06-JA"
},
{
"table": "deliverables",
"field": "runtime_min",
"value": 61
},
{
"table": "deliverables",
"field": "due_at",
"value": "2026-10-12T18:00:00+09:00"
},
{
"table": "assignments",
"field": "assignee_id",
"value": "T-JA1"
},
{
"table": "assignments",
"field": "queue_pos",
"value": 1
},
{
"table": "work_log",
"field": "runtime_min",
"agg": "sum",
"value": 480
},
{
"table": "assignments",
"field": "assignee_id",
"value": "R-JA1"
},
{
"table": "work_log",
"field": "runtime_min",
"agg": "sum",
"value": 314
},
{
"table": "deliverables",
"field": "runtime_min",
"agg": "sum",
"value": 123
}
],
"summary": "〈밤의 정원〉 E06 일본어는 번역이 10/10 06:45에 끝나고, 검수 대기열 앞 회차를 먼저 처리해도 10/12 05:45에 검수가 끝나 납품 마감(10/12 18:00) 안에 들어옵니다.",
"hedge": null
},
{
"deliverable_id": "D-HG02-TH",
"verdict": "납품일 안에 끝남",
"series_title": "한강 수사대",
"episode": 2,
"language": "th",
"current_stage": "검수",
"as_of": "2026-10-08T09:00:00+09:00",
"due_at": "2026-10-10T18:00:00+09:00",
"runtime_min": 58,
"translator_id": "T-TH1",
"translator_completions": null,
"translator_min_per_day": null,
"translation_queue_min": null,
"translation_done_at": "2026-10-08T09:00:00+09:00",
"reviewer_id": "R-TH1",
"reviewer_completions": 5,
"reviewer_min_per_day": 37.14,
"review_days_this": 1.56,
"done_at_review_only": "2026-10-09T22:29:00+09:00",
"review_queue_min": 58,
"done_at_with_queue": "2026-10-09T22:29:00+09:00",
"evidence": [
{
"table": "deliverables",
"field": "deliverable_id",
"value": "D-HG02-TH"
},
{
"table": "deliverables",
"field": "runtime_min",
"value": 58
},
{
"table": "deliverables",
"field": "due_at",
"value": "2026-10-10T18:00:00+09:00"
},
{
"table": "assignments",
"field": "stage",
"value": "검수"
},
{
"table": "assignments",
"field": "assignee_id",
"value": "R-TH1"
},
{
"table": "assignments",
"field": "queue_pos",
"value": 1
},
{
"table": "work_log",
"field": "log_no",
"agg": "count",
"value": 5
},
{
"table": "work_log",
"field": "runtime_min",
"agg": "sum",
"value": 260
},
{
"table": "work_log",
"field": "finished_at",
"value": "2026-10-01T18:00:00+09:00"
}
],
"summary": "〈한강 수사대〉 E02 태국어는 번역이 끝나 검수 대기열 맨 앞에 있고, R-TH1 의 하루 처리량으로 10/9 22:29에 끝나 납품일 안에 들어옵니다.",
"hedge": "R-TH1 의 완료 기록이 정확히 5건이라 처리량을 냈습니다. 한 건이라도 적었다면 이 회차는 기록 부족으로 섰습니다."
}
][자동 검증 · 코드가 세 표에서 다시 계산합니다] 1. verdict 가 enum 다섯 값 중 하나인지, current_stage 가 번역·검수 중 하나인지 확인합니다. 2. evidence 의 field 가 deliverables·assignments·work_log 에 실재하는 컬럼인지 대조합니다. 3. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 샘플 행 값 그대로인지 대조합니다. WL-3222 의 finished_at 은 null 그대로 실립니다. 4. translator_min_per_day 와 reviewer_min_per_day 를 work_log 에서 다시 계산합니다. 그 담당자·그 단계의 finished_at 있는 기록을 최근 순으로 10건(모자라면 전부) 고르고, runtime_min 합을 as_of 날짜에서 그 첫 건 finished_at 날짜를 뺀 날 수(0이면 1)로 나눕니다. T-JA1 은 11건 중 WL-3101 을 빼고 480분 ÷ 15일 = 32.00 입니다. 5. translation_queue_min 과 review_queue_min 을 assignments 의 queue_pos 와 deliverables.runtime_min 으로 다시 계산합니다. 같은 담당자·같은 단계에서 done 이 아니고 queue_pos 가 이 회차 이하인 회차의 runtime_min 합입니다. 6. translation_done_at = as_of + translation_queue_min ÷ translator_min_per_day 일, done_at_review_only = translation_done_at + runtime_min ÷ reviewer_min_per_day 일, done_at_with_queue = translation_done_at + review_queue_min ÷ reviewer_min_per_day 일을 반올림 전 값으로 다시 계산해 분 단위 표기와 일치하는지 봅니다. 7. 지금 단계 assignments 의 assignee_id 가 null 이면 verdict 는 단계에 담당자가 없음입니다. 성립 사례는 D-HG03-ES, 불성립 사례는 D-NG07-JA 입니다. 8. 담당자가 있고 그 담당자의 지금 단계 finished_at 있는 기록이 5건 미만이면 verdict 는 속도를 잴 완료 기록이 모자람입니다. 성립 사례는 4건인 D-HG01-ID, 불성립 사례는 정확히 5건인 R-TH1 의 D-HG02-TH 입니다. 9. 위 둘에 걸리지 않고 done_at_review_only 가 due_at 을 넘으면 verdict 는 번역이 납품일을 넘김입니다. 성립 사례는 D-NG07-JA, 불성립 사례는 D-NG06-JA 입니다. 10. done_at_review_only 는 due_at 안이고 done_at_with_queue 가 due_at 을 넘으면 verdict 는 검수가 밀려 납품일을 넘김입니다. 성립 사례는 D-NG06-TH, 불성립 사례는 D-NG06-JA 입니다. 11. 어느 것에도 걸리지 않으면 verdict 는 납품일 안에 끝남입니다. 사례는 D-NG06-JA 와 D-HG02-TH 입니다. 12. summary 가 존댓말 한 문장으로 끝나는지 확인합니다. [수동 검증 · 사람이 봅니다] 1. PM 이 걸린 회차의 summary 만 읽고 번역가를 바꿀지 검수 순서를 당길지 정하는지 봅니다. 2. 검수 리드가 검수가 밀린 회차의 대기열 앞 회차 목록을 보고 순서를 바꿀 수 있는지 봅니다. [평가 러너 · 2주차] 1. 매일 아침 판정을 저장해 두고, 납품일이 지난 회차 60건의 실제 납품 시각과 그 회차가 받았던 판정을 견줘 맞은 회차를 셉니다. 2. 빗나간 회차는 처리량 창(최근 10건)에 휴가 공백이 끼었는지, 검수 대기열을 번역 뒤에 둔 계약 식 때문인지 남깁니다.