Sprint 01 W1 — 드라이런 리허설 (2026-04-21)
작성: 2026-04-21 (code-lead) · 대상:sprints/sprint-01.md§3 W1 태스크 #01~#05 문서 상태: v1.0 목적: 2026-05-04 실제 Sprint 01 킥오프 전 실행 시뮬레이션으로 블로킹·회귀 리스크 사전 노출 범위: 실행 시뮬레이션만. 실제 코드 0줄 (Unity6/ 건드리지 않음). 문서만 작성 감사 기준:sprint-01-w2-importer-design.mdv1.0 APPROVED ·shared-checkpoints.mdv1.0 ·scaffold-sync-audit-2026-04-21.md·d8-stat-key-validation-2026-04-21.md원칙: Sp01 설계 결정 변경 제안 금지 (v1.0 APPROVED 고정). 감지·권고만.
§0. TL;DR (PD 1분)
| 항목 | 값 |
|---|---|
| 판정 | Yellow-Green (킥오프 GO. 단 1건 선제 가드 권장) |
| 실행 시뮬레이션 태스크 수 | 5건 (#01~#05) |
| 예상 공수 합계 (설계 기준) | 6.0h (#01 1.0h + #02 2.0h + #03 1.5h + #04 1.0h + #05 0.5h) |
| 실공수 예상 밴드 | 6.5~9.0h (회귀 패치 0.5~1.5h + TSV 경로 해석 가드 0.5h 가중) |
| 최상위 리스크 3건 | R-DR-01, R-DR-02, R-DR-03 (§0.2) |
| Sp00 회귀 2건 재현 확률 | Low (CS0246) / Medium (CS1061) — §9 상세 |
§0.1 결론 한 줄
Sp01 W1 태스크 #01~#05는 Happy Path에서 6.5~9.0h 구간 내 완주 가능. 주된 블로킹 축은 **#02 DropRateTableImporter 작성 시 UnityEditor.AddressableAssets.* 사용에 따른 Data 어셈블리 경계 오염과 BOM trim 이중 처리**. CS0579(InternalsVisibleTo 중복)는 #02~#04 SO 3개 신설 구간에서 재발 위험 Medium — PR 머지 전 grep 1회로 차단 가능.
§0.2 최상위 리스크 3건
- R-DR-01 [Medium · 회귀 CS0579 재현] — #02/#03/#04 SO 3종 신설 시
TranscendentStageSO.cs:22의[assembly: InternalsVisibleTo("GodBlade.Editor")]패턴을 습관적으로 복제하면 어셈블리 내 중복 → CS0579. Sp00 회귀 B(CS1061)와 다른 에러 코드지만 동일 근본 원인(Data 어셈블리 InternalsVisibleTo 관리). 체크포인트 ⭐ CP-M02 에 정확히 해당. - R-DR-02 [Medium · TSV 경로 해석 drift] — Sp00
TranscendentStageImporter.ResolveTsvPath는data_extracted/폴더 탐색. 신규 3 Importer는designs/폴더 대상. scaffold audit D4 식별됨. 하드코딩 경로 상수 실수 시EditorUtility.DisplayDialog("TSV Not Found")로 조용히 리턴 → Importer 실패 원인 파악에 시간 낭비. - R-DR-03 [Low-Medium · 네임스페이스 혼동] — scaffold rootNamespace =
GodBlade.EditorTools이나 설계 문서 3건 전반이GodBlade.Editor.*로 표기(audit D1). Unity 에디터 파일 신규 생성 시namespace GodBlade.Editor자동 삽입되면 rootNamespace 매칭 실패. 파일 최상단namespace GodBlade.EditorTools로 명시적 선언 필수. §9 CP-M06.
§0.3 사전 완화 액션 3건 (버퍼 기간, 2026-05-03 이전)
- A1 [30분, 버퍼 D-1 2026-05-03] — 2026-05-04 킥오프 오전 1시간을 "asmdef/InternalsVisibleTo 사전 점검 세션"으로 고정.
Unity6/에디터 열어 기존 3 asmdef Console 에러 0 확인 +TranscendentStageSO.cs:22단일 선언 grep 재확인 +GodBlade.EditorTools네임스페이스 파일 3개 최상단 확인. scaffold-sync-audit §7 Go/No-Go 체크리스트 7건 수행. - A2 [15분, 버퍼 D-1] — TSV 경로 상수 템플릿 1줄 미리 메모 작성:
"../../designs/transcendent_drop_table.tsv"(Unity 프로젝트 기준 상대경로). Sp00 ImporterResolveTsvPath(line 125) 로직 재활용 패턴 확인. 실제 작성은 #02 태스크에서. - A3 [10분, 버퍼 D-1] —
.claude/작업 공간에 "Data 어셈블리 신규 파일 체크리스트" 쪽지 확보: ①namespace GodBlade.Data②[assembly: InternalsVisibleTo(...)]복제 금지 ③using UnityEditor금지(#if UNITY_EDITOR 필수) ④blittable 필드만. #02~#04 시작 전 매번 확인.
§1. Sprint 01 W1 태스크 재확인 표
원천: sprints/sprint-01.md §3 W1 블록 (#01~#05)
| # | 제목 | 담당 | 예상 공수 | 선행 | 산출물 |
|---|---|---|---|---|---|
| #01 | Grade / MobKind / RewardType enum + GradeRemap.cs | code-lead | 1.0h | (없음) | Assets/_Project/Scripts/Data/GradeRemap.cs 1개 |
| #02 | DropRateTableSO 클래스 + 60행 Import 성공 | code-lead | 2.0h | #01 | SO 1 + Importer 1 + .asset 1 + Addressables 엔트리 1 |
| #03 | MilestoneRewardCatalogSO + 22행 Import 성공 | code-lead | 1.5h | #01 | SO 1 + Importer 1 + .asset 1 + Addressables 엔트리 1 |
| #04 | AffixPoolSO + 6행 Import 성공 (뼈대만) | code-lead | 1.0h | #01 | SO 1 + Importer 1 + .asset 1 + Addressables 엔트리 1 |
| #05 | GodBlade/Data/Import ALL 메뉴 1개 | code-lead | 0.5h | #02, #03, #04 | RewardImportAll.cs 1개 (Sp00 Stage 호출 포함) |
- 순차 그래프:
#01 → {#02, #03, #04 병렬} → #05 - 병렬 가능성: #02/#03/#04 는 설계상 독립. 그러나 1인 파트타임 환경상 직렬 권장.
- W1 예상 공수 합: 6.0h (설계 기준) → 현실 밴드 6.5~9.0h (본 드라이런 재추정).
§1.1 W1 TSV 실사 행수 대조 (2026-04-21 시점)
| TSV | 헤더 포함 행수 | 데이터 행수 | 설계 기대 | Gap |
|---|---|---|---|---|
transcendent_drop_table.tsv | 61 | 60 | 60행 (5 버킷 × 2 mob × 6 grade) | ✅ |
transcendent_milestone_reward.tsv | 23 | 22 | 22행 (10/50/100/150/200층) | ✅ |
transcendent_affix_pool.tsv | 7 | 6 | 6행 (6 등급 뼈대) | ✅ |
→ 3개 TSV 전부 설계 수치와 일치. Import 시 행수 자기검증 구현 가능.
§2. 태스크 #01 — Grade / MobKind / RewardType enum + GradeRemap
§2.1 예상 Happy Path (30~60분 단위)
- [10분]
Assets/_Project/Scripts/Data/GradeRemap.cs신규 생성 (Unity 에디터 Create → C# Script 또는 파일 시스템 직접 생성). - [10분] 파일 최상단
namespace GodBlade.Data명시.#if UNITY_EDITOR가드 불필요(런타임 enum).using최소화 —System만. - [15분]
Gradeenum 6종 선언 (설계 §3.2 표):
Common=0 / Magic=1 / Rare=2 / Epic=3 / Legendary=4 / Mythic=5- 코멘트 3줄 (원본 Rare ≠ 신규 Rare 경고, 설계 §3.3).
- [5분]
MobKindenum 2종 (Normal=0 / Boss=1) 선언. - [10분]
RewardTypeenum 8종 선언 (설계 §3.2 전체). - [10분]
GradeRemapstatic class +TryFromLegacy(string, out Grade)+TryParseNew(string, out Grade)구현. Dictionary<string, Grade> 2개 static readonly. - [5분]
UnknownGradeException : System.Exceptionsealed class +Literal/SourceTsv/RowNumber3 필드. - [5분] 저장 + Unity 에디터 포커스 복귀 → Console 에러 0 확인.
총 1h 예상. 설계 공수와 일치.
§2.2 예상 블로킹·회귀 리스크
| 리스크 | 심각도 | 근본 원인 | 재현 조건 | 대응 |
|---|---|---|---|---|
CS0246 GradeRemap 미발견 (다른 파일에서 import 안 됨) | Low | GodBlade.Data asmdef가 autoReferenced: true 확인 필요 | #02 작성 시 using GodBlade.Data; 추가 누락 | scaffold audit §1.2 확인: autoReferenced: true — Runtime/Editor 에서 자동 참조됨. OK |
CS0104 Grade 모호함 — 다른 어셈블리에 동명 enum | Very Low | Unity 내장 네임스페이스 충돌 없음 확인됨 | — | 무시 |
| 코멘트 부재로 원본 Rare 혼동 | Medium (휴먼 에러) | Grade.Rare = 원본 Superior 의미. 실수로 원본 Rare ↔ 신규 Rare 매핑 | TryFromLegacy("Rare", out g) 구현 시 g = Grade.Rare 잘못 배정 | 설계 §3.3 표 하드코딩 시 4건 매핑 전수 재확인 + 코멘트 3줄 필수 |
Sp00 회귀 재현 가능성:
- CS0246
Unity.ResourceManager— Zero (enum 파일은 런타임 타입 미사용) - CS1061 / CS0579 (InternalsVisibleTo) — Zero (#01은 InternalsVisibleTo 불필요, public enum 만)
§2.3 선결 조건 체크
Unity6/프로젝트 오픈 + Console 새 에러 0 (Go/No-Go §A)GodBlade.Data.asmdefreferences[]빈 배열 유지 확인 (scaffold audit §1.2)TranscendentStageSO.cs:22의 InternalsVisibleTo 단일 선언 유지 확인 (Go/No-Go §C)namespace GodBlade.Data를 파일 최상단에 명시할 준비 (rootNamespace 정책)
§2.4 Rollback 지점
- git commit 단위:
#01완료 직후 단독 커밋 (feat(sp01-w1): add Grade/MobKind/RewardType enums + GradeRemap static class). 파일 1개만. - 파일 단위: 실패 시
GradeRemap.cs삭제 + 메타 삭제. 다른 파일 영향 없음 (독립). - 완료 체크 수준: Unity 에디터
Ctrl+S후 Console 에러 0 + Project 창에서 파일 보임. 테스트 실행은 #06 (W2) 까지 대기.
§3. 태스크 #02 — DropRateTableSO + 60행 Import (가장 큰 태스크)
§3.1 예상 Happy Path (30~60분 단위)
Phase A: SO 정의 (45분)
- [10분]
Assets/_Project/Scripts/Data/DropRateTableSO.cs신규 생성.namespace GodBlade.Data명시. - [5분]
[CreateAssetMenu]부착 (Sp00 패턴 복제).fileName = "DropRateTable",menuName = "GodBlade/Data/Drop Rate Table". - [10분]
[System.Serializable] struct DropRateRow정의:int floorMin / int floorMax / MobKind mob / Grade grade / float rate. - [10분]
readonly struct DropRateKey : IEquatable<DropRateKey>정의 — byte 3개(Bucket/Mob/Grade) +GetHashCode비트 압축 +Equals. - [10분]
[SerializeField] List<DropRateRow> rows = new()+[NonSerialized] Dictionary<DropRateKey, float> _lookup+OnEnablelazy build 메서드.
Phase B: Importer 골격 (45분)
- [10분]
Assets/Editor/Importers/DropRateTableImporter.cs신규 생성.namespace GodBlade.EditorTools명시(.Editor아님 — D1 drift 방지). - [5분]
#if UNITY_EDITOR가드 +using UnityEditor; using UnityEditor.AddressableAssets; using UnityEditor.AddressableAssets.Settings; using UnityEditor.AddressableAssets.Settings.GroupSchemas;(Sp00 Importer 참조 복제). - [10분]
[MenuItem("GodBlade/Data/Import Drop Rate Table TSV")] public static void Import()시그니처 작성. - [10분]
ResolveTsvPath로컬 헬퍼 —"../../designs/transcendent_drop_table.tsv"후보 + UnityApplication.dataPath결합 (Sp00ResolveTsvPath:125로직 복제). - [10분]
ReadTsv—File.ReadAllLines+ BOM trim +Split('\t')+ 헤더 검증 (expected 6열). Sp00ReadTsv:156복제 +.Trim()보강 (CP-M07).
Phase C: 변환 + 자기검증 (30분)
- [15분] Row →
DropRateRow변환.GradeRemap.TryParseNew호출 +MobKind파싱 ("normal"/"boss"문자열 → enum).int.Parse+float.Parse(CultureInfo.InvariantCulture). - [10분] 드롭률 합 자기검증: 5 bucket × 2 mob = 10 그룹 순회 +
|sum - 1.000| > 0.001체크 +Debug.LogError+EditorUtility.DisplayDialog. - [5분]
AssetDatabase.CreateAsset/AssetDatabase.SaveAssets.OUT_DIR = "Assets/_Project/Data/Rewards"없으면Directory.CreateDirectory.
Phase D: Addressables 등록 (20분)
- [10분]
RegisterAddressables로컬 헬퍼 —AddressableAssetSettingsDefaultObject.Settings+FindGroup("Rewards")??CreateGroup(...)+CreateOrMoveEntry+entry.address = "Rewards/DropRateTable"+entry.SetLabel("reward-table", true, true). Sp00RegisterAddressables:310복제. - [5분] 메뉴 실행 → Console 로그
[DropRateTableImporter] Loaded 60 rows. 10/10 buckets sum=1.000 OK. - [5분]
Assets/_Project/Data/Rewards/DropRateTable.assetInspector 열기 →rows60행 육안 확인.
총 2.3h 예상 (설계 2.0h + 0.3h 실행 오버헤드).
§3.2 예상 블로킹·회귀 리스크
| 리스크 | 심각도 | 근본 원인 | 재현 조건 | 대응 |
|---|---|---|---|---|
⭐ CS0579 [InternalsVisibleTo] 중복 정의 | Medium | Sp00 패턴 습관적 복제 — DropRateTableSO.cs 상단에도 #if UNITY_EDITOR + [assembly: InternalsVisibleTo("GodBlade.Editor")] 붙임 | 파일 간 grep 없이 복사 | 사전 완화 A3 체크리스트. 절대 복제 금지 (CP-M02) |
⭐ CS0246 AddressableAssetSettingsDefaultObject 미발견 | Low | 실제로는 Sp00에서 이미 GodBlade.Editor.asmdef:9 Unity.Addressables.Editor 참조 확인됨 (scaffold audit §1.4) | 신규 Importer를 Data 어셈블리에 실수로 생성하면 발생 | 파일 위치 Assets/Editor/Importers/ 확정 + namespace GodBlade.EditorTools 확인 |
| BOM 이중 trim | Low-Medium | Sp00 TranscendentStageImporter.ReadTsv:156 가 BOM trim 보유. 신규 Importer에 또 넣으면 이중 처리 — 기능상 무해하나 공통 TsvReader 이월(DQ3) 시 리팩터 비용 | 3개 Importer 각자 BOM trim 복제 | CP-M08: BOM trim은 각 Importer 내 1회만, 공통화는 Sprint 02 이월 명시 |
float.Parse 로케일 이슈 | Medium | 한글 Windows에서 float.Parse("0.700") 가 쉼표/점 혼동 가능 | CultureInfo.InvariantCulture 미지정 | Sp00 CreateOrUpdate:229 에 이미 CultureInfo.InvariantCulture 사용 확인 — 복제 시 빠뜨리지 말 것 |
| 드롭률 합 자기검증 실패 | Medium | transcendent_drop_table.tsv 60행 중 실제 합이 1.000 ± 0.001 이 아닐 가능성 | TSV 원본 오류 | 드라이런 권고: #02 시작 전 TSV 원본을 수치 합산 파이썬 스니펫으로 10개 그룹 사전 검증. 실패 시 game-designer 에스컬레이션. 본 드라이런은 코드 0줄 원칙으로 실제 합산은 하지 않음 |
| Addressables 그룹 중복 생성 (CP-M12) | Low | settings.FindGroup("Rewards") 생략 | 재실행 시 중복 그룹 생성 | Sp00 RegisterAddressables:310 에 FindGroup 분기 존재 — 복제 시 유지 |
Dictionary<K,V> 직렬화 시도 | Low | Unity Dictionary 직렬화 안됨 | [SerializeField] Dictionary<...> 실수 | CP-M09: [NonSerialized] 필수, OnEnable lazy build |
Sp00 회귀 재현 가능성:
- CS0246 (Unity.ResourceManager): Importer는
AsyncOperationHandle<T>미사용 → Low. 단#09테스트에서AsyncOperationHandle등장 가능성 있어 #06 에서 Tests.Editor asmdef references 누락 시 재발. - CS0579/CS1061 (InternalsVisibleTo): SO 신설 시 Medium. ⭐ CP-M02 최우선.
§3.3 선결 조건 체크
- #01
GradeRemap.TryParseNew메서드 서명 확정 + Data asmdef 컴파일 통과 designs/transcendent_drop_table.tsv60 데이터행 실존 (이미 확인 §1.1)- Sp00
TranscendentStageImporter.cs의ReadTsv/RegisterAddressables패턴 참조 가능 (손대지 않음) Unity6/Assets/_Project/Data/Rewards/폴더 미존재 — Importer가Directory.CreateDirectory로 생성Assets/Editor/Importers/폴더 존재 확인 (이미 확인 §1.3)GodBlade.Editor.asmdefUnity.Addressables.Editor참조 유지 (Go/No-Go §A)
§3.4 Rollback 지점
- git commit 단위: Phase A 완료 직후 1커밋 (
feat(sp01-w1): add DropRateTableSO skeleton), Phase B+C 완료 후 1커밋 (feat(sp01-w1): add DropRateTableImporter with sum validation), Phase D 완료 후 1커밋 (feat(sp01-w1): DropRateTable Addressables registration). 3단 분할 권장. - 파일 단위: Importer 실패 시 생성된
.asset+.meta+ Addressables 엔트리 3지점 제거. SO 클래스 파일은 유지(다음 태스크 영향 없음). - 완료 체크 수준: Inspector에서
DropRateTable.asset열람 + rows 60개 육안 + Addressables Window에서Rewards/DropRateTable엔트리 확인 + Console sum=1.000 로그 1건.
§4. 태스크 #03 — MilestoneRewardCatalogSO + 22행 Import
§4.1 예상 Happy Path (30~60분 단위)
- [30분]
MilestoneRewardCatalogSO.cs정의 (Sp00 + #02 패턴 복제) —List<MilestoneRewardRow> rows+HashSet<int> _milestoneFloors([NonSerialized]). - [20분]
MilestoneRewardRowstruct —int floor / string milestoneName / RewardType type / string rewardCode / int count / Grade? gradeFallback / string notes.Grade?nullable 주의 (설계 §1.3). - [20분]
MilestoneRewardImporter.cs— TSV 7열 파싱 +RewardType문자열 파싱 ("currency_gold"→RewardType.CurrencyGold). - [10분]
TBD_*prefix 감지 +Debug.LogWarning14건 반복 출력 (CP4).IsPlaceholder계산 프로퍼티 구조체에 내장. - [10분] Addressables 등록 (
Rewards/MilestoneRewardCatalog주소) — #02 패턴 복제.
총 1.5h 예상 (설계와 일치).
§4.2 예상 블로킹·회귀 리스크
| 리스크 | 심각도 | 근본 원인 | 재현 조건 | 대응 |
|---|---|---|---|---|
Grade? gradeFallback 직렬화 | Medium | Unity 직렬화가 Nullable<Grade> 지원 안 함 (구버전에선) — Unity 2020+ 부터는 지원, Unity 6 확실하나 확인 필요 | Inspector에 필드 안 보임 | Unity 6 공식 문서 확인 필요. 대안: bool hasGradeFallback + Grade gradeFallback 2필드로 분리 가능. 드라이런 시점 검증 불가 — 실제 작성 시 첫 Row Import 후 Inspector 육안 확인 필수 |
RewardType 문자열 파싱 실패 | Medium | TSV currency_gold / equipment_random 등 snake_case → enum PascalCase 변환 필요 | Enum.Parse 직접 사용 시 대소문자 mismatch | Dictionary<string, RewardType> 매핑 테이블 신설. 매핑 없으면 RewardType.Unknown + Debug.LogWarning |
IsPlaceholder 속성 vs 필드 | Low | 계산 프로퍼티로 구현 시 Unity 직렬화 포함 안 됨 (정상). 하지만 Inspector에서 표시 원하면 [SerializeField] 필드 필요 | 편의성 문제 | 계산 프로퍼티 유지 (설계 §5.3) |
| **TBD_* 14건 로그 flooding** | Low | Console 스팸 | — | Warn 수준으로 제한 + summary 1줄 추가 ("14 placeholders skipped") |
| CS0579 재발 (SO 2번째) | Medium | #02 에 이어 #03 SO에서도 InternalsVisibleTo 복제 유혹 | — | ⭐ CP-M02 최우선 |
Sp00 회귀 재현 가능성:
- CS0246: Low (Addressables 이외 런타임 타입 미사용)
- CS0579/CS1061: Medium (InternalsVisibleTo 복제 습관 — 2번째 SO 신설에서 증폭)
§4.3 선결 조건 체크
- #01 완료 (
Gradeenum +RewardTypeenum 8종 확정) - #02 완료 권장 (Importer 패턴 확립) — 엄밀히는 병렬 가능하나 순차 권장
designs/transcendent_milestone_reward.tsv22 데이터행 실존 확인 (§1.1)- Unity 6
Grade?Nullable 직렬화 지원 사전 확인 (위 R-risk)
§4.4 Rollback 지점
- git commit 단위: SO + Importer 동시 커밋 (
feat(sp01-w1): add MilestoneRewardCatalogSO + Importer with TBD placeholder detection). - 파일 단위: 실패 시 SO + Importer +
.asset제거. #02 영향 없음. - 완료 체크 수준:
MilestoneRewardCatalog.assetInspector 22행 + Console"[MilestoneRewardImporter] 22 rows, 14 TBD placeholders"로그.
§5. 태스크 #04 — AffixPoolSO + 6행 Import (뼈대만)
§5.1 예상 Happy Path (30~60분 단위)
- [20분]
AffixPoolSO.cs정의 —List<AffixSkeletonRow> rows+List<AffixValueEntry> valueEntries = new()(W2: 빈 리스트). - [15분]
AffixSkeletonRowstruct +AffixValueEntrystruct 필드 선언 (설계 §6.2, 211행 주입은 Sprint 02). - [15분]
AffixPoolImporter.cs— 9열 TSV 파싱.legacy_grade_map컬럼은 string 그대로 저장 (메모용). - [5분] Addressables 등록 (
Rewards/AffixPool주소). - [5분] Smoke 확인: Inspector에서
valueEntries빈 리스트 확인 (CP5/CP6 준수).
총 1h 예상 (설계와 일치).
§5.2 예상 블로킹·회귀 리스크
| 리스크 | 심각도 | 근본 원인 | 재현 조건 | 대응 |
|---|---|---|---|---|
| ⚠️ W2 범위 일탈 — 211행 실수치 주입 유혹 | Medium-High (휴먼) | OptionItemRandom XML 이 Datasheets/ 에 접근 가능 → "지금 한 번에 하면 Sprint 02 가벼워진다" 유혹 | code-lead 독단 | Sprint 01 §5 R3 명시. PR 리뷰 시 valueEntries.Count == 0 diff 검사. 위반 시 PR 반려 |
legacy_grade_map 컬럼 파싱 — "Normal→Superior" 유니코드 | Low | → (U+2192) 포함. UTF-8 BOM 제거 후 정상 파싱 가능 | encoding 실수 | File.ReadAllLines 기본 encoding = UTF-8. OK |
| CS0579 재발 (SO 3번째) | Medium | #02/#03 에 이어 3번째 SO | — | ⭐ CP-M02 최우선. 3번째에 피로도로 실수 확률 증가 |
| Addressables 그룹 3개 엔트리 한 그룹 관리 | Low | FindGroup("Rewards") 에 3개 엔트리 (Drop/Milestone/Affix) 집결 — 설계 §2.4 | 실수로 신규 그룹 분리 | #02 와 동일 그룹명 "Rewards" 재사용 체크 |
Sp00 회귀 재현 가능성: CS0579 Medium (3번째 SO = 피로도 최고).
§5.3 선결 조건 체크
- #01 완료 (
Gradeenum 6종) designs/transcendent_affix_pool.tsv6행 실존 (§1.1)- PD 명시 제약 재확인: valueEntries 빈 리스트 유지 (Sprint 01 §5 R3)
Datasheets/OptionInfo.xml존재 여부 무관 — 절대 참조 금지
§5.4 Rollback 지점
- git commit 단위: 1커밋 (
feat(sp01-w1): add AffixPoolSO skeleton + Importer (6 rows, no value entries per PD)). - 파일 단위: 실패 시 SO + Importer +
.asset제거. - 완료 체크 수준: Inspector에서
AffixPool.asset열람 +rows: 6+valueEntries: [](빈 리스트) 육안 확인.
§6. 태스크 #05 — GodBlade/Data/Import ALL 메뉴
§6.1 예상 Happy Path (30분)
- [10분]
Assets/Editor/Importers/RewardImportAll.cs신규 생성.namespace GodBlade.EditorTools. - [10분]
[MenuItem("GodBlade/Data/Import ALL (Stage → Drop → Milestone → Affix)", priority=10)] public static void ImportAll()작성. 내부에서 Sp00TranscendentStageImporter.Import()+DropRateTableImporter.Import()+MilestoneRewardImporter.Import()+AffixPoolImporter.Import()4회 호출. - [5분] 각 단계 사이
AssetDatabase.SaveAssets()+ 로그 1줄. - [5분] 메뉴 실행 → 4개 Importer 전체 순차 로그 확인.
총 0.5h 예상 (설계와 일치).
§6.2 예상 블로킹·회귀 리스크
| 리스크 | 심각도 | 근본 원인 | 재현 조건 | 대응 |
|---|---|---|---|---|
⚠️ Sp00 TranscendentStageImporter.Import 접근자 | Medium | Sprint 01 §4 B2 블로커로 사전 식별됨. Import() 가 public static 이면 호출 OK, private 이면 Sp00 수정 없이 호출 불가 | — | 드라이런 확인 결과: TranscendentStageImporter.cs:72 = public static void Import() → 호출 가능 ✅. 블로커 해소 |
ImportAll 중간 단계 실패 시 복구 | Low | 드롭 Import 실패했는데 마일스톤 Import 진행 → 부분 상태 | try/catch 블록 생략 | 각 호출 사이 AssetDatabase.SaveAssets() + try/catch (Exception e) { Debug.LogError; return; } |
| 메뉴 중복 등록 | Low | MenuItem path 충돌 | — | priority 지정 + 기존 Sp00 메뉴와 구분 |
Sp00 회귀 재현 가능성:
- CS0246 / CS0579 / CS1061: 전부 Zero (새 타입 선언 없음, 기존 Importer 호출만).
§6.3 선결 조건 체크
- ✅ Sp00
TranscendentStageImporter.Import()=public static확정 (드라이런 확인) - #02, #03, #04 각
Import()시그니처도public static void로 작성 필수 GodBlade.EditorTools네임스페이스 내에서 다른 Importer 접근 가능 (같은 어셈블리)
§6.4 Rollback 지점
- git commit 단위: 1커밋 (
feat(sp01-w1): add Import ALL menu for reward pipeline). - 파일 단위:
RewardImportAll.cs1개만 삭제하면 이전 상태 복귀. - 완료 체크 수준: 메뉴
GodBlade > Data > Import ALL클릭 → Console 4단계 로그 순차 출력.
§7. 통합 리스크 매트릭스
3축: 회귀 재현 확률 (행) × 블로킹 가능성 (열) × 태스크별 영향 (셀 값) 값 = Low (L) / Medium (M) / High (H) / Zero (-)
§7.1 태스크 × 리스크 유형 매트릭스
| 태스크 | CS0246 재현 | CS0579/1061 재현 | TSV 경로 drift | 네임스페이스 혼동 | W2 범위 일탈 | 공수 초과 (>+50%) |
|---|---|---|---|---|---|---|
| #01 GradeRemap | - | - | - | L | - | L |
| #02 DropRate | L | M | M | L | - | M |
| #03 Milestone | L | M | M | L | L | L |
| #04 AffixPool | L | M | M | L | M-H | L |
| #05 Import ALL | - | - | - | L | - | L |
§7.2 리스크 합산 (태스크 단위 최대치)
| 태스크 | 최상위 리스크 | 권장 버퍼 |
|---|---|---|
| #01 | 네임스페이스 혼동 (L) | +0.1h |
| #02 | CS0579 + TSV 경로 + 공수 초과 (M·M·M) | +0.5~1.0h |
| #03 | CS0579 + TSV 경로 (M·M) | +0.3~0.5h |
| #04 | W2 범위 일탈 (M-H) + CS0579 (M) | +0.2h (코드 시간) + PR 리뷰 부담 |
| #05 | (낮음) | +0.1h |
총 권장 버퍼: 1.2~2.0h → W1 실공수 밴드 6.5~9.0h (설계 6.0h + 버퍼).
§7.3 D+7 중간 점검 판정 기준 (#11 태스크)
- Green: D+7 시점 #01+#02 완료 + #03 착수 → 정상 진행
- Yellow: D+7 시점 #02 50% 미만 → #04 를 뼈대만(valueEntries 빈 리스트 확정) 최소 축소, #05 필요 시 W2 초반 합류
- Red: D+7 시점 #01 미완료 → PD 에스컬레이션 + 범위 축소 협의
§8. 실제 킥오프 시 사전 완화 액션 (최종 3건)
2026-05-04 킥오프 오전 최대 2시간 내 수행. 코드 0줄.
A1 — asmdef/InternalsVisibleTo 사전 점검 세션 (60분)
목적: Sp00 회귀 2건 재발 방지 레이어 실사. Go/No-Go §A~§D 7개 체크 수행.
작업:
- Unity 6 에디터 열기 → Project 창에서 asmdef 3개 선택 → Inspector에서 references 육안
- Console 새 에러 0 / Warning만 확인
Unity6/Assets/전체 검색[assembly: InternalsVisibleTo→ 히트 1건 (TranscendentStageSO.cs:22)- Sp00 SmokeTester 빈 씬에 붙이고 Play →
[Smoke] Loaded 200 stages로그 재확인 - 결과를
sprints/sprint-01.md§7 Go/No-Go 체크박스 7개 tick
산출: Sprint 01 킥오프 GO 확정 기록 1줄.
A2 — TSV 경로 해석 템플릿 메모 (15분)
목적: R-DR-02 (TSV 경로 drift) 사전 차단.
작업:
- Sp00
TranscendentStageImporter.ResolveTsvPath:125로직 재확인 + designs/ 경로 용 상수 1줄 예시 메모:
// 예시 (실제 작성은 #02 태스크에서)
private const string TSV_REL_PATH = "../designs/transcendent_drop_table.tsv";
// 3개 후보 탐색: Application.dataPath, dataPath/.., ProjectRoot
- 3개 Importer 각각에 경로 상수 제자리 (공통 TsvReader 이월 DQ3)
산출: 경로 메모 1건 (커밋 파일 아님, 에이전트 작업 공간).
A3 — Data 어셈블리 신규 파일 체크리스트 (10분)
목적: R-DR-01 (CS0579) 사전 차단.
작업:
- 체크 4항목 인쇄/고정:
namespace GodBlade.Data(파일 최상단)[assembly: InternalsVisibleTo(...)]복제 절대 금지 (Data asmdef 전체에 이미 1건 존재)using UnityEditor금지 (런타임/Data 어셈블리). 필요 시#if UNITY_EDITOR가드- blittable 필드 유지 (int/enum/float/byte — DOTS 이식성)
- #02/#03/#04 SO 파일 생성 직후 매번 확인
산출: 체크리스트 1건.
§9. Sp00 회귀 2건 재현 리스크 태스크별 평가
§9.1 회귀 A — CS0246 Unity.ResourceManager 누락
원인: asmdef references 배열에서Unity.ResourceManager누락 →AsyncOperationHandle<T>타입 해석 실패 복구분:GodBlade.Runtime.asmdef:7/GodBlade.Editor.asmdef:9(scaffold audit §1.3·§1.4)
| 태스크 | 재현 확률 | 근거 |
|---|---|---|
| #01 GradeRemap | Zero | Runtime 타입 미사용. Data asmdef 는 Unity.ResourceManager 참조 불필요 |
| #02 DropRate | Low | SO + Importer 모두 Addressables Editor API 사용, Runtime AsyncOperationHandle 미사용. Editor asmdef 이미 참조 유지 |
| #03 Milestone | Low | 동상 |
| #04 AffixPool | Low | 동상 |
| #05 Import ALL | Zero | 새 타입 선언 없음 |
| W2 #06 Tests.Editor asmdef 신설 (참고) | High (별건) | 설계 §8.2 에서 UnityEngine.TestRunner + Unity.ResourceManager 누락 시 재발 — scaffold audit D7 (P1) 경고 항목. W1 범위 아니나 W2 첫 날 주의 필요 |
W1 전체 재현 확률: Low (Addressables 직접 사용 없음. #06 이 고위험 포인트지만 W2).
§9.2 회귀 B — CS1061 / CS0579 InternalsVisibleTo 관련
원인:internal메서드가 어셈블리 경계 못 넘음 (CS1061) 또는[assembly: InternalsVisibleTo]중복 선언 (CS0579) 복구분:TranscendentStageSO.cs:22단일 선언 유지 (scaffold audit §1.5)
| 태스크 | 재현 확률 | 근거 |
|---|---|---|
| #01 GradeRemap | Zero | InternalsVisibleTo 불필요 (public enum + public static class) |
| #02 DropRate | Medium | SO 1번째 신설 — Sp00 패턴 습관적 복제 유혹. CP-M02 최우선 |
| #03 Milestone | Medium | SO 2번째 신설 — 같은 함정 |
| #04 AffixPool | Medium | SO 3번째 신설 — 피로도 최고, 실수 확률 최상 |
| #05 Import ALL | Zero | SO 신설 없음 |
W1 전체 재현 확률: Medium — #02/#03/#04 3번 연속 SO 신설 = ⭐ CP-M02 매 PR 재확인 필수. grep 1회 (\[assembly: InternalsVisibleTo) 로 차단 가능.
§9.3 재현 방지 메커니즘 총 2건
- 구조적 가드: scaffold-sync-audit §1.5 "Unity6/Assets 전체 grep 결과 단일 지점" 불변식. 신규 파일 추가할 때마다 grep 재실행 → 1건 유지 확인.
- 프로세스 가드:
shared-checkpoints.md⭐ CP-M01·CP-M02 최상위 고정. Sprint 01 W1 서브셋 13개 중 #1·#2 위치. PR 머지 전 체크박스 필수.
§10. 메타정보
- 작성자: code-lead (프로그래밍 리드)
- 작성일: 2026-04-21 (Sprint 00 D+1, Sprint 01 킥오프 D-13)
- 감사 범위: Sprint 01 W1 태스크 #01~#05 5건
- 입력 자료:
sprints/sprint-01.md§3 (W1 5건)designs/sprint-01-w2-importer-design.mdv1.0 APPROVED (§9 CP9-1~11)sprints/shared-checkpoints.mdv1.0 (CP-M01~M23, Sp01 W2 서브셋 13개)designs/scaffold-sync-audit-2026-04-21.md(drift 9건, P0=0)designs/d8-stat-key-validation-2026-04-21.mdv1.0 APPROVED (BuildSummary 네이밍 B안 = 외부 표준명 + Importer 매핑)- 메모리:
project_sprint01_w2_importer_design.md/feedback_codelead_review_compile_verify.md - 실사 확인 파일:
Unity6/Assets/Editor/Importers/TranscendentStageImporter.cs:24,72(namespace GodBlade.EditorTools + public static Import 확인)Unity6/Assets/_Project/Scripts/Data/TranscendentStageSO.cs:22(InternalsVisibleTo 단일 선언)Unity6/Assets/_Project/Scripts/Data/GodBlade.Data.asmdef(references [])designs/transcendent_drop_table.tsv(61줄 = 60 데이터행)designs/transcendent_milestone_reward.tsv(23줄 = 22 데이터행)designs/transcendent_affix_pool.tsv(7줄 = 6 데이터행)- 드라이런 제약 준수:
- 실제 코드 0줄 ✅
Unity6/폴더 수정 0건 ✅- Sprint 01 설계 v1.0 APPROVED 변경 제안 0건 ✅
- 감지·권고만 ✅
- 코드 작성 Write 호출: 1회 (본 파일)
- 드라이런 소요: 약 2시간 (독서 45분 + 분석 45분 + 문서 작성 30분)
§11. 판정 요약
2026-05-04 Sprint 01 킥오프 → GO (Yellow-Green)
- P0 블로커: 0건
- P1 완화 권장: 3건 (A1 asmdef 점검 / A2 TSV 경로 메모 / A3 Data 어셈블리 체크리스트)
- Sp00 회귀 2건 재현 최고 확률 포인트: #02/#03/#04 SO 신설 시 CS0579 (InternalsVisibleTo 중복) → CP-M02 grep 매 PR 필수
- W1 실공수 예상 밴드: 6.5~9.0h (설계 6.0h + 회귀 버퍼 0.5~1.5h + 경로 해석 0.5h)
- 최대 주의 태스크: #02 DropRateTableImporter (3개 M 리스크 동시). 3단 분할 커밋 권장.
- 휴먼 에러 최고 위험 태스크: #04 AffixPoolSO (
valueEntries빈 리스트 유지 = PD 명시 제약. 코드는 간단하지만 범위 일탈 유혹 최고). PR diff 검사 필수.
(끝 — v1.0, 2026-04-21 code-lead 작성)