2탄 권3 제2장
2탄 권3 — 제2장

Day 36~42: G3 통과 의식 + E1 외부 노출 1차

Phase 1.0 후반 마무리 — 페이스 축소 + 매칭 알고리즘 + E2E 시뮬 + ★ G3 PASSED

📑 이 챕터에서 다룰 내용
들어가며 Phase 1.0 후반 마무리

권3 제1장 끝 (Day 35) 에서 5주차 끝 R4 트리거 초과 → 6주차 페이스 25% 축소 자동 결정. 이번 주는 "매일 3h" 페이스로 G3 통과를 향합니다.

사전 지식 체크이 장의 목적완료 후 결과물
Day 30~35 / 페이스 축소 (3h/일) / G3 통과 조건 / SPEC v4 § 회색지대 결정 ① ② Day 36 일요일 회고 + Day 37~41 G3 작업 (페이스 축소) + ★ Day 42 G3 PASSED + E1 외부 노출 1차 G3 PASSED + git tag v0.1-G3-passed + 외부 노출 4자리 1차 + 6주 회고
2-1 Day 36 — 일요일 추가 휴식 + 5주차 회고
💻 BUILD.md Day 36 entry
## Phase 1.0 Day 36 — ★ 5주차 끝 추가 휴식 ★

[E2 의식]
- 작업 X (오전·오후)
- 회고만 30분 (저녁)

[5주차 회고]
산출물: 두 탭 메인·필터·상세 (~870줄)
        단계적 기여 3 단계 (~340줄)
        닉네임 + 후기 리스트 (~150줄)
        E5 [2] 톤 분리 18 카피 분기

### ⭐ E5 [2] 본격의 본질
1탄 v2 부록 H-5의 "같은 사실 다른 톤"이 UI 카피로 박힘.
사장님은 "사업장에 도움" 시민은 "내 상황" —
같은 줍줍 행위인데 다른 정체성. SSOT 시스템 깊이.

### ★ E2 자동 보호 본격 작동 입증
- 4주 누적 73h → R4 60h 트리거 초과 인지 (Day 35)
- 6주차 페이스 25% 자동 축소 (4h/일 → 3h/일)
- "피곤하다" 신호 부재이지만 트리거만으로 자동 보호
- 1탄 v2 부록 H-2 R4 본문이 "가설"이 아닌 "운영 자동화"

[누적] 108h (Day 36 변동 없음)
2-2 Day 37 — 후기 신고 UI (사용자 측, C-4 연결)

작업 (3h — 페이스 축소 적용)

💻 Claude Code — 후기 신고 UI
요구사항:
1. components/ReviewReportButton.tsx — 각 후기 옆 작은 버튼
2. 클릭: modal 노출 → 신고 사유 선택 (4 카테고리)
   · 욕설·혐오 (1h SLA)
   · 허위 정보 (4h SLA)
   · 광고·홍보 (24h SLA)
   · 기타 (24h SLA)
3. INSERT reports + admin Slack 알림 트리거
4. 신고 후 사용자에게 '접수됐습니다' toast (24h 내 처리 안내)
5. E5 [2] 카피 두 탭 분기:
   - business: '문제 후기 신고'
   - individual: '부적절한 후기 신고'
📘 LogOnTable 트레이스 — 신고 카테고리 4개 결정

결정: 4 카테고리 (욕설·허위·광고·기타) + SLA 차등

근거: SPEC v4 §3 reports 본문 + C-4 발견. 욕설은 1h 내 처리 의무 (1순위 커뮤니티 게시 직후 신고 폭증 위험)

대안: 1 카테고리 (모든 신고 24h SLA) — 욕설 노출 부담 ↑

누적: 108h + Day 37 (3h) = 111h

2-3 Day 38 — E1 외부 노출 1차 (콘텐츠 면책)
⚠️ 핵심 자리 — 외부 노출 4자리 중 "콘텐츠 면책" 1차

