← 자료실/designsLOW

Sp05 Season System Preflight — D-7 본격 착수 절차서

designs/sprint-05-season-system-preflight.md

Sp05 Season System Preflight — D-7 본격 착수 절차서

작성: 2026-05-02 박세린 (game-designer) version: 1.1 (D-56 시점 R-V2.3-01 PD 결정 락 흡수, v1.0 = D-57 시점 신규 작성, Sp04 preflight v1.2 패턴 답습) 대상 D-Day: 2026-06-22 (Sp05 킥오프 D-7) 본격 착수 마감: 2026-06-28 (Sp05 킥오프 D-1) 정식 킥오프: 2026-06-29 입력 자료: - designs/sprint-05-season-research.md v1.0 APPROVED (Q1~Q7 7결정 + 5+1 사이드이펙트) - sprints/sprint-05-dry-run-2026-04-21.md v1.0 (§5 ISeasonClock 시그니처 / §6 5순서 / §11 Round 정수) - designs/affix_pool_sp04_supplement_v1.md v1.3 (36어픽스 + 시즌 패스 Tier 매핑 9건) - designs/webnovel/volume_2_synopsis_v2.md v2.4 (§4.3 Tier 70 영구 보유 정정 v2.4 흡수) - 메모리 project_sprint05_season_research.md (7결정) / project_volume2_synopsis_v2_decisions.md (8결정 + v2.4 D-2.15) / project_affix_pool_supplement_5_decisions.md - sprints/shared-checkpoints.md (CP-M01~M28) 목적: Sp05 W1·W2 본격 착수 시 즉시 가동 가능한 절차서. PRINT-AND-CHECK 양식 + 회귀 가드 (R-DR-S01~S03) + 시놉 v2.4 변동 흡수 + 어픽스 v1.3 정합 + Tier 매핑 9건 + R-V2.3-01 PD 결정 락 (옵션 a 영구 보유). D-57 시점 작성 = ROI 입증 (1.5h 투자 → 2~3h 절감 + Critical 리스크 사전 방어).

0. 한 줄 맥락

Sp03 → Sp04 → Sp05 (시즌 시스템) 사이클의 D-7 본격 착수 절차서. 7결정 (60일 / Manual→Firebase / 리셋+스냅샷 / 이월3건 / Firestore / Round / Wallet 50% retain) 정식 락 후 Sp05 W1 (T1~T6 = 10h) + W2 (T7~T13 = 9h) 총 14h/2주 예산. 2026-06-22 (D-7) 시점 game-designer 가 책상에 펴 놓고 즉시 가동 가능한 절차서 + R-DR-S02 Critical (5+1 순서 위반) 가드 + 시놉 v2.4 신규 5건 흡수 (Tier 60 / Tier 75 / W7 유교 드래곤 / Tier 70 영구 보유 락) + R-V2.3-01 PD 결정 락 (2026-05-03 옵션 (a) 영구 보유 채택) — 시놉 v2.3 → v2.4 §4.3 Tier 70 정정 (시즌 1회 영구 보유, 다음 시즌엔 다른 어픽스 보상 X1 안). 박세린 비권장 안이었으나 PD 결정 존중.


1. W1 절차서 — Firebase 인프라 + 시즌 전환 Backend (T1~T6 게이트 6건)

1.1 W1 작업 표 (Sp05 dry-run §1 W1 5건 + Tier 매핑 정합 1건 추가 = 6건)

T#작업예상 소요산출게이트
T1SeasonConfigSO + ISeasonClock + ManualSeasonClock (디버그 메뉴)1.5hSO + Interface + 1구현G-W1.1
T2PrestigeSaveDto_V2 + Migrate v1→v2 스위치 (v2 신규 3필드)1.5hDTO V2 + MigratorG-W1.2
T3SeasonController + OnSeasonEnd 발화자 + 이중 발화 플래그2.0hController + 5+1 순서 배선G-W1.3 (Critical)
T4Firebase SDK 통합 + 익명 Auth + Firestore 초기화 (하드 캡 6h)3.0h~6.0hSDK 통합 + PingG-W1.4
T5ILeaderboardRepository + LocalLeaderboardRepository + FirestoreLeaderboardRepository 스켈레톤2.0hInterface + 2구현G-W1.5
T6시즌 패스 30 Tier 매핑 정합 표 → season_pass_s2.tsv 신설 (시놉 v2.4 신규 3건 흡수: Tier 60 / Tier 70 영구 보유 / Tier 75)1.0h (신규)30 Tier TSV + 어픽스 풀 v1.3 정합 검증G-W1.6 (신규)
합계11.0h (T6 +1h)게이트 6/6

v1.0 신규: T6 = 시즌 패스 Tier 매핑 표 신설 (시놉 v2.4 §4.3 9건 매핑 + 어픽스 풀 v1.3 정합 검증). dry-run §1 5건 + T6 1건 = 11.0h. Q4 권장 14h 예산 내 (W2 T7~T13 = 4h 잔여 가능).

1.2 ISeasonClock 시그니처 (dry-run §5.1 90% 정의 그대로 + ITimeProvider 주입)

namespace GodBlade.Runtime.Season {
  public interface ISeasonClock {
    string CurrentSeasonId { get; }                     // "s1", "s2", ...
    System.DateTime GetSeasonStartUtc();
    System.DateTime GetSeasonEndUtc();
    bool IsSeasonEnded();                               // ITimeProvider.UtcNow >= GetSeasonEndUtc()
    event System.Action<string> OnSeasonRolledOver;    // Phase 5 Remote Config 이벤트 훅
  }

  // Sprint 05 W1 T1 구현
  public sealed class ManualSeasonClock : ISeasonClock {
    readonly SeasonConfigSO _config;
    readonly ITimeProvider _timeProvider;               // 결정론 주입
    public ManualSeasonClock(SeasonConfigSO config, ITimeProvider timeProvider) { ... }
    // ...
  }

