모두의포트폴리오
PE · FDE 직군을 위한 포트폴리오 밀키트
예전 판입니다 (1판)이 문서는 2026-08-01 에 새 판으로 개정됐습니다. FDE 정의에 맞춰 사용자를 계약 고객사의 정산 담당자로 바꾸고 입력 자료를 고객사 ERP 엑셀·명세서 PDF 로 옮겼으며, 산출물을 웹 콘솔에서 리포트 파일을 내는 CLI로 좁혔습니다.최신 판 보기 →
경력에이치에너지 · AX 시니어 AX팀 -Tech Lead Lead Forward Deployed Engineer

태양광 발전소 인허가에 필요한 서류를 짚어주고, 빠진 항목과 다음 절차를 안내하는 자동화 도구

에이치에너지 공고에서 뽑은 세 가지 시그널.

에이치에너지는 모햇·솔라온케어·솔라쉐어로 전국의 옥상·지붕에 태양광 발전소를 짓고 운영하는 회사이고, 이 자리는 개발·인허가·O&M·전력거래의 병목을 AX 과제로 바꾸는 AX팀 Tech Lead 입니다. 옥상·지붕 태양광은 지자체마다 인허가 요건과 서류가 다르고 프로젝트가 다수 동시에 도는데, 이 진행·서류 흐름은 에이치에너지가 실제로 돌리는 발전사업 파이프라인이 있어야 의미가 있고 다른 도메인 데이터로는 그대로 재현되지 않습니다. 다만 이 포트폴리오가 입증하는 것은 RAG 인용·상태머신 전이·서류 완결성 규칙 같은 기술이며, 인허가 법령 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.

01

현장 문제 → AI 제품(FDE)

사업 현장에 직접 들어가 문제를 정의하고 AI 로 풀어 제품까지 끌고 가는 팀입니다. 인허가 병목처럼 규칙·서류가 많은 실무를 AX 과제로 바꿔 돌아가는 제품으로 만드는 것이 이 역할의 핵심입니다.

문제를 정의AI로 풀어제품까지AX 과제
02

PoC → 운영 품질 제품

프로토타이핑에서 멈추지 않고 배포·모니터링·운영까지 끌고 가는 능력을 봅니다. 1주차 완결품을 GCP 로 배포하고 상태 변화 알림을 자동화하는 흐름으로 이 요구를 그대로 입증합니다.

PoC운영 가능한 제품배포모니터링
03

RAG·Multi-Agent·agentic 도구

우대사항이 LLM/에이전트 production 운영, RAG·Multi-Agent 입니다. 요건 지식베이스 검색(RAG)과 요건조회·서류검증·문서작성 에이전트 분리로 이 우대 역량을 제품 골조로 씁니다.

RAGMulti-Agent에이전트Claude Code

포트폴리오 요약

발전사업자가 태양광 발전소 프로젝트(부지·용량·지자체)를 등록하면, 지자체 요건 지식베이스에서 필요한 인허가 절차와 서류를 근거 문장과 함께 찾아 제시합니다. 제출한 서류를 필수 목록과 대조해 빠진 항목을 규칙으로 짚어 체크리스트를 만들고, 접수→보완요청→재접수→승인/반려 상태를 상태머신으로 추적해 다음 할 일을 안내하며, 보완요청 대응 초안을 LLM 이 근거를 붙여 작성합니다. 모햇·솔라쉐어처럼 옥상·지붕 태양광을 다수 진행하는 파이프라인에서 인허가 실무를 자동화하는 AX 산출물입니다. 근거는 채용공고 정렬이고, 데이터는 작성자가 만든 더미입니다.

고객 정의

에이치에너지 AX팀에서 개발·인허가 병목을 AI 로 바꾸는 Tech Lead. 프로젝트마다 지자체 요건을 일일이 찾아보고 제출 서류가 다 갖춰졌는지 손으로 대조하던 일을 끝내고, 어디까지 진행됐고 다음에 뭘 해야 하는지를 한 화면에서 보고 싶은 사람입니다.

고민 지점