권1 제3장에서 SPEC § 회색지대 결정 두 결정 박힘. 권3 Day 38이 첫 외부 노출 자리입니다. About + 약관 + 개인정보처리방침 본격은 Day 57~58, Day 38은 콘텐츠 면책 (각 화면 짧은 한 줄) 1차입니다.

💻 Claude Code — E1 외부 노출 1차
요구사항:
1. components/Footer.tsx — 모든 페이지 하단:
   '본 서비스는 정보 제공 목적, 신청 결과 보장 X | About | 약관 | 개인정보'

2. components/ContentDisclaimer.tsx — 콘텐츠 페이지 상단 (소형):
   상세 페이지 + 후기 리스트 + 마이페이지에 노출
   '본 정보는 공식 사이트 자료 + 사용자 경험 데이터 결합. 신청 결과 보장 X'

3. CLAUDE.md §3 Critical Constraints 준수
   — "신청 보장 / 신청 대행" 표현 X 절대 준수

4. About·약관·개인정보처리방침 페이지는 placeholder만 (Day 57~58 본격)
💻 components/Footer.tsx (약 50줄)
// components/Footer.tsx — ⚖️ E1 외부 노출 4자리 [4] Footer

import { Link } from 'expo-router';

export function Footer() {
  return (
    <View className="px-4 py-3 border-t border-gray-200 bg-gray-50">
      <Text className="text-xs text-gray-500 text-center mb-2">
        본 서비스는 정보 제공 목적이며, 신청 결과를 보장하지 않습니다.
      </Text>
      <View className="flex-row justify-center gap-4">
        <Link href="/about" className="text-xs text-gray-600 underline">About</Link>
        <Link href="/terms" className="text-xs text-gray-600 underline">약관</Link>
        <Link href="/privacy" className="text-xs text-gray-600 underline">개인정보</Link>
      </View>
    </View>
  );
}
📘 LogOnTable 트레이스 ① — E1 외부 노출 1차의 본질

결정: Day 38 = 콘텐츠 면책 일관 노출 시작. About·약관·개인정보 본격은 Day 57~58 (분리)

근거: 사용자가 화면 처음 만지는 시점 (Day 33 체크박스) 부터 면책 노출 의무. 권1 제3장 E1 결정 ① 변호 논리 사실 성립을 위해 모든 화면 일관.

대안 1: Day 30 메인부터 모든 4자리 본격 — 분량 부담, 불완전 노출 위험

대안 2: Day 64 심사 직전 일괄 — 사용자 노출 시점부터 미적용 = 위험

누적: 111h + Day 38 (3h) = 114h

2-4 Day 39 — 매칭 알고리즘 (사용자 필터 ↔ benefits)
💻 lib/matching.ts — 가중치 5점 매칭 시스템
요구사항:
1. lib/matching.ts (80줄):
   - 사용자 user.target_* 와 benefits.target_* 매칭
   - 가중치 점수 산출 (5점 만점):
     · 정확 매칭: 5
     · 부분 매칭: 3
     · 미매칭 (null 허용): 1
     · 미매칭 (배제): 0
   - target_age_max NULL = ALL 매칭

2. 정렬 통합 — Day 31 'received_likely' 정렬에 적용

3. lib/matching.test.ts (50줄, 10 시나리오)
📘 LogOnTable 트레이스 — 가중치 5점 vs 다른 척도

결정: 가중치 5점 만점 (정확·부분·미매칭(null)·미매칭(배제))

근거: 점수 분포가 매끈 (대부분 사용자 평균 3.5~4.5) → 의미 있는 정렬

부작용: target_* 모두 null인 사용자는 매칭 점수 1 균일 → 신규 사용자에게 '마감 임박순' 디폴트 (Phase 1.1 검토)

누적: 114h + Day 39 (3h) = 117h

