Day 50~56: G4 통과 + 8주 회고
FCM 알림 + 공유 카드 + Sentry 7일 무장애 + ★ G4 PASSED — R4 자동 보호 4주 연속
📑 이 챕터에서 다룰 내용
권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 |
요구사항: 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만
결정: 매칭 점수 4+ 사용자에게만 발송 (3+ X)
근거: 사용자 알림 피로 방지 = E2 1인 운영자 신뢰 보호. 점수 3 = 부분 매칭 → "왜 이게 알림?" 의문 → 차단/탈퇴 위험.
대안: 모든 사용자 발송 — 알림 피로 ↑ → 사용자 이탈 / 매칭 5만 — 너무 좁음
부작용: target_* 모두 null인 신규 사용자 = 점수 1 균일 → 알림 0 → 마이페이지 자발적 필터 입력 가이드 강화 (Phase 1.1)
누적: 138.5h + Day 50 (2.5h) = 141h
요구사항: 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: '새 혜택 발견, 시민님!'
결정: 사용자별 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
요구사항: 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줄 (작은 글자): '본 정보는 공식 자료 + 사용자 경험 결합'
결정: 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
요구사항: 1. 어드민 수동 입력 폼 (110줄) 2. 출시 후 1주 동안 매일 1회 입력 3. 필드: 게시 카페 / 게시 일자 / 댓글 수 / 좋아요 / 조회수 / 공유 수 4. 누적 그래프 (50건+ 목표 추적) 5. supabase/migrations/0007_community_metrics.sql 6. 매일 09:00 자동 알림 (cron) — admin Slack: '오늘 입력 안 됐어요'
결정: 1순위 커뮤니티 반응 = 수동 입력 (자동 크롤링 X)
근거: 카페 외부 크롤링 = TOS 위반 위험 + 법적 회색지대. E1 일관 — "무엇을 약속하지 않는가" 정신. 수동 입력이 정직합니다.
대안: 자동 크롤링 — TOS 위반 + 차단 위험 / 측정 X — SPEC § 측정 메트릭 통과 조건 검증 불가
부작용: 매일 1회 수동 부담 (Day 70~76 7일) = 약 5분/일 = 35분 합계. E2 페이스 영향 미미
누적: 146h + Day 53 (2.5h) = 148.5h
- ✅ 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
결정: warning은 자동 retry 후 성공한 것 → 무장애로 인정
근거: critical = 사용자 영향 / warning = 시스템 자동 회복. SPEC v4 § 측정 "crash-free rate 99%+" = critical 만 카운트
대안: warning도 장애 카운트 — 무장애 7일 달성 어려움 (자연 발생)
부작용: warning 추세 모니터링 의무 (증가 시 critical 신호)
## 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
git tag v0.1-G4-passed git push origin v0.1-G4-passed
## 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
[권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)