지자체별 인허가 요건을 근거 청크 단위 지식베이스로 묶고 프로젝트별 제출 서류를 한 스키마로 관리하면, (a) 필요한 절차·서류를 인용과 함께 몇 초 안에 제시하고, (b) 제출 서류의 빠진 항목을 규칙으로 정확히 짚으며, (c) 상태머신으로 다음 절차를 안내하고 보완요청 대응 초안까지 근거를 붙여 만들 수 있습니다.

주차별 일정

1주차여기까지로 완성

필요 서류·누락 체크리스트 + 다음 절차 안내

프로젝트를 등록하면 요건 지식베이스에서 필요한 인허가 절차·서류를 인용과 함께 제시하고, 제출 서류의 빠진 항목을 규칙으로 짚어 체크리스트를 만들며, 상태머신으로 다음 절차를 안내하는 동작하는 도구입니다. 요건 지식베이스와 서류는 작성자가 만든 더미로 시작합니다.

  1. 1일 · 프로젝트·서류·상태를 담을 표준 표 만들기project_cases 스키마 설계 + 지자체명 표기 통일(별칭 정규화)
  2. 2-3일 · 요건 지식베이스에서 필요 절차·서류 찾아 인용하기요건 청크 인덱싱 + RAG 검색으로 procedure·required_docs 를 chunk_id 인용과 함께 반환
  3. 4일 · 제출 서류의 빠진 항목을 규칙으로 검사하기필수 서류 대조 후 누락·미매핑 체크리스트 생성(못 찾으면 추측 없이 '미매핑' 표시)
  4. 5일 · 상태머신으로 다음 절차 안내하기접수→보완요청→재접수→승인/반려 전이 정의 + 다음 액션 도출
  5. 6일 · 보완요청 대응 초안을 LLM 이 작성하기인용 근거를 붙인 문구 보조 + 단정·과장 hedge 가드
  6. 7일 · 7일치 시연 영상 + 직접 만든 정답과 비교한 기준선여기까지가 1주차 완성품
2주차선택 성장

인용 정확도 검증 + 에이전트 분리 + GCP 배포

