ZZEM Sprints
Explore Clusters System
← Timeline

UGC Platform 003 — 소셜 & 알림

completed #ugc-platform#phase-3#social#notification#follow-up

PRD

PRD: UGC Platform — Phase 3 (소셜 & 알림)

스코프 요약

유저 간 소셜 관계(팔로우, 차단, 신고)와 알림 시스템(알림센터, 푸시, 설정) 구축.

구현 범위

  • 팔로우/언팔로우 + 팔로워·팔로잉 리스트 (본인 프로필만 리스트 진입 허용)
  • 차단 (양방향, 팔로우 양방향 해제) + 차단 해제 + 차단 관리 화면
  • 신고 (자유 텍스트 100자, 상대방 미통지, 추천 시스템 시그널만)
  • 알림센터 (시간순 단일 리스트, Red dot, 푸시 권한 배너, 빈 상태)
  • 푸시 알림 3종 (좋아요 실시간, 팔로우 실시간, 페이백 배치 10시 KST)
  • 알림 설정 토글 4종 (푸시 전체 / 좋아요 / 소식 / 팔로우)
  • 페르소나 계정 알림/푸시 제외

주요 AC

  • US6 팔로우: AC 6.1~6.3
  • US7 차단·신고: AC 7.2, 7.3, 7.4, 7.5, 7.6
  • US5 알림·푸시: AC 5.1~5.5

경계

  • ALWAYS: 차단/신고 사실 상대방 미통지, 페르소나 제외, 차단 시 팔로우 양방향 해제
  • NEVER: 팔로워 전용 피드, 추천 알고리즘 코어 변경, 신고 패널티 로직, 뮤트 기능

선행 스프린트 연계

  • ugc-platform-001: 프로필/네비게이션 — 팔로워·팔로잉 카운트 UI, 설정 화면 진입점, 알림센터 벨 아이콘 skeleton
  • ugc-platform-002: 피드 인터랙션 & 페이백 — 좋아요 데이터, 페이백 적립, 콘텐츠 공개/비공개
  • Regression Guard: 이전 스프린트에서 완료된 프로필/피드/페이백 기능이 소셜·알림 도입으로 깨지지 않는지 검증

Report

Sprint Report: ugc-platform-003

Generated: 2026-04-23 Architecture: Planner-Generator-Evaluator (Harness Design v4) PRD: UGC Platform Phase 3 — 소셜 & 알림

Executive Summary

UGC Platform Phase 3 (소셜 & 알림) 스프린트가 11/13 AC 충족 (85%) + 2 PRs 생성 + 2 consecutive first-try PASS (Group 002 + 003) 로 완료. ugc-platform-002 대비 major issues 10→3 (-70%), avg_fix_cycles 0.67→0.50. 미충족 2건은 모두 partial (AC 6.2 nickname sort — technical_limit / AC 7.4 PA 추천 — dependency).

PRD Coverage

User Story AC 수 충족 부분 충족 미충족
US5 알림/푸시 5 5 0 0
US6 팔로우 3 2 1 0
US7 차단/신고 5 4 1 0
합계 13 11 2 0

Fulfillment Rate: 85% (11/13 AC)

Build Results

Group Feature BE Tasks App Tasks Eval Result Fix Loops
001 Follow (US6) be-001 app-001, app-002 PASS R2 1
002 Block & Report (US7) be-002, be-003 app-003, app-004, app-005 PASS R1 (first-try) 0
003 Notification BE (US5) be-004, be-005, be-006, be-007 PASS R1 (first-try) 0
004 Notification App (US5) app-006, app-007, app-008 PASS R2 1

Quality Metrics

Metric ugc-platform-003 ugc-platform-002 Delta
total_groups 4 3 +1
first_pass_rate 0.50 0.33 +0.17
avg_fix_cycles 0.50 0.67 -0.17
critical_issues_found 0 0 0
major_issues_found 3 10 -7
minor_issues_found 14 14 0
fulfillment_rate 0.85 1.00 -0.15 (new AC only; 2 partial)
amendments 0 (P3 skip) 2
new_patterns 7 6 +1

Note: fulfillment drop 은 AC 6.2 (nickname sort technical_limit) + AC 7.4 (PA 추천 dependency) 이 부분 충족인 것만 반영. 구현한 모든 새 AC 는 100% 충족.

Issues Found by Evaluator

Critical

없음.

Major (3건, 전부 fix loop 에서 해소)

Group # Issue Root Cause Resolution Commit
001 M1 Cursor 규약 이탈 — truncated[last-shown] vs page[limit] extra item spec_ambiguity extra item pattern (reference: me-contents-app.service.ts:buildLikedListResponse) be 476364e3
001 M2 E2E appId inconsistency (io.wrtn.meme vs com.wrtn.zzem.dev canonical) scope_creep 2 yaml 교체 + appId uniformity grep gate app a1ae7ca18
004 M1 Test assertion hardcoded literal vs notificationQueryKey drift spec_ambiguity typed import from ~/data/notification app af6aa8125

Minor (14건, 전부 retrospective 이월 — 비차단)

  • Group 001 (4건): nickname ASC sort TODO, persona nickname fallback 주석, Contract UserPublicProfile deviation, follow-button-tap seed drift.
  • Group 002 (4건): transaction rollback integration test, BlockRelationPort DI 단일화, BlockedProfileState copy UX, report filter recency window.
  • Group 003 (3건): shouldPush vs shouldNotify helper 통합 (KB 승격 후보), Payback batch integration test, Notification.paybackBucket admin 노출.
  • Group 004 (3건): foreground malformed-fallback test, ?? 0 render gate vs fallback, HomeHeaderBellButton location guideline.

Systemic Patterns

