Spaces:
Sleeping
Sleeping
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, ๋ฆฌํ๋ ์ด ํ์ธ.
|