CLAUDE.md 정리 (중복, 충돌, 개선)

파일 역할 분담 개선
ProjectSS/
├── CLAUDE.md      ← 규칙 (거의 안 변함) · Claude Code용
├── AGENTS.md      ← 프로젝트 정체성 (거의 안 변함) · Hermes용
├── ROADMAP.md     ← Phase별 계획·완료 기준 (기존 그대로)
└── docs/
    └── DEVLOG.md  ← 신규: 날짜별 작업 이력 + 미해결 이슈
This commit is contained in:
kyoung5seo
2026-08-06 22:19:13 +09:00
parent f64c4f3375
commit 8833e52fab
3 changed files with 183 additions and 133 deletions
+57 -103
View File
@@ -1,21 +1,33 @@
# Project SS — CLAUDE.md
> **위치:** repo root (`ProjectSS/CLAUDE.md`) — Claude Code는 root에서 실행한다.
> **규칙:** 작업 완료 후 "현재 Phase 상태" 블록을 반드시 업데이트한다.
> **이 파일의 역할:** 규칙만 담는다. 작업 이력·진행 상황은 `docs/DEVLOG.md`, Phase 계획은 `ROADMAP.md`.
> **상위 규칙:** 전역 정체성·개발 철학은 `~/.hermes/SOUL.md`, 프로젝트 정체성은 `AGENTS.md`에 있다.
> 이 파일은 그 위에 얹히는 **코드 레벨 규칙**만 다룬다.
---
## 개발 전략
## 작업 시작 전 체크
**그레이박스 우선 (Greybox First)**
게임플레이 재미 검증 → 그레이박스 테스트 → 비주얼 폴리싱 순서로 진행한다.
Phase 5(비주얼 폴리싱)는 그레이박스 테스트 피드백 반영 완료 후에만 착수한다.
**⚠️ 병렬 브랜치 확인 (필수)**
이 폴더가 유일한 작업 사본이 아니라면, 작업 시작 전 반드시:
```bash
git fetch
git log origin/main..HEAD # 내가 안 올린 커밋
git log HEAD..origin/main # 내가 안 받은 커밋
```
과거에 다른 세션이 origin에 푸시한 커밋을 로컬이 받지 못한 채 Phase 2~4를 독립적으로
재구현해 대형 충돌이 난 적이 있다. 경위는 `ROADMAP.md` 상단 박스 참고.
---
## 코드 컨벤션 (package.json으로 알 수 없는 것)
## 코드 컨벤션
- 전체 구조·아키텍처 원칙(상태 배치, `engine/` 경계, world 스냅샷 패턴) → @docs/architecture_design.md
- 실제 앱은 `client/` 안에 있음. npm 명령은 `cd client` 후 실행.
- 로컬에 Node.js LTS 설치되어 `npm run dev`로 실기 검증 가능 (Playwright 플레이 확인까지 완료).
- 플레이테스트는 리포 루트의 `playtest.bat` 더블클릭 (dev 서버 + 브라우저 자동 오픈).
파일명은 ASCII만 사용 — 한글/`chcp`를 넣으면 cmd.exe가 배치 파싱을 깨뜨린다(과거에 겪음).
- 스타일: 컴포넌트별 개별 `.css` (글로벌 클래스, CSS Modules 아님)
@@ -23,27 +35,40 @@ Phase 5(비주얼 폴리싱)는 그레이박스 테스트 피드백 반영 완
- 영구 저장: `localStorage` (도감 엔딩 저장 용도)
- 카드 데이터는 `client/src/data/cards.csv`를 papaparse로 런타임 파싱함
- `GameScreen.jsx`에 상태가 집중되어 있음 — 수정 시 주의, 리팩토링 필요 가능성
## ⛔ 보호 파일 (직접 수정/실행 금지 — 변경 제안은 가능)
- `client/update_csv.js` — cards.csv 전처리 스크립트 (데이터 변환 규칙: 컬럼 구조, 인코딩, 파싱 로직 등)
- `client/update_csv_tags.js` — 내러티브 태그 매핑 스크립트
**이유:** 두 스크립트의 출력 포맷(변환 규칙)이 바뀌면, 이를 읽는 게임 코드(papaparse 파싱 부분)가
깨지거나 데이터를 잘못 읽을 수 있다.
**규칙:** 이 스크립트들을 직접 고쳐서 실행하지 말 것. 단, Phase 진행상 스키마 변경이 실제로 필요한
경우(예: 새 컬럼/태그 카테고리 추가) 코드를 바로 바꾸지 말고, 어떤 변경이 왜 필요한지 설명하고
변경안(diff)을 먼저 보여준 뒤 승인을 받고 나서 적용할 것.
**단, `cards.csv` / `narrative_tags.json` 등 데이터 내용(카드 텍스트, 수치, 태그)은 자유롭게 다뤄도 된다.**
이 게임은 카드 밸런스와 스토리 개연성이 핵심이라, 데이터는 자동 생성으로 일괄 채우지 말고
디자이너가 직접 열어보고 검토·조정할 수 있는 형태로 제안할 것 (예: 몇 개씩 초안을 보여주고
피드백을 받아 반영하는 방식). 통짜로 대량 생성해서 덮어쓰지 말 것.
- 오염 카드 주입은 반드시 `client/src/engine/pollution.js`의 `previewPollution()`을 경유한다.
예고·주입·사후 알림이 이 단일 기준을 공유하므로, 우회해서 오염 카드를 만들지 말 것.
튜닝 수치는 `pollution.js` 상단 상수 블록에 모여 있다.
---
## 기획 문서 참조 (게임 규칙의 원본 — 코드 작성 시 이쪽을 기준으로)
## ⛔ 보호 파일 (직접 수정/실행 금지 — 변경 제안은 가능)
- `client/update_csv.js` — cards.csv 전처리 스크립트
- `client/update_csv_tags.js` — 내러티브 태그 매핑 스크립트
**이유:** 두 스크립트의 출력 포맷이 바뀌면 이를 읽는 게임 코드(papaparse 파싱)가 깨지거나
데이터를 잘못 읽을 수 있다.
**규칙:** 직접 고쳐서 실행하지 말 것. 스키마 변경이 실제로 필요하면(예: 새 컬럼/태그 카테고리 추가)
어떤 변경이 왜 필요한지 설명하고 변경안(diff)을 먼저 보여준 뒤 승인을 받고 적용할 것.
## 데이터 파일 다루는 법
`cards.csv` / `narrative_tags.json` 등 **데이터 내용**(카드 텍스트, 수치, 태그)은 자유롭게 다뤄도 된다.
단, 이 게임은 카드 밸런스와 스토리 개연성이 핵심이므로:
- 자동 생성으로 일괄 채우지 말 것
- 몇 개씩 초안을 보여주고 피드백을 받아 반영하는 방식으로 진행
- 통짜로 대량 생성해서 덮어쓰지 말 것
> ℹ️ SOUL.md의 "완성도보다 검증 속도 우선"은 **코드**에 적용된다.
> 데이터(카드 텍스트·밸런스)는 예외로, 디자이너가 직접 검토할 수 있는 속도로 제안한다.
---
## 기획 문서 참조 (게임 규칙의 원본)
코드 작성 시 항상 원본 문서를 기준으로 한다. **게임 규칙 수치를 이 파일에 복사하지 말 것.**
- 카드 타입별 스와이프 결과, 파라미터, 의회 액션 → @docs/Project_SS_서사형_덱빌딩_게임_시스템_기획서.md
- 파벌 12종 우호도 조건, 엔딩 매트릭스, 세계관 → @docs/Project_SS_스토리_바이블_v3_0.md
@@ -52,11 +77,9 @@ Phase 5(비주얼 폴리싱)는 그레이박스 테스트 피드백 반영 완
- 컬러/타이포/햅틱 수치 → @docs/ProjectSS_디자인_토큰.md
- 요구사항 정의 → @docs/ProjectSS_PRD.md
게임 규칙 수치를 이 파일에 복사하지 말 것. 항상 원본 문서를 참조한다.
---
## 현재 Phase 상태
## Phase 진행 순서
```
Phase 0 [x] 환경 세팅 & 아키텍처
@@ -69,81 +92,9 @@ Phase 5 [ ] 비주얼 폴리싱 & UX ← 그레이박스 테스트 완
`[x]` 완료 · `[~]` 부분 완료 · `[ ]` 미착수
**Phase 2 완료 시 남은 주의사항:** 오염 카드(신화/조직저항/사회공황/이사회압박) 콘텐츠는
등급별 1종씩만 채운 초안이다. 자세한 내용은 `ROADMAP.md` Phase 2 참고.
**Phase 3 완료 시 남은 주의사항:** 상임 이사회 8명의 투표는 아직 `성향 태그` 시스템이 없어
위험 수용 계수 기반 확률 처리로 남아있다. 자세한 내용은 `ROADMAP.md` Phase 3 참고.
**Phase 4 완료 시 남은 주의사항:** 엔딩 도감 localStorage 키를 `ss_endings_v2`로 교체했다
(기존 `ss_endings`는 제목 문자열 기반이라 취약했음). 이전 플레이테스트 기록은 새 키와
호환되지 않는다. 내러티브 태그는 재사용 가능한 태그 풀(`narrative_tags.json`, 10종) 방식으로,
선별된 카드의 좌/우 선택지에서만 얻는다. 페이즈 전환 문턱은 "고유 태그 3종/6종 획득". 자세한
내용은 `ROADMAP.md` Phase 4 참고.
**2026-07-13 내러티브 태그 재설계 (작업지시서 반영):** `docs/내러티브태그_시스템_작업지시서.md` 기준으로
① 연대기(Chronicle, 결재 결정 이력)와 내러티브 태그(세계의 상흔, 결과)를 개념적으로 분리 —
기획서/스토리 바이블/와이어프레임/비전/PRD/유저플로우/개발순서 문서 반영 완료. ② `narrative_tags.json`
10종에 `snippet`(1~2문장 결과 보고서, 거리감 있는 관료체) · `snippet_type`("system" 7종 / "human" 3종)
필드 추가 — 초안이므로 디자이너 검토 필요.
**남은 작업:** 현재 코드(`ChroniclePopup.jsx`, `GameScreen.jsx`)는 아직 태그 히스토리와 연대기(카드·선택 이력)를
하나의 팝업에서 함께 보여준다. 문서가 요구하는 "세계의 상흔 팝업 vs 연대기 팝업" 2종 분리 UI 구현은
아직 미착수 — 별도 작업으로 진행 필요.
**2026-07-13 자산(엔진) 시스템 v1 (작업지시서 반영):** `docs/작업지시서/자산시스템_작업지시서.md` 기준으로
발라트로형 "조커 레이어" 엔진 빌딩을 도입 — 덱은 여전히 적(오염)이고, 자산 슬롯이 패시브로 오염을
걸러내는 엔진이라는 설계 그대로 구현. 기존 4종 수동 클릭형 자산(성질변환/시한부격리/영구소각/결재권강제행사)을
전면 대체: 신규 `client/src/data/assets.json`(8종, 트리거→효과→성장 스키마)과 `client/src/engine/assetEngine.js`
(이벤트 버스 — every_n_approvals/on_pollution_draw/on_swipe_left/on_council_end/on_purge 연쇄, 깊이 상한 10)로 구현.
극비 프로젝트 성공 시 미보유 자산 중 무작위 1종 획득(획득 경로 튜닝은 2차 배치로 범위 외). 자산 슬롯 클릭 시
`AssetInfoPopup`으로 트리거→효과·스택·충전 상태 표시, 화면 우하단에 발동 로그 피드(최근 4건) 노출 — Part C UX
블로커 해결. 기존 `mulliganShields`(방어막 카운트)를 "다음 오염 카드 페널티 무효화" 공용 풀로 재사용해
결재 반려 도장(충전식 수동)과 책임 소재 불명 처리(조직저항 자동 무효화)가 같은 메커니즘을 공유하도록 구현.
**단순화/가정 사항 (디자이너 확인 필요):** ① 위험 수용 계수 등 "+N%" 리스크는 기존 0~5단계 스케일(1단계=20%)로
환산해 소수점으로 누적시킴. ② 임시 격리 컨테이너(좌 스와이프 격리)는 문서의 "발동 선택 가능"을 단순화해
자동 발동으로 구현(확인 팝업 없음). ③ 자산 슬롯은 4개 고정 → 보유량만큼 늘어나는 가변 슬롯으로 변경.
Part D 플레이테스트 체크리스트(역전 엔진 성립/연쇄 가시성/S급 킹핀/무효 빌드 풍자/오버파워 확인/연쇄 깊이 상한)는
아직 미검증 — 디자이너 플레이 후 피드백 필요.
**2026-07-23 오염 카드 압박 강화 (위기감 피드백 반영):** "오염 카드 수가 적어 위기감이 없고,
스와이프가 오염을 늘린다는 걸 알려주지 않아 고민이 안 된다"는 그레이박스 피드백을 반영.
① 오염 주입 규칙을 `client/src/engine/pollution.js`로 분리 — 사전 예고 · 실제 주입 · 사후 알림이
`previewPollution()` 단일 기준을 공유한다(예고와 결과가 어긋나면 정보 신뢰가 깨지므로 이 함수를
우회해 오염 카드를 만들지 말 것). ② **위험 파라미터를 올리는 결재는 그 자리에서 덱에 오염 카드를 주입**
(위험 +1 = 오염 1장, 1회 최대 3장, 현재 위치 2~4장 뒤에 삽입). 기존에는 정례회의에서만 파라미터당 1장이었다.
③ 정례회의 주입도 단계 비례로(`min(3, ceil(level/2))`). ④ 페널티 무효화(방어막/책임 소재 불명) 시에는
오염도 유입되지 않는다 — 방어막의 값어치. ⑤ UI 3종: 스와이프 인텐트에 `☣ 오염 카드 +N` 사전 경고,
결재 후 유입 토스트, 상단에 `☣ 덱 오염 N/전체` 상시 게이지(40% 이상 시 적색 점멸). ⑥ 덱 인덱스를
매 결재마다 덱 길이로 정규화 — 이전에는 `currentCardIndex`가 덱 길이를 넘어 계속 증가해 삽입 위치 계산이
무의미했다. `pickGrade`도 반올림 추가(자산 부작용이 파라미터를 소수점으로 올려 크래시 가능성이 있었음).
**튜닝 수치는 `pollution.js` 상단 상수 블록에 모아뒀다.**
**시뮬레이션(400~600회, 자산·의회 파라미터 정화 제외):** 신중 플레이 시 총 주입 오염 10.8장 → 25.1장,
최종 덱 오염률 39% → 59%. 무작위 플레이의 붕괴율 ~100%는 변경 **이전에도** 동일했다(파라미터가 원인).
**디자이너 확인 필요:** ⓐ 위험 1점 = 오염 1장 비율이 적정한지 ⓑ 항상 안전한 쪽만 고르면 붕괴율 0% —
안전 선택지의 토큰 비용이 충분한 압박인지 별도 검토 필요.
**2026-07-23 실기 플레이 결과:** 디자이너 직접 플레이 확인 — 위기감 강화 방향은 맞으나(목표에 조금 더
가까워짐), 세부 밸런스는 아직 조정 여지 있음. 정밀 튜닝은 플레이 횟수를 더 쌓은 뒤 진행 예정.
**⚠️ 미확인 이슈 — 자산 획득이 실기 플레이에서 한 번도 발생하지 않음 (2026-07-23):** 자산(엔진) 시스템
플레이테스트 중 자산을 하나도 획득하지 못해 Part D 체크리스트를 아직 검증 못함. 단, 플레이 횟수 자체가
적어 정상 확률 범위인지 실제 버그인지 구분 안 된 상태 — **아직 원인 조사 안 함, 다음 세션에서 확인할 것.**
획득 경로는 `GameScreen.jsx`의 `handleSwipe` 내 `card.type === '극비'` 분기(카드 타입 '극비' 스와이프
성공 시 미보유 자산 중 무작위 1종). 의심 지점: ① '극비' 카드는 페이즈2 풀(`phase2Pool`)에만 있고
페이즈2는 내러티브 태그 3종 획득 후에야 덱에 섞이므로, 그 전까지는 애초에 등장 자체가 불가능 —
플레이가 짧으면 페이즈2 진입 전에 끝났을 가능성. ② 페이즈2 진입 이후에도 '극비' 카드 등장 빈도/개수가
낮을 수 있음(`cards.csv` 기준 극비 7종). 위쪽 확률 문제인지, 아니면 조건 분기 자체의 버그인지는 코드를
다시 열어 확인 필요.
**⚠️ 2026-07-09 병렬 브랜치 병합:** 이 폴더가 유일한 작업 사본이 아니라면, 작업 시작 전
`git fetch` 후 `git log origin/main..HEAD`와 `git log HEAD..origin/main`으로 분기 여부를
반드시 확인할 것. 과거에 다른 세션이 origin에 푸시한 커밋을 이 로컬이 받지 못한 채 Phase 2~4를
독립적으로 재구현해 대형 충돌이 났던 적이 있다. 자세한 경위는 `ROADMAP.md` 상단 박스 참고.
Phase 0~4 그레이박스 구간이 모두 완료됐다. 다음은 외부 플레이어 그레이박스 테스트이며,
Phase 5(비주얼 폴리싱)는 그 피드백 반영 후에만 착수한다.
로컬에 Node.js LTS가 설치되어 `npm run dev`로 실기 검증이 가능하다
(Playwright로 실제 플레이까지 확인 완료).
**Phase 5 착수 조건:** 외부 플레이어 그레이박스 테스트를 마치고 그 피드백을 반영한 뒤에만 시작한다.
Phase별 상세 계획과 완료 기준은 `ROADMAP.md`, 각 Phase에서 남은 주의사항과 작업 이력은
`docs/DEVLOG.md` 참고.
---
@@ -153,4 +104,7 @@ Phase 5(비주얼 폴리싱)는 그 피드백 반영 후에만 착수한다.
/goal Phase 5 진행해줘 # 그레이박스 테스트 완료 후에만
```
작업 완료 후 이 파일의 **현재 Phase 상태** 블록을 업데이트한다.
**작업 완료 후 반드시:**
1. 위 **Phase 진행 순서** 블록의 체크박스를 갱신한다.
2. `docs/DEVLOG.md` 맨 위에 무엇을 왜 바꿨는지 기록한다.
(미해결 이슈나 디자이너 확인이 필요한 사항이 생겼으면 DEVLOG 상단 "열린 이슈"에 추가)
-30
View File
@@ -666,9 +666,6 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -686,9 +683,6 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -706,9 +700,6 @@
"ppc64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -726,9 +717,6 @@
"s390x"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -746,9 +734,6 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -766,9 +751,6 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -1799,9 +1781,6 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -1823,9 +1802,6 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -1847,9 +1823,6 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -1871,9 +1844,6 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MPL-2.0",
"optional": true,
"os": [
+126
View File
@@ -0,0 +1,126 @@
# Project SS — DEVLOG
> **이 파일의 역할:** 날짜별 작업 이력과 미해결 이슈를 기록한다.
> 규칙은 `../CLAUDE.md`, Phase 계획은 `../ROADMAP.md`.
> **최신 항목이 위로** 오도록 작성한다 (역순).
---
## 🔴 열린 이슈 (해결되면 해당 항목을 아래 이력으로 옮기고 여기서 지운다)
### 자산 획득이 실기 플레이에서 한 번도 발생하지 않음 (2026-07-23 발견, 원인 미조사)
자산(엔진) 시스템 플레이테스트 중 자산을 하나도 획득하지 못해 Part D 체크리스트를 검증 못함.
플레이 횟수 자체가 적어 정상 확률 범위인지 실제 버그인지 구분 안 된 상태.
- **획득 경로:** `GameScreen.jsx`의 `handleSwipe` 내 `card.type === '극비'` 분기
(카드 타입 '극비' 스와이프 성공 시 미보유 자산 중 무작위 1종)
- **의심 지점 ①** '극비' 카드는 페이즈2 풀(`phase2Pool`)에만 있고, 페이즈2는 내러티브 태그 3종
획득 후에야 덱에 섞인다 → 플레이가 짧으면 페이즈2 진입 전에 끝났을 가능성
- **의심 지점 ②** 페이즈2 진입 이후에도 '극비' 카드 등장 빈도/개수가 낮을 수 있음 (`cards.csv` 기준 극비 7종)
- **다음 액션:** 확률 문제인지 조건 분기 버그인지 코드를 다시 열어 확인
### 디자이너 확인 필요 — 오염 압박 밸런스 (2026-07-23)
- ⓐ 위험 1점 = 오염 1장 비율이 적정한지
- ⓑ 항상 안전한 쪽만 고르면 붕괴율 0% — 안전 선택지의 토큰 비용이 충분한 압박인지 별도 검토 필요
### 디자이너 확인 필요 — 자산 시스템 단순화 가정 (2026-07-13)
구현 시 임의로 단순화한 부분들. 의도와 맞는지 확인 필요.
- ① 위험 수용 계수 등 "+N%" 리스크를 기존 0~5단계 스케일(1단계=20%)로 환산해 소수점 누적
- ② 임시 격리 컨테이너(좌 스와이프 격리)는 문서의 "발동 선택 가능"을 단순화해 자동 발동으로 구현(확인 팝업 없음)
- ③ 자산 슬롯 4개 고정 → 보유량만큼 늘어나는 가변 슬롯으로 변경
### 미착수 — 팝업 2종 분리 UI (2026-07-13)
현재 코드(`ChroniclePopup.jsx`, `GameScreen.jsx`)는 태그 히스토리와 연대기(카드·선택 이력)를
하나의 팝업에서 함께 보여준다. 문서가 요구하는 **"세계의 상흔 팝업 vs 연대기 팝업" 2종 분리**는 미착수.
### 미검증 — Part D 플레이테스트 체크리스트 (2026-07-13)
역전 엔진 성립 / 연쇄 가시성 / S급 킹핀 / 무효 빌드 풍자 / 오버파워 확인 / 연쇄 깊이 상한
→ 디자이너 플레이 후 피드백 필요
---
## 2026-07-23 · 오염 카드 압박 강화
**배경:** "오염 카드 수가 적어 위기감이 없고, 스와이프가 오염을 늘린다는 걸 알려주지 않아 고민이 안 된다"는
그레이박스 피드백 반영.
**변경 사항**
1. 오염 주입 규칙을 `client/src/engine/pollution.js`로 분리 — 사전 예고·실제 주입·사후 알림이
`previewPollution()` 단일 기준을 공유 (예고와 결과가 어긋나면 정보 신뢰가 깨지므로)
2. **위험 파라미터를 올리는 결재는 그 자리에서 덱에 오염 카드를 주입** (위험 +1 = 오염 1장,
1회 최대 3장, 현재 위치 2~4장 뒤 삽입). 기존에는 정례회의에서만 파라미터당 1장이었음
3. 정례회의 주입도 단계 비례로 변경 — `min(3, ceil(level/2))`
4. 페널티 무효화(방어막/책임 소재 불명) 시에는 오염도 유입되지 않음 — 방어막의 값어치
5. UI 3종 추가 — 스와이프 인텐트에 `☣ 오염 카드 +N` 사전 경고 / 결재 후 유입 토스트 /
상단 `☣ 덱 오염 N/전체` 상시 게이지 (40% 이상 시 적색 점멸)
6. 덱 인덱스를 매 결재마다 덱 길이로 정규화 — 이전에는 `currentCardIndex`가 덱 길이를 넘어 계속
증가해 삽입 위치 계산이 무의미했음. `pickGrade`에 반올림 추가(자산 부작용이 파라미터를
소수점으로 올려 크래시 가능성 있었음)
**시뮬레이션 결과** (400~600회, 자산·의회 파라미터 정화 제외)
- 신중 플레이 시 총 주입 오염 10.8장 → **25.1장**
- 최종 덱 오염률 39% → **59%**
- 무작위 플레이의 붕괴율 ~100%는 변경 **이전에도** 동일 (파라미터가 원인)
**실기 플레이 결과:** 디자이너 직접 플레이 확인 — 위기감 강화 방향은 맞으나 세부 밸런스는 조정 여지 있음.
정밀 튜닝은 플레이 횟수를 더 쌓은 뒤 진행 예정.
---
## 2026-07-13 · 자산(엔진) 시스템 v1
`docs/작업지시서/자산시스템_작업지시서.md` 기준. 발라트로형 **"조커 레이어" 엔진 빌딩** 도입 —
덱은 여전히 적(오염)이고, 자산 슬롯이 패시브로 오염을 걸러내는 엔진이라는 설계 그대로 구현.
**변경 사항**
- 기존 4종 수동 클릭형 자산(성질변환/시한부격리/영구소각/결재권강제행사)을 **전면 대체**
- 신규 `client/src/data/assets.json` — 8종, 트리거→효과→성장 스키마
- 신규 `client/src/engine/assetEngine.js` — 이벤트 버스
(`every_n_approvals` / `on_pollution_draw` / `on_swipe_left` / `on_council_end` / `on_purge` 연쇄, 깊이 상한 10)
- 극비 프로젝트 성공 시 미보유 자산 중 무작위 1종 획득 (획득 경로 튜닝은 2차 배치로 범위 외)
- 자산 슬롯 클릭 시 `AssetInfoPopup`으로 트리거→효과·스택·충전 상태 표시
- 화면 우하단 발동 로그 피드(최근 4건) — Part C UX 블로커 해결
- 기존 `mulliganShields`(방어막 카운트)를 "다음 오염 카드 페널티 무효화" 공용 풀로 재사용 →
결재 반려 도장(충전식 수동)과 책임 소재 불명 처리(조직저항 자동 무효화)가 같은 메커니즘 공유
---
## 2026-07-13 · 내러티브 태그 재설계
`docs/내러티브태그_시스템_작업지시서.md` 기준.
**변경 사항**
1. **연대기(Chronicle, 결재 결정 이력)와 내러티브 태그(세계의 상흔, 결과)를 개념적으로 분리**
→ 기획서 / 스토리 바이블 / 와이어프레임 / 비전 / PRD / 유저플로우 / 개발순서 문서 반영 완료
2. `narrative_tags.json` 10종에 필드 추가
- `snippet` — 1~2문장 결과 보고서, 거리감 있는 관료체
- `snippet_type` — `"system"` 7종 / `"human"` 3종
- ※ 초안이므로 디자이너 검토 필요
---
## Phase 완료 시점 기록
### Phase 4 — 멀티 엔딩 & 연대기
- 엔딩 도감 localStorage 키를 `ss_endings_v2`로 교체 (기존 `ss_endings`는 제목 문자열 기반이라 취약)
→ **이전 플레이테스트 기록은 새 키와 호환되지 않음**
- 내러티브 태그는 재사용 가능한 태그 풀(`narrative_tags.json`, 10종) 방식으로,
선별된 카드의 좌/우 선택지에서만 획득
- 페이즈 전환 문턱: "고유 태그 3종/6종 획득"
- 상세: `ROADMAP.md` Phase 4
### Phase 3 — 정치 시스템 & 스토리 페이징
- 상임 이사회 8명의 투표는 아직 `성향 태그` 시스템이 없어 **위험 수용 계수 기반 확률 처리**로 남아있음
- 상세: `ROADMAP.md` Phase 3
### Phase 2 — 자원 경제 & 덱빌딩
- 오염 카드(신화/조직저항/사회공황/이사회압박) 콘텐츠는 **등급별 1종씩만 채운 초안**
- 상세: `ROADMAP.md` Phase 2
---
## 2026-07-09 · 병렬 브랜치 대형 충돌
다른 세션이 origin에 푸시한 커밋을 로컬이 받지 못한 채 Phase 2~4를 독립적으로 재구현해 충돌 발생.
→ 이후 **작업 시작 전 `git fetch` + 분기 확인**을 필수 절차로 `CLAUDE.md`에 명시.
자세한 경위는 `ROADMAP.md` 상단 박스 참고.