Pattern-digest 7 건 (상세 retrospective/pattern-digest.yaml):

  1. Cursor encoding semantic 이탈 (correctness, M1 G1): formal grep gate ($lt) 외에 reference 파일 경로 명시 필요. KB correctness-004 확장 후보.
  2. E2E appId inconsistency (completeness, M2 G1): grep gate (rg '^appId:' e2e/flows | sort -u | wc -l → 1) 표준화.
  3. Test assertion drift (completeness, M1 G4): production 상수 복제 금지, typed import 강제. skill_candidate.
  4. BlockRelationPort dual-provider (integration, Minor G2): circular DI 회피 pragmatic dual-provider pattern 허용 + 주석 의무.
  5. Pragmatic display fallback 주석 convention (code_quality): // Why: 주석 category (persona-display / render-gate / contract-compliance).
  6. Settings gate single SOT (integration, Minor G3): shouldNotify (persist) + shouldPush (push) 2-layer. integration-002 확장 KB 승격 후보.
  7. Slot-based composition (integration): ComingSoonSettingsSection topSlot/middleSlot additive. skill_candidate.

Deliverables

Code

Repository Branch Base Files Lines
wrtn-tech/wrtn-backend sprint/ugc-platform-003 apple 116 +6864/-61
wrtn-tech/app-core-packages sprint/ugc-platform-003 epic/ugc-platform-final 112 +4911/-53

New Modules (backend)

domain/user-follow/, persistence/user-follow/, application/user-follow/, controller/user-follow/, domain/user-block/, persistence/user-block/, application/user-block/, controller/user-block/, domain/content-report/, persistence/content-report/, application/content-report/, controller/content-report/, domain/notification/, persistence/notification/, application/notification/, controller/notification/, controller/notification-setting/ + common/constant/notification.constant.ts.

New Screens / Components (app)

Screens: FollowerListScreen, FollowingListScreen, BlockManagementScreen, NotificationCenterScreen, NotificationSettingsScreen. Components: FollowButton, FollowUserRow, BlockConfirmSheet, UnblockConfirmSheet, BlockedProfileState, BlockUserRow, ContentReportBottomSheet, HomeHeaderBellButton, NotificationListItem, PushPermissionBanner, NotificationEmptyState, NotificationToggleRow. Handler 확장: usePushNotificationHandler (LIKE/FOLLOW/PAYBACK) + parsePushPayload helper.

API Contract

11 endpoint 신규 + 1 response extension (/v2/users/{userId}/profileisBlocked 필드). 경로: sprint-orchestrator/sprints/ugc-platform-003/contracts/api-contract.yaml.

Sprint Artifacts

  • 4 Sprint Contracts (group-00{1,2,3,4}.md) signed + Evaluator R1/R2 review
  • 4 Evaluation reports (evaluations/group-00{1,2,3,4}.md)
  • 6 Phase + 4 Group checkpoints (checkpoints/)
  • 15 task specs (tasks/backend/.md, tasks/app/.md)
  • E2E artifacts: 9 new yaml flows + 1 e2e-flow-plan.md + 1 e2e-seed-plan.md

PR Links

Repository Status Link
wrtn-tech/wrtn-backend OPEN https://github.wrtn.club/wrtn-tech/wrtn-backend/pull/804
wrtn-tech/app-core-packages OPEN https://github.com/wrtn-tech/app-core-packages/pull/563

Improvements for Next Sprint

Priority Improvement Source
high Cursor Contract 조항에 reference 파일 경로 명시 (KB correctness-004 확장) pattern_digest
high E2E appId uniformity grep gate 표준화 pattern_digest
high 테스트 파일 typed import 강제 (production 상수 literal 복제 금지) pattern_digest
high Manual QA carryover 종결 (AC-2.3, AC-7.4 Phase 1 — 3 스프린트 연속 pending) user_feedback
medium settings/permission gate single SOT (shouldNotify / shouldPush helper 2-layer) evaluator_suggestion
medium Shared component slot-based composition 패턴 표준화 pattern_digest
low Phase 3 Prototype auto-skip 정책 follow-up 스프린트에서 표준화 pattern_digest

Timeline

Phase 소요 (approx) Notes
Phase 1 — Init (follow-up) ~10m Sprint Lead solo, worktree setup
Phase 2 — Spec ~90m 15 task files + api-contract + e2e-flow/seed-plan + evaluation criteria. 5 parallel agent dispatches (3 succeeded, 2 API errors — 파일 8개 Sprint Lead 직접 작성)
Phase 3 — Prototype auto-skip no ### Screens / Components header + no DESIGN.md
Phase 4 — Build ~4h 4 groups loop. 15 engineers + 4 evaluators. 2 fix loops.
Phase 5 — PR ~15m rebase no-op + push + PR create (skip E2E full suite, manual QA checklist)
Phase 6 — Retrospective ~20m gap-analysis + pattern-digest + deferred + REPORT + KB write

Next Action Recommendation

Fulfillment = 0.85, partial 2 건 (모두 small + technical_limit/dependency). 시스템적 개선 (slot composition, test-import, cursor reference, settings single SOT) 은 별도 후속 스프린트 또는 --continue 로 처리 가능.

  • Option A (권장): PR 머지 우선 + 수동 QA (Phase 1 carryover 3건 + 이번 스프린트 manual QA 체크리스트). AC 6.2 nickname sort 는 다음 스프린트 small task 로 --continue.
  • Option B: 후속 스프린트 --follow-up=ugc-platform-003 생성하여 Minor 14건 + nickname sort + PA 추천 연동 확인을 포함. KB 승격 후보 (completeness-008 3번째 관측, integration-002 확장) 도 스프린트 시작 시 contract clause 로 반영.

직전 이월 (Phase 1 manual QA) 해소를 위해 Option A + 작은 --continue 조합 권장.