diff --git a/memory/org/MEMORY.md b/memory/org/MEMORY.md index 39727a4..a03ddf0 100644 --- a/memory/org/MEMORY.md +++ b/memory/org/MEMORY.md @@ -54,3 +54,5 @@ - [๐Ÿ›๏ธ PM filler ์–ดํœ˜ "์˜์—ญ" ๋ฌดํ•œ ๋ฐ˜๋ณต ์ฐจ๋‹จ](feedback_pm_filler_word_overuse.md) โ€” 2026-05-07 PD ์ง์ ‘ ์ง€์  "์˜์—ญ ์˜์—ญ ๊ฑฐ๋ฆฌ์ง€ ๋ง๊ณ ". ๋ณธ PM์ด ๋ช…์‚ฌ ๋’คยท๋ฌธ์žฅ ๋์— "์˜์—ญ" ๋ฌด์ฐจ๋ณ„ ๋ถ€์ฐฉํ•ด ํ•œ ์‘๋‹ต 30ํšŒ ์ด์ƒ ์‚ฌ์šฉ ํŒจํ„ด ๋ˆ„์ . 5์ธต ๊ทผ๋ณธ ์›์ธ + ๊ธˆ์ง€ filler ์นดํƒˆ๋กœ๊ทธ + ์ •ํ™• ๋ช…์‚ฌ ์น˜ํ™˜ ์นดํƒˆ๋กœ๊ทธ + ์‘๋‹ต ๋ฐœ์‹  ์ง์ „ ์ž๊ธฐ๊ฒ€์ฆ 5ํ•ญ. C44ยทC45ยทC46 ์ •ํ•ฉ. PostToolUse hook(`filler_word_check.sh`) ๋ณ„๊ฑด ์‹ ์„ค - [๐Ÿ›๏ธ PM = ์†”๋ฃจ์…˜ ๋Šฅ๋™ ์ œ์•ˆ ์˜๋ฌด (PD = ๊ธฐํš์ž, ํ‘œ์ค€ ํŒจํ„ด ๋ชจ๋ฆ„)](feedback_pm_solution_proactive_proposal.md) โ€” 2026-05-07 PD ์ง์ ‘ ์ง€์  "๋‹ค ์ฑ™๊ฒจ์•ผํ•˜๋Š”๊ฑฐ์•ผ". PD๊ฐ€ Layer+Raycast Drop-Through ํŒจํ„ด ์ง์ ‘ ์ œ์•ˆ โ†’ BT5-Dev #20~#26 ๋ณธ PM ์ฆ‰ํฅ ์‹œ๋„ 7ํšŒ ๋ˆ„์  ํ›„ ์ฑ„ํƒ. ๋ณธ PM = ๊ฐœ๋ฐœํŒ€ ์ฑ…์ž„์ž = ํ‘œ์ค€ ํŒจํ„ด ์นดํƒˆ๋กœ๊ทธ ๋Šฅ๋™ ๋ณด์œ ยท์ œ์•ˆ ์˜๋ฌด. PD ๋ณด๊ณ  ์ˆ˜๋ น ์งํ›„ ํ‘œ์ค€ ํŒจํ„ด ๊ฒ€์ƒ‰ + ์†”๋ฃจ์…˜ 2~3๊ฐœ ๊ถŒ๊ณ  ์˜๋ฌด. ์ž๊ธฐ๊ฒ€์ฆ 4ํ•ญ. C29ยทC44ยทC45 ์ •ํ•ฉ - [๐Ÿ›๏ธ PM ๊ฐ€์„ค ๋ˆ„์  ๋ถ€์ •ํ™• ์‹œ PD ๊ทผ๋ณธ ์ง„๋‹จ ์šฐ์„  ์ฑ„ํƒ ์˜๋ฌด](feedback_pm_root_diagnosis_priority.md) โ€” 2026-05-08 BT5-Dev BT80~BT109 ๋ณธ PM 23ํšŒ+ ๊ฐ€์„ค ๋ˆ„์  ๋ถ€์ •ํ™• ์ž์ธ ํ›„ PD "์ ˆ๋ฒฝ ์ฒดํฌ ๋กœ์ง ์ž˜๋ชป์ด ๊ทผ๋ณธ ์›์ธ" ๋ช…์‹œ ์‹œ์  ์ฑ„ํƒ. ๋ณธ PM ๊ฐ€์„ค 3ํšŒ ์ด์ƒ ๋ˆ„์  ๋ถ€์ •ํ™• ์ž์ธ ์‹œ์  = ๊ฐ€์„ค ์ƒ์‚ฐ ์ฆ‰์‹œ ์ค‘๋‹จ + PD ๊ทผ๋ณธ ์ง„๋‹จ ๋Šฅ๋™ ์ˆ˜๋ น ์˜๋ฌด. Unity ์ธก์ • ์ž๋ฃŒ ์นดํƒˆ๋กœ๊ทธ ๋ณด์œ  ์˜๋ฌด (TilemapยทPhysics2DยทBoundsยทKinematicObjectยทRigidbody2Dยท์ด๋ฒคํŠธ ์‹œ์ ). ์ž๊ธฐ๊ฒ€์ฆ 4ํ•ญ. C2ยทC5ยทC36ยทC44ยทC45 ์ •ํ•ฉ +- [๐Ÿ›๏ธ PM = ๊ฐ์‚ฌ๊ด€ ์˜์—ญ์— ํŒ€์žฅ ์ง๋ฌด ์œ„์ž„ ๊ธˆ์ง€ (์—ญํ•  ๋ถ„๋ฆฌ)](feedback_pm_auditor_role_conflation.md) โ€” 2026-05-08 BT12-MVP-A Phase 1 ์„ค๊ณ„ ํ˜ธ์ถœ ์‹œ์  dev-auditor์— ๊ฐœ๋ฐœํŒ€์žฅ ์ง๋ฌด ์œ„์ž„. dev-auditor ์ž์ฒด ๊ฐ์‚ฌ Critical 1 (C23 ์—ญํ•  ์—ฐ๊ธฐ) ์‹๋ณ„ + ์„ค๊ณ„ ๊ฑฐ๋ถ€. ๊ฐ์‚ฌ๊ด€ (dev-auditorยทplan-auditorยทpm-auditor) = ๊ฐ์‚ฌ ์ง๋ฌด ํ•œ์ •. ์ •์ƒ ํŒ€์žฅ agent (๊ฐœ๋ฐœํŒ€์žฅยท๊ธฐํšํŒ€์žฅยทํด๋ผ์ด์–ธํŠธํŒ€์žฅยท์„œ๋ฒ„ํŒ€์žฅ) ํ˜ธ์ถœ ์˜๋ฌด. ์ž๊ธฐ๊ฒ€์ฆ 4ํ•ญ. C23ยทC43ยทC48ยทC49 ์ •ํ•ฉ +- [์‹œ์Šคํ…œ Agent ์นดํƒˆ๋กœ๊ทธ ํ•œ๊ธ€ agent ๋ฏธ๋“ฑ์žฌ ์ •์ • ์˜๋ฌด](feedback_korean_agent_catalog_unregistered.md) โ€” 2026-05-08 BT12-MVP-A Phase 1 ๋ฐœ๊ฒฌ. .claude/agents/ ์˜์—ญ ํ•œ๊ธ€ agent 4 ํŒŒ์ผ ์กด์žฌ BUT ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ๋ฏธ๋“ฑ์žฌ. ํ˜ธ์ถœ ์‹œ 'Agent type not found' ์˜ค๋ฅ˜. ์ •์ƒ ํŒ€์žฅ ํ˜ธ์ถœ X ์˜์—ญ ์ฐจ๊ธฐ ์ •์ • ์˜๋ฌด (Anthropic Claude Code ํ•œ๊ธ€ agent ์ง€์› ๊ฒ€์ฆยท์˜๋ฌธ ๋ณ„์นญ ๋งคํ•‘). ์ž„์‹œ ์ ˆ์ถฉ = PM ์ง์ ‘ ์ฒ˜๋ฆฌ (C23 ์™ธ์—ฐ ์ž์„ฑ). C43ยทC48ยทC49 ์ •ํ•ฉ diff --git a/memory/org/feedback_korean_agent_catalog_unregistered.md b/memory/org/feedback_korean_agent_catalog_unregistered.md new file mode 100644 index 0000000..5cc5820 --- /dev/null +++ b/memory/org/feedback_korean_agent_catalog_unregistered.md @@ -0,0 +1,59 @@ +--- +name: ์‹œ์Šคํ…œ Agent ์นดํƒˆ๋กœ๊ทธ ํ•œ๊ธ€ agent (๊ฐœ๋ฐœํŒ€์žฅยท๊ธฐํšํŒ€์žฅยทํด๋ผ์ด์–ธํŠธํŒ€์žฅยท์„œ๋ฒ„ํŒ€์žฅ) ๋ฏธ๋“ฑ์žฌ ์˜์—ญ ์ •์ • ์˜๋ฌด +description: 2026-05-08 BT12-MVP-A Phase 1 ์„ค๊ณ„ ํ˜ธ์ถœ ์‹œ์  ๋ฐœ๊ฒฌ. .claude/agents/ ์˜์—ญ ํ•œ๊ธ€ agent ํŒŒ์ผ (๊ฐœ๋ฐœํŒ€์žฅ.mdยท๊ธฐํšํŒ€์žฅ.mdยทํด๋ผ์ด์–ธํŠธํŒ€์žฅ.mdยท์„œ๋ฒ„ํŒ€์žฅ.md) ์กด์žฌ BUT Agent tool subagent_type ์นดํƒˆ๋กœ๊ทธ ์˜์—ญ ๋ฏธ๋“ฑ์žฌ = "Agent type '๊ฐœ๋ฐœํŒ€์žฅ' not found" ์˜ค๋ฅ˜. ๋ณธ PM์ด ์ •์ƒ ํŒ€์žฅ ํ˜ธ์ถœ X ์˜์—ญ ์ ˆ์ถฉ (PM ์ง์ ‘ ์ฒ˜๋ฆฌ). ์ฐจ๊ธฐ ์˜์—ญ ์‹œ์Šคํ…œ ์ •์ • ์˜๋ฌด (Anthropic Claude Code ์˜์—ญ ๋˜๋Š” .claude/agents/ ๋“ฑ์žฌ ์ ˆ์ฐจ). +type: feedback +tier: project +--- + +# ์‹œ์Šคํ…œ Agent ์นดํƒˆ๋กœ๊ทธ ํ•œ๊ธ€ agent ๋ฏธ๋“ฑ์žฌ ์˜์—ญ ์ •์ • ์˜๋ฌด + +`.claude/agents/` ์˜์—ญ์— ํ•œ๊ธ€ agent ํŒŒ์ผ (`๊ฐœ๋ฐœํŒ€์žฅ.md`ยท`๊ธฐํšํŒ€์žฅ.md`ยท`ํด๋ผ์ด์–ธํŠธํŒ€์žฅ.md`ยท`์„œ๋ฒ„ํŒ€์žฅ.md`) ์˜์—ญ ์กด์žฌ BUT Agent tool ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ์˜์—ญ ๋ฏธ๋“ฑ์žฌ. ํ˜ธ์ถœ ์‹œ `Agent type '๊ฐœ๋ฐœํŒ€์žฅ' not found` ์˜ค๋ฅ˜. ๋ณธ ์˜์—ญ = ์‹œ์Šคํ…œ ์˜์—ญ ํ•œ๊ณ„ = ์ •์ƒ ํŒ€์žฅ ํ˜ธ์ถœ X = ๋ณธ PM ์ง๋ฌด ๊ฒฐ์† ์œ„ํ—˜. + +**Why (2026-05-08 BT12-MVP-A Phase 1 ์‚ฌ๊ฑด)**: +- ๋ณธ PM์ด BT12-MVP-A ์˜์—ญ Phase 1 ์„ค๊ณ„ ํ˜ธ์ถœ ์‹œ์  `subagent_type=๊ฐœ๋ฐœํŒ€์žฅ` ๋ช…์‹œ. +- Agent tool ์‘๋‹ต: `Agent type '๊ฐœ๋ฐœํŒ€์žฅ' not found. Available agents: balance-designerยทclaude-code-guideยทcontent-designerยทdev-auditorยทExploreยทgeneral-purposeยทlevel-designerยทnarrative-designerยทPlanยทplan-auditorยทpm-auditorยทpm-generalยทstatusline-setupยทsystem-designerยทux-designer` +- **์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ์˜์—ญ = ์˜๋ฌธ agent๋งŒ ๋“ฑ์žฌ**. ํ•œ๊ธ€ agent (๊ฐœ๋ฐœํŒ€์žฅยท๊ธฐํšํŒ€์žฅยทํด๋ผ์ด์–ธํŠธํŒ€์žฅยท์„œ๋ฒ„ํŒ€์žฅ) ์˜์—ญ ๋ฏธ๋“ฑ์žฌ. +- `.claude/agents/๊ฐœ๋ฐœํŒ€์žฅ.md` ํŒŒ์ผ ์˜์—ญ = ์ •์ƒ frontmatter + `model: opus` ๋ช…์‹œ. ์‹œ์Šคํ…œ ์˜์—ญ ์ธ์ง€ X. +- ์ง์ ‘ ์˜ํ–ฅ: ์ •์ƒ ํŒ€์žฅ ํ˜ธ์ถœ X = C49 ํ‘œ์ค€ ํ”„๋กœ์„ธ์Šค ์˜์—ญ ์ฐจ๋‹จ = PM ์ง์ ‘ ์ฒ˜๋ฆฌ ์ ˆ์ถฉ (C23 ์—ญํ•  ์—ฐ๊ธฐ ์™ธ์—ฐ ์œ„ํ—˜) + +**๊ทผ๋ณธ ์›์ธ (3์ธต)**: +1. **ํ‘œ๋ฉด**: ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ์˜์—ญ ํ•œ๊ธ€ agent ์˜์—ญ ์ž๋™ ์ธ์‹ X. ์˜๋ฌธ agent ์˜์—ญ๋งŒ ๋“ฑ์žฌ. +2. **์‹œ์Šคํ…œ ์˜์—ญ ๊ฐ€๋Šฅ ์˜์—ญ**: + - (a) Claude Code ์˜์—ญ ํ•œ๊ธ€ agent ์˜์—ญ ์ธ์‹ ๋ฏธ์ง€์› + - (b) `.claude/agents/` ์˜์—ญ frontmatter ์˜์—ญ ์ธ์‹ ์˜์—ญ ์˜๋ฌธ ํ•œ์ • + - (c) BurningTimes ์กฐ์ง ์ž์ฒด agent ๋“ฑ๋ก ์ ˆ์ฐจ ์˜์—ญ ๋ˆ„๋ฝ (์ง์ „ ์˜์—ญ ์กฐ์ง ์‹ ์„ค ์‹œ์  ํ•œ๊ธ€ agent ๋ณ„๋„ ๋“ฑ๋ก X) +3. **๋ณธ PM ์ธ์ง€ ๊ฒฐ์†**: ์ง์ „ BT12-Dev v1 (2026-04-24) ์˜์—ญ Phase 1 = 1074 ๋ผ์ธ ์‚ฐ์ถœ. ๋ณธ ์˜์—ญ ์ •์ƒ ๊ฐœ๋ฐœํŒ€์žฅ ํ˜ธ์ถœ ์˜์—ญ ๊ฒ€์ฆ X. ๋ณธ PM์ด "๊ฐœ๋ฐœํŒ€์žฅ ์˜์—ญ ํ˜ธ์ถœ = ์ •์ƒ"์œผ๋กœ ๊ฐ€์ •. ์‹ค์ธก X. + +**How to apply**: + +1. **๋ณธ ์˜์—ญ ์ •์ • ์˜๋ฌด ์ฐจ๊ธฐ ์˜์—ญ**: + - **Step 1**: Anthropic Claude Code ์˜์—ญ ํ•œ๊ธ€ agent ๋“ฑ๋ก ์˜์—ญ ๊ฒ€์ฆ (์ง€์› ์—ฌ๋ถ€) + - **Step 2**: ์ง€์› ์‹œ `.claude/agents/` ํ•œ๊ธ€ ํŒŒ์ผ ์˜์—ญ ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ๋“ฑ์žฌ ์ ˆ์ฐจ ์ง„ํ–‰ + - **Step 3**: ๋ฏธ์ง€์› ์‹œ ์˜๋ฌธ agent ๋ณ„์นญ ์˜์—ญ (์˜ˆ: `dev-team-lead`) + ํ•œ๊ธ€ ํ˜ธ์นญ ์˜์—ญ ๋งคํ•‘ ์˜์—ญ + - **Step 4**: ๋ณธ ์ •์ • ํ›„ ๋ณธ feedback `tier: project โ†’ resolved` ๋ณ€๊ฒฝ + +2. **์ž„์‹œ ์ ˆ์ถฉ ์˜์—ญ (์ •์ • ์ „)**: + - PM ์ง์ ‘ ์ฒ˜๋ฆฌ (Opus ๋ชจ๋ธยท์ด๊ด„PM ์˜์—ญ) โ€” ๋‹จ์ˆœ ์˜์—ญ ๊ฐ€๋Šฅ (C49 ๋‹จ์ˆœ ๋ฐ˜๋ณต ์นดํƒˆ๋กœ๊ทธ v1) + - ๋ณต์žก ์˜์—ญ (BT12-Dev ๋ณธ๊ฒฉ ๋“ฑ) = PD ์‚ฌ์ „ ๋ณด๊ณ  + ์ ˆ์ถฉ ๋ช…์‹œ + - C23 ์—ญํ•  ์—ฐ๊ธฐ ์™ธ์—ฐ ์ž์„ฑ ๋ช…์‹œ ์˜๋ฌด + - ์‚ฐ์ถœ๋ฌผ ์˜์—ญ ์ž„์‹œ ์œ„์ž„ ๋ช…์‹œ (์˜ˆ: "์ด๊ด„PM ์ž„์‹œ ๊ฐœ๋ฐœํŒ€์žฅ ์—ญํ•  ์œ„์ž„") + +3. **PM ํ˜ธ์ถœ ์‹œ์  ์˜๋ฌด ๋‹จ๊ณ„**: + - **Step 1**: subagent_type ์˜์—ญ ์˜๋ฌธ agent ์šฐ์„  (`balance-designer` ๋“ฑ โ€” ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ์ •ํ•ฉ) + - **Step 2**: ํ•œ๊ธ€ ํŒ€์žฅ ์˜์—ญ ํ˜ธ์ถœ ์‹œ๋„ โ†’ ์‹คํŒจ ์‹œ ๋ณธ feedback ์˜์—ญ ์ฆ‰์‹œ ํ™˜๊ธฐ + ์ ˆ์ถฉ ์˜์—ญ + - **Step 3**: ์ ˆ์ถฉ ์˜์—ญ๋„ X = PD ๋ณด๊ณ  + ๊ฒฐ์ • ์˜๋ขฐ + +**์ ์šฉ ๋ฒ”์œ„**: ๋ชจ๋“  PMยทํŒ€์žฅ ์˜์—ญ agent ํ˜ธ์ถœ ์‹œ์ . + +**์—ฐ๊ด€ ๊ทœ์น™ยทfeedback**: +- **C43** PD ํ˜ธ์นญ๋ณ„ ์ง์ ‘ ํ•˜๋‹ฌ ์ฒด๊ณ„ (์˜๋ฌธ ๋งคํ•‘ ์˜์—ญ) +- **C48** ๋ถˆํ•„์š”ํ•œ Agent Task ๋ฐฐ์ œ +- **C49** ํŒ€์žฅ ์„ค๊ณ„โ†’ํŒ€์› ์ž‘์—…โ†’ํŒ€์žฅ ๊ฒ€์ฆ +- `feedback_pm_auditor_role_conflation` (๊ฐ์‚ฌ๊ด€ยทํŒ€์žฅ ๋ถ„๋ฆฌ) + +**์ •์ • ์šฐ์„ ์ˆœ์œ„**: P1 (ํ•ต์‹ฌ ์˜์—ญ โ€” C49 ํ‘œ์ค€ ํ”„๋กœ์„ธ์Šค ์ฐจ๋‹จ ์˜์—ญ) + +**๊ทผ๊ฑฐ ๋ฐ์ดํ„ฐ**: +- 2026-05-08 BT12-MVP-A Phase 1 ํ˜ธ์ถœ ์‹คํŒจ (Agent type '๊ฐœ๋ฐœํŒ€์žฅ' not found) +- `.claude/agents/` ์˜์—ญ ํ•œ๊ธ€ agent 4 ํŒŒ์ผ (๊ฐœ๋ฐœํŒ€์žฅยท๊ธฐํšํŒ€์žฅยทํด๋ผ์ด์–ธํŠธํŒ€์žฅยท์„œ๋ฒ„ํŒ€์žฅ) +- ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ์˜๋ฌธ agent 15์ข… ๋“ฑ์žฌ diff --git a/memory/org/feedback_pm_auditor_role_conflation.md b/memory/org/feedback_pm_auditor_role_conflation.md new file mode 100644 index 0000000..7f357a8 --- /dev/null +++ b/memory/org/feedback_pm_auditor_role_conflation.md @@ -0,0 +1,64 @@ +--- +name: PM์ด ๊ฐ์‚ฌ๊ด€(dev-auditorยทplan-auditorยทpm-auditor) ์˜์—ญ์— ํŒ€์žฅ ์ง๋ฌด ์œ„์ž„ ๊ธˆ์ง€ +description: 2026-05-08 BT12-MVP-A Phase 1 ์„ค๊ณ„ ์˜๋ขฐ ์‹œ์  ๋ณธ PM์ด dev-auditor์—๊ฒŒ ๊ฐœ๋ฐœํŒ€์žฅ ์ง๋ฌด ์œ„์ž„. dev-auditor๊ฐ€ ์ž์ฒด ๊ฐ์‚ฌ ๊ฒฐ๊ณผ Critical 1 (Agent ๋ผ์šฐํŒ… ์˜ค๋ฅ˜ยทC23 ์—ญํ•  ์—ฐ๊ธฐ ์œ„๋ฐ˜)๋กœ ์ž์ง„ ์‹๋ณ„ ํ›„ ์„ค๊ณ„ ์‘๋‹ต ๊ฑฐ๋ถ€ + ๊ฐ์‚ฌ ๋ณด๊ณ ๋งŒ ์‚ฐ์ถœ. ์ •์ƒ ๊ฐœ๋ฐœํŒ€์žฅ agent (๋ณ„๋„ ์˜์—ญ ์กด์žฌ) ํ˜ธ์ถœ ์˜๋ฌด. +type: feedback +tier: constitutional +--- + +# PM = ๊ฐ์‚ฌ๊ด€ ์˜์—ญ์— ํŒ€์žฅ ์ง๋ฌด ์œ„์ž„ ๊ธˆ์ง€ (์—ญํ•  ๋ถ„๋ฆฌ ์˜๋ฌด) + +๋ณธ PM์ด ํŒ€์žฅ ์ง๋ฌด (์„ค๊ณ„ยท๊ตฌํ˜„ยท๊ฒ€์ฆ) ์˜์—ญ ์œ„์ž„ ์‹œ์  = **์ •์ƒ ํŒ€์žฅ agent** (๊ฐœ๋ฐœํŒ€์žฅยท๊ธฐํšํŒ€์žฅยทํด๋ผ์ด์–ธํŠธํŒ€์žฅยท์„œ๋ฒ„ํŒ€์žฅ) ํ˜ธ์ถœ ์˜๋ฌด. ๊ฐ์‚ฌ๊ด€ agent (dev-auditorยทplan-auditorยทpm-auditor) ์˜์—ญ = **๊ฐ์‚ฌยท๊ต์ฐจ ๊ฒ€์ฆ ์ง๋ฌด ํ•œ์ •**. ๋ณธ PM์ด ๊ฐ์‚ฌ๊ด€ ์˜์—ญ์— ํŒ€์žฅ ์ง๋ฌด ์œ„์ž„ = **C23 ์—ญํ•  ์—ฐ๊ธฐ ์œ„๋ฐ˜**. + +**Why (BT12-MVP-A Phase 1 ์‚ฌ๊ฑด 2026-05-08)**: +- ์ง์ ‘ ์‚ฌ๊ฑด: ๋ณธ PM์ด BT12-MVP-A ์˜์—ญ Phase 1 ์„ค๊ณ„ (๊ฒฝํ—˜์น˜ยท๋ ˆ๋ฒจ์—…ยทUI) ์˜๋ขฐ ์‹œ์ ์— `subagent_type=dev-auditor` ํ˜ธ์ถœ. ์˜๋ขฐ ๋ณธ๋ฌธ = "๊ฐœ๋ฐœํŒ€์žฅ Opus Phase 1 ์„ค๊ณ„" ๋ช…์‹œ. +- dev-auditor ์ž์ฒด ๊ฐ์‚ฌ ๊ฒฐ๊ณผ: Critical 1 (Agent ๋ผ์šฐํŒ… ์˜ค๋ฅ˜ยทdev-auditor ์ •์˜ ยง4 "๊ฐœ๋ฐœํŒ€์žฅ์˜ ์‹ค์ œ ๊ธฐ์ˆ  ๊ฒฐ์ •ยทํŒ๋‹จยท๊ตฌํ˜„์€ ํŒ€์žฅ ๊ณ ์œ  ์—ญํ• " ์˜์—ญ ์œ„๋ฐ˜) + ์„ค๊ณ„ ์‘๋‹ต ๊ฑฐ๋ถ€ + ๊ฐ์‚ฌ ๋ณด๊ณ ๋งŒ ์‚ฐ์ถœ. +- ๋ˆ„์  ํŒจํ„ด ์˜์—ญ: ์ง์ „ BT5-Dev #111 ์˜์—ญ ๋Œ€ํ™”๋กœ๊ทธ ์—”ํŠธ๋ฆฌ 4 = "C43 '๊ฐœ๋ฐœํŒ€' ํ˜ธ์นญ ์˜์—ญ dev-auditor (๊ฐœ๋ฐœํŒ€์žฅ ์—ญํ• ) ์ง์ ‘ ํ˜ธ์ถœ"์ด๋ผ๊ณ  ๋ณธ PM์ด ์ž์ฒด ๊ธฐ๋ก. **dev-auditor ์˜์—ญ์— ๊ฐœ๋ฐœํŒ€์žฅ ์—ญํ•  ์œ„์ž„ ํŒจํ„ด ๋ˆ„์  ์˜์—ญ**. +- ์ง์ ‘ ์˜ํ–ฅ: ๋ณธ PM ์ง๋ฌด ๊ฒฐ์†ยทC23 ์œ„๋ฐ˜ ๋ˆ„์ ยท์ •์ƒ ํŒ€์žฅ agent ํ˜ธ์ถœ ํšŒํ”ผ. + +**๊ทผ๋ณธ ์›์ธ (5์ธต)**: +1. **ํ‘œ๋ฉด**: ๋ณธ PM์ด ์ •์ƒ ํŒ€์žฅ agent (๊ฐœ๋ฐœํŒ€์žฅยท๊ธฐํšํŒ€์žฅ ๋“ฑ) ํ˜ธ์ถœ ์‹œ๋„ X ยท ์ง์ ‘ dev-auditor ์˜์—ญ ํ˜ธ์ถœ. ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ํ•œ๊ธ€ agent ๋ฏธ๋“ฑ์žฌ ์˜์—ญ ์ธ์ง€ X. +2. **ํ˜ธ์นญ ๋ผ์šฐํŒ… ์ธ์ง€ ๊ฒฐ์†**: C43 ํ˜ธ์นญ ์นดํƒˆ๋กœ๊ทธ ์˜์—ญ์—์„œ "๊ฐœ๋ฐœํŒ€" PD ํ˜ธ์นญ = ๊ฐœ๋ฐœํŒ€์žฅ 1์ฐจ ์ˆ˜๋ น ๋ช…์‹œ. ๋ณธ PM์ด dev-auditor ์˜์—ญ = ๊ฐ์‚ฌ ์ง๋ฌด ์˜์—ญ์œผ๋กœ ์ธ์ง€ X = "๊ฐœ๋ฐœํŒ€ ์˜์—ญ ๊ฒ€์ฆ = dev-auditor ํ˜ธ์ถœ"๋กœ ์ž˜๋ชป ์™ธ์—ฐ ํ™•์žฅ. +3. **agent ์นดํƒˆ๋กœ๊ทธ ์‹ค์ธก ๊ฒฐ์†**: `.claude/agents/` ์˜์—ญ ์ •์ƒ agent (๊ฐœ๋ฐœํŒ€์žฅยท๊ธฐํšํŒ€์žฅยทํด๋ผ์ด์–ธํŠธํŒ€์žฅยท์„œ๋ฒ„ํŒ€์žฅ) ์กด์žฌ ์˜์—ญ ๋ณธ PM ์ง์ ‘ read X. ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ์˜์—ญ = ๋ณธ ์˜์—ญ ๋ฏธ๋“ฑ์žฌ (ํ•œ๊ธ€ agent ์˜์—ญ). +4. **C23 ์—ญํ•  ์—ฐ๊ธฐ ์œ„๋ฐ˜ ์œ„๊ณ„ ์ธ์ง€ ๊ฒฐ์†**: dev-auditor ์ •์˜ ยง4 ๊ธˆ์ง€ ํ–‰์œ„ ์˜์—ญ ๋ณธ PM ์ง์ ‘ read X. "๊ฐ์‚ฌ๊ด€ยทํŒ€์žฅ ๋ถ„๋ฆฌ ์˜๋ฌด" ์˜์—ญ ์ธ์ง€ X. +5. **`feedback_pm_solution_proactive_proposal` ์™ธ์—ฐ ๊ฒฐ์†**: ์ง์ „ feedback = "ํ‘œ์ค€ ํŒจํ„ด ๋Šฅ๋™ ์ œ์•ˆ ์˜๋ฌด". ๋ณธ ์˜์—ญ = ํŒ€์žฅ ์˜์—ญ ์ง๋ฌด ์œ„์ž„ = ํ‘œ์ค€ ํ˜ธ์ถœ ์˜์—ญ = ๋™์ผ ์™ธ์—ฐ์ด์ง€๋งŒ ํ˜ธ์นญ ๋ผ์šฐํŒ… ์˜์—ญ = ๋ณ„๋„ ์ธก๋ฉด. + +**How to apply**: + +1. **PM ํŒ€์žฅ ์ง๋ฌด ์œ„์ž„ ์‹œ์  ์˜๋ฌด ๋‹จ๊ณ„**: + - **Step 1**: PD ํ˜ธ์นญ ์นดํƒˆ๋กœ๊ทธ (C43) ์˜์—ญ ์ง์ ‘ ํ™•์ธ โ€” "๊ฐœ๋ฐœํŒ€"ยท"๊ธฐํšํŒ€"ยท"ํด๋ผ์ด์–ธํŠธํŒ€"ยท"์„œ๋ฒ„ํŒ€" โ†’ **๊ฐ ํŒ€์žฅ 1์ฐจ ์ˆ˜๋ น** + - **Step 2**: ์ •์ƒ ํŒ€์žฅ agent ์˜์—ญ `.claude/agents/{ํŒ€๋ช…}์žฅ.md` ์ง์ ‘ read ์˜๋ฌด + - **Step 3**: Agent tool subagent_type ์˜์—ญ ์ •์ƒ ํŒ€์žฅ ๋ช…์‹œ ํ˜ธ์ถœ + - **Step 4**: ํ˜ธ์ถœ ์‹คํŒจ ์‹œ (์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ๋ฏธ๋“ฑ์žฌ ๋“ฑ) **๋ณธ ์˜์—ญ ์ž์„ฑ + PD ๋ณด๊ณ  + ๋Œ€์•ˆ (PM ์ง์ ‘ ์ฒ˜๋ฆฌยท์‹œ์Šคํ…œ ์ •์ • ๋“ฑ) ๋ช…์‹œ** + +2. **๊ฐ์‚ฌ๊ด€ ์˜์—ญ ํ˜ธ์ถœ ์˜๋ฌด ์˜์—ญ (ํ•œ์ •)**: + - **์‚ฌ์ „ ๊ฐ์‚ฌ**: ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋“ฑ๋ก ์งํ›„ยท์ฝ”๋“œ ์˜์—ญ ๋ณ€๊ฒฝ ์ง์ „ยทํ—Œ๋ฒ•๊ธ‰ feedback ์‹ ์„ค ์ง์ „ + - **์‚ฌํ›„ ๊ฐ์‚ฌ**: ์ฝ”๋“œ ์˜์—ญ ๋ณ€๊ฒฝ ์งํ›„ยทcommit ์ง์ „ยท์„ธ์…˜ ์ข…๊ฒฐ ์ง์ „ + - **๊ต์ฐจ ๊ฒ€์ฆ**: ๋‹ค๋ฅธ ํŒ€์žฅ ์‚ฐ์ถœ๋ฌผ ์ •ํ•ฉ ๊ฒ€์ฆยท๊ธฐํš์„œ vs ๊ฐœ๋ฐœ ์‚ฐ์ถœ ์ •ํ•ฉ ๊ฒ€์ฆ + - **๊ธˆ์ง€ ์˜์—ญ**: ํŒ€์žฅ ์ง๋ฌด (์„ค๊ณ„ยท๊ตฌํ˜„ยท๊ฒ€์ฆยท๊ฒฐ์ •ยท๊ตฌํ˜„ ์‚ฐ์ถœ) ์ง์ ‘ ์˜๋ขฐ + +3. **์ž๊ธฐ๊ฒ€์ฆ 4ํ•ญ (ํŒ€์žฅ ์œ„์ž„ ์‹œ์  ์˜๋ฌด)**: + - [ ] ์ •์ƒ ํŒ€์žฅ agent ์˜์—ญ ์‹๋ณ„ ์ •ํ•ฉ? + - [ ] subagent_type ์˜์—ญ ์ •์ƒ ํŒ€์žฅ ๋ช…์‹œ? + - [ ] dev-auditorยทplan-auditorยทpm-auditor ์˜์—ญ ํ˜ธ์ถœ = ๊ฐ์‚ฌ ์ง๋ฌด ํ•œ์ •? + - [ ] ํ˜ธ์ถœ ์‹คํŒจ ์‹œ PD ๋ณด๊ณ  + ๋Œ€์•ˆ ๋ช…์‹œ? + +4. **๊ธˆ์ง€ ํŒจํ„ด**: + - โŒ "๊ฐœ๋ฐœํŒ€ ์˜์—ญ = dev-auditor ํ˜ธ์ถœ" (๊ฐ์‚ฌ๊ด€ยทํŒ€์žฅ ํ˜ผ๋™) + - โŒ "๊ธฐํšํŒ€ ์˜์—ญ = plan-auditor ํ˜ธ์ถœ" (๋™์ผ ์˜์—ญ ์œ„๋ฐ˜) + - โŒ "PM ์˜์—ญ = pm-auditor ํ˜ธ์ถœ" (๋™์ผ ์˜์—ญ ์œ„๋ฐ˜) + - โŒ ์ •์ƒ ํŒ€์žฅ agent ํ˜ธ์ถœ ์‹œ๋„ Xยท์ง์ ‘ ๊ฐ์‚ฌ๊ด€ ์˜์—ญ ํ˜ธ์ถœ + +**์ ์šฉ ๋ฒ”์œ„**: ๋ชจ๋“  PM ์‘๋‹ตยท์ „ ๋ถ€์„œ. ํŒ€์žฅ ์ง๋ฌด ์œ„์ž„ ์˜์—ญ ์ „๋ฐ˜. + +**์—ฐ๊ด€ ๊ทœ์น™ยทfeedback**: +- **C23** ํ—ˆ์œ„ ๋ณด๊ณ ยท์—ญํ•  ์—ฐ๊ธฐ ์ ˆ๋Œ€ ๊ธˆ์ง€ (ํ—Œ๋ฒ•๊ธ‰) +- **C43** PD ํ˜ธ์นญ๋ณ„ ์ง์ ‘ ํ•˜๋‹ฌ ์ฒด๊ณ„ +- **C48** ๋ถˆํ•„์š”ํ•œ Agent Task ๋ฐฐ์ œ (3์ž๋ฌธ ์˜๋ฌด) +- **C49** ํŒ€์žฅ ์„ค๊ณ„โ†’ํŒ€์› ์ž‘์—…โ†’ํŒ€์žฅ ๊ฒ€์ฆ ํ‘œ์ค€ ํ”„๋กœ์„ธ์Šค +- `feedback_pm_solution_proactive_proposal` (์™ธ์—ฐ ์ •ํ•ฉ) +- `feedback_korean_agent_catalog_unregistered` (์‹œ์Šคํ…œ ํ•œ๊ณ„ ์˜์—ญ ์ •์ • ์˜๋ฌด) + +**๊ทผ๊ฑฐ ๋ฐ์ดํ„ฐ**: +- BT12-MVP-A Phase 1 ์˜๋ขฐ ์‹œ์  (2026-05-08) โ€” `subagent_type=dev-auditor` + ๋ณธ๋ฌธ "๊ฐœ๋ฐœํŒ€์žฅ Opus Phase 1 ์„ค๊ณ„ ์˜๋ขฐ" +- dev-auditor ์ž์ฒด ๊ฐ์‚ฌ ๊ฒฐ๊ณผ Critical 1ยทMajor 3ยทMinor 2 (BurningTimes commit ๊ธฐ๋ก ์˜์—ญ) +- ์ง์ „ BT5-Dev #111 ๋Œ€ํ™”๋กœ๊ทธ ์—”ํŠธ๋ฆฌ 4 (commit `d7b789b`) โ€” "dev-auditor (๊ฐœ๋ฐœํŒ€์žฅ ์—ญํ• ) ์ง์ ‘ ํ˜ธ์ถœ" ๋ณธ PM ์ž์ฒด ๊ธฐ๋ก = ๋ˆ„์  ํŒจํ„ด ์˜์—ญ diff --git a/๊ณต์œ /PD_์ง€์‹œ_ํŠธ๋ž˜ํ‚น/๊ฐœ๋ฐœํŒ€_PD_์ง€์‹œ_๋กœ๊ทธ.md b/๊ณต์œ /PD_์ง€์‹œ_ํŠธ๋ž˜ํ‚น/๊ฐœ๋ฐœํŒ€_PD_์ง€์‹œ_๋กœ๊ทธ.md index 380845b..43d6cd6 100644 --- a/๊ณต์œ /PD_์ง€์‹œ_ํŠธ๋ž˜ํ‚น/๊ฐœ๋ฐœํŒ€_PD_์ง€์‹œ_๋กœ๊ทธ.md +++ b/๊ณต์œ /PD_์ง€์‹œ_ํŠธ๋ž˜ํ‚น/๊ฐœ๋ฐœํŒ€_PD_์ง€์‹œ_๋กœ๊ทธ.md @@ -33,6 +33,7 @@ C3ยทC13 ์œ„๋ฐ˜์— ํ•ด๋‹น. **์ฆ‰์‹œ ์ž์ง„ ๋ณด๊ณ  ํ›„ ์†Œ๊ธ‰ ๋“ฑ๋ก**. | # | ์ผ์‹œ | ์ง€์‹œ ์š”์ง€ | ์ฒ˜๋ฆฌ ์ƒํƒœ | ์‚ฐ์ถœ๋ฌผ ๊ฒฝ๋กœ | ์ค‘๋‹จ ์‚ฌ์œ  | ์‚ฌํ›„ ์กฐ์น˜ | |---|------|----------|----------|-----------|----------|----------| +| BT12-MVP-A | 2026-05-08 | **๊ฒฝํ—˜์น˜ยท๋ ˆ๋ฒจ์—…ยท์Šคํ‚ฌ ์นด๋“œ ์„ ํƒ UI** โ€” PD ์ง์ ‘ ์ง€์‹œ 2๊ฑด (1) ์  ์ฒ˜์น˜ โ†’ EXP โ†’ ๋ ˆ๋ฒจ์—…๋งˆ๋‹ค ์Šคํ‚ฌ ์นด๋“œ 3๊ฐœ ์„ ํƒ ๊ธฐ๋Šฅ (2) ๋ ˆ๋ฒจ์—… UI (์Šคํ‚ฌ ํšจ๊ณผ ์ถ”ํ›„ยทUI๋งŒ). PD ์ฒจ๋ถ€ ์˜ˆ์‹œ ์˜์—ญ ("๊ธฐ์ˆ  ์„ ํƒ" ํ™”๋ฉด โ€” ์นด๋“œ 3์žฅ ๊ฐ€๋กœยท์ƒ‰์ƒ ๋ฐฐ๋„ˆยท์›ํ˜• ์•„์ด์ฝ˜ยท๋™์‹ฌ์›ยท"๋ ˆ๋ฒจ N"/"์ตœ๋Œ€"ยท"ํ™•์ธ" ๋ฒ„ํŠผ). PD ๊ฒฐ์ • (ฮฒ) ์ฑ„ํƒ โ€” BT12-Dev ๋ณด๋ฅ˜ ์ผ๋ถ€ ํ•ด์ œยทBT12-MVP-A ๋ถ„๋ฆฌ ํ•ญ๋ชฉ ์ง„ํ–‰. dev-auditor ๊ฐ์‚ฌ Critical 2ยทMajor 5 ํ›„ ๋ณธ PM ์ž์„ฑ + ์ •์ƒ ๊ฐœ๋ฐœํŒ€์žฅ ํ˜ธ์ถœ ์‹œ๋„ ์‹คํŒจ (์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ํ•œ๊ธ€ agent ๋ฏธ๋“ฑ์žฌ) โ†’ PM ์ง์ ‘ ์ฒ˜๋ฆฌ ์ ˆ์ถฉ (์ž„์‹œ ๊ฐœ๋ฐœํŒ€์žฅ ์—ญํ•  ์œ„์ž„ยทC23 ์™ธ์—ฐ ์ž์„ฑ). | **์ง„ํ–‰์ค‘** | [Phase 1 ์™„๋ฃŒ 2026-05-08] `ํ”„๋กœ์ ํŠธ/EerieVillage/๊ฐœ๋ฐœ/spec/BT12-MVP-A_์„ค๊ณ„_v1.md` (์‹ ๊ทœยท~600 ๋ผ์ธ) โ€” ยง1 BT12-Dev v1 ์ถฉ๋Œยท์ค‘๋ณต ๋งคํŠธ๋ฆญ์Šค (`PlayerStats` ๋ถ„๋ฆฌยท`PlayerProgression` ์‹ ๊ทœ) ยท ยง2 ์‹ ๊ทœ ์ปดํฌ๋„ŒํŠธ 7์ข… (`PlayerProgression`ยท`ExperienceSystem`ยท`LevelUpManager`ยท`SkillCardPlaceholder`ยท`SkillCardPlaceholderPool`ยท`SkillSelectionUI`ยท`SkillCardSlot`) ยท ยง3~ยง5 ํ†ตํ•ฉ hookยท์ด๋ฒคํŠธ ํ๋ฆ„ยทUI Prefab ๊ตฌ์กฐ (PD ์˜ˆ์‹œ ์ •ํ•ฉ) ยท ยง7 Phase 2 ๋ถ„๋Ÿ‰ ์˜ต์…˜ (a/b/cยทPM ๊ถŒ๊ณ  b ๋ถ„ํ•  ~150K) ยท ยง10 ๋ณธ ์„ค๊ณ„ ์ž์„ฑ. ํ—Œ๋ฒ•๊ธ‰ feedback 2์ข… ์‹ ์„ค (`feedback_pm_auditor_role_conflation`ยท`feedback_korean_agent_catalog_unregistered`). ๋Œ€ํ™”๋กœ๊ทธ ์—”ํŠธ๋ฆฌ 6 (`๊ณต์œ /๋Œ€ํ™”๋กœ๊ทธ/EerieVillage/2026-05-08.md`). | โ€” | **PM ํ›„์† ๋Œ€๊ธฐ**: โ‘  Phase 2 ๋ถ„๋Ÿ‰ PD ์‚ฌ์ „ ์Šน์ธ (์˜ต์…˜ (b) ๊ถŒ๊ณ  โ€” Phase 2-A ์‹œ์Šคํ…œ ์ฝ”๋“œ ~70K + Phase 2-B UI prefab/asset ~80K ๋ถ„ํ• ) โ‘ก Phase 2 ์ง„ํ–‰ ์‹œ ํ•œ๊ธ€ agent ์นดํƒˆ๋กœ๊ทธ ์ •์ • ์‹œ๋„ โ†’ ๋ฏธ์ •์ • ์‹œ PM ์ง์ ‘ ์ฒ˜๋ฆฌ โ‘ข Phase 3 dev-auditor ๊ฒ€์ฆ ์˜๋ฌด (ํšŒ๊ท€ยทBT12-Dev v1 ์ถฉ๋Œ ๊ฒ€์ฆ) โ‘ฃ ์™„๋ฃŒ ์•„์นด์ด๋ธŒ ์ด๋™ | | BT12-Dev | 2026-04-24 23:00 | **์Šคํ‚ฌ ์‹œ์Šคํ…œ ์„ค๊ณ„ (C43 "๊ฐœ๋ฐœํŒ€" ํ˜ธ์นญ ์ง์ ‘ ์ˆ˜๋ น + C49 ์‹œ๋ฒ” ์ ์šฉ)** โ€” PD ์ง์ ‘ ์ง€์‹œ "๊ฐœ๋ฐœํŒ€์€ ๊ธฐํš์„œ๋ฅผ ํ† ๋Œ€๋กœ ์Šคํ‚ฌ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์ง„ํ–‰". ๊ธฐํš์„œ v0.2 (`ํ”„๋กœ์ ํŠธ/EerieVillage/๊ธฐํš/content/02_์Šคํ‚ฌ_ํšจ๊ณผ_์ปจ์…‰.md` ์•กํ‹ฐ๋ธŒ 6์นดํ…Œ๊ณ ๋ฆฌยทํŒจ์‹œ๋ธŒ 5์นดํ…Œ๊ณ ๋ฆฌยท๊ฐ์„ฑ 4ํŒจํ„ด) + CSV v0.3 60์ข… (`ํ”„๋กœ์ ํŠธ/EerieVillage/๊ธฐํš/content/02_์Šคํ‚ฌ_ํšจ๊ณผ_์ปจ์…‰_v0.3.csv` UTF-8 BOM) ํ† ๋Œ€. C49 ํ‘œ์ค€ ํ”„๋กœ์„ธ์Šค ์‹œ๋ฒ” ์ ์šฉ (๊ฐœ๋ฐœํŒ€์žฅ Opus ์„ค๊ณ„ โ†’ ํด๋ผ์ด์–ธํŠธํŒ€ Sonnet ๊ตฌํ˜„ โ†’ ๊ฐœ๋ฐœํŒ€์žฅ ๊ฒ€์ฆ) | **๋ณด๋ฅ˜** | **[Phase 1 ์™„๋ฃŒ 2026-04-24]** ๊ฐœ๋ฐœํŒ€์žฅ Opus ์ง์ ‘ ์„ค๊ณ„ ์™„๊ฒฐ โ€” `ํ”„๋กœ์ ํŠธ/EerieVillage/๊ฐœ๋ฐœ/spec/์Šคํ‚ฌ_์‹œ์Šคํ…œ_์„ค๊ณ„_v1.md` (1074 ๋ผ์ธ, 14 ์„น์…˜). ยง1 ์•„ํ‚คํ…์ฒ˜ 4๊ณ„์ธต ยท ยง2 ์ธํ„ฐํŽ˜์ด์Šค 4์ข…(`ISkillRuntime`ยท`IActiveSkill`ยท`IPassiveSkill`ยท`IAwakeningSkill`) + ScriptableObject 3์ข…(`ActiveSkillData`ยท`PassiveSkillData`ยท`AwakeningSkillData`) + `PlayerSkillInventory`ยท`PlayerStats` ยท ยง3 CSVโ†’ScriptableObjectโ†’Runtimeโ†’Health.Decrement ๋ฐ์ดํ„ฐ ํ๋ฆ„ + ์นดํ…Œ๊ณ ๋ฆฌ ๋ฌธ์ž์—ด ๋งคํ•‘ ยท ยง4 VS ์ˆœ์ˆ˜ํ˜• ์ž๋™ ๋ฐœ๋™ ์‚ฌ์ดํด (OnTimeยทOnHitยทOnKill + `ActiveSkillRuntime.Tick(deltaTime)` ๋…๋ฆฝ Cooldown) ยท ยง5 `AwakeningManager` 3 ์กฐ๊ฑด ๋™์‹œ ์ถฉ์กฑ + 4 ํŒจํ„ด Dispatcher + ๋‹ค์ค‘ ๊ฐ์„ฑ ์„ ํƒ UI ยท ยง6 ์นดํ…Œ๊ณ ๋ฆฌ ๋งคํ•‘ 6+5+4 (B๋Š” BT7-Dev `AttackHitbox` ์žฌํ™œ์šฉ ยท ๋‚˜๋จธ์ง€ 5 ํšจ๊ณผ ๋ฐœ๋™๊ธฐ ์‹ ์„ค) ยท ยง7 Phase 2-A~E ์ž‘์—… ๋‹จ์œ„ ๋ถ„ํ•ด (์Šคํฌ๋ฆฝํŠธ 25๊ฐœยทํ…Œ์ŠคํŠธ 10๊ฑดยทasset 60๊ฐœ) ยท ยง10 BT7-Dev ํ†ตํ•ฉ ์˜์—ญ (HealthยทAttackHitboxยทPlayerAttackTickerยทPlayerController ์™„์ „ ๋ณด์กด ยท `Health.OnDamagedEvent` ํ™•์žฅ ํ•„์š” ๋ช…์‹œ) ยท ยง11 ๊ธฐ๊ฐ์•ˆ 5๊ฑด + ๋Œ€ํ™”๋กœ๊ทธ ์ถ”๊ฐ€ 2๊ฑด (์ด 7๊ฑด C32 ์ดˆ๊ณผ). ๋Œ€ํ™”๋กœ๊ทธ `๊ณต์œ /๋Œ€ํ™”๋กœ๊ทธ/EerieVillage/2026-04-24.md` `[BT12-Dev Phase 1 ์™„๋ฃŒ] ๊ฐœ๋ฐœํŒ€์žฅ ์Šคํ‚ฌ ์‹œ์Šคํ…œ ์„ค๊ณ„ v1 (1074 ๋ผ์ธ)` ์—”ํŠธ๋ฆฌ ์™„๊ฒฐ. **C48 3์ž๋ฌธ ์ „์ˆ˜ ํ†ต๊ณผ**๋กœ Phase 2 ํด๋ผ์ด์–ธํŠธํŒ€ Sonnet Task๋Š” ๋ณธ Task์—์„œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  **PM ์ฐจ์› ๋ณ„๋„ ์œ„์ž„** ๊ถŒ๊ณ  (C48ยทC49ยทC50 ์ •ํ•ฉ) | **๊ธฐํš์„œ ํ™•์ • ๋Œ€๊ธฐ** (PD 2026-04-25 ์ง์ ‘ ์ง€์‹œ โ€” "๊ธฐํš์„œ ํ™•์ •๋˜๊ธฐ ์ „๊นŒ์ง€ ์ž‘์—… ๋Œ€๊ธฐ") | **์žฌ๊ฐœ ํŠธ๋ฆฌ๊ฑฐ**: ๊ธฐํšํŒ€ v0.3 ๋˜๋Š” v1.0 ํ™•์ • + balance-designer 60์ข… ์ˆ˜์น˜ ํ™•์ • + narrative-designer ์นด๋“œ๋ช… ์„ธ๊ณ„๊ด€ ์žฌ๋งคํ•‘ ๊ฒฐ์ • โ†’ C50 Phase 2 ์‚ฌ์ „ ์Šน์ธ ์˜ต์…˜(a/b/c/d) PD ๊ฒฐ์ • โ†’ ๋ถ„ํ•  ์‹œ Phase 2-A~E ์ˆœ์ฐจ ์ง„ํ–‰ (์ธํ„ฐํŽ˜์ด์ŠคยทSO โ†’ ์ค‘์•™ ์ปดํฌ๋„ŒํŠธ โ†’ ํšจ๊ณผ ๋ฐœ๋™๊ธฐ โ†’ 60์žฅ .asset โ†’ EditMode ํ…Œ์ŠคํŠธ) โ†’ Phase 3 ๊ฐœ๋ฐœํŒ€์žฅ ๊ฒ€์ฆ โ†’ ์™„๋ฃŒ ์•„์นด์ด๋ธŒ. **์„ ํ–‰ ์ฐจ๋‹จ ๋ธ”๋กœ์ปค**: `paths.local.json.UNITY_PROJECT_ROOT: __SET_PER_PC__` ๋ฏธ์„ค์ • โ€” ์žฌ๊ฐœ ์‹œ PD PC ๊ฒฝ๋กœ ์„ค์ • ํ•„์š”. Phase 1 ์‚ฐ์ถœ๋ฌผ 1074 ๋ผ์ธ ์„ค๊ณ„ ๋ฌธ์„œ๋Š” ๋ณด์กด | | BT7-Dev | 2026-04-24 | **BT7-Plan ๊ฐœ๋ฐœ ์ง‘ํ–‰ Phase 1** โ€” VS ์ˆœ์ˆ˜ํ˜• ์ž๋™ ๋ฐœ๋™(๊ณต๊ฒฉ ๋ฒ„ํŠผ ์ œ๊ฑฐ, PlayerAttackTicker ์ฃผ๊ธฐ ํƒ€์ด๋จธ) + ํ•˜ํŠธ ๋ถ„ํ•  ์‹œ์Šคํ…œ(Health.maxHeartsยทQuartersPerHeartยทIncreaseMaxHeartsยทHealยทDecrement(int)) + EditMode ํ…Œ์ŠคํŠธ ๊ฐฑ์‹ (10โ†’13) + AttackHitbox ์ฟผํ„ฐ ๋‹จ์œ„ ํ”ผํ•ด ํ†ตํ•ฉ + TODO ์ฃผ์„(EnemyController.attackDamage balance v0.2 ๋Œ€๊ธฐ) | **์ง„ํ–‰์ค‘** | Unity ํŽธ์ง‘ 6ํŒŒ์ผ ยท BT ์‚ฐ์ถœ๋ฌผ 2ํŒŒ์ผ ยท ๋ฐฑ์—… 6์ข…. **Unity ์™ธ๋ถ€ ๋ ˆํฌ `D:/NerdNavis/EerieVillage/`**: `Assets/Scripts/Gameplay/{PlayerAttack.cs(๊ฐœ์ •), PlayerAttackTicker.cs(์‹ ์„ค)+.meta}`ยท`Assets/Scripts/Mechanics/{Health.cs(์ „๋ฉด๊ฐœ์ •), PlayerController.cs(Attack์ž…๋ ฅ์ œ๊ฑฐยทFacing public), AttackHitbox.cs(Decrement(damage)ํ†ตํ•ฉ)}`ยท`Assets/Settings/InputSystem_Actions.inputactions(Attack์•ก์…˜ยท๋ฐ”์ธ๋”ฉ ์™„์ „ ์ œ๊ฑฐ)`ยท`Assets/Tests/Editor/PlayerAttackTests.cs(10โ†’13)`. **BT ๋ ˆํฌ**: `ํ”„๋กœ์ ํŠธ/EerieVillage/๊ฐœ๋ฐœ/06_BT7-Plan_VS์ˆœ์ˆ˜ํ˜•_์žฌ๊ตฌ์กฐ.md`(์‹ ์„ค) ยท `๊ณต์œ /๊ฐœ๋ฐœํŒ€_๋ฐฑ์—…/EerieVillage/*.bak_20260424_1551.*`(6์ข…). PD ์ˆ˜๋™ ๊ฒ€์ฆ 2์ข…(Asset import+EditMode Runner ์‹คํ–‰ยทPlayer.prefab์— PlayerAttackTicker ๋ถ€์ฐฉ+Play ๊ฒ€์ฆ) | โ€” | **PM ์ˆ˜ํ–‰ ๋Œ€๊ธฐ**: pm-auditor ๊ฐ์‚ฌ โ†’ BT worktree commit โ†’ Unity ์™ธ๋ถ€ ๋ ˆํฌ๋Š” PD Editor ์‹คํ–‰ ์‹œ GitAutoSync ์ž๋™ push โ†’ Play ๊ฒ€์ฆ ๊ฒฐ๊ณผ(13 tests green + ์ž๋™ ๊ณต๊ฒฉ ๋ฐœ๋™ ํ™•์ธ) ์ˆ˜๋ น โ†’ balance/01 v0.2 ํ™•์ • ํ›„ ํ›„์† Phase(EnemyControllerยท์  ATK ํ…Œ์ด๋ธ”ยทHUD ํ•˜ํŠธ UI) ๋ถ„๋ฆฌ ์ฐฉ์ˆ˜ โ†’ ์™„๋ฃŒ ์•„์นด์ด๋ธŒ ์ด๋™ | | BT5-Dev | 2026-04-23 (2026-05-07 ์‹ ๊ทœ ์ง€์‹œ ์ถ”๊ฐ€) | **EerieVillage Phase 3 ํŒŒ์ผ๋Ÿฟ (๊ฐœ๋ฐœ)** โ€” โ‘ Unity git ์ดˆ๊ธฐํ™”ยท์ž๋™ sync โ‘ก์บ๋ฆญํ„ฐ ๊ต์ฒดยท์ด๋™ยท๊ณต๊ฒฉยทi-frame โ‘ขํ…œํ”Œ๋ฆฟ ๋ถ„์„ โ‘ฃ~~PlayerTestGirl ์•„ํ‹€๋ผ์Šค~~ (2026-05-07 ํ๊ธฐ) โ‘ค**Hero1 ์ •์‹ ์บ๋ฆญํ„ฐ ๊ต์ฒด** (2026-05-07 ์‹ ๊ทœ) โ€” `E:/EerieVillage/Assets/Character/Sprites/Hero1/` 37 PNG ์ž์‚ฐ ์ ์šฉ + ์บ๋ฆญํ„ฐ ๋ฆฌ์†Œ์Šค ๊ทœ์น™ SOT ์‹ ์„ค (๋ชจ์…˜ 8์ข… + ์ƒํƒœ ์ „ํ™˜ ๋ฃฐ: idleโ‡„combatidle 5์ดˆ ํƒ€์ด๋จธยทhit ์ธํ„ฐ๋ŸฝํŠธ ๋ณดํ˜ธยทjumpยทresurrection ์‹œํ€€์Šคยทdeath) | **์ง„ํ–‰์ค‘** | [1ยท3๋‹จ๊ณ„ ์™„๋ฃŒ] `9f689c1` ์›๊ฒฉ push ยท `scripts/unity_auto_sync.sh` ยท `01~03_*.md` ๋ถ„์„ 3์ข… [2๋‹จ๊ณ„ v0.2 ์™„๋ฃŒ] PlayerยทEnemy prefab + 8 EditMode tests [**3๋‹จ๊ณ„ PlayerTestGirl ํ๊ธฐ ๊ฒฐ์ • 2026-05-07**] PD ์ง€์‹œ๋กœ Hero1 ์ •์‹ ์ž์‚ฐ ๊ต์ฒด. PlayerTestGirl ์ž์‚ฐ 5์ข…(metaยทIdle.animยทRun.animยทAttack.animยทcontrollerยทprefab)์€ Hero1 ๊ธฐ๋ฐ˜ ์žฌ์ž‘์„ฑ + ์‹ ๊ทœ ์ž์‚ฐ ์ถ”๊ฐ€ (PlayerCombatIdleยทPlayerJumpยทPlayerHitยทPlayerResurrectionยทPlayerDeath.anim). ๊ธฐ์กด Player*.png 9์ข…์€ `_archive/` ๋ฐฑ์—… + Hero1 ๋‹จ๋… ์‚ฌ์šฉ. Player.controller ์ „๋ฉด ์žฌ์„ค๊ณ„ + Health.cs hit ์ธํ„ฐ๋ŸฝํŠธ ๋ณดํ˜ธ + ๋ถ€ํ™œ ์‹œ์Šคํ…œ ์ถ”๊ฐ€. [**5๋‹จ๊ณ„ Hero1 ์ ์šฉ ์ง„ํ–‰์ค‘ 2026-05-07**] PD ๊ฒฐ์ • 5๊ฑด A์•ˆ ์ผ๊ด„ ์ฑ„ํƒ (`combat idle`โ†’`combatidle` renameยทdeath ๋ชจ์…˜ 8์ข… ํ™•์žฅยทjump 1ํ”„๋ ˆ์ž„ ์ •ํ•ฉยท๊ธฐ์กด 9์ข… archive ๋ฐฑ์—…ยทLand/Spawn/Victory ๋ฏธ์‚ฌ์šฉ). ๋ณธ PM ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋“ฑ๋ก(`2026-05-07_123431`) + pm-auditor ์‚ฌ์ „ ๊ฐ์‚ฌ ํ†ต๊ณผ(Critical 0ยทMajor 0ยทMinor 1ยทImprovement 2). ๋ณธ ์„ธ์…˜ = `strange-turing-c6797e` worktree ์ž๋™ ์žฌ์ƒ์„ฑ โ€” ๋ณธ ์ž‘์—… ํ›„ ยง6-A ์ ˆ์ฐจ ์ธ๊ณ„ ์˜์—ญ | `ํ”„๋กœ์ ํŠธ/EerieVillage/๊ฐœ๋ฐœ/05_PlayerTestGirl_์•„ํ‹€๋ผ์Šค_์ ์šฉ.md` (ํ๊ธฐ ํ‘œ๊ธฐ ์˜์—ญ) ยท `ํ”„๋กœ์ ํŠธ/EerieVillage/๊ฐœ๋ฐœ/spec/์บ๋ฆญํ„ฐ_๋ฆฌ์†Œ์Šค_๊ทœ์น™_v1.md` (์‹ ์„ค) ยท `ํ”„๋กœ์ ํŠธ/EerieVillage/๊ฐœ๋ฐœ/06_Hero1_์ ์šฉ_์„ค๊ณ„.md` (๊ฐœ๋ฐœํŒ€์žฅ Opus Phase 1 ์„ค๊ณ„ ์‚ฐ์ถœ ์˜ˆ์ •) ยท Unity ์˜ํ–ฅ ์ž์‚ฐ (๊ฐœ๋ฐœํŒ€์žฅ ์œ„์ž„): `Assets/Character/{Sprites/Hero1/*, Animations/{PlayerIdle,PlayerRun,PlayerAttack,PlayerCombatIdle,PlayerJump,PlayerHit,PlayerResurrection,PlayerDeath,Player.controller}}` ยท `Assets/Prefabs/Player.prefab` ยท `Assets/Scripts/Mechanics/Health.cs` ยท `Assets/Tests/Editor/PlayerAttackTests.cs` ยท `๊ณต์œ /๋Œ€ํ™”๋กœ๊ทธ/EerieVillage/2026-05-07.md` (์‹ ์„ค) | โ€” | **C49 ํ‘œ์ค€ ํ”„๋กœ์„ธ์Šค ์ง„ํ–‰์ค‘**: โ‘  ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋“ฑ๋ก + pm-auditor ๊ฐ์‚ฌ โœ… โ‘ก ์บ๋ฆญํ„ฐ ๋ฆฌ์†Œ์Šค ๊ทœ์น™ SOT ์‹ ์„ค โœ… โ‘ข ๊ฐœ๋ฐœํŒ€์žฅ Opus Phase 1 ์„ค๊ณ„ โœ… โ‘ฃ ํด๋ผ์ด์–ธํŠธํŒ€ Sonnet Phase 2 ์ ์šฉ โœ… โ‘ค ๊ฐœ๋ฐœํŒ€์žฅ Opus Phase 3 ๊ฒ€์ฆ โœ… โ‘ฅ commit `13976e2` + main push โœ… โ‘ฆ **CS0101 ์‚ฌ๊ฑด + D ์˜ต์…˜ ํ›„์† ์ •์ •** โœ… (PD Editor ์‹คํ–‰ ์‹œ `.cs.bak_*.cs` ์ปดํŒŒ์ผ ์—๋Ÿฌ โ†’ Unity bak_2026* 28 ํŒŒ์ผ ์ „์ˆ˜ ์‚ญ์ œ + Phase 1 ยง12 ๋ฐฑ์—… ๋ช…์„ธ ์ „๋ฉด ์ •์ • + feedback 2์ข… ๋“ฑ๋ก [`feedback_pm_excessive_decision_request` ํ—Œ๋ฒ•๊ธ‰ + `feedback_unity_backup_compile_pollution`]) โ‘ง **Hero1 facing ๋ฐ˜์ „ + Collider2D ์‹œ๊ฐ ์ •ํ•ฉ 1์ฐจ** โœ… (PD ์ง€์‹œ โ†’ PM ์ฆ‰์‹œ ์ฒ˜๋ฆฌ โ€” `feedback_pm_excessive_decision_request` ์ฒซ ์ ์šฉ. PlayerController spriteRendererยทanimator ์ž์‹ fallback + Player.prefab BoxCollider2D Size 0.32ร—0.54โ†’0.45ร—1.2 + Offset (-0.09,-0.14)โ†’(0,-0.05). PM ์‹œ๊ฐ ํŒ๋‹จ ์‹คํŒจ โ€” Hero1 "์šฐ์ธก ํ–ฅํ•จ"์œผ๋กœ ์ž˜๋ชป ํŒ๋‹จ) โ‘จ **facing ๋กœ์ง ๋ฐ˜์ „ + Collider Offset ์–‘์ˆ˜ ์žฌ์ •์ • 2์ฐจ** โœ… โ‘ฉ **ํ”ผ๊ฒฉ ๋ฌด์  ๊นœ๋นก์ž„ + ๋ฐŸ๊ธฐ ๋ณต์› + ์‚ฌ๋ง ์ž…๋ ฅ ์ฐจ๋‹จ + ๋ถ€ํ™œ ํŒ์—… + ๋ถ€ํ™œ ๋ฌด์ ** โœ… โ‘ช **๋ฐŸ๊ธฐ ์ ํ”„ ํŒ์ • ๊ฐ•ํ™”ยทBounce 1/3ยท๋‚™์‚ฌ ์œ„์น˜ ๋ณต๊ท€ยท์ตœ์ ํ™”** โœ… โ‘ซ **๋ฐŸ๊ธฐ ์œ„์น˜ ๋‹จ๋… ํŒ์ •ยทEnemy Trigger ํ†ต๊ณผยท๋‚™์‚ฌ ์นด๋ฉ”๋ผ ์™ธ ๋Œ€๊ธฐ** โœ… โ‘ฌ~ใ‰’ **BT5-Dev #20~#47 ๋ฐœํŒ ์‹œ์Šคํ…œ 28ํšŒ ์‹œ๋„** โœ… (2026-05-07 ๋ณธ ์„ธ์…˜ ์ง„ํ–‰ โ€” Drop-Through Platform ํ‘œ์ค€ ํŒจํ„ด ๋„๋‹ฌ๊นŒ์ง€). ํ•ต์‹ฌ: โ‘ฐ Enemy m_Layer 13โ†’14ยทm_TagString Untagged ์ง„์ •ํ•œ ๊ทผ๋ณธ / ใ‰’ KinematicObject contactFilter ์บ์‹ฑ ์˜์—ญ ์ง„์ •ํ•œ ๊ทผ๋ณธ (๊ฐœ๋ฐœํŒ€์žฅ Opus ์ง„๋‹จ) / ์ตœ์ข… BT47 Level Tilemap ๊ณต์ค‘ Tile ์ž๋™ ์˜์—ญ Foreground ์ด๋™ + Layer 16 + Tile m_ColliderType=Sprite ๊ฐ•์ œ. ํ—Œ๋ฒ•๊ธ‰ feedback 5์ข… ์‹ ์„ค (excessive_decision_requestยทexternal_repo_commit_omissionยทmcp_direct_implementationยทfiller_word_overuseยทsolution_proactive_proposal). filler_word_check.sh hook ์‹ ์„ค. Unity MCP server install ์™„๋ฃŒ (์žฌ์‹œ์ž‘ ํ›„ ํ™œ์„ฑ). EerieVillage commit `1024e08` BT47 โ†’ ใ‰“ PD Refresh+Play ๊ฒ€์ฆ (๊ณต์ค‘ ๋ฐœํŒ ์ ํ”„ยท์ด๋™ ํ†ต๊ณผยท์ฐฉ์ง€) โ†’ ์™„๋ฃŒ ์•„์นด์ด๋ธŒ ์ด๋™. ์„ธ์…˜ ์ข…๊ฒฐ ์ธ์ˆ˜์ธ๊ณ„์„œ: `๊ณต์œ /์กฐ์ง๊ณต์ง€/2026-05-07_BT5-Dev_์„ธ์…˜์ข…๊ฒฐ์ธ์ˆ˜์ธ๊ณ„.md` โ†’ ใ‰” **BT5-Dev #63~#109 ๋ฐœํŒยท๋ชฌ์Šคํ„ฐ ์‹œ์Šคํ…œ** (2026-05-08 ๋ณธ ์„ธ์…˜) โœ… โ€” [๋ฐœํŒ ์‹œ์Šคํ…œ ์˜๊ตฌ ๋งˆ๋ฌด๋ฆฌ BT63~BT75] Drop-Through ํŒจํ„ดยทR2 (AutoForeground ๋ถ„๋ฆฌ)ยทDown+Jumpยท๊ฐ€์žฅ์ž๋ฆฌ jitter ์ฐจ๋‹จ [๋ชฌ์Šคํ„ฐ sprite ๊ต์ฒด BT76~BT79] M001 ๋Š‘๋Œ€ 4 ๋ชจ์…˜ (IdleยทRunยทHurtยทDeath)ยทflipX ์ •ํ•ฉ [์ž๋™ patrolยท๋‚ญ๋– ๋Ÿฌ์ง€ ์ฐจ๋‹จยท๋ฐŸ๊ธฐ ์ฒ˜์น˜ BT80~BT109] 23ํšŒ+ ๊ฐ€์„ค ๋ˆ„์  ๋ถ€์ •ํ™• ์ž์ธ ํ›„ PD ๊ทผ๋ณธ ์ง„๋‹จ(์ ˆ๋ฒฝ ์ฒดํฌ ๋กœ์ง ์ž์ฒด ๊ฒฐํ•จ) ์ฑ„ํƒ โ†’ BT107 Tilemap.WorldToCell + HasTile ๊ธฐ๋ฐ˜ ์ธก์ • ์žฌ์„ค๊ณ„ยทBT109 footPos.y = bounds.min.y - 0.5f ์ •์ • [EnemyDeath ๊ฐ•ํ™” BT104ยทBT105] body.simulated=false ์ œ์ž๋ฆฌ ์‚ฌ๋งยทdeath ์• ๋‹ˆ๋ฉ”์ด์…˜ยท1์ดˆ Destroy. EerieVillage commit `3dfc466` (BT109). ์„ธ์…˜ ์ข…๊ฒฐ ์ธ์ˆ˜์ธ๊ณ„์„œ `๊ณต์œ /์กฐ์ง๊ณต์ง€/2026-05-08_BT5-Dev_์„ธ์…˜์ข…๊ฒฐ์ธ์ˆ˜์ธ๊ณ„.md`. **์ž”์—ฌ**: ์ข์€ ์˜์—ญ(์‹œ์ž‘ ์œ„์น˜ โ†” ์ ˆ๋ฒฝ ๊ฑฐ๋ฆฌ ๋งค์šฐ ์ž‘์Œ) Enemy ํŒจํ„ด ๋ถ€์ •ํ•ฉ (PD "์ผ๋ถ€ ์ œ์™ธ ์ •ํ•ฉ" โ€” PD ์žฌ์š”์ฒญ ์‹œ ํ›„์†) | diff --git a/๊ณต์œ /๋Œ€ํ™”๋กœ๊ทธ/EerieVillage/2026-05-08.md b/๊ณต์œ /๋Œ€ํ™”๋กœ๊ทธ/EerieVillage/2026-05-08.md index 0ba6958..eaf3e7c 100644 --- a/๊ณต์œ /๋Œ€ํ™”๋กœ๊ทธ/EerieVillage/2026-05-08.md +++ b/๊ณต์œ /๋Œ€ํ™”๋กœ๊ทธ/EerieVillage/2026-05-08.md @@ -470,3 +470,102 @@ Scene `Ingame.unity` ์˜์—ญ PatrolPath GameObject 11๊ฑด + parent `PatrolPaths` - **Scene yaml PatrolPath 11๊ฑด ์ •๋ฆฌ**: PD Editor Hierarchy ์˜์—ญ ์ง์ ‘ ์‚ญ์ œ - **์ž”์—ฌ A ์˜์—ญ (#12)**: PD Scene ์˜์—ญ ์‹œ๊ฐ ์ •๋ฆฌ - **์ฐจ๊ธฐ ์ง„๋‹จ ํ™œ์„ฑ**: ์ฐจ๊ธฐ ์‹œํ–‰์ฐฉ์˜ค ์‹œ์  Project Settings โ†’ Scripting Define Symbols โ†’ `ENEMY_DIAG_VERBOSE` ์ถ”๊ฐ€ + +--- + +## ์—”ํŠธ๋ฆฌ 6. BT12-MVP-A Phase 1 ์„ค๊ณ„ + dev-auditor ๊ฐ์‚ฌ ์ž์„ฑ + ํ—Œ๋ฒ•๊ธ‰ feedback 2์ข… ์‹ ์„ค + +**์‹œ๊ฐ**: 2026-05-08 ํ›„๋ฐ˜ +**์ฃผ์ฒด**: ์ด๊ด„PM (์ž„์‹œ ๊ฐœ๋ฐœํŒ€์žฅ ์—ญํ•  ์œ„์ž„ โ€” ์‹œ์Šคํ…œ ํ•œ๊ณ„ ์ ˆ์ถฉ) +**์˜์—ญ**: BT12-MVP-A โ€” ๊ฒฝํ—˜์น˜ยท๋ ˆ๋ฒจ์—…ยท์Šคํ‚ฌ ์นด๋“œ ์„ ํƒ UI Phase 1 ์„ค๊ณ„ +**์œ ํ˜•**: dev-auditor ๊ฐ์‚ฌ ๊ฒฐ๊ณผ ๋ณธ PM ์ž์„ฑ + ์ •์ƒ ํ˜ธ์ถœ ์‹œ๋„ ์‹คํŒจ + PM ์ง์ ‘ ์ฒ˜๋ฆฌ ์ ˆ์ถฉ + +### PD ์ง์ ‘ ์ง€์‹œ (2026-05-08) +1. ์  ์ฒ˜์น˜ ์‹œ ๊ฒฝํ—˜์น˜ ํš๋“ + ๋ ˆ๋ฒจ์—…๋งˆ๋‹ค ์Šคํ‚ฌ ์นด๋“œ 3๊ฐœ ์„ ํƒ ๊ธฐ๋Šฅ +2. ๋ ˆ๋ฒจ์—… ์‹œ ์Šคํ‚ฌ ์นด๋“œ ์„ ํƒ UI (์Šคํ‚ฌ ํšจ๊ณผ ์ถ”ํ›„ ๊ตฌํ˜„ยทUI๋งŒ) + +### PD ๊ฒฐ์ • (2026-05-08ยท"์œ„ ๊ณ„ํš๋Œ€๋กœ ์ง„ํ–‰") +๋ณธ PM ๊ถŒ๊ณ  (ฮฒ) ์ฑ„ํƒ โ€” BT12-Dev ๋ณด๋ฅ˜ ์ผ๋ถ€ ํ•ด์ œยทBT12-MVP-A ๋ถ„๋ฆฌ ํ•ญ๋ชฉ ์ง„ํ–‰. + +### dev-auditor ๊ฐ์‚ฌ ์ž์„ฑ (Critical 2ยทMajor 5) + +๋ณธ PM ์ง์ „ ํ˜ธ์ถœ ์‹œ์  `subagent_type=dev-auditor` ๋ช…์‹œ + ์˜๋ขฐ ๋ณธ๋ฌธ "๊ฐœ๋ฐœํŒ€์žฅ Opus Phase 1 ์„ค๊ณ„". dev-auditor ์ž์ฒด ๊ฐ์‚ฌ ๊ฒฐ๊ณผ: + +| ๋“ฑ๊ธ‰ | ์˜์—ญ | ๋ณธ PM ์ž์„ฑ | +|------|------|---------| +| **Critical 1** | Agent ๋ผ์šฐํŒ… ์˜ค๋ฅ˜ (๊ฐ์‚ฌ๊ด€ ์˜์—ญ์— ํŒ€์žฅ ์ง๋ฌด ์œ„์ž„ยทC23 ์—ญํ•  ์—ฐ๊ธฐ) | ์ •์ƒ ๊ฐœ๋ฐœํŒ€์žฅ agent ํ˜ธ์ถœ ์˜๋ฌด ์ธ์ง€ ๊ฒฐ์† | +| **Critical 2** | BT12-Dev ๋ณด๋ฅ˜ ์™ธ์—ฐ ๋ฌด๋‹จ ํ•ด์„ | PD ๋ช…์‹œ ์Šน์ธ ํ›„ ์ •ํ•ฉ (ฮฒ์•ˆ) | +| Major 3 | C49 Phase 1 ์ฃผ์ฒด ์œ„๋ฐ˜ | dev-auditor โ†’ ์ •์ƒ ํŒ€์žฅ | +| Major 4 | BT12-Dev v1 PlayerStats ์ถฉ๋Œ ๊ฒ€ํ†  ๋ˆ„๋ฝ | ๋ณธ ์„ค๊ณ„ ยง1 ๋งคํŠธ๋ฆญ์Šค ๋ช…์‹œ | +| Major 5 | C50 ์‚ฌ์ „ PD ์Šน์ธ ํ‘œํ˜„ ๋ชจํ˜ธ | ์ง์ „ PM ์‘๋‹ต 50~80K ๋ช…์‹œ | +| Minor 6ยท7 | C25 ๋„˜๋ฒ„๋ง ๋ณ€ํ˜•ยทํ† ํฐ ์ถ”์ • ๋ถ„์‚ฐ | ์ •์ • | +| Improvement 8 | PM ์ง์ ‘ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ์„ฑ | ๋ณธ ์˜์—ญ ์ฑ„ํƒ (์‹œ์Šคํ…œ ํ•œ๊ณ„ ์ ˆ์ถฉ) | + +### ์ •์ƒ ํ˜ธ์ถœ ์‹œ๋„ ์‹คํŒจ + PM ์ง์ ‘ ์ฒ˜๋ฆฌ ์ ˆ์ถฉ + +๋ณธ PM์ด dev-auditor ๊ฐ์‚ฌ ๊ฒฐ๊ณผ ์ฑ„ํƒ ํ›„ ์ •์ƒ ๊ฐœ๋ฐœํŒ€์žฅ ํ˜ธ์ถœ ์‹œ๋„: +- `subagent_type=๊ฐœ๋ฐœํŒ€์žฅ` ๋ช…์‹œ +- ๊ฒฐ๊ณผ: `Agent type '๊ฐœ๋ฐœํŒ€์žฅ' not found. Available agents: [์˜๋ฌธ agent 15์ข…]` +- **์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ์˜์—ญ ํ•œ๊ธ€ agent ๋ฏธ๋“ฑ์žฌ ๋ฐœ๊ฒฌ** + +๋ณธ PM ์ ˆ์ถฉ ๊ฒฐ์ •: +- **PM ์ง์ ‘ ์ฒ˜๋ฆฌ** (Opusยท์ด๊ด„PMยท์ž„์‹œ ๊ฐœ๋ฐœํŒ€์žฅ ์—ญํ•  ์œ„์ž„) +- ์‚ฐ์ถœ๋ฌผ ์˜์—ญ ์ž์„ฑ ๋ช…์‹œ +- ์ฐจ๊ธฐ ์˜์—ญ ์‹œ์Šคํ…œ ์ •์ • ์˜๋ฌด (`feedback_korean_agent_catalog_unregistered.md` ์‹ ์„ค) + +### Phase 1 ์„ค๊ณ„ ์‚ฐ์ถœ + +`ํ”„๋กœ์ ํŠธ/EerieVillage/๊ฐœ๋ฐœ/spec/BT12-MVP-A_์„ค๊ณ„_v1.md` (์‹ ๊ทœยท~600 ๋ผ์ธ) + +**ํ•ต์‹ฌ ์˜์—ญ**: +- ยง1 BT12-Dev v1 ์ถฉ๋Œยท์ค‘๋ณต ๋งคํŠธ๋ฆญ์Šค โ€” `PlayerStats` ๋ถ„๋ฆฌ (`PlayerProgression` ์‹ ๊ทœ) +- ยง2 ์‹ ๊ทœ ์ปดํฌ๋„ŒํŠธ 7์ข… (`PlayerProgression`ยท`ExperienceSystem`ยท`LevelUpManager`ยท`SkillCardPlaceholder`ยท`SkillCardPlaceholderPool`ยท`SkillSelectionUI`ยท`SkillCardSlot`) +- ยง3 ๊ธฐ์กด ์‹œ์Šคํ…œ ํ†ตํ•ฉ hook (EnemyDeathยทPlayerControllerยทTime.timeScaleยทcontrolEnabled) +- ยง4 ์ด๋ฒคํŠธ ํ๋ฆ„ (์  ์ฒ˜์น˜ โ†’ XP โ†’ ๋ ˆ๋ฒจ์—… โ†’ ์ผ์‹œ์ •์ง€ โ†’ UI โ†’ ์นด๋“œ ์„ ํƒ โ†’ ํ™•์ธ โ†’ ๊ฒŒ์ž„ ์žฌ๊ฐœ) +- ยง5 UI Prefab ๊ตฌ์กฐ (PD ์˜ˆ์‹œ ์ •ํ•ฉ โ€” ์ƒ‰์ƒ ๋ฐฐ๋„ˆยท์›ํ˜• ์•„์ด์ฝ˜ยท๋™์‹ฌ์›ยท"ํ™•์ธ" ๋ฒ„ํŠผยท"๊ธฐ์ˆ  ์„ ํƒ" ํƒ€์ดํ‹€) +- ยง6 balance/02 v0.2 ์˜์—ญ ์ •ํ•ฉ (`XP_to_next = 80 + Lv ร— 20`) +- ยง7 Phase 2 ๋ถ„๋Ÿ‰ ์ถ”์ •ยท์˜ต์…˜ a/b/c +- ยง8 ํšŒ๊ท€ ์œ„ํ—˜ ์˜์—ญ (BT5-DevยทBT7-Dev ์˜ํ–ฅ ๊ฒ€์ฆ) +- ยง9 ๊ธฐ๊ฐ์•ˆ 5๊ฑด +- ยง10 ๋ณธ ์„ค๊ณ„ ์ž์„ฑ + +### ์‹ ๊ทœ ํ—Œ๋ฒ•๊ธ‰ feedback 2์ข… + +1. **`feedback_pm_auditor_role_conflation`** โ€” ๊ฐ์‚ฌ๊ด€ยทํŒ€์žฅ ์ง๋ฌด ๋ถ„๋ฆฌ ์˜๋ฌด. dev-auditorยทplan-auditorยทpm-auditor = ๊ฐ์‚ฌ ํ•œ์ •. ์ •์ƒ ํŒ€์žฅ agent ํ˜ธ์ถœ ์˜๋ฌด. +2. **`feedback_korean_agent_catalog_unregistered`** (project tier) โ€” ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ํ•œ๊ธ€ agent ๋ฏธ๋“ฑ์žฌ ์˜์—ญ ์ •์ • ์˜๋ฌด. ์ฐจ๊ธฐ ์˜์—ญ Anthropic Claude Code ์˜์—ญ ๋“ฑ๋ก ์ ˆ์ฐจ ๊ฒ€์ฆ. + +### Phase 2 ์˜ต์…˜ (PD ๊ฒฐ์ • ์˜์—ญ) + +| ์˜ต์…˜ | ๋ฒ”์œ„ | ๋ถ„๋Ÿ‰ | PM ๊ถŒ๊ณ  | +|------|------|------|--------| +| (a) ๋‹จ์ผ Task ํ†ตํ•ฉ | ์ฝ”๋“œ 7 + UI prefab + asset 5 + Scene ํ†ตํ•ฉ | ~120~180K | โ–ณ | +| **(b) ๋ถ„ํ•  โ€” 2-A ์ฝ”๋“œ + 2-B UI prefab/asset** | ์‹œ์Šคํ…œ ์ฝ”๋“œ ์˜์—ญ โ†” UI ์˜์—ญ ์ง๋ฌด ๋ถ„๋ฆฌ | 2-A ~70K + 2-B ~80K | **โ—Ž** | +| (c) 3๋ถ„ํ•  โ€” ์ฝ”๋“œยทplaceholder assetยทUI prefab | ๋ถ„์‚ฐ | 2-A ~60K + 2-B ~40K + 2-C ~60K | ร— (๋ถ„์‚ฐ ๊ณผ๋‹ค) | + +**PM ๊ถŒ๊ณ  = (b)**. ์ฝ”๋“œ ์˜์—ญ ๊ฒ€์ฆ โ†’ UI ์˜์—ญ ์ง„ํ–‰ = ํšŒ๊ท€ ์œ„ํ—˜ โ†“. + +### ์‚ฐ์ถœ๋ฌผ + +- `ํ”„๋กœ์ ํŠธ/EerieVillage/๊ฐœ๋ฐœ/spec/BT12-MVP-A_์„ค๊ณ„_v1.md` (์‹ ๊ทœยทPhase 1 ์„ค๊ณ„ ๋ณด๊ณ ์„œ) +- `memory/org/feedback_pm_auditor_role_conflation.md` (์‹ ๊ทœยทํ—Œ๋ฒ•๊ธ‰) +- `memory/org/feedback_korean_agent_catalog_unregistered.md` (์‹ ๊ทœยทproject tier) +- `memory/org/MEMORY.md` (์ธ๋ฑ์Šค ๊ฐฑ์‹ ) +- `๊ณต์œ /๋Œ€ํ™”๋กœ๊ทธ/EerieVillage/2026-05-08.md` (๋ณธ ์—”ํŠธ๋ฆฌ) +- `๊ณต์œ /PD_์ง€์‹œ_ํŠธ๋ž˜ํ‚น/๊ฐœ๋ฐœํŒ€_PD_์ง€์‹œ_๋กœ๊ทธ.md` (BT12-MVP-A ๋ถ„๋ฆฌ ๋“ฑ๋ก) + +### ๊ด€๋ จ ๊ทœ์น™ยท์ž์‚ฐ + +- C2 ๊ทผ๋ณธ ํ•ด๊ฒฐ (BT12-Dev v1 ์ถฉ๋Œ ์˜์—ญ ๋ถ„๋ฆฌ ์ •์ •) +- C5ยทC23 ์ •์ง์„ฑ (๊ฐ์‚ฌ๊ด€ ์˜์—ญ์— ํŒ€์žฅ ์ง๋ฌด ์œ„์ž„ ์ž์„ฑ) +- C36 PM ์ž์œจ ์™ธ์—ฐ (์‹œ์Šคํ…œ ํ•œ๊ณ„ ์ ˆ์ถฉ ์˜์—ญ ์ž์„ฑ) +- C39 ์‹œ์Šคํ…œ ๋ฐ˜์˜ ์‹ค์ธก (BT12-Dev v1 1074 ๋ผ์ธ ์ง์ ‘ readยท๊ฒ€์ฆ) +- C43 ํ˜ธ์นญ ๋ผ์šฐํŒ… (๊ฐœ๋ฐœํŒ€ = ๊ฐœ๋ฐœํŒ€์žฅ 1์ฐจ ์ˆ˜๋ น) +- C48 ๋ถˆํ•„์š” Task ๋ฐฐ์ œ (3์ž๋ฌธ ์˜๋ฌด) +- C49 ํ‘œ์ค€ ํ”„๋กœ์„ธ์Šค (Phase 1 ์„ค๊ณ„๋งŒยท๊ตฌํ˜„ Xยท๊ฒ€์ฆ ํ›„์†) +- C50 ์‚ฌ์ „ PD ์Šน์ธ (Phase 2 ์˜ต์…˜ ๋ช…์‹œ) + +### ํ›„์† ์˜์—ญ + +- **PD Phase 2 ๊ฒฐ์ •**: (a)/(b)/(c) ๋˜๋Š” ๋ณด๋ฅ˜ +- **Phase 2 ์ง„ํ–‰ ์‹œ**: `feedback_korean_agent_catalog_unregistered` ์ •์ • ์˜์—ญ ์‹œ๋„ (์ •์ƒ ํด๋ผ์ด์–ธํŠธํŒ€์žฅ ๋˜๋Š” ๊ฒŒ์ž„ํ”Œ๋ ˆ์ด ์˜์—ญ ํ˜ธ์ถœ) โ†’ ๋ฏธ์ •์ • ์‹œ PM ์ง์ ‘ ์ฒ˜๋ฆฌ ์ ˆ์ถฉ +- **์ฐจ๊ธฐ BT12-Dev ๋ณธ๊ฒฉ ์˜์—ญ**: 60์ข… ์นด๋“œ ํšจ๊ณผ ์˜์—ญ (๊ธฐํš์„œ v0.3 ํ™•์ • ๋Œ€๊ธฐ) diff --git a/ํ”„๋กœ์ ํŠธ/EerieVillage/๊ฐœ๋ฐœ/spec/BT12-MVP-A_์„ค๊ณ„_v1.md b/ํ”„๋กœ์ ํŠธ/EerieVillage/๊ฐœ๋ฐœ/spec/BT12-MVP-A_์„ค๊ณ„_v1.md new file mode 100644 index 0000000..f377328 --- /dev/null +++ b/ํ”„๋กœ์ ํŠธ/EerieVillage/๊ฐœ๋ฐœ/spec/BT12-MVP-A_์„ค๊ณ„_v1.md @@ -0,0 +1,608 @@ +--- +type: ์„ค๊ณ„_๋ฌธ์„œ +scope: BT12-MVP-A โ€” ๊ฒฝํ—˜์น˜ยท๋ ˆ๋ฒจ์—…ยท์Šคํ‚ฌ_์นด๋“œ_์„ ํƒ_UI +author: ์ด๊ด„PM (์ž„์‹œ ๊ฐœ๋ฐœํŒ€์žฅ ์—ญํ•  ์œ„์ž„ โ€” ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ํ•œ๊ธ€ agent ๋ฏธ๋“ฑ์žฌ ์ ˆ์ถฉ) +date: 2026-05-08 +version: v1.0 (Phase 1 ์„ค๊ณ„) +project: EerieVillage (๊ธฐ๋ฌ˜ํ•œ ๊ณ ์„ : ์กฐ์„ ํ‡ด๋งˆ๋ސ / EerieVillage: Joseon Exorcist) +phase: BT12-MVP-A Phase 1 โ€” ์„ค๊ณ„ +data_source: ํ”„๋กœ์ ํŠธ/EerieVillage/๊ฐœ๋ฐœ/spec/์Šคํ‚ฌ_์‹œ์Šคํ…œ_์„ค๊ณ„_v1.md (BT12-Dev v1 1074 ๋ผ์ธ) ยท ํ”„๋กœ์ ํŠธ/EerieVillage/๊ธฐํš/balance/02_๋ ˆ๋ฒจ์—…_๊ณก์„ .md v0.2 ยท ํ”„๋กœ์ ํŠธ/EerieVillage/๊ธฐํš/content/02_์Šคํ‚ฌ_ํšจ๊ณผ_์ปจ์…‰.md v0.2 (BT11-Plan 60์ข…) ยท PD ์ฒจ๋ถ€ ์˜ˆ์‹œ ์ด๋ฏธ์ง€ (2026-05-08 "๊ธฐ์ˆ  ์„ ํƒ" UI) +status: Phase 1 ์„ค๊ณ„ ์™„๋ฃŒ โ€” Phase 2 ๊ตฌํ˜„ ๋ถ„๋Ÿ‰ ์‚ฌ์ „ PD ์Šน์ธ ๋Œ€๊ธฐ ยท Phase 3 ๊ฒ€์ฆ ๋Œ€๊ธฐ + +# ๋ณธ ๋ฌธ์„œ ์ž„์‹œ ์œ„์ž„ ์ž์„ฑ (C23 ์™ธ์—ฐ ๋ช…์‹œ) + +๋ณธ ์„ค๊ณ„๋Š” ์ •์ƒ ๊ฐœ๋ฐœํŒ€์žฅ agent ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ๋ฏธ๋“ฑ์žฌ ์˜์—ญ ํ•œ๊ณ„ ์ ˆ์ถฉ. ์ด๊ด„PM (Opusยท๋ณธ PM) ์ž„์‹œ ๊ฐœ๋ฐœํŒ€์žฅ ์—ญํ•  ์œ„์ž„. ์ฐจ๊ธฐ ์˜์—ญ Anthropic Claude Code ์นดํƒˆ๋กœ๊ทธ ํ•œ๊ธ€ agent ๋“ฑ์žฌ ์ •์ • ์˜๋ฌด (`feedback_korean_agent_catalog_unregistered.md` ์‹ ์„ค). ๋ณธ ์‚ฐ์ถœ๋ฌผ ์ •ํ•ฉ ๊ฒ€์ฆ = Phase 3 ์‹œ์  dev-auditor ๊ฐ์‚ฌ ์˜๋ฌด. +--- + +# BT12-MVP-A ์„ค๊ณ„ v1 โ€” ๊ฒฝํ—˜์น˜ยท๋ ˆ๋ฒจ์—…ยท์Šคํ‚ฌ ์นด๋“œ ์„ ํƒ UI + +## ยง0. ๋ณธ ์ž‘์—… ๋ฒ”์œ„ ๋ช…ํ™•ํ™” + +### 0-1. PD ์ง์ ‘ ์ง€์‹œ (2026-05-08) + +1. ์  ์ฒ˜์น˜ ์‹œ ๊ฒฝํ—˜์น˜ ํš๋“ + ๋ ˆ๋ฒจ์—…๋งˆ๋‹ค ์Šคํ‚ฌ ์นด๋“œ 3๊ฐœ ์„ ํƒ ๊ธฐ๋Šฅ +2. ๋ ˆ๋ฒจ์—… ์‹œ ์Šคํ‚ฌ ์นด๋“œ ์„ ํƒ UI (์Šคํ‚ฌ ํšจ๊ณผ ์ถ”ํ›„ ๊ตฌํ˜„ยทUI๋งŒ) + +### 0-2. PD ๊ฒฐ์ • ์ฑ„ํƒ (2026-05-08ยท"์œ„ ๊ณ„ํš๋Œ€๋กœ ์ง„ํ–‰") + +๋ณธ PM ๊ถŒ๊ณ  (ฮฒ) ์ฑ„ํƒ: +- BT12-Dev ๋ณด๋ฅ˜ ์ผ๋ถ€ ํ•ด์ œ โ€” Phase 1-A (๊ฒฝํ—˜์น˜ยท๋ ˆ๋ฒจ์—…ยทUI) ์„ ํ–‰ +- BT12-Dev v1 1074 ๋ผ์ธ ์ž์‚ฐ ํ™œ์šฉ + ์‹ ๊ทœ ์˜์—ญ ๋ถ„๋ฆฌ +- 60์ข… ์นด๋“œ ํšจ๊ณผ ์ ์šฉ์€ BT12-Dev ํ›„์† ์˜์—ญ (๊ธฐํš์„œ v0.3 ํ™•์ • ๋Œ€๊ธฐ) + +### 0-3. ๋ณธ ์ž‘์—… = BT12-MVP-A (BT12-Dev ๋ถ„๋ฆฌ ํ•ญ๋ชฉ) + +PD ์ง€์‹œ ๋กœ๊ทธ ์˜์—ญ BT12-Dev ํ™œ์„ฑ ํ•ญ๋ชฉ = ๋ณด๋ฅ˜ ์œ ์ง€. ๋ณธ ์ž‘์—… = **์‹ ๊ทœ ๋ถ„๋ฆฌ ํ•ญ๋ชฉ BT12-MVP-A** ๋“ฑ๋ก. + +--- + +## ยง1. BT12-Dev v1 ์ถฉ๋Œยท์ค‘๋ณต ๋งคํŠธ๋ฆญ์Šค (dev-auditor Major 4 ์ •์ •) + +| BT12-Dev v1 (1074 ๋ผ์ธ) | ๋ณธ ์ž‘์—… ์˜์—ญ | ํ†ตํ•ฉยท๋ถ„๋ฆฌ ๊ฒฐ์ • | ์‚ฌ์œ  | +|------|-----|-----|------| +| `PlayerStats` POCO (DamageMultiplierยทCooldownMultiplierยทXPMultiplier ๋“ฑ ํŒจ์‹œ๋ธŒ ๋ณด์ •) | LevelยทEXPยทEXP-to-next ์ง„ํ–‰๋„ | **๋ถ„๋ฆฌ** โ€” `PlayerProgression` ์‹ ๊ทœ ํด๋ž˜์Šค | Single Responsibility (๋ณด์ • vs ์ง„ํ–‰๋„) ยท BT12-Dev v1 ์˜์—ญ ๋ณ€๊ฒฝ X ยท ์ฐจ๊ธฐ ๋ณธ๊ฒฉ ์ฐฉ์ˆ˜ ์‹œ์  ์ถฉ๋Œ X | +| `ActiveSkillDataยทPassiveSkillDataยทAwakeningSkillData` ScriptableObject 3์ข… (ํšจ๊ณผ ์ •์˜) | placeholder ์นด๋“œ ํ‘œ์‹œ ์˜์—ญ | **์‹ ๊ทœ ๋ถ„๋ฆฌ** โ€” `SkillCardPlaceholder` ScriptableObject | ํšจ๊ณผ ์˜์—ญ ์ •์˜ X (PD ๋ช…์‹œ "๊ธฐ๋Šฅ ์ถ”ํ›„") ยท placeholder๋Š” ํ‘œ์‹œ ์˜์—ญ๋งŒ (์ด๋ฆ„ยท์„ค๋ช…ยท๋“ฑ๊ธ‰ยท์•„์ด์ฝ˜) ยท ์ฐจ๊ธฐ ๋ณธ๊ฒฉ ์˜์—ญ = `SkillCardPlaceholder` ์˜์—ญ deprecate + ScriptableObject 3์ข… ํ™œ์šฉ | +| `PlayerSkillInventory` (60์ข… ์นด๋“œ ๋ณด์œ ยท์Šฌ๋กฏ 6+6+6) | ์„ ํƒ ์นด๋“œ ๋ณด์œ  ์˜์—ญ | **์‚ฌ์šฉ X** | ๋ณธ ์ž‘์—… ์˜์—ญ = ์นด๋“œ ํšจ๊ณผ ์ ์šฉ X = Inventory ์˜์—ญ ๋ฏธ์ ์šฉ. ์ฐจ๊ธฐ ๋ณธ๊ฒฉ ์˜์—ญ์— ํ†ตํ•ฉ | +| `SkillRuntimeFactory` (CSV โ†’ ScriptableObject โ†’ Runtime) | placeholder ์นด๋“œ ํ’€ | **์‹ ๊ทœ ๋ถ„๋ฆฌ** โ€” `SkillCardPlaceholderPool` | CSV ๋ณ€ํ™˜ ์˜์—ญ X ยท 5~8์žฅ placeholder ScriptableObject ์ง์ ‘ List<>ยท์ธ์ŠคํŽ™ํ„ฐ ์˜์—ญ | +| `SkillCsvImporter` ์—๋””ํ„ฐ ํˆด | ๋ฏธ์‚ฌ์šฉ | **์‚ฌ์šฉ X** | placeholder ์˜์—ญ ์ง์ ‘ ์ž‘์„ฑ | +| `Schedule` ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ (Simulation) | ๋ ˆ๋ฒจ์—… ๋ฐœํ™” | **ํ™œ์šฉ** โ€” `Schedule()` ์‹ ๊ทœ ์ด๋ฒคํŠธ | ๊ธฐ์กด ํŒจํ„ด ์ •ํ•ฉ | + +### ยง1-1. ๊ฒฐ๋ก  + +๋ณธ ์ž‘์—… ์˜์—ญ = **BT12-Dev v1 ์˜์—ญ ๋ณ€๊ฒฝ X**. ์‹ ๊ทœ 6 ํด๋ž˜์Šค ๋ถ„๋ฆฌ + ๊ธฐ์กด `Simulation.Schedule` ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ + `Health` API ํ™œ์šฉ. BT12-Dev v1 ์˜์—ญ์€ ์ฐจ๊ธฐ ๋ณธ๊ฒฉ ์ฐฉ์ˆ˜ ์‹œ์  ๊ทธ๋Œ€๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅ. + +--- + +## ยง2. ์‹ ๊ทœ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„ + +### 2-1. `PlayerProgression` (POCO + MonoBehaviour) + +```csharp +namespace EerieVillage.Progression +{ + /// + /// ํ”Œ๋ ˆ์ด์–ด ๋ ˆ๋ฒจ์—… ์ง„ํ–‰๋„. BT12-Dev v1 PlayerStats(ํŒจ์‹œ๋ธŒ ๋ณด์ •)์™€ ์ง๋ฌด ๋ถ„๋ฆฌ. + /// XP๋Š” ์  ์ฒ˜์น˜ ์‹œ ๋ˆ„์ . ์ž„๊ณ„์  ๋„๋‹ฌ ์‹œ OnLevelUp event ๋ฐœํ™”. + /// + public class PlayerProgression : MonoBehaviour + { + public int Level { get; private set; } = 1; + public int CurrentXP { get; private set; } = 0; + public int XPToNextLevel { get; private set; } = 10; + + /// ๋ ˆ๋ฒจ์—… ๋ฐœํ™” โ€” LevelUpManager ๊ตฌ๋… hook + public event System.Action OnLevelUp; // int = new Level + + /// ์  ์ฒ˜์น˜ ์‹œ ํ˜ธ์ถœ โ€” XP ํš๋“ + public void GainXP(int amount) + { + if (amount <= 0) return; + CurrentXP += amount; + while (CurrentXP >= XPToNextLevel) + { + CurrentXP -= XPToNextLevel; + Level++; + XPToNextLevel = ComputeXPToNextLevel(Level); + OnLevelUp?.Invoke(Level); + } + } + + /// EXP ๊ณก์„ . balance/02 v0.2 ยง3 ์˜์—ญ ์ •ํ•ฉ โ€” placeholder ์˜์—ญ. + static int ComputeXPToNextLevel(int level) + { + // balance/02 v0.2 ยง3 โ€” 80 + Level ร— 20 ์˜์—ญ (placeholder) + return 80 + level * 20; + } + } +} +``` + +**์œ„์น˜**: `Assets/Scripts/Progression/PlayerProgression.cs` (์‹ ๊ทœ ๋””๋ ‰ํ† ๋ฆฌ) +**๋ถ€์ฐฉ**: `Player.prefab` (์ž๋™ ๋ถ€์ฐฉ โ€” `PlayerController.Awake` ์˜์—ญ์— GetOrAdd) + +### 2-2. `ExperienceSystem` (์ •์  ๊ฒŒ์ดํŠธ์›จ์ด) + +```csharp +namespace EerieVillage.Progression +{ + /// + /// EXP ๋ฐœ๊ธ‰ ์ •์  ์˜์—ญ. EnemyDeath ์˜์—ญ ๋‹จ์ผ ํ˜ธ์ถœ ํ†ต๋กœ. + /// ์ฐจ๊ธฐ ์˜์—ญ P19 XPMultiplier ์˜์—ญ ์ ์šฉ hook. + /// + public static class ExperienceSystem + { + public static void OnEnemyKilled(EnemyController enemy, PlayerController player) + { + if (player == null) return; + var prog = player.GetComponent(); + if (prog == null) return; + int xp = ComputeXPReward(enemy); + prog.GainXP(xp); + } + + /// placeholder โ€” ์  ์ข…๋ฅ˜ยท๋“ฑ๊ธ‰๋ณ„ XP ์˜์—ญ ์ฐจ๊ธฐ BT12-Dev ์˜์—ญ + static int ComputeXPReward(EnemyController enemy) + { + return 5; // placeholder. ์ฐจ๊ธฐ = enemy.xpReward ๋˜๋Š” EnemyData ScriptableObject + } + } +} +``` + +**์œ„์น˜**: `Assets/Scripts/Progression/ExperienceSystem.cs` + +### 2-3. `LevelUpManager` (MonoBehaviour ์‹ฑ๊ธ€ํ†ค) + +```csharp +namespace EerieVillage.Progression +{ + /// + /// ๋ ˆ๋ฒจ์—… ๋ฐœํ™” ์‹œ ์ผ์‹œ์ •์ง€ + UI ํ˜ธ์ถœ + ์นด๋“œ ์„ ํƒ ๊ฒฐ๊ณผ ์ˆ˜๋ น. + /// PlayerProgression.OnLevelUp ๊ตฌ๋…. + /// + public class LevelUpManager : MonoBehaviour + { + public static LevelUpManager Instance { get; private set; } + [SerializeField] SkillSelectionUI _ui; // Inspector ๋ถ€์ฐฉ ๋˜๋Š” Resources.Load + [SerializeField] SkillCardPlaceholderPool _pool; + + PlayerController _player; + bool _isLevelUpActive = false; + + void Awake() + { + if (Instance != null) { Destroy(gameObject); return; } + Instance = this; + DontDestroyOnLoad(gameObject); + } + + void Start() + { + _player = Object.FindFirstObjectByType(); + if (_player == null) return; + var prog = _player.GetComponent(); + if (prog != null) prog.OnLevelUp += OnLevelUp; + } + + void OnLevelUp(int newLevel) + { + if (_isLevelUpActive) return; // ๋™์‹œ ๋ ˆ๋ฒจ์—… ๋ฐฉ์ง€ + _isLevelUpActive = true; + + // ์ผ์‹œ์ •์ง€ + ์ž…๋ ฅ ์ฐจ๋‹จ + Time.timeScale = 0f; + if (_player != null) _player.controlEnabled = false; + + // ์นด๋“œ 3์žฅ ๋ฌด์ž‘์œ„ ์ถ”์ถœ + UI ํ‘œ์‹œ + var cards = _pool.Draw3Random(); + _ui.Show(cards, newLevel, OnCardConfirmed); + } + + void OnCardConfirmed(SkillCardPlaceholder selected) + { + // ์ฐจ๊ธฐ BT12-Dev ์˜์—ญ = PlayerSkillInventory.AddSkillByCardId(selected.id) + // ๋ณธ ์ž‘์—… ์˜์—ญ = UI ๋‹ซ๊ธฐ๋งŒ + _ui.Hide(); + Time.timeScale = 1f; + if (_player != null) _player.controlEnabled = true; + _isLevelUpActive = false; + } + } +} +``` + +**์œ„์น˜**: `Assets/Scripts/Progression/LevelUpManager.cs` +**๋ถ€์ฐฉ**: `Ingame.unity` Scene ์˜์—ญ ์‹ ๊ทœ GameObject `[LevelUpManager]` + +### 2-4. `SkillCardPlaceholder` (ScriptableObject) + +```csharp +namespace EerieVillage.Progression +{ + [CreateAssetMenu(menuName = "EerieVillage/SkillCardPlaceholder")] + public class SkillCardPlaceholder : ScriptableObject + { + public string id; // ๊ณ ์œ  ID (์˜ˆ: "A01_jineonbu") + public string displayName; // ํ•œ๊ธ€ ์นด๋“œ๋ช… (์˜ˆ: "์ง„์–ธ๋ถ€") + [TextArea(2, 4)] + public string description; // ํšจ๊ณผ ์„ค๋ช… (3~4 ๋ผ์ธยทplaceholder) + public Sprite icon; // ์›ํ˜• ์•„์ด์ฝ˜ + public CardRarity rarity; // ๋“ฑ๊ธ‰ (CommonยทRareยทMax) + public int currentLevel = 1; // PD ์˜ˆ์‹œ ์˜์—ญ "๋ ˆ๋ฒจ N" + public int maxLevel = 5; // PD ์˜ˆ์‹œ ์˜์—ญ "์ตœ๋Œ€" ํ‘œ์‹œ + } + + public enum CardRarity { Common, Rare, Max } +} +``` + +**์œ„์น˜**: `Assets/Scripts/Progression/SkillCardPlaceholder.cs` + `Assets/Data/SkillPlaceholders/*.asset` (5~8์žฅ) + +**Placeholder ์นด๋“œ 5์žฅ (BT11-Plan v0.2 ์˜์—ญ ์ถ”์ถœ)**: +| ID | ํ•œ๊ธ€๋ช… | ๋“ฑ๊ธ‰ | ์„ค๋ช… (placeholder) | +|----|------|------|------| +| A01_jineonbu | ์ง„์–ธ๋ถ€ | Common | ์ „๋ฐฉ ์ง์„  ํˆฌ์‚ฌ์ฒด. ๊ฐ€์žฅ ๊ธฐ๋ณธ ํŒจํ„ด. | +| A05_hagikjin | ํ•™์ต์ง„ | Common | ๋ถ€์ฑ„๊ผด ์ „๋ฐฉ ์ž๋™ ํƒ€๊ฒฉ. ๋ฐ€์ง‘ ๊ตฌ๊ฐ„ ํŠนํšจ. | +| P01_giryeon | ๊ธฐ ๋‹จ๋ จ | Common | ๋ชจ๋“  ๊ณต๊ฒฉ ๋Œ€๋ฏธ์ง€ ์ฆ๊ฐ€. | +| P12_bangho | ๋ฐฉํ˜ธ | Rare | ์ตœ๋Œ€ ํ•˜ํŠธ 1 ์ฆ๊ฐ€ + ์ฆ‰์‹œ ํšŒ๋ณต. | +| AW01_jineonjingyeong | ์ง„์–ธ๊ฒฝ (๊ฐ์„ฑ) | Max | ์ง„์–ธ๋ถ€ ์ง„ํ™” โ€” ๋‹ค์ค‘ ํˆฌ์‚ฌ์ฒด + ์ถ”์ . | + +### 2-5. `SkillCardPlaceholderPool` (MonoBehaviour) + +```csharp +namespace EerieVillage.Progression +{ + public class SkillCardPlaceholderPool : MonoBehaviour + { + [SerializeField] List _allCards; + + public List Draw3Random() + { + // 5~8์žฅ์—์„œ ๋ฌด์ž‘์œ„ 3์žฅ (์ค‘๋ณต X) + var copy = new List(_allCards); + var result = new List(); + for (int i = 0; i < 3 && copy.Count > 0; i++) + { + int idx = Random.Range(0, copy.Count); + result.Add(copy[idx]); + copy.RemoveAt(idx); + } + return result; + } + } +} +``` + +**์œ„์น˜**: `Assets/Scripts/Progression/SkillCardPlaceholderPool.cs` +**๋ถ€์ฐฉ**: `[LevelUpManager]` GameObject (์ž์‹ ๋˜๋Š” Inspector field) + +### 2-6. `SkillSelectionUI` (MonoBehaviour) + +```csharp +namespace EerieVillage.UI +{ + using EerieVillage.Progression; + + public class SkillSelectionUI : MonoBehaviour + { + [Header("Root Canvas")] + [SerializeField] GameObject _rootPanel; // ์ผ์‹œ์ •์ง€ ์‹œ ํ™œ์„ฑ + + [Header("Card Slots (3๊ฐœ ๊ฐ€๋กœ ๋ฐฐ์น˜)")] + [SerializeField] SkillCardSlot _slot1; + [SerializeField] SkillCardSlot _slot2; + [SerializeField] SkillCardSlot _slot3; + + [Header("Header / Footer")] + [SerializeField] TMP_Text _titleText; // "๊ธฐ์ˆ  ์„ ํƒ" + [SerializeField] TMP_Text _levelText; // "๋‚จ์€ ํฌ์ธํŠธ: 1" + [SerializeField] Button _confirmButton; // "ํ™•์ธ" + [SerializeField] Button _closeButton; // X ๋ฒ„ํŠผ (์ทจ์†Œ) + + SkillCardPlaceholder _selected; + System.Action _onConfirm; + + public void Show(List cards, int level, System.Action onConfirm) + { + _onConfirm = onConfirm; + _rootPanel.SetActive(true); + _selected = null; + _confirmButton.interactable = false; + _levelText.text = $"๋‚จ์€ ํฌ์ธํŠธ: 1"; + + _slot1.Bind(cards[0], () => OnCardSelected(cards[0])); + _slot2.Bind(cards[1], () => OnCardSelected(cards[1])); + _slot3.Bind(cards[2], () => OnCardSelected(cards[2])); + + _confirmButton.onClick.RemoveAllListeners(); + _confirmButton.onClick.AddListener(OnConfirm); + _closeButton.onClick.RemoveAllListeners(); + _closeButton.onClick.AddListener(OnClose); + } + + public void Hide() { _rootPanel.SetActive(false); } + + void OnCardSelected(SkillCardPlaceholder card) + { + _selected = card; + _confirmButton.interactable = true; + _slot1.SetHighlight(card == _slot1.Card); + _slot2.SetHighlight(card == _slot2.Card); + _slot3.SetHighlight(card == _slot3.Card); + } + + void OnConfirm() + { + if (_selected == null) return; + _onConfirm?.Invoke(_selected); + } + + void OnClose() + { + // PD ์˜์—ญ ๊ฒฐ์ • โ€” ์ทจ์†Œ ์‹œ ์–ด๋–ป๊ฒŒ? ๋ณธ ์ž‘์—… ์˜์—ญ = ์ฒซ ์นด๋“œ ์ž๋™ ์„ ํƒ ๋˜๋Š” ๊ฐ•์ œ 1์žฅ ์„ ํƒ + // placeholder = ์ฒซ ์นด๋“œ ์ž๋™ ์„ ํƒ + _onConfirm?.Invoke(_slot1.Card); + } + } +} +``` + +### 2-7. `SkillCardSlot` (MonoBehaviour โ€” ๋‹จ์ผ ์นด๋“œ ํ‘œ์‹œ) + +```csharp +namespace EerieVillage.UI +{ + using EerieVillage.Progression; + + public class SkillCardSlot : MonoBehaviour + { + [Header("PD ์˜ˆ์‹œ ์˜์—ญ ์ •ํ•ฉ (2026-05-08)")] + [SerializeField] Image _topBanner; // ์ƒ๋‹จ ์ƒ‰์ƒ ๋ฐฐ๋„ˆ (๋“ฑ๊ธ‰๋ณ„ ์ƒ‰์ƒ) + [SerializeField] TMP_Text _nameText; // ์นด๋“œ ์ด๋ฆ„ + [SerializeField] Image _icon; // ์›ํ˜• ์•„์ด์ฝ˜ + [SerializeField] Image _glowEffect; // ๋™์‹ฌ์› ๋น› ํšจ๊ณผ + [SerializeField] TMP_Text _levelText; // "๋ ˆ๋ฒจ N" ๋˜๋Š” "์ตœ๋Œ€" + [SerializeField] TMP_Text _descriptionText; + [SerializeField] Button _clickArea; + [SerializeField] GameObject _highlightFrame; // ์„ ํƒ ์‹œ ํ‘œ์‹œ + + [Header("๋“ฑ๊ธ‰๋ณ„ ์ƒ‰์ƒ (PD ์˜ˆ์‹œ ์˜์—ญ)")] + [SerializeField] Color _commonColor = new Color(0.3f, 0.7f, 0.7f); // ์ฒญ๋ก + [SerializeField] Color _rareColor = new Color(0.9f, 0.7f, 0.3f); // ๋…ธ๋ž‘ + [SerializeField] Color _maxColor = new Color(0.9f, 0.3f, 0.3f); // ๋นจ๊ฐ• + + public SkillCardPlaceholder Card { get; private set; } + + public void Bind(SkillCardPlaceholder card, System.Action onClick) + { + Card = card; + _nameText.text = card.displayName; + _icon.sprite = card.icon; + _descriptionText.text = card.description; + + // PD ์˜ˆ์‹œ ์˜์—ญ โ€” ๋“ฑ๊ธ‰๋ณ„ ์ƒ‰์ƒ + "๋ ˆ๋ฒจ N" / "์ตœ๋Œ€" + switch (card.rarity) + { + case CardRarity.Common: _topBanner.color = _commonColor; break; + case CardRarity.Rare: _topBanner.color = _rareColor; break; + case CardRarity.Max: _topBanner.color = _maxColor; break; + } + + if (card.currentLevel >= card.maxLevel) + { + _levelText.text = "์ตœ๋Œ€"; + _levelText.color = _maxColor; + } + else + { + _levelText.text = $"๋ ˆ๋ฒจ {card.currentLevel}"; + _levelText.color = Color.white; + } + + _clickArea.onClick.RemoveAllListeners(); + _clickArea.onClick.AddListener(() => onClick?.Invoke()); + + SetHighlight(false); + } + + public void SetHighlight(bool active) { _highlightFrame.SetActive(active); } + } +} +``` + +--- + +## ยง3. ๊ธฐ์กด ์‹œ์Šคํ…œ ํ†ตํ•ฉ hook + +### 3-1. `EnemyDeath` ์˜์—ญ ๊ฒฝํ—˜์น˜ ๋ฐœ๊ธ‰ + +```csharp +// ๊ธฐ์กด EnemyDeath.Resolve ์˜์—ญ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€ +namespace Platformer.Gameplay +{ + public class EnemyDeath : Simulation.Event + { + public EnemyController enemy; + + public override void Execute() + { + // ... ๊ธฐ์กด ์˜์—ญ ... + + // BT12-MVP-A ์‹ ๊ทœ โ€” ๊ฒฝํ—˜์น˜ ๋ฐœ๊ธ‰ + var player = UnityEngine.Object.FindFirstObjectByType(); + EerieVillage.Progression.ExperienceSystem.OnEnemyKilled(enemy, player); + } + } +} +``` + +### 3-2. `PlayerController.Awake` ์˜์—ญ ์ž๋™ ๋ถ€์ฐฉ + +```csharp +// ๊ธฐ์กด PlayerController.Awake ์˜์—ญ์— ์ถ”๊ฐ€ +if (GetComponent() == null) + gameObject.AddComponent(); +``` + +### 3-3. `Time.timeScale` ์ผ์‹œ์ •์ง€ ์˜์—ญ + +`LevelUpManager.OnLevelUp` ์˜์—ญ `Time.timeScale = 0f` + ์นด๋“œ ํ™•์ธ ์‹œ `Time.timeScale = 1f` ๋ณต์›. UI ์ž์ฒด ์˜์—ญ์€ `Time.unscaledDeltaTime` ํ™œ์šฉ (UI ์ธํ„ฐ๋ž™์…˜ timeScale ์˜ํ–ฅ X). + +### 3-4. `PlayerController.controlEnabled` ์˜์—ญ ์ž…๋ ฅ ์ฐจ๋‹จ + +๊ธฐ์กด `OnHealthDeath`/`OnHealthResurrect` ์˜์—ญ๊ณผ ๋™์ผ ํŒจํ„ด โ€” `_player.controlEnabled = false` (UI ํ‘œ์‹œ ์‹œ) โ†’ `true` (UI ๋‹ซ๊ธฐ ์‹œ). + +--- + +## ยง4. ์ด๋ฒคํŠธ ํ๋ฆ„ + +``` +[์  ์ฒ˜์น˜] + โ†“ +EnemyDeath.Execute() + โ†“ +ExperienceSystem.OnEnemyKilled(enemy, player) + โ†“ +PlayerProgression.GainXP(5) + โ†“ +[CurrentXP >= XPToNextLevel] + โ†“ +PlayerProgression.OnLevelUp(newLevel) ๋ฐœํ™” + โ†“ +LevelUpManager.OnLevelUp ๊ตฌ๋…์ž + โ†“ +Time.timeScale = 0f + player.controlEnabled = false + โ†“ +SkillCardPlaceholderPool.Draw3Random() โ†’ List 3์žฅ + โ†“ +SkillSelectionUI.Show(cards, level, onConfirm) + โ†“ +[์‚ฌ์šฉ์ž ์นด๋“œ ํด๋ฆญ] + โ†“ +SkillCardSlot.OnClick โ†’ SkillSelectionUI.OnCardSelected + โ†“ +[์‚ฌ์šฉ์ž "ํ™•์ธ" ๋ฒ„ํŠผ ํด๋ฆญ] + โ†“ +SkillSelectionUI.OnConfirm โ†’ onConfirm callback + โ†“ +LevelUpManager.OnCardConfirmed(selected) + โ†“ +[์„ ํƒ ๊ฒฐ๊ณผ ์˜์—ญ โ€” ๋ณธ ์ž‘์—… = UI ๋‹ซ๊ธฐ๋งŒ / ์ฐจ๊ธฐ = PlayerSkillInventory.AddSkillByCardId] + โ†“ +SkillSelectionUI.Hide() + Time.timeScale = 1f + player.controlEnabled = true + โ†“ +[๊ฒŒ์ž„ ์žฌ๊ฐœ] +``` + +--- + +## ยง5. UI Prefab ๊ตฌ์กฐ (PD ์˜ˆ์‹œ ์ •ํ•ฉ) + +``` +Canvas (Screen Space - OverlayยทSort Order 100) + โ”” SkillSelectionPanel (RootPanelยท์ด๋ฏธ์ง€ ์–ด๋‘์šด ๋ฐ˜ํˆฌ๋ช… ๊ฒ€์ • ๋ฐฐ๊ฒฝ) + โ”œ Header + โ”‚ โ”œ TitleText "๊ธฐ์ˆ  ์„ ํƒ" (TMP) + โ”‚ โ”” CloseButton "X" (์šฐ์ธก ์ƒ๋‹จ) + โ”œ CardArea (Horizontal Layout Group) + โ”‚ โ”œ SkillCardSlot1 + โ”‚ โ”‚ โ”œ TopBanner (Imageยท๋“ฑ๊ธ‰ ์ƒ‰์ƒ) + โ”‚ โ”‚ โ”œ NameText (TMPยทํ•œ๊ธ€) + โ”‚ โ”‚ โ”œ IconArea + โ”‚ โ”‚ โ”‚ โ”œ GlowEffect (Imageยท๋™์‹ฌ์› ๋น›) + โ”‚ โ”‚ โ”‚ โ”” Icon (Imageยท์›ํ˜• sprite) + โ”‚ โ”‚ โ”œ LevelText (TMPยท"๋ ˆ๋ฒจ N"/"์ตœ๋Œ€") + โ”‚ โ”‚ โ”œ DescriptionText (TMPยท3~4 ๋ผ์ธ) + โ”‚ โ”‚ โ”œ ClickArea (Buttonยท์ „์ฒด ์นด๋“œ ์˜์—ญ) + โ”‚ โ”‚ โ”” HighlightFrame (์„ ํƒ ์‹œ ํ™œ์„ฑ) + โ”‚ โ”œ SkillCardSlot2 (๋™์ผ ๊ตฌ์กฐ) + โ”‚ โ”” SkillCardSlot3 (๋™์ผ ๊ตฌ์กฐ) + โ”” Footer + โ”œ LevelText "๋‚จ์€ ํฌ์ธํŠธ: 1" + โ”” ConfirmButton "ํ™•์ธ" +``` + +**Sprite/Image ์ž์‚ฐ (placeholder)**: +- ์นด๋“œ ํšŒ์ƒ‰ ๋ฐฐ๊ฒฝ: ๋‹จ์ผ ์ƒ‰์ƒ ํŒจ๋„ ๋˜๋Š” 9-slice ์Šคํ”„๋ผ์ดํŠธ +- ์›ํ˜• ์•„์ด์ฝ˜ ๋ฐฐ๊ฒฝ: ํšŒ์ƒ‰ ์›ํ˜• sprite +- ๋™์‹ฌ์› ๋น›: ํฐ์ƒ‰ โ†’ ํˆฌ๋ช… ๊ทธ๋ผ๋ฐ์ด์…˜ sprite +- ๋“ฑ๊ธ‰ ์ƒ‰์ƒ: ์ฒญ๋ก (Common) ยท ๋…ธ๋ž‘ (Rare) ยท ๋นจ๊ฐ• (Max) +- ์นด๋“œ ์•„์ด์ฝ˜: placeholder 5์žฅ ๋‹จ์ˆœ sprite (ํ•˜ํŠธยท๊ฒ€ยท๋ฐฉํŒจยท๋ฐ”๋žŒยท๋‹ฌ ๋“ฑ) + +--- + +## ยง6. balance/02 v0.2 ์˜์—ญ ์ •ํ•ฉ + +balance/02 v0.2 ยง3 ์˜์—ญ EXP ๊ณก์„  = `XPToNextLevel(L) = 80 + L ร— 20`. +- Lv 1 โ†’ Lv 2: 100 XP +- Lv 2 โ†’ Lv 3: 120 XP +- ... +- Lv 10 โ†’ Lv 11: 280 XP + +๋ณธ ์„ค๊ณ„ ยง2-1 `ComputeXPToNextLevel` ์˜์—ญ ์ •ํ•ฉ. balance-designer ์˜์—ญ ์ถ”ํ›„ ์ •์ • ๊ฐ€๋Šฅ. + +์  ์ฒ˜์น˜ ์‹œ XP ์˜์—ญ = ๊ธฐ๋ณธ 5. ์ฐจ๊ธฐ ์˜์—ญ = ์  ์ข…๋ฅ˜ยท๋“ฑ๊ธ‰๋ณ„ ์ฐจ๋“ฑ (BT12-Dev ๋ณธ๊ฒฉ ์˜์—ญ). + +--- + +## ยง7. Phase 2 ๋ถ„๋Ÿ‰ ์ถ”์ • (C50 ์‚ฌ์ „ PD ์Šน์ธ ์˜์—ญ) + +### 7-1. ์‹ ๊ทœ ํŒŒ์ผ (์ฝ”๋“œ 7๊ฐœยทprefab 1๊ฐœยทasset 5์žฅ) + +| ์˜์—ญ | ํŒŒ์ผ | +|------|------| +| Scripts/Progression | `PlayerProgression.cs`ยท`ExperienceSystem.cs`ยท`LevelUpManager.cs`ยท`SkillCardPlaceholder.cs`ยท`SkillCardPlaceholderPool.cs` (5 ํŒŒ์ผ) | +| Scripts/UI | `SkillSelectionUI.cs`ยท`SkillCardSlot.cs` (2 ํŒŒ์ผ) | +| Prefabs | `Assets/Prefabs/UI/SkillSelectionCanvas.prefab` (1 prefab โ€” Canvas + 3 SkillCardSlot ์ž์‹) | +| Data | `Assets/Data/SkillPlaceholders/{A01_jineonbu, A05_hagikjin, P01_giryeon, P12_bangho, AW01_jineonjingyeong}.asset` (5 asset) | + +### 7-2. ๊ธฐ์กด ํŒŒ์ผ ์ˆ˜์ • (3 ํŒŒ์ผ) + +| ํŒŒ์ผ | ๋ณ€๊ฒฝ | +|------|------| +| `EnemyDeath.cs` (Gameplay) | `Execute` ์˜์—ญ ๋งˆ์ง€๋ง‰ ExperienceSystem ํ˜ธ์ถœ 1์ค„ | +| `PlayerController.cs` | Awake ์˜์—ญ PlayerProgression ์ž๋™ ๋ถ€์ฐฉ 1์ค„ | +| `Ingame.unity` (Scene) | `[LevelUpManager]` GameObject ์‹ ๊ทœ + SkillSelectionCanvas ๋ถ€์ฐฉ | + +### 7-3. ํ† ํฐ ์ถ”์ • + +| Phase 2 ์˜ต์…˜ | ๋ถ„๋Ÿ‰ | +|-----|-----| +| **(a) ๋‹จ์ผ Task ํ†ตํ•ฉ** (์ฝ”๋“œ 7 + UI prefab + asset 5 + Scene ํ†ตํ•ฉ) | ~120~180K | +| **(b) Phase 2-A ์‹œ์Šคํ…œ ์ฝ”๋“œ + Phase 2-B UI prefab/asset ๋ถ„๋ฆฌ** | 2-A ~70K + 2-B ~80K = ~150K (๋ถ„์‚ฐ) | +| **(c) 3๋ถ„ํ• ** (Phase 2-A ์ฝ”๋“œ๋งŒยทPhase 2-B placeholder assetยทPhase 2-C UI prefab) | 2-A ~60K + 2-B ~40K + 2-C ~60K = ~160K (๋ถ„์‚ฐ) | + +**๊ฐœ๋ฐœํŒ€์žฅ(์ž„์‹œ PM ์œ„์ž„) ๊ถŒ๊ณ  = (b)**. ์‚ฌ์œ : +- ์‹œ์Šคํ…œ ์ฝ”๋“œ ์˜์—ญ๊ณผ UI prefab ์˜์—ญ = ์ง๋ฌด ๋ถ„๋ฆฌ ๋ช…ํ™• +- ์ฝ”๋“œ ์˜์—ญ ๊ฒ€์ฆ ํ›„ UI ์˜์—ญ ์ง„ํ–‰ = ํšŒ๊ท€ ์œ„ํ—˜ ๊ฐ์†Œ +- ๋‹จ์ผ Task ์˜์—ญ ๋ถ„์‚ฐ ํšŒํ”ผ + +### 7-4. Phase 3 ๊ฒ€์ฆ ํ•ญ๋ชฉ + +- ํšŒ๊ท€: BT5-Dev ๋ฐœํŒยท๋ชฌ์Šคํ„ฐ ์‹œ์Šคํ…œ ์˜์—ญ ์˜ํ–ฅ ๊ฒ€์ฆ (EnemyDeath ์˜์—ญ ๋ณ€๊ฒฝ) +- BT7-Dev VS ์ˆœ์ˆ˜ํ˜• ์ž๋™ ๋ฐœ๋™ ์˜์—ญ ์˜ํ–ฅ ๊ฒ€์ฆ (ExperienceSystem ์‹ ๊ทœ ํ˜ธ์ถœ ์˜์—ญ) +- BT12-Dev v1 ์˜์—ญ ์ถฉ๋Œ X ๊ฒ€์ฆ (PlayerStats ๋ถ„๋ฆฌ ์ •ํ•ฉ) +- UI ์˜์—ญ PD ์˜ˆ์‹œ ์ •ํ•ฉ ๊ฒ€์ฆ (์ƒ‰์ƒยท๋ ˆ์ด์•„์›ƒยท์ธํ„ฐ๋ž™์…˜) +- Time.timeScale = 0 ์˜์—ญ UI ์ธํ„ฐ๋ž™์…˜ ์ •ํ•ฉ ๊ฒ€์ฆ (unscaledDeltaTime) + +--- + +## ยง8. ํšŒ๊ท€ ์œ„ํ—˜ ์˜์—ญ + +| ์˜์—ญ | ์œ„ํ—˜๋„ | ๊ฒ€์ฆ ๋ฐฉ๋ฒ• | +|------|------|---------| +| `EnemyDeath.Execute` ๋งˆ์ง€๋ง‰ ํ˜ธ์ถœ ์ถ”๊ฐ€ | ๋‚ฎ์Œ | EnemyDeath ์˜์—ญ ๊ธฐ์กด ํ˜ธ์ถœ ๊ทธ๋Œ€๋กœ + ๋ณธ ํ˜ธ์ถœ ๋งˆ์ง€๋ง‰ ์ถ”๊ฐ€ | +| `PlayerController.Awake` PlayerProgression ๋ถ€์ฐฉ | ๋‚ฎ์Œ | ์ž๋™ GetOrAdd ํŒจํ„ด (๊ธฐ์กด PlayerInvulnerabilityFlash ์˜์—ญ ์ •ํ•ฉ) | +| Time.timeScale = 0 ์˜์—ญ | ์ค‘ | Animator ์˜์—ญ ์˜ํ–ฅ (Animator.updateMode = UnscaledTime ๊ถŒ๊ณ ) ยท ๋‹ค๋ฅธ ์‹œ์Šคํ…œ ์˜ํ–ฅ ๊ฒ€์ฆ | +| Scene ์˜์—ญ [LevelUpManager] + SkillSelectionCanvas ์ถ”๊ฐ€ | ๋‚ฎ์Œ | Scene yaml ์˜์—ญ ์‹ ๊ทœ GameObject ์ถ”๊ฐ€ (๊ธฐ์กด ์˜์—ญ ๋ณ€๊ฒฝ X) | +| BT5-Dev #111 ์ข์€ ๋ฐœํŒ patrol ์˜์—ญ | ๋ฏธ์˜ํ–ฅ | ๋ณธ ์ž‘์—… ์˜์—ญ EnemyController ์˜์—ญ ๋ณ€๊ฒฝ X | + +--- + +## ยง9. ๊ธฐ๊ฐ์•ˆ (Phase 1 ์„ค๊ณ„ ์˜์—ญ) + +| # | ์•ˆ | ์ฑ„ํƒ ๊ฒฐ์ • | ์‚ฌ์œ  | +|---|---|---------|------| +| 1 | `PlayerStats` ์˜์—ญ ์ง์ ‘ ํ™•์žฅ (LevelยทEXP ์ถ”๊ฐ€) | **๊ธฐ๊ฐ** | BT12-Dev v1 ์˜์—ญ ๋ณ€๊ฒฝ = ์ถฉ๋Œ ์œ„ํ—˜ยท์ฐจ๊ธฐ ๋ณธ๊ฒฉ ์ฐฉ์ˆ˜ ์‹œ์  ์˜ํ–ฅ | +| 2 | `ScriptableObject 3์ข… (ActiveSkillData ๋“ฑ)` ํ™œ์šฉ | **๊ธฐ๊ฐ** | ํšจ๊ณผ ์˜์—ญ ์ •์˜ X (PD ๋ช…์‹œ "๊ธฐ๋Šฅ ์ถ”ํ›„") = ๊ธฐ์กด ScriptableObject ์˜์—ญ ์ง๋ฌด ๋ถ€ํ•ฉ X | +| 3 | `PlayerSkillInventory` ํ™œ์šฉ | **๊ธฐ๊ฐ** | 60์ข… ์นด๋“œ ํšจ๊ณผ ์˜์—ญ = ์ฐจ๊ธฐ ๋ณธ๊ฒฉ. ๋ณธ ์ž‘์—… ์˜์—ญ = UI ๋‹ซ๊ธฐ๋งŒ | +| 4 | `Schedule` Simulation ์ด๋ฒคํŠธ | **๊ฒ€ํ†  ํ›„ ์ฑ„ํƒ** | ๊ธฐ์กด `Schedule` ํŒจํ„ด ์ •ํ•ฉ. C# event ํŒจํ„ด๊ณผ ์ ˆ์ถฉ โ€” ๋ณธ ์„ค๊ณ„ = C# event (๊ฐ„๋‹จยท์™ธ๋ถ€ ์‹œ์Šคํ…œ ์˜์กด X) | +| 5 | UI ์ฆ‰์‹œ ์ ์šฉ (ํ™•์ธ ๋ฒ„ํŠผ XยทVS ํ‘œ์ค€) | **๊ธฐ๊ฐ** | PD ์˜ˆ์‹œ ์˜์—ญ ๋ช…ํ™• โ€” ํ™•์ธ ๋ฒ„ํŠผ ๋‹จ๊ณ„ ์ถ”๊ฐ€ | + +--- + +## ยง10. ๋ณธ ์„ค๊ณ„ ์ž์„ฑ (C23 ์™ธ์—ฐยท์‹œ์Šคํ…œ ํ•œ๊ณ„) + +๋ณธ ์„ค๊ณ„ = **์ด๊ด„PM ์ž„์‹œ ๊ฐœ๋ฐœํŒ€์žฅ ์—ญํ•  ์œ„์ž„ ์‚ฐ์ถœ**. ์ •์ƒ ๊ฐœ๋ฐœํŒ€์žฅ agent ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ๋ฏธ๋“ฑ์žฌ ์˜์—ญ ํ•œ๊ณ„ ์ ˆ์ถฉ. + +**์˜๋ฌด ์˜์—ญ**: +1. Phase 3 ๊ฒ€์ฆ ์‹œ์  dev-auditor ๊ฐ์‚ฌ ์˜๋ฌด (๋ณธ ์‚ฐ์ถœ๋ฌผ ์ •ํ•ฉยทBT12-Dev v1 ์˜์—ญ ์ถฉ๋Œ ๊ฒ€์ฆ) +2. ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ํ•œ๊ธ€ agent ๋“ฑ์žฌ ์ •์ • (`feedback_korean_agent_catalog_unregistered.md` ์‹ ์„ค) +3. `feedback_pm_auditor_role_conflation.md` ์‹ ์„ค โ€” ๋ณธ PM์ด ์ง์ „ dev-auditor ํ˜ธ์ถœ ์‹œ Critical 1 (๋ผ์šฐํŒ… ์˜ค๋ฅ˜) ์ž์„ฑ + +--- + +**์ž‘์„ฑ**: ์ด๊ด„PM (์ž„์‹œ ๊ฐœ๋ฐœํŒ€์žฅ ์—ญํ•  ์œ„์ž„ โ€” Phase 1 ์„ค๊ณ„) +**์ผ์ž**: 2026-05-08 +**๊ด€๋ จ ๊ทœ์น™**: C23 (์—ญํ•  ์—ฐ๊ธฐ ์ž์„ฑ)ยทC36 (PM ์ž์œจ ์™ธ์—ฐ ์ž์„ฑ)ยทC39 (์‹œ์Šคํ…œ ๋ฐ˜์˜ ์‹ค์ธก)ยทC42 (์‚ฌ์ „ ๊ฒ€์ฆ)ยทC43 (ํ˜ธ์นญ ๋ผ์šฐํŒ…)ยทC49 Phase 1ยทC50 (์‚ฌ์ „ PD ์Šน์ธ) +**Phase 2 ์ง„ํ–‰ = PD ์Šน์ธ ํ›„**