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 # 국가R&D통합공고
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 대체: 마감은 요건 표 상단에 명시
품질 게이트
- 붙임 문서를 전부 변환해 읽었다 (평가표 포함)
- 요건을 원문 표현 그대로 표로 옮겼다
- 필수와 우대가 섞이지 않았다
- 정량 지표마다 측정 방법이 적혀 있다
- 적합도 판정에 "노력하겠다"로 덮은 필수 요건이 없다
- 과제 아이템이 전부 요건 행에 연결됐다
- 제안서 목차가 평가 배점 순서다
- 해석이 필요한 문구를 담당 기관 질문 목록으로 뺐다
- KB를 먼저 조회했다 (Step 0.5) — 있는 걸 다시 조사하지 않았다
- 판정 결과를 KB에 되먹였다 (Step 3.5) —
ancm_state.py mark실행 + 새로 안 것 등재
참조
- 적합도 매트릭스:
frameworks/rfp-fit-matrix.md - 공고 수집:
60-scripts/rnd_ancm.py(--selftest로 파서 검증 후 사용) - 산출물 규칙:
frameworks/output-correctness.md - 위임: 요건 대조·누락 검출은
contradiction-finder, 판정 충돌은methodology-oracle