Day 22~28: G2 통과 + Phase 1.0 절반 회고
통합 테스트 · 통계 조작 시뮬 · ★ G2 PASSED · 4주 회고 — 권2 마무리
📑 이 챕터에서 다룰 내용
권2 제4장에서 ★ R4 자동 회복 사이클이 완성됐고 누적 65h. 이번 챕터는 권2 마지막 + Phase 1.0 절반 회고입니다. G2 (Day 28) 통과 의식 + 4주 회고를 함께 살펴보겠습니다.
| 📚 사전 지식 체크 | 🎯 이 장의 목적 | ✅ 완료 후 결과물 |
|---|---|---|
| Day 1~21 / G1 통과 + R4 회복 사이클 / 4주차 페이스 25% 축소 (3h/일 적용) | Day 22~27 통합 테스트 + 검증 + Day 28 ★ G2 통과 의식 + 4주 회고 (5확장 5/5 운영 사이클 입증 정리) | G2 PASSED + git tag v0.1-G2-passed + Phase 1.0 절반 완성 + 권3 진입 준비 |
Day 22 — Agent Teams 위임 (3h)
권2 제0장에서 "Day 5+ Agent Teams"가 권장됐고, Day 22가 통합 테스트 분배의 자리입니다.
[Claude Code, Sonnet + medium]
"통합 테스트 두 영역 동시 (Agent Teams):
/delegate
에이전트 A (담당: tests/integration/business-tab.test.ts):
- 소상공인 탭 통합 테스트 (필터·목록·상세·기여)
- 닉네임 패턴 검증 (E5 [3] — *수원시 카페 운영하는 든든한 줍줍이*)
- LLM 분류 결과 노출 (auto_active만)
- jupjups INSERT → benefits 통계 자동 갱신 검증
에이전트 B (담당: tests/integration/individual-tab.test.ts):
- 개인 복지 탭 통합 테스트 (필터·목록·상세·기여)
- 닉네임 패턴 검증 (시민 톤 — *강남구 취준하는 열정 줍줍이*)
- target_age·target_household 필터 매칭
- jupjups INSERT → 트리거 작동
CLAUDE.md §5 Two-Tab Content SSOT 7 규칙 준수 필수.
완료 후 자동 일관성 테스트 (E5 [6]) 실행."결과 — 8h → 4h (병렬화 효과)
| 작업 | 순차 예상 | Agent Teams 실제 |
|---|---|---|
| 소상공인 탭 통합 테스트 | 4h | 3h (병렬) |
| 개인 복지 탭 통합 테스트 | 4h | (동시) |
| 통합 + 일관성 테스트 | 1h | 0.5h |
| 합계 | 9h | 3.5h (-61%) |
[BUILD.md Day 22 entry]
## Phase 1.0 Day 22
[계획]
- Agent Teams 위임 — 통합 테스트 두 영역 동시
[실행]
- /delegate (에이전트 A·B 병렬)
- tests/integration/business-tab.test.ts (180줄, 18 케이스)
- tests/integration/individual-tab.test.ts (170줄, 16 케이스)
- 일관성 테스트 5/5 통과 (E5 [6])
[LogOnTable 트레이스 — Agent Teams 비용 vs 시간 절감]
> 결정: Agent Teams 위임 채택 (-3.5h 절감)
> 근거: 1탄 v2 새 23장 23-4 절 Day 22 사례 일치. CLAUDE.md §6
File Structure 폴더 분리가 분배 기준 자연 작동.
> 대안: 순차 9h — E2 페이스 축소 (3h/일) 위반 위험
> 부작용: 토큰 비용 약 2배 ($0.5 → $1) 증가. 시간 절감 가치 > 비용
(1인 운영자 시간 = 가장 큰 비용)
[누적] 65h + Day 22 (3h) = 68h
[E2] 4주 누적 평균: (35+14+14+3)/4 = 16.5h/주 (안전)Day 23 — 통합 테스트 결과 검토 (3h)
[Claude Code] "Day 22 통합 테스트 결과 분석: - 통과: 32/34 케이스 - 실패: 2건 (자세한 원인 + 수정 방안) - E5 일관성 테스트: 5/5 통과 "
실패 2건 원인 + 수정
[실패 1 — 소상공인 탭 필터 'IT' 카테고리 매칭 X]
원인: SPEC v4 §3-2 LLM 분류에서 '전체 | null'만 정의, 'IT' 키워드 매칭 패턴 불완전.
수정: lib/parser/prompts.ts SYSTEM_PROMPT_BUSINESS의 target_business_type enum에 'IT'·'창업·기술' 같은 매칭 키워드 추가 (5분).
[실패 2 — 개인 복지 탭 target_age_max null 처리]
원인: target_age_max null 시 모든 연령에 매칭돼야 하지만 WHERE target_age_max >= NEW.user_age가 null 처리 X.
수정: SQL 조건에 OR target_age_max IS NULL 추가 (10분).
[BUILD.md Day 23 entry]
## Phase 1.0 Day 23
[계획]
- 통합 테스트 실패 2건 분석 + 수정 + 재실행
[실행]
- 실패 2건 수정 (15분 합계)
- 재실행: 34/34 통과 (E5 [6] 5/5 통과 유지)
- src/db/queries.ts 의 null 처리 보강 (3건)
[LogOnTable 트레이스 — null 처리 패턴]
> 결정: 모든 target_* 필터 SQL에 *OR ... IS NULL* 명시
> 근거: SPEC v4 §3-2 *"추정 X, 누락 null"* (E5 [7]) 의 일관 적용
— DB 쿼리 단계까지 적용
> 대안: target_* null = 'ALL' 가상값 — 코드 분기 ↑
> 부작용: 모든 필터 쿼리에 OR null 추가 → 인덱스 최적화 영향
(복합 인덱스 0003_indexes.sql는 현재 IS NULL 미고려)
→ Day 25 재검토
[누적] 68h + Day 23 (3h) = 71h작업 (3h)
[Claude Code] "통계 조작 시도 시뮬: 1. 한 사용자가 같은 benefit_id를 두 번 INSERT 시도 → UNIQUE 위반 확인 + 깔끔한 에러 메시지 2. 한 IP 1시간 내 6번 INSERT 시도 → 6번째에 Redis rate limit 발동 + 사용자에게 *'잠시 후 재시도'* 노출 3. 다른 카카오 ID 5개로 같은 IP에서 같은 benefit 줍줍 → IP rate limit 발동 (R6 보호) 4. 기록: tests/security/manipulation-sim.test.ts"
결과 — 모든 시나리오 차단
[시나리오 1 — UNIQUE 위반]
✅ 두 번째 INSERT → DB error: 'duplicate key violates jupjups_user_id_benefit_id_key'
✅ Frontend 에러 처리: '이미 줍줍한 지원금입니다.'
[시나리오 2 — IP rate limit (단일 사용자)]
INSERT 1~5: ✅ 통과
INSERT 6: ❌ Redis check 차단 → '잠시 후 재시도' 노출
60분 후: ✅ rate limit 해제 (TTL 자동)
[시나리오 3 — IP rate limit (다중 카카오 ID)]
사용자 1·2·3·4·5번째 INSERT: 통과 (각자 다른 user_id)
6번째 INSERT (5명 중 누구든): ❌ IP 차단 → 통계 조작 원천 차단
→ R6 (통계 조작 시도) 완벽 보호
[BUILD.md Day 24 entry]
## Phase 1.0 Day 24
[계획]
- 통계 조작 시도 시뮬 + UNIQUE/IP rate limit 검증
[실행]
- tests/security/manipulation-sim.test.ts (120줄, 15 시나리오)
- 모든 시나리오 차단 ✅
- DB UNIQUE (1차) + Redis IP (2차) 결합 입증
[LogOnTable 트레이스 — 1차 + 2차 결합의 본질]
> 결정: UNIQUE (DB) + Redis IP (Edge Function) 결합 — 단일 X
> 근거: SPEC v4 §3 + 1탄 v2 새 9장 9-5 절 + 권1 제3장 ⚖️ E1 일관
*"무엇을 약속하지 않는가"* = "통계 조작 가능성 X" 의 코드 보장
> 대안 1: UNIQUE만 — 다중 카카오 ID 우회 가능 (시나리오 3 차단 X)
> 대안 2: IP rate만 — 한 사용자 두 번 줍줍 가능 (시나리오 1 차단 X)
> 부작용: 두 시스템 의존성 — Redis 장애 시 fallback 명시 필요
(현재: 'IP rate 통과 허용', 안전 측면)
[E1 회색지대 결정 ① 일관 검증]
"신청 결과를 보장하지 않는다" 의 신뢰 = 통계 신뢰 = 조작 차단.
이번 시뮬이 그 신뢰를 *"가설"* 에서 *"코드 보장"* 으로 전환.
[누적] 71h + Day 24 (3h) = 74hG2 통과 조건 (PLAN v2.2 복기)
G2 — Day 28: DB·인증·pg_cron 완성
[기능 통과 조건]
- [ ] users / benefits / jupjups / reports 4 테이블 ✅ Day 8
- [ ] 트리거 3개 (jupjups 집계 / IP rate / is_active) ✅ Day 9
- [ ] 카카오 로그인 + access·refresh 자동 갱신 ✅ Day 15
- [ ] 닉네임 자동 부여 (형용사 풀 21+ + fallback) ✅ Day 16
- [ ] pg_cron 매일 03:00 정상 (4 API 호출) ✅ Day 11
- [ ] 어드민 검수 큐 + SLA 7일 알림 ✅ Day 12·13
- [ ] LLM JSON fallback 작동 (G-1) ✅ Day 2·4
- [ ] 복합 인덱스 (P1) ✅ Day 10
- [ ] is_active 트리거 SQL (G-3) ✅ Day 9·11
- [ ] IP rate limit Redis (G-6) ✅ Day 8·24
[★ 페이스 점검 (E2)]
- [ ] 누적 시간 60h+/4주 → 4주 평균 점검 (4주 평균 16.5h/주, 60h 트리거 안전)
- [ ] 토요일 X (Day 5·12·19·26 모두 점검 필요)
- [ ] 매주 일요일 30분 회고 (4주 모두 작성)
[★ 통과 의식 (E2)]
- [ ] git tag v0.1-G2-passed
- [ ] Day 29 1일 휴식
- [ ] 4주 회고 BUILD.md 2KB+
Day 25 자기 점검 결과
[Claude Code] "PLAN.md G2 통과 조건 10개 + 페이스 점검 3개를 모두 점검."
[기능 통과 조건]
✅ 10/10 모두 PASS
[★ 페이스 점검]
✅ 4주 평균 16.5h/주 (안전 영역)
✅ 토요일 X: Day 5·12·19·26 모두 작업 X (확인 필요 — Day 26)
✅ 주간 회고 4주 모두 작성: Day 7·14·21·28 (Day 28 작성 예정)
[종합 판정]
G2 통과 조건 10/10 PASS + 페이스 3/3 PASS = G2 ✅ READY
[BUILD.md Day 25 entry]
## Phase 1.0 Day 25
[계획]
- G2 통과 조건 점검 + ★ 페이스 점검 + Day 26·27 준비
[실행]
- 기능 10/10 PASS
- 페이스 3/3 PASS (4주 평균 안전 영역)
- Day 26 토요일 작업 X 의식 명시
- Day 28 G2 의식 준비
[LogOnTable 트레이스 — G2 통과 조건 모두 즉시 PASS의 본질]
> 결정: G2 통과 조건 10개 모두 즉시 PASS (W-C 0건)
> 근거: SPEC v4 + PLAN v2.2 + 권1 75분 패치 + 권2 매일 LogOnTable
의 누적 효과. *"REVIEW 75분 vs BUILD 50h"* 가 데이터 입증
— REVIEW에서 W-C 3건이 BUILD 진행 중 자연 PASS 전환.
> 대안: G1·G2가 W-C 다수 발생 — 보강 작업 부담 (실제 발생 X)
> 부작용: 다음 게이트 (G3 Day 42) 도 비슷한 즉시 PASS 패턴 가능.
그러나 자만 X — G3는 두 탭 UI 자리 (다른 영역).
[누적] 74h + Day 25 (3h) = 77hDay 26 = 토요일 — 작업 X 의식
- 작업 X (E2 의식)
- 단, 자동 cron 결과 점검만 5분 (수동 작업 X)
[자동 cron 작동 확인]
- 매일 03:00 fetch-public-data: 7일 연속 정상 (Day 19~25)
- 매일 04:00 deactivate_expired_benefits: 정상 (G-3)
- 매일 09:00 admin-sla-check: 정상
[BUILD.md Day 26 entry]
## Phase 1.0 Day 26 — ★ 토요일 작업 X ★
[E2 의식]
- 토요일 작업 X (Day 5·12·19·26 모두 일관)
- 자동 cron 결과만 점검 (5분 수동 작업)
[자동 cron 7일 연속 작동 검증]
✅ daily-fetch-public-data: 매일 03:00 정상 (7일)
✅ daily-deactivate-expired: G-3 트리거 (deadline < NOW() benefits 7건 자동 비활성)
✅ admin-sla-check: SLA 위반 신고 0건 (안정)
[LogOnTable 트레이스 — G-3 운영 검증]
> 결정: G-3 (is_active 트리거) 7일 연속 정상 = 운영 입증
> 근거: 권1 제4장 G-3 발견 → SPEC v4 §3 의도 → PLAN G2 명시 →
Day 9 함수 + Day 11 cron → Day 19~25 7일 운영 → 작동.
*"가설 → SPEC 명세 → 코드 → 운영"* 4단계 사이클 완성.
> 대안: cron 실패 시 fallback — 현재 Sentry 미연결 (Day 56 통합 예정)
> 부작용: deadline 경과 benefits 7건 자동 비활성 = 사용자에게
*"이미 마감된 지원금"* 더 이상 노출 X (정확성 보장)
[누적] 77h (Day 26 변동 없음 — 작업 X)
[다음] Day 27 G2 점검 마무리작업 (3h)
[Claude Code] "G2 최종 점검 — 모든 항목 PASS 확인 + Day 28 의식 준비. 체크: 1. 통합 테스트 34/34 통과 (Day 23 재실행) 2. 통계 조작 시뮬 모두 차단 (Day 24) 3. G2 통과 조건 10/10 (Day 25) 4. 자동 cron 7일 연속 (Day 26) 5. 페이스 점검 3/3 (Day 25) 마지막 검토: REVIEW.md 본문에 G2 통과 1줄 추가"
[BUILD.md Day 27 entry]
## Phase 1.0 Day 27
[계획]
- G2 최종 점검 + REVIEW.md 본문 갱신 + Day 28 의식 준비
[실행]
- G2 모든 항목 PASS 재확인
- REVIEW.md 본문에 G2 통과 entry 추가
- 4주 회고 초안 작성 (Day 28 마무리)
- git status 정리 (모든 변경 commit)
[LogOnTable 트레이스 — REVIEW.md 운영 갱신]
> 결정: REVIEW.md를 *"한 번 만든 후 잠금"* X — 게이트 통과마다 갱신
> 근거: 1탄 v2 새 8장 8-1 절 *"REVIEW.md = 살아있는 문서"* 정신
일치. G1 통과 (Day 7) + G2 통과 (Day 28) 매번 본문 갱신 의무.
> 대안: REVIEW.md 한 번 만들고 BUILD.md만 갱신 — 6개월 후 검증
흐름 추적 어려움
> 부작용: REVIEW.md 분량 증가 (5KB → 7KB 추정 권3 끝)
[누적] 77h + Day 27 (3h) = 80hG2 통과 의식
# G2 통과 의식 — 1탄 v2 새 6장 6-3 (b) 절 적용 # 1. git tag git tag v0.1-G2-passed git push origin v0.1-G2-passed # 2. 4주 회고 작성 (BUILD.md 2KB+) # 3. Day 29 1일 휴식 의무
4주 회고 — Phase 1.0 절반 (BUILD.md 2.2KB)
- [기능 통과 조건] 10/10 PASS ✅
- [페이스 점검] 3/3 PASS ✅
- [git tag] v0.1-G2-passed ✅
산출물 — 25개 파일 + 4 SQL migration
| 구간 | 주요 산출물 |
|---|---|
| Day 1~7 (G1) | lib/api/test-fetch.ts · tests/api-samples/ · lib/parser/prompts.ts · lib/parser/classify.ts · lib/admin/review-queue.ts |
| Day 8~14 (DB) | 0001_init.sql · 0002_triggers.sql · 0003_indexes.sql · 0004_pg_cron.sql · redis-rate-limit.ts · fetch-public-data/ · admin-sla-check/ · admin/queue/page.tsx |
| Day 15~21 (인증·E5 [3]) | kakao.ts · AuthGuard.tsx · kakao-callback/ · nickname-generator.ts · fcm.ts · profile/edit.tsx · admin/reports/page.tsx |
| Day 22~28 (검증·G2) | tests/integration/business-tab.test.ts · individual-tab.test.ts · tests/security/manipulation-sim.test.ts |
총 25개 파일 + 4 SQL migration. ★ PLAN.md 추정 25개 파일 정확 일치.
5확장 5/5 운영 사이클 완성
| 확장 | Phase 1.0 절반 사이클 |
|---|---|
| E1 회색지대 | API 키·시크릿 5종 분리 (.env.local·EAS·Supabase·Upstash·Slack) |
| E2 1인 페이스 | ★ R4 자동 회복 사이클 1회 (Day 17 트리거 → Day 18 휴식 → 회복) |
| E3 두 검토자 | G-1·G-3·G-4·G-5·G-6 모두 입증 (5/6, G-7만 Phase 1.1) |
| E4 LogOnTable | 39 트레이스 (Day -1~28) |
| E5 콘텐츠 SSOT | 7 규칙 모두 코드 작동 ([1] [3] [4] [6] [7]) |
1탄 v2 메타 원칙 — 4주 데이터 입증 정리
권1 제0~7장 (Phase 0) + 권2 (BUILD)가 1탄 v2 새 4장 4-1의 7단계와 정확 일치합니다.
권1 제4장 12건 발견 모두 입증 (9 즉시 SPEC v4 + 3 PLAN으로 미룸 → 모두 코드 작동).
REVIEW.md (권1 제7장) W-C 3건 패치 후 G2 (Day 28) 시점 모두 PASS 자연 전환. "REVIEW 75분 vs BUILD 50h"가 데이터 입증 (배리 봄 1976).
1탄 v2 부록 H-2 본문이 "가설"이 아니라 운영 데이터 (Day 17 트리거 → Day 18 휴식 → 4주 평균 회복).
1탄 v2 새 23장 23-5 절 사례 일치. CLAUDE.md §6 폴더 분리가 분배 기준 자연 작동 (-61% 시간).
Haiku (분류 매일 $0.05) + Sonnet (BUILD 일반) + Opus (SPEC·PLAN·REVIEW) = 1탄 v2 새 28장 비교 우위 사례 일치. 4주 누적 토큰 비용 $25 추정 (Opus 단일 사용 대비 -60%).
benefits 보유량 (Day 28 시점)
- auto_active 18건 (Day 4 + Day 12 검수 후)
- pg_cron 자동 추가: 7일 × 평균 4건/일 = 28건
- Day 28 시점 합계: 46건 (사용자 노출 가능)
[admin 큐]
- 처리 완료 7건 (검수 + 승인/반려)
- 미처리 3건 (SLA 7일 내 정상)
다음 4주 목표
- Day 29: 휴식 의무 ✅
- Day 30~42 (G3 Day 42): 두 탭 UI + 단계적 기여 — 사용자 1명 줍줍 완료 시뮬
- Day 43~56 (G4 Day 56): 통계 시각화 + FCM 알림 + 공유 카드 + Sentry
- Day 57~63: 약관·개인정보 + 어드민 마무리 + QA
- Day 64~73 (G5 Day 73, FINAL): 앱스토어 심사 + 1순위 커뮤니티
목표 누적 시간: Day 73 끝 약 200h (60h/4주 트리거 안전)
4주 누적 시간 + 4주 평균
| 구간 | 시간 |
|---|---|
| [권1 (Phase 0)] | 21h |
| [권2 1주차 (G1)] | 14h |
| [권2 2주차] | 14h |
| [권2 3주차 (페이스 축소 + R4 회복)] | 14h |
| [권2 4주차 (페이스 축소)] | 21h |
| [권1+권2 누적] | 84h ★ |
4주 평균 (Phase 1.0만): (14+14+14+21)/4 = 15.75h/주 = R4 60h 트리거 안전.
git add BUILD.md REVIEW.md git commit -m "Phase 1.0 Day 28: ★ G2 PASSED + Phase 1.0 절반 회고 + 5확장 운영 사이클 완성 입증" git push origin v0.1-G2-passed
| 구간 | 시간 | 주요 성과 |
|---|---|---|
| [권1 (Phase 0)] | 21h | 5파일+ 체계 + 5확장 5개 등장 |
| [권2 (Phase 1.0 절반, Day 1~28)] | 63h | 5확장 5/5 운영 사이클 완성 |
| [권1+권2 누적] | 84h | — |
- E1: SPEC § → CLAUDE.md §3 → 매일 점검 → 시크릿 5종 분리
- E2: PLAN R4 → 매일 추적 → ★ 자동 회복 사이클 1회 작동
- E3: SPEC v3·v4 검토 → 12건 발견 → 9건 즉시 + 3건 PLAN → 입증
- E4: BUILD.md → 39 LogOnTable 트레이스 (Day -1~28)
- E5: CLAUDE.md §5 → 7 규칙 코드 작동 ([1][3][4][6][7] + [2][5] 권3)
권2 끝 시점에 39 LogOnTable + 25 코드 파일 + 4 SQL migration. 동업자가 펼치면 "왜 그 결정인가"의 답이 매 자리에 박혀 있습니다.
📌 권2 제5장 정리
핵심 한 줄: Day 22~28 = 통합 테스트 (Agent Teams) + 통계 조작 시뮬 + ★ G2 PASSED + 4주 회고. 권2 마무리.
4주차 산출물:
- 통합 테스트 34/34 통과 (Agent Teams -61% 시간)
- 통계 조작 시뮬 15 시나리오 모두 차단
- G2 통과 조건 10/10 PASS
- 자동 cron 7일 연속 작동
- 4주 회고 (BUILD.md 2.2KB)
Phase 1.0 절반 (Day 1~28) 누적:
- 25개 파일 + 4 SQL migration (★ PLAN.md 추정 정확 일치)
- 39 LogOnTable 트레이스
- benefits 46건 보유 (사용자 노출 가능)
- 누적 시간 84h / 4주 평균 15.75h/주
5확장 5/5 운영 사이클 완성:
- E1 — 시크릿 5종 분리 매일 점검
- E2 — ★ R4 자동 회복 1회 (Day 17 → 18)
- E3 — G-1·G-3·G-4·G-5·G-6 모두 입증 (5/6)
- E4 — 39 트레이스
- E5 — 7 규칙 ([1][3][4][6][7])
1탄 v2 메타 원칙 6개 모두 입증:
1. 5파일+ 사이클 7단계 / 2. E3 4+6+2 / 3. WITH-CONDITIONS 75분 / 4. R4 자동 회복 / 5. Agent Teams + E5 자연 결합 / 6. 비교 우위 -60%
다음 권: 권3 — Phase 1.0 후반 (Day 29~56) + Phase 1.1 (Day 57~73) + ★ G5 FINAL + 앱스토어 심사 + 1순위 커뮤니티 게시.
★ G2 PASSED. Phase 1.0 절반이 완성됐습니다. 25개 파일 + 4 SQL migration + 39 LogOnTable 트레이스 + benefits 46건 보유 + 5확장 5/5 운영 사이클.
84시간 투자 = 1탄 v2의 모든 메타 원칙 6개가 줍줍 사례로 데이터 입증된 자리. "가설 → 사실"의 전환이 완성됐습니다.
권3에서 만나뵙겠습니다 — Phase 1.0 후반 (두 탭 UI + 단계적 기여) + Phase 1.1 (통계·알림·QA) + ★ G5 FINAL (앱스토어 심사 + 1순위 커뮤니티).