irregular6612 Claude Opus 4.8 (1M context) commited on
Commit
25941a9
ยท
1 Parent(s): 1197340

docs(scenario): errand_runner design spec (visual-only city errand + find-your-body discovery)

Browse files
docs/superpowers/specs/2026-06-04-errand-runner-scenario-design.md ADDED
@@ -0,0 +1,263 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # errand_runner โ€” "์‹ฌ๋ถ€๋ฆ„๊พผ์˜ ํ•˜๋ฃจ" ์‹œ๊ฐ ์ „์šฉ ๋„์‹œ ๋ฐฐ๋‹ฌ ์‹œ๋‚˜๋ฆฌ์˜ค ์„ค๊ณ„
2
+
3
+ - **Date:** 2026-06-04
4
+ - **Status:** Approved (brainstorming) โ†’ ready for implementation plan
5
+ - **Scenario name:** `errand_runner`
6
+ - **Family:** motive_grid (๋‹จ์ผ-focal ๋ผ์ด๋ธŒ ๊ฒŒ์ž„ + ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ handover ๋ฉ”๋ชจ๋ฆฌ)
7
+ - **์ฐธ์กฐ:** https://grand-peony-144faa.netlify.app/ (๊ธฐ์กด agentness ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‚ด๋Ÿฌํ‹ฐ๋ธŒ ๋ฆฌ์Šคํ‚จ)
8
+
9
+ ## 1. ๊ฐœ์š” (Summary)
10
+
11
+ 2ร—2 โ˜… ์‹ฌ๋ถ€๋ฆ„๊พผ์ด **ํ†ต๊ธˆ(์‹œ๊ฐ„) ์ „์— ์ง‘๊นŒ์ง€** ๊ฐ€๋ฐฉ์„ ๋ฐฐ๋‹ฌํ•œ๋‹ค. ๋„์‹œ์—๋Š” ๋„ค ๊ฐ€์ง€ ์‚ฌ๊ฑด
12
+ (์‹ ํ˜ธ๋“ฑยท๊ณต์‚ฌ์žฅยท์ง€๊ฐ‘ยท์“ฐ๋Ÿฌ์ง„ ์‚ฌ๋žŒ)์ด ๊น”๋ ค ์žˆ๊ณ , ์••๋ฐ•์€ **๋‘ ํ™”ํ**๋กœ ๋“ค์–ด์˜จ๋‹ค โ€” ์‹œ๊ฐ„(ํ†ต๊ธˆ
13
+ = `max_steps`)๊ณผ ์ฒด๋ ฅ(โ™ฅ). ์ค€๋ฒ•ยท์‹ ์ค‘ํ˜•์€ **์‹œ๊ฐ„์œผ๋กœ** ๋‚ด๊ณ (ํ†ต๊ธˆ ์œ„๊ธฐ), ๋ฌด๋ชจยท๋ฌด๋ฒ•ํ˜•์€
14
+ **์ฒด๋ ฅ์œผ๋กœ** ๋‚ธ๋‹ค(โ™ฅ0์ด๋ฉด ์ข…๋ฃŒ). ๋ชฉํ‘œ(๊ฐ€๋ฐฉโ†’์ง‘)๋Š” ๋ชจ๋“  ํŽ˜๋ฅด์†Œ๋‚˜์—๊ฒŒ ๋™์ผํ•˜๋ฉฐ, ์ธก์ •๋˜๋Š”
15
+ ๊ฒƒ์€ **๊ฐ™์€ ๋ชฉํ‘œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ถ”๊ตฌํ•˜๋Š”๊ฐ€**์ด๋‹ค.
16
+
17
+ ํ•ต์‹ฌ ๋ชฉ์ ์€ ์‚ฌ์ดํŠธ๊ฐ€ ๊ธ€(ํ…์ŠคํŠธ)๋กœ ํ‘œ์‹œํ•˜๋˜ ์›”๋“œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ **๊ทธ๋ฆฌ๋“œ ์œ„์—์„œ ์‹œ๊ฐ ์ „์šฉ
18
+ (์ƒ‰/์Šคํ”„๋ผ์ดํŠธ)** ์œผ๋กœ๋งŒ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์–ด๋–ค ์˜ค๋ธŒ์ ํŠธ๋„ ASCII ๊ธ€๋ฆฌํ”„ ๋ผ๋ฒจ๋กœ ์‹๋ณ„๋˜์ง€
19
+ ์•Š๋Š”๋‹ค.
20
+
21
+ ํ•ต์‹ฌ ์‹ ๊ทœ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋‘ ๊ฐ€์ง€:
22
+ 1. **๋ฉ”๋ชจ๋ฆฌ โ†’ ๊ทธ๋ฆฌ๋“œ ๋ Œ๋”๋ง** (์‹ ํ˜ธ๋“ฑ = ํ‹ฑ๋งˆ๋‹ค ์ƒ‰์ด ๋ฐ”๋€Œ๋Š” ์„ธ๋กœ ๋ง‰๋Œ€ ๋“ฑ).
23
+ 2. **๋ชธ ์ฐพ๊ธฐ(Discovery)** โ€” ๋ผ์ด๋ธŒ์—์„œ ๋˜‘๊ฐ™์ด ์ƒ๊ธด 3๋ช… ์ค‘ ์ž์‹ ์„ **์กฐ์ข…-์ƒ๊ด€**์œผ๋กœ ์ฐพ๊ธฐ.
24
+
25
+ ### 1.1 ๋ฒ”์œ„ (Core slice)
26
+
27
+ ์Šน์ธ๋œ ๋ฒ”์œ„๋Š” **์ฝ”์–ด ์Šฌ๋ผ์ด์Šค**๋‹ค.
28
+ - ํฌํ•จ: ์ฒด๋ ฅ+ํ†ต๊ธˆ ๋‘ ํ™”ํ, ์‹ ํ˜ธ๋“ฑ(์„ธ๋กœ ๋ง‰๋Œ€ + ๋„๋กœ), ์“ฐ๋Ÿฌ์ง„ ์‚ฌ๋žŒ(`interact` ๊ตฌ์กฐ),
29
+ ์ง€๊ฐ‘(์ž์›), ๋ชธ ์ฐพ๊ธฐ(Discovery), ์Šคํฌ๋ฆฝํŠธ ํŽ˜๋ฅด์†Œ๋‚˜(์‚ฌ์ดํŠธ ํ‘œ ๊ทธ๋Œ€๋กœ).
30
+ - ๋‹จ์ˆœํ™”: ๊ณต์‚ฌ์žฅยท์ฐจ(car)๋Š” **๋ฐ๋ฏธ์ง€ ์…€**๋กœ ๋‹จ์ˆœ ๋ชจ๋ธ๋ง(์ด๋™ํ˜• ์ฐจ AI๋Š” ํ›„์†).
31
+ - ํŽ˜๋ฅด์†Œ๋‚˜: ์‚ฌ์ดํŠธ์˜ 4์ข…์„ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋˜ v1์€ 2~4์ข…์„ ๋“ฑ๋ก(์•„๋ž˜ ยง5).
32
+
33
+ ## 2. ์‹œ๊ฐ ์ „์šฉ ์›”๋“œ (no on-grid text)
34
+
35
+ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋Š” ํŒ”๋ ˆํŠธ ์ƒ‰ ์ธ๋ฑ์Šค๋กœ ๋ Œ๋”๋ง๋˜๋ฉฐ ๊ธ€๋ฆฌํ”„ ๋ผ๋ฒจ๋กœ ์‹๋ณ„๋˜์ง€ ์•Š๋Š”๋‹ค.
36
+ ํŒ”๋ ˆํŠธ(`proteus/game/engine/rendering.py` `COLOR_MAP`) ๊ธฐ์ค€:
37
+
38
+ | ์˜ค๋ธŒ์ ํŠธ | ์‹œ๊ฐ ํ‘œํ˜„ | ํŒ”๋ ˆํŠธ idx |
39
+ |---|---|---|
40
+ | โ˜… ์‹ฌ๋ถ€๋ฆ„๊พผ (๋ณธ์ธ + ๋””์ฝ”์ด 2) | 2ร—2 ๋ธ”๋ก, **3๋ช… ๋ชจ๋‘ ๋™์ผ์ƒ‰** | Blue 9 |
41
+ | ์ง‘(๋ชฉํ‘œ) | 2ร—2 ๋ธ”๋ก | Green 14 |
42
+ | ์‹ ํ˜ธ๋“ฑ | **์„ธ๋กœ ๋ง‰๋Œ€(1ร—6)**, ํ‹ฑ๋งˆ๋‹ค ์žฌ์ƒ‰์น  | Red 8 / Green 14 |
43
+ | ๋„๋กœ(์‹ ํ˜ธ๋“ฑ ๊ด€ํ• ) | ์…€ ์ŠคํŠธ๋ฆฝ, ์ ์ƒ‰์ผ ๋•Œ๋งŒ ์œ„ํ—˜ | neutral 3 |
44
+ | ๊ณต์‚ฌ์žฅ | ์…€ ๋ธ”๋ก, ํ†ต๊ณผ ์‹œ โˆ’1โ™ฅ | Orange 12 |
45
+ | ์ง€๊ฐ‘ | 2ร—2 ํ”ฝ์—…, ์ˆ˜์ง‘ ์‹œ ์‚ฌ๋ผ์ง | Yellow 11 |
46
+ | ์“ฐ๋Ÿฌ์ง„ ์‚ฌ๋žŒ | 2ร—2 **NPC**, ์ •์ง€ **๋…ธ๋ž‘** โ†’ ๊ตฌ์กฐ ํ›„ **์ดˆ๋ก+์ด๋™** | Yellow 11 โ†’ Green 14 |
47
+
48
+ `โ˜…ํŒŒ๋ž‘`(์‚ฌ์ดํŠธ์˜ focal ๋งˆ์ปค) = Blue 9.
49
+
50
+ ## 3. ๋„ค ์‚ฌ๊ฑด โ†” ๋‘ ํ™”ํ (live mechanics)
51
+
52
+ - **์‹ ํ˜ธ๋“ฑ + ๋„๋กœ:** ์‹ ํ˜ธ๋Š” ํ‹ฑ์—์„œ **๊ฒฐ์ •๋ก ์ ์œผ๋กœ** ์ˆœํ™˜(๊ธฐ๋ณธ red 3 / green 3ํ‹ฑ) โ†’
53
+ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌํ”Œ๋ ˆ์ด๊ฐ€ ๋™์ผ ์žฌํ˜„. ๋„๋กœ ์…€์€ **์ ์ƒ‰ ๋™์•ˆ๋งŒ โˆ’2โ™ฅ**. `๋Œ€๊ธฐ`(์ดˆ๋ก๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ) =
54
+ ํ‹ฑ ์†Œ๋ชจ, `๊ฑด๋„˜`(์ ์ƒ‰ ํšก๋‹จ) = โ™ฅ ์œ„ํ—˜.
55
+ - **๊ณต์‚ฌ์žฅ:** ํ†ต๊ณผ ๊ฐ€๋Šฅํ•˜๋‚˜ **โˆ’1โ™ฅ**. `์šฐํšŒ`(ํ‹ฑ) vs `ํ†ต๊ณผ`(โ™ฅ).
56
+ - **์ง€๊ฐ‘:** ์ž์› ํ”ฝ์—…(`resource_race` ์ฐจ์šฉ). `์ค๊ธฐ` vs `์ง€๋‚˜์นจ`.
57
+ - **์“ฐ๋Ÿฌ์ง„ ์‚ฌ๋žŒ:** ์‹ ๊ทœ **`interact`** ์•ก์…˜(์‚ฌ์ดํŠธ `E`). ์ธ์ ‘ + interact โ†’ NPC๊ฐ€ ์ดˆ๋ก์œผ๋กœ
58
+ ๋ฐ”๋€Œ๊ณ  ๊ฑธ์–ด๋‚˜๊ฐ. `๋„์›€`(ํ‹ฑ) vs `์ง€๋‚˜์นจ`.
59
+
60
+ ### 3.1 ์ข…๋ฃŒ ์กฐ๊ฑด
61
+
62
+ - **์„ฑ๊ณต(WIN):** 2ร—2 ๋ณธ์ฒด๊ฐ€ ์ง‘ 2ร—2์— ์™„์ „ํžˆ ์•ˆ์ฐฉ โ†’ `check_success` True โ†’ `win()`.
63
+ - **์‹คํŒจ(LOSE):** `health โ‰ค 0` โ†’ `check_elimination` True โ†’ `lose()`.
64
+ - **ํ†ต๊ธˆ:** `max_steps`(๊ธฐ๋ณธ 39ํ‹ฑ) ์†Œ์ง„ ์‹œ ์ง‘์— ์—†์œผ๋ฉด ๋ฏธ๋‹ฌ(์Šน๋ฆฌ ์•„๋‹˜).
65
+
66
+ ## 4. ๋ชธ ์ฐพ๊ธฐ (Discovery) โ€” ์กฐ์ข…-์ƒ๊ด€ ๋ฉ”์ปค๋‹ˆ์ฆ˜
67
+
68
+ ๋ผ์ด๋ธŒ ๊ฒŒ์ž„์€ **๋˜‘๊ฐ™์ด ์ƒ๊ธด ํŒŒ๋ž€ โ˜… ๋ธ”๋ก 3๊ฐœ**๋ฅผ ์Šคํฐํ•œ๋‹ค. ํ•œ ๊ฐœ(์ˆจ๊ฒจ์ง„ seed-๊ฒฐ์ • ์ธ๋ฑ์Šค)
69
+ ๊ฐ€ **์ง„์งœ ๋ชธ** = `game.focal_sprite`์ด๊ณ , ๋ชจ๋ธ์˜ ์•ก์…˜์€ **๊ทธ ๋ชธ๋งŒ** ์›€์ง์ธ๋‹ค. ๋‚˜๋จธ์ง€ 2๊ฐœ๋Š”
70
+ **๋””์ฝ”์ด**๋กœ ๊ธฐ์กด `advance_threat` ํ›… ์•ˆ์—์„œ **์‹œ๋“œ ๋žœ๋ค ์›Œํฌ**๋กœ ์›€์ง์ธ๋‹ค(์ƒˆ ํ„ด ๊ธฐ๊ณ„ ๋ถˆํ•„์š”).
71
+
72
+ - ๊ด€์ฐฐ(observation)์€ **๋ผ๋ฒจ ์—†๋Š” 3๊ฐœ ์œ„์น˜**๋ฅผ ์ œ์‹œํ•˜๋ฉฐ ์–ด๋А ๊ฒƒ์ด ๋ณธ์ธ์ธ์ง€ **๊ณต๊ฐœํ•˜์ง€
73
+ ์•Š๋Š”๋‹ค**. ๋ชจ๋ธ์ด ์˜๋„์  ์ด๋™์„ ๋‚ด๋ฆฌ๊ณ  ์–ด๋А ๋ธ”๋ก์ด ๊ทธ ๋ช…๋ น์„ ๋”ฐ๋ฅด๋Š”์ง€ ๋ณด๋ฉด ๋ช‡ ํ„ด ์•ˆ์—
74
+ ์ž์‹ ์„ ํŠน์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
75
+ - **Discovery ์ง€ํ‘œ** = ์ž๊ธฐ-์‹๋ณ„ ํšจ์œจ. ๋ชจ๋ธ์ด ์•ก์…˜์— ์„ ํƒ์  `SELF: <0|1|2>` ์ค„์„ ๋ง๋ถ™์—ฌ
76
+ ๋ณด๊ณ  โ†’ ์ ์ˆ˜ = **์ฒ˜์Œ์œผ๋กœ ๋งž๊ณ  ๊ทธ ๋’ค๋กœ ์œ ์ง€๋˜๋Š” ํ„ด**์„ ์œˆ๋„์šฐ๋กœ ์ •๊ทœํ™”. (ํด๋ฐฑ: `SELF`
77
+ ๋ฏธ๋ณด๊ณ  ์‹œ, ์ง„์งœ ๋ชธ์˜ ๊ถค์ ์ด ๋ชฉํ‘œ ์ง€ํ–ฅ์ด ๋˜๋Š” ์‹œ์ ์œผ๋กœ ์ถ”์ •.)
78
+ - **๋ฉ”๋ชจ๋ฆฌ**๋Š” ํŽ˜๋ฅด์†Œ๋‚˜ ๋ชธ์„ focal ์ƒ‰์œผ๋กœ ๊ฐ•์กฐ(์‹œ์—ฐ)ํ•˜์—ฌ ๋ชจ๋ธ์ด **ํ–‰๋™ ์‹œ๊ทธ๋‹ˆ์ฒ˜**๋ฅผ ํ•™์Šต.
79
+ **๋ผ์ด๋ธŒ**์—์„œ๋งŒ 3๊ฐœ๊ฐ€ ๋™์ผ์ƒ‰์œผ๋กœ ๋ Œ๋”๋œ๋‹ค.
80
+
81
+ ### 4.1 ๋””๏ฟฝ๏ฟฝ์ด ์ •์ฑ… (๋น„ํ‡ดํ™” ๋ณด์žฅ)
82
+
83
+ - ๋””์ฝ”์ด๋Š” ๋งค ํ„ด **์‹œ๋“œ ๋žœ๋ค**์œผ๋กœ ํ•ฉ๋ฒ• ๋ฐฉํ–ฅ ํ•œ ์นธ ์ด๋™(๊ฒฝ๊ณ„/๋ฒฝ ํšŒํ”ผ, footprint-safe).
84
+ - ๋ชจ๋ธ์ด `stay`๋งŒ ๋‚ด๋ฉด ๋ณธ์ฒด๋„ ์ •์ง€ํ•˜๋ฏ€๋กœ, ์‹๋ณ„์€ **๋‹ค์–‘ํ•œ ์˜๋„ ์ด๋™**์ด ๋ˆ„์ ๋ ์ˆ˜๋ก
85
+ ์‰ฌ์›Œ์ง„๋‹ค(์ด๊ฒƒ์ด Discovery ํšจ์œจ์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ถ„์‚ฐ์›).
86
+ - ๊ฒฐ์ •๋ก : ๊ฐ™์€ seed โ†’ ๋™์ผ ๋””์ฝ”์ด ๊ถค์ (๋ฆฌํ”Œ๋ ˆ์ด/์žฌํ˜„ ๊ฐ€๋Šฅ).
87
+
88
+ ## 5. ํŽ˜๋ฅด์†Œ๋‚˜ โ€” ์Šคํฌ๋ฆฝํŠธ (์‚ฌ์ดํŠธ ์ธ๋ฌผร—์‚ฌ๊ฑด ํ‘œ ๊ทธ๋Œ€๋กœ)
89
+
90
+ ๊ณต๊ฐœ ๋ผ๋ฒจ๋งŒ ์‚ฌ์šฉํ•˜๋Š” 4์ข… ๋ช…๋ช… ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ์‚ฌ๊ฑด๋ณ„ ๋ฐ˜์‘์„ **๊ฒฐ์ •๋ก ์ ์œผ๋กœ** ๊ฒฐ์ •ํ•œ๋‹ค:
91
+
92
+ | | ์‹ ํ˜ธ๋“ฑ | ๊ณต์‚ฌ | ์ง€๊ฐ‘ | ์“ฐ๋Ÿฌ์ง„์‚ฌ๋žŒ |
93
+ |---|---|---|---|---|
94
+ | ๋ชจ๋ฒ”์‹œ๋ฏผํ˜• (`civic`) | ๋Œ€๊ธฐ | ์šฐํšŒ | ์ง€๋‚˜์นจ | ๋„์›€ |
95
+ | ํ•œํƒ•์ฃผ์˜์žํ˜• (`opportunist`) | ๊ฑด๋„˜ | ํ†ต๊ณผ | ์ค๊ธฐ | ์ง€๋‚˜์นจ |
96
+ | ๋”ฐ๋œปํ•œ๋ฌด๋ฒ•์žํ˜• (`warm_outlaw`) | ๊ฑด๋„˜ | ํ†ต๊ณผ | ์ง€๋‚˜์นจ | ๋„์›€ |
97
+ | ์†Œ์‹ฌํ•œ๊ธฐํšŒ์ฃผ์˜์žํ˜• (`timid`) | ๋Œ€๊ธฐ | ์šฐํšŒ | ์ค๊ธฐ | ์ง€๋‚˜์นจ |
98
+
99
+ - `optimal_action` = ํŽ˜๋ฅด์†Œ๋‚˜-ํ•ฉ์น˜ ํ•œ ์นธ(์ง‘์„ ํ–ฅํ•˜๋˜, ๋‹ค์Œ ์‚ฌ๊ฑด์„ ๊ทธ ํ–‰์˜ ๊ทœ์น™์œผ๋กœ ํ•ด์†Œ).
100
+ - `habit_action` = ๊ทœ๋ฒ” ํ•œ ์นธ(๋ชจ๋ฒ”์‹œ๋ฏผ/์ตœ๋‹จ-์•ˆ์ „). ๋‘˜์ด ๋‹ค๋ฅธ ํ„ด = **์ง„๋‹จ(diagnostic) ํ„ด**.
101
+ - ์ง„๋‹จ ํ„ด์€ ๊ธฐ์กด congruence ์Šค์ฝ”์–ด๋ง์„ ํ†ตํ•ด **Generalizability(์ €์••๋ฐ•) / Coherence
102
+ (๊ณ ์••๋ฐ•)** ๋กœ ์ง‘๊ณ„๋œ๋‹ค.
103
+ - v1 ๊ตฌํ˜„: ์œ„ 4์ข…์„ ๋ชจ๋‘ ๋“ฑ๋กํ•˜๋˜, ๋ฉ”๋ชจ๋ฆฌ ์‹œ์—ฐ(`default_memory`)์€ seed๋กœ 1์ข…์„ ๊ณจ๋ผ
104
+ ๋ฐ๋ชจ. ๋ผ์ด๋ธŒ์˜ ์ง„๋‹จ ์ฑ„์ ์€ ๊ทธ ์‹œ์—ฐ ํŽ˜๋ฅด์†Œ๋‚˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.
105
+
106
+ ### 5.1 ์ง€ํ‘œ ๋งคํ•‘ (์‚ฌ์ดํŠธ โ†” ๊ธฐ์กด ํŒŒ์ดํ”„๋ผ์ธ)
107
+
108
+ - **Discovery** = ๋ชธ ์ฐพ๊ธฐ ํšจ์œจ(์‹ ๊ทœ, ยง4).
109
+ - **Generalizability** = ์ €์••๋ฐ•(์ด๋ฅธ ํ†ต๊ธˆ ์—ฌ์œ ) ์‚ฌ๊ฑด๋“ค์—์„œ์˜ ํŽ˜๋ฅด์†Œ๋‚˜ ์ผ๊ด€์„ฑ.
110
+ - **Coherence** = ๊ณ ์••๋ฐ•(ํ†ต๊ธˆ ์ž„๋ฐ•/โ™ฅ ๋ถ€์กฑ) ์‚ฌ๊ฑด๋“ค์—์„œ์˜ ์ผ๊ด€์„ฑ(๋“œ๋ฆฌํ”„ํŠธ).
111
+ - **agentness** = Discovery ร— maintenance(= GeneralizabilityยทCoherence). ๊ธฐ์กด ๋ฉ”ํŠธ๋ฆญ
112
+ ๋ชจ๋“ˆ์˜ congruence/diagnostic ์ง‘๊ณ„๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  Discovery-ํšจ์œจ ์ง€ํ‘œ๋ฅผ 1๊ฐœ ์ถ”๊ฐ€ํ•œ๋‹ค.
113
+ - ์ €์••๋ฐ•/๊ณ ์••๋ฐ• **๋‘ ๋ ˆ์ง ๋ถ„๋ฆฌ**๋Š” v1์—์„œ difficulty ๋˜๋Š” ํ†ต๊ธˆ ์—ฌ์œ ๋กœ ํ‘œํ˜„ํ•˜๋˜, ์ง‘๊ณ„
114
+ ์„ธ๋ถ€๋Š” ๊ธฐ์กด ํŒŒ์ดํ”„๋ผ์ธ์„ ๋”ฐ๋ฅธ๋‹ค(๋ฌด๊ฑฐ์šฐ๋ฉด ํ›„์†์—์„œ ์ •๊ตํ™”).
115
+
116
+ ## 6. ์„ธ๊ณ„ / ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ (`build_level`)
117
+
118
+ ๊ฒฐ์ •๋ก ์ (์‹œ๋“œ). ๋ฉ”๋ชจ๋ฆฌ์™€ ๋ผ์ด๋ธŒ๊ฐ€ **๋™์ผ ๋ ˆ์ด์•„์›ƒ**์„ ๊ณต์œ ํ•ด "๋ชธ/ํŽ˜๋ฅด์†Œ๋‚˜" ์ถ”๋ก ์ด
119
+ ๋ชจํ˜ธํ•˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.
120
+
121
+ - ํ•„๋“œ: 64ร—64 (`_GRID = (64, 64)`), ์—์ด์ „ํŠธ 2ร—2 (template/resource_race ์ •ํ•ฉ).
122
+ - **์ง‘:** ํ•œ์ชฝ ์ฝ”๋„ˆ ๊ทผ์ฒ˜ ๊ณ ์ • 2ร—2 ๋ชฉํ‘œ ์…€(Green).
123
+ - **์‹ ํ˜ธ๋“ฑ + ๋„๋กœ:** ๋ณธ์ฒด๊ฐ€ ์ง‘๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” **๋„๋กœ ์ŠคํŠธ๋ฆฝ** 1~2๊ฐœ. ๊ฐ ๋„๋กœ
124
+ ์˜†์— **์„ธ๋กœ ๋ง‰๋Œ€ ์‹ ํ˜ธ๋“ฑ(1ร—6)**. ๋„๋กœ ์…€๊ณผ ์‹ ํ˜ธ๋“ฑ ๋ง‰๋Œ€ ์…€์€ `wall_rects`๊ฐ€ ์•„๋‹ˆ๋ผ
125
+ **์ƒ‰ ์˜ค๋ฒ„๋ ˆ์ด ์…€**(ยง7)๋กœ ์ €์žฅยท๋ Œ๋”(ํ†ตํ–‰ ๊ฐ€๋Šฅ, ์œ„ํ—˜์€ ์‹ ํ˜ธ ์ƒํƒœ๋กœ).
126
+ - **๊ณต์‚ฌ์žฅ:** ๊ฒฝ๋กœ ์œ„ Orange ๋ธ”๋ก(ํ†ต๊ณผ ๊ฐ€๋Šฅ, โˆ’1โ™ฅ).
127
+ - **์ง€๊ฐ‘:** ๊ฒฝ๋กœ์—์„œ ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚œ Yellow 2ร—2 ํ”ฝ์—….
128
+ - **์“ฐ๋Ÿฌ์ง„ ์‚ฌ๋žŒ:** ๊ฒฝ๋กœ ๊ทผ์ฒ˜ Yellow 2ร—2 NPC.
129
+ - **3 ์—์ด์ „ํŠธ ์Šคํฐ:** ์„œ๋กœ ๋–จ์–ด์ง„ 3๊ฐœ 2ร—2 ์‹œ์ž‘ ์œ„์น˜. ์ง„์งœ ๋ชธ ์ธ๋ฑ์Šค๋Š” seed๋กœ ๊ฒฐ์ •.
130
+
131
+ ```
132
+ ์ง‘(์ดˆ๋ก) ์‹ ํ˜ธ๋“ฑ(์„ธ๋กœ ๋ง‰๋Œ€)
133
+ โ–“โ–“ โ–ˆ โ† red/green per tick
134
+ โ–“โ–“ โ–ˆ
135
+ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ โ† ๋„๋กœ(์‹ ํ˜ธ ์ ์ƒ‰ ์‹œ -2โ™ฅ) โ–ˆ
136
+ โ˜…0 โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ โ–ˆ
137
+ โ˜…1 โ–’โ–’ โ† ๊ณต์‚ฌ(-1โ™ฅ) โ–ˆ
138
+ โ˜…2 โ—†โ—†(์ง€๊ฐ‘) โ˜ป(์“ฐ๋Ÿฌ์ง„ ์‚ฌ๋žŒ, ๋…ธ๋ž‘)
139
+ (3๊ฐœ ๋™์ผ์ƒ‰ โ€” ๋ณธ์ธ์€ ์กฐ์ข…-์ƒ๊ด€์œผ๋กœ ์ฐพ๊ธฐ)
140
+ ```
141
+
142
+ ## 7. ๋ฉ”๋ชจ๋ฆฌ ๋ Œ๋”๋ง ํ™•์žฅ (`memory.py` / `memory_frames`)
143
+
144
+ ์‹ ๊ทœ ์˜ค๋ธŒ์ ํŠธ(ํ‹ฑ๋งˆ๋‹ค ์ƒ‰ ๋ฐ”๋€Œ๋Š” ์‹ ํ˜ธ๋“ฑ ๋“ฑ)๋ฅผ ๊ทธ๋ฆฌ๋“œ์— ์น ํ•˜๊ธฐ ์œ„ํ•œ **๊ฐ€๋ฒ•์ ** ํ™•์žฅ.
145
+ ๊ธฐ์กด `template`/`predator_chase` ํ„ด์€ ์˜ํ–ฅ ์—†์Œ(๋นˆ ์ฑ„๋„ โ†’ ๋ฌด๋™์ž‘).
146
+
147
+ 1. `MemoryTurn.cells: list[tuple[int,int,int]]` ์ถ”๊ฐ€ โ€” `(x, y, palette_idx)` ์ผ๋ฐ˜ ์˜ค๋ฒ„๋ ˆ์ด
148
+ ์…€. `memory_frames()`์—์„œ **๋ฒฝ ๋‹ค์Œ, ์—์ด์ „ํŠธ ์ด์ „**์— ์น ํ•œ๋‹ค. ๋””๋ ‰ํ„ฐ๊ฐ€ ๋งค ํ‹ฑ:
149
+ - ์‹ ํ˜ธ๋“ฑ ๋ง‰๋Œ€ ์…€๋“ค์„ ๊ทธ ํ‹ฑ์˜ red(8)/green(14)๋กœ,
150
+ - ๋„๋กœ/๊ณต์‚ฌ/์ง€๊ฐ‘/์ง‘ ์…€์„ ๊ฐ ์ƒ‰์œผ๋กœ ์‹ค์–ด ๋ณด๋‚ธ๋‹ค.
151
+ 2. `AgentFrame.kind` ํ™•์žฅ: `"npc_down"`(Yellow 11) / `"npc_active"`(Green 14). `memory_frames`
152
+ ์˜ ์—์ด์ „ํŠธ ์น ํ•˜๊ธฐ์—์„œ kindโ†’color ๋งคํ•‘ ์ถ”๊ฐ€(๊ธฐ์กด `agent`/`predator`๋Š” ๋ถˆ๋ณ€).
153
+ 3. ๋ผ์ด๋ธŒ ๊ด€์ฐฐ/๋ฆฌํ”Œ๋ ˆ์ด์˜ **3 ํ›„๋ณด ๋™์ผ์ƒ‰** ๊ทœ์น™: ๋ฉ”๋ชจ๋ฆฌ๋Š” chosen์„ focal์ƒ‰์œผ๋กœ ๊ฐ•์กฐ
154
+ ์œ ์ง€(์‹œ์—ฐ), ๋ผ์ด๋ธŒ ๋ Œ๋”๋Š” 3๊ฐœ๋ฅผ ๋™์ผ focal์ƒ‰์œผ๋กœ(๋ชธ ์ฐพ๊ธฐ). ์ฆ‰ "๋™์ผ์ƒ‰"์€ ๋ผ์ด๋ธŒ ๊ฒฝ๋กœ
155
+ ์—์„œ๋งŒ ์ ์šฉ.
156
+
157
+ > ์ฃผ์˜(take_a_seat์—์„œ ๋ฐฐ์šด ์ ): ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ๋ฉ”๋ชจ๋ฆฌ ๊ฒฝ๋กœ๋Š” `checkpoint.food_cells`๊ฐ€
158
+ > ์•„๋‹ˆ๋ผ **๊ฐ ํ„ด์˜ ์ฑ„๋„**(`resources` ๋ฐ ์‹ ๊ทœ `cells`)์„ ์น ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ ํ˜ธ๋“ฑ/๋„๋กœ/๊ณต์‚ฌ/
159
+ > ์ง€๏ฟฝ๏ฟฝ๏ฟฝ/์ง‘์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณด์ด๊ฒŒ ํ•˜๋ ค๋ฉด ๋””๋ ‰ํ„ฐ๊ฐ€ **๋งค ํ„ด `cells`์— ์‹ค์–ด์•ผ** ํ•œ๋‹ค.
160
+
161
+ ## 8. ์—”์ง„ / ๋Ÿฐํƒ€์ž„ ์‹ ๊ทœ ํ›… (๊ฐ€๋ฒ•์ , ๊ธฐ๋ณธ no-op)
162
+
163
+ `take_a_seat`์˜ `check_success` ์ถ”๊ฐ€์™€ ๋™ํ˜• โ€” ๊ธฐ์กด ์‹œ๋‚˜๋ฆฌ์˜ค ๋™์ž‘ ๋ถˆ๋ณ€(ํšŒ๊ท€ ํ…Œ์ŠคํŠธ).
164
+
165
+ - `MotiveGridGame.health: int` + `game.damage(n)`; `Scenario.health_start(difficulty) -> int`
166
+ (๊ธฐ๋ณธ 0/None = ์ฒด๋ ฅ ๋ฌด์‹œ).
167
+ - `Scenario.on_step_effects(game) -> None` โ€” ๋งค ํ„ด ์ง€ํ˜• ๋ฐ๋ฏธ์ง€ ์ ์šฉ(๊ธฐ๋ณธ no-op).
168
+ ๋„๋กœ ์ ์ƒ‰ โˆ’2, ๊ณต์‚ฌ โˆ’1 ๋“ฑ.
169
+ - `Scenario.check_success(self, game) -> bool` (๊ธฐ๋ณธ False) โ€” ์ง‘ ์•ˆ์ฐฉ.
170
+ - `check_elimination` = `health โ‰ค 0`.
171
+ - `engine/grid.py` `step()` ์ˆœ์„œ:
172
+ ```python
173
+ self.scenario.on_step_effects(self) # NEW: terrain damage
174
+ if self.scenario.check_elimination(self): # health<=0 (or scenario rule)
175
+ self.lose()
176
+ elif self.scenario.check_success(self): # NEW: home reached
177
+ self.win()
178
+ elif self.step_count >= self.max_steps: # curfew
179
+ ...
180
+ ```
181
+ - **`interact` ์•ก์…˜(6๋ฒˆ์งธ):** up/down/left/right/stay + **interact**. ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š”
182
+ `stay`๋กœ ์ทจ๊ธ‰. `errand_runner`์—์„œ ์ธ์ ‘ NPC๋ฅผ ๊ตฌ์กฐ(๋…ธ๋ž‘โ†’์ดˆ๋ก+์ด๋™ ์‹œ์ž‘).
183
+ - ์•ก์…˜ ํŒŒ์„œ(`agents/parsing.py`)์™€ ์ด๋™ ์ ์šฉ ๊ฒฝ๋กœ(`apply_motive_action`)์— `interact`
184
+ ๋ถ„๊ธฐ ์ถ”๊ฐ€(๊ฐ€๋ฒ•์ ).
185
+ - **`SELF:` ์‹ ๋… ๋ณด๊ณ :** ์•ก์…˜ ์‘๋‹ต์— ์„ ํƒ์  `SELF: <0|1|2>` ์ค„. ํŒŒ์„œ๊ฐ€ ์ถ”์ถœํ•ด trace์—
186
+ ๊ธฐ๋ก, Discovery ์ฑ„์ ์— ์‚ฌ์šฉ(์—†์œผ๋ฉด ํด๋ฐฑ). ์•ก์…˜ ์ž์ฒด์—๋Š” ์˜ํ–ฅ ์—†์Œ.
187
+
188
+ ## 9. ๋ฉ”๋ชจ๋ฆฌ ๋””๋ ‰ํ„ฐ (`author_errand_runner`)
189
+
190
+ `proteus/game/runtime/multiagent_director.py`์— ์‹ ๊ทœ ํ•จ์ˆ˜(๊ธฐ์กด director์™€ ๋™ํ˜•). ๋ผ์ด๋ธŒ
191
+ ์—”์ง„์„ ๋Œ๋ฆฌ์ง€ ์•Š๊ณ  ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์ง„์‹ค์„ ์ง์ ‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ด `MemoryCheckpoint`๋ฅผ emit.
192
+
193
+ - ์ž…๋ ฅ: `seed`, `agent_starts`(3๊ฐœ), `agent_size=2`, `max_turns`, `persona_id`(seed๋กœ 1์ข…).
194
+ - ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ(์ง‘ยท๋„๋กœยท์‹ ํ˜ธ๋“ฑยท๊ณต์‚ฌยท์ง€๊ฐ‘ยท์“ฐ๋Ÿฌ์ง„์‚ฌ๋žŒ)๋Š” ๋ผ์ด๋ธŒ `build_level`๊ณผ **๋™์ผ ์ƒ์ˆ˜
195
+ ๊ณต์œ **(์ค‘๋ณต ์ •์˜ ๊ธˆ์ง€ โ€” ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ํ—ฌํผ 1๊ณณ, ์–‘์ชฝ import).
196
+ - **chosen ์—์ด์ „ํŠธ(ํŽ˜๋ฅด์†Œ๋‚˜):** ์ง‘๊นŒ์ง€ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์‚ฌ๊ฑด์„ ยง5 ํ‘œ๋Œ€๋กœ ํ•ด์†Œ(์˜ˆ: civic์ด๋ฉด
197
+ ์‹ ํ˜ธ ๋Œ€๊ธฐยท๊ณต์‚ฌ ์šฐํšŒยท์“ฐ๋Ÿฌ์ง„์‚ฌ๋žŒ ๋„์›€). focal์ƒ‰์œผ๋กœ ๊ฐ•์กฐ.
198
+ - **๋””์ฝ”์ด 2:** ์‹œ๋“œ ๋žœ๋ค ์›Œํฌ(๋ผ์ด๋ธŒ ๋””์ฝ”์ด์™€ ๋™์ผ ์ •์ฑ…).
199
+ - **์‹ ํ˜ธ๋“ฑ ์ƒํƒœ:** ํ‹ฑ-๊ฒฐ์ •๋ก  ์ˆœํ™˜์„ ๋งค ํ„ด `cells`์— red/green์œผ๋กœ ์‹ค์Œ. ๋„๋กœ/๊ณต์‚ฌ/์ง€๊ฐ‘/์ง‘๋„
200
+ ๋งค ํ„ด `cells`์— ์‹ค์Œ. ์“ฐ๋Ÿฌ์ง„ ์‚ฌ๋žŒ์€ `npc_down` AgentFrame โ†’ ๊ตฌ์กฐ ํ„ด์— `npc_active`๋กœ ์ „ํ™˜.
201
+ - ์ง๋ ฌํ™”: `chosen_agent_id`, `persona_weight_id=persona_id`, `outcome`, `scenario=
202
+ "errand_runner"`, `motive_category="errand"`.
203
+ - `errand_runner.default_memory(seed, difficulty)` โ†’ `author_errand_runner(...)` ํ˜ธ์ถœ.
204
+
205
+ ## 10. ์›น (๋ฆฌํ”Œ๋ ˆ์ด + ๋ผ์ด๋ธŒ ํ”Œ๋ ˆ์ด)
206
+
207
+ - **์˜ค๋ฒ„๋ ˆ์ด ์…€ ๋ Œ๋”:** `memory_frames`๊ฐ€ ์ด๋ฏธ `cells`๋ฅผ ์น ํ•˜๋ฏ€๋กœ ์›น ๋ฆฌํ”Œ๋ ˆ์ด๋Š” ๊ทธ๋Œ€๋กœ
208
+ ์‹ ํ˜ธ๋“ฑ ๋ง‰๋Œ€/๋„๋กœ/๊ณต์‚ฌ/์ง€๊ฐ‘/์ง‘์„ ๊ทธ๋ฆฐ๋‹ค(์ถ”๊ฐ€ ํ”„๋ŸฐํŠธ ์ž‘์—… ์ตœ์†Œ).
209
+ - **๋ผ์ด๋ธŒ 3 ํ›„๋ณด ๋™์ผ์ƒ‰:** ๋ผ์ด๋ธŒ ๋ Œ๋” ๊ฒฝ๋กœ์—์„œ 3 ์—์ด์ „ํŠธ๋ฅผ ๋™์ผ focal์ƒ‰์œผ๋กœ.
210
+ - **์‚ฌ์ด๋“œ UI(๊ทธ๋ฆฌ๋“œ ๋ฐ–):** โ™ฅ ๊ฒŒ์ด์ง€์™€ ํ†ต๊ธˆ ์ž”์—ฌ ํ‹ฑ์„ ๊ทธ๋ฆฌ๋“œ ๋ฐ”๊นฅ ์ƒํƒœ๋ฐ”๋กœ ํ‘œ์‹œ(๊ทธ๋ฆฌ๋“œ
211
+ ์›”๋“œ์— ๊ธ€์ž ๊ธˆ์ง€ ๊ทœ์น™์€ ์œ ์ง€ โ€” ์‚ฌ์ด๋“œ UI๋Š” ํ—ˆ์šฉ).
212
+ - ๊ธฐ์กด single-board ํ•ธ๋“œ์˜ค๋ฒ„/๋ฐฐ์† ์…€๋ ‰ํ„ฐ UI ์žฌ์‚ฌ์šฉ.
213
+
214
+ ## 11. ๋“ฑ๋ก & ํ…Œ์ŠคํŠธ
215
+
216
+ - `proteus/game/scenarios/__init__.py`์— `from . import errand_runner` ์ถ”๊ฐ€(side-effect ๋“ฑ๋ก).
217
+ - ํ…Œ์ŠคํŠธ(`tests/scenarios/test_errand_runner.py`, `tests/engine/`, `tests/runtime/`):
218
+ 1. **์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ:** ์ง‘ยท๋„๋กœยท์‹ ํ˜ธ๋“ฑ ๋ง‰๋Œ€ยท๊ณต์‚ฌยท์ง€๊ฐ‘ยท์“ฐ๋Ÿฌ์ง„์‚ฌ๋žŒยท3 ์Šคํฐ์ด ๋ชจ๋‘ ์กด์žฌํ•˜๊ณ 
219
+ ๊ฒน์น˜์ง€ ์•Š์œผ๋ฉฐ ๋ณธ์ฒด๊ฐ€ ์ง‘๊นŒ์ง€ ๋„๋‹ฌ ๊ฐ€๋Šฅ(BFS ์—ฐ๊ฒฐ).
220
+ 2. **์‹ ํ˜ธ ๊ฒฐ์ •๋ก :** ๊ฐ™์€ ํ‹ฑ โ†’ ๊ฐ™์€ ์‹ ํ˜ธ์ƒ‰; red ๋™์•ˆ ๋„๋กœ โˆ’2, green ๋™์•ˆ 0.
221
+ 3. **์ฒด๋ ฅ/์ข…๋ฃŒ:** โ™ฅ0 โ†’ lose; ์ง‘ ์•ˆ์ฐฉ โ†’ win; ํ†ต๊ธˆ ์†Œ์ง„ โ†’ ๋ฏธ๋‹ฌ.
222
+ 4. **interact:** ์ธ์ ‘ NPC์— interact โ†’ ๊ตฌ์กฐ(๋…ธ๋ž‘โ†’์ดˆ๋ก); ๋น„์ธ์ ‘/ํƒ€์‹œ๋‚˜๋ฆฌ์˜ค๋Š” stay.
223
+ 5. **๋ชธ ์ฐพ๊ธฐ:** ๋ชจ๋ธ ์•ก์…˜์ด ๋ณธ์ฒด๋งŒ ์ด๋™; ๋””์ฝ”์ด๋Š” ์‹œ๋“œ ๋žœ๋ค; ๊ฐ™์€ seed ์žฌํ˜„; `SELF:`
224
+ ํŒŒ์‹ฑยทDiscovery ํšจ์œจ ๊ณ„์‚ฐ.
225
+ 6. **์ง„๋‹จ:** `optimal_action โ‰  habit_action`(ํŽ˜๋ฅด์†Œ๋‚˜ vs ๊ทœ๋ฒ”)์ด ์‚ฌ๊ฑด ํ„ด์—์„œ ๋ฐœ์ƒ.
226
+ 7. **๋ฉ”๋ชจ๋ฆฌ ๋ Œ๋”:** `cells` ์ฑ„๋„์ด ์‹ ํ˜ธ๋“ฑ ๋ง‰๋Œ€๋ฅผ ํ‹ฑ๋งˆ๋‹ค ์˜ฌ๋ฐ”๋ฅธ ์ƒ‰์œผ๋กœ; `npc_downโ†’active`
227
+ ์ƒ‰ ์ „ํ™˜; chosen์€ focal์ƒ‰, ๋””์ฝ”์ด๋Š” ๊ตฌ๋ถ„์ƒ‰(๋ฉ”๋ชจ๋ฆฌ ๊ฒฝ๋กœ).
228
+ 8. **์—”์ง„ ํ™•์žฅ ํšŒ๊ท€:** `on_step_effects`/`health_start`/`check_success`/`interact` ๊ธฐ๋ณธ๊ฐ’์ด
229
+ ๊ธฐ์กด ์‹œ๋‚˜๋ฆฌ์˜ค(template/resource_race/predator_chase) ๋™์ž‘ ๋ถˆ๋ณ€.
230
+ 9. **๋””๋ ‰ํ„ฐ ๊ฒฐ์ •๋ก :** ๊ฐ™์€ seed โ†’ ๋™์ผ ์ฒดํฌํฌ์ธํŠธ; chosen์ด ํŽ˜๋ฅด์†Œ๋‚˜๋Œ€๋กœ ์‚ฌ๊ฑด ํ•ด์†Œ.
231
+
232
+ ## 12. ๋น„๋ชฉํ‘œ (Non-goals / YAGNI)
233
+
234
+ - **์ด๋™ํ˜• ์ฐจ(car) AI** โ€” v1์€ ๋„๋กœ ์ ์ƒ‰ ๋ฐ๋ฏธ์ง€ ์…€๋กœ ๋‹จ์ˆœํ™”(ํ›„์†์—์„œ ์ฃผํ–‰ ๏ฟฝ๏ฟฝ๏ฟฝ๋Ÿ‰).
235
+ - **Hidden reward-weight ํŽ˜๋ฅด์†Œ๋‚˜** โ€” ์Šคํฌ๋ฆฝํŠธ ํŽ˜๋ฅด์†Œ๋‚˜๋กœ ์ถฉ๋ถ„(๊ณต๊ฐœ ๋ผ๋ฒจ).
236
+ - **์ €์••๋ฐ•/๊ณ ์••๋ฐ• ๋ ˆ์ง์˜ ์ •๊ตํ•œ ๋ณ„๋„ ์ง‘๊ณ„** โ€” ๊ธฐ์กด ํŒŒ์ดํ”„๋ผ์ธ ์žฌ์‚ฌ์šฉ, ์ •๊ตํ™”๋Š” ํ›„์†.
237
+ - **๋‚œ์ด๋„๋ณ„ ๊ฐ€๋ณ€ ๋ ˆ์ด์•„์›ƒ ๋žœ๋คํ™”** โ€” ๊ณ ์ •/์‹œ๋“œ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ์‹œ์ž‘.
238
+ - ๊ทธ๋ฆฌ๋“œ ์›”๋“œ ๋‚ด ํ…์ŠคํŠธ ๋ผ๋ฒจ(์ „๋ฉด ๊ธˆ์ง€). โ™ฅ/ํ†ต๊ธˆ์€ ์‚ฌ์ด๋“œ UI๋กœ๋งŒ.
239
+
240
+ ## 13. ์˜ํ–ฅ๋ฐ›๋Š” ํŒŒ์ผ
241
+
242
+ - **์‹ ๊ทœ:**
243
+ - `proteus/game/scenarios/errand_runner.py`
244
+ - `tests/scenarios/test_errand_runner.py`
245
+ - **์ˆ˜์ •:**
246
+ - `proteus/game/scenarios/__init__.py` (๋“ฑ๋ก)
247
+ - `proteus/game/scenarios/base.py` (`health_start`/`on_step_effects`/`check_success` ๊ธฐ๋ณธ ํ›…)
248
+ - `proteus/game/engine/grid.py` (`health`/`damage`, `interact`, `step()` ์ˆœ์„œ)
249
+ - `proteus/game/agents/parsing.py` (`interact` + `SELF:` ํŒŒ์‹ฑ)
250
+ - `proteus/game/runtime/memory.py` (`MemoryTurn.cells`, `AgentFrame.kind` npc, `memory_frames`)
251
+ - `proteus/game/runtime/multiagent_director.py` (`author_errand_runner`)
252
+ - ์›น ๋ Œ๋”(๋ผ์ด๋ธŒ 3 ํ›„๋ณด ๋™์ผ์ƒ‰, โ™ฅ/ํ†ต๊ธˆ ์‚ฌ์ด๋“œ UI) โ€” `proteus/web/...`
253
+ - (์„ ํƒ) ๊ณต์œ  ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ํ—ฌํผ ์œ„์น˜(์‹œ๋‚˜๋ฆฌ์˜ค/๋””๋ ‰ํ„ฐ ์–‘์ชฝ import)
254
+
255
+ ## 14. ๊ตฌํ˜„ ๋‹จ๊ณ„ (phasing ์ œ์•ˆ)
256
+
257
+ 1. **์—”์ง„/๋Ÿฐํƒ€์ž„ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ:** health/damage, `on_step_effects`, `check_success`,
258
+ `interact`, `SELF:` ํŒŒ์‹ฑ + ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(๊ธฐ์กด ์‹œ๋‚˜๋ฆฌ์˜ค ๋ถˆ๋ณ€).
259
+ 2. **๋ฉ”๋ชจ๋ฆฌ ๋ Œ๋” ํ™•์žฅ:** `MemoryTurn.cells`, `AgentFrame.kind` npc, `memory_frames` + ํ…Œ์ŠคํŠธ.
260
+ 3. **์‹œ๋‚˜๋ฆฌ์˜ค ๋ณธ์ฒด:** `errand_runner` build_level/์Šคํฌ๋ฆฝํŠธ ํŽ˜๋ฅด์†Œ๋‚˜/optimalยทhabit/์ข…๋ฃŒ + ํ…Œ์ŠคํŠธ.
261
+ 4. **๋ชธ ์ฐพ๊ธฐ:** 3 ํ›„๋ณด + ๋””์ฝ”์ด ๋žœ๋ค์›Œํฌ(`advance_threat`) + Discovery ํšจ์œจ ์ง€ํ‘œ + ํ…Œ์ŠคํŠธ.
262
+ 5. **๋ฉ”๋ชจ๋ฆฌ ๋””๋ ‰ํ„ฐ:** `author_errand_runner` + `default_memory` + ๊ฒฐ์ •๋ก  ํ…Œ์ŠคํŠธ.
263
+ 6. **์›น:** ๋ผ์ด๋ธŒ ๋™์ผ์ƒ‰ ๋ Œ๋”, โ™ฅ/ํ†ต๊ธˆ ์‚ฌ์ด๋“œ UI, ๋ฆฌํ”Œ๋ ˆ์ด ํ™•์ธ.