2-5 Day 40 — 통합 시뮬 (사용자 1명 줍줍 완료)
1
카카오 로그인 (G-4)

첫 진입 → 소셜 로그인 완료

2
닉네임 자동 부여 (E5 [3])

"수원시 카페 운영하는 든든한 줍줍이"

3
자발적 필터 입력

시군구·업종·매출 단계 입력

4
소상공인 탭 진입

사장님 톤 "오늘 받을 수 있는" 메인 화면

5
매칭 정렬 → 1번째 benefit 진입

'수원시 카페 청년 지원금'

6
줍줍 체크박스 클릭 → DB INSERT 정상

부담 0 단계 완료

7
결과 SUCCESS → trigger 자동 → benefits.total_success +1

부담 낮음 단계 완료

8
자유 후기 작성 (180자)

부담 선택 단계 완료

9
후기 노출 — 닉네임 + "받았어요 (대박!)" + 후기 텍스트

ReviewList 정상 표시

10
마이페이지 — "내가 줍줍한 1건 / 총 1건 / 성공 1건"

총 시뮬 시간: 4분 8초

🎉 E2E 시뮬 결과 — 10단계 모두 통과

총 시뮬 시간: 4분 8초 (사용자 시점). 모든 단계 E1 면책 노출 일관 (Footer + ContentDisclaimer) ✅

근거: 단계적 기여 시스템의 "부담 곡선이 자연스러운지" 코드 입증. 부담 0~선택 3단계가 부담 없이 흐릅니다.

누적: 117h + Day 40 (3h) = 120h

2-6 Day 41 — G3 점검
💻 G3 통과 조건 점검 (PLAN v2.2)
G3 — Day 42: 두 탭 + 단계적 기여 작동

[기능 통과 조건]
✅ 두 탭 메인·필터·상세 페이지 정상 (Day 30·31·32)
✅ 단계적 기여 3 단계 (체크박스·3택·후기) (Day 33·34·35)
✅ 후기 신고 UI (Day 37)
✅ E1 외부 노출 1차 (Footer + ContentDisclaimer) (Day 38)
✅ 매칭 알고리즘 (Day 39)
✅ E2E 통합 시뮬 1명 줍줍 완료 (Day 40)
✅ 일관성 테스트 5/5 (E5 [6])
✅ E5 [2] 톤 분리 (UI 카피 18 분기) (Day 30~35)
✅ 매칭 정렬 'received_likely' 작동 (Day 39)

[★ 페이스 점검 (E2)]
⚠️ 4주 누적 (3~6주차): 14+21+24+18 = 77h — R4 트리거 60h 초과 17h
✅ 토요일 X 일관 (Day 5·12·19·26·33·40)
✅ 주간 회고 (Day 35 5주차 + Day 42 6주차)

[종합 판정]
G3 기능 9/9 PASS + 페이스 보호 결정
→ G3 PASS (단, 7주차 페이스 추가 축소)
⚠️ R4 트리거 두 번째 초과 — 7주차 페이스 추가 축소

결정: 7주차 페이스 2.5h/일 (지금까지 최저)

근거: 4주 누적 77h가 5주차 끝 73h보다 +4h 증가. 자동 보호 의식 2단계 강화. 사용자 "피곤하다" 신호 부재이지만 트리거가 의식적 보호.

부작용: 7주차 산출물 2~3개 줄어듦 (일부 기능 → 8주차로 이연 검토)

누적: 120h + Day 41 (3h) = 123h

2-7 Day 42 — ★ G3 PASSED + 6주 회고
💻 G3 통과 의식
git tag v0.1-G3-passed
git push origin v0.1-G3-passed
💻 BUILD.md Day 42 entry — ★ G3 PASSED + 6주 회고
## Phase 1.0 Day 42 — ★ G3 PASSED ★

[기능 통과 조건] 9/9 PASS ✅
[페이스 점검] 4주 누적 77h ⚠️ → 7주차 페이스 추가 축소 결정 ✅
[git tag] v0.1-G3-passed ✅

