모두의포트폴리오
PE · FDE 직군을 위한 포트폴리오 밀키트
예전 판입니다 (1판)이 문서는 2026-08-02 에 새 판으로 개정됐습니다. 억지로 붙인 교대 선택 화면과 스트림·배포 스택을 걷어내고, 고객사 수주와 라인 캘린더로 출하 가능일과 지연 요인을 계산해 터미널로 답하는 CLI로 다시 썼습니다.최신 판 보기 →
경력인포시즈 · Forward Deployed Engineer (FDE)

산업 현장 카메라·센서 이벤트를 실시간 스트림으로 모아 교대 시점마다 이상 건수와 조치 대상을 집계하고, 다음 근무조가 읽을 인수인계 브리핑을 자동으로 써 주는 현장 운영 파이프라인

인포시즈 공고에서 뽑은 세 가지 시그널.

인포시즈 Sr. FDE 는 정리된 문제를 받는 게 아니라 복잡한 산업 현장의 운영 구조를 이해하고 AI·데이터 솔루션을 실제 운영 환경에 붙여 안정적으로 정착시키는 역할입니다. 공고의 기술 골조(Python·Kafka·Airflow·BigQuery·Kubernetes·Docker·Terraform·Computer Vision·LLM)를 그대로 써서 현장 이벤트를 실시간으로 모으고 교대마다 집계·인수인계 브리핑을 자동으로 내는 이 파이프라인은 그 핵심(현장 운영 데이터 연결·구조화·실제 배포)을 정면으로 입증합니다. 인포시즈가 다루는 특정 산업 현장의 운영 지식이나 의사결정 구조 같은 도메인 전문성은 포트폴리오로 증명되지 않으므로 일반 현장 이벤트로 기술만 보이고, 그 깊이는 면접에서 솔직히 다룹니다. 실시간 이벤트를 집계·규칙·근거에 묶어 인수인계까지 잇는 이 사슬은 실제 운영 환경에 정착시키는 FDE 맥락이 아니면 그대로 만들 수 없습니다.

01

AI 를 실제 운영 환경에 연결·정착

정리된 문제를 받는 게 아니라 AI·데이터 솔루션을 실제 현장 운영 환경에 붙여 안정적으로 정착시킵니다. 현장 이벤트 파이프라인 배포가 직접 정렬됩니다.

AI·데이터 기반 솔루션을 실제 운영 환경에 적용하고 안정적으로 정착시킵니다AI 기술을 실제 운영 환경에 연결해 기업의 일하는 방식과 의사 결정을 바꾸는데모가 아니라 실제 현장에서 작동하는 AI 제품을 만들고 싶은 분
02

현장 데이터 구조 이해·모델링

고객의 업무 흐름과 데이터 구조를 빠르게 이해해 모델링하고 운영에 활용합니다. 이벤트 스키마 설계와 집계 파이프라인이 정렬됩니다.

고객의 업무 흐름과 데이터 구조를 빠르게 이해하고 모델링합니다복잡한 데이터를 구조화해서 제품이나 운영에 활용해본 경험데이터를 해석하며, 기술이 실제 현장에서 작동할 수 있도록 연결합니다
03

현장 예외·불확실성 기술 해결

현장에서 생기는 예외와 불확실성을 피하지 않고 기술로 처리해 제품·시스템 개선으로 잇습니다. 결측·저신뢰·미등록 이벤트를 규칙으로 흡수하는 설계가 정렬됩니다.

현장에서 발생하는 다양한 예외 상황과 불확실성을 기술적으로 해결합니다현장에서 얻은 인사이트를 제품과 시스템 개선으로 연결합니다실제 사용자에게 쓰이는 Agent 또는 AI 제품을 만들어본 경험

포트폴리오 요약

현장 카메라·센서에서 나온 이벤트를 실시간 스트림으로 받아 교대 구간별로 이상 건수·조치 대상을 집계하고, 그 집계 숫자 위에서 다음 근무조용 인수인계 브리핑을 생성하는 파이프라인입니다. 브리핑에 들어가는 숫자와 조치 판정(monitor·dispatch·halt)은 집계 결과와 심각도 규칙이 결정하고, LLM 은 그 숫자를 사람이 읽는 문장으로 옮기며 집계에 없는 숫자를 지어내지 못하게 막습니다. 현장 도메인의 옳고 그름을 판정하는 도구가 아니라, 현장 이벤트를 받아 실제로 도는 운영 파이프라인입니다.

