ZZEM Sprints
Explore Clusters System
← Timeline

Free Tab Diversification

completed #ugc#free-tab
app-001 · Free Tab Grid Prototype

Prototypes

PRD

Sprint PRD: free-tab-diversification

스코프 요약

무료 필터 편성을 하루 1개 → N개(기본 10개, 테마 3-3-4)로 확장하고, 날짜별 편성 관리 구조로 전환. 1일 1회 무료 생성 제한(BR-1)과 DB 레벨 고유 제약(BR-3)은 유지.

핵심 딜리버러블

  • Backend: 날짜별 무료 슬롯 스케줄러(활성화/만료/예약 3단계, BR-8/9), 필터 목록 API에 오늘 무료 사용 여부 포함(BR-13), 생성 시점 슬롯 자동 매핑(BR-12), DB 고유 제약(BR-3), KST 자정 경계(BR-16).
  • App: 무료탭 N개 그리드 + 보라/틸 배너 전환, 레드닷, SwipeFeed circular scroll(무료 전용), 확인 바텀시트(무료/유료 CTA 분기), 추천탭 외부 진입점 동일 경험(US-7), 스크롤 위치 복원.
  • 하위 호환: 구앱은 1개 필터 경험 유지(BR-11). 서버 선배포(BR-10).

주요 User Stories

US-1 무료탭 N개 그리드 / US-2 SwipeFeed 생성 플로우 / US-3 SwipeFeed 탐색 / US-4 스크롤 복원 / US-5 틸 배너 전환 / US-6 사용 완료 후 유료 CTA / US-7 외부 진입점.

Out of Scope

Task 2(예고 필터+알림), Task 3(페르소나), 카테고리 칩, 스케줄러 재시도 크론, 웹 대응.

Report

Sprint Report: free-tab-diversification

Generated: 2026-04-14 Architecture: Planner-Generator-Evaluator (Harness Design v4) PRD: sprint-orchestrator/sprints/free-tab-diversification/PRD.md

Executive Summary

무료 필터를 하루 1개 → N개(테마 3-3-4)로 확장하고, 앱 UX(그리드/SwipeFeed 무료 모드/확인 바텀시트/추천탭 파리티)와 백엔드(슬롯 스케줄러/API/UserFreeQuota DB 유니크)를 end-to-end로 구현. 4그룹 전부 PASS, 2회 fix loop로 3 Major 이슈 해결.

PRD Coverage

User Story Groups Status
US-1 무료탭 N개 그리드 group-003 (app-001)
US-2 SwipeFeed 생성 플로우 group-004 (app-003)
US-3 SwipeFeed 탐색 (circular) group-003 (app-002)
US-4 스크롤 복원 group-003 (app-001, useTabScrollRestore)
US-5 틸 배너 전환 group-003 (app-001)
US-6 사용 완료 후 유료 CTA group-004 (app-003)
US-7 외부 진입점 파리티 group-004 (app-004)
BE: 슬롯 스케줄러 group-001 (be-001, be-002)
BE: /free-tab API + 구앱 호환 group-002 (be-003)
BE: 슬롯 자동 매핑 + UserFreeQuota group-002 (be-004)

Fulfillment Rate: 100% (모든 Contract Done Criteria + task AC 충족)

Build Results

Group Feature BE FE Eval Fix Loops
001 FreeFilterSlot 스키마 + scheduler be-001, be-002 PASS 0
002 /free-tab + filters v2 + slot mapping be-003, be-004 PASS 1
003 Free tab grid + SwipeFeed free mode app-001, app-002 PASS 1
004 Confirm sheets + 추천탭 파리티 app-003, app-004 PASS 0

Quality Metrics

Metric Value
Total groups 4
First-pass rate 50% (2/4)
Avg fix cycles 0.5
Critical issues 0
Major issues 3 (모두 fix 완료)
Minor issues 11 (deferred)
Issues fixed 3
E2E flows (sprint) 6 (4 PASS, 2 env fail)
Backend tests 83 suites / 673 tests PASS

Issues Found by Evaluator

Critical

없음.

Major (모두 fix 완료)