## 6주 회고 (Day 30~42, Phase 1.0 후반 첫 절반)

### 산출물 — 13개 파일 + tests 2개

[Day 30~35 (5주차)]
1. src/app/(tabs)/business/index.tsx (160줄)
2. src/app/(tabs)/individual/index.tsx (155줄)
3. src/components/BenefitCard.tsx (110줄, tone prop)
4. src/app/(tabs)/business/filters.tsx (130줄)
5. src/app/(tabs)/individual/filters.tsx (135줄)
6. src/app/(tabs)/business/[benefit_id].tsx (150줄)
7. src/app/(tabs)/individual/[benefit_id].tsx (145줄)
8. src/components/BenefitDetail.tsx (95줄)
9. components/JupjupCheckbox.tsx (100줄)
10. components/JupjupResultPicker.tsx (130줄)
11. components/JupjupReviewForm.tsx (110줄)
12. components/UserNicknameBadge.tsx (60줄)
13. components/ReviewList.tsx (90줄)

[Day 37~40 (6주차)]
14. components/ReviewReportButton.tsx (90줄)
15. components/Footer.tsx (50줄, E1 [4])
16. components/ContentDisclaimer.tsx (40줄)
17. src/app/(legal)/about·terms·privacy (3 placeholder)
18. lib/matching.ts (80줄)

[tests]
- lib/matching.test.ts (50줄, 10 시나리오)
- tests/e2e/user-journey.test.ts (130줄, 10 단계)

총: ~1,750줄

### 1탄 v2 메타 원칙 입증 (이번 6주차)
1. E2 자동 보호 2번 작동 — R4 본문이 "운영 자동화"
2. Agent Teams + E5 [2] 자연 결합 — 두 탭 병렬 -50%
3. E1 외부 노출 일관 시작 — Footer + ContentDisclaimer
2-8 6주차 점검 — Phase 1.0 후반 절반
💻 6주차 끝 누적 현황
[권1 Phase 0] 21h
[권2 Phase 1.0 절반 (1~4주차)] 63h → 누적 84h
[권3 Phase 1.0 후반 (5~6주차)] 42h → 누적 126h
[6주차 끝 4주 누적] 14+21+24+18 = 77h ⚠️ → 7주차 페이스 축소

[Phase 1.0 후반 절반 본질]
- 두 탭 UI + 단계적 기여 (사용자 첫 만남)
- ⭐ E5 [2] 톤 분리 (18 카피)
- ⚖️ E1 외부 노출 1차 (Footer + Disclaimer)
- ★ R4 자동 보호 2번 작동 (의식적 페이스 보호 강화)

📌 권3 제2장 정리

  • 핵심 한 줄: Day 36~42 = G3 통과 (페이스 축소 + E1 외부 노출 1차 + 매칭 알고리즘 + E2E 시뮬). G3 PASSED + git tag.
  • 6주차 산출물: 후기 신고 UI (90줄) + E1 Footer + ContentDisclaimer (90줄) + About·약관·개인정보 placeholder + 매칭 알고리즘 (80줄) + E2E 시뮬 (130줄)
  • ★ E2 자동 보호 본격 입증: 5주차 끝 73h → 6주차 페이스 축소 / 6주차 끝 77h → 7주차 추가 축소 (3h → 2.5h/일)
  • E1 외부 노출 1차: Footer + ContentDisclaimer 일관 메시지. About·약관·개인정보 본격은 Day 57~58
  • E5 7 규칙 진행률: 6 본격 ✅ ([1][2][3][4][6][7]) / 1 진행 중 ([5])
  • 누적: 126h / 4주 누적 78h (R4 추가 축소)
  • 다음 장: 권3 제3장 — Day 43~49 (Day 43 휴식 + 7주차 마이페이지·통계·Sentry 시작)