고객 정의

인포시즈 Sr. FDE. 고객사 현장에 배포된 카메라·센서 이벤트를 교대마다 손으로 세어 표로 정리하고 다음 근무조에게 말로 넘기던 일을, 한 파이프라인에서 집계와 인수인계 브리핑까지 자동으로 받고 싶은 사람입니다.

고민 지점

현장 이벤트를 한 스키마로 모으고 심각도·신뢰도 규칙을 붙이면, (a) 이상 건수·조치 대상을 집계로 정확히 세고, (b) 저신뢰·결측·미등록 현장 이벤트를 규칙으로 흡수하며, (c) 그 집계 숫자만 인용한 인수인계 브리핑을 교대마다 자동으로 낼 수 있습니다.

주차별 일정

1주차여기까지로 완성

이벤트 스트림 집계 + 인수인계 브리핑 자동 생성

합성 현장 이벤트를 스트림으로 흘리면 교대 구간별 이상 건수·조치 대상을 집계하고, 그 숫자만 인용한 인수인계 브리핑을 자동으로 내는 동작 파이프라인입니다. 카메라 검출은 실제 비전 모델 대신 검출 메타데이터(이벤트 타입·신뢰도)를 입력으로 가정하고, 로컬 Docker 구성으로 돌립니다.

  1. 1일 · 이벤트·집계·브리핑 스키마를 정의현장 이벤트(현장·이벤트 타입·신뢰도·심각도·교대) 스키마 + 심각도 조치 규칙(monitor·dispatch·halt) + 브리핑 출력 스키마 정의
  2. 2-3일 · 이벤트 소비자 + 교대 구간별 집계합성 스트림 소비자(로컬 Docker) + 교대 구간별 이상 건수·조치 대상 집계 + 저신뢰 하향·결측·미등록 흡수 규칙
  3. 4-5일 · 집계 숫자만 인용하는 브리핑 생성프롬프트 v1(집계 테이블 주입 + 그 숫자만 인용 강제) + 출력 스키마 검증 + 집계에 없는 숫자 ungrounded 표시
  4. 6일 · 현장 운영 파이프라인 화면교대 선택 + 이상 건수·조치 카드 + 인수인계 브리핑 + 미근거 숫자 표시
  5. 7일 · 7일치 시연 영상 + 심은 정답과 비교한 기준선여기까지가 1주차 완성품입니다
2주차선택 성장

브리핑이 맞았는지 확인 + 실제 비전 태깅 연결