  // Sprint 06+ Phase 5 이월
  public sealed class RemoteConfigSeasonClock : ISeasonClock { /* Firebase.RemoteConfig */ }
}

W1 T1 합/불합 판정:

  1. ISeasonClock interface 5 멤버 모두 정의 (CurrentSeasonId / Start / End / IsEnded / OnRolledOver)
  2. ManualSeasonClock 생성자 = (SeasonConfigSO, ITimeProvider) 주입 (DateTime.UtcNow 직접 호출 금지)
  3. SeasonConfigSO ScriptableObject = seasonId (string) / startUtc (long unix ms) / endUtc (long unix ms) / displayName (string) 4 필드
  4. IsSeasonEnded() 단위 테스트 = ITimeProvider Mock 으로 결정론 검증

1.3 ITimeProvider 주입 패턴 (Sp03 IdleTicker 시계 가드 패턴 재활용)

namespace GodBlade.Runtime.Common {
  public interface ITimeProvider {
    System.DateTime UtcNow { get; }
    long UtcNowUnixMs { get; }
  }
  public sealed class SystemTimeProvider : ITimeProvider {
    public System.DateTime UtcNow => System.DateTime.UtcNow;
    public long UtcNowUnixMs => System.DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  }
}

왜 신설하는가: dry-run §5.1 결정론 주의 — IsSeasonEnded()는 DateTime.UtcNow 직접 비교 금지 → ITimeProvider 주입으로 테스트 가능화. Sp03 IdleTicker 가 이미 동일 패턴 사용 중일 가능성 = D-1 (2026-06-28) code-lead B1 실측으로 확인. 미적용 시 신설 +0.5h.

T1 의존: ITimeProvider 가 Sp03 에 이미 존재하면 재활용 (0h) / 미존재 시 신설 (+0.5h)

1.4 시즌 패스 30 Tier 매핑 정합 표 (T6 신규 산출, 시놉 v2.4 §4.3 9건 + Tier 60·75 신규 + Tier 70 영구 보유)

Tier보상 (KR)보상 (EN)어픽스 풀 v1.3 정합시놉 v2.4 매핑 화
5PDA 스캐너 스킨PDA Scanner Skin— (스킨)21·25화 (홍대홍 PDA)
15작두 박자 어픽스 Magic 1회 무료Jakdu Rhythm Affix Magic Free Rollv1.3 G-3.2 (AFX_32) ✅7화 (정주 어머니 월자)
305cm 어긋남 어픽스 Rare 1회 무료5cm Misalignment Affix Rare Free Rollv1.3 G-3.1 (AFX_31) ✅10화 (무휼 H빔)
5060fps 풀스로틀 어픽스 Epic 1회 무료60fps Full Throttle Affix Epic Free Rollv1.3 G-3.3 (AFX_33) ✅1~5화 (60fps 농담)
60 (v2.3 신규)오방위의 도(道) 어픽스 Rare 1회 무료Way of Five Directions Affix Rare Free Rollv1.3 G-3.6 (AFX_36) ✅11·13화 (청천 무공)
70 (v2.4 정정)9,860원의 박자 어픽스 Legendary 1회 (시즌 1회 영구 보유, 다음 시즌엔 다른 어픽스)9,860 Won Cadence Affix Legendary (1-Per-Season Permanent, Different Affix Next Season)v1.3 G-3.4 (AFX_34) ✅ + R-V2.3-01 PD 옵션 (a) 영구 보유 락 (2026-05-03)10화 (PD 본문)
75 (v2.3 신규)slayer 유교 드래곤 시그니처 스킨 (W7 백발마녀 처치 보상)Slayer Confucian Dragon Signature Skin— (스킨)41~43화 (W7 빙공 카운터)
90단군왕검의 건(巾) (Veil of Dangun) 액세서리 스킨Veil of Dangun Accessory Skinv1.3 G-3.5 (AFX_35) ✅25~28화 (홍대홍 부활전)
100 (보스)백발마녀 NPC 호감도 + 곤륜파 사절 칭호Bai Fa Witch NPC Affinity + Kunlun Envoy Title— (NPC 자산)41~43화