요건조회·서류검증·문서작성 에이전트를 분리하고, 제시한 근거가 실제 요건 문장과 일치하는지 인용 정확도를 검사하며, 보완요청 초안이 사람 검수와 얼마나 맞는지 일치도를 보여주는 단계입니다. GCP Cloud Run 으로 배포·모니터링합니다.

  1. 8-9일 · GCP Cloud Run 배포 + 인용 정확도 검증제시 근거가 실제 요건 문장과 일치하는지 청크 일치 자동 채점
  2. 10-11일 · 요건조회·서류검증·문서작성 에이전트 분리Multi-Agent 오케스트레이션 + 각 단계 로그·모니터링
  3. 12-13일 · 보완문 초안 사람 검수 일치도 측정검수 가이드 + 검수자와 답이 얼마나 일치하는지 측정(Cohen's κ: 두 사람 판정이 우연 이상으로 일치하는 정도, 0~1)
3주차선택 성장

상태 변화 자동화 + 진행현황 집계 대시보드

상태가 바뀌면 n8n 워크플로로 다음 절차 알림을 자동 발송하고, BigQuery 로 프로젝트 진행현황과 누락 패턴을 집계해, 인허가 파이프라인 전체를 한눈에 보는 대시보드로 확장하는 단계입니다.

  1. 15-16일 · 상태 변화 알림 자동화n8n 워크플로로 보완요청·승인 시 다음 절차 알림 자동 발송
  2. 17-18일 · 진행현황·누락 패턴 집계 대시보드BigQuery 로 프로젝트별 진행률·자주 빠지는 서류 집계
  3. 19-20일 · 두 번째 지자체 요건 배치 확장 + 통합 시연다른 지자체 요건을 지식베이스에 추가해 재사용성 확인 + 실 도입 계획(실 요건·법무 검수로 교체)

데모 · 측정 지표

01

프로젝트를 등록하면 필요한 절차·서류 목록과 빠진 항목 체크리스트, 다음 절차가 몇 초 안에 나오는 걸 시연합니다. 각 근거에는 어느 요건 문장에서 왔는지 chunk_id 가 붙습니다

02

제시한 근거의 청크 일치(인용한 문장이 실제 지식베이스에 존재)가 자동 검사에서 통과하고, 상태 전이 규칙 위반이 0건임을 보여줍니다

03

일부러 만든 결측·미등록 지자체·표기흔들림 입력 30종을 넣어도 출력 형식(스키마)이 한 번도 안 깨지고, 요건을 못 찾은 서류는 추측 대신 '미매핑'으로 표시합니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'임을 명시합니다

정직 경계선

진짜 성능 검증은 여기서 멈춥니다

위 수치는 전부 작성자가 만든 더미 요건·서류의 자가채점이며, 실제 인허가 정확도와 누락 판정 정밀도는 에이치에너지의 실제 지자체 요건 자료와 실 법무·인허가 담당 검수가 있어야 측정 가능합니다. 이 도구는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다

미리 알아둬야 할 것들

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

정답을 작성자가 만들었으니 잘 맞는 게 당연합니다. 그래서 결측(서류 미제출)·미등록 지자체(요건 지식베이스에 없음)·표기흔들림(지자체명 원문/별칭)·경계값(서류 0건, 반려 상태) 같은 하드 케이스를 더미에 일부러 섞어, 쉬운 문제만 푸는 게 아님을 보여줘야 합니다

인허가 요건은 지자체·시기별로 다르고 법령 해석이 필요합니다. 이 포트폴리오가 입증하는 것은 RAG 인용·상태머신 전이·서류 완결성 규칙 같은 기술이며, 인허가 법령 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다. 정답은 규칙과 인용 청크 일치로 객관 채점하고, LLM 은 요약·문구 보조만 맡깁니다

실제 도입 시 달라지는 것을 명시합니다. 더미 요건 지식베이스는 실제 지자체 고시·법령 자료와 법무 검수로 교체해야 하고, 요건이 바뀌면 지식베이스를 갱신하는 체계가 필요합니다(도입 단계 과제로 분리)

더미 데이터

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

permit_kbTABLE· 12 rows

지자체×절차별 인허가 요건 지식베이스. RAG 검색과 필수 서류 대조의 진실원이며, 제시 근거의 인용 출처(chunk_id)가 됩니다. 지자체명 별칭·요건 결측·미등록 지자체를 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여줍니다.

② permit_kb.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 12)
chunk_idregion_rawregion_idprocedurerequired_docsbody
kb_gangnam_biz_01서울특별시 강남구r_seoul_gangnam발전사업허가(1MW 이하)["사업계획서","부지 임대차계약서","단선결선도","발전원 종류 및 설비용량 명세"]1MW 이하 태양광 발전사업허가는 시장·군수·구청장 소관으로, 사업계…
kb_gangnam_dev_01강남구r_seoul_gangnam개발행위허가["개발행위허가 신청서","토지 이용계획 확인서","구조안전확인서"]지붕·옥상 설치라도 구조 변경이 수반되면 개발행위 또는 구조안전 검토…
kb_seongnam_biz_01경기도 성남시r_gg_seongnam발전사업허가(1MW 이하)["사업계획서","부지 임대차계약서","단선결선도","등기부등본"]성남시 1MW 이하 발전사업허가는 사업계획서와 임대차계약서, 단선결선…
kb_seongnam_grid_01성남r_gg_seongnam계통연계 신청["계통연계 신청서","단선결선도","설비용량 명세"]계통연계는 한전 배전 접속 신청으로, 단선결선도와 설비용량 명세를 제…
kb_cheonan_biz_01충청남도 천안시r_cn_cheonan발전사업허가(1MW 이하)["사업계획서","부지 임대차계약서","단선결선도"]천안시 1MW 이하 발전사업허가 기본 제출 서류입니다. 지붕 임대형은…
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
아래 JSON Schema 에 맞는 지자체별 태양광 인허가 요건 지식베이스 청크 40개를 JSON 배열로 생성하세요. 지자체 6~8곳 × 절차(발전사업허가·개발행위허가·계통연계·안전관리자 선임)를 조합하고, body 는 실제 검색 근거로 쓸 3~5문장으로 씁니다.

