| name | research-rfp |
| description | 연구과제 공고문·RFP 분석, 지원사업 공고 검색, 요건 정리, 적합도 판단, 과제 아이템 도출, 제안서 뼈대 잡기 요청에 사용합니다. '이 공고 분석해줘', 'RFP 요건 정리해줘', '우리가 지원할 만한 과제 찾아줘', '이 사업 우리랑 맞아?', '과제 아이템 뽑아줘' 같은 요청에 대응합니다. 단, 논문·선행연구 조사는 /lit, 일반 시장 조사는 /research를 사용합니다. |
rfp Workflow
Codex-compatible mirror of rfp.md from the research archetype.
/rfp — 공고 분석과 과제 도출
공고를 요건으로 분해하고, 우리 역량과 대조해 적합도를 판정하고, 통과 가능한 과제 아이템을 역산한다.
사용법
/rfp search {키워드} # 공고 검색 (IRIS·NTIS)
/rfp {공고문 경로} # 받은 공고문 분석
/rfp fit {공고} # 적합도만 판정
/rfp ideate {공고} # 과제 아이템 도출
Step 0: 공고 확보
검색 — 스크립트로
python3 60-scripts/rnd_ancm.py ntis --keyword "{키워드}" --limit 20
python3 60-scripts/rnd_ancm.py iris --keyword "{키워드}" --limit 20
python3 60-scripts/rnd_ancm.py ntis --status upcoming
python3 60-scripts/ancm_state.py new
둘 다 서버 검색이 된다 (2026-08-04 파라미터 확보).
- NTIS —
searchKeyword가 검색 필드다. 폼에 있는 searchWord는 결과를 바꾸지 않으니 쓰지 말 것.
현황: --status open(접수중+접수예정, 기본) / ongoing / upcoming / closed.
upcoming(접수예정)을 빠뜨리지 말 것 — 준비 기간이 필요한 과제는 여기서 잡아야 한다.
- IRIS —
bsnsAncmTap 탭 필터. --tab open이 기본(접수중, 25건 내외). 정렬 파라미터는 존재하지 않는다.
- 반복 실행이면
ancm_state.py new 를 쓴다. 이미 본 공고를 걸러 신규만 돌려준다.
- 원본은
20-raw/rfp/{공고명}/에 저장한다.
공고문 원문 확보 — 스크립트로 (2026-08-03 실측 검증)
NTIS 목록에는 상세 링크가 없다. roRndUid로 상세에 들어가야 붙임을 받을 수 있다.
로그인·캡차 없이 뚫린다(실측).
python3 60-scripts/rnd_ancm.py detail --uid {roRndUid}
python3 60-scripts/rnd_ancm.py detail --uid {uid} --download-dir 20-raw/rfp/{건}
ZIP 붙임은 파일명이 CP949로 깨진다. 이렇게 푼다:
name = info.filename.encode('cp437').decode('cp949')
HWP/HWPX 변환 — md가 아니라 markdown이다(실측 오류):
npx -y kordoc "{파일}.hwp" --format markdown
파일명에 대괄호·공백이 있으면 변환이 조용히 0바이트로 실패한다. 단순 이름으로 복사한 뒤 변환한다.
붙임을 전부 변환한다. 실측 사례에서 결정적 문서가 여기 숨어 있었다 —
「신청용 연구개발계획서」 양식(실제 목차·분량·서식), 「제안요청서」(평가 배점),
「정량적 성과목표 성능지표」(KPI 정답지), TRL/CRL 정의표.
Step 0.5: KB 선조회 ★ — 같은 걸 두 번 조사하지 않는다
요건 분해 전에 70-kb/를 먼저 읽는다. 처음 보는 기관·사업이 아니면 이미 답이 있다.
ls 70-kb/agencies/ 70-kb/programs/ 70-kb/requirements/
python3 60-scripts/ancm_state.py list --verdict skip
| 볼 곳 | 무엇을 얻나 | 없으면 |
|---|
70-kb/agencies/{전문기관}.md | 배점 성향·평가 관행·과거 대응 이력 | Step 2에서 새로 역설계 후 등재 |
70-kb/programs/{사업명}.md | 연차 패턴·예산 규모·과거 선정 과제 | 이번 공고문에서 확보해 등재 |
70-kb/requirements/ | 반복 출현 요건(자격·서류·비목) | Step 1 결과에서 공통 패턴을 등재 |
70-kb/our-assets*/ | 적합도 '보유' 판정의 증빙 | 증빙 없으면 '보유'로 쓸 수 없다 |
70-kb/outcomes/ | 같은 사업 지원 이력과 결과 | — |
KB에 있으면 Step 1·2가 짧아지고, 없으면 이번에 만든 걸 KB에 남긴다.
이 왕복이 없으면 매번 처음부터 조사한다.
Step 1: 요건 분해 — 표로 만든다
공고문을 읽고 30-analysis/rfp/{공고명}-requirements.md에 표로 옮긴다. 산문으로 요약하지 않는다 — 요건은 누락이 곧 탈락이다.
| 구분 | 항목 | 원문 표현 | 유형 | 우리 상태 |
|---|
| 자격 | 신청 주체 | "중소기업 또는 대학·출연연" | 필수 | ? |
| 자격 | 수행 실적 | "최근 3년 이내 유사 실적" | 필수 | ? |
| 기술 | 개발 목표 | (원문 그대로) | 필수 | ? |
| 기술 | 정량 지표 | "정확도 90% 이상" | 필수·정량 | ? |
| 형식 | 제출 서류 | 목록 전부 | 필수 | ? |
| 우대 | 가점 요건 | "지역기업 가점 5점" | 우대 | ? |
| 제약 | 예산·기간 | "연 3억, 3년" | 제약 | — |
| 제약 | 지분·매칭 | "민간 부담 25%" | 제약 | — |
원칙:
- 원문 표현을 그대로 옮긴다. 의역하면 요건이 바뀐다.
- 필수와 우대를 절대 섞지 않는다.
- 정량 지표는 숫자와 측정 방법을 같이 적는다. 측정 방법이 없으면 그것 자체가 리스크다.
- 애매한 문구는 "해석 필요"로 표시하고 담당 기관에 물을 질문 목록으로 뺀다.
Step 2: 평가표 역설계 ★
평가 배점표가 있으면 그것이 진짜 요구사항이다.
⚠️ 배점표 위치는 공고마다 다르다 (2026-08-03 실측).
- 붙임에 있는 경우 — 에너지수요관리 건: 「제안요청서」 5.2절
- 공고문 본문에 있는 경우 — 원자력정책연구 건: 공고문 "4. 평가 기준"에 표로
두 곳을 다 확인한다. 한쪽만 보고 "배점표 없음"으로 판정하지 않는다.
- 배점 항목별로 몇 점짜리인지와 무엇을 보면 점수를 주는지를 적는다.
- 배점이 큰 항목이 제안서의 분량 배분이 된다. 5점짜리에 3쪽 쓰고 30점짜리에 반쪽 쓰는 실수를 막는다.
- 정성 항목("추진 체계의 적절성")은 평가위원이 무엇을 근거로 판단할지를 추정해 적는다.
Step 3: 적합도 판정 — 정직하게
frameworks/rfp-fit-matrix.md를 호출한다. 판정은 3단이다.
| 판정 | 조건 | 처리 |
|---|
| 적합 | 필수 요건 전부 충족 + 정량 지표 달성 근거 있음 | 진행 |
| 조건부 | 필수 중 1~2개가 컨소시엄·외주로 메워짐 | 메울 방법과 비용을 명시하고 진행 |
| 부적합 | 필수 요건 미충족이 구조적 | 포기를 권고한다 |
- "할 수 있을 것 같다"와 "한 적이 있다"를 구분한다. 실적 요건은 후자만 인정된다.
- 미충족을 "노력하겠다"로 덮지 않는다. 덮으면 그 제안서는 떨어지고 시간만 쓴다.
- 판정 근거를
30-analysis/rfp/{공고명}-fit.md에 남긴다. 다음에 비슷한 공고가 왔을 때 재사용한다.
Step 3.5: KB 되먹임 ★ (판정 직후 — 미루지 않는다)
판정하면서 알게 된 것을 그 자리에서 KB에 넣는다. 나중에 하면 안 한다.
python3 60-scripts/ancm_state.py mark {uid} --verdict {pursue|watch|skip} --note "{사유}"
| 알게 된 것 | 어디에 |
|---|
| 이 전문기관의 배점 구조·심사 관행 | 70-kb/agencies/{기관}.md |
| 이 사업의 규모·주기·주관기관 유형 제한 | 70-kb/programs/{사업}.md |
| 다른 공고에도 나올 요건(서류·비목·자격) | 70-kb/requirements/ |
| 포기 사유 | ancm_state.py mark --verdict skip --note (사유 필수) |
skip의 사유가 KB에서 가장 값어치 있다. "왜 안 했나"가 다음 판정을 빠르게 만든다.
상세 등재 규약은 /kb 참조.
Step 4: 과제 아이템 도출 — 요건에서 역산한다
하고 싶은 걸 공고에 끼워 맞추지 않는다. 공고가 요구하는 결과에서 거꾸로 설계한다.
각 아이템마다:
- 무엇을 만드는가 — 산출물을 명사로. "AI 활용"이 아니라 "○○ 자동 분류 파이프라인과 검증 리포트"
- 어느 요건을 충족하는가 — Step 1 표의 행 번호로 연결. 연결 안 되는 아이템은 뺀다
- 정량 지표를 어떻게 달성·측정하는가 — 측정 방법이 없으면 그 아이템은 미완성이다
- 누가 하는가 — 우리 / 컨소시엄 / 외주. 역량 공백이 드러나는 지점
- 실패 위험 — 무엇이 어긋나면 목표 미달인가
그리고 차별화 한 줄: 같은 공고에 지원할 다른 팀도 쓸 법한 내용이면 차별화가 아니다.
Step 5: 제안서 뼈대
40-reports/rfp/{공고명}-proposal-outline.md
- 평가표 배점 순서로 목차를 만든다 (공고 본문 순서가 아니라).
- 각 절에 어느 요건·배점 항목에 답하는지를 주석으로 단다.
- 정량 지표는 표로 넣는다. 산문에 묻으면 평가위원이 못 찾는다.
- 마감·제출 형식·분량 제한을 문서 상단에 못박는다.
산출물
20-raw/rfp/{공고명}/ 원문·붙임 전부(HWP 변환본 포함)
30-analysis/rfp/{공고명}-requirements.md 요건 표
30-analysis/rfp/{공고명}-scoring.md 평가표 역설계
30-analysis/rfp/{공고명}-fit.md 적합도 판정과 근거
40-reports/rfp/{공고명}-proposal-outline.md 제안서 뼈대
70-obligations 대체: 마감은 요건 표 상단에 명시
품질 게이트
참조
- 적합도 매트릭스:
frameworks/rfp-fit-matrix.md
- 공고 수집:
60-scripts/rnd_ancm.py (--selftest로 파서 검증 후 사용)
- 산출물 규칙:
frameworks/output-correctness.md
- 위임: 요건 대조·누락 검출은
contradiction-finder, 판정 충돌은 methodology-oracle