브리핑의 숫자·조치를 심은 정답 집계·검수자 2명 라벨과 비교해 정확도와 일치도를 보여주고, 경량 비전 모델로 현장 프레임에서 이벤트를 직접 태깅하는 단계를 붙인 화면입니다.

  1. 8-9일 · 검수자 2명이 브리핑 유용성·조치 라벨링심은 정답 집계 대비 정확도 + 인수인계 검수 가이드
  2. 10-11일 · 판정 신뢰도 보강 + 경량 비전 태깅 연결일치도 측정(Cohen's κ: 두 사람 답이 우연 이상으로 일치하는 정도, 0~1) + 경량 비전 모델로 프레임에서 이벤트 태깅
  3. 12일 · 미근거 숫자 자동 차단브리핑 숫자를 집계 테이블과 토큰 대조 + 별도 LLM judge + 5% 사람 점검
3주차선택 성장

실제 배포·스케줄 운영 + 현장별 이상 추이

Kafka·Airflow·BigQuery 를 붙여 교대마다 자동 집계·브리핑이 스케줄되고, k8s·Terraform 으로 배포된 상태에서 현장·이벤트 타입별 이상 추이와 저신뢰·미등록 사유 분포를 누적 집계해 보여주는 화면입니다.

  1. 15-17일 · 실제 스케줄 배포Kafka·Airflow·BigQuery 연결 + 교대마다 자동 집계·브리핑 스케줄 + k8s·Terraform 배포
  2. 18-21일 · 현장별 이상 추이 + 통합 시연 영상현장·이벤트 타입별 이상 추이·저신뢰·미등록 사유 분포 집계 + 실제 도입 계획(실 현장 데이터·실 검수자 교체) 포함

데모 · 측정 지표

01

이벤트 시나리오 12종(정상·고심각도·저신뢰 카메라·미등록 현장)을 스트림에 넣으면, 교대 집계와 인수인계 브리핑이 몇 초 안에 나오는 걸 시연합니다

02

일부러 만든 악성·결측 입력 30종(신뢰도 결측·현장 표기 흔들림·미등록 이벤트 타입·심각도 경계값)을 넣어도 브리핑 출력 형식(스키마)이 한 번도 안 깨집니다

03

브리핑이 인용한 숫자가 집계 테이블에 100% 실재하고, 없는 숫자는 ungrounded 로 표시되는 걸 보여줍니다. 심은 정답 집계 50건 중 조치 판정이 일치한 게 46건(약 92%)입니다. 단, 정답·데이터를 모두 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'임을 명시합니다

정직 경계선

진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 조치 정확도·인수인계 유용성은 인포시즈 고객사의 실 현장 이벤트와 실 검수자가 있어야 측정 가능합니다. 이 파이프라인은 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다

미리 알아둬야 할 것들

이건 고객·실데이터 없이 혼자 만든 포트폴리오입니다. 모든 수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명하는 게 오히려 신뢰를 줍니다

정답을 작성자가 만들었으니 잘 맞는 게 당연합니다. 그래서 저신뢰 카메라 검출·현장 표기 흔들림·미등록 이벤트 타입·심각도 경계값 같은 경계 케이스를 더미에 일부러 섞어, 쉬운 집계만 통과시키는 게 아님을 보여줍니다

이 포트폴리오가 입증하는 것은 스트림 이벤트 집계·조치 규칙 엔진·집계 숫자에 묶인 브리핑 생성·배포 파이프라인 기술입니다. 인포시즈가 다루는 특정 산업 현장의 운영 지식이나 의사결정 구조 같은 도메인 전문성은 포트폴리오로 증명되지 않으므로 주장하지 않으며, 그 깊이는 면접에서 모르면 모른다고 말하는 편이 낫습니다. 데모는 일반 현장 이벤트로 기술만 입증합니다

LLM 브리핑은 그럴듯한 숫자를 지어낼 수 있습니다. 브리핑이 집계 테이블에 있는 숫자만 인용하게 강제하고, 대조에 실패한 숫자는 ungrounded 로 표시해 인수인계에 싣지 않습니다

현장 표기와 이벤트 타입이 제각각입니다. 정규화로 같은 현장으로 묶고 못 묶은 건 추측하지 말고 '미등록 현장'으로 알립니다. 실제 도입 시 이벤트 분포·심각도 규칙·검수자가 더미와 다르므로 스키마와 규칙을 다시 맞춰야 합니다(도입 단계 과제로 분리)

더미 데이터

① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.

field_eventsTABLE· 11 rows

현장 카메라·센서 이벤트 원천 로그. 교대 구간별 집계와 조치 규칙이 가장 먼저 질의하는 테이블입니다. 신뢰도 결측·현장 표기 흔들림·미등록 이벤트 타입·심각도 경계값을 일부러 섞고, gt_action 으로 정답 조치를 심어 자가채점합니다.

② field_events.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 11)
event_idtssite_rawsite_idsourceevent_typedetection_confseverityframe_refshiftgt_action
ev_0012026-03-04T09:121공장site_1camerano_helmet0.91highf_001.jpgdayhalt
ev_0022026-03-04T09:401 공장site_1sensortemp_high—mid—daydispatch
ev_0032026-03-04T10:052공장site_2camerano_helmet0.42highf_003.jpgdaymonitor
ev_0042026-03-04T10:30신규현장Z—sensorvibration—low—daymonitor
ev_0052026-03-04T11:152공장site_2cameramachine_offzone1highf_005.jpgdayhalt
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
아래 JSON Schema 에 맞는 현장 이벤트 60행을 JSON 배열로 생성합니다. 현장 3~4개, 이벤트 타입 분포, 주간·야간 교대 혼합, 정상 위주에 고심각도·저신뢰를 섞습니다. gt_action 규칙: severity=high 이면 halt, severity=mid 이면 dispatch, severity=low 이면 monitor. 단 source=camera 이고 detection_conf 가 0.5 미만이면 신뢰도가 낮아 한 단계 낮춰 monitor 로 둡니다.

