# current_status.md - 세션 메모리

> 새 세션 시작 시 이 파일을 가장 먼저 읽고, 마지막 세션이 어디서 끝났는지 확인한다.
> 작업 종료 시 반드시 이 파일을 업데이트한다.

---

## 📌 프로젝트 한 줄 요약

나라장터 입찰공고를 자동 수집·큐레이션해 매주 월요일 17시 KST에 Gmail로 발송하는 봇. Node.js + GitHub Actions + Claude Haiku.

---

## 🗓 최근 업데이트

**2026-05-17 (1차 세션)**

### [완료된 작업]
- ✅ PRD.md v0.2 확정
  - 강사 프로필: "17년 이상의 디자인씽킹 교육 훈련 전문가, 리빙랩 전문가, 퍼실리테이터, AI 교육 전문가"
  - 발송 주기: 매주 월요일 17시 KST 1회
  - AI 책임 범위: 키워드 매칭은 코드, 의미 판단만 AI
  - 0건 케이스에 "아까운 공고 미리보기" 최대 3건 포함
  - 신규 배지 윈도우 7일로 확장
- ✅ CLAUDE.md v0.1 작성 (작업 규칙·코딩 컨벤션·세션 운영 규칙)
- ✅ README.md v0.1 작성 (사용자 가이드)
- ✅ current_status.md v0.1 작성 (이 파일)

### [진행 중 작업]
- (없음)

### [다음 단계]
1. ⏭ `package.json` 초기화
   - `npm init -y`
   - `"type": "module"` 추가
   - 의존성 설치: `@anthropic-ai/sdk`, `nodemailer`, `dotenv`, `axios`
2. ⏭ `.env.example` 파일 작성 (PRD 섹션 8 기준)
3. ⏭ `.gitignore` 작성 (CLAUDE.md 섹션 7.3 기준)
4. ⏭ `src/fetcher.js` 구현 시작
   - 공공데이터 API 호출 + 페이징
   - 응답 9개 필드만 추출
   - 3회 재시도 로직
   - `npm run test:fetch`로 단독 검증 가능하게
5. ⏭ `src/filter.js` 구현
6. ⏭ `src/evaluator.js` 구현
7. ⏭ `src/mailer.js` 구현
8. ⏭ `src/index.js` (진입점) 작성
9. ⏭ `.github/workflows/weekly.yml` 작성
10. ⏭ 첫 수동 실행 테스트

### [미결정 이슈]
- 🤔 공공데이터 API 응답에서 `presmptPrce` 단위가 원인지 천원인지 실제 응답으로 검증 필요
  - → `src/fetcher.js` 구현 시 첫 1건 응답 raw 출력해서 확인
- 🤔 `bidNtceDtlUrl`이 응답에 항상 포함되는지 확인 필요
  - → 없으면 `bidNtceNo`로 URL 생성 규칙 만들어야 함
- 🤔 페이징 시 한 번에 가져올 `numOfRows` 적정값
  - → 일단 100으로 시작. 응답 시간 보고 조정

---

## 📂 파일 상태

| 파일 | 상태 | 버전 | 비고 |
|------|------|------|------|
| PRD.md | ✅ 완료 | v0.2 | 요구사항 확정 |
| CLAUDE.md | ✅ 완료 | v0.1 | 작업 규칙 정의 |
| README.md | ✅ 완료 | v0.1 | 사용자 가이드 |
| current_status.md | ✅ 완료 | v0.1 | 이 파일 |
| .env.example | ⏳ 대기 | - | 다음 세션 |
| .gitignore | ⏳ 대기 | - | 다음 세션 |
| package.json | ⏳ 대기 | - | 다음 세션 |
| src/fetcher.js | ⏳ 대기 | - | 다음 세션 |
| src/filter.js | ⏳ 대기 | - | |
| src/evaluator.js | ⏳ 대기 | - | |
| src/mailer.js | ⏳ 대기 | - | |
| src/utils.js | ⏳ 대기 | - | |
| src/index.js | ⏳ 대기 | - | |
| .github/workflows/weekly.yml | ⏳ 대기 | - | |

---

## 🔑 주요 결정 사항 (영구 기록)

세션이 바뀌어도 잊지 말아야 할 결정들:

1. **AI는 의미 판단만 한다**
   - 키워드 매칭, 예산 필터, 마감일 계산은 모두 코드에서 끝낸다
   - AI에는 "강사 프로필 대비 적합도"만 묻는다
   - 이유: 비용 절감 + 정확도 향상

2. **예산 미달 공고도 버리지 않는다**
   - 2천만원 미만 + 키워드 매칭 = "참고용" 섹션으로 분리 노출
   - AI 평가에서는 제외 (호출 비용 절감)
   - 이유: 쪼개기 발주·후속 발주 신호 포착

3. **0건일 때도 메일을 보낸다 (봇 침묵 방지)**
   - 전체 수집 / 단계별 필터 / 키워드별 히트 통계 포함
   - 아까운 공고 미리보기 최대 3건 (탈락 사유 자동 표시)
   - 이유: 강사가 "왜 0건인지" 납득할 수 있어야 봇을 신뢰

4. **수집은 월요일 1회만**
   - 매일 수집해서 누적하는 방식 안 씀 (저장소 없음)
   - 마감 D-14 윈도우라 주 1회로도 누락 없음

5. **다른 강사 이식성 우선**
   - 모든 개인 설정은 `.env` (또는 GitHub Secrets)로
   - Teddy 전용 분기 로직 절대 금지

---

## 🚨 주의 사항

- `.env`는 절대 커밋 금지 (`.gitignore`에 포함)
- Gmail 앱 비밀번호 공백 제거 후 입력
- 공공데이터 API 키는 **디코딩 키** 사용 (인코딩 키 X)
- Claude 모델은 `claude-haiku-4-5` (환경변수 `CLAUDE_MODEL`로 변경 가능)

---

## 📊 다음 세션 시작 시 체크리스트

새 세션을 시작하면 다음을 순서대로:

1. 이 파일(`current_status.md`) 읽기
2. `CLAUDE.md` 작업 규칙 확인
3. "[다음 단계]"의 1번 항목부터 시작
4. 모르겠으면 PRD.md 해당 섹션 참조

---

## 변경 이력

| 버전 | 일자 | 변경 |
|------|------|------|
| v0.1 | 2026-05-17 | 초안. PRD/CLAUDE/README 완료 시점 스냅샷 |
