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

Day 50~56: G4 통과 + 8주 회고

FCM 알림 + 공유 카드 + Sentry 7일 무장애 + ★ G4 PASSED — R4 자동 보호 4주 연속

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

권3 제3장 (Day 49) 끝에서 Sentry 7일 무장애 관측 시작. 이번 주는 G4 통과 + 7일 관측 완료 자리입니다. 페이스 2.5h/일 유지 + Day 57 휴식 의무.

사전 지식 체크이 장의 목적완료 후 결과물
Day 43~49 + Sentry 관측 / G4 통과 조건 / 페이스 2.5h/일 / SPEC v4 §4 [3] 알림 Day 50~56 FCM 알림 + 공유 카드 + 커뮤니티 측정 + Sentry 7일 무장애 + ★ G4 PASSED FCM 알림 + 공유 카드 + 커뮤니티 측정 폼 + Sentry 7일 무장애 + G4 PASSED
4-1 Day 50 — FCM 마감 D-7 알림 cron
💻 supabase/functions/notify-deadline/ Edge Function
요구사항:
1. benefits.deadline 이 NOW() + 7일 ~ NOW() + 8일 사이
2. 사용자 user.target_* 매칭 (lib/matching.ts 활용)
3. 매칭 점수 4+ 사용자에게만 발송 (불필요 알림 X)
4. pg_cron 등록 — 매일 09:00 (KST) 실행
5. 두 톤 분기:
   - business: '[지원금명] 마감 7일 전, 사장님'
   - individual: '[혜택명] 마감 7일 전, 알림드려요'
6. CLAUDE.md §3 — Firebase 시크릿 Supabase Secrets만
📘 LogOnTable 트레이스 — 매칭 점수 4+ 임계값 결정

결정: 매칭 점수 4+ 사용자에게만 발송 (3+ X)

근거: 사용자 알림 피로 방지 = E2 1인 운영자 신뢰 보호. 점수 3 = 부분 매칭 → "왜 이게 알림?" 의문 → 차단/탈퇴 위험.

대안: 모든 사용자 발송 — 알림 피로 ↑ → 사용자 이탈 / 매칭 5만 — 너무 좁음

부작용: target_* 모두 null인 신규 사용자 = 점수 1 균일 → 알림 0 → 마이페이지 자발적 필터 입력 가이드 강화 (Phase 1.1)

누적: 138.5h + Day 50 (2.5h) = 141h

4-2 Day 51 — FCM 신규 매칭 즉시 알림
💻 supabase/functions/notify-new-match/ Edge Function
요구사항:
1. benefits 새 INSERT 시 트리거 (DB trigger AFTER INSERT)
2. confidence ≥ 0.7 + auto_active 만 대상
3. 매칭 점수 4+ 사용자에게만 (Day 50 일관)
4. 1일 1회 한도 (사용자가 같은 알림 폭탄 X)
5. supabase/migrations/0006_notify_trigger.sql
6. 두 톤 분기:
   - business: '새 지원금 매칭, 사장님!'
   - individual: '새 혜택 발견, 시민님!'
📘 LogOnTable 트레이스 — 1일 1회 한도 vs 즉시

결정: 사용자별 1일 1회 한도 (Redis TTL 24h)

근거: pg_cron 03:00 매일 새 benefits 5~10건 + 매칭 점수 4+ 사용자당 평균 3건 매칭 → 알림 3개 = 피로 ↑

부작용: 매칭 다수일 때 첫 1건만 알림 → 푸시 메시지에 "+N건 더 보러 가기" 링크 (UX)

누적: 141h + Day 51 (2.5h) = 143.5h

4-3 Day 52 — 공유 카드 (Satori OG 이미지)
💻 공유 카드 + ShareButton 컴포넌트
요구사항:
1. supabase/functions/og-image/ — Satori 동적 OG 생성:
   - benefit 정보 (name, deadline, support_amount) + 줍줍 N명 + 성공률
   - 1200×630 규격 (Twitter Card·OpenGraph 표준)
   - 두 톤 분기 (사장님 톤 / 시민 톤)

2. components/ShareButton.tsx — 상세 페이지 + 마이페이지:
   - 공유 카드 link 자동 생성
   - 카카오·트위터·일반 link 3 옵션

3. ⚖️ E1 카드에 면책 1줄 (작은 글자):
   '본 정보는 공식 자료 + 사용자 경험 결합'
📘 LogOnTable 트레이스 — Satori vs 정적 이미지