{"type":"object","properties":{"event_id":{"type":"string"},"ts":{"type":"string"},"site_raw":{"type":"string"},"site_id":{"type":["string","null"]},"source":{"type":"string","enum":["camera","sensor"]},"event_type":{"type":"string"},"detection_conf":{"type":["number","null"]},"severity":{"type":"string","enum":["low","mid","high"]},"frame_ref":{"type":["string","null"]},"shift":{"type":"string","enum":["day","night"]},"gt_action":{"type":"string","enum":["monitor","dispatch","halt"]}},"required":["event_id","ts","site_raw","source","event_type","severity","shift","gt_action"]}

쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라(쉬운 집계만 통과시키는 함정 회피): (1) 같은 현장의 표기 별칭('1공장'/'1 공장', '2공장'/'2 공장'처럼 site_master 로 정규화돼야 함) 3건 이상, (2) 미등록 현장(site_id=null) 2건, (3) 결측: sensor 이벤트라 detection_conf=null·frame_ref=null 인 행 3건 이상, (4) 경계값 detection_conf=0.0 과 1.0 각 1건, (5) 저신뢰 하향 케이스, 곧 severity=high 인데 camera detection_conf<0.5 라 gt_action=monitor 로 내려가는 행 2건, (6) 미등록 이벤트 타입(smoke_new 처럼 사전에 없는 신규 타입) 1~2건. gt_action 은 위 규칙대로 정직하게. JSON 배열만.
schema (3 층의 단일 출처)
{"type":"object","properties":{"event_id":{"type":"string"},"ts":{"type":"string"},"site_raw":{"type":"string"},"site_id":{"type":["string","null"]},"source":{"type":"string","enum":["camera","sensor"]},"event_type":{"type":"string"},"detection_conf":{"type":["number","null"]},"severity":{"type":"string","enum":["low","mid","high"]},"frame_ref":{"type":["string","null"]},"shift":{"type":"string","enum":["day","night"]},"gt_action":{"type":"string","enum":["monitor","dispatch","halt"]}},"required":["event_id","ts","site_raw","source","event_type","severity","shift","gt_action"]}
site_sopDOCS· 10 docs

현장 대응 표준절차(SOP) 문서. 브리핑의 조치 사유 문장에 맥락을 더하는 RAG 참조용입니다. 빈 절차·상충 절차·현장 별칭 같은 경계 케이스를 섞어 검색이 흔들려도 조치 판정은 규칙이 지키도록 합니다.

② site_sop.seed.json 다운로드
① 인라인 샘플 (프리뷰 2 / 10)
안전장구 미착용(no_helmet) 대응
카메라가 안전장구 미착용을 감지하면 심각도 high 로 보고 즉시 작업을 중단(halt)하고 안전팀에 통보합니다. 단 검출 신뢰도가 낮으면 오검 가능성이 있어 우선 모니터로 둡니다.
설비 이탈(machine_offzone) 대응
설비가 지정 구역을 벗어나면 심각도에 따라 정비팀에 조치를 배정(dispatch)하거나 중단(halt)합니다.
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
아래 JSON Schema 에 맞는 현장 SOP 문서 20건을 JSON 배열로 생성합니다. 이벤트 타입별 대응 절차와 교대 인수인계 원칙을 담습니다.