{"type":"object","properties":{"chunk_id":{"type":"string"},"region_raw":{"type":"string"},"region_id":{"type":["string","null"]},"procedure":{"type":"string"},"required_docs":{"type":"array","items":{"type":"string"}},"body":{"type":"string"}},"required":["chunk_id","region_raw","procedure","body"]}

쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞으세요: (1) 같은 지자체의 region_raw 표기 흔들림(예: '서울특별시 강남구'와 '강남구'가 같은 region_id 로 정규화돼야 함), (2) region_id=null 이고 required_docs 가 빈 배열인 '요건 미확정' 지역 1~2건(미매핑으로 처리돼야 함), (3) 같은 지자체라도 절차마다 required_docs 가 다르게. JSON 배열만 출력하세요.
schema (3 층의 단일 출처)
{"type":"object","properties":{"chunk_id":{"type":"string"},"region_raw":{"type":"string"},"region_id":{"type":["string","null"]},"procedure":{"type":"string"},"required_docs":{"type":"array","items":{"type":"string"}},"body":{"type":"string"}},"required":["chunk_id","region_raw","procedure","body"]}
project_casesTABLE· 12 rows

프로젝트별 제출 서류 현황과 정답(필요 절차·누락 서류·상태). 서류 결측·미등록 지자체(orphan)·표기흔들림·경계값(서류 0건, 반려 상태)을 일부러 섞어, 규칙 검사와 상태머신이 하드 케이스에서도 안 깨지는지 보여줍니다.

② project_cases.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 12)
project_idplant_typeregion_rawregion_idproceduresubmitted_docsstategold_missing_docsgold_next_action
prj_0001옥상태양광서울특별시 강남구r_seoul_gangnam발전사업허가(1MW 이하)["사업계획서","부지 임대차계약서","단선결선도"]접수["발전원 종류 및 설비용량 명세"]설비용량 명세를 보완 제출하도록 보완요청으로 전환
prj_0002지붕태양광강남구r_seoul_gangnam발전사업허가(1MW 이하)["사업계획서","부지 임대차계약서","단선결선도","발전원 종류 및 설비용량 명세"]접수[]필수 서류 충족, 심사 진행
prj_0003옥상태양광경기도 성남시r_gg_seongnam발전사업허가(1MW 이하)["사업계획서","단선결선도"]보완요청["부지 임대차계약서","등기부등본"]임대차계약서와 등기부등본 보완 안내
prj_0004지붕태양광성남r_gg_seongnam계통연계 신청["계통연계 신청서","단선결선도","설비용량 명세"]승인[]계통연계 승인 완료, 다음 절차(공사 착수) 안내
prj_0005옥상태양광부산광역시 해운대구r_busan_haeundae발전사업허가(1MW 이하)["사업계획서","부지 임대차계약서","단선결선도"]접수["안전관리자 선임 계획서"]해운대구 요건인 안전관리자 선임 계획서 보완요청
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
아래 JSON Schema 에 맞는 태양광 발전소 인허가 프로젝트 케이스 40행을 JSON 배열로 생성하세요. region_raw·procedure 는 permit_kb 의 지자체·절차와 매칭되게 하고, gold_missing_docs 는 해당 요건의 required_docs 와 submitted_docs 의 차집합으로 결정되게(정답이 규칙으로 재현되게) 만드세요.

{"type":"object","properties":{"project_id":{"type":"string"},"plant_type":{"type":"string","enum":["옥상태양광","지붕태양광","유휴부지태양광"]},"region_raw":{"type":"string"},"region_id":{"type":["string","null"]},"procedure":{"type":"string"},"submitted_docs":{"type":"array","items":{"type":"string"}},"state":{"type":"string","enum":["접수","보완요청","재접수","승인","반려"]},"gold_missing_docs":{"type":["array","null"],"items":{"type":"string"}},"gold_next_action":{"type":"string"}},"required":["project_id","plant_type","region_raw","procedure","submitted_docs","state","gold_next_action"]}

쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞으세요: (1) submitted_docs 가 빈 배열인 경계값 1~2건(전부 보완요청), (2) region_id=null 인 미등록 지자체 orphan 1~2건(gold_missing_docs=null, '미매핑' 처리), (3) region_raw 표기 흔들림(같은 지자체를 '경기도 성남시'와 '성남'으로), (4) state=반려 케이스(재접수 전이가 불가함을 상태머신이 걸러야 함), (5) 필수 서류를 모두 갖춘 gold_missing_docs=[] 케이스. JSON 배열만 출력하세요.
schema (3 층의 단일 출처)
{"type":"object","properties":{"project_id":{"type":"string"},"plant_type":{"type":"string","enum":["옥상태양광","지붕태양광","유휴부지태양광"]},"region_raw":{"type":"string"},"region_id":{"type":["string","null"]},"procedure":{"type":"string"},"submitted_docs":{"type":"array","items":{"type":"string"}},"state":{"type":"string","enum":["접수","보완요청","재접수","승인","반려"]},"gold_missing_docs":{"type":["array","null"],"items":{"type":"string"}},"gold_next_action":{"type":"string"}},"required":["project_id","plant_type","region_raw","procedure","submitted_docs","state","gold_next_action"]}

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

기술 스택 매핑
Python요건 지식베이스 인덱싱·RAG 검색, 서류 완결성 규칙 검사, 상태머신 전이 로직, 인용 청크 일치 자동 채점 스크립트
TypeScript인허가 진행 콘솔(프로젝트별 필요 서류·누락 체크리스트·상태 보드) 프런트
Next.js콘솔 웹앱 + 요건 근거 인용 카드·상태 타임라인 렌더링
LLM(Claude Sonnet)보완요청 대응 초안 작성과 요건 요약 등 변환·문구 보조(정답 판정은 규칙·인용 일치가 담당)
RAG지자체별 요건 지식베이스에서 필요한 절차·서류 근거 청크를 검색하고 chunk_id 로 인용
Multi-Agent요건조회·서류검증·문서작성 에이전트를 분리해 오케스트레이션
GCP Cloud Run2주차부터 API·워커를 배포·운영
Vertex AI요건 청크 임베딩과 검색 서빙(RAG 벡터 검색)
BigQuery프로젝트 진행현황·서류 누락 패턴 집계
n8n상태 변화(보완요청·승인) 시 다음 절차 알림·트리거 워크플로 자동화
PostgreSQL프로젝트·서류·상태·요건 참조의 단일 진실원
LLM 선택
model
Claude Sonnet (보완요청 초안·요건 요약) + GPT-4o-mini (인용 의미 일치 보조 judge)
prompt
RAG 검색 결과를 근거로 chunk_id 를 반드시 반환하게 강제 + JSON Schema 출력 강제 + 단정·과장 문구 hedge 가드. 서류 유무·상태 전이는 LLM 이 아니라 규칙으로 판정하고 그 결과를 프롬프트에 주입합니다.
rationale
필요 서류 판정과 상태 전이 정합성은 규칙·상태머신으로 결정론적으로 처리하고, LLM 은 요건 요약과 보완요청 초안 같은 변환·문구 보조만 맡깁니다. 요건 지식베이스가 지자체×절차로 커서 컨텍스트에 다 못 넣으므로 RAG 는 필요합니다.
결정 게이트
1주차 끝프로젝트를 등록하면 필요 절차·서류가 인용과 함께 뜨고, 빠진 항목 체크리스트와 다음 절차가 자동으로 나오는가. 여기까지가 그 자체로 제출 가능한 완성품입니다.

✓ pass → 그대로 멈춰도 완결입니다. 더 키우고 싶으면 2주차(인용 정확도 검증·에이전트 분리·사람 검수 일치)로 진행합니다.

2주차 끝제시한 근거가 실제 요건 문장과 일치하고, 상태 전이 위반이 없으며, 보완요청 초안이 사람 검수와 맞는가.

✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(상태 변화 자동화·진행현황 집계 대시보드)로 진행합니다.

재사용 레이어 · 코어 70% / 도메인 30%
core (재사용 가능)
  • RAG 근거 검색 + 인용 청크 일치 자동 채점(제시 근거가 실제 문장과 일치하는지)
  • 필수 항목 대조 규칙 엔진(제출물 vs 요건 → 누락·미매핑 판정)
  • 상태머신 전이 검증(허용된 전이만 통과, 위반 차단)
  • 요건조회·검증·문서작성 Multi-Agent 오케스트레이션
  • 보완문 초안 hedge 가드(단정·과장 문구 완곡화)
  • 진행현황·누락 패턴 집계 대시보드(Next.js + BigQuery)
domain (교체 대상)
  • 지자체×절차 인허가 요건 지식베이스와 필수 서류 목록
  • 서류 유형·인허가 상태 enum(도메인별로 갈아끼움)
  • 발전사업 진행 상태 전이 정의와 다음 절차 규칙
  • 발전사업자·인허가 담당자 페르소나
출력 스키마 · permit_progress_and_gap_report

프로젝트별로 1) 필요한 인허가 절차·서류를 요건 청크 인용과 함께 제시, 2) 제출 서류의 빠진 항목을 근거와 함께 판정, 3) 상태머신으로 현재 상태·다음 액션·전이 정합성 확인, 4) 보완요청 대응 초안을 근거를 붙여 작성. 판정(누락·전이)은 규칙으로 결정하고 LLM 은 초안·요약만 맡습니다.