Group Issue Root Cause Resolution
002 BR-2 legacy setContentError가 UserFreeQuota 롤백 안 함 dependency — 신규 workflow에만 구현 rollbackFreeQuotaByContentId private helper (3ff2a331)
002 어제 폴백 filter requiredCredit=0 과다 노출 → UI/생성 불일치 spec_ambiguity RosterContext → todayActiveSlots/displaySlots 분리 (9482be57)
003 FreeTabScreen.handleCardPress freeUsedToday passthrough 누락 spec_ambiguity navigation.navigate + useCallback deps (d4f338e9)

Minor (deferred, retrospective/deferred-items.yaml 참조)

  • BE: computeFreeUsedToday 통합, Mongoose duplicate index, race window, N+1 쿼리
  • App: FREE_ROSTER_MIN_VERSION 미참조, imp_id payload, deep link 뒤로가기 edge, findIndex perf, 동시생성 시트 순서
  • Infra: monorepo @wrtn/* resolution, e2e VPN/token 의존성

Systemic Patterns

  1. Cross-repo 복수 경로에서 한쪽 cleanup 누락 (legacy vs new workflow rollback) → 공통 helper 일원화.
  2. pricing source와 display source 혼재 → 명시적 분리(todayActiveSlots vs displaySlots).
  3. Route params 추가 시 호출부 useCallback deps 누락 → TypeScript 강제 또는 전달 helper.
  4. Deep link 직진입 경로에서 passthrough 부재 → params | fetchFallback 패턴.
  5. E2E 환경 의존성 (VPN + 토큰 + 시드) → graceful degradation.

Deliverables

Code

Repository Branch Base Files Lines
wrtn-backend zzem/free-tab-diversification apple 66 +3738 / -76
app-core-packages zzem/free-tab-diversification epic/ugc-platform-final 59 +3106 / -155

New Modules / Screens / Components

  • BE: persistence/free-filter-slot/, domain/free-filter-slot/, batch/free-filter-slot/scheduler, persistence/user-free-quota/, domain/user-free-quota/, infrastructure/slack-alert/
  • App Screens: FreeTabScreen, FreeRosterBanner, FreeEmptyView, FreeTabCard, SwipeFeedScreenFree (mode 분기), SwipeFeedFreeCtaButton
  • App Hooks: useFreeGenCTA (공통), useTabScrollRestore (공통), useGetFreeTabUseCase
  • App Sheets: FreeUseConfirmSheet, CreditUseConfirmSheet
  • Routes/Deep links: zzem://free-tab, zzem://swipe-feed/free?filterId=..., FilterPreview.source, SwipeFeed.pendingCtaAction bridge

API Contract

  • 3 신규 endpoint + 2 기존 endpoint v2 확장 + 2 test-only seed endpoint
  • 파일: sprint-orchestrator/sprints/free-tab-diversification/contracts/api-contract.yaml

Sprint Artifacts

  • Contracts: 4 (group-001~004)
  • Checkpoints: 6 (phase-2, phase-3, phase-4, group-001~004)
  • Evaluations: 4 (group-001~004)
  • Retrospective: gap-analysis, pattern-digest, deferred-items, reflection

PR Links

Repository Status Link
wrtn-backend Open https://github.wrtn.club/wrtn-tech/wrtn-backend/pull/734
app-core-packages Open https://github.com/wrtn-tech/app-core-packages/pull/514

Improvements for Next Sprint

Priority Improvement Source
medium computeFreeUsedToday → UserFreeQuota 통합 evaluator_suggestion
medium FREE_ROSTER_MIN_VERSION 참조 처리 evaluator_suggestion
medium monorepo @wrtn/* resolution 안정화 pattern_digest
medium e2e VPN/토큰 오프라인 대응 pattern_digest
medium isFree 서버 주입 (BE 통합 테스트) task spec deferred
medium Phase 3 prototypes/quality-report.yaml 자동 생성 (Design KB 승격 활성화) harness gap
low (상세는 retrospective/deferred-items.yaml 참조)

Timeline

Phase Duration Notes
Phase 1 Init (prior session) 스프린트 디렉토리/config 생성
Phase 2 Spec (prior session) 태스크/API contract/e2e 플랜
Phase 3 Prototype (prior session) 4 프로토타입 approved
Phase 4 Build 45h 4 groups, 2 fix loops, 2 e2e smoke gates, 1 regression-gate e2e
Phase 5 PR ~10min 양 레포 push + PR 생성 (partial e2e — allow-e2e-fail)
Phase 6 Retro ~10min 본 산출물