BurningTimesAi/공유/대화로그/FirstRising/2026-09-18.md

171 lines
24 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FirstRising 대화로그 — 2026-09-18
> 프로젝트 경로 `C:\BurningTimes\FirstRising` (origin `bluecell2/FirstRising` · `master` `7502f027e4`) · 선행 사례 = `공유/대화로그/ReaperGirlIdle/2026-09-17.md` §1 · `공유/대화로그/ImmortalSword/2026-09-17.md` §4·§5
## 1. 프로젝트 세션 개시 + DataTables JSON → CSV → 엑셀 시트 추가 (PM 직접 집행)
### PD 원문 (2026-09-18 01:28)
> ① "이 세션은 우리 조직의 "FirstRising" 프로젝트 세션이야. 프로젝트 경로는 "C:\BurningTimes\FirstRising\" 이고, 기존 "ImmortalSword" 프로젝트와 동일하게, "FirstRising\DataTables\TableManager" 경로에 관리용 엑셀 테이블 "FirstRising"를 만들어두었어. "FirstRising\DataTables\TableManager" 경로의 json 파일들을 csv로 변환한 후 "FirstRising" 엑셀에 시트로 추가해줘."
### 실측
| # | 실측 | 근거 |
|---|------|------|
| 1 | 지시 경로 `DataTables/TableManager` = `FirstRising.xlsm` 1개뿐(JSON 0) · `DataTables/` = 기획 원본 xlsm 57개(JSON 0) · 그 밖의 프로젝트 JSON 은 설정 파일뿐 → 데이터 테이블 JSON 은 **`Assets/DataTables` 92개**가 유일(하위 `MonsterSpawnTables/` 3 포함 · `Assets/DataTables` 추적 185파일 작업 트리 변경 0) | 디렉토리 전수 · `git status` |
| 2 | 워크북 = **2시트 템플릿**(Info·ShopConfig · 119,672B · SHA256 `750BEA80…B530`) — ImmortalSword·ReaperGirlIdle 워크북과 해시 불일치 · VBA 10모듈(§5 패치 포함: `CsvQuote`·`RootFolderLabel`) · `theme1.xml`·`connections.xml`·`customXml/item1.xml`·`ctrlProp1.xml` = ImmortalSword §5 저장본과 바이트 동일 · `DataTables/TableManager/` git 미추적·ignore 대상 아님 | 해시 · olevba · zip 파트 · `git check-ignore` |
| 3 | 기존 헤더 `ShopConfig` 1행 = **Accent6(서버 서식)** → 복제할 클라 헤더 없음. 클라 서식 값은 ImmortalSword `ShopGoods!A1`(COM ThemeColor 4 · TintAndShade −0.499984740745262 · 글꼴 ThemeColor 1 · 굵게) 채택 — 테마 동일(실측 2)이라 같은 색 | openpyxl · COM |
| 4 | JSON 92종 전부 레코드 객체 배열 · 16,005행 · 168,156셀 · 파싱 오류·충돌 마커 0 · 중첩 0 · bool 0 · null 0 · 빈 문자열 0 · CR 0 · **키 생략 58,301셀**(명시적 숫자 0 도 4,562셀 · 같은 열에 0·생략 혼재 45열) · **전체 빈 레코드 `{}` 62개**(ChapterDefaultWaveWeight 35 · ChapterWave3·8·13 각 3 · SpecialTrainingAbilityTable 18 — 전부 파일 끝부분) · 줄바꿈 포함 문자열 804셀 · 최장 셀 710자 · 지수 표기 숫자 0(`70E53` 200건은 문자열 안 `<color=#70E53E>`) | 분석 스크립트 |
| 5 | **숫자·문자열 혼재 열 = 원본 16열·354셀** — `AdminTable.AccountId`(실측 6) 1열·1셀 + 나머지 **15열·353셀**. 예 `ItemOptionTable.AbilityValue` 문자열 `"10"` · `EliteWeaponSkillTable.Level` `"a"` · `GradeWeaponSkillTable.RandomSpawnCount` `" "` · `ShopTable.RefreshPeriod` `Daily`/`720` · `LocalizeMapTable.Id` `300101_difficulty_0`/`300201` | 분석 스크립트 |
| 6 | **`AdminTable.AccountId` = 21자리 정수 5개 + 40자 문자열 1개** — Excel 유효숫자 15자리 초과(숫자 셀이면 끝자리 손실) · C# `AdminJson.AccountId` = `string` | 분석 · `JsonCommon.cs:1452` |
| 7 | 매크로(VBA 원문): 빈 셀 → JSON `""`(`JsonCellValue` `vbEmpty`) · **내보낼 마지막 행 = A열 `End(xlUp)`**(CSV·JSON·서버 CSV 공통, dump 1033·1060·1109) · 클라 루트 = `GetParentPath(ThisWorkbook.path)` · 프로젝트 루트 = 상위 경로의 `Assets` 폴더 탐색, 없으면 3단계 상위 폴백(dump 1382-1396) · 서버 CSV 탐색 깊이 7 / JSON 소비처: Cook(`EditorUtilMenu.cs:18·36-79` · 최상위 `*.json` · 프리팹 있는 테이블만 · 프리팹 76 · 루프 전체 단일 try) · 베이커 `ChapterStatusAuthoring.cs:18-24·90` · `CheatEditorWindow.cs:30-48` · 서버 복사 배치 `GameHub/CopyCommon_2.bat`(`DataTables` JSON 복사 38줄 → `DeadArchiveServer2\GameServer\GameData`) — 전부 `Newtonsoft.JsonConvert.DeserializeObject` 기본 설정 | VBA 원문 · 코드 |
| 8 | Excel 16 COM · 실행 중 Excel 0 · 파일 잠금 없음 · 게임 레포 추적 파일 수정 표시 4건(`ProjectSettings` 3 · `TemplateMenuItems.cs` — 세션 시작 전 · 본 작업 무관) · 프로젝트 `CLAUDE.md` 서술 3건이 실측과 불일치: `6000` 체크아웃(:13 — 실제 `master`, 로컬·origin 에 `6000` 없음) · master `.cs` 충돌 마커 107개(:14 — HEAD 0) · ProjectSettings stash 충돌(:18 — 0) | 프로세스 · 잠금 테스트 · `git branch -a`·`git grep` |
### 결정과 기각안 (C32)
**결정 1 — JSON 원천 = `Assets/DataTables` 92개(하위 폴더 포함)**: 지시 경로에 JSON 부재(실측 1) · 데이터 테이블 JSON 은 이 한 곳뿐 · "ImmortalSword 와 동일하게"·ReaperGirlIdle 지시 문언("`Assets\DataTables` 경로의 json 파일들")과 같은 대상. 집행은 백업 + 시트 추가뿐이라 원복 가능.
- 하위 폴더 3개 시트명 = `MonsterSpawnTables_1~3`. 시트명 = 매크로 내보내기 파일명이므로 이 시트는 루트의 `MonsterSpawnTables_1.json` 으로 저장되고 원 경로 `MonsterSpawnTables\1.json` 으로는 돌아가지 않는다. 현재 이 3파일을 읽는 코드 없음(Cook 최상위만 · `CookMonsterSpawn` 주석 처리 `EditorUtilMenu.cs:81-165`).
- 철자가 다른 별도 파일 `ChpaterWave13`·`ChpaterWave1001` 도 파일 그대로 별도 시트.
- **기각안 A — 지시 경로 문자 그대로 적용 후 PD 재확인**: 대상이 유일해 의도가 명확(C47) · 재확인은 결과 없는 대기.
- **기각안 B — 하위 폴더 제외(ReaperGirlIdle 스크립트는 최상위만)**: 같은 형식의 데이터 테이블이며 "json 파일들" 누락. 시트명 `1`·`2`·`3` 은 식별 불가라 폴더명 접두.
**결정 2 — 구성·서식·형 보존·CSV 형식 = ImmortalSword §4 결정 1~3 · ReaperGirlIdle §1 결정 2 그대로**: Excel COM 저장(`AutomationSecurity=3` 매크로 강제 비활성 · 저장 없는 DryRun 선행) · 1행 헤더 = JSON 키 원문(첫 등장 순서) · 클라 헤더(실측 3 값 · Accent6 미사용) · 텍스트 열 `@` 선지정 · 1행 틀 고정 · 열 너비 자동(텍스트 상한 60) · CSV = UTF-8 BOM·CRLF·전 필드 따옴표·RFC 4180. 기존 2시트 미변경, 데이터 시트는 그 뒤에 추가. 빈 레코드 `{}`(실측 4)는 빈 행으로 보존.
**결정 3 — FirstRising 데이터 대응**
- **혼재 열(실측 5)**: 열 전체 `@` 가 아니라 **문자열 셀만 셀 단위 `@`**(15열·353셀) → 숫자는 숫자 셀, `"10"`·`"a"` 는 텍스트 셀로 JSON 타입 그대로. 기각안 — 열 전체 `@`: 숫자 셀 서식이 텍스트가 되어 편집 시 숫자 입력이 문자열로 바뀐다.
- **21자리 정수(실측 6)**: **텍스트 셀**로 자릿수 보존 → `AccountId` 열은 전체 텍스트 열. 기각안 — 숫자 셀(타입 보존 원칙 우선): `106194766253187001004` 가 `1.06194766253187E+20` 으로 값 손실(C6). C# 필드가 string 이라 매크로가 문자열로 내보내도 역직렬화 호환.
- **시트 순서**: 파일 탐색기 이름순(대소문자 무시·숫자 자연 정렬 — `ChapterWave0·1·3·8·13·1001·1101`).
**CSV 파일**: `C:\BurningTimes\FirstRising\output\DataTables_csv\*.csv` 92개(1,118,660B) — 선행 2건과 같은 위치 규칙. 셀 텍스트 = JSON 리터럴 그대로(21자리 정수 포함).
### 집행
1. **백업(C6)**: `공유/개발팀_백업/FirstRising/FirstRising.xlsm.bak_20260918_0138.xlsm` (119,672B · SHA256 원본 일치 · `*.bak_*` gitignore = 이 PC 로컬 보존)
2. 변환: CSV 92 + 정규화 데이터 + 순서 매니페스트 (ReaperGirlIdle `prep_rgi.py` 확장)
3. DryRun(저장 없음 · 해시 가드 · 시트 = 정확히 Info·ShopConfig 가드 · 불일치 시 저장 차단 가드): 불일치 0 · 원본 해시 불변 · 37초
4. 본 실행 **01:44:20 저장** — 시트 2 → **94** · 119KB → 957KB (SHA256 `FC0D460E…6138`) · 활성 시트 ShopConfig 유지 · Excel 잔존 0 · 잠금 파일 잔존 0
### 검증
- **Excel 세션 내**(저장 전): 168,156셀 Value2 타입·값 불일치 0 · `.Text` 2,038셀(비정수 숫자 전부 · 열별 최장 정수 · 255자 초과 텍스트) 불일치 0 · 혼재 열 문자열 353셀 `@` 적용
- **별도 Excel 읽기 전용 세션 `.Text` 전수**(pywin32 · 매크로 강제 비활성): 비어 있지 않은 109,855셀 불일치 0 · 숫자 `###` 0 · 파일 해시 불변
- **Excel 밖 독립 검증**(openpyxl + olevba · 백업 대비 · **원본 JSON 직접 대조**, 정규화 데이터 비경유) — **PASS**:
- 대상 범위: 원본 JSON 92 = 매니페스트 = 정규화 92 = CSV 92 · 시트 순서 = Info·ShopConfig + 자연 정렬 92 · 활성 시트 동일
- 기존 2시트 값·채우기·굵게·표시 형식·병합·틀 고정·열 너비 변경 0
- 데이터 168,156셀(숫자 94,250 · 텍스트 15,600 · 21자리 텍스트 5 · 빈 셀 58,301) 불일치 0 · 텍스트 셀 `@` 누락 0 · 숫자 셀 `@` 0 · 범위 초과 0 · 2행 글꼴 맑은 고딕 10 · 헤더 = 클라 서식(테마 3·틴트 −0.5·흰 굵은 맑은 고딕) · Accent6 헤더 0 · 틀 고정 A2
- CSV 92: BOM·CRLF·전 필드 따옴표 · 엄격 파싱 · 숫자 = **JSON 리터럴 원문과 문자열 일치** · 불일치 0
- 파트 유실 0 · `connections.xml`·`customXml/item1.xml`·`ctrlProp1.xml`·`drawing1.xml`·`vmlDrawing1.vml`·`theme1.xml` 바이트 동일 · 버튼 매크로 `SaveSelectedSheetsAsCSV` 유지
- VBA 10모듈 중 9개 코드 동일 · `UserForm` 은 `Attribute VB_Base` GUID 1줄만 상이(선행 2건과 같은 현상) · 추가 모듈 0
### 발견 이슈 3건 (C3 · PD 결정 안건 — 매크로 내보내기 경로, 미수정)
- **이슈 1 — 저장 위치**: 클라 JSON·CSV 루트 = 워크북 폴더의 상위 = **`FirstRising\DataTables`**(git 추적 기획 원본 xlsm 폴더 — 내보내면 JSON 92개가 여기 생김). 게임 소비처(실측 7)는 전부 `Assets\DataTables` 를 읽는다. 워크북 상위에 `Assets` 가 없어 프로젝트 루트 폴백 = `C:\BurningTimes` → Tino 경로 `C:\Tino` · 서버 CSV 자동 탐색 루트 `C:\`(깊이 7)도 어긋난다. ImmortalSword·ReaperGirlIdle 은 워크북이 `Assets\DataTables\TableManager` 라 문제가 없던 배치 차이.
- **이슈 2 — 빈 셀 `""`**: 키 생략 셀 58,301개가 빈 셀이 되고, 매크로는 `"키": ""` 로 내보낸다. 비nullable 값 형식 필드에서 Newtonsoft 역직렬화 예외. **실증(int 1건)**: `InstantSkillElement.Index`(int · `Json.cs:627`)는 10행 중 8행 키 생략 → `[{"Index":""}]` = `Error converting value {null} to type 'System.Int32'. Path '[0].Index'` · 키 생략 시 `Index=0` 정상. 실행 = Visual Studio 18 NuGet 폴더의 `Newtonsoft.Json.dll`(파일 버전 13.0.3)을 PowerShell `Assembly.LoadFrom` 후 `JsonConvert.DeserializeObject(string, Type)` 호출. 프로젝트 DLL(13.0.2)은 강력한 이름 검증 실패로 로드 불가 — 우회는 보안 설정 변경이라 미실시. 영향: Cook 은 첫 예외에서 이후 테이블 Cook 과 `UpdateEntitySceneGlobalDependency()` 호출이 모두 건너뛰어짐 · 베이커 `ChapterStatusAuthoring` · `CheatEditorWindow` · 서버 복사 배치(서버 측 미실측).
- **이슈 3 — 행 절단**(pm-auditor 탐지 · PM 재실측 확인): 마지막 행을 A열(첫 키)로만 판정 → A열 키가 생략된 뒤쪽 행이 **조용히 누락**. **36/92시트 · 1,725/16,005행** — 예 SurviveTheStorm 211→1 · MissionEventTable 97→1 · LocalizeSurvivalDiaryTable 126→1 · DateTimeMissionEventTable 284→143 · Item_ 6종 1160→1011 · InstantSkillTable 10→6. 코드 판독 + 데이터 실측(매크로 미실행). ImmortalSword·ReaperGirlIdle 현재 데이터는 해당 0.
- **수정 시 제약**: ① 이슈 1(루트)만 먼저 고치면 이슈 2·3 상태로 실제 게임 JSON(git 추적 185파일)을 덮어쓴다 → 3건 동시 또는 루트를 마지막에. ② `""` 규칙은 ImmortalSword 빈 문자열 17·ReaperGirlIdle 19 보존용(§5 결정 3 기각안) — 일괄 "키 생략" 전환은 두 워크북 회귀 → 타입 인지 규칙 필요. ③ 근본 해결 = 이슈 3 전 열 기준 마지막 행 판정 · 이슈 1 루트 판정 로직 수정 또는 워크북 배치 정렬 · 이슈 2 타입 인지 빈 셀 규칙 (A열 채우기·빈 셀 0 채우기는 proxy — C2-2).
### 원본 데이터 관찰 (값은 그대로 보존)
- 숫자 열 안의 문자열(실측 5 — `EliteWeaponSkillTable.Level` `"a"` · `GradeWeaponSkillTable.RandomSpawnCount` `" "`) · 전체 빈 레코드 `{}` 62개(실측 4) · 철자가 다른 별도 파일 `ChpaterWave13`·`ChpaterWave1001`(정상 철자 파일과 내용 다름)
### 감사 (C35-1 #5 · PD 보고 발신 전)
- pm-auditor 사전 감사 판정 = **발송 보류 · Critical 1 · Major 1 · Minor 9**. PM 재실측으로 지적 수치·코드 근거 전부 확인 후 본 엔트리에 반영:
- Critical = 이슈 3 누락 → 추가 / Major = 이슈 2 영향 범위를 Cook 으로만 한정 → 베이커·에디터·서버 배치 추가
- Minor 반영: 혼재 열 기준 명시(16/354 → 셀 단위 15/353) · 작업 트리 변경 0 범위 한정 · 기존 시트 비교 속성 명시 · 이슈 2 실증 실행 방식 기록 · 하위 폴더 시트 내보내기 영향 · "기본값 생략 형식" 문언 정정(명시적 0 혼재) · 경로 폴백 영향(Tino·탐색 루트) · CLAUDE.md 불일치 3건 · 줄바꿈 804셀
- PM 자체 정정: 혼재 열 "13개" 오기 → 정정 / PM 추가 발견: 빈 레코드 `{}` 62개
- **P19 자진 기록**: PD 지시 로그 BT18 은 착수 시가 아니라 **완료 후 01:47 등록**(시작 단계 등록 누락).
- 감사관 관찰(미조치): `.live/` 에 BT16·BT17·BT18 기록 없음 — 개별 정정보다 운용 실태 안건.
- **교훈**: 선행 사례와 데이터 형식이 다를 때(여기서는 키 생략) 값 변환 축(`""`)만이 아니라 **내보내기 코드의 행·열 범위 판정 축**까지 대조해야 한다. PM 은 빈 값 → `""` 만 분석하고 A열 기준 마지막 행 판정을 놓쳤다.
### 참고
- 새 92시트는 코드네임 미부여(매크로 비활성 상태에서 추가 — 선행 2건 동일). 매크로는 시트를 이름·순회로 다뤄 영향 없음
- 매크로 JSON·CSV 내보내기는 지시 범위 밖이라 실행하지 않음 · 이슈 3건 수정도 PD 지시 전 미적용
- `ShopConfig` 템플릿 시트(서버 서식·`s_`/`n_` 헤더) · 프로젝트 `CLAUDE.md`(게임 레포 문서)는 지시 범위 밖이라 미변경
- 커밋: BT16 ④ "커밋은 내 지시 전까지 진행하지 말고 대기해." 해제 전 → BT 기록 작업 트리 보존(대화로그 3파일 + PD 지시 로그 BT17·BT18 미커밋 = C18 조직 공유 미완) · 게임 레포 미커밋 — `DataTables/TableManager/`·`output/` 은 ignore 대상이 아니라 `git add -A` 시 xlsm 957KB·CSV 92개가 함께 들어감 (→ 이후 PD 가 xlsm 만 직접 커밋·push, §2)
## 2. 게임 레포 pull 차단 해소·최신화 + 관리 테이블 반영 여부 확인 (PM 직접 집행)
### PD 원문 (2026-09-18 22:5x · ③은 작업 중 추가)
> ② "최신 레포 Pull 받으려고 하는데 충돌나는거 같아 확인해보고 최신화 시켜줘."
>
> ③ "내가 푸시한 관리 테이블이 레포에 반영안된거 같아"
### 실측
| # | 실측 | 근거 |
|---|------|------|
| 1 | 로컬 `master` = `631315a225`(PD 커밋 "관리용 테이블 추가" 08:28:55 · xlsm 957,252B = §1 저장본 `FC0D460E…`) · **behind 5 / ahead 0** · PD pull 시도 흔적 = 22:56:19 fetch · 22:56:42 `FETCH_HEAD`·`ORIG_HEAD` 기록 · merge 미진행(`MERGE_HEAD` 없음·HEAD 불변) | `git status -b` · reflog · `.git` 상태 파일 |
| 2 | **③ 관리 테이블 = GitHub 반영됨**: `origin/master` 에 "update by push" **08:29:10** 기록 · `631315a225` 는 GitHub master(`c4eb07a548`, `ls-remote`)의 조상 · `DataTables/TableManager/FirstRising.xlsm` 957,252B 가 GitHub master 트리에 존재 · 그 위에 bluecell2 커밋 5개(12:16~17:53)가 쌓여 커밋 목록 최상단이 아님 · CSV `output/` 은 미추적(레포에 없음) | `ls-remote` · `merge-base --is-ancestor` · `ls-tree` · origin/master reflog |
| 3 | **pull 차단 원인 재현**(변경 없는 dry run `git read-tree -m -u -n HEAD origin/master`): `Entry 'ProjectSettings/ProjectSettings.asset' not uptodate. Cannot merge.` — 유일한 차단 | dry run |
| 4 | 차단 파일 내용 = HEAD 와 동일(필터 적용 해시 = 인덱스 blob `c6c8d535e4`) · 작업 트리 LF / 이 PC git `core.autocrlf=true`(Git 설치 기본값) + 레포 `* text=auto` → 체크아웃은 CRLF. Unity 가 08:29 LF 로 다시 저장 → 크기 변화만으로 git 이 "수정됨" 판정(내용 비교 전 크기 불일치로 확정) → 들어오는 커밋이 같은 파일을 바꾸므로 병합 거부 | `hash-object` · `rev-parse :path` · 줄바꿈 판별 |
| 5 | 같은 상태(내용 동일·줄바꿈만 다름) 5파일 더: `TemplateMenuItems.cs`·`DOTweenSettings.asset`·`EditorBuildSettings.asset`·codecoverage `Settings.json`·`ShaderGraphSettings.asset` — 들어오는 커밋과 겹치지 않아 이번 pull 은 막지 않음. **실제 로컬 변경은 `TagManager.asset` 1개**(태그 7개 Bullet·FxTemporaire·OreNode·AnimTag·zombie·target·Particle + 레이어 `UIEffects`) — 원격에 없음 | `git diff` · 해시 대조 |
| 6 | Unity 6000.3.9f1 가 FirstRising 을 연 상태(에디터 + 임포트 워커 6) · Git 클라이언트 = TortoiseGit 설치 | 프로세스 · 설치 경로 |
### 결정과 기각안 (C32)
**결정 — 차단 파일 1개만 HEAD 로 복원 후 fast-forward 전용 병합**: 차단 파일은 내용이 HEAD 와 같아(실측 4) 복원해도 잃는 내용이 없고, 로컬 커밋이 없어(ahead 0) 병합 커밋 없이 앞으로 감기만 하면 된다. 실제 로컬 변경(`TagManager.asset`)과 나머지 5파일은 손대지 않는다.
- **기각안 A — 전체 stash → pull → pop**: 줄바꿈만 다른 변경을 상류가 바꾼 `ProjectSettings.asset` 위에 되얹게 되어 무의미한 충돌·재작성만 생긴다.
- **기각안 B — `git pull` 기본(병합 커밋 허용)**: fast-forward 가 가능한데 병합 커밋을 만들 이유가 없다.
- **기각안 C — 줄바꿈 상태 6파일 전부 복원**: pull 에 불필요하고, 열린 Unity 가 Amplify 에디터 스크립트 재컴파일 등 재임포트를 하게 되며 Unity 가 다시 저장하면 재발한다.
- **기각안 D — Unity 종료 후 pull**: PD 의 편집 세션(저장 안 된 작업 가능성)이라 PM 이 닫을 대상이 아니다.
### 집행
1. **백업(C6)**: 수정 표시 7파일 + `local_changes.patch` → `공유/개발팀_백업/FirstRising/FirstRising_localchanges.bak_20260918_2304/` (해시 7/7 일치 · `*.bak_*` gitignore = 이 PC 로컬 보존)
2. 가드: HEAD `631315a225`·origin/master `c4eb07a548` 불변 · 차단 파일 내용 = HEAD 확인 → `git checkout -- ProjectSettings/ProjectSettings.asset` → dry run 통과
3. **`git merge --ff-only origin/master` — `631315a225..c4eb07a548` fast-forward**(38파일 +10,482/−2,826 · 신규 `Assets/Scenes/test.unity`·`Scripts/Test/TestMonstersController.cs`·`Scripts/Entity/CompanionComponentRegistration.cs` · 삭제 `GameAssets/DataTables/EventTradeTable.prefab`)
### 검증
- HEAD = GitHub master = `c4eb07a548` · `## master...origin/master`(앞섬·뒤처짐 0)
- 남은 로컬 변경 = `TagManager.asset`(실제 변경, 보존) + 줄바꿈만 다른 5파일 + `output/` 미추적 — 의도대로
- xlsm 해시 불변(`FC0D460E…`) · 이번에 바뀐 텍스트 파일 36개 충돌 마커 0 · 신규 파일 존재·삭제 파일 부재
- 상류 설정 변경 = `ProjectSettings.asset` 미리 로드 에셋 1줄 추가 · `QualitySettings.asset` 직렬화 버전 4→5·`meshLodThreshold`·`Nintendo Switch 2` 항목(엔진 업데이트 직렬화)
- 테이블 프리팹 76 → 75(`EventTradeTable` 삭제 · 대응 JSON 없음 → §1 시트 영향 없음)
- Unity 는 아직 새로고침 전(Editor.log 에 pull 이후 임포트·컴파일 기록 없음) — 창 포커스 시 임포트
### 재발 원인·근본 해결안 (C2-3 · PD 결정 안건 · 미적용)
- Unity 는 설정·씬 파일을 LF 로 저장하고 이 PC git 은 CRLF 로 체크아웃한다 → Unity 가 파일을 다시 저장할 때마다 내용이 같아도 "수정됨"이 되고, **팀원이 같은 파일을 바꾼 커밋을 받을 때마다 pull 이 다시 막힌다**(현재 5파일이 이미 그 상태).
- 근본안: 레포 `.gitattributes` 에 Unity 텍스트 에셋 `eol=lf` 지정 + 1회 줄바꿈 정규화(팀 공용 변경 → PD 결정) / 대안: 이 PC 만 `core.autocrlf=input` + 재체크아웃(Unity 대량 재임포트 동반).
### PD 지적 (보고 전 pm-auditor 호출 중 중단)
> "지금 무슨 작업을 하고 있는거지? 왜 내 지시 없이 대량의 토큰을 낭비중인거야?"
- 상황: ②③ 집행·검증·기록 완료 후 보고 직전 pm-auditor(C35-1 #5) 호출 → PD 가 중단. **감사 결과 없음**(미도착 판정 인용 금지).
- PM 판단 착오: 단순 운영 작업에 무거운 감사(같은 세션 §1 감사 약 18분·334K 토큰)를 C50(과도 토큰 사전 PD 승인) 없이 진행. 이후 대량 토큰 에이전트 호출은 비용·선택지 사전 보고 → 승인 시에만 진행.
### PD 지시 (23:1x) — BT19-Org
> "보고 전 감사 의무는 내가 지시하기 전까지는 당분간 보류해."
- 적용 범위(C19 자구 해석): C35-1 #5(PD 결정·현황 보고 응답 발신 전 pm-auditor 사전 호출)만 보류 · 나머지 C35-1 항목 유지 · 해제 = PD 지시 시
- 기록: PD 지시 로그 BT19-Org · PM 메모리 `feedback_c35_report_audit_hold.md` · 규칙 SOT 본문 미개정(임시 보류)
> (정정) "아니, 내가 별도 지시하기 전까지 감사는 모두 생략해."
- 적용 범위 확대: **감사 호출 전부 생략**(C35-1 7종 pm-auditor · dev-auditor · plan-auditor · C35-11 사후 검증) · 해제 = PD 지시 시 · BT19-Org·메모리 갱신
## 3. WL 프로젝트 병렬·토큰 효율 체계 → FirstRising 반영 가능성 검토 (PM 직접)
### PD 원문 (2026-09-18 23:2x)
> ④ "나는 FirstRising씬을 WL 프로젝트와 같이 병렬로 다양한 작업을 동시에 진행하면서 토큰을 효율적으로 사용하는 체계를 구축하고 싶어. 따라서 WL 프로젝트 관련 문서 확인해보고 이 프로젝트에 반영가능한지 체크해서 보고해."
### 확인 문서 (NerdNavis 조직 레포 `E:\NerdNavisAi`)
`공유/WL_병렬작업/00_WL_병렬개발_프로세스_v1.md`(§0~9·12·15~17) · `토큰절감_근본대책_2026-09-15.md` · `memory/org/feedback_wl_lead_token_diet.md` · `STATE.md` · 설계 대화로그 §17~18 · 게임 레포 `E:\NerdNavis\nn_himminji` + worktree 5개(`E:\NerdNavis\WL_wt\{data,gameplay,gameplay2,systems,ui}` · 브랜치 `wl/<레인>/WL-<id>-<slug>`)
### 실측 (FirstRising)
Library 23.4 GB·167,843파일(WL 11 GB 의 2배) · 추적 파일 137,406 · pack 37 GiB · C: 여유 934 GB · RAM 31.9 GB 중 가용 8.1 GB(Unity 메인 5.4 GB) · 24스레드 · Unity CLI 있음 · WL 도구 `E:\NerdNavisAi\scripts\wl\` 8종 · BT 고정 주입 = CLAUDE.md 12.5 KB + 코어룰 인덱스 11.8 KB(+세션 훅) / 서브에이전트 `bt-foundation` 21.4 KB + `bt-index` 5.4 KB · BT C24 = 단일 세션 원칙(별도 새 대화 금지)
### 판정 요지
- WL 은 v1(Lead + 워커 세션 3 · worktree · 에디터 3층 · 리뷰/QA 에이전트)에서 09-15 토큰 질책 후 경량 운영으로 개정(인계 색인+델타만 읽기 · 15만 교대 · 워커 유니티 금지 · 기본 Lead 직접·워커는 독립 2건 이상일 때만 · 기록 1곳). 실측 워커 1건 ≈18만 토큰·11분 · "병렬은 시간을 줄이지만 총 토큰은 늘린다"(v1 §9)
- FirstRising: 문서 체계·worktree·워커 유니티 금지·스크립트 이식 = 가능 / 소유권 맵 = 재작성(대형 단일 파일·씬 핫스팟) / **PD 결정 3건**: ① 병합·push 주체(bluecell2 가 master 직접 push) ② BT C24 단일 세션 원칙 예외 ③ 고정 주입 다이어트·기록 1곳(헌법 사항) / 선결 = 줄바꿈 `.gitattributes` 정리(§2 원인 · WL 은 YAML 병합 드라이버를 가짜 충돌로 제거한 교훈)