로이드케이
경력근거: 프로젝트 인력 매칭, 파트너 선정, 손익 판단 등 사업적 유스케이스 정의부터 에이전트 설계, 개발, 운영 전반 주도
※ 실제 산출물이 아닌 AI 예측 시안입니다.
로이드케이는 빅데이터 분석 플랫폼, AI 기반 유통 데이터 연구, 보안·클라우드 구축을 고객사 프로젝트로 수행하는 회사이고, 이 공고는 프로젝트 인력 매칭, 파트너 선정, 손익 판단을 내부 의사결정 시스템의 유스케이스로 직접 적었습니다. 사내 인력과 협력 파트너를 섞어 프로젝트를 꾸리는 수행 회사라서 같은 계약 금액이라도 누가 그 기간에 비어 있느냐에 따라 이익률이 갈리고, 그 판단은 현업(BizOps, 영업, 수행팀)이 같은 숫자를 볼 때 빨라집니다. 이 포트폴리오는 착수일 기준 인력 배치와 원가 계산 규칙, 그 결과를 영업과 수행팀이 함께 보는 화면, 판정 계산을 도구로 부르는 질문 에이전트를 보여줍니다. 인력 수급 계획이나 프로젝트 원가 회계에 대한 전문성은 주장하지 않습니다.
주요업무 첫 줄이 프로젝트 인력 매칭, 파트너 선정, 손익 판단 같은 사업 유스케이스를 정의하고 에이전트로 만드는 일입니다. 로이드케이는 데이터·AI·보안·클라우드 프로젝트를 수주해 수행하는 회사라, 새 프로젝트를 맡기 전에 그 기간에 누가 비어 있고 모자란 자리를 어느 파트너로 메우면 얼마가 남는지가 매번 나오는 질문입니다.
자격요건은 문제 정의·디자인·개발·배포를 혼자 완결해 본 경험과 DB·API·권한·로그를 갖춘 운영 가능한 소프트웨어 출시입니다. 영업과 수행팀이 같이 보는 내부 화면 하나를 판정 규칙부터 역할별 권한, AWS 배포까지 한 사람이 닫는 이 포트폴리오의 범위가 그 요구에 맞춰져 있습니다.
우대사항에 LLM API·툴콜링·에이전틱 워크플로우가 있고, 주요업무에 CLAUDE.md·AGENTS.md·스킬·훅 같은 AI 규칙을 자산화하는 일이 있습니다. 3주차의 배치 질문 에이전트는 판정 계산을 도구로 부르기만 하고, 판정 규칙과 금지 사항은 CLAUDE.md 와 커밋 전 훅으로 남겨 다른 사람이 이어받게 합니다.
로이드케이 영업 담당자는 공공·금융·유통·제조 고객사의 데이터·AI 프로젝트를 견적하고, 수행팀 PM 과 BizOps 담당자는 그 프로젝트에 누구를 넣을지 정합니다. 이 관리자 페이지는 검토 중인 입찰의 역할별 투입 계획, 사내 인력의 기술과 월 원가와 지금 프로젝트가 끝나는 날, 협력 파트너의 기술과 월 단가와 투입 가능일, 고객 업종별 목표 이익률과 파트너 비중 상한을 적은 손익 기준표를 받아 입찰마다 다섯 판정 중 하나를 붙입니다. 역할마다 착수일에 비어 있는 사내 인력을 월 원가가 낮은 순으로 먼저 넣고 모자란 자리를 단가가 낮은 파트너로 채운 뒤, 개월 수를 곱해 원가와 이익률, 파트너 비중을 계산합니다. 영업 담당자와 수행팀 PM 은 같은 화면에서 배치 결과와 숫자를 보고 이 금액으로 맡을지, 사람을 바꿀지 정합니다.
새 프로젝트를 맡을지 정하는 로이드케이 영업 담당자와, 그 프로젝트에 사람을 대는 수행팀 PM·BizOps 담당자 — 같은 화면을 보고 투입 인력과 파트너 선정을 함께 정한다
지금은 영업 담당자가 견적 시트에 역할별 인원과 평균 단가를 넣어 이익률을 어림하고, 누가 실제로 비어 있는지는 수행팀 PM 에게 메신저로 묻습니다. 인력 현황표의 프로젝트 종료일과 파트너 투입 가능일을 착수일에 맞춰 대 보면 평균 단가 대신 실제로 넣을 수 있는 사람의 원가가 나오고, 사내 인력이 하루 차이로 빠지는 자리나 파트너로만 메워지는 자리가 계약 전에 숫자로 드러납니다.
영업 담당자가 입찰 역할표·사내 인력표·파트너표·손익 기준표 네 파일을 올리면 입찰마다 다섯 판정 중 하나와 역할별로 넣은 사람, 원가 합계, 이익률, 파트너 비중이 서는 관리자 페이지입니다. 착수일에 비어 있는 사람만 고르는 배치 규칙, 월 단위 개월 수 계산, 착수일 기준으로 손익 기준표의 유효 행을 고르는 규칙, 판정 차례가 이 주에 들어가고 Vercel 미리보기 주소로 수행팀 PM 과 함께 봅니다.
착수일 당일에 풀리는 인력과 기준 변경일에 걸친 입찰을 늘린 60건을 만들고, 수행팀 PM 이라면 내렸을 판정을 먼저 적어 둔 뒤 자동 판정과 갈린 입찰을 판정별로 셉니다. 이익률 미달과 적자 입찰에는 원가 합계를 1 에서 목표 이익률을 뺀 값으로 나눈 최소 계약 금액을 붙여 영업 담당자가 견적을 다시 낼 기준으로 씁니다. 2주차부터 AWS 에 배포하고, 영업은 판정을 보기만 하고 수행팀 PM 은 배치를 고칠 수 있게 역할별 권한과 변경 로그를 둡니다.
수행팀 PM 이 'B-1021 의 AI 엔지니어 한 명을 S-102 로 바꾸면?' 처럼 물으면 Claude 가 판정 계산 API 를 도구로 불러 바뀐 배치의 원가와 판정을 받아 답합니다. 답의 숫자가 도구가 돌려준 값과 하나라도 다르면 답 대신 도구 결과 표를 그대로 보여주고, 판정 규칙과 금지 사항은 CLAUDE.md 와 커밋 전 훅으로 남깁니다.
영업 담당자가 네 파일을 올리면 B-1024 유통 데이터 분석 플랫폼이 Elastic 엔지니어 2명을 착수일에 구할 수 없어 인력 없음으로, B-1027 금융권 보안 분석이 원가 2억 6,350만 원으로 계약 2억 5,000만 원을 넘어 적자로 섭니다.
수행팀 PM 이 B-1021 을 펼쳐 역할마다 넣은 사람과 월 원가, 파트너 P-201 의 단가, 6개월 원가 합계와 이익률 12.5%, 공공 업종 목표 18% 를 읽고 그 숫자로 PM 이나 AI 엔지니어를 바꿔 볼지 정합니다.
착수일과 같은 날 투입 가능한 파트너, 착수일과 같은 날 프로젝트가 끝나는 사내 인력, 프로젝트 종료일이 비어 있는 사내 인력, 파트너 없이 사내 인력만으로 꾸린 입찰을 한 번에 올려도 입찰마다 판정이 하나씩 붙습니다. 날짜 칸이 깨진 인력표 10종은 그 사람만 배치 후보에서 빼고 이유를 펼침 화면에 적습니다.
입찰 60건은 수행팀 PM 이라면 어떻게 판정할지 제가 먼저 적어 두고 자동 판정과 다른 입찰 수를 판정별로 셉니다. 입찰과 인력표, 정답이 모두 제가 만든 것이라 차이가 0 이어도 배치 규칙과 판정 차례가 문서대로 돈다는 뜻일 뿐, 그 배치가 현장에 맞는 사람을 골랐다는 뜻은 아닙니다.
위 수치는 더미데이터 자가채점이며, 판정이 실제 수주 결정을 바꾸는지는 로이드케이의 실제 견적 시트와 인력 현황, 그리고 수행이 끝난 프로젝트의 실제 원가가 있어야 측정됩니다. 견적 시트의 역할 줄과 수행팀 인력 현황표가 지금 열 이름 그대로 들어오도록 업로드 형식을 맞춰 두어, 첫 실데이터는 진행 중인 입찰 한두 건으로 바로 돌려 볼 수 있습니다.
입찰 60건의 배치 정답을 수행팀 PM 이 아니라 제가 적었으므로, 원가 낮은 순 배치가 옳다는 근거는 제 판단 하나입니다. 실제 PM 은 고객사 경험이나 팀 궁합 때문에 더 비싼 사람을 넣기도 해서, 시연이 보여주는 것은 날짜 비교와 원가 계산이 규칙대로 도는 데까지입니다.
모든 역할이 사내 인력으로 딱 채워지는 입찰뿐이라면 판정이 갈릴 일이 없습니다. 착수일 당일 투입 가능한 파트너, 착수일 당일 프로젝트가 끝나 빠지는 S-104, 종료일이 비어 있는 S-110, 업종별 기준이 7월과 12월에 바뀌는 손익 기준표를 더미에 넣은 이유가 그것입니다.
검토 중인 입찰끼리는 서로의 배치를 모르고 따로 계산합니다. 더미에서 S-101 이 B-1021·B-1030·B-1033·B-1036 네 입찰에 모두 들어가는데, 실제로는 하나만 따도 나머지 배치가 바뀝니다. 입찰 사이의 인력 경합은 수주 확률을 알아야 풀리는 문제라 도입 단계 과제로 둡니다.
월 단가에 개월 수를 곱하는 단순 원가라 부분 투입(한 사람의 50%), 출장비, 하자보수 기간 원가는 빠집니다. 실제 도입 때 로이드케이 원가 기준에 맞춰 계산 항목을 더합니다.
이 포트폴리오는 착수일 기준 인력 배치와 원가 계산 규칙, 그 결과를 함께 보는 화면과 질문 에이전트를 보여줍니다. 인력 수급 계획이나 프로젝트 원가 회계에 대한 전문성은 주장하지 않습니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
영업 담당자의 견적 시트에서 내려받은 검토 중 입찰의 역할별 투입 계획입니다. 역할 한 줄마다 필요한 기술과 인원, 투입 기간을 적고, 같은 bid_id 줄은 같은 계약 금액(만원)을 반복해 적습니다.
| bid_id | project_name | client_sector | line_seq | role | skill | headcount | start_date | end_date | contract_amount |
|---|---|---|---|---|---|---|---|---|---|
| B-1021 | 공공기관 RAG 챗봇 구축 | 공공 | 1 | PM | PM | 1 | 2026-11-01 | 2027-04-30 | 32,500 |
| B-1021 | 공공기관 RAG 챗봇 구축 | 공공 | 2 | AI 엔지니어 | LLM·RAG | 2 | 2026-11-01 | 2027-04-30 | 32,500 |
| B-1021 | 공공기관 RAG 챗봇 구축 | 공공 | 3 | 백엔드 개발 | 백엔드 | 1 | 2026-11-01 | 2027-04-30 | 32,500 |
| B-1021 | 공공기관 RAG 챗봇 구축 | 공공 | 4 | 화면 개발 | 프론트엔드 | 1 | 2026-11-01 | 2027-04-30 | 32,500 |
| B-1024 | 유통 데이터 분석 플랫폼 | 유통 | 1 | 검색 엔지니어 | Elastic | 2 | 2026-11-01 | 2027-02-28 | 26,000 |
아래 JSON Schema 에 맞는 로이드케이 검토 중 입찰의 역할 줄을 더 만들어 주세요. {"type":"object","properties":{"bid_id":{"type":"string"},"project_name":{"type":"string"},"client_sector":{"type":"string","enum":["공공","금융","유통","제조","그룹사"]},"line_seq":{"type":"integer","minimum":1,"description":"입찰 안에서 역할 줄의 순서입니다."},"role":{"type":"string","description":"견적서에 적힌 역할 이름입니다."},"skill":{"type":"string","description":"인력·파트너와 맞춰 볼 기술입니다."},"headcount":{"type":"integer","minimum":1},"start_date":{"type":"string","description":"착수일(YYYY-MM-DD)입니다."},"end_date":{"type":"string","description":"종료일(YYYY-MM-DD)입니다."},"contract_amount":{"type":"integer","minimum":1,"description":"입찰 전체 계약 금액(만원)입니다."}},"required":["bid_id","project_name","client_sector","line_seq","role","skill","headcount","start_date","end_date","contract_amount"]} 입찰 하나는 역할 2~5줄이고 같은 bid_id 줄은 project_name·client_sector·contract_amount 가 같습니다. 착수일은 달의 1일, 종료일은 달의 말일로 씁니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 사내 인력도 파트너도 없는 드문 기술(Elastic·SAP 등)이 들어간 입찰, (2) 원가가 계약 금액을 조금 넘는 입찰, (3) 이익률은 넉넉한데 파트너로만 채워지는 입찰, (4) 착수일이 손익 기준표의 기준 변경일과 같은 입찰, (5) 한 역할에 3명 이상이 필요한 입찰. 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"bid_id":{"type":"string"},"project_name":{"type":"string"},"client_sector":{"type":"string","enum":["공공","금융","유통","제조","그룹사"]},"line_seq":{"type":"integer","minimum":1,"description":"입찰 안에서 역할 줄의 순서입니다."},"role":{"type":"string","description":"견적서에 적힌 역할 이름입니다."},"skill":{"type":"string","description":"인력·파트너와 맞춰 볼 기술입니다."},"headcount":{"type":"integer","minimum":1},"start_date":{"type":"string","description":"착수일(YYYY-MM-DD)입니다."},"end_date":{"type":"string","description":"종료일(YYYY-MM-DD)입니다."},"contract_amount":{"type":"integer","minimum":1,"description":"입찰 전체 계약 금액(만원)입니다."}},"required":["bid_id","project_name","client_sector","line_seq","role","skill","headcount","start_date","end_date","contract_amount"]}수행팀이 관리하는 사내 인력 현황입니다. 월 원가는 만원 단위이고, busy_until 은 지금 맡은 프로젝트가 끝나는 날입니다. 프로젝트에 들어가 있지 않은 사람은 busy_until 이 비어 있고, 착수일과 같은 날 프로젝트가 끝나는 사람을 일부러 넣었습니다.
| staff_id | name | skill | monthly_cost | busy_until |
|---|---|---|---|---|
| S-101 | 김도현 | LLM·RAG | 950 | 2026-10-31 |
| S-102 | 이수빈 | LLM·RAG | 880 | 2027-02-28 |
| S-103 | 박준영 | 백엔드 | 820 | 2026-09-30 |
| S-104 | 최서연 | 백엔드 | 760 | 2026-12-01 |
| S-105 | 정민석 | 데이터 엔지니어 | 840 | 2026-10-15 |
아래 JSON Schema 에 맞는 로이드케이 사내 인력 현황 행을 더 만들어 주세요. {"type":"object","properties":{"staff_id":{"type":"string"},"name":{"type":"string"},"skill":{"type":"string"},"monthly_cost":{"type":"integer","minimum":1,"description":"인건비와 간접비를 더한 월 원가(만원)입니다."},"busy_until":{"type":["string","null"],"description":"지금 맡은 프로젝트의 종료일(YYYY-MM-DD)입니다. 맡은 프로젝트가 없으면 null 입니다."}},"required":["staff_id","name","skill","monthly_cost","busy_until"]} 기술은 LLM·RAG·백엔드·프론트엔드·데이터 엔지니어·Elastic·보안 분석·클라우드·PM 중에서 고르고, 월 원가는 650~1,100만원 사이로 씁니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 맡은 프로젝트가 없어 busy_until 이 null 인 사람, (2) busy_until 이 어느 입찰 착수일과 정확히 같은 날인 사람, (3) 같은 기술에 원가가 같은 두 사람, (4) 착수일 하루 전에 프로젝트가 끝나는 사람. 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"staff_id":{"type":"string"},"name":{"type":"string"},"skill":{"type":"string"},"monthly_cost":{"type":"integer","minimum":1,"description":"인건비와 간접비를 더한 월 원가(만원)입니다."},"busy_until":{"type":["string","null"],"description":"지금 맡은 프로젝트의 종료일(YYYY-MM-DD)입니다. 맡은 프로젝트가 없으면 null 입니다."}},"required":["staff_id","name","skill","monthly_cost","busy_until"]}BizOps 담당자가 관리하는 협력 파트너 인력 목록입니다. 월 단가는 만원 단위이고, available_from 은 투입 가능한 첫날입니다. 착수일과 같은 날부터 투입 가능한 파트너와 착수일보다 늦게 풀리는 파트너를 일부러 넣었습니다.
| partner_id | partner_name | skill | monthly_rate | available_from |
|---|---|---|---|---|
| P-201 | 에이아이온 | LLM·RAG | 1,300 | 2026-11-01 |
| P-202 | 코드브릿지 | 백엔드 | 1,050 | 2026-10-01 |
| P-203 | 스택웍스 | 백엔드 | 1,100 | 2026-12-01 |
| P-204 | 데이터레일 | 데이터 엔지니어 | 1,150 | 2026-11-01 |
| P-205 | 서치랩 | Elastic | 1,400 | 2027-01-01 |
아래 JSON Schema 에 맞는 협력 파트너 인력 행을 더 만들어 주세요. {"type":"object","properties":{"partner_id":{"type":"string"},"partner_name":{"type":"string","description":"협력사 이름입니다."},"skill":{"type":"string"},"monthly_rate":{"type":"integer","minimum":1,"description":"월 단가(만원)입니다."},"available_from":{"type":"string","description":"투입 가능한 첫날(YYYY-MM-DD)입니다."}},"required":["partner_id","partner_name","skill","monthly_rate","available_from"]} 같은 기술의 파트너 단가는 사내 인력 월 원가보다 20~50% 높게 씁니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) available_from 이 어느 입찰 착수일과 정확히 같은 파트너, (2) 착수일보다 한두 달 늦게 풀리는 드문 기술 파트너, (3) 같은 기술에 단가가 같은 두 파트너, (4) 사내 인력이 없는 기술의 파트너. 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"partner_id":{"type":"string"},"partner_name":{"type":"string","description":"협력사 이름입니다."},"skill":{"type":"string"},"monthly_rate":{"type":"integer","minimum":1,"description":"월 단가(만원)입니다."},"available_from":{"type":"string","description":"투입 가능한 첫날(YYYY-MM-DD)입니다."}},"required":["partner_id","partner_name","skill","monthly_rate","available_from"]}고객 업종별 목표 이익률과 원가 중 파트너 몫의 상한을 적은 손익 기준표입니다. 기준이 바뀐 날을 effective_from 으로 남겨 입찰 착수일 이전의 가장 최근 행을 씁니다. 판정이 도는지 보이기 위한 더미 기준이며 로이드케이의 실제 기준이 아닙니다.
| client_sector | effective_from | min_margin_rate | max_partner_share |
|---|---|---|---|
| 공공 | 2026-01-01 | 0.15 | 0.4 |
| 공공 | 2026-07-01 | 0.18 | 0.4 |
| 금융 | 2026-01-01 | 0.2 | 0.45 |
| 금융 | 2026-12-01 | 0.22 | 0.5 |
| 유통 | 2026-01-01 | 0.25 | 0.4 |
아래 JSON Schema 에 맞는 업종별 손익 기준표 행을 더 만들어 주세요. {"type":"object","properties":{"client_sector":{"type":"string","enum":["공공","금융","유통","제조","그룹사"]},"effective_from":{"type":"string","description":"이 기준이 적용되기 시작한 날(YYYY-MM-DD)입니다."},"min_margin_rate":{"type":"number","minimum":0,"maximum":1,"description":"목표 이익률입니다. 0.18 은 18% 입니다."},"max_partner_share":{"type":"number","minimum":0,"maximum":1,"description":"원가 합계 중 파트너 몫의 상한입니다."}},"required":["client_sector","effective_from","min_margin_rate","max_partner_share"]} 업종마다 반기나 분기 단위로 기준이 바뀐 이력을 두세 줄 씁니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 어느 입찰 착수일과 effective_from 이 같은 날인 행, (2) 목표 이익률이 낮아진 개정, (3) 파트너 비중 상한만 바뀐 개정. 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"client_sector":{"type":"string","enum":["공공","금융","유통","제조","그룹사"]},"effective_from":{"type":"string","description":"이 기준이 적용되기 시작한 날(YYYY-MM-DD)입니다."},"min_margin_rate":{"type":"number","minimum":0,"maximum":1,"description":"목표 이익률입니다. 0.18 은 18% 입니다."},"max_partner_share":{"type":"number","minimum":0,"maximum":1,"description":"원가 합계 중 파트너 몫의 상한입니다."}},"required":["client_sector","effective_from","min_margin_rate","max_partner_share"]}| TypeScript | 배치 규칙, 개월 수 계산, 기준표 유효 행 고르기, 판정 차례를 담은 계산 모듈과 화면 코드의 언어입니다. |
| Next.js | 입찰 판정 묶음과 역할별 배치 표를 보여주는 관리자 페이지와 판정 계산 API 라우트입니다. |
| PostgreSQL | 입찰·인력·파트너·기준표를 담고, 2주차에 배치 변경 로그와 역할별 권한 테이블을 더합니다. |
| Claude Code | 계산 모듈과 화면 초안을 맡기고, 착수일 당일 투입 가능·사내 인력 빈 칸·파트너 0명 입찰 테스트를 통과한 코드만 합칩니다. |
| CLAUDE.md·AGENTS.md·훅 | 판정 규칙의 우선순위와 '금액은 도구가 돌려준 값만 쓴다' 같은 규칙을 CLAUDE.md 에 적고, 커밋 전 훅이 정답 대조 테스트를 돌립니다. |
| LLM API·툴콜링 | 3주차 배치 질문 에이전트가 판정 계산 API 를 도구로 정의해 부르고 그 결과로만 답합니다. |
| Vercel | 1주차에 미리보기 주소를 열어 영업 담당자와 수행팀 PM 이 같은 판정을 봅니다. |
| AWS | 2주차부터 App Runner 와 RDS 에 올려 사내 계정으로 접속하고 CloudWatch 로 계산 API 오류를 봅니다. |
| Figma | 1주차 1일에 판정 묶음과 입찰 펼침 화면의 흐름을 먼저 그려 수행팀 PM 이 볼 숫자를 정합니다. |
✗ fail → 배치가 수행팀 PM 의 판단과 어긋나면 원가 낮은 순이라는 배치 원칙부터 다시 보고, 그동안은 펼침 화면에 후보 인력 전체를 같이 보여줍니다.
✓ pass → 영업 담당자와 수행팀 PM 이 같은 숫자로 맡을지 말지를 정할 수 있으면 1주차로 닫아도 됩니다. 계속한다면 60건 정답 대조와 최소 계약 금액, AWS 배포가 다음 차례입니다.
✗ fail → 어긋난 입찰만 모아 개월 수 계산과 판정 차례를 다시 보고, 에이전트 작업은 미룹니다.
✓ pass → 배치 질문 에이전트와 CLAUDE.md·훅 정리로 3주차를 엽니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · bid_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
그 기간에 맞는 인력도 파트너도 없음인력 없음인건비가 계약 금액을 넘음적자목표 이익률 미달이익률 미달파트너 비중이 기준을 넘음파트너 과다목표 이익률 이상목표 달성검토 중인 입찰 하나가 착수일 기준 인력 배치, 개월 수와 원가 계산, 손익 기준표 유효 행 고르기를 거쳐 어떤 판정을 받는지 남기는 형식입니다. 판정은 규칙이 정하고, 3주차 배치 질문 에이전트는 이 형식을 도구 결과로 받아 인용만 합니다.
{"type":"object","properties":{"bid_id":{"type":"string"},"project_name":{"type":"string"},"verdict":{"type":"string","enum":["목표 이익률 이상","목표 이익률 미달","인건비가 계약 금액을 넘음","그 기간에 맞는 인력도 파트너도 없음","파트너 비중이 기준을 넘음"]},"months":{"type":"integer","minimum":1,"description":"종료월에서 착수월을 뺀 달 수에 1 을 더한 값입니다."},"contract_amount":{"type":"integer","minimum":1},"staffing":{"type":"array","items":{"type":"object","properties":{"line_seq":{"type":"integer"},"person_id":{"type":"string"},"source":{"type":"string","enum":["사내","파트너"]},"monthly":{"type":"integer"}},"required":["line_seq","person_id","source","monthly"]},"description":"역할 줄마다 넣은 사람입니다. 사내 인력을 월 원가 낮은 순으로 먼저 넣고 모자란 자리를 단가 낮은 파트너로 채웁니다."},"short_lines":{"type":"array","items":{"type":"object","properties":{"line_seq":{"type":"integer"},"skill":{"type":"string"},"headcount":{"type":"integer"},"available":{"type":"integer"}},"required":["line_seq","skill","headcount","available"]}},"cost_total":{"type":["integer","null"],"minimum":0,"description":"staffing 의 monthly 합계에 months 를 곱한 값(만원)입니다. 자리를 다 채우지 못하면 null 입니다."},"partner_cost":{"type":["integer","null"],"minimum":0,"description":"source 가 파트너인 monthly 합계에 months 를 곱한 값입니다."},"margin_rate_pct":{"type":["number","null"],"description":"(contract_amount − cost_total) / contract_amount × 100 을 소수 첫째 자리로 반올림한 값입니다."},"partner_share_pct":{"type":["number","null"],"minimum":0,"maximum":100,"description":"partner_cost / cost_total × 100 을 소수 첫째 자리로 반올림한 값입니다."},"policy_effective_from":{"type":"string","description":"margin_policy 에서 같은 client_sector 이고 effective_from 이 착수일 이하인 행 중 가장 늦은 날입니다."},"min_margin_pct":{"type":"number"},"max_partner_share_pct":{"type":"number"},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{}},"required":["field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["bid_id","project_name","verdict","months","contract_amount","staffing","short_lines","policy_effective_from","evidence","summary"]}[
{
"bid_id": "B-1024",
"project_name": "유통 데이터 분석 플랫폼",
"verdict": "그 기간에 맞는 인력도 파트너도 없음",
"months": 4,
"contract_amount": 26000,
"staffing": [
{
"line_seq": 2,
"person_id": "S-105",
"source": "사내",
"monthly": 840
}
],
"short_lines": [
{
"line_seq": 1,
"skill": "Elastic",
"headcount": 2,
"available": 0
}
],
"cost_total": null,
"partner_cost": null,
"margin_rate_pct": null,
"partner_share_pct": null,
"policy_effective_from": "2026-07-01",
"min_margin_pct": 20,
"max_partner_share_pct": 40,
"evidence": [
{
"field": "skill",
"value": "Elastic"
},
{
"field": "headcount",
"value": 2
},
{
"field": "busy_until",
"value": "2027-03-31"
},
{
"field": "available_from",
"value": "2027-01-01"
}
],
"summary": "Elastic 엔지니어 2명이 11월 1일 착수에 필요한데 사내 S-107 은 내년 3월 말까지 다른 프로젝트에 있고 파트너 P-205 는 1월에야 풀립니다.",
"hedge": "원가를 다 채우지 못해 이익률은 계산하지 않았습니다. 착수를 1월로 미뤄도 P-205 한 명뿐이라 Elastic 한 자리는 여전히 빕니다."
},
{
"bid_id": "B-1027",
"project_name": "금융권 사용자 행위 보안 분석",
"verdict": "인건비가 계약 금액을 넘음",
"months": 5,
"contract_amount": 25000,
"staffing": [
{
"line_seq": 1,
"person_id": "P-209",
"source": "파트너",
"monthly": 1200
},
{
"line_seq": 1,
"person_id": "P-206",
"source": "파트너",
"monthly": 1250
},
{
"line_seq": 2,
"person_id": "S-103",
"source": "사내",
"monthly": 820
},
{
"line_seq": 2,
"person_id": "P-202",
"source": "파트너",
"monthly": 1050
},
{
"line_seq": 3,
"person_id": "S-110",
"source": "사내",
"monthly": 950
}
],
"short_lines": [],
"cost_total": 26350,
"partner_cost": 17500,
"margin_rate_pct": -5.4,
"partner_share_pct": 66.4,
"policy_effective_from": "2026-12-01",
"min_margin_pct": 22,
"max_partner_share_pct": 50,
"evidence": [
{
"field": "contract_amount",
"value": 25000
},
{
"field": "monthly_rate",
"agg": "sum",
"value": 3500
},
{
"field": "monthly_cost",
"agg": "sum",
"value": 1770
},
{
"field": "busy_until",
"value": "2026-12-01"
},
{
"field": "effective_from",
"value": "2026-12-01"
}
],
"summary": "보안 분석가 2명을 모두 파트너로 채우면서 5개월 원가가 2억 6,350만 원이 돼 계약 금액 2억 5,000만 원을 넘습니다.",
"hedge": "백엔드 S-104 는 프로젝트가 착수일과 같은 12월 1일에 끝나 넣지 않았습니다. 파트너 비중 66.4% 도 상한 50% 를 넘지만 적자가 먼저입니다."
},
{
"bid_id": "B-1021",
"project_name": "공공기관 RAG 챗봇 구축",
"verdict": "목표 이익률 미달",
"months": 6,
"contract_amount": 32500,
"staffing": [
{
"line_seq": 1,
"person_id": "S-110",
"source": "사내",
"monthly": 950
},
{
"line_seq": 2,
"person_id": "S-101",
"source": "사내",
"monthly": 950
},
{
"line_seq": 2,
"person_id": "P-201",
"source": "파트너",
"monthly": 1300
},
{
"line_seq": 3,
"person_id": "S-103",
"source": "사내",
"monthly": 820
},
{
"line_seq": 4,
"person_id": "S-106",
"source": "사내",
"monthly": 720
}
],
"short_lines": [],
"cost_total": 28440,
"partner_cost": 7800,
"margin_rate_pct": 12.5,
"partner_share_pct": 27.4,
"policy_effective_from": "2026-07-01",
"min_margin_pct": 18,
"max_partner_share_pct": 40,
"evidence": [
{
"field": "contract_amount",
"value": 32500
},
{
"field": "monthly_cost",
"agg": "sum",
"value": 3440
},
{
"field": "monthly_rate",
"value": 1300
},
{
"field": "min_margin_rate",
"value": 0.18
},
{
"field": "staff_id",
"value": "S-110"
},
{
"field": "busy_until",
"value": null
}
],
"summary": "6개월 원가 2억 8,440만 원으로 이익률이 12.5% 라 공공 업종 목표 18% 에 못 미칩니다.",
"hedge": "PM S-110 은 맡은 프로젝트가 없어 종료일이 비어 있으므로 바로 넣었습니다. AI 엔지니어 두 번째 자리는 사내에 비어 있는 사람이 없어 11월 1일부터 투입 가능한 파트너 P-201 로 채웠습니다."
},
{
"bid_id": "B-1033",
"project_name": "제조 설비 문서 검색 챗봇",
"verdict": "파트너 비중이 기준을 넘음",
"months": 4,
"contract_amount": 16500,
"staffing": [
{
"line_seq": 1,
"person_id": "S-101",
"source": "사내",
"monthly": 950
},
{
"line_seq": 1,
"person_id": "P-201",
"source": "파트너",
"monthly": 1300
},
{
"line_seq": 2,
"person_id": "S-105",
"source": "사내",
"monthly": 840
}
],
"short_lines": [],
"cost_total": 12360,
"partner_cost": 5200,
"margin_rate_pct": 25.1,
"partner_share_pct": 42.1,
"policy_effective_from": "2026-07-01",
"min_margin_pct": 20,
"max_partner_share_pct": 35,
"evidence": [
{
"field": "monthly_rate",
"value": 1300
},
{
"field": "monthly_cost",
"agg": "sum",
"value": 1790
},
{
"field": "max_partner_share",
"value": 0.35
},
{
"field": "available_from",
"value": "2026-11-01"
}
],
"summary": "이익률은 25.1% 로 목표를 넘지만 원가 중 파트너 몫이 42.1% 라 제조 업종 상한 35% 를 넘습니다.",
"hedge": "P-201 은 투입 가능일이 착수일과 같은 11월 1일이라 넣었습니다. 사내 S-102 가 2월 말에 풀리므로 착수를 3월로 미루면 파트너 없이 꾸릴 수 있습니다."
},
{
"bid_id": "B-1030",
"project_name": "그룹웨어 AI 연동",
"verdict": "목표 이익률 이상",
"months": 3,
"contract_amount": 7000,
"staffing": [
{
"line_seq": 1,
"person_id": "S-101",
"source": "사내",
"monthly": 950
},
{
"line_seq": 2,
"person_id": "S-103",
"source": "사내",
"monthly": 820
}
],
"short_lines": [],
"cost_total": 5310,
"partner_cost": 0,
"margin_rate_pct": 24.1,
"partner_share_pct": 0,
"policy_effective_from": "2026-07-01",
"min_margin_pct": 15,
"max_partner_share_pct": 30,
"evidence": [
{
"field": "contract_amount",
"value": 7000
},
{
"field": "monthly_cost",
"agg": "sum",
"value": 1770
},
{
"field": "min_margin_rate",
"value": 0.15
}
],
"summary": "사내 인력 두 명으로 3개월 원가가 5,310만 원이고 이익률 24.1% 로 그룹사 목표 15% 를 넘습니다.",
"hedge": "백엔드 S-104 가 원가는 더 낮지만 12월 1일까지 다른 프로젝트에 있어 S-103 을 넣었습니다."
},
{
"bid_id": "B-1036",
"project_name": "유통 상담 요약 PoC",
"verdict": "목표 이익률 이상",
"months": 3,
"contract_amount": 6500,
"staffing": [
{
"line_seq": 1,
"person_id": "S-101",
"source": "사내",
"monthly": 950
},
{
"line_seq": 2,
"person_id": "S-106",
"source": "사내",
"monthly": 720
}
],
"short_lines": [],
"cost_total": 5010,
"partner_cost": 0,
"margin_rate_pct": 22.9,
"partner_share_pct": 0,
"policy_effective_from": "2026-07-01",
"min_margin_pct": 20,
"max_partner_share_pct": 40,
"evidence": [
{
"field": "contract_amount",
"value": 6500
},
{
"field": "monthly_cost",
"agg": "sum",
"value": 1670
},
{
"field": "effective_from",
"value": "2026-07-01"
},
{
"field": "min_margin_rate",
"value": 0.2
}
],
"summary": "3개월 원가 5,010만 원으로 이익률 22.9% 가 나와 유통 업종 목표 20% 를 넘습니다.",
"hedge": "유통 기준이 7월에 25% 에서 20% 로 바뀌었기 때문에 통과합니다. 1월 기준을 잘못 고르면 이익률 미달로 판정됩니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 목표 이익률 이상·목표 이익률 미달·인건비가 계약 금액을 넘음·그 기간에 맞는 인력도 파트너도 없음·파트너 비중이 기준을 넘음 다섯 값 중 하나인지 확인합니다. 2. bid_id·project_name·verdict·months·contract_amount·staffing·short_lines·policy_effective_from·evidence·summary 필드가 빠짐없이 존재하는지 확인합니다. 3. months 와 contract_amount 가 1 이상이고 partner_share_pct 가 0 이상 100 이하인지 확인합니다. 4. cost_total 을 staffing 의 monthly 합계 × months 로, partner_cost 를 파트너 monthly 합계 × months 로, margin_rate_pct 를 (contract_amount − cost_total) / contract_amount × 100 으로, partner_share_pct 를 partner_cost / cost_total × 100 으로 다시 계산합니다. 5. short_lines 가 하나라도 있으면 verdict 는 그 기간에 맞는 인력도 파트너도 없음입니다. 사내 인력은 busy_until 이 비었거나 start_date 보다 앞서야, 파트너는 available_from 이 start_date 이하여야 넣을 수 있는 사람으로 셉니다. 6. short_lines 가 비었고 cost_total 이 contract_amount 를 넘으면 verdict 는 인건비가 계약 금액을 넘음입니다. 7. 앞 조건에 걸리지 않고 margin_rate_pct 가 min_margin_pct 미만이면 verdict 는 목표 이익률 미달입니다. 8. 앞 조건에 걸리지 않고 partner_share_pct 가 max_partner_share_pct 를 넘으면 verdict 는 파트너 비중이 기준을 넘음입니다. 어느 조건에도 걸리지 않으면 verdict 는 목표 이익률 이상입니다. 9. evidence 의 field 이름이 네 데이터셋 중 하나에 있는 컬럼인지 대조합니다. 10. evidence 의 value 가 수록된 행의 원문 값과 같은지 확인합니다. 여러 줄을 더한 수는 agg 를 적습니다. 11. summary 가 존댓말로 끝나는지 확인합니다. [판정 차례 · 위 규칙이 둘 이상 걸릴 때] 입찰 하나에는 판정을 하나만 남깁니다. ① 그 기간에 맞는 인력도 파트너도 없음 → ② 인건비가 계약 금액을 넘음 → ③ 목표 이익률 미달 → ④ 파트너 비중이 기준을 넘음 → ⑤ 목표 이익률 이상. 사람이 모자라면 원가를 셀 수 없으므로 맨 앞에 두고, 돈이 남지 않는 입찰은 파트너 비중보다 먼저 봅니다. [하드 케이스 · 판정이 갈리는 이유] S-110 은 busy_until 이 null 이라 지금 바로 넣을 수 있는 사람으로 셉니다. S-104 는 busy_until 이 B-1027 착수일과 같은 2026-12-01 이라 앞서지 않으므로 빼고, P-201 은 available_from 이 착수일과 같은 2026-11-01 이라 넣습니다. B-1027 의 손익 기준은 effective_from 이 착수일과 같은 금융 2026-12-01 행입니다. B-1036 은 유통 2026-07-01 행(20%)으로 통과하지만 2026-01-01 행(25%)을 고르면 미달이 됩니다. B-1030·B-1036 은 파트너가 없어 partner_share_pct 가 0.0 입니다. 월 원가나 단가가 같은 두 사람이 한 자리를 두고 겹치면 사람 번호가 앞선 쪽을 먼저 넣습니다. 더미에는 그런 짝이 없고, 증강 데이터의 하드 케이스가 만듭니다. [평가 러너 · 2주차] 더미 입찰 60건에 손으로 매긴 정답 판정과 자동 판정을 대조해 판정별 일치율을 내고, 어긋난 입찰은 따로 모아 배치 순서와 판정 차례를 다시 봅니다. [수동 검증 · 사람이 봅니다] 1. 원가 낮은 순으로 넣은 배치가 실제로 그 프로젝트에 맞는 사람인지는 수행팀 PM 이 봅니다. 2. 이익률 미달 입찰을 그 금액으로 맡을지는 영업 담당자와 수행팀이 정합니다.