schema (JSON Schema)
{"type":"object","properties":{"project_id":{"type":"string"},"region_id":{"type":["string","null"]},"required_procedures":{"type":"array","items":{"type":"object","properties":{"procedure":{"type":"string"},"requirement_chunk_id":{"type":"string"},"required_docs":{"type":"array","items":{"type":"string"}}},"required":["procedure","requirement_chunk_id","required_docs"]}},"missing_items":{"type":"array","items":{"type":"object","properties":{"doc_type":{"type":"string"},"status":{"type":"string","enum":["present","missing","unmapped"]},"evidence_chunk_id":{"type":["string","null"]}},"required":["doc_type","status"]}},"state":{"type":"object","properties":{"current":{"type":"string"},"next_action":{"type":"string"},"transition_valid":{"type":"boolean"}},"required":["current","next_action","transition_valid"]},"draft_reply":{"type":["string","null"]},"hedge":{"type":["string","null"]}},"required":["project_id","required_procedures","missing_items","state"]}
모범 출력 (3)
[
  {
    "input_ref": "prj_0001 (강남구 옥상태양광, 발전사업허가, 상태=접수)",
    "output": {
      "project_id": "prj_0001",
      "region_id": "r_seoul_gangnam",
      "required_procedures": [
        {
          "procedure": "발전사업허가(1MW 이하)",
          "requirement_chunk_id": "kb_gangnam_biz_01",
          "required_docs": [
            "사업계획서",
            "부지 임대차계약서",
            "단선결선도",
            "발전원 종류 및 설비용량 명세"
          ]
        }
      ],
      "missing_items": [
        {
          "doc_type": "사업계획서",
          "status": "present",
          "evidence_chunk_id": "kb_gangnam_biz_01"
        },
        {
          "doc_type": "부지 임대차계약서",
          "status": "present",
          "evidence_chunk_id": "kb_gangnam_biz_01"
        },
        {
          "doc_type": "단선결선도",
          "status": "present",
          "evidence_chunk_id": "kb_gangnam_biz_01"
        },
        {
          "doc_type": "발전원 종류 및 설비용량 명세",
          "status": "missing",
          "evidence_chunk_id": "kb_gangnam_biz_01"
        }
      ],
      "state": {
        "current": "접수",
        "next_action": "설비용량 명세 보완을 위해 보완요청으로 전환",
        "transition_valid": true
      },
      "draft_reply": "접수하신 강남구 옥상태양광 발전사업허가 건은 사업계획서·임대차계약서·단선결선도가 확인되었습니다. 발전원 종류 및 설비용량 명세가 확인되지 않아 보완을 요청드립니다.",
      "hedge": "필수 서류 목록은 작성자가 만든 더미 요건(kb_gangnam_biz_01) 기준이며, 실제 접수 시 지자체 최신 고시로 확인이 필요합니다."
    }
  },
  {
    "input_ref": "prj_0008 (원주시, 요건 지식베이스 미등록 지자체)",
    "output": {
      "project_id": "prj_0008",
      "region_id": null,
      "required_procedures": [],
      "missing_items": [
        {
          "doc_type": "(요건 미확인)",
          "status": "unmapped",
          "evidence_chunk_id": null
        }
      ],
      "state": {
        "current": "접수",
        "next_action": "요건 지식베이스에 없는 지자체이므로 '미매핑'으로 표시하고 요건 확인 요청",
        "transition_valid": true
      },
      "draft_reply": null,
      "hedge": "원주시 요건이 지식베이스에 등록되지 않아 필수 서류를 판정하지 않았습니다. 추측 없이 미매핑으로 처리합니다."
    }
  },
  {
    "input_ref": "prj_0009 (미추홀구, 상태=반려에서 재접수 시도)",
    "output": {
      "project_id": "prj_0009",
      "region_id": "r_incheon_michuhol",
      "required_procedures": [
        {
          "procedure": "발전사업허가(1MW 이하)",
          "requirement_chunk_id": "kb_incheon_biz_01",
          "required_docs": [
            "사업계획서",
            "부지 임대차계약서",
            "단선결선도"
          ]
        }
      ],
      "missing_items": [
        {
          "doc_type": "사업계획서",
          "status": "present",
          "evidence_chunk_id": "kb_incheon_biz_01"
        },
        {
          "doc_type": "부지 임대차계약서",
          "status": "present",
          "evidence_chunk_id": "kb_incheon_biz_01"
        },
        {
          "doc_type": "단선결선도",
          "status": "present",
          "evidence_chunk_id": "kb_incheon_biz_01"
        }
      ],
      "state": {
        "current": "반려",
        "next_action": "반려 건은 재접수로 바로 전이할 수 없어 신규 접수 절차를 안내",
        "transition_valid": false
      },
      "draft_reply": "해당 건은 반려 상태로, 재접수가 아닌 신규 접수가 필요합니다. 반려 사유를 먼저 확인해 주시기 바랍니다.",
      "hedge": "상태 전이 정합성은 작성자가 정의한 상태머신 규칙 기준입니다. 실제 지자체 절차의 재접수 허용 여부는 확인이 필요합니다."
    }
  }
]
검증 노트 (자동 vs 수동)

[자동 검증] 1. JSON Schema 형식 통과: 출력이 스키마를 만족하는지(필드·enum·타입) 검사해 형식 깨짐을 거릅니다. 2. 인용 청크 일치: required_procedures·missing_items 의 chunk_id 가 permit_kb 에 실제 존재하고, required_docs 가 그 청크의 목록과 일치하는지 대조합니다(근거 없는 인용 차단). 3. 누락 판정 정확도: missing_items 의 missing 이 required_docs 와 submitted_docs 의 차집합과 일치하는지 규칙으로 채점합니다. 4. 상태 전이 정합성: state.transition_valid 가 상태머신 허용 전이(접수→보완요청→재접수→승인/반려)와 맞는지, 반려→재접수 같은 금지 전이를 걸러내는지 검사합니다. [수동 검증] 1. 보완요청 초안 검수: 외부 검수자 2명이 draft_reply 가 근거와 맞고 과장·단정이 없는지 라벨링하고, 판정이 얼마나 일치하는지 측정합니다(Cohen's κ: 두 사람 판정이 우연 이상으로 일치하는 정도, 0~1). 2. 미매핑 처리 점검: region_id=null·요건 미확정 케이스에서 추측 없이 unmapped 로 표시되는지 표본 점검합니다.