결정: Satori 동적 OG (정적 X)

근거: benefit별 다른 정보 노출 (이름·금액·줍줍 수 실시간) = 동적 의무. 정적은 매번 디자이너 작업 필요

대안: 정적 디자인 (1개) — benefit 차이 노출 X / Vercel OG (Next.js) — Expo 환경 호환 X

부작용: Satori 콜드 스타트 약간 느림 (1~2초). 1순위 커뮤니티 게시 시점 = 캐시 5분으로 개선 가능

누적: 143.5h + Day 52 (2.5h) = 146h

4-4 Day 53 — 1순위 커뮤니티 측정 폼 (C-5 본격)
💻 src/app/admin/community-metrics/page.tsx
요구사항:
1. 어드민 수동 입력 폼 (110줄)
2. 출시 후 1주 동안 매일 1회 입력
3. 필드: 게시 카페 / 게시 일자 / 댓글 수 / 좋아요 / 조회수 / 공유 수
4. 누적 그래프 (50건+ 목표 추적)
5. supabase/migrations/0007_community_metrics.sql
6. 매일 09:00 자동 알림 (cron) — admin Slack:
   '오늘 입력 안 됐어요'
📘 LogOnTable 트레이스 — "수동 입력" 결정의 정직성

결정: 1순위 커뮤니티 반응 = 수동 입력 (자동 크롤링 X)

근거: 카페 외부 크롤링 = TOS 위반 위험 + 법적 회색지대. E1 일관 — "무엇을 약속하지 않는가" 정신. 수동 입력이 정직합니다.

대안: 자동 크롤링 — TOS 위반 + 차단 위험 / 측정 X — SPEC § 측정 메트릭 통과 조건 검증 불가

부작용: 매일 1회 수동 부담 (Day 70~76 7일) = 약 5분/일 = 35분 합계. E2 페이스 영향 미미

누적: 146h + Day 53 (2.5h) = 148.5h

4-5 Day 54 — G4 통합 점검
🎉 Day 54 점검 결과
  • ✅ notify-deadline: 5일 연속 cron 정상 (사용자 평균 알림 0.7건/일)
  • ✅ notify-new-match: 트리거 작동 (1일 1회 한도 정상)
  • ✅ og-image: 5건 시뮬 카드 생성 (Satori 콜드 스타트 1.2초)
  • ✅ community-metrics: 폼 작동 + 입력 누락 알림 정상
  • ✅ Sentry 6일 무장애 (2 warning은 자동 retry로 해결)

누적: 148.5h + Day 54 (2.5h) = 151h

📘 LogOnTable 트레이스 — Sentry 'warning' 정의

결정: warning은 자동 retry 후 성공한 것 → 무장애로 인정

근거: critical = 사용자 영향 / warning = 시스템 자동 회복. SPEC v4 § 측정 "crash-free rate 99%+" = critical 만 카운트

대안: warning도 장애 카운트 — 무장애 7일 달성 어려움 (자연 발생)

부작용: warning 추세 모니터링 의무 (증가 시 critical 신호)

4-6 Day 55 — Sentry 7일 무장애 관측 완료
💻 BUILD.md Day 55 entry — ★ Sentry 7일 무장애
## Phase 1.0 Day 55 — ★ Sentry 7일 무장애 관측 완료 ★

[7일 무장애 관측 결과 (Day 48~55)]
- Critical 에러: 0건
- Warning 에러: 3건 (모두 자동 retry 성공)
- Crash-free rate: 100%

[G4 통과 조건 점검]
✅ FCM 마감 D-7 cron (Day 50)
✅ FCM 신규 매칭 즉시 (Day 51)
✅ 공유 카드 Satori OG (Day 52)
✅ 1순위 커뮤니티 측정 폼 (Day 53)
✅ Sentry 7일 무장애 (Day 55, 본 일자)
✅ 통계 시각화 (Day 45)
✅ 마이페이지 (Day 44)

[★ 페이스 점검]
- 4주 누적 (5~8주차): 24+18+12.5+12.5 = 67h ⚠️ R4 60h 트리거 7h 초과
- 단, 7주차 회복 진행 중 (75.5h → 67h, -11%)
- Day 56 G4 통과 후 Day 57 휴식 의무

[종합] G4 통과 조건 7/7 PASS + Sentry 무장애 ✅ → G4 READY
4-7 Day 56 — ★ G4 PASSED + 8주 회고
💻 G4 통과 의식
git tag v0.1-G4-passed
git push origin v0.1-G4-passed
💻 BUILD.md Day 56 entry — ★ G4 PASSED + 8주 회고
## Phase 1.0 Day 56 — ★ G4 PASSED ★

