# ๐Ÿ“‘ Issue #5 Phase 4 โ€” ๋ถˆ๋ณ€ ๋Ÿฐํƒ€์ž„ ๊ฒ€์ฆ ๋ฐ Freeze ์ œ๊ฑฐ ๋ช…์„ธ - **๋ฌธ์„œ ๋ฒ„์ „**: Rev.1 - **์ƒํƒœ**: Phase 4 ์„ค๊ณ„ ๋ฐ ์‹คํ–‰ ๊ธฐ์ค€์„  (Immutable Runtime & Freeze Removal Specification) - **๋Œ€์ƒ ํŒŒ์ผ**: - `lib_py/loop/runner.py`, `lib_py/loop/eager.py` - `.agents/skills/multi-agent-mux-loop/scripts/run_loop.sh` - `docs/contracts/issue-5/task.md` - `tests/test_issue5_phase4_runtime.py` --- ## 1. ๊ฐœ์š” ๋ฐ ํ•œ ๋ฌธ์žฅ ์š”์•ฝ **Python ์ƒ์ฃผ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ถˆ๋ณ€์„ฑ(Eager Import)์„ ํ†ตํ•ด ์ž‘์—… ์ค‘ ์ฝ”๋“œ ์ˆ˜์ • ํฌ๋ž˜์‹œ(B-13)๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•˜๊ณ , ์ž„์‹œ ๋น„๊ณ„์˜€๋˜ `/tmp/mam-loop-freeze.XXXXXX` ์Šค๋ƒ…์ƒท ๋ณต์‚ฌ ์šฐํšŒ์ฑ…์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ œ๊ฑฐํ•œ๋‹ค.** Phase 3์—์„œ `run_loop.sh`๊ฐ€ Python `lib_py.loop`๋กœ ์œ„์ž„๋จ์— ๋”ฐ๋ผ, Bash๊ฐ€ ์‹คํ–‰ ์ค‘ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋””์Šคํฌ ๋ฐ”์ดํŠธ ์˜คํ”„์…‹ ๋‹จ์œ„๋กœ ์žฌ๋…ํ•ดํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋˜ ํฌ๋ž˜์‹œ(B-13: `unexpected EOF` / ๊ตฌ๋ฌธ ํŒŒ๊ดด)์˜ ์›์ธ์ด ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Phase 4์—์„œ๋Š” ์ด๋ฅผ ์—„๋ฐ€ํžˆ ๊ฒ€์ฆํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ I/O ๋ณต์‚ฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ฒ ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. --- ## 2. ํ•ต์‹ฌ ์„ค๊ณ„ ์š”์†Œ ### 2-1. Eager Import ์ƒ์ฃผ ์ •์ฑ… (`eager.py` & `runner.py`) - **์ง€์—ฐ ๋กœ๋”ฉ(Lazy Import) ๊ธˆ์ง€**: - ๋ฃจํ”„ ์‹คํ–‰ ๋„์ค‘ ๋””์Šคํฌ ์ƒ์˜ `.py` ํŒŒ์ผ์ด ํŽธ์ง‘๋˜๋”๋ผ๋„ ๋Ÿฐํƒ€์ž„์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก, ํ”„๋กœ์„ธ์Šค ๊ธฐ๋™ ์‹œ์ ์— ๋ชจ๋“  ์˜์กด ๋ชจ๋“ˆ(`delegation`, `loop`, `paho.mqtt` ๋“ฑ)์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผ์‹œํ‚ต๋‹ˆ๋‹ค. - `eager_load()` ํ•จ์ˆ˜๋ฅผ ๊ธฐ๋™ ์ตœ์šฐ์„  ๋‹จ๊ณ„์—์„œ ํ˜ธ์ถœํ•˜์—ฌ `sys.modules`์— ๋ชจ๋“  ๋ฐ”์ดํŠธ์ฝ”๋“œ์™€ AST๋ฅผ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. - **์ž์‹ ํ”„๋กœ์„ธ์Šค ํ…œํ”Œ๋ฆฟ ๊ฒฉ๋ฆฌ**: - ์„œ๋ธŒํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰๋˜๋Š” ๋„๊ตฌ ํ˜ธ์ถœ(`delegate_job`) ์‹œ `PYTHONDONTWRITEBYTECODE=1`์„ ์œ ์ง€ํ•˜์—ฌ ๋””์Šคํฌ์— `.pyc` ํŒŒํŽธ์ด ๋‚จ๊ฑฐ๋‚˜ ์ž‘์—… ํŠธ๋ฆฌ๊ฐ€ ์˜ค์—ผ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ### 2-2. B-13 Freeze ์Šค๋ƒ…์ƒท ์ œ๊ฑฐ ๋ฐ ๊ฒฝ๋Ÿ‰ํ™” (`run_loop.sh`) - **๊ธฐ๋ณธ ๋™์ž‘ ๋ณ€๊ฒฝ**: - Python ๋ฃจํ”„ ๋ชจ๋“œ(`MAM_LOOP_PY=1`, ๊ธฐ๋ณธ๊ฐ’)์—์„œ๋Š” ํŒŒ์ผ ๋ณต์‚ฌ ์Šค๋ƒ…์ƒท(`/tmp/mam-loop-freeze.XXXXXX`)์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. - ๋””์Šคํฌ I/O ์ ˆ๊ฐ: ํ„ด๋‹น ์ˆ˜๋ฐฑ ๊ฐœ ํŒŒ์ผ ๋ณต์‚ฌ ์˜ค๋ฒ„ํ—ค๋“œ(์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ms) ์™„์ „ ์ œ๊ฑฐ. - **์•ˆ์ „ ๋กค๋ฐฑ ๊ฒฝ๋กœ ๋ณด์กด**: - ํ™˜๊ฒฝ๋ณ€์ˆ˜ `MAM_LOOP_FREEZE=1` ๋˜๋Š” ๋ ˆ๊ฑฐ์‹œ ์…ธ ๋ฃจํ”„ ๋ชจ๋“œ(`MAM_LOOP_PY=0`)๊ฐ€ ๋ช…์‹œ๋œ ๊ฒฝ์šฐ์—๋งŒ ๋ ˆ๊ฑฐ์‹œ Freeze ์Šค๋ƒ…์ƒท ๋กœ์ง์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. - ๊ธฐ์กด ํ…Œ์ŠคํŠธ์˜ ๋ฝ/๊ฐ€๋“œ ํ•ด์ œ ๊ณ„์•ฝ(`_mam_release_guard`)์€ ์™ธ๋ถ€ ์ฃผ์ž… ์Šค๋ƒ…์ƒท ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ### 2-3. ๋ผ์ด๋ธŒ ํ—ฌํผ ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ ๊ฒŒ์ดํŠธ (`MAM_VERSION`) - `lib.sh`์˜ `MAM_VERSION`๊ณผ ํ”„๋กœ์„ธ์Šค ๋Ÿฐํƒ€์ž„์˜ ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „(`eager.FRAMEWORK_VERSION`, ํ˜„์žฌ `4.4.0`)์„ ๋™๊ธฐํ™”ํ•˜๊ณ , ๋ถˆ์ผ์น˜ ๋ฐœ์ƒ ์‹œ ์•ˆ์ „ํ•˜๊ฒŒ fail-closed ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. - ์ด ๊ฒŒ์ดํŠธ ๋•Œ๋ฌธ์— ํ”„๋ ˆ์ž„์›Œํฌ ํŠธ๋ฆฌ๋Š” **๋ถ€๋ถ„ ๊ฐฑ์‹ ์ด ๋ถˆ๊ฐ€๋Šฅ**ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์ƒ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋งŒ ๋ฐฐํฌ๋œ ํ˜ผ์žฌ ํŠธ๋ฆฌ๋Š” ๋ฃจํ”„ ๊ธฐ๋™ ์‹œ์ ์— `RuntimeError`๋กœ ๊ฑฐ๋ถ€๋˜๋ฏ€๋กœ, ๋ฐฐํฌ๋Š” ํ•ญ์ƒ ํŠธ๋ฆฌ ๋‹จ์œ„๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. --- ## 3. ๊ฒ€์ฆ ๊ฒŒ์ดํŠธ (P4-01 ~ P4-03) ### ๐Ÿ“Œ P4-01: Eager Import ์ƒ์ฃผ ๋ฐ ๋ถˆ๋ณ€์„ฑ ๊ฒ€์ฆ - ๊ธฐ๋™ ์‹œ ์ „์ฒด ๋ชจ๋“ˆ์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜์–ด ๋Ÿฐํƒ€์ž„ ์ค‘ ์ถ”๊ฐ€ ์ž„ํฌํŠธ I/O๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ์„ ๊ฒ€์ฆ. - `tests/test_issue5_phase4_runtime.py`์— ๋ชจ๋“ˆ ๋ชฉ๋ก ๋ฐ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ƒ์ฃผ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€. ### ๐Ÿ“Œ P4-02: ์ž‘์—… ์ค‘ ์ฝ”๋“œ ์ˆ˜์ •(B-13) ๋‚ด๊ตฌ์„ฑ ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ - ๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋„์ค‘ ๋””์Šคํฌ ์ƒ์˜ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์ˆ˜์ •๋˜๊ฑฐ๋‚˜ ์ž„์˜์˜ ๋‚ด์šฉ์œผ๋กœ ์น˜ํ™˜๋˜๋”๋ผ๋„, ์ด๋ฏธ ์ƒ์ฃผํ•œ ํŒŒ์ด์ฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—๋Ÿฌ ์—†์ด ๋๊นŒ์ง€ ์ž‘์—…์„ ์™„๊ฒฐํ•จ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒ€์ฆ. ### ๐Ÿ“Œ P4-03: Freeze ์šฐํšŒ์ฑ… ์ œ๊ฑฐ, ์ „๋ฉด ํšŒ๊ท€ ๋ฐ ์šด์˜ ๋ฌธ์„œ ๋™๊ธฐํ™” - `run_loop.sh`์˜ ๊ธฐ๋ณธ Freeze ๋ณต์‚ฌ ๋ถ„๊ธฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”. - ์ „์ฒด ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(744๊ฐœ+) 0-Fail ํ™•์ธ. - `task.md` ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์šด์˜ ๋ฌธ์„œ ๊ฐฑ์‹  ์™„๋ฃŒ.