블리츠다이나믹스
경력근거: 연휴로 배송이 멈추는 주간에는 누군가 그 사실을 미리 떠올려 안전재고를 확보하고
이 계산은 블리츠의 운영 구조가 있어야 성립합니다. 직영 매장 10곳에서 브랜드 수십 개를 돌리다 보니 같은 품목이 지점마다 다른 속도로 빠지고, 그 지점들이 하나의 물류 일정으로 묶여 있어 연휴 하루가 전 지점의 입고를 동시에 뒤로 밀어냅니다. 지점이 하나거나 지점마다 발주처가 다르면 휴무일을 재고 계산에 넣을 이유가 없습니다. 매장을 50곳으로 늘리는 동안 사람의 기억이 감당하던 그 계산을 규칙과 화면으로 옮기는 것이 이 포트폴리오가 보여주는 것입니다. 배달 F&B 의 메뉴 원가나 신규 거점 입지 판단은 이 도구가 다루지 않습니다.
품절이 나야 담당자가 원인을 좇아 현장에 연락하는 구조입니다. 재고가 언제 바닥날지는 아무도 미리 계산하지 않습니다.
배송이 멈추는 주간에는 담당자가 그 사실을 떠올려 안전재고를 잡습니다. 예측 가능한 일인데도 매번 사람의 손을 거칩니다.
지점이 다섯 배로 늘어도 인력을 늘리지 않고 운영 품질을 지키는 것이 이 자리의 목표입니다. 기억에 기댄 재고 관리는 그 배수를 못 견딥니다.
직영 지점의 소진 기록과 입고 일정, 배송 휴무일 세 장을 받아 다음 입고까지 재고가 버티는지를 지점과 품목마다 판단하는 관리자 페이지입니다. 품목별 하루 평균 소진량을 소진 기록에서 내고, 입고 예정일이 휴무일에 걸리면 실제 배송 가능일까지 밀어 남은 날수를 센 뒤, 그 날수만큼의 예상 소진량과 현재 재고를 견주어 다섯 가지 상태로 나눠 보여줍니다.
블리츠 현장운영팀에서 지점 재고를 보는 담당자입니다. 지금은 재고가 빈 뒤에야 원인을 되짚어 현장에 연락하고, 연휴가 낀 주간에는 지점을 하나씩 떠올려 안전재고를 미리 잡아 두는 자리에 있습니다.
재고가 바닥나는 자리는 대개 다섯입니다. 다음 입고까지 버티거나, 입고 전에 바닥나거나, 다음 입고일 자체가 잡히지 않았거나, 소진 속도에 견줘 너무 많이 시켰거나, 소진 기록이 짧아 하루 평균을 낼 수 없습니다. 판정은 입고 일정이 없는 경우를 먼저 가르고, 그다음 기록이 이레 미만인 경우를 가른 뒤, 나머지에서 재고와 예상 소진량을 견주는 순서로 갈립니다. 세 장을 지점과 품목이라는 같은 키로 묶으면 이 다섯은 규칙으로 정해집니다.
소진 기록과 입고 일정, 배송 휴무일 세 장을 올리면 지점과 품목마다 다섯 상태로 나눠 보여주는 화면이 돕니다. 각 행에 하루 평균 소진량과 휴무일을 반영한 실제 입고일, 예상 소진량, 지금 재고가 함께 뜹니다.
1주차 판정에 모자란 만큼의 추가 발주량을 얹어 지점별 발주 요청서를 만듭니다. 입고 일정 표에 없는 지점과 품목 조합은 등록 대기 목록으로 따로 세워 담당자가 먼저 손대게 합니다.
2주차 발주 요청서를 배송 휴무일 전날 아침에 지점 담당자에게 자동으로 보냅니다. 지난주 판정과 견줘 같은 품목이 반복해서 바닥나는 지점을 표시하고, 그 품목의 적재 여유가 얼마나 남는지도 같이 답니다.
현장운영 담당자가 소진 기록과 입고 일정, 배송 휴무일 세 장을 올리면 연휴를 넘기지 못할 지점과 품목이 상태별로 뜹니다.
합성 더미를 120칸까지 늘려 다섯 상태가 각각 최소 한 건씩 나오게 하고, 각 행에 하루 평균 소진량과 실제 입고일, 예상 소진량, 지금 재고가 함께 뜹니다.
일부러 만든 계량 누락과 중복 기록, 소진 0, 입고 일정에 없는 지점 기록에서도 판정 결과 형식이 안 깨지고 그 행이 상태로 돌아갑니다.
다만 이 숫자는 품절 예측 적중률이 아닙니다. 120칸의 상태를 제가 붙인 정답과 맞춰 본 것뿐이라, 블리츠 지점의 실제 소진 기록과 물류 일정이 들어와야 예측이 맞는지 처음 확인됩니다. 그 확인에 필요한 입력 형식과 상태 판정 규칙, 채점 스크립트는 미리 짜 둡니다.
합성 소진 기록으로 낸 숫자를 성능이라고 부를 수는 없습니다. 자가채점이라는 뜻이므로, 면접에서는 지금 도는 데모의 범위와 실측이 시작되는 지점을 구분해 설명합니다.
지점과 품목의 정답 상태를 제가 정해 두고 맞힌 것이라 적중률 숫자 자체는 의미가 없습니다. 정작 볼 것은 계량이 누락된 소진 기록과 같은 기록이 두 번 올라온 중복 행, 소진량 0 과 재고 0 경계, 입고 일정에 없는 지점을 넣었을 때도 다섯 상태가 그대로 서는지입니다.
하루 평균 소진량은 관측 기간을 고르게 본 값이라 주말 피크나 프로모션 주간을 담지 못합니다. 요일별 가중을 넣으려면 최소 4주치 기록이 필요하고 그건 이 더미로 만들 수 없습니다.
재고가 예상보다 빨리 빠졌다고 해서 발주가 틀렸는지 매출이 늘었는지는 이 도구가 정하지 못합니다. 도구는 바닥날 자리와 근거 값을 보여주고 판단은 담당자가 합니다.
실제 도입에서는 품목마다 유통기한과 적재 공간 한도가 걸리고 지점별 안전재고 정책도 다릅니다. 그때는 품목 마스터를 하나 더 받아 상태 enum 을 다시 잡아야 합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
지점별 품목 소진 기록입니다. 어느 지점에서 어느 품목을 언제 얼마나 썼는지가 한 행입니다. 하루 평균 소진량을 여기서 냅니다. 계량이 빠진 결측 행, 같은 기록이 두 번 올라온 중복 행, 소진이 0 인 경계 행, 입고 일정 표에 아직 등록되지 않은 지점의 행을 일부러 섞었습니다.
| usage_no | store_id | sku | used_on | qty | unit |
|---|---|---|---|---|---|
| UG-20260914-001 | S001 | CHK-THIGH-2K | 2026-09-14 | 7.9 | kg |
| UG-20260916-002 | S001 | CHK-THIGH-2K | 2026-09-16 | 7 | kg |
| UG-20260918-003 | S001 | CHK-THIGH-2K | 2026-09-18 | 7.2 | kg |
| UG-20260920-004 | S001 | CHK-THIGH-2K | 2026-09-20 | 6.6 | kg |
| UG-20260914-005 | S002 | OIL-FRY-18L | 2026-09-14 | 5 | 통 |
다음 JSON Schema 에 맞는 소진 기록 행을 더 만들어 주세요. {"type":"object","properties":{"usage_no":{"type":"string"},"store_id":{"type":"string"},"sku":{"type":"string"},"used_on":{"type":"string"},"qty":{"type":["number","null"]},"unit":{"type":"string"}},"required":["usage_no","store_id","sku","used_on","unit"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) qty 가 null 인 계량 미입력 결측 행, (2) 같은 usage_no 가 두 번 오는 중복 업로드 행, (3) qty 가 0 인 휴무 또는 설비 정지 경계 행, (4) 입고 일정 표에 등록되지 않은 store_id 를 쓴 행, (5) 같은 지점과 품목의 기록이 이레 미만인 신규 도입 품목 행. 그리고 형식 깨뜨리기 시도 3건(used_on 을 연월만 쓰기, qty 를 문자열로 넣기, usage_no 를 숫자로 넣기)을 따로 표시해 주세요.{"type":"object","properties":{"usage_no":{"type":"string"},"store_id":{"type":"string"},"sku":{"type":"string"},"used_on":{"type":"string"},"qty":{"type":["number","null"]},"unit":{"type":"string"}},"required":["usage_no","store_id","sku","used_on","unit"]}지점별 품목 입고 일정과 현재 재고입니다. 다음 입고 예정일과 지금 남은 수량이 한 행입니다. 예상 소진량과 견주는 상대 표이면서, 어느 지점과 품목이 발주 대상으로 등록됐는지를 정하는 기준 표이기도 합니다. 다음 입고일이 아직 잡히지 않은 행과 재고가 0 인 경계 행을 섞었습니다.
| plan_no | store_id | sku | next_arrival_on | on_hand_qty | unit |
|---|---|---|---|---|---|
| DP-2026W39-001 | S001 | CHK-THIGH-2K | 2026-09-24 | 40 | kg |
| DP-2026W39-002 | S002 | OIL-FRY-18L | 2026-09-25 | 7 | 통 |
| DP-2026W39-003 | S003 | PEP-CHEONG-1K | 2026-09-23 | 42 | kg |
| DP-2026W39-004 | S004 | VEG-ONION-1K | 2026-09-23 | 20 | kg |
| DP-2026W39-005 | S005 | SAUCE-NEW-A | 2026-09-24 | 0 | kg |
다음 JSON Schema 에 맞는 입고 일정 행을 더 만들어 주세요. {"type":"object","properties":{"plan_no":{"type":"string"},"store_id":{"type":"string"},"sku":{"type":"string"},"next_arrival_on":{"type":["string","null"]},"on_hand_qty":{"type":"number"},"unit":{"type":"string"}},"required":["plan_no","store_id","sku","on_hand_qty","unit"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) next_arrival_on 이 null 인 일정 미정 행, (2) on_hand_qty 가 0 인 경계 행, (3) 입고 예정일이 배송 휴무일에 그대로 걸리는 행, (4) 소진 기록에 한 번도 안 나오는 지점과 품목 조합 행. 그리고 형식 깨뜨리기 시도 3건(on_hand_qty 를 문자열로, next_arrival_on 을 연도만, store_id 를 비우기)을 따로 표시해 주세요.{"type":"object","properties":{"plan_no":{"type":"string"},"store_id":{"type":"string"},"sku":{"type":"string"},"next_arrival_on":{"type":["string","null"]},"on_hand_qty":{"type":"number"},"unit":{"type":"string"}},"required":["plan_no","store_id","sku","on_hand_qty","unit"]}배송이 멈추는 날의 목록입니다. 연휴와 공휴일, 물류사 정기 휴무가 한 행입니다. 입고 예정일이 이 표에 걸리면 실제 배송 가능일까지 뒤로 밀어 남은 날수를 다시 셉니다. 연휴가 여러 날 이어져 나흘 연속으로 배송이 멈추는 경계 구간을 넣었습니다.
| blackout_on | reason |
|---|---|
| 2026-09-13 | 일요일 정기 배송 휴무 |
| 2026-09-20 | 일요일 정기 배송 휴무 |
| 2026-09-24 | 추석 연휴 물류센터 휴무 |
| 2026-09-25 | 추석 당일 물류센터 휴무 |
| 2026-09-26 | 추석 연휴 물류센터 휴무 |
다음 JSON Schema 에 맞는 배송 휴무일 행을 더 만들어 주세요. {"type":"object","properties":{"blackout_on":{"type":"string"},"reason":{"type":"string"}},"required":["blackout_on","reason"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 사흘 이상 연속으로 이어지는 연휴 구간, (2) 임시 공휴일처럼 갑자기 추가되는 하루, (3) 주말 정기 휴무와 공휴일이 겹쳐 같은 날이 두 사유로 들어오는 구간. 그리고 형식 깨뜨리기 시도 2건(blackout_on 을 월일만 쓰기, reason 을 비우기)을 따로 표시해 주세요.{"type":"object","properties":{"blackout_on":{"type":"string"},"reason":{"type":"string"}},"required":["blackout_on","reason"]}| TypeScript | 소진 기록에서 하루 평균을 내고 휴무일을 건너뛴 실제 입고일을 계산해 다섯 상태로 가르는 판정 규칙을 TypeScript 로 씁니다. |
| Next.js | 현장운영 담당자가 보는 재고 상태 화면을 만들고 기준일과 지점 필터를 바꿀 때마다 다시 계산해 붙입니다. |
| PostgreSQL | 소진 기록과 입고 일정을 지점과 품목 키로 색인해 기준일 기준 집계를 한 번에 읽고, 배송 휴무일을 날짜 범위로 조회합니다. |
| SCM | 안전재고와 리드타임이라는 공급망 개념을 하루 평균 소진량과 실제 입고일이라는 두 값으로 좁혀 판정 규칙에 넣습니다. |
| Agentic Workflow | 판정에서 나온 부족 지점 목록을 발주 요청서 작성과 알림 발송까지 잇는 3주차 루틴으로 옮깁니다. |
| 노티 프로세스 | 휴무일 전날 아침 발송과 처리 여부 회신을 한 줄기로 묶어 이슈 인지부터 처리 완료까지 누락 없이 돌게 만듭니다. |
| CI/CD | 다섯 상태 판정 테스트를 커밋마다 돌려 휴무일 계산과 평균 계산이 바뀌지 않았는지 확인합니다. |
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 모자란 만큼의 추가 발주량과 등록 대기 목록을 얹습니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 휴무일 전날 알림과 반복 품절 표시를 만듭니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · risk_key + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
sufficient충분shortfall_before_arrival입고 전 바닥no_arrival_scheduled입고 미정over_ordered과발주insufficient_history이력 부족지점과 품목으로 묶은 한 칸의 재고 판정입니다. 다음 입고까지 재고가 버티는지를 다섯 상태 중 하나로 정하고, 그 판단에 쓴 계산값과 근거가 된 행 값을 함께 싣습니다.
{"type":"object","properties":{"risk_key":{"type":"string"},"store_id":{"type":"string"},"sku":{"type":"string"},"as_of_date":{"type":"string","description":"화면에서 고른 기준일입니다. 이 더미에서는 2026-09-21 입니다."},"verdict":{"type":"string","enum":["sufficient","shortfall_before_arrival","no_arrival_scheduled","over_ordered","insufficient_history"]},"observed_days":{"type":["integer","null"],"description":"그 지점과 품목의 used_on 최댓값에서 최솟값을 뺀 뒤 1 을 더한 관측 기간 일수입니다. 이 값이 7 미만이면 insufficient_history 입니다. 소진 기록이 한 건도 없으면 null 이고, 그때 verdict 는 앞 단계에서 no_arrival_scheduled 로 끊깁니다."},"avg_daily_qty":{"type":["number","null"],"description":"qty 합계를 observed_days 로 나눈 값입니다. qty 가 null 인 행과 usage_no 가 겹치는 중복 행은 합계에서 뺍니다. 소수 둘째 자리에서 반올림합니다. **observed_days 가 null 이거나 7 미만이면 이 값도 null 입니다** — 이레를 못 채운 기간의 평균은 근거가 서지 않아 내지 않습니다."},"effective_arrival_on":{"type":["string","null"],"description":"next_arrival_on 이 blackout_on 에 있으면 그 날부터 하루씩 밀어 blackout_on 에 없는 첫 날짜입니다. 걸리지 않으면 next_arrival_on 그대로입니다."},"days_to_arrival":{"type":["integer","null"],"description":"effective_arrival_on 에서 as_of_date 를 뺀 날수입니다."},"expected_usage_qty":{"type":["number","null"],"description":"avg_daily_qty 에 days_to_arrival 을 곱한 예상 소진량입니다. 둘 중 하나가 null 이면 null 입니다."},"on_hand_qty":{"type":["number","null"]},"shortfall_qty":{"type":["number","null"],"description":"on_hand_qty 에서 expected_usage_qty 를 뺀 값입니다. 음수면 그만큼 모자랍니다. 한쪽이 null 이면 null 입니다."},"unit":{"type":["string","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":"string","enum":["count","sum","avg","min","max"]},"value":{}},"required":["field","value"]}},"reason":{"type":"string"}},"required":["risk_key","store_id","sku","as_of_date","verdict","evidence","reason"]}[
{
"risk_key": "S001|CHK-THIGH-2K",
"store_id": "S001",
"sku": "CHK-THIGH-2K",
"as_of_date": "2026-09-21",
"verdict": "sufficient",
"observed_days": 7,
"avg_daily_qty": 4.1,
"effective_arrival_on": "2026-09-28",
"days_to_arrival": 7,
"expected_usage_qty": 28.7,
"on_hand_qty": 40,
"shortfall_qty": 11.3,
"unit": "kg",
"evidence": [
{
"field": "qty",
"agg": "sum",
"value": 28.7
},
{
"field": "on_hand_qty",
"value": 40
},
{
"field": "next_arrival_on",
"value": "2026-09-24"
},
{
"field": "blackout_on",
"value": "2026-09-24"
}
],
"reason": "입고 예정일 9월 24일이 추석 연휴에 걸려 실제 입고는 9월 28일입니다. 그때까지 예상 소진량 28.7kg 보다 재고 40kg 이 많아 버팁니다."
},
{
"risk_key": "S002|OIL-FRY-18L",
"store_id": "S002",
"sku": "OIL-FRY-18L",
"as_of_date": "2026-09-21",
"verdict": "shortfall_before_arrival",
"observed_days": 7,
"avg_daily_qty": 2.3,
"effective_arrival_on": "2026-09-28",
"days_to_arrival": 7,
"expected_usage_qty": 16.1,
"on_hand_qty": 7,
"shortfall_qty": -9.1,
"unit": "통",
"evidence": [
{
"field": "qty",
"agg": "sum",
"value": 16.1
},
{
"field": "on_hand_qty",
"value": 7
},
{
"field": "next_arrival_on",
"value": "2026-09-25"
},
{
"field": "blackout_on",
"value": "2026-09-25"
},
{
"field": "qty",
"agg": "min",
"value": 0
}
],
"reason": "입고 예정일 9월 25일이 추석 연휴와 일요일에 걸려 실제 입고는 9월 28일로 밀립니다. 그때까지 16.1통이 빠지는데 재고는 7통이라 9.1통이 모자랍니다. 설비 점검으로 소진이 0 이던 9월 18일도 관측 기간에 넣어 평균을 냈습니다."
},
{
"risk_key": "S003|PEP-CHEONG-1K",
"store_id": "S003",
"sku": "PEP-CHEONG-1K",
"as_of_date": "2026-09-21",
"verdict": "over_ordered",
"observed_days": 7,
"avg_daily_qty": 0.6,
"effective_arrival_on": "2026-09-23",
"days_to_arrival": 2,
"expected_usage_qty": 1.2,
"on_hand_qty": 42,
"shortfall_qty": 40.8,
"unit": "kg",
"evidence": [
{
"field": "qty",
"agg": "sum",
"value": 4.2
},
{
"field": "on_hand_qty",
"value": 42
},
{
"field": "next_arrival_on",
"value": "2026-09-23"
}
],
"reason": "입고 예정일 9월 23일은 휴무일에 걸리지 않아 남은 날은 이틀입니다. 그동안 1.2kg 이 빠지는데 재고가 42kg 이라 예상 소진량의 세 배를 크게 넘습니다."
},
{
"risk_key": "S004|VEG-ONION-1K",
"store_id": "S004",
"sku": "VEG-ONION-1K",
"as_of_date": "2026-09-21",
"verdict": "sufficient",
"observed_days": 7,
"avg_daily_qty": 4.5,
"effective_arrival_on": "2026-09-23",
"days_to_arrival": 2,
"expected_usage_qty": 9,
"on_hand_qty": 20,
"shortfall_qty": 11,
"unit": "kg",
"evidence": [
{
"field": "qty",
"agg": "sum",
"value": 31.5
},
{
"field": "on_hand_qty",
"value": 20
},
{
"field": "next_arrival_on",
"value": "2026-09-23"
},
{
"field": "usage_no",
"value": "UG-20260918-014"
}
],
"reason": "두 번 올라온 9월 18일 기록은 한 건으로 세고, 계량이 빠진 9월 16일 기록은 합계에서 뺐습니다. 남은 31.5kg 을 관측 기간 이레로 나눈 하루 4.5kg 기준으로 이틀치 9kg 이 빠지는데 재고가 20kg 이라 버팁니다."
},
{
"risk_key": "S005|SAUCE-NEW-A",
"store_id": "S005",
"sku": "SAUCE-NEW-A",
"as_of_date": "2026-09-21",
"verdict": "insufficient_history",
"observed_days": 2,
"avg_daily_qty": null,
"effective_arrival_on": "2026-09-28",
"days_to_arrival": 7,
"expected_usage_qty": null,
"on_hand_qty": 0,
"shortfall_qty": null,
"unit": "kg",
"evidence": [
{
"field": "used_on",
"agg": "count",
"value": 2
},
{
"field": "on_hand_qty",
"value": 0
},
{
"field": "next_arrival_on",
"value": "2026-09-24"
}
],
"reason": "소진 기록이 이틀치뿐이라 하루 평균을 낼 수 없습니다. 재고가 0 이고 실제 입고는 추석 연휴 뒤인 9월 28일이라 판정과 별개로 담당자가 먼저 봐야 하는 자리입니다."
},
{
"risk_key": "S009|PKG-500ML",
"store_id": "S009",
"sku": "PKG-500ML",
"as_of_date": "2026-09-21",
"verdict": "no_arrival_scheduled",
"observed_days": null,
"avg_daily_qty": null,
"effective_arrival_on": null,
"days_to_arrival": null,
"expected_usage_qty": null,
"on_hand_qty": null,
"shortfall_qty": null,
"unit": "개",
"evidence": [
{
"field": "qty",
"agg": "sum",
"value": 420
},
{
"field": "store_id",
"value": "S009"
},
{
"field": "usage_no",
"value": "UG-20260920-019"
}
],
"reason": "S009 지점의 포장용기가 입고 일정 표에 없어 같은 지점과 품목의 행을 찾지 못했습니다. 이틀 동안 420개가 빠졌지만 다음 입고일이 정해지지 않아 발주 등록이 먼저입니다."
}
][자동 검증 · 1주차] 1. verdict 값이 다섯 enum 안에 있는지 확인합니다. 2. risk_key 와 store_id, sku, as_of_date, verdict, evidence, reason 이 모두 있는지 확인합니다. 3. 관측 이력이 이레 미만이거나 입고 일정이 없으면 observed_days 와 avg_daily_qty 가 둘 다 null 인지 확인합니다. 값이 있으면 observed_days 는 0 보다 크고 avg_daily_qty 는 0 이상인지 확인합니다. 4. avg_daily_qty 가 null 이 아닌 행만 qty 합계를 observed_days 로 나눈 값과 같은지 다시 계산합니다. qty 가 null 인 행과 usage_no 가 겹치는 중복 행은 합계에서 뺍니다. 5. effective_arrival_on 은 next_arrival_on 부터 하루씩 밀어 blackout_on 에 없는 첫 날짜와 같은지, days_to_arrival 은 그 날짜에서 as_of_date 를 뺀 날수와 같은지 다시 계산합니다. 6. expected_usage_qty 는 avg_daily_qty 에 days_to_arrival 을 곱한 값과, shortfall_qty 는 on_hand_qty 에서 expected_usage_qty 를 뺀 값과 같은지 다시 계산합니다. 한쪽이 null 이면 두 필드도 null 인지 확인합니다. 7. on_hand_qty 가 expected_usage_qty 의 세 배를 넘으면 verdict 는 over_ordered 입니다. 이 조건이 성립하는 사례로 S003|PEP-CHEONG-1K 를, 성립하지 않는 사례로 S004|VEG-ONION-1K 를 samples 에 넣었습니다. 8. observed_days 가 7 미만이면 verdict 는 insufficient_history 입니다. 이 조건이 성립하는 사례로 S005|SAUCE-NEW-A 를, 성립하지 않는 사례로 S001|CHK-THIGH-2K 를 samples 에 넣었습니다. 9. evidence 의 field 가 소진 기록과 입고 일정, 배송 휴무일 세 표의 컬럼에 실재하는지 확인합니다. 10. agg 가 없는 evidence 항목의 value 가 수록된 행의 그 컬럼 값과 글자 그대로 같은지 확인합니다. 11. 모든 reason 이 존댓말로 끝나는지 확인합니다. [수동 검증] 1. 소진이 0 인 날을 관측 기간에 넣어 평균을 낮추는 규칙이 실제 운영과 맞는지 현장운영 담당자에게 확인합니다. 2. 재고가 예상 소진량의 세 배를 넘으면 과발주로 보는 기준선이 품목별로 달라야 하는지 확인합니다. 3. 계량이 빠진 날을 합계에서 빼는 처리가 실제보다 평균을 낮추지 않는지 사람이 봅니다. [평가 러너 · 2주차] 1. 정답을 붙인 더미 120칸으로 다섯 상태의 정밀도와 재현율을 냅니다. 2. 휴무일 보정을 켰을 때와 껐을 때의 입고 전 바닥 판정 건수를 견줍니다. 3. 관측 기간을 이레에서 나흘로 줄였을 때 이력 부족 판정이 얼마나 늘어나는지 견줍니다.