T6 합/불합 판정:

  1. 9 Tier 매핑 = 시놉 v2.4 §4.3 일치 (Tier 60 / Tier 75 v2.3 신규 + Tier 70 v2.4 정정 표기 포함)
  2. 어픽스 풀 정합 = G-3.1~G-3.6 6건 모두 매핑 (G-3.1 Tier 30 / G-3.2 Tier 15 / G-3.3 Tier 50 / G-3.4 Tier 70 / G-3.5 Tier 90 / G-3.6 Tier 60)
  3. 글로벌 명칭 6건 락 일치 (D-A.2 / D-A.3' / G-3.6 supplement v1.3 §1.4~§1.6) + Tier 70 v2.4 영문 표기 갱신 ("1-Per-Season Permanent, Different Affix Next Season")
  4. R-V2.3-01 (Tier 70 영구 보유 정책) = §4.2 PD 결정 락 표시 (2026-05-03 옵션 a 채택, X1 안 = 시즌 1회 영구 보유 + 다음 시즌 다른 어픽스 로테이션)
  5. TSV 30 Tier × 6 컬럼 (tier / reward_key / reward_en / affix_id / season_only_flag / permanent_retain_flag) UTF-8 / 탭 구분. Tier 70 행: season_only_flag = false / permanent_retain_flag = true (v2.4 정정)
  6. 30 Tier 중 9 정의 + 21 미정 (마케팅팀장 TBD 합류 후 결정 = Sp06+ 이월)

2. W2 절차서 — 시즌 컨텐츠 + Smoke Test (T7~T13 게이트 7건)

2.1 W2 작업 표 (Sp05 dry-run §1 W2 5건 + Tier 70 R-V2.3-01 가드 1건 + 정합 검증 1건 = 7건)

T#작업예상 소요산출게이트
T7SetItemCatalogSO + SetItemImporter + SetEffectEvaluator 스켈레톤2.5hSO + Importer + EvaluatorG-W2.1
T8IMythicConstraint + NoDuplicateSlotConstraint + equip() validator2.0hInterface + 1구현 + HookG-W2.2
T9PlayerWalletState + MythicEssence(long) + 시즌 종료 50% retain1.5hWallet State + Migrate HookG-W2.3
T10SeasonEndModal UI + OnSeasonEndMigrationCompleted 구독1.5hUI Prefab + SubscriberG-W2.4
T11Smoke Test — 전체 루프 (Force End → Migrate → 리더보드 제출 → 모달 → v2.json)1.5hEditor Play Mode 검증G-W2.5
T12R-V2.3-01 PD 결정 (a) 영구 보유 반영 = Tier 70 어픽스 retain 예외 처리 분기 1줄 (X1 안 = 시즌 1회 영구 보유 + 다음 시즌 다른 어픽스 로테이션)0.5h (신규)if (affixId == TIER_70_SEASON_AFFIX) Skip(retain50) 1줄 + Edit-mode 검증 1건G-W2.6 (신규)
T13MigrateSeasonalToPermanent 5+1 사이드이펙트 통합 테스트 (§2.2 표 6건 모두 검증, 6번째 = Tier 70 영구 보유 정상 동작)0.5h (신규)Edit-mode 테스트 6건 (Tier 70 영구 보유 1건 포함)G-W2.7 (신규)
합계10.0h (T12·T13 +1h)게이트 7/7

v1.1 갱신 (R-V2.3-01 PD 옵션 (a) 영구 보유 락 흡수):

W1 11h + W2 10h = 21h → Q4 권장 예산 14h 초과 7h. 완화책: T4 Firebase 통합 하드 캡 6h 적용 시 이론치 14h 가능. T6 / T12 / T13 = 신규 +2.5h 는 ROI 입증 (Critical 리스크 1건 + 시놉 v2.4 정합 1건 + 통합 테스트 1건).

2.2 MigrateSeasonalToPermanent 5+1 사이드이펙트 표 (dry-run §6 5순서 + 신규 6번째 = R-V2.3-01 PD 락)

순동작근거순서 위반 시 결과검증 (T13)
1seasonEnding=true 플래그 선행 저장dry-run §6 + CP-M25이중 발화 → 2차 호출에서 Seasonal 0에 50% 적용 → Permanent 증가 0 + 백업 덮어씀Mock 시퀀스 검증
2IdleTicker.Instance?.FlushCatchUp(forceImmediate: true)dry-run §6 + CP-M26방치 누적 PP 가 Seasonal 채널 미반영 → Permanent 직행 (비율 미적용, 시스템 손해)Mock 호출 순서 검증
3prestige.v1.json.bak 백업 + prestige_season<N>_pre_migrate.jsondry-run §6 + §2.5 복구 3단계중간 크래시 시 복구 불가파일 시스템 검증 (file exists)
4PlayerPrestigeState.MigrateSeasonalToPermanent(retainRatio) 호출Sp02 W2 §4.3 의사코드—PP 전후 비교 (Round 정수 검증)
5 (v1.1 위치 변경)Tier 70 어픽스 영구 보유 분기 (R-V2.3-01 PD 옵션 a 락) = if (affixId == TIER_70_SEASON_AFFIX) Skip(retain50) 1줄 = PlayerWalletState.RetainAffixForNextSeason() 호출 시 Tier 70 어픽스만 retain50 적용 X / 100% 잔존v2.4 시놉 §4.3 + 어픽스 풀 v1.3 정합 + R-V2.3-01 PD 옵션 (a) 영구 보유 락 (2026-05-03)미처리 시 Tier 70 어픽스가 50% retain 으로 처리됨 → PD 결정 옵션 (a) 영구 보유 위배 → 유저 결제 보상 -50% 즉시 손실시즌 종료 후 Tier 70 어픽스 인벤토리 100% 잔존 검증 + 다음 시즌 시작 시 보유 상태 유지 검증
6 (v1.0 → v1.1 순서 변경)OnSeasonEndMigrationCompleted 이벤트 발화 + SeasonEndModal UI 트리거 + maxFloor 스냅샷 저장 + MilestoneGranter.ResetForNewSeason()dry-run §6 + Q3 C안 (스냅샷 보존)UI 없이 PP 반토막 → 유저 혼란이벤트 1건 + UI 모달 활성 + maxFloor 0 리셋 검증

v1.1 변경 사유 (R-V2.3-01 PD 결정 락):

2.3 Round 정수 나눗셈 + MythicEssence 음수 보호 (dry-run §11 R-DR-S03 가드)

// PlayerPrestigeState.MigrateSeasonalToPermanent(float retainRatio = 0.5f)
public void MigrateSeasonalToPermanent(float retainRatio) {
  // ... (1~3 순서) ...

  // Step 4: Round 정수 연산 강제 (Q6 결정 = B Round)
  long seasonalTotal = SeasonalPp + Σ slot.investedPp where channel=Seasonal;
  long convertedPermanent = (seasonalTotal * 50L) / 100L;  // (long * 50) / 100 = Round 자연 처리

  // 음수 보호 (R-DR-S03)
  if (convertedPermanent < 0L) {
    Debug.LogError($"[Season] Migrate convertedPermanent < 0: {convertedPermanent}, seasonalTotal={seasonalTotal}");
    convertedPermanent = 0L;  // Fail-safe = 0 로 처리, throw 안 함 (유저 PP 보호 우선)
  }

  PermanentPp += convertedPermanent;
  SeasonalPp = 0L;
  RemoveAll(s => s.channel == Seasonal);
}

// PlayerWalletState.RetainMythicEssenceForNextSeason(float retainRatio = 0.5f)
public void RetainMythicEssenceForNextSeason(float retainRatio) {
  long retained = (MythicEssence * 50L) / 100L;
  if (retained < 0L) {
    Debug.LogError($"[Season] MythicEssence retain < 0: {retained}");
    retained = 0L;
  }
  MythicEssence = retained;
}

// v1.1 신규 — R-V2.3-01 PD 옵션 (a) 영구 보유 락 (2026-05-03)
// PlayerWalletState.RetainAffixForNextSeason(string affixId, float retainRatio = 0.5f)
public void RetainAffixForNextSeason(string affixId, float retainRatio) {
  // R-V2.3-01 PD 옵션 (a) 영구 보유 분기 — Tier 70 어픽스만 retain 예외 처리
  if (affixId == TIER_70_SEASON_AFFIX) {
    // Skip(retain50) — 100% 잔존 (시즌 1회 영구 보유, 다음 시즌엔 다른 어픽스 로테이션)
    return;
  }

  // 기본 50% retain (다른 어픽스)
  // ... (생략) ...
}

R-DR-S03 가드 4건:

  1. (long * 50L) / 100L 정수 연산 강제 → 부동소수 오차 0% (1 PP 단위 누적 오차 차단)
  2. 음수 검출 시 Debug.LogError + 0L Fail-safe (throw 안 함, 유저 PP 보호)
  3. retainRatio 파라미터 = 0.5f 기본값 + 향후 시즌별 조정 가능 (시즌 6+ 운영 레버)
  4. T13 통합 테스트 = SeasonalPp = 100 → Permanent +50 / SeasonalPp = 101 → Permanent +50 (Round 50.5 → 50 정수 잘림, Q6 B Round 정합) + Tier 70 어픽스 영구 보유 검증 (v1.1 신규) = 시즌 종료 후 인벤토리 100% 잔존 / 다음 시즌 시작 시 보유 유지

2.4 ILeaderboardRepository 추상화 (dry-run §5.2 그대로)

namespace GodBlade.Runtime.Season {
  public interface ILeaderboardRepository {
    System.Threading.Tasks.Task<bool> SubmitAsync(SeasonLeaderboardEntry entry);
    System.Threading.Tasks.Task<System.Collections.Generic.IReadOnlyList<SeasonLeaderboardEntry>>
      GetTopAsync(string seasonId, int limit);
    System.Threading.Tasks.Task<SeasonLeaderboardEntry?> GetMyEntryAsync(string seasonId, string playerId);
  }

  // Sp05 W1 T5 구현 3종
  public sealed class LocalLeaderboardRepository : ILeaderboardRepository { /* JSON */ }      // 항상 동작 (fallback)
  public sealed class InMemoryLeaderboardRepository : ILeaderboardRepository { /* Edit-mode */ }
  public sealed class FirestoreLeaderboardRepository : ILeaderboardRepository { /* orderBy+limit */ } // Firebase 의존
}

T5 합/불합 판정:

  1. Interface 3 메서드 모두 정의 (Submit / GetTop / GetMyEntry)
  2. 3 구현 모두 컴파일 성공 (Local / InMemory / Firestore)
  3. CP-M27 = Firebase 초기화 실패 시 자동 fallback → LocalLeaderboardRepository 사용 (NRE 0건)
  4. Sp06+ 주간 이벤트 (project_sp06_plus_lever_decisions.md) ILeaderboardRepository 동일 인터페이스 재투입 가능

3. 회귀 가드 (드라이런 R-DR-S01 / S02 / S03 사전 정렬)

3.1 R-DR-S01 가드 [High] (Firebase 첫 도입 러닝커브)

참조: dry-run §9.2 R-DR-S01 + 메모리 feedback_codelead_review_compile_verify.md 위험: Firebase SDK 통합 3h 예산 낙관적. 실제 8~12h 가능 → Sp05 W1 블로킹
#가드 항목시행 시점책임비고
G-S01.1T4 하드 캡 6h 명시 = PR 본문 템플릿 (dry-run §9.2 A2)T4 착수 시code-lead6h 초과 시 T5·T11 Firebase 부분 Sp06 이월
G-S01.2LocalLeaderboardRepository fallback 경로 = Firebase 초기화 실패와 무관하게 독립 동작 (CP-M27)T5 종료 시code-leadNRE 0건 보장
G-S01.3Phase P1~P4 분해 = 각 단계 하드 타임박스 (1.5h / 1h / 1.5h / 2h)T4 진행 중code-leaddry-run §3 P1~P4 분해 그대로
G-S01.4google-services.json (Android) / GoogleService-Info.plist (iOS) 배치 검증 = T4 P1 완료 조건T4 P1 종료 시code-lead누락 시 Auth 실패 NRE 직결

FAIL 시 분기:

3.2 R-DR-S02 가드 [Critical] (5+1 사이드이펙트 순서 위반)

참조: dry-run §6 5순서 + §7 S2 Critical 위험: 순서 뒤집힘 = PP 영구 유실 또는 Seasonal/Permanent 비율 위반
#가드 항목시행 시점책임비고
G-S02.1T3 P3 = 5+1 사이드이펙트 순서 배선 코드 리뷰T3 P3 종료 시code-lead§2.2 표 6건 순서 일치 검증
G-S02.2seasonEnding=true 플래그 선행 저장 = Step 1 (CP-M25 이중 발화 차단)T3 P2code-lead2회 호출 = 2차 early return 검증
G-S02.3IdleTicker.FlushCatchUp(forceImmediate=true) 선행 = Step 2 (CP-M26 순서 검증)T3 P3code-leadMock 시퀀스 = FlushCatchUp 호출 후 백업 호출
G-S02.4T13 통합 테스트 = §2.2 표 6건 모두 Edit-mode 검증 (6번째 = Tier 70 영구 보유 정상 동작 1건 포함)T13game-designer + code-lead6건 PASS = R-DR-S02 회귀 차단
G-S02.5Step 5 (v1.1 위치 변경) = R-V2.3-01 PD 옵션 (a) 영구 보유 락 분기 = Tier 70 9,860원 박자 Legendary 어픽스 retain 예외 처리 코드 분기T12code-leadPD 결정 옵션 (a) 영구 보유 동작 검증 + 다음 시즌 보유 유지 검증

FAIL 시 분기:

3.3 R-DR-S03 가드 [Medium] (Round 정수 나눗셈 + 음수 보호)

참조: dry-run §11 R-DR-S03 + §11 정수 연산 강제 위험: (total * 50f) / 100f 부동소수 사용 시 1 PP 단위 누적 오차 / 음수 발생 시 throw
#가드 항목시행 시점책임비고
G-S03.1MigrateSeasonalToPermanent 본문 = (long * 50L) / 100L 정수 연산만 (float / double 금지)T3 P4code-leadgrep 검증 = float 키워드 0건
G-S03.2음수 검출 = Debug.LogError + 0L Fail-safe (throw 안 함)T3 P4code-lead유저 PP 보호 우선 (시스템 손해 0)
G-S03.3PlayerWalletState.RetainMythicEssenceForNextSeason 동일 정수 연산 + 음수 보호T9code-leadT3 P4 패턴 답습
G-S03.4T13 통합 테스트 = SeasonalPp 0 / 1 / 100 / 101 / Long.MaxValue / -1 (강제 주입) 6 케이스 검증T13game-designer + code-lead음수 케이스 = 0L 수렴 검증

FAIL 시 분기:


4. 변동 흡수

4.1 시놉 v2.4 신규 5건 흡수 영향 평가

시놉 v2.4 변경흡수 영향 (Sp05 시스템)처리
D-2.10 W7 유교 드래곤 재등장 (v2.3)시즌 패스 Tier 75 매핑 신규 (T6 §1.4)T6 산출 정합 검증
D-2.11 Tier 75 슬레이어 스킨 (v2.3)시즌 패스 Tier 75 매핑 신규 (T6 §1.4)T6 산출 정합 검증
D-2.12 Tier 60 어픽스 보상 (v2.3)시즌 패스 Tier 60 매핑 신규 + 어픽스 풀 v1.3 G-3.6 정합 (T6 §1.4)T6 산출 정합 검증
D-2.13 38화 비단 결계 키 (v2.3)Sp05 영향 0% (시놉 본문 갱신만, 시즌 시험 매핑은 Sp06+ 시즌 시험 시스템)흡수 0h
D-2.14 49화 청천 등장 (v2.3)Sp05 영향 0% (NPC 자산만, 시즌 시스템 미영향)흡수 0h
D-2.9 35화 광복동 시간선 (v2.3)Sp05 영향 0% (시놉 본문만)흡수 0h
D-2.15 Tier 70 영구 보유 정정 (v2.4 신규, R-V2.3-01 PD 옵션 a 락)Sp05 W2 T12 코드 분기 1줄 + T13 통합 테스트 6번째 1건 + T6 TSV permanent_retain_flag 컬럼 추가흡수 0.5h (T12) + 0h (T13 통합 테스트는 기존 0.5h 내 흡수) + 0h (T6 TSV 컬럼 추가는 기존 1.0h 내 흡수)

총 흡수 부하: T6 1.0h + T12 0.5h + T13 0.5h = 2.0h (v1.0 동일, v1.1 추가 부하 0h). D-56 시점 즉시 흡수로 D-7 시점 부하 감소 입증.

4.2 R-V2.3-01 PD 결정 락 (2026-05-03) — 옵션 (a) 영구 보유 채택

상태: ✅ PD 락 (2026-05-03) 결정 사유: 시놉 v2.3 Tier 70 9,860원 박자 Legendary "시즌 한정" vs 7결정 Q7 50% retain 정책 충돌 → PD 옵션 (a) 영구 보유 채택

4안 결과 표 (PD 결정 락):

안처리장점단점ARPU 영향박세린 평가PD 결정
(a)영구 보유 (다음 시즌도 사용) + X1 변형 = 다음 시즌엔 다른 어픽스 보상 로테이션유저 만족 + 시즌별 어픽스 다양성 = 시즌 패스 매력 유지 (X1 안)"시즌 한정" 약속 위배 → 마케팅 신뢰 손실 가능+0% (단기) / -10% (장기, 시즌 한정 ARPU 모델 약화)❌ 비권장 (단 PD 결정 존중)✅ PD 락 (2026-05-03)
(b)삭제 (시즌 종료 시 인벤토리 회수)"시즌 한정" 약속 정확 = 디아4 시그니처 톤 + 마케팅 신뢰유저 단기 불만 가능+15% (시즌 한정 ARPU 모델 정합)✅ 권장 1순위 (폐기)❌ 폐기
(c)50% retain (다른 어픽스와 동일 정책)Q7 정책 일관성"시즌 한정" 약속 위배-5%❌ 비권장 (폐기)❌ 폐기
(d)MythicEssence 환원 (어픽스 삭제 + Essence 1회분 환원)유저 보상 + "시즌 한정" 약속 정확MythicEssence 인플레 약간+10% (보상 톤 OK + ARPU 보존)✅ 권장 2순위 (폐기)❌ 폐기

박세린 비권장 사유 (1줄):

ARPU 모니터링 트리거 (필수):

4.3 차기 16~17화 도착 시 추가 어픽스 후보 영향 평가

화도착 추정어픽스 추가 가능성Sp05 시즌 패스 영향
16화 (폐사찰 진입)2026-05-09Low (환경 묘사 위주)0건 추정
17화 (99 글리치)2026-05-16Low~Medium (S-3 가능성 = AFX_34 트리거 조건 변형)AFX_34 변형 = Tier 70 매핑 변경 가능성 (R-V2.3-01 PD 락 후 영향 재평가 = 영구 보유 정책은 유지, 트리거 조건만 변경 가능)

Sp05 영향: 차기 16~17화 도착 = 5/9~5/16 = D-44~D-37 시점. T6 시즌 패스 매핑 표 = D-7 (6/22) 시점 작성 = 5주 여유 = 차기 16~17화 도착 후 흡수 충분 가능. 추가 어픽스 1건 시 Tier 매핑 1건 추가 = T6 부하 +0.2h 추정 (전체 부하 미영향).


5. D-Day 체크리스트 (D-7 본격 착수 시 PRINT-AND-CHECK 양식, 게이트 16/16)

사용법: 2026-06-22 (D-7) 책상에 출력. 항목별 체크박스 표시. GO/NO-GO 표 1행 작성.

5.1 W1 게이트 (T1~T6 = 6건)

[ ] G-W1.1 (T1) : SeasonConfigSO + ISeasonClock + ManualSeasonClock 정의
              → 검증: ISeasonClock 5 멤버 / ManualSeasonClock(SeasonConfigSO, ITimeProvider) 생성자
              → FAIL 시 §1.2 시그니처 표 재참조 (15분)

[ ] G-W1.2 (T2) : PrestigeSaveDto_V2 + Migrate v1→v2 스위치
              → 검증: schemaVersion=2 / lastMigratedSeasonId / currentSeasonId / seasonStartUnixMs 3 신규 필드
              → FAIL 시 CP-M24 재참조 + Tests.Editor v1 JSON 하드코딩 라운드트립 추가

[ ] G-W1.3 (T3) : SeasonController + OnSeasonEnd 발화자 + 5+1 순서 배선
              → 검증: §2.2 표 6건 순서 일치 + CP-M25 이중 발화 차단 + CP-M26 호출 순서
              → FAIL 시 §3.2 R-DR-S02 가드 절차 (즉시 PR 차단)

[ ] G-W1.4 (T4) : Firebase SDK 통합 + Auth + Firestore 초기화 (하드 캡 6h)
              → 검증: P1~P4 단계별 타임박스 통과 + Ping read/write 성공
              → FAIL 시 §3.1 R-DR-S01 가드 절차 (T5 스켈레톤만 유지)

[ ] G-W1.5 (T5) : ILeaderboardRepository + 3 구현 (Local / InMemory / Firestore)
              → 검증: 3 구현 컴파일 성공 + CP-M27 fallback NRE 0건
              → FAIL 시 §2.4 시그니처 재참조

[ ] G-W1.6 (T6, v1.1 갱신) : 시즌 패스 30 Tier 매핑 표 + season_pass_s2.tsv 신설 + Tier 70 permanent_retain_flag 컬럼
              → 검증: 9 Tier 정의 (Tier 60 / Tier 75 v2.3 + Tier 70 v2.4 영구 보유 락 표기 포함) + 어픽스 풀 v1.3 정합 + R-V2.3-01 PD 락 표시 + permanent_retain_flag = true (Tier 70 행)
              → FAIL 시 §1.4 매핑 표 재참조 + §4.2 R-V2.3-01 PD 결정 락 표 재참조

5.2 W2 게이트 (T7~T13 = 7건)

[ ] G-W2.1 (T7) : SetItemCatalogSO + SetItemImporter + SetEffectEvaluator
              → 검증: TSV→SO Importer + 장비 변경 이벤트 구독 + Dictionary 비직렬화 (CP-M09)
              → FAIL 시 dry-run §1 W2 T6 재참조

[ ] G-W2.2 (T8) : IMythicConstraint + NoDuplicateSlotConstraint + equip() validator
              → 검증: equip() 훅 = Mythic 중복 슬롯 차단 + EquipResult.Blocked(reason) 반환
              → FAIL 시 sprint-05-research §4.3 재참조

[ ] G-W2.3 (T9) : PlayerWalletState + MythicEssence(long) + 50% retain
              → 검증: 시즌 종료 시 MythicEssence × 50L / 100L = 정수 retain (R-DR-S03 G-S03.3)
              → FAIL 시 §2.3 정수 연산 패턴 재참조

[ ] G-W2.4 (T10) : SeasonEndModal UI + OnSeasonEndMigrationCompleted 구독
              → 검증: 이벤트 수신 + PP 전후 비교 표시 + "확인" 버튼 닫힘
              → FAIL 시 sprint-05-research §3.5 재참조

[ ] G-W2.5 (T11) : Smoke Test 전체 루프 (Force End → Migrate → 리더보드 제출 → 모달 → v2.json)
              → 검증: Editor Play Mode 6 단계 (dry-run §4 P1~P6) 모두 통과
              → FAIL 시 R-DR-S01 / S02 / S03 가드 재실행

[ ] G-W2.6 (T12, v1.1 갱신) : R-V2.3-01 PD 옵션 (a) 영구 보유 락 반영 = Tier 70 retain 예외 처리 분기
              → 검증: `if (affixId == TIER_70_SEASON_AFFIX) Skip(retain50)` 1줄 동작 + Edit-mode 케이스 검증 = 시즌 종료 후 Tier 70 어픽스 인벤토리 100% 잔존
              → FAIL 시 §4.2 PD 결정 락 표 재참조 + 1줄 분기 정정 (15분)

[ ] G-W2.7 (T13, v1.1 갱신) : MigrateSeasonalToPermanent 5+1 사이드이펙트 통합 테스트 (§2.2 표 6건, 6번째 = Tier 70 영구 보유 정상 동작 1건 포함)
              → 검증: 6건 모두 Edit-mode PASS + 음수 케이스 (-1) = 0L Fail-safe 검증 + Tier 70 어픽스 다음 시즌 시작 시 보유 유지 검증
              → FAIL 시 §3.2 R-DR-S02 가드 절차 + §3.3 R-DR-S03 가드 절차

5.3 R-DR 회귀 가드 게이트 (R-DR-S01 / S02 / S03 = 3건)

[ ] G-R-DR.S01 : Firebase 첫 도입 러닝커브 가드
              → 검증: G-S01.1 (하드 캡 6h) + G-S01.2 (fallback NRE 0건) + G-S01.4 (SDK 파일 배치)
              → FAIL 시 §3.1 분기 (T5 스켈레톤만 + Firestore 부분 Sp06 이월)

[ ] G-R-DR.S02 : 5+1 사이드이펙트 순서 위반 가드 (Critical)
              → 검증: G-S02.1 (코드 리뷰) + G-S02.4 (T13 통합 테스트 6건) + G-S02.5 (R-V2.3-01 PD 옵션 a 분기)
              → FAIL 시 §3.2 분기 (즉시 PR 차단 + T3 P3 재작업)

[ ] G-R-DR.S03 : Round 정수 나눗셈 + 음수 보호 가드
              → 검증: G-S03.1 (float 0건) + G-S03.2 (Fail-safe 0L) + G-S03.4 (T13 6 케이스)
              → FAIL 시 §3.3 분기 (정정 15~30분)

5.4 GO/NO-GO 의사결정 표

+----------------------------------------------------------+
|  Sp05 W1·W2 GO/NO-GO 의사결정 (D-7 ~ D-1, 2026-06-22~28) |
+----------------------------------------------------------+
| 일자       | 게이트 통과 | 비고                          |
| 2026-06-22 | __/6 W1     | (G-W1.1~6, T6 신규 게이트 포함)|
| 2026-06-23 | __/7 W2     | (G-W2.1~7, T12·T13 신규 포함) |
| 2026-06-24 | __/3 R-DR   | (G-R-DR.S01·S02·S03)         |
| 2026-06-25 | (변동 흡수) | (시놉 v2.4 추가 변동 확인)     |
| 2026-06-26 | (재시뮬)    | (FAIL 발생 시)                |
| 2026-06-27 | (PD 보고)   | (W1·W2 종합 보고)             |
| 2026-06-28 | (D-1 마감)  | code-lead B1 실측              |
+----------------------------------------------------------+
| 최종 결정  | [ ] GO     [ ] NO-GO     [ ] 재검토 PD 호출 |
| 결정자     | PD                                          |
| 결정일     | 2026-06-28 18시                             |
+----------------------------------------------------------+

GO 조건: G-W1.1~6 (6/6) + G-W2.1~7 (7/7) + G-R-DR.S01·S02·S03 (3/3) = 16/16 통과 NO-GO 조건: 1건 이상 FAIL 잔존 + §1~§3 분기 절차 미완료 재검토 PD 호출 조건: G-S01.1 (Firebase 6h 초과)

5.5 R-V2.3-01 게이트 (v1.1 갱신 = 해소됨)

[v1.0 → v1.1 변경] R-V2.3-01 PD 결정 게이트 = 해소됨 (2026-05-03 PD 옵션 (a) 영구 보유 락)
   → v1.0: 4안 중 1안 채택 마감 = 2026-06-28 (D-1) 18시 → 박세린 default = (b) 삭제
   → v1.1: PD 결정 락 (옵션 (a) 영구 보유) = D-1 마감 게이트 X
   → T12 코드 분기 = `if (affixId == TIER_70_SEASON_AFFIX) Skip(retain50)` 1줄 + 다음 시즌 다른 어픽스 로테이션 (X1 안)
   → 박세린 비권장 안이었으나 PD 결정 존중. ARPU 모니터링 트리거 = 출시 후 6개월 시점 (game-designer 후속 발주)

6. 의존성·블로커

6.1 Sp04 종료 = 6/29 (Sp05 킥오프 직전)

의존마감책임Sp05 영향상태
Sp04 종료 = 어픽스 풀 v1.3 36어픽스 락 + Calculator 시그니처 락 + 200F 약 4.20배 검증2026-06-28 (Sp04 D+14)code-lead + game-designerT6 시즌 패스 매핑 = 어픽스 풀 v1.3 G-3.1~G-3.6 6건 정합 검증Sp04 진행 중 (D-37 시점)
Sp03 IdleTicker.FlushCatchUp(forceImmediate=true) 파라미터 도착2026-06-14 (Sp03 D+14)code-leadT3 P3 5+1 Step 2 = FlushCatchUp 호출 의존Sp03 진행 중
Sp02 W2 PlayerPrestigeState.MigrateSeasonalToPermanent(float) 시그니처 머지2026-05-31 (Sp02 W2 회고)code-leadT3 P4 = MigrateSeasonalToPermanent 호출 의존Sp02 W2 진행 중

의존 그래프:

Sp02 W2 (5/31) ───> Sp03 (6/14) ───> Sp04 (6/28) ───> Sp05 W1 킥오프 (6/29)
       │                  │                  │
       ▼                  ▼                  ▼
   Migrate(float)    FlushCatchUp(bool)  affix_pool v1.3
                                          + Calculator

6.2 어픽스 v1.3 36어픽스 정합 (Tier 매핑 9건)

어픽스 ID시즌 패스 Tier정합 검증상태
AFX_31 (5cm 어긋남)Tier 30 RareT6 §1.4 ✅Sp04 W1 락 예정
AFX_32 (작두 박자)Tier 15 MagicT6 §1.4 ✅Sp04 W1 락 예정
AFX_33 (60fps 풀스로틀)Tier 50 EpicT6 §1.4 ✅Sp04 W1 락 예정
AFX_34 (9,860원의 박자)Tier 70 Legendary (영구 보유, R-V2.3-01 PD 옵션 a 락)T6 §1.4 ✅ + R-V2.3-01 락PD 결정 락 (2026-05-03 옵션 a 영구 보유)
AFX_35 (Veil of Dangun)Tier 90 액세서리 스킨T6 §1.4 ✅Sp04 W1 락 예정
AFX_36 (오방위의 도(道))Tier 60 RareT6 §1.4 ✅Sp04 W1 락 예정 (v1.3 신규)

정합 게이트: T6 산출물 = 9 Tier × 6 컬럼 TSV (v1.1: permanent_retain_flag 컬럼 신규). 6 어픽스 매핑 + 3 비-어픽스 매핑 (Tier 5 PDA 스킨 / Tier 75 슬레이어 스킨 / Tier 100 NPC 호감도). Tier 70 행: permanent_retain_flag = true (v2.4 정정).

6.3 시놉 v2.4 ↔ Sp05 직접 영향 5건

시놉 v2.4Sp05 영향흡수 시점
D-2.10 W7 유교 드래곤 재등장 (v2.3)Tier 75 매핑 신규 (T6)D-57 ✅ 흡수 완료
D-2.11 Tier 75 슬레이어 스킨 (v2.3)Tier 75 매핑 신규 (T6)D-57 ✅ 흡수 완료
D-2.12 Tier 60 어픽스 보상 (v2.3)Tier 60 매핑 신규 + AFX_36 정합 (T6)D-57 ✅ 흡수 완료
D-2.15 Tier 70 영구 보유 정정 (v2.4 신규, R-V2.3-01 PD 옵션 a 락)5+1 사이드이펙트 Step 5 분기 (T12) + permanent_retain_flag (T6) + 통합 테스트 6번째 (T13)D-56 ✅ 흡수 완료 (PD 결정 2026-05-03)

6.4 Firebase Phase 5+ 위임 (T4 하드 캡 6h)

Sp05 도입 범위 (최소):

Sp05 도입 범위 외 (Phase 5+ 이월):

T4 하드 캡 6h 초과 시 cascade 이월:

  1. T5 FirestoreLeaderboardRepository 스켈레톤만 유지 (실 Firebase write는 Sp06)
  2. T11 Smoke Test = LocalLeaderboardRepository 만 검증 (Firestore 부분 skip)
  3. Sp05 W2 잔여 시간 = T6·T12·T13 신규 작업에 재배치

6.5 블로커 시나리오 (PD 에스컬레이션 트리거)

#블로커트리거에스컬레이션 마감대응
B-1T4 Firebase 통합 6h 초과T4 진행 중즉시 (1h 내)code-lead 책임 = §3.1 cascade 이월
B-2 R-V2.3-01 PD 결정 미결D-1 = 6/28 18시즉시 (D-1 마감)v1.1 해소 (2026-05-03 PD 옵션 (a) 영구 보유 락)
B-3Sp02 W2 / Sp03 / Sp04 의존 시그니처 미도착각 회고일즉시 (1h 내)code-lead B1 실측 + 미도착 시 PR 1건 선행
B-4T13 통합 테스트 6건 중 1건 FAILT13 종료 시즉시 (1h 내)game-designer 에스컬레이션 + 5+1 표 재검증
B-5Sp04 종료 지연 → Sp05 킥오프 영향Sp04 D+14 (6/28)Sp04 D+14 시점PM 책임 (PM 보고 의존)
B-6 (v1.1 신규)출시 후 6개월 시점 시즌 패스 conversion 30% 이하 (벤치 -5% 이상 하락)2028-07 시점 (Phase 7 Live Ops)즉시 (월 단위 분석)game-designer 박세린 책임 = Tier 70 보상 정책 재검토 / 시즌 패스 가격 조정 / 마케팅 캠페인 발주 (R-V2.3-01 PD 옵션 a ARPU 모니터링 트리거)

박세린 책임 범위: B-4 / B-6 (game-designer 영역) / B-1·B-3 = code-lead 책임 / B-5 = PM 책임 (단순 보고). B-2 = v1.1 해소.


7. 변경 이력

version일자변경책임
1.02026-05-02D-57 시점 신규 작성. Sp04 preflight v1.2 패턴 답습. 7 섹션. T6·T12·T13 신규 게이트 3건 추가 (Tier 매핑 + R-V2.3-01 분기 + 5+1 통합 테스트). 시놉 v2.3 신규 4건 흡수 + R-V2.3-01 신규 발견 PD 결정 카드 (4안 중 박세린 권고 = (b) 삭제 / (d) MythicEssence 환원).박세린
1.12026-05-03R-V2.3-01 PD 결정 락 흡수 = 옵션 (a) 영구 보유 채택. 5 항목 갱신: §0 한 줄 맥락 / §2.2 5+1 표 6번째 사이드이펙트 (Tier 70 영구 보유 retain 예외 처리, Step 5 위치 변경) / §4.2 PD 결정 락 표 (4안 중 (a) 채택 + 박세린 비권장 사유 + ARPU 모니터링 트리거 출시 후 6개월) / §5.1 D-Day 게이트 16/16 갱신 (T13 통합 테스트 6건 = 5+1 모두 + 6번째 Tier 70 영구 보유 정상 동작) / §5.5 R-V2.3-01 결정 게이트 해소 (D-1 6/28 마감 게이트 X) + §6.5 B-2 해소 + B-6 신규 (출시 후 6개월 시점 ARPU 모니터링 트리거). 시놉 v2.3 → v2.4 정정 발주 (§4.3 Tier 70 X1 안 = 시즌 1회 영구 보유, 다음 시즌엔 다른 어픽스 보상). 박세린 비권장 안이었으나 PD 결정 존중. T6 TSV 컬럼 = permanent_retain_flag 신규 추가.박세린
1.2 (예정)D-30 (2026-05-30)Sp02 W2 회고 후 시그니처 실측 결과 반영박세린
1.3 (예정)D-15 (2026-06-14)Sp03 IdleTicker.FlushCatchUp 파라미터 실측 결과 반영박세린
1.4 (예정)D-7 (2026-06-22)본격 착수 직전 점검 (Sp04 종료 직전 어픽스 v1.3 락 + Calculator 시그니처 락 검증)박세린
1.5 (예정)D-1 (2026-06-28)Sp04 종료 결과 흡수 + 16/16 게이트 PRINT-AND-CHECK 최종 점검박세린

(끝, v1.1 2026-05-03 박세린)