{"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]}

쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) body 가 빈 문자열인 결측 문서 1건, (2) 같은 주제의 구버전과 현행이 상충하는 문서 각 1건(현행 규칙 우선), (3) 현장 별칭 정규화를 다루는 문서 1건, (4) 미등록 현장·저신뢰 검출 처리 원칙 문서 각 1건. JSON 배열만.
schema (3 층의 단일 출처)
{"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]}

기술 상세 · 아키텍처·운영·출력 스키마

기술 스택 매핑
Python이벤트 소비자·집계 규칙·브리핑 생성·검증 스크립트의 구현 언어입니다
Kafka현장 카메라·센서 이벤트를 실시간으로 받는 스트림입니다
Airflow교대 시점마다 집계와 브리핑 생성을 스케줄하는 오케스트레이터입니다
BigQuery원천 이벤트·교대별 집계·생성된 브리핑을 적재하는 웨어하우스입니다
Kubernetes이벤트 소비자와 브리핑 생성 서비스를 배포·운영하는 런타임입니다
Docker소비자·집계·브리핑 각 구성요소를 담는 컨테이너 이미지입니다
Terraformk8s·BigQuery·Kafka 리소스를 코드로 프로비저닝합니다
LLM교대 집계 숫자 위에서 인수인계 브리핑 문장을 생성합니다
RAG현장 대응 표준절차(SOP) 문서를 검색해 조치 사유 문장에 맥락을 더하는 보조입니다
MLOps비전 모델·브리핑 프롬프트 버전과 배포 파이프라인을 관리합니다
Computer Vision현장 프레임에서 이상 이벤트(안전장구 미착용·설비 이탈 등)를 태깅합니다
CI/CD집계 규칙·모델·프롬프트 변경을 테스트한 뒤 자동 배포합니다
LLM 선택
model
Claude Sonnet (인수인계 브리핑 생성) + GPT-4o-mini (브리핑 숫자가 집계에 실재하는지 대조하는 judge)
prompt
few-shot 3 예시 + 출력 JSON Schema 강제 + 집계 테이블에 있는 숫자만 인용하도록 강제 + 집계에 없는 숫자는 ungrounded 로 표시하는 가드 + SOP 검색 맥락 주입 + 후행 judge
rationale
브리핑에 들어갈 숫자와 조치 판정은 집계 결과와 심각도 규칙이 결정하므로 LLM 환각이 인수인계를 오염시키지 못합니다. 서술 품질에 Sonnet 을, 숫자 대조 judge 는 비용·속도 우선으로 mini 를 씁니다. RAG 는 현장 SOP 문서 참조에만 좁게 쓰고 제품의 중심에 두지 않습니다.
결정 게이트
1주차 끝합성 이벤트 스트림을 넣으면 교대 구간별 이상 건수·조치 대상이 집계되고, 그 숫자만 인용한 인수인계 브리핑이 자동으로 나오는가. 여기까지가 그 자체로 제출 가능한 완성품입니다.

✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(브리핑이 맞았는지 확인 + 실제 비전 태깅)로 진행합니다.

2주차 끝브리핑의 숫자·조치가 심은 정답 집계·검수자 라벨로 맞다고 확인되고 정확도·일치도가 붙는가. 경량 비전 모델 태깅이 검출 메타데이터를 대체하는가.

✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(실제 배포·스케줄 운영 + 현장별 이상 추이)로 진행합니다.

재사용 레이어 · 코어 70% / 도메인 30%
core (재사용 가능)
  • 이벤트 스트림 소비자 + 교대 구간별 집계 엔진
  • 심각도·신뢰도 조치 규칙 엔진(monitor·dispatch·halt, 저신뢰 하향·결측·미등록 흡수)
  • 집계 숫자만 인용하도록 강제하는 브리핑 생성 가드 + 숫자 대조 judge
  • 이상 건수·조치 카드·현장 추이 대시보드 컴포넌트
  • 미근거 숫자 알림·인수인계 리포트 봇
  • 5% 사람 spot-check 샘플러
domain (교체 대상)
  • 이벤트 타입 사전(안전장구·설비 이탈 등)과 심각도 규칙 정의
  • 검수자 페르소나·인수인계 라벨 가이드
  • 이벤트 타입 enum·조치 팀 매핑·SOP 문서는 현장 도메인별로 갈아끼웁니다
출력 스키마 · handover_brief

한 교대 구간의 인수인계 브리핑. 헤드라인·집계 숫자·이상 목록·권고 조치·미근거 숫자를 한 스키마로 담아 화면 카드와 다음 근무조 전달에 씁니다. 숫자는 전부 집계 테이블 참조(source_ref)로 추적됩니다.

schema (JSON Schema)
{"type":"object","properties":{"shift":{"type":"string","enum":["day","night"]},"site_id":{"type":["string","null"]},"headline":{"type":"string"},"metrics":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"number"},"source_ref":{"type":"string"}},"required":["name","value","source_ref"]}},"anomalies":{"type":"array","items":{"type":"object","properties":{"event_type":{"type":"string"},"count":{"type":"integer"},"severity":{"type":"string","enum":["low","mid","high"]}},"required":["event_type","count","severity"]}},"recommended_actions":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string","enum":["monitor","dispatch","halt"]},"target_team":{"type":"string"},"reason":{"type":"string","minLength":20}},"required":["action","target_team","reason"]}},"ungrounded_numbers":{"type":"array","items":{"type":"string"}},"evidence":{"type":"string","minLength":8},"hedge":{"type":["string","null"]}},"required":["shift","headline","metrics","anomalies","recommended_actions","evidence"]}
모범 출력 (3)
[
  {
    "input_ref": "site_1 주간 교대 집계(halt 1·dispatch 1·monitor 1)",
    "output": {
      "shift": "day",
      "site_id": "site_1",
      "headline": "1공장 주간 교대에 안전장구 미착용 1건으로 라인 중단이 있었습니다.",
      "metrics": [
        {
          "name": "high_severity_count",
          "value": 1,
          "source_ref": "agg:site_1:day:high"
        },
        {
          "name": "total_events",
          "value": 3,
          "source_ref": "agg:site_1:day:total"
        }
      ],
      "anomalies": [
        {
          "event_type": "no_helmet",
          "count": 1,
          "severity": "high"
        }
      ],
      "recommended_actions": [
        {
          "action": "halt",
          "target_team": "안전팀",
          "reason": "안전장구 미착용이 높은 신뢰도로 감지되어 심각도 high 규칙에 따라 라인을 중단하고 안전팀에 인계합니다."
        }
      ],
      "ungrounded_numbers": [],
      "evidence": "agg:site_1:day:high=1, no_helmet conf=0.91",
      "hedge": null
    }
  },
  {
    "input_ref": "site_2 주간, 저신뢰 카메라 검출(conf 0.42) 포함",
    "output": {
      "shift": "day",
      "site_id": "site_2",
      "headline": "2공장 주간 교대는 설비 이탈 중단 1건이 있었고 저신뢰 검출 1건은 모니터로 넘깁니다.",
      "metrics": [
        {
          "name": "halt_count",
          "value": 1,
          "source_ref": "agg:site_2:day:halt"
        },
        {
          "name": "low_conf_downgraded",
          "value": 1,
          "source_ref": "agg:site_2:day:low_conf"
        }
      ],
      "anomalies": [
        {
          "event_type": "machine_offzone",
          "count": 1,
          "severity": "high"
        }
      ],
      "recommended_actions": [
        {
          "action": "monitor",
          "target_team": "현장반",
          "reason": "안전장구 미착용 후보는 검출 신뢰도 0.42 로 낮아 오검 가능성이 있어 조치 단계를 낮춰 모니터로 둡니다."
        }
      ],
      "ungrounded_numbers": [],
      "evidence": "agg:site_2:day:low_conf=1, conf=0.42<0.5",
      "hedge": "저신뢰 검출은 다음 교대에서 재확인이 필요합니다"
    }
  },
  {
    "input_ref": "신규현장Z 야간, 미등록 현장(site_id=null)",
    "output": {
      "shift": "night",
      "site_id": null,
      "headline": "미등록 현장에서 이벤트가 있었으나 현장 매핑 전이라 집계에서 분리합니다.",
      "metrics": [
        {
          "name": "unmapped_site_events",
          "value": 1,
          "source_ref": "agg:unmapped:night:total"
        }
      ],
      "anomalies": [],
      "recommended_actions": [
        {
          "action": "monitor",
          "target_team": "운영관리",
          "reason": "현장 마스터에 없는 미등록 현장이라 기존 현장에 임의로 붙이지 않고 등록 후 재집계하도록 모니터로 둡니다."
        }
      ],
      "ungrounded_numbers": [
        "headline 에 등장할 뻔한 '총 4건'은 집계에 없어 제외"
      ],
      "evidence": "site_id=null, agg:unmapped:night:total=1",
      "hedge": "미등록 현장은 현장 등록 후 다시 집계해야 합니다"
    }
  }
]
검증 노트 (자동 vs 수동)

[자동 검증] 1. 출력이 JSON Schema(필드·enum·minLength)를 통과하는지 확인합니다. 2. metrics 의 각 value 가 집계 테이블의 source_ref 값과 정확히 일치하는지 대조하고, 일치하지 않는 숫자는 ungrounded_numbers 로 빠졌는지 확인합니다(숫자 근거 대조). 3. recommended_actions 의 action 이 심각도·신뢰도 규칙(high→halt·mid→dispatch·low→monitor, 저신뢰 카메라 하향)과 일치하는지 봅니다. 4. action 을 심은 정답 gt_action 집계와 비교해 정확도(정밀도·재현율)를 계산합니다. [수동 검증] 1. 검수자 2명이 비동기로 브리핑 유용성·조치를 라벨링해 정확도와 bootstrap Cohen's κ(두 사람 일치가 우연 이상인 정도, 0~1) 하한 0.6 이상을 봅니다. 2. 전체의 5% 를 사람이 직접 점검합니다.