Sp03 IdleSystem Preflight — D-7 본격 착수 절차서
작성: 2026-05-02 박세린 (game-designer) version: 1.1 (R-DR-S03-Sp03 옵션 (a) 등급만 PD 락 / 2026-05-03) 대상 D-Day: 2026-05-25 (Sp03 킥오프 D-7) 본격 착수 마감: 2026-05-31 (Sp03 킥오프 D-1, Sp02 W2 종료일) 정식 킥오프: 2026-06-01 입력 자료: -designs/sprint-03-idle-research.mdv1.0 APPROVED (5 결정 + CP-I1~I11 + 10 TodoWrite + 13.25h 예산) -designs/prestige_items_README.mdv1.0 APPROVED (Q2 = 24h 기본 / Lv당 +2h / 소프트캡 Lv5 → 34h) -designs/prestige_system_spec.md(§3.2 PP 수식 =maxStage × 0.05 PP/hour) -designs/affix_pool_sp04_supplement_v1.mdv1.3 (36어픽스 정식 락 — Sp03 방치 영향 0) -sprints/sprint-03-dry-run-2026-04-21.mdv1.0 (R-DR-07/08/09 + A1~A5 사전 완화 5건) - 메모리:project_sprint03_idle_research.md(5 결정) /project_sprint04_affix_pool.mdv1.1 (36어픽스) /project_phase2_dryrun_risks.md(R-DR-07/10/11) - 메모리:feedback_writer_collaboration_protocol.md(강시연 1주 2화 / 16~17화 도착 5/9~5/16) 목적: Sp03 W1 / W2 본격 착수 시 즉시 가동 가능한 절차서. PRINT-AND-CHECK 양식 + 회귀 가드 (R-DR-07 [High] 차단) + 강시연 IP 변동 흡수 (Sp03 영향 매우 Low) + D-Day 체크리스트 (게이트 11/11) + 의존성·블로커. Sp04 preflight v1.2 § 4.4 패턴 = 도착 즉시 흡수 적용 시 D-7 부하 1/3 감소 입증 답습.
0. 한 줄 맥락
Sp02 W2 종료 (2026-05-31, PrestigePpAccumulator + GetIdleCapHours 헬퍼 머지) 직후 → Sp03 W1 #01~#05 IdleTicker MonoBehaviour + 옵션 C 하이브리드 Calculator + JSON 저장 + W2 #06~#10 (PP 실배선 + 발화 순서 + 테스트 7건 + Smoke 10h=50PP) 본격 착수 절차서. 2026-05-25 (D-7) 시점 game-designer 가 책상에 펴 놓고 즉시 가동 가능한 절차서 + 회귀 가드 + IP 변동 흡수 (Sp03 영향 0~Low) + D-Day 체크리스트 (게이트 11/11) + 의존성·블로커. 즉시 흡수 패턴 적용 = 강시연 11~14화 영향 0건 (방치 시스템은 어픽스 풀 의존도 Sp04+ 이월) → D-7 시점 부하 0h 유지. v1.1 갱신 = PD R-DR-S03-Sp03 옵션 (a) 등급만 락 (2026-05-03) — Sp03 부담 0h, Sp04 W2 인벤토리 도입과 함께 일괄 양식 확장.
1. W1 절차서 — IdleTicker 인프라 + 온라인 틱 (#01~#05)
1.1 작업 개요 (예상 소요, idle-research v1.0 §7 W1 그대로)
| # | 작업 | 예상 소요 | 산출 |
|---|---|---|---|
| #01 | GodBlade.Runtime.Idle 네임스페이스 + IdleConstants.cs + IdleRewardBundle.cs struct | 0.75h | 3 파일 |
| #02 | IdleSaveSchema.cs DTO + IdleSaveService.cs Save/Load/Migrate (account/<accountId>/idle.v1.json) | 1.5h | 2 파일 + JSON 회로 |
| #03 | IdleRewardCalculator.cs 옵션 C Phase 1 (Bulk 집계 공식) | 2h | Bulk 메서드 |
| #04 | IdleRewardCalculator.cs Phase 2 (Tail 3,600초 리플레이) + RNG 시드 결정론 | 1.5h | Tail 메서드 + 결정론 가드 |
| #05 | IdleTicker.cs MonoBehaviour + OnApplicationPause 훅 + singleton + DontDestroyOnLoad | 1.5h | MonoBehaviour 1 파일 |
| 합계 | 7.25h | W1 5 파일 |
1.2 IdleRewardCalculator.Calculate 시그니처 (확정, idle-research v1.0 §4.2 답습)
namespace GodBlade.Runtime.Idle {
public static class IdleRewardCalculator {
public static IdleRewardBundle Calculate(
long elapsedSec, // DateTime 차 (cap 적용 전 입력)
int maxFloor, // 현재 최고 도달층 (Q3 = 고정, 자동 진행 X)
DropRateTableSO drop, // Sp01 W2 자산
MilestoneRewardCatalogSO milestone, // Sp01 W2 자산
in PrestigeCalculator.BuildSummary prestigeBonus, // Sp02 W2 자산
int idleCapHours, // PrestigeCalculator.GetIdleCapHours(state) 헬퍼 산출 (24~34h)
uint rngSeed); // 결정론 재현 시드
// 내부 = §2.4 옵션 C 하이브리드:
// cappedSec = min(elapsedSec, idleCapHours * 3600)
// if cappedSec > 3600: bulkBundle = AggregateFormula(cappedSec - 3600, ...)
// tailBundle = ReplayEvents(min(cappedSec, 3600), ..., new System.Random(rngSeed))
// return IdleRewardBundle.Combine(in bulkBundle, in tailBundle);
}
}
시그니처 락 = Sp02 W2 BuildSummary 와 정합 필수 (§6.3 의존성).
1.3 입력 검증 항목 (#03~#04 게이트)
| # | 검증 항목 | 통과 기준 | 비고 |
|---|---|---|---|
| 1.3.1 | elapsedSec < 0 역전 가드 | elapsed = 0 처리 + Debug.LogWarning("[Idle] negative elapsed") | CP-I9 idle-research §9.2 |
| 1.3.2 | elapsedSec > 30 * 86400 30일 Warn | Debug.LogWarning("[Idle] elapsed > 30d, capping to idleCapHours") + cap 적용 후 정상 처리 | 치팅 부분 허용 (Phase 5 서버 시각 위임) |
| 1.3.3 | idleCapHours 범위 24 ≤ x ≤ 34 | TSV prestige_items.tsv #25 = 24 + 2 × min(level, 5) 범위 | Q2 결정 = TSV 그대로 (idle-research §6 Q2-A) |
| 1.3.4 | maxFloor > 0 | 0 이하 = 즉시 return IdleRewardBundle.Empty | 신규 유저 진입 첫 1틱 가드 |
| 1.3.5 | prestigeBonus.IdleRateMul > 0 | NaN / Infinity / 음수 시 1.0f 폴백 + Debug.LogError | Sp02 W2 BuildSummary drift 방어 |
1.4 B04 100층 10h = PP 50 검증 양식 (CP-I4 idle-research §9.2 답습)
수식:prestige_system_spec.md§3.2(C)ppGained = floor((elapsedSec / 3600) × maxFloor × 0.05 × prestigeBonus.IdleRateMul)
입력 (Smoke Test #09 시뮬값, A4 사전 메모 = sprint-03-dry-run §0.3 A4):
elapsedSec = 36000 (10h)
maxFloor = 100
prestigeBonus.IdleRateMul = 1.0f (무투자)
idleCapHours = 24 (무투자, TSV #25 Lv0 기본)
cap 적용:
cappedSec = min(36000, 24 * 3600) = min(36000, 86400) = 36000 ✅ (cap 미적용)
PP 수식:
ppGained = floor((36000 / 3600) × 100 × 0.05 × 1.0)
= floor(10 × 100 × 0.05)
= floor(50.0)
= 50 ✅
기대값: Debug.Log("[Idle] +50 PP, elapsed=36000s") 출력
합/불합 판정:
- PASS:
ppGained == 50정확 일치 - FAIL: 49 또는 51 → 수식 검증 (
floorvsround혼동? 곱셈 순서?). Calculator 내부 수식 grep 1회
2. W2 절차서 — 통합 + 테스트 + Smoke (#06~#10)
2.1 작업 개요 (예상 소요, idle-research v1.0 §7 W2 그대로)
| # | 작업 | 예상 소요 | 산출 |
|---|---|---|---|
| #06 | PrestigePpAccumulator.GrantIdleDrip 실배선 + PlayerPrestigeState.AddPermanentPp 호출 | 0.75h | PP 적립 회로 |
| #07 | IdleTicker.FlushCatchUp 이벤트 발화 순서 (Milestones 배치 → Drops 로그 → PP 적립 → OnIdleReward) | 1.5h | 발화 순서 락 |
| #08 | Edit-mode 테스트 7건 (역전 / 캡 / 결정론 / 마일스톤 / Save 라운드트립 / PP 누적 / 30일 Warn) | 2h | IdleRewardCalculatorTests.cs + IdleTickerTests.cs |
| #09 | Smoke Test — 10h elapsed 시뮬 → PP ≈ 50 + Debug.Log 드롭 내역 1건+ | 0.75h | Smoke 통과 |
| #10 | §9 컴파일러 시뮬 11개 체크 + Unity Console 새 에러 0 + PR 머지 | 1h | PR 머지 |
| 합계 | 6.0h | W2 |
W1 + W2 합계 = 13.25h (1인 파트타임 11~15h 예산 내 + 회귀 버퍼 1.5~2h).
2.2 PP 자동 적립 발화 순서 (Q4 = A 자동, idle-research §4.5 답습)
IdleTicker.FlushCatchUp() 내부 순서 락 (CP-I7):
1. elapsed 계산 + cap 적용 + 역전 가드 (§1.3 5건)
2. IdleRewardCalculator.Calculate(...) → IdleRewardBundle
3. 배치 발화 (순서 절대 변경 금지):
a. bundle.MilestonesReached.ForEach(floor => MilestoneGranter.Award(floor))
└─ floor==100 시 PlayerPrestigeState.Unlock() 연쇄 (Sp02 W2 계약)
└─ floor==200 시 PrestigePpAccumulator.GrantMilestone(200) 연쇄
b. bundle.KillsTotal / DropsCompact → Debug.Log (Q5 = A 로그만, Sp03 인벤토리 미도입)
c. PrestigePpAccumulator.GrantIdleDrip(elapsed, maxFloor)
└─ 내부 = PlayerPrestigeState.AddPermanentPp(ppGained) 호출
d. OnIdleReward?.Invoke(bundle) // UI 알림 (보고용, 수령 절차 X)
4. IdleSaveService.Save() // lastTickUtc 갱신
불변식 (CP-I6): OnIdleReward 발화 시점엔 Milestones · Drops · PP 모두 이미 적용. UI 는 후처리 표시만. 이중 적립 금지.
2.3 Smoke Test #09 양식 (Q5 = A 드롭 로그만 / R-DR-S03-Sp03 옵션 (a) 등급만 PD 락 v1.1)
시뮬 입력 (하드코딩, A4 사전 메모):
elapsedSec = 36000
maxFloor = 100
prestigeBonus = BuildSummary.Default (IdleRateMul=1.0 / GoldMul=1.0 / ExpMul=1.0 / DropMul=1.0)
idleCapHours = 24
기대 출력 (Console, R-DR-S03-Sp03 옵션 (a) 등급만 PD 락 — Sp03 부담 0h):
[Idle] FlushCatchUp begin: elapsed=36000s, cap=86400s, capped=36000s
[Idle] Bulk: 32400s aggregated (36000 - 3600)
[Idle] Tail: 3600s replayed (rngSeed=1234, 3600 events)
[Idle] Drops: Common x12, Magic x4, Rare x1, Epic x0, Legendary x0, Mythic x0
[Idle] Milestones reached: (none, maxFloor 고정 = Q3-A)
[Idle] +50 PP, elapsed=36000s ✅ §1.4 검증
[Idle] Save flushed: account/test/idle.v1.json
합/불합 판정:
- PASS: ppGained == 50 + 드롭 로그 1건 이상 (Common~Mythic 합계 ≥ 1) + Save 정상
- FAIL: ppGained ≠ 50 → §1.4 수식 재검증
- FAIL: 드롭 로그 0건 → DropRateTableSO 60행 read-only 호출 경로 grep
- FAIL: Save 실패 → IdleSaveService.persistentDataPath 권한 + JSON 직렬화 회로 grep
3. 회귀 가드
3.1 R-DR-07 [High] 차단 게이트 (G-DR07.1~5, 하이브리드 결정론 실패)
참조:sprints/sprint-03-dry-run-2026-04-21.md§0.2 R-DR-07 [High] / 메모리project_phase2_dryrun_risks.md위험:IdleRewardCalculator.Calculate(elapsedSec, ..., rngSeed)가 동일 입력에서 에디터 vs 모바일 IL2CPP 다른 드롭 결과 → 테스트 #08 Edit Mode Green이어도 모바일 빌드 Red.
| # | 가드 항목 | 시행 시점 | 책임 | 비고 |
|---|---|---|---|---|
| G-DR07.1 | new System.Random(rngSeed) 명시 생성, UnityEngine.Random 금지 | #04 Tail 리플레이 작성 시 | code-lead | A2 사전 메모 1줄 |
| G-DR07.2 | DropRateTableSO._lookup Dictionary 순회 금지 → DropRateTableSO.rows List 인덱스 순 강제 | #04 작성 시 | code-lead | Dictionary 순회 = .NET Mono vs IL2CPP 비결정적 |
| G-DR07.3 | 동일 seed + 동일 입력 → 동일 출력 hardcoded assert | #08 테스트 | code-lead | "RNG 1234 + 10층 3600초 → 드롭 정확히 [Common × 12, Magic × 4, Rare × 1]" 식 정수 비교 |
| G-DR07.4 | PP 수식 단일성 — Bulk 와 Tail 의 PP 수식은 동일 함수 호출 (수식 두 벌 운영 금지) | #03 + #04 작성 시 | code-lead | idle-research §1.1 운영 원칙 답습 |
| G-DR07.5 | 모바일 IL2CPP 빌드 실측 검증 = Phase 3+ 이월 (Sp03 범위 외 명시) | #10 PR 머지 시 | code-lead | PR 본문 1줄 — "IL2CPP 실기 검증 Phase 3+" (CP-M22 답습) |
FAIL 시 분기:
- G-DR07.1·2 = 즉시 정정 (15분, A2 메모 grep 1회)
- G-DR07.3 = 테스트 7건 중 결정론 1건 Red → #04 코드 리뷰 + Dictionary 순회 grep
- G-DR07.4 = Bulk/Tail PP 함수 분리 발견 시 → 통합 메서드 추출 (30분)
- G-DR07.5 = Phase 3+ 이월 명시 PR 본문 누락 → PR 본문 정정 (5분)
3.2 기존 R-DR-10 / R-DR-11 정합 (Sp04 어픽스 풀 회귀 가드)
참조: Sp04 preflight v1.2 §3 (R-DR-10 [High] StackPolicy / R-DR-11 [High] 음수 차감) Sp03 영향: 방치 시스템은 어픽스 풀 의존도 0 (Sp04+ 이월). 단 PP 음수 차감 경로 1건 정합 필요.
| # | 가드 항목 | 시행 시점 | 책임 | 비고 |
|---|---|---|---|---|
| G-DR11.1 | PrestigePpAccumulator.GrantIdleDrip(elapsedSec, maxFloor) 출력 PP = 항상 양수 (ppGained ≥ 0) | #06 작성 시 | code-lead | floor() 결과가 0 이하면 AddPermanentPp(0) 호출 (또는 조기 return) |
| G-DR11.2 | AddPermanentPp(long) 시그니처 확인 (Sp02 W2) — 음수 입력 시 동작 보장 | A1 (D-1 2026-05-31) | code-lead | Sp02 W2 PR 머지 확인 |
FAIL 시 분기: G-DR11.1 음수 PP 적립 발견 시 즉시 PD 에스컬레이션 (방치 시스템 본맥 위배)
4. 변동 흡수
4.1 강시연 16~17화 도착 시 어픽스 풀 갱신 → 방치 영향 검증
참조: 메모리 feedback_writer_collaboration_protocol.md 1주 2화 페이스 = 16~17화 도착 추정 5/9~5/16 Sp03 D-7 시점 (2026-05-25) 누적 부하 추정: 0h (방치 시스템은 어픽스 풀 의존도 0)
| 시나리오 | 발생 가능성 | Sp03 W1·W2 영향 | 대응 절차 |
|---|---|---|---|
| S-1: 어픽스 풀 v1.4 신규 등록 (S-2 발동) | Low (16~17화 도입 가능성 Low~Medium) | 0건 (방치 = IdleRewardCalculator 가 어픽스 미참조, Sp04+ 어픽스 효과 적용 후에도 Sp03 코드 변경 0) | §4.2 절차 (영향 검증만) |
| S-2: AFX_34 9,860원 박자 트리거 조건 변형 (17화 99 글리치) | Low~Medium (Sp04 preflight v1.2 §6.4 평가 답습) | 0건 (어픽스 트리거 = Sp04 W1 Calculator 영역, Sp03 무관) | §4.2 절차 |
| S-3: 캐릭터 IP 신규 추가 (knight·slayer 추가 시그니처) | Very Low | 0건 (방치 = 캐릭터 비참조) | 무대응 |
4.2 영향 검증 절차 (S-1·S-2 발동 시, 박세린 30분 내)
- 강시연 회신 도착 (5/9~5/16 추정) → 1h 내 박세린 수신 확인
- 어픽스 풀 v1.x 갱신 발생 시 →
IdleRewardCalculatorgrepAffixPool/affix/Sp04키워드 → 참조 0건 확인 (예상) - 참조 0건 = Sp03 영향 0 → 무대응 (preflight v1.0 갱신 0)
- 참조 발견 시 (예상 외) = PD 에스컬레이션 + Sp03 W1·W2 재검토
예상: 4 단계 = 무발동 (idle-research v1.0 §5 정합성 10축 교차표 모두 ✅).
4.3 R-DR-S03-Sp03 [Medium → Resolved] — 드롭 로그 어픽스 등급 미연동 (옵션 (a) 등급만 PD 락, 2026-05-03)
발견 시점: 2026-05-02 preflight 작성 중 신규 노출 결정 시점: 2026-05-03 PD 락 (옵션 (a) 등급만 채택, 박세린 자체 권고와 일치) 상태: Resolved (Sp03 부담 0h, Sp04 W2 인벤토리 도입과 함께 일괄 양식 확장)
위험 (해결됨): Q5 = A "드롭 로그만" 결정 (Sp04 인벤토리 미도입). 단 Smoke Test #09 출력 양식에서 드롭 등급 표기 (Common × 12, Magic × 4, Rare × 1, Epic × 0, ...) 가 어픽스 풀 v1.x 36어픽스 등급별 분포와 무관하게 단순 6등급 카운트만 출력. 추후 Sp04 W2 인벤토리 도입 시 "Sp03 로그 양식과 다르다" 회귀 우려 Low~Medium.
옵션 검토 결과 (PD 결정 락):
| 옵션 | 양식 | Sp03 부담 | Sp04 정합성 | 채택 |
|---|---|---|---|---|
| (a) 등급만 (현 idle-research §1.5 / §2.2 양식 그대로) | [Idle] Drops: Common x12, Magic x4, Rare x1, ... | 0 (현 양식 답습) | Sp04 인벤토리 도입 시 양식 확장 (등급 → 등급 + 슬롯명) | ✅ PD 락 (2026-05-03) |
| (b) 등급 + 슬롯 | [Idle] Drops: Common Weapon x3, Common Helm x2, Magic Boots x1, ... | +0.5h (#09 양식 갱신) | Sp04 정합 양호 | ❌ 폐기 |
| (c) Sp04 어픽스 풀 양식 사전 매핑 | [Idle] Drops: AFX_31 x0, AFX_32 x1, ..., AFX_36 x0 | +1.5h (Sp04 인벤토리 임시 매핑 + 36어픽스 grep) | Sp04 정합 최우수, 단 Sp03 스코프 위반 | ❌ 폐기 |
Sp03 Smoke Test #09 정식 양식 락 (옵션 (a)):
Debug.Log("[Idle] Drops: Common x12, Magic x4, Rare x1, Epic x0, Legendary x0, Mythic x0");
Sp04 W2 인벤토리 도입 시 인계 (이월 1줄):
Sp04 W2 인벤토리 도입과 함께 Sp03 드롭 로그 양식 일괄 확장 — 등급 → 등급 + 슬롯명 (옵션 (b) 형태) 또는 인벤토리 직접 적립 후 로그 폐기. Sp04 W2 preflight 작성 시 본 항 참조 (Sp03 preflight v1.1 §4.3).
박세린 권고 결과: PD 옵션 (a) 채택 = 박세린 권고와 일치. Sp03 스코프 = "방치 계산 + PP 적립 + 마일스톤 배치 + Debug.Log 드롭" (idle-research Q5-A) 보존. 슬롯명 / 어픽스 매핑은 Sp04 인벤토리 도입과 함께 일괄 처리. Sp03 preflight v1.1 변경 = §0 한 줄 맥락 + §2.3 Smoke 양식 락 표기 + §4.3 옵션 (a) 정식 채택 표기 + §5.4 GO/NO-GO 재검토 PD 호출 조건 갱신 + §7 변경 이력 + 메모리 갱신 권고 (총 5건).
5. D-Day 체크리스트 (D-7 본격 착수 시 PRINT-AND-CHECK 양식, 게이트 11/11)
사용법: 2026-05-25 (D-7) 책상에 출력. 항목별 체크박스 표시. GO/NO-GO 표 1행 작성.
5.1 W1 완료 판정 게이트 (5건)
[ ] G-W1.1 : #01 GodBlade.Runtime.Idle 네임스페이스 + IdleConstants + IdleRewardBundle struct 작성 완료 (3 파일)
→ 검증: GodBlade.Runtime.asmdef references 변경 0 / using GodBlade.Data; 명시
→ FAIL 시 CP-I2 분기 (네임스페이스 충돌 grep 5분)
[ ] G-W1.2 : #02 IdleSaveService Save/Load/Migrate 회로 + JSON schemaVersion=1
→ 검증: account/test/idle.v1.json 생성 + 라운드트립 1회 Pass
→ FAIL 시 persistentDataPath 권한 + 직렬화 회로 grep (15분)
[ ] G-W1.3 : #03 IdleRewardCalculator Bulk 집계 공식 작성 + §1.4 PP 50 검증 (10h × 100층)
→ 검증: floor((36000/3600) × 100 × 0.05 × 1.0) == 50
→ FAIL 시 §1.4 수식 grep (수식 단일성 G-DR07.4 가드)
[ ] G-W1.4 : #04 IdleRewardCalculator Tail 3,600초 리플레이 + RNG 시드 결정론
→ 검증: G-DR07.1·2 가드 (System.Random 명시 / List 순회 강제)
→ FAIL 시 §3.1 분기 (Dictionary 순회 grep 10분)
[ ] G-W1.5 : #05 IdleTicker MonoBehaviour + OnApplicationPause 훅 + singleton + DontDestroyOnLoad
→ 검증: 에디터 Play Mode 진입 시 IdleTicker.Instance 생성 + Update() 1초 누산 동작
→ FAIL 시 CP-I1 Unity.ResourceManager 참조 확인 (Sp01 W2 시점 추가 완료, 재확인만)
5.2 W2 완료 판정 게이트 (5건)
[ ] G-W2.1 : #06 PrestigePpAccumulator.GrantIdleDrip 실배선 + AddPermanentPp 호출
→ 검증: GrantIdleDrip(36000, 100) 호출 시 PlayerPrestigeState.PermanentPp +50
→ FAIL 시 G-DR11.1 음수 차감 가드 (즉시 정정 5분)
[ ] G-W2.2 : #07 FlushCatchUp 발화 순서 락 (Milestones → Drops 로그 → PP 적립 → OnIdleReward)
→ 검증: §2.2 4단계 a→b→c→d 순서 grep + 단계 c 후 단계 d 시점 PermanentPp 반영 완료
→ FAIL 시 CP-I6 이중 적립 grep (15분)
[ ] G-W2.3 : #08 Edit-mode 테스트 7건 Green (역전 / 캡 / 결정론 / 마일스톤 / Save 라운드트립 / PP 누적 / 30일 Warn)
→ 검증: GodBlade.Tests.Editor 7/7 Pass
→ FAIL 시 G-DR07.3 결정론 hardcoded assert 검증 (30분)
[ ] G-W2.4 : #09 Smoke Test 10h 시뮬 → PP 50 + Debug.Log 드롭 1건+ + Save 정상
→ 검증: §2.3 Console 출력 양식 일치 (옵션 (a) 등급만 PD 락 v1.1)
→ FAIL 시 §2.3 합/불합 분기 절차
[ ] G-W2.5 : #10 §9 CP-I1~I11 11개 체크 + Unity Console 새 에러 0 + PR 머지
→ 검증: idle-research §9.2 11개 체크 통과 + PR 본문에 "IL2CPP 실기 검증 Phase 3+ 이월" 1줄 명시 (G-DR07.5)
→ FAIL 시 회귀 패턴 grep (Sp00 회귀 2건 CS0246 / CS1061 재발 가드)
5.3 회귀 가드 게이트 (R-DR-07 차단, 1건)
[ ] G-R-DR07 : 하이브리드 결정론 5 가드 통과 (G-DR07.1~5)
→ 검증:
(1) System.Random(rngSeed) 명시 (UnityEngine.Random 0건 grep)
(2) DropRateTableSO.rows List 순회 (Dictionary _lookup 순회 0건 grep)
(3) #08 결정론 테스트 1건 hardcoded assert Green
(4) Bulk + Tail PP 수식 단일성 (메서드 추출 1개)
(5) PR 본문 "IL2CPP 실기 검증 Phase 3+ 이월" 1줄
→ FAIL 시 §3.1 분기 절차 (가드별 정정 5~30분)
5.4 GO/NO-GO 의사결정 표 (게이트 11/11)
+----------------------------------------------------------+
| Sp03 W1+W2 GO/NO-GO 의사결정 (D-7 ~ D+14, 2026-05-25 ~ 2026-06-14) |
+----------------------------------------------------------+
| 일자 | 게이트 통과 | 비고 |
| 2026-05-25 | (D-7 인쇄) | Preflight v1.1 책상 출력 (옵션 (a) 락) |
| 2026-05-31 | A1 5건 | Sp02 W2 의존 4건 + 사전 메모 |
| 2026-06-01 | (Sp03 D+0) | 킥오프 |
| 2026-06-07 | __/5 W1 | (G-W1.1~5) |
| 2026-06-14 | __/5 W2 | (G-W2.1~5) |
| 2026-06-14 | __/1 R-DR | (G-R-DR07) |
+----------------------------------------------------------+
| 최종 결정 | [ ] GO [ ] NO-GO [ ] 재검토 PD 호출 |
| 결정자 | PD |
| 결정일 | 2026-06-14 (Sp03 D+14, Sp04 킥오프 D-1) |
+----------------------------------------------------------+
GO 조건: G-W1.1~5 (5/5) + G-W2.1~5 (5/5) + G-R-DR07 (1/1) = 11/11 통과 NO-GO 조건: 1건 이상 FAIL 잔존 + §3.1 분기 절차 미완료 재검토 PD 호출 조건: R-DR-S03-Sp03 옵션 (a) 비채택 시 (v1.1 PD 락으로 해소) / R-DR-08 (OnApplicationPause) 모바일 실기 차단 우회 필요 시
6. 의존성·블로커
6.1 W1·W2 내부 의존성 그래프
Sp02 W2 종료 (2026-05-31)
│
├── A1 (D-1 사전 완화 4건 확인)
│ - GetIdleCapHours(state) 헬퍼 머지
│ - BuildSummary 4필드 (IdleRateMul/GoldMul/ExpMul/DropMul) 머지
│ - AddPermanentPp/AddSeasonalPp(long) public 머지
│ - PrestigePpAccumulator + GrantIdleDrip 시그니처 머지
│
▼
Sp03 D+0 킥오프 (2026-06-01)
│
├── #01 (네임스페이스 + struct, 0.75h)
│
▼
#02 (Save Service, 1.5h) ─┐
│
#03 (Bulk 집계, 2h) ──┼──> #05 (IdleTicker MonoBehaviour, 1.5h)
#04 (Tail 리플레이, 1.5h) ─┘
(W1 합계 7.25h, D+7 2026-06-07 완료 목표)
│
▼
#06 (PP 실배선, 0.75h)
│
▼
#07 (발화 순서, 1.5h)
│
▼
#08 (테스트 7건, 2h) ──> #09 (Smoke 10h=50PP, 0.75h) ──> #10 (PR 머지, 1h)
(W2 합계 6.0h, D+14 2026-06-14 완료 목표)
│
▼
Sp04 D+0 킥오프 (2026-06-15)
6.2 외부 의존성 (Sp02 W2 / 강시연 / code-lead 실측)
| 의존 | 마감 | 책임 | 영향 | 상태 |
|---|---|---|---|---|
| Sp02 W2 종료 (PrestigePpAccumulator + GetIdleCapHours) | 2026-05-31 | code-lead | 미완료 시 #06 0.5h 긴급 선행 (sprint-03-dry-run §0.3 A1) | 대기 |
| code-lead B1 실측 (Sp03 W1 #03 시점) | Sp03 W1 #03 작성 시 | code-lead | BuildSummary 4필드 실측 + IdleRateMul 정합 | 대기 |
IdleCap 헬퍼 = PrestigeCalculator.GetIdleCapHours(state) | Sp02 W2 종료 | code-lead | 시그니처 = public static int GetIdleCapHours(in PlayerPrestigeState state) 정확 일치 | d8 검증 ✅ |
| 어픽스 풀 v1.3 36어픽스 vs 방치 | 2026-05-02 | 박세린 | 충돌 0 (방치 = 어픽스 미참조 / Sp04+ 이월) | ✅ 완료 |
| 강시연 16~17화 도착 (1주 2화 페이스) | 5/9~5/16 추정 | 강시연 | Sp03 영향 0~Low (§4.1) | 대기 |
6.3 IdleCap 헬퍼 = PrestigeCalculator.GetIdleCapHours(state) 정합 락
수식: TSVprestige_items.tsv#25IdleCapHoursFlat=24 + 2 × min(level, 5)범위: Lv0 = 24h / Lv1 = 26h / Lv2 = 28h / Lv3 = 30h / Lv4 = 32h / Lv5+ = 34h (소프트캡)
Sp03 #03 사용 양식:
int idleCapHours = PrestigeCalculator.GetIdleCapHours(state); // 24~34h
long cappedSec = Math.Min(elapsedSec, (long)idleCapHours * 3600);
락: Calculator 시그니처 불변 원칙 (Sp02 W2 PD 승인) — GetIdleCapHours 는 신규 메서드 추가 = 시그니처 변경 아님.
6.4 어픽스 v1.3 36어픽스 vs 방치 = 충돌 0 검증
참조: idle-research v1.0 §5 정합성 10축 교차표
| 축 | 어픽스 풀 v1.3 36어픽스 | 방치 시스템 | 충돌? |
|---|---|---|---|
| 1 | DropRateTableSO 60행 (Sp01 W2) | IdleRewardCalculator read-only 호출 | ✅ 없음 (어픽스 풀과 별도) |
| 2 | affix_pool.tsv 36행 (Sp04+) | Sp03 미참조 (Sp04 W2 인벤토리 도입과 함께) | ✅ 없음 |
| 3 | StackPolicy 4종 enum (additive_crossAxis × 17 / additive_hardcap × 10 / exclusive_onlyOne / additive) | Sp03 미참조 | ✅ 없음 |
결론: 방치 시스템은 어픽스 풀 의존도 0. Sp04 W2 어픽스 인벤토리 도입 후에도 IdleRewardCalculator 코드 변경 0 (드롭 로그 양식 옵션 (a) 등급만 유지 시 — PD 락 v1.1).
6.5 블로커 시나리오 (PD 에스컬레이션 트리거)
| # | 블로커 | 트리거 | 에스컬레이션 마감 | 대응 |
|---|---|---|---|---|
| B-1 | A1 Sp02 W2 의존 4건 미머지 | D-1 (2026-05-31) | 즉시 (1h 내) | code-lead 긴급 선행 (#06 이전 0.5h 추가) |
| B-2 | G-DR07.3 결정론 테스트 Red (Edit Mode) | #08 작성 시 | 즉시 (1h 내) | §3.1 G-DR07.1·2 가드 grep + 정정 |
| B-3 | R-DR-08 OnApplicationPause Editor Play Mode 재현 불가 | #05 작성 시 | D+5 (2026-06-05) | Editor Play Mode 수동 시나리오 1개 정의 (sprint-03-dry-run §0.2 R-DR-08) + 모바일 실기 Phase 3+ 이월 명시 |
| B-4 | 강시연 16~17화 도착 시 어픽스 v1.4 신규 등록 (S-1) | 5/9~5/16 | 도착 24h 내 | §4.2 영향 검증 (예상 = 방치 영향 0) |
| B-5 |
박세린 책임 범위: B-4 / B-5 (Resolved) / B-1·B-2·B-3 = code-lead 책임 (단순 보고)
7. 변경 이력
| version | 일자 | 변경 | 책임 |
|---|---|---|---|
| 1.0 | 2026-05-02 | 신규 (Sp04 preflight v1.2 패턴 답습 / 7 섹션 / 게이트 11/11 / R-DR-07 가드 5건 / R-DR-S03-Sp03 신규 발견 + PD 결정 대기) | 박세린 |
| 1.1 | 2026-05-03 | R-DR-S03-Sp03 옵션 (a) 등급만 PD 락 (박세린 권고와 일치) — Sp03 부담 0h, Sp04 W2 인벤토리 도입과 함께 일괄 양식 확장 인계. 갱신 5건 = §0 한 줄 맥락 + §2.3 Smoke 양식 락 표기 + §4.3 옵션 (a) Resolved 표기 + §5.4 GO/NO-GO 재검토 PD 호출 조건 항목 해소 + §6.5 B-5 Resolved 표기 + §7 변경 이력. 시간 예산 0.3h 실측. | 박세린 |
| 1.2 (예정) | 5/9~5/16 이후 | 강시연 16~17화 도착 시 §4.1 영향 검증 결과 반영 (예상 = 무영향) | 박세린 |
| 1.3 (예정) | D-7 (2026-05-25) | 본격 착수 직전 점검 (Sp02 W2 종료 D-1 시점 A1 4건 머지 확인) | 박세린 |
(끝, v1.1 2026-05-03 박세린 + PD R-DR-S03-Sp03 옵션 (a) 락)