[기능 통과 조건] 7/7 PASS ✅
[Sentry 7일 무장애] ✅ (Day 48~55)
[git tag] v0.1-G4-passed ✅

## 8주 회고 (Day 50~56, Phase 1.0 후반 마무리)

### 산출물
1. supabase/functions/notify-deadline/ (60줄, 마감 D-7)
2. supabase/functions/notify-new-match/ (50줄, 즉시 매칭)
3. supabase/migrations/0006_notify_trigger.sql (40줄)
4. supabase/functions/og-image/ (80줄, Satori OG)
5. components/ShareButton.tsx (70줄)
6. src/app/admin/community-metrics/page.tsx (110줄, C-5)
7. supabase/migrations/0007_community_metrics.sql (35줄)

총: 7개 + 2 SQL = ~445줄

### 1탄 v2 메타 원칙 입증 (이번 8주차)
1. R4 자동 보호 4주 연속 사이클 — 가설 → 운영 자동화 → 4주 연속 작동
2. G4 통과 조건 7/7 즉시 PASS — REVIEW 75분 패치 P2 효과
3. 두 톤 분기 알림 메시지 — FCM 메시지까지 톤 분기 (E5 [2] 깊이)

### benefits 보유량 (Day 56 시점)
- pg_cron 매일 03:00 자동 추가 — 8주 누적 약 220건
- admin 검수 후 활성: 약 180건

### 다음 9주차 (Day 57~63) — E1 4자리 + QA
- Day 57: ★ G4 통과 휴식
- Day 58~59: ⚖️ E1 외부 노출 4자리 (About + 약관 + 개인정보)
- Day 59: G-7 Apple Privacy Manifest 자동 검증
- Day 60: 어드민 마무리
- Day 61~62: QA 1~2차
- Day 63: 일요일 회고

[누적] 151h + Day 56 (1.5h) = 152.5h
4-8 8주차 점검 — Phase 1.0 후반 마무리
💻 Phase 1.0 후반 완성 현황
[권1·권2 누적] 84h
[권3 5·6주차] 42h → 누적 126h
[권3 7·8주차] 26.5h → 누적 152.5h

[Phase 1.0 후반 (4주) 완성]
- 두 탭 UI + 단계적 기여 (5·6주차)
- 마이페이지 + Phase 1 KPI + Sentry (7주차)
- FCM 알림 + 공유 카드 + 커뮤니티 측정 + G4 (8주차)

[5확장 진행률 — Day 56 시점]
| E1 | Footer + Disclaimer + 공유 카드 면책 / About·약관·개인정보 본격 Day 58~59 |
| E2 | 자동 보호 4주 연속 사이클 ✅ |
| E3 | 5/6 본격 (G-7 Day 59) |
| E4 | ~66 트레이스 |
| E5 | 6/7 본격 ([5] Day 58~59 마무리) |
💡 두 톤 분기 깊이 — 모든 레이어 일관
  • UI 카피 (Day 30~35) — BenefitCard tone prop
  • FCM 알림 메시지 (Day 50~51) — 사장님 / 시민 구분
  • 공유 카드 (Day 52) — 사장님 묵직한 폰트 / 시민 부드러운 폰트
  • 마이페이지 (Day 44) — 통계 카피 톤 분기
  • 모든 레이어 일관 (E5 [2] 깊이)

📌 권3 제4장 정리

  • 핵심 한 줄: Day 50~56 = FCM 알림 + 공유 카드 + 커뮤니티 측정 + Sentry 7일 무장애 + ★ G4 PASSED.
  • 8주차 산출물: FCM 마감 D-7 cron (60줄) + 즉시 매칭 (50줄) + 공유 카드 Satori OG (80줄) + 커뮤니티 측정 폼 (110줄) + Sentry 7일 무장애 검증
  • Sentry 7일 무장애: Critical 0건 / Warning 3건 (자동 retry 성공) / Crash-free rate 100%
  • ★ R4 자동 보호 4주 연속 사이클: 5주차 73h → 6주차 77h → 7주차 75.5h → 8주차 67h. "피곤하다" 신호 0회, 자동 트리거가 보호
  • 누적: 152.5h / 4주 누적 67h
  • 다음 장: 권3 제5장 — Day 57~63 (★ Day 57 휴식 + E1 외부 노출 4자리 + G-7 + QA)