irregular6612 Claude Opus 4.8 (1M context) commited on
Commit
e05886f
ยท
0 Parent(s):

docs: PROTEUS arena end-to-end slice design spec

Browse files

์™„์ „ ์ „ํ™˜๋œ PROTEUS(๋™๊ธฐ ์ฝ๊ธฐ grid ์•„๋ ˆ๋‚˜)์˜ 1์ฐจ ์Šฌ๋ผ์ด์Šค ์„ค๊ณ„.
๋…๋ฆฝ proteus ํŒจํ‚ค์ง€ + ์Šฌ๋ฆผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ(A์•ˆ), predator_evade ๋‹จ์ผ ์‹ฌํ™”,
์—ฐ์† ํ”Œ๋ ˆ์ด+๊ถค์  ์ธก์ •, reasoning/probe 1๊ธ‰ ๊ธฐ๋ก, CP0~CP6 ํ•ธ๋“œ์˜คํ”„ ์ฒดํฌํฌ์ธํŠธ.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ __pycache__/
2
+ *.pyc
3
+ .DS_Store
4
+ runs/
5
+ .venv/
6
+ *.egg-info/
docs/superpowers/specs/2026-06-01-proteus-arena-slice-design.md ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # PROTEUS Arena โ€” End-to-End ์—ฐ๊ตฌ ์Šฌ๋ผ์ด์Šค ์„ค๊ณ„
2
+
3
+ - **์ƒํƒœ**: ์Šน์ธ๋จ (2026-06-01)
4
+ - **๋ฒ”์œ„**: 1์ฐจ ๋งˆ์ผ์Šคํ†ค = end-to-end ์—ฐ๊ตฌ ์Šฌ๋ผ์ด์Šค (predator_evade ๋‹จ์ผ ์‹ฌํ™”)
5
+ - **ํ›„์†**: ์ด spec ์Šน์ธ ํ›„ `superpowers:writing-plans`๋กœ ๊ตฌํ˜„ ๊ณ„ํš(PLAN.md) ์ž‘์„ฑ
6
+
7
+ ---
8
+
9
+ ## 0. ํ•œ ์ค„ ์š”์•ฝ
10
+
11
+ LLM์—๊ฒŒ grid ๊ฒŒ์ž„์ด ์ „๊ฐœ๋˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ณ , ๊ฒฐ์ •์  ์ˆœ๊ฐ„(Cut handover)์—์„œ "์ด์ œ ๋„ˆ๊ฐ€ ์ด ์ž‘์€
12
+ ์—์ด์ „ํŠธ๋‹ค, ์ด์–ด์„œ ํ”Œ๋ ˆ์ดํ•˜๋ผ"๊ณ  ๋„˜๊ธด ๋’ค, ๋ชจ๋ธ์ด **๋‹ค๋ฅธ ์—์ด์ „ํŠธ์˜ ๋™๊ธฐ๋ฅผ ์ฝ๊ณ **(์œ„ํ˜‘์˜ ์ถ”๊ฒฉ
13
+ ์˜๋„ ๋“ฑ) ๋™๊ธฐ-์ •ํ•ฉ ํ–‰๋™์„ Nํ„ด ์—ฐ์†์œผ๋กœ ํ•˜๋Š”์ง€๋ฅผ ์ธก์ •ํ•˜๋Š” ์•„๋ ˆ๋‚˜. PHASE(Heider-Simmel ์‚ฌํšŒ์ง€๊ฐ)์˜
14
+ ์—ญ๊ณ„ํš ๋ฒค์น˜๋งˆํฌ๋ฅผ, **๊ด€์ฐฐ ํ›„ ์—ญ์ถ”๋ก **์ด ์•„๋‹ˆ๋ผ **๊ด€์ฐฐ ํ›„ ์ง์ ‘ ํ”Œ๋ ˆ์ด**๋กœ ๋’ค์ง‘์€ "Self-Rule Arena".
15
+
16
+ ## 1. ์ •์ฒด์„ฑ / ๋ฐฐ๊ฒฝ
17
+
18
+ - PROTEUS๋Š” **๋ฐฉํ–ฅ ์ „ํ™˜**๋˜์—ˆ๋‹ค. `depreated/README.MD`์˜ "persona ์ƒ์„ฑ ์•„๋ ˆ๋‚˜"๋Š” **ํ๊ธฐ**.
19
+ ์ƒˆ ์ •์ฒด์„ฑ = **Heider-Simmel / PHASE ๊ณ„์—ด "๋™๊ธฐ ์ฝ๊ธฐ" grid ์•„๋ ˆ๋‚˜**.
20
+ - ์ด๋ก  ํ† ๋Œ€: `Seoungpil's Note/PHASE - ....md` (Netanyahu et al., AAAI 2021).
21
+ - ์‚ฌํšŒ ํšจ์šฉ ๊ฐ€์ค‘์น˜ ฮฑ(โˆ’1 ๋ฐฉํ•ด / 0 ์ค‘๋ฆฝ / +1 ๋„์›€)๋ฅผ ๋ฌผ๋ฆฌ ๋ชฉํ‘œ ์œ„์— ์˜ฌ๋ฆฐ ๋ณด์ƒ์œผ๋กœ
22
+ "์ถ”๊ฒฉ/๋•๊ธฐ/๋ฐฉํ•ด" ๊ฐ™์€ ์ถ”์ƒ ์‚ฌํšŒ ์ด๋ฒคํŠธ๋ฅผ ์ ˆ์ฐจ ์ƒ์„ฑ.
23
+ - PHASE๋Š” ๋ชจ๋ธ์—๊ฒŒ **๊ถค์  โ†’ ๋™๊ธฐ ์—ญ์ถ”๋ก **์„ ์‹œํ‚ค์ง€๋งŒ, PROTEUS๋Š” ๋ชจ๋ธ์„ **์žฅ๋ฉด ์•ˆ์— ๋„ฃ๊ณ 
24
+ ๊ทธ ์‹œ์ ๋ถ€ํ„ฐ ํ”Œ๋ ˆ์ด**ํ•˜๊ฒŒ ํ•œ๋‹ค (๊ฒฐ์ •์  ์ฐจ์ด).
25
+ - "๋™๊ธฐ ์นดํ…Œ๊ณ ๋ฆฌ"(์ƒ์กด ๋™๊ธฐ, ํ˜ธ๊ธฐ์‹ฌ ๋“ฑ)๋ณ„๋กœ ์—ฌ๋Ÿฌ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ค€๋น„ํ•œ๋‹ค โ€” ๋‹จ ๋ณธ ์Šฌ๋ผ์ด์Šค๋Š”
26
+ **์ƒ์กด ๋™๊ธฐ / predator_evade 1๊ฐœ**๋งŒ ๊นŠ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ , ์นดํ…Œ๊ณ ๋ฆฌ ์ผ๋ฐ˜ํ™”๋Š” 2์ฐจ๋กœ ์—ฐ๊ธฐํ•œ๋‹ค.
27
+
28
+ ## 2. ๊ฒฐ์ • ์‚ฌํ•ญ (ํ™•์ •)
29
+
30
+ | ์ถ• | ๊ฒฐ์ • |
31
+ |----|------|
32
+ | ์•„๋ ˆ๋‚˜ ์ •์ฒด์„ฑ | ์™„์ „ ์ „ํ™˜ โ€” grid motive/ToM ์•„๋ ˆ๋‚˜๊ฐ€ ๋ณธ์ฒด |
33
+ | ํŒจํ‚ค์ง• | ๋…๋ฆฝ standalone `proteus` ํŒจํ‚ค์ง€. ์žฌํ™œ์šฉ ์ฝ”๋“œ๋Š” ํฌํŒ…/vendoring |
34
+ | 1์ฐจ ๋งˆ์ผ์Šคํ†ค | end-to-end ์—ฐ๊ตฌ ์Šฌ๋ผ์ด์Šค (์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ + CLI + ๋ฉ”ํŠธ๋ฆญ) |
35
+ | ์ธก์ • ๋Œ€์ƒ | โ‘  ๋™๊ธฐ ์ฝ๊ธฐ ์ •ํ™•๋„ โ‘ก ํ–‰๋™ ์˜ˆ์ธก/๊ถค์  โ‘ข ๋™๊ธฐ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ”„๋กœํŒŒ์ผ |
36
+ | ์‹œ๋‚˜๋ฆฌ์˜ค ํญ | predator_evade ๋‹จ์ผ ์‹ฌํ™” (๋‚œ์ด๋„ ๋ ˆ์ด์•„์›ƒยท๋ฉ”ํŠธ๋ฆญยทhuman baseline) |
37
+ | ํ”Œ๋ ˆ์ด ๋‹จ์œ„ | ์—ฐ์† ํ”Œ๋ ˆ์ด(Nํ„ด) + ๊ถค์  ํ‰๊ฐ€ |
38
+ | ์ถ”๋ก  ๊ธฐ๋ก | reasoning + probe๋ฅผ 1๊ธ‰ ์ธก์ • ๋Œ€์ƒ์œผ๋กœ trace์— ๊ธฐ๋ก |
39
+ | ์•„ํ‚คํ…์ฒ˜ | A์•ˆ โ€” ๋…๋ฆฝ `proteus` ํŒจํ‚ค์ง€ + ์Šฌ๋ฆผ ๋„ค์ดํ‹ฐ๋ธŒ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ |
40
+ | ์ด๋ฆ„ | `proteus` ์ฝ”๋“œ๋„ค์ž„ ์œ ์ง€, ์˜๋ฏธ๋งŒ "๋™๊ธฐ ์ฝ๊ธฐ ์•„๋ ˆ๋‚˜"๋กœ ์žฌ์ •์˜ (README ๊ต์ฒด๋Š” ์—ฐ๊ธฐ) |
41
+ | git | PROTEUS๋ฅผ git ๋ ˆํฌ๋กœ init, spec/PLAN ๋กœ์ปฌ ์ปค๋ฐ‹ (ํ‘ธ์‹œ ์•ˆ ํ•จ) |
42
+
43
+ ## 3. ํŒจํ‚ค์ง€ ์•„ํ‚คํ…์ฒ˜
44
+
45
+ ```
46
+ proteus/
47
+ โ”œโ”€โ”€ arc_grid/ # ๊ทธ๋Œ€๋กœ vendoring (์—”์ง„+๋ Œ๋”๋Ÿฌ, proteus ์˜์กด 0)
48
+ โ”œโ”€โ”€ grid/ # motive_grid ํŒจ๋ฐ€๋ฆฌ ํฌํŒ… (import: squid_game.* โ†’ proteus.*)
49
+ โ”‚ โ”œโ”€โ”€ scenario.py # Scenario ABC + ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (๊ณ„์•ฝ์€ ๋™๊ธฐ-์ผ๋ฐ˜, ๊ตฌํ˜„์€ 1๊ฐœ)
50
+ โ”‚ โ”œโ”€โ”€ game.py # MotiveGridGame ํ„ด ๋ฃจํ”„
51
+ โ”‚ โ”œโ”€โ”€ ascii_view.py # LLM์šฉ ํ…์ŠคํŠธ ๋ Œ๋”
52
+ โ”‚ โ””โ”€โ”€ scenarios/
53
+ โ”‚ โ””โ”€โ”€ predator_evade.py
54
+ โ”œโ”€โ”€ agents/ # ์Šฌ๋ฆผ Agent (forfeit/stake/risk/unified ์ „๋ถ€ ์ œ๊ฑฐ)
55
+ โ”‚ โ”œโ”€โ”€ base.py # Agent: act() / probe() / reset()
56
+ โ”‚ โ””โ”€โ”€ vanilla.py # baseline: reasoning + action (+ ์„ ํƒ probe)
57
+ โ”œโ”€โ”€ providers/ # LLM ๋ฐฑ์—”๋“œ ํฌํŒ… (openai/anthropic/gemini/ollama/mlx/vllm/local)
58
+ โ”œโ”€โ”€ runtime/ # ์‹ ๊ทœ ์Šฌ๋ฆผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ
59
+ โ”‚ โ”œโ”€โ”€ session.py # SessionRunner: Cut ์žฌ์ƒ โ†’ ํ•ธ๋“œ์˜ค๋ฒ„ โ†’ Nํ„ด ํ”Œ๋ ˆ์ด โ†’ trace
60
+ โ”‚ โ”œโ”€โ”€ trace.py # TurnTrace / SessionTrace (๊ฐ€๋ฒผ์šด pydantic)
61
+ โ”‚ โ””โ”€โ”€ metrics.py # ๋™๊ธฐ์ฝ๊ธฐยทreactivityยท์ƒ์กดยท๊ถค์  ๋ฉ”ํŠธ๋ฆญ
62
+ โ”œโ”€โ”€ viz/ # ์‚ฌ๋žŒ/๋””๋ฒ„๊ทธ ์‹œ๊ฐํ™” (ํ„ฐ๋ฏธ๋„ ์žฌ์ƒ + PNG)
63
+ โ”œโ”€โ”€ cli.py # run / play / list / replay
64
+ โ””โ”€โ”€ configs/ # ์‹œ๋‚˜๋ฆฌ์˜คยท๋Ÿฐ ์„ค์ •(yaml)
65
+ ```
66
+
67
+ **์˜์กด ๋ฐฉํ–ฅ ๊ทœ์น™ (๋ถˆ๋ณ€):** `arc_grid โ† grid โ† runtime`. `agents`ยท`providers`๋Š” runtime์ด ์“ฐ๋Š”
68
+ leaf ์˜์กด. `runtime/trace.py`๋Š” runtime ๋‚ด๋ถ€์˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ importํ•˜์ง€ ์•Š๋Š”๋‹ค (์ง๋ ฌํ™” ๊ฒฝ๊ณ„).
69
+ `arc_grid`๋Š” `proteus.*`๋ฅผ ์ ˆ๋Œ€ importํ•˜์ง€ ์•Š๋Š”๋‹ค (vendoring ๋ถˆ๋ณ€).
70
+
71
+ ## 4. Scenario ๊ณ„์•ฝ
72
+
73
+ ๊ธฐ์กด `Scenario` ABC๋ฅผ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ํฌํŒ…(์ด๋ฏธ ๊ฒ€์ฆ๋œ ๋™์ž‘). ๋‹ต์•ˆํ‚ค ๋ฉ”์„œ๋“œ๋Š” **๋™๊ธฐ-์ผ๋ฐ˜ ์˜๋ฏธ๋กœ
74
+ ๋ฌธ์„œ๋งŒ** ์ •๋ฆฌํ•œ๋‹ค. predator_evade์˜ ๋กœ์ง์€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.
75
+
76
+ - `build_level(rng) -> Level` โ€” ์›”๋“œ(๋ฒฝ + ์ดˆ๊ธฐ sprite)
77
+ - `cut_focal_policy(game) -> str` โ€” Cut pre-roll ๋™์•ˆ focal์˜ ์Šคํฌ๋ฆฝํŠธ ํ–‰๋™
78
+ - `cut_length(difficulty) -> int` โ€” pre-roll ์Šคํ… ์ˆ˜ K
79
+ - `advance_threat(game)` โ€” ์œ„ํ˜‘/ํƒ€ ์—์ด์ „ํŠธ ๋™๊ธฐ-๊ตฌ๋™ ์ด๋™ (focal ์œ„์น˜์˜ ํ•จ์ˆ˜, ๋น„๋žœ๋ค)
80
+ - `check_elimination(game) -> bool` โ€” ์ข…๋ฃŒ(์‹คํŒจ) ํŒ์ •
81
+ - `optimal_action(game) -> str` โ€” **๋™๊ธฐ-์ •ํ•ฉ ์ •๋‹ต ํ–‰๋™** (์˜ˆ์ธก ๋‹ต์•ˆํ‚ค)
82
+ - `habit_action(game) -> str` โ€” **๊ด€์„ฑ baseline** (ํŒ๋ณ„ ํ†ต์ œ)
83
+ - `legend() -> dict[int,str]` โ€” ASCII ์‹ฌ๋ณผ ๋งต
84
+
85
+ **์ง„๋‹จ ์‹ ํ˜ธ ๋ถˆ๋ณ€์‹:** Cut handover์—์„œ `optimal_action != habit_action`์ด์–ด์•ผ ํ•œ๋‹ค. ์ด ๋ถ„๊ธฐ๊ฐ€
86
+ "๋™๊ธฐ๋ฅผ ์ฝ์€ ๋ชจ๋ธ vs ๊ด€์„ฑ์„ ๋”ฐ๋ฅด๋Š” ๋ชจ๋ธ"์„ ๊ฐ€๋ฅด๋Š” ์ธก์ •์˜ ๊ทผ๊ฑฐ๋‹ค.
87
+
88
+ **2์ฐจ ์ผ๋ฐ˜ํ™” ์‹œ๋“œ(์—ฐ๊ธฐ):** ํ˜ธ๊ธฐ์‹ฌ ๋“ฑ ๋น„-์ƒ์กด ๋™๊ธฐ๋Š” "์ •๋‹ต์ด escape๊ฐ€ ์•„๋‹ˆ๋ผ approach"์ผ ์ˆ˜ ์žˆ๋‹ค.
89
+ ABC๋Š” ์ด๋ฅผ ์œ„ํ•ด ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์œ ์ง€ํ•˜๋˜, ์˜๋ฏธ๋ฅผ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์ •์˜ํ•˜๋„๋ก ๋‘”๋‹ค. ๋ณธ ์Šฌ๋ผ์ด์Šค์—์„œ๋Š”
90
+ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค.
91
+
92
+ ## 5. ์Šฌ๋ฆผ Agent
93
+
94
+ ```python
95
+ @dataclass
96
+ class ActResult:
97
+ action: str # available_actions ์ค‘ ํ•˜๋‚˜
98
+ reasoning: str # ๋™๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฝ์—ˆ๋Š”์ง€ (thinking/CoT ์บก์ฒ˜)
99
+ raw_text: str # ์›๋ณธ LLM ์ถœ๋ ฅ
100
+
101
+ class Agent(ABC):
102
+ name: str
103
+ def act(self, observation, available_actions, system_prompt) -> ActResult: ...
104
+ def probe(self, observation, question, system_prompt) -> str: ... # ์„ ํƒ์  ์‚ฌ์ด๋“œ์ฑ„๋„
105
+ def reset(self) -> None: ...
106
+ ```
107
+
108
+ - forfeit / stake / risk / unified-turn / p_success ๋“ฑ Squid-Game ๊ณ ์œ  ๊ฒฝ๋กœ๋Š” **์ „๋ถ€ ์‚ญ์ œ**.
109
+ - `VanillaAgent` = ํ–‰๋™ ํ˜ธ์ถœ 1ํšŒ(`providers/thinking_utils`๋กœ reasoning ์บก์ฒ˜) + ์„ ํƒ probe 1ํšŒ.
110
+ provider ๋ ˆ์ด์–ด ์žฌ์‚ฌ์šฉ + ์Šฌ๋ฆผ ํŒŒ์„œ(ํ…์ŠคํŠธ์—์„œ action ์ถ”์ถœ).
111
+ - ํ…Œ์ŠคํŠธ์šฉ `FakeProvider`(๊ณ ์ •/์Šคํฌ๋ฆฝํŠธ ์‘๋‹ต)๋ฅผ ์ œ๊ณตํ•ด ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋ฅผ ๋ชจ๋ธ ์—†์ด ๊ฒ€์ฆํ•œ๋‹ค.
112
+
113
+ ## 6. SessionRunner (์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ)
114
+
115
+ ํ๋ฆ„:
116
+ 1. `(scenario, seed, difficulty)`๋กœ scenario+game ๋นŒ๋“œ, **Cut pre-roll ์Šคํฌ๋ฆฝํŠธ ์žฌ์ƒ** โ†’
117
+ Cut ํ”„๋ ˆ์ž„ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ (= ๋ชจ๋ธ์—๊ฒŒ "๋ณด์—ฌ์ฃผ๋Š”" ํžˆ์Šคํ† ๋ฆฌ).
118
+ 2. **Handover**: Cut ํžˆ์Šคํ† ๋ฆฌ + ๊ทœ์น™(`rules_text`) + ํ˜„์žฌ grid + "๋„ˆ๋Š” focal ์—์ด์ „ํŠธ A๋‹ค,
119
+ ์ด์–ด์„œ ํ”Œ๋ ˆ์ดํ•˜๋ผ"๋ฅผ ๊ด€์ฐฐ๋กœ ๊ตฌ์„ฑ.
120
+ 3. **Nํ„ด ํ”Œ๋ ˆ์ด ๋ฃจํ”„**: `get_observation โ†’ agent.probe(์„ ํƒ) โ†’ agent.act โ†’ ๊ธฐ๋ก โ†’ apply โ†’
121
+ feedback`. ๋งค ํ„ด pre-move ์‹œ์ ์˜ `optimal_action`/`habit_action`์„ ๋‹ต์•ˆํ‚ค๋กœ ์Šค๋ƒ…์ƒท.
122
+ 4. **์ข…๋ฃŒ**: ํฌํš(์‹คํŒจ) / ์ƒ์กด(budget ์†Œ์ง„) / play_turns ์†Œ์ง„ โ†’ `SessionTrace` ๋ฐฉ์ถœ.
123
+
124
+ ๊ฒŒ์ž„ `max_steps = K(cut) + play_turns`๋กœ ๋‘์–ด pre-roll์ด ์ƒ์กด budget์„ ์ž ์‹ํ•˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค
125
+ (๊ธฐ์กด module๊ณผ ๋™์ผ ๊ทœ์•ฝ).
126
+
127
+ ## 7. Trace + ๋ฉ”ํŠธ๋ฆญ
128
+
129
+ **TurnTrace** (pydantic): `turn_idx, observation, probe_q, probe_a, reasoning, action,
130
+ motive_action, habit_action, is_diagnostic, was_congruent, reward, focal_pos, predator_pos,
131
+ thinking_tokens`.
132
+
133
+ **SessionTrace**: `scenario, motive_category, seed, difficulty, model, cut_frames, turns[],
134
+ outcome(eliminated|survived), metrics{}`.
135
+
136
+ **๋ฉ”ํŠธ๋ฆญ** (`runtime/metrics.py`):
137
+ - ๋™๊ธฐ ์ฝ๊ธฐ ์ •ํ™•๋„ = optimal ํ–‰๋™ ์ผ์น˜ ๋น„์œจ (๊ธฐ์กด prediction_accuracy)
138
+ - Reactivity Index = diagnostic ํ„ด(optimalโ‰ habit) ์ •๋‹ต ๋น„์œจ
139
+ - ์ƒ์กด fraction = played_turns / play_turns (pre-roll ์ œ์™ธ)
140
+ - **๊ถค์  ์ผ์น˜** = optimal-policy ๋กค์•„์›ƒ ๋Œ€๋น„ ์Šคํ…๋ณ„ ์ผ์น˜์œจ / ์ตœ์ข…๊ฑฐ๋ฆฌ (์‹ ๊ทœ)
141
+ - ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ง‘๊ณ„ (ํ˜„์žฌ 1๊ฐœ ์นดํ…Œ๊ณ ๋ฆฌ)
142
+
143
+ **์ €์žฅ**: ์„ธ์…˜๋‹น JSONL 1๊ฐœ + ๋Ÿฐ ๋‹จ์œ„ ์š”์•ฝ JSON. ์ด๊ฒŒ ๋ถ„์„ ๊ธฐ๋ฐ˜์ด์ž ํ•ธ๋“œ์˜คํ”„ ๊ธฐ๋ก.
144
+
145
+ ## 8. CLI + ๊ฒฐ์ •์„ฑ
146
+
147
+ ```
148
+ proteus run --scenario predator_evade --difficulty easy \
149
+ --model anthropic:claude-... --seed 42 --play-turns 15 --out runs/...
150
+ proteus play --scenario predator_evade --human # ํ„ฐ๋ฏธ๋„ ํœด๋จผ ํ”Œ๋ ˆ์ด
151
+ proteus replay <trace.jsonl> # trace ์žฌ์ƒ
152
+ proteus list-scenarios
153
+ ```
154
+
155
+ `(scenario, seed, difficulty)`๋กœ ์›”๋“œยท์œ„ํ˜‘ยทCut์€ ์™„์ „ ๊ฒฐ์ •์ . ๋ชจ๋ธ๋งŒ ํ™•๋ฅ ์ (temperature ์„ค์ •,
156
+ ์ง€์› ์‹œ ๋ชจ๋ธ seed).
157
+
158
+ ## 9. ์‹œ๊ฐํ™”
159
+
160
+ - LLM ๊ด€์ฐฐ = ASCII (์™„๋ฃŒ).
161
+ - ์‚ฌ๋žŒ/๋””๋ฒ„๊ทธ = `arc_grid` ๋ Œ๋” ์žฌ์‚ฌ์šฉ โ†’ SessionTrace๋ฅผ **ํ„ฐ๋ฏธ๋„ ํŠธ๋ฃจ์ปฌ๋Ÿฌ ์žฌ์ƒ + PNG ํ”„๋ ˆ์ž„**์œผ๋กœ.
162
+ - ์›น ์‹œ๊ฐํ™”๋Š” ์—ฐ๊ธฐ.
163
+
164
+ ## 10. ์‚ฌ๋žŒ ์ฐธ์—ฌ (์Šฌ๋ฆผ)
165
+
166
+ `proteus play --human`: ๋™์ผ grid๋ฅผ ๋ Œ๋”ํ•˜๊ณ  ํ‚ค ์ž…๋ ฅ์„ ๋ฐ›์•„ **๊ฐ™์€ SessionRunner**๋ฅผ ํ†ต๊ณผ์‹œ์ผœ
167
+ ์‚ฌ๋žŒ trace๊ฐ€ LLM trace์™€ ์ง์ ‘ ๋น„๊ต ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค (human baseline / "์‚ฌ๋žŒ๊ณผ ์ผ์น˜๋„"์˜ ํ† ๋Œ€).
168
+ ์›น ํœด๋จผ UI๋Š” ์—ฐ๊ธฐ.
169
+
170
+ ## 11. ๋ฉ€ํ‹ฐ์„ธ์…˜ ํ•ธ๋“œ์˜คํ”„ ์ „๋žต
171
+
172
+ - **SSOT 3์ข…**: ์ด spec(๋ถˆ๋ณ€ ์„ค๊ณ„) + `PLAN.md`(์ฒดํฌํฌ์ธํŠธ๋ณ„ ์ž‘์—…ยท์™„๋ฃŒ๊ธฐ์ค€, ์‚ด์•„์žˆ์Œ) +
173
+ `HANDOFF.md`(์„ธ์…˜ ์ข…๋ฃŒ๋งˆ๋‹ค ๊ฐฑ์‹ : ์™„๋ฃŒ/ํ˜„์ƒํƒœ/๋‹ค์Œ CP/์—ด๋ฆฐ ์งˆ๋ฌธ).
174
+ - ๊ฐ CP๋Š” ์„ธ์…˜ 1๊ฐœ ํฌ๊ธฐ, **๋…๋ฆฝ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ**, "์™„๋ฃŒ = ํ…Œ์ŠคํŠธ X ํ†ต๊ณผ"๋กœ ์ •์˜.
175
+
176
+ | CP | ๋‚ด์šฉ | ์™„๋ฃŒ ๊ธฐ์ค€ |
177
+ |----|------|-----------|
178
+ | CP0 | ํŒจํ‚ค์ง€ ์Šค์ผˆ๋ ˆํ†ค + `arc_grid` vendoring + ํŒจํ‚ค์ง•(pyproject) | import ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ |
179
+ | CP1 | `grid` ํฌํŒ…(scenario/game/ascii/predator_evade), import ๊ฐœ๋ช… | ๊ฒฐ์ •์„ฑยทํ•ธ๋“œ์˜ค๋ฒ„ยท`optimalโ‰ habit` ๋‹จ์œ„ํ…Œ์ŠคํŠธ |
180
+ | CP2 | ์Šฌ๋ฆผ `Agent` + `providers` ํฌํŒ… + `FakeProvider` | ์—์ด์ „ํŠธ ๏ฟฝ๏ฟฝ๏ฟฝ์•ฝ ํ…Œ์ŠคํŠธ |
181
+ | CP3 | `SessionRunner` + `trace` + `metrics` | FakeProvider ํ’€์„ธ์…˜ + golden-trace ํ…Œ์ŠคํŠธ |
182
+ | CP4 | `cli`(run/list/replay) + ์‹ค์ œ ๋ชจ๋ธ ์Šค๋ชจํฌ | ์ €๊ฐ€ ๋ชจ๋ธ 1๊ฐœ end-to-end |
183
+ | CP5 | ํ„ฐ๋ฏธ๋„ ํœด๋จผํ”Œ๋ ˆ์ด + trace ์‹œ๊ฐํ™”(ํ„ฐ๋ฏธ๋„/PNG) | ์‚ฌ๋žŒ trace 1๊ฑด LLM๊ณผ ๋น„๊ต |
184
+ | CP6 | ๋‚œ์ด๋„ ๋ ˆ์ด์•„์›ƒ ๋‹ค์–‘ํ™” + ๋ฉ”ํŠธ๋ฆญ ์ •๊ตํ™” + human baseline ํ•˜๋‹ˆ์Šค | ๋‚œ์ด๋„๋ณ„ ๋™์ž‘ ๊ฒ€์ฆ |
185
+
186
+ ## 12. ๋ช…์‹œ์  ์—ฐ๊ธฐ (์Šฌ๋ผ์ด์Šค YAGNI)
187
+
188
+ - ์›น ํ”„๋ก ํŠธ์—”๋“œ + ๋ฆฌ๋”๋ณด๋“œ (๊ธฐ์กด `interface/backend`๋Š” Squid-Game forfeit ํ˜•ํƒœ โ†’ 2์ฐจ์— ๋ฆฐํ•˜๊ฒŒ
189
+ ์žฌ๊ฒ€ํ† /์žฌ๊ตฌ์ถ•).
190
+ - Scenario ์นดํ…Œ๊ณ ๋ฆฌ ์ผ๋ฐ˜ํ™” (ํ˜ธ๊ธฐ์‹ฌยท์‚ฌํšŒ์„ฑ ๋“ฑ ์‹ ๊ทœ ์‹œ๋‚˜๋ฆฌ์˜ค).
191
+ - reasoning์— ๋Œ€ํ•œ LLM-as-judge ์ฑ„์  (์ง€๊ธˆ์€ ๊ธฐ๋ก๋งŒ, ์ฑ„์ ์€ ๋‚˜์ค‘).
192
+ - ๋‹ค๊ฐœ์ฒด(>2 sprite) ์‚ฌํšŒ ์žฅ๋ฉด.
193
+
194
+ ## 13. ์žฌํ™œ์šฉ ์ถœ์ฒ˜ ๋งคํ•‘ (ํฌํŒ… ๊ฐ€์ด๋“œ)
195
+
196
+ | ์‹ ๊ทœ ์œ„์น˜ | ์ถœ์ฒ˜ (ํ˜„ PROTEUS) | ์ž‘์—… |
197
+ |-----------|-------------------|------|
198
+ | `proteus/arc_grid/` | `arc_grid/` | vendoring (๊ทธ๋Œ€๋กœ) |
199
+ | `proteus/grid/scenario.py` | `game/motive_grid/scenario.py` | import ๊ฐœ๋ช… |
200
+ | `proteus/grid/game.py` | `game/motive_grid/game.py` | import ๊ฐœ๋ช… |
201
+ | `proteus/grid/ascii_view.py` | `game/motive_grid/ascii_view.py` | ๊ทธ๋Œ€๋กœ |
202
+ | `proteus/grid/scenarios/predator_evade.py` | `game/motive_grid/scenarios/predator_evade.py` | import ๊ฐœ๋ช… |
203
+ | `proteus/providers/*` | `game/infra/providers/*` | import ๊ฐœ๋ช… |
204
+ | `proteus/agents/*` | `game/infra/agents/*` ์ฐธ๊ณ ํ•˜๋˜ **์Šฌ๋ฆผ ์žฌ์ž‘์„ฑ** | forfeit๋ฅ˜ ์ œ๊ฑฐ |
205
+ | `proteus/runtime/*` | (์—†์Œ) | **์‹ ๊ทœ ์ž‘์„ฑ** |
206
+ | `proteus/runtime/trace.py` | `game/shared/models/*` ์ฐธ๊ณ ํ•˜๋˜ **๋ฆฐ ์žฌ์ •์˜** | forfeit/RI ๋ฒ ์ด์Šค ์ œ์™ธ |
207
+
208
+ > ์ฐธ๊ณ : `motive_grid/`(์ตœ์ƒ์œ„)์™€ `game/motive_grid/`๋Š” ๋™์ผ ์ฝ”๋“œ์˜ ์‚ฌ๋ณธ. ํฌํŒ… ์‹œ `game/motive_grid/`
209
+ > (TaskModule ์–ด๋Œ‘ํ„ฐ๊นŒ์ง€ ์žˆ๋Š” ์ชฝ)๋ฅผ ์ •๋ณธ์œผ๋กœ ๋ณธ๋‹ค. ๋‹จ `MotiveGridModule`(TaskModule ์–ด๋Œ‘ํ„ฐ)์€
210
+ > Squid-Game ์ธํ„ฐํŽ˜์ด์Šค์šฉ์ด๋ฏ€๋กœ **ํฌํŒ…ํ•˜์ง€ ์•Š๊ณ ** SessionRunner๊ฐ€ ๊ทธ ์—ญํ• ์„ ๋Œ€์ฒดํ•œ๋‹ค.