# ๐Ÿ“‘ Issue #5 Implementation Plan (Phase 1โ€“4 Execution & Rollback Specification) - **Document Version**: Rev.4 (Post Revision Review Corrections) - **Issue**: [Gitea Issue #5](https://git.godopu.com/tmpl/multi-agent-mux/issues/5) - **Status**: Target Architecture Roadmap & Execution Gate Criteria --- ## 1. ๊ฐœ์š” ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์›์น™ ๋ณธ ๋ฌธ์„œ๋Š” Issue #5(Python ๋ชจ๋“ˆํ™” ๋ฐ `lib_py` ์Šน๊ฒฉ)์˜ ๋‹จ๊ณ„์  ๊ตฌํ˜„(Phase 1โ€“4) ์ˆœ์„œ, ํ•„์ˆ˜ ์™„๋ฃŒ ๊ธฐ์ค€(Gate), ๋กค๋ฐฑ ์ ˆ์ฐจ, ๊ทธ๋ฆฌ๊ณ  ๋ช…์‹œ์  ๋น„๋ฒ”์œ„(Out of Scope)๋ฅผ ๊ทœ์ •ํ•ฉ๋‹ˆ๋‹ค. ### ๐Ÿ“Œ ํ•ต์‹ฌ ์›์น™: 1. **์ ์ง„์  ๊ฒฉ๋ฆฌ ๋ฐ ๋ฌด์ค‘๋‹จ ์ „ํ™˜**: ํ”„๋กœ๋•์…˜ ์…ธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜(`run_loop.sh`)์€ Phase 3 ์ด์ „๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ํ™œ์„ฑ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ํŒŒ์ด์ฌ ๋ชจ๋“ˆ์€ ๋…๋ฆฝ๋œ ํŒจํ‚ค์ง€(`lib_py`)๋กœ ๋‹จ๊ณ„์ ์œผ๋กœ ์Šน๊ฒฉ๋ฉ๋‹ˆ๋‹ค. 2. **๋™์ผ ์ž‘์—…๊ณต๊ฐ„ ๋‹ค์ค‘ Writer ์ ˆ๋Œ€ ๊ธˆ์ง€**: ๊ณผ๋„๊ธฐ์  ๋‹จ๊ณ„์—์„œ๋„ ํŠน์ • ์›Œํฌ์ŠคํŽ˜์ด์Šค์—๋Š” ์˜ค์ง ๋‹จ ํ•˜๋‚˜์˜ ์ƒํƒœ ์ œ์–ด์ž(์‹ ๊ทœ ์—”์ง„ ๋˜๋Š” ๊ตฌํ˜• ์…ธ ๋ฃจํ”„)๋งŒ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 3. **Fail-Closed ๋ฐ Rollback ๋ณด์žฅ**: ๊ฐ ๋‹จ๊ณ„๋Š” ์ด์ „ ๋ฒ„์ „์œผ๋กœ ์ฆ‰์‹œ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ช…ํ™•ํ•œ ๋กค๋ฐฑ ์†Œ์œ ๊ถŒ๊ณผ ์ฒดํฌํฌ์ธํŠธ ์ธ๊ณ„ ์ ˆ์ฐจ๋ฅผ ๊ฐ–์ถ”์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. --- ## 2. ๋‹จ๊ณ„๋ณ„ ๊ตฌํ˜„ ๋‹จ์œ„ ๋ฐ ํ•„์ˆ˜ ์™„๋ฃŒ ๊ธฐ์ค€ (Roadmap & Gates) | ๋‹จ๊ณ„ | ์ž‘์—… ๋ชฉํ‘œ | ์„ธ๋ถ€ ๊ตฌํ˜„ ๋‚ด์šฉ | ํ•„์ˆ˜ ์™„๋ฃŒ ๊ฒŒ์ดํŠธ (Gate Criteria) | ๋กค๋ฐฑ ์ ˆ์ฐจ (Rollback Path) | |---|---|---|---|---| | **Phase 0**
*(ํ˜„์žฌ)* | **์‚ฌ์ „ ๊ณ„์•ฝ ๊ณ ์ • ๋ฐ Fixture ์ˆ˜์ง‘** | โ€ข CLI, ์ด๋ฒคํŠธ, ๋ฆฌํฌํŠธ, ๋ฝ ๊ณ„์•ฝ ๊ธฐ์ค€์„  ๋ฌธ์„œํ™”
โ€ข Herdr 0.8.2 ๋„ค์ดํ‹ฐ๋ธŒ ์บก์ฒ˜ ๋ฐ ๋ณตํ•ฉ Watcher ์‹œ๋‚˜๋ฆฌ์˜ค 2๊ณ„์ธต ๋ถ„๋ฆฌ
โ€ข 6๊ฐœ ๋ฐฑ์—”๋“œ ์‹ค์ธก ์ฆ๊ฑฐ ํ–‰๋ ฌ ์ˆ˜์ง‘ | โ€ข 499๊ฐœ ์ „์ฒด ํ…Œ์ŠคํŠธ ์ˆ˜์ง‘ ๋ฐ ํšŒ๊ท€ 0-Fail (100% ํ†ต๊ณผ)
โ€ข Fixture ์Šคํ‚ค๋งˆ ๋ฐ ์ฆ๊ฑฐ ๊ฒฝ๊ณ„ ๊ฒ€์ฆ ํ†ต๊ณผ
โ€ข ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ ๋ฌด๋ณ€๊ฒฝ diff ๊ฒ€์ฆ | ๋ฏธ์ถ”์  ์‚ฐ์ถœ๋ฌผ ์ฆ‰์‹œ ์‚ญ์ œ (`rm -rf docs/contracts/issue-5 tests/fixtures/issue_5 tests/test_issue5_phase0_contracts.py`) | | **Phase 1** | **`lib_py/delegation/` ์ถ”์ถœ** | โ€ข `lib.sh` L1833 ์ดํ•˜ ์œ„์ž„ ํ—ฌํผ๋ฅผ ํŒŒ์ด์ฌ ์„œ๋น„์Šค ํด๋ž˜์Šค๋กœ ์ถ”์ถœ
โ€ข `start_watchdog`์„ ๋‚ด๋ถ€ ๋ช…์นญ `ensure_subscriber_daemon`์œผ๋กœ ๋ช…๋ช…(๊ธฐ์กด ํ•จ์ˆ˜ ๋ณ„์นญ ๋ณด์กด)
โ€ข ์žฅ์ˆ˜ ํ”„๋กœ์„ธ์Šค ๋‹จ์ผ MQTT ์—ฐ๊ฒฐ ์žฌ์‚ฌ์šฉ ํ”„๋กœํ† ํƒ€์ž… | โ€ข CLI/non-fatal/HMAC/seq/๋””์Šคํฌ ํด๋ฐฑ ํšŒ๊ท€ 100% ํ†ต๊ณผ
โ€ข ๋ฐ๋ชฌ ์ˆ˜๋ช… ๋ฐ PID ๊ณ„์•ฝ ์ผ์น˜ ํ™•์ธ
โ€ข **์ž๋™์™„๋ฃŒ ์ •์ฑ… ๋ณ€๊ฒฝ ์—†์Œ** | `lib.sh` ์œ„์ž„ ํ—ฌํผ ํ˜ธ์ถœ์„ ์ด์ „ ์ธ๋ผ์ธ/์…ธ ๋ฐฉ์‹์œผ๋กœ ์ฆ‰์‹œ ๋ณต์› | | **Phase 2a** | **`lib_py/loop/` ์ฝ”์–ด & Shadow Watcher** | โ€ข `engine.py` (๋‹จ์ผ ์ „์ด ์ฃผ์ฒด), `watcher.py` (`herdr agent wait` ๋ž˜ํ•‘) ๊ตฌํ˜„
โ€ข ๋ชจ๋“  Writer์— ๋Œ€ํ•œ ๋‹จ์ผ CAS ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„ ๊ตฌํ˜„
โ€ข ์ž๋™์™„๋ฃŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  "Would-Complete" ๋กœ๊น…๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” Shadow ๋ชจ๋“œ ๊ฐ€๋™ | โ€ข ๋ฝ ๋‚ด ๋น„๋™๊ธฐ/I/O ๋ฐฐ์ œ ๊ฒ€์ฆ
โ€ข ์†Œ์ผ“ ๋‹จ์ ˆ/์Šค๋ƒ…์ƒท ์žฌ์—ฐ๊ฒฐ ๋ฐฑ์˜คํ”„ ๊ฒ€์ฆ
โ€ข Shadow ๋ชจ๋“œ๊ฐ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ƒํƒœ๋ฅผ ์“ฐ์ง€ ์•Š์Œ์„ ๊ฒ€์ฆ | 1) Shadow ๋ชจ๋‹ˆํ„ฐ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ๋ฐ ์ธ๋ฉ”๋ชจ๋ฆฌ ํ ํ๊ธฐ
2) CAS ์„œ๋น„์Šค๋Š” ํ•˜์œ„ ํ˜ธํ™˜ ๋ชจ๋“œ๋กœ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ `MAM_ENGINE_CAS=0` ํ”Œ๋ž˜๊ทธ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋ ˆ๊ฑฐ์‹œ ๋ฌด์กฐ๊ฑด ํ•„๋“œ ๋ณ‘ํ•ฉ(`update_job_status`)์œผ๋กœ ๋ณต๊ท€
3) ๊ธฐ์กด ์…ธ ๋ฃจํ”„ ์ƒํƒœ ๋ฐ ๋ ˆ์ฝ”๋“œ ๋ถˆ๋ณ€ ์œ ์ง€ | | **Phase 2b** | **์ด์ค‘ ๊ฐ์ง€ ์ž๋™์™„๋ฃŒ ํ™œ์„ฑํ™” (Flag-Gated)** | โ€ข 4์ค‘ ์‹คํ–‰ ๊ท€์† + ๋ฆฌํฌํŠธ ํ™•์ • ๊ณ„์•ฝ + ๋‹จ์ผ CAS ์ „์ด ๊ฒŒ์ดํŠธ ์—ฐ๋™
โ€ข Pending Notification ์ง€์—ฐ ์•Œ๋ฆผ ๋ฐ ํฌ๋ž˜์‹œ ๋ณต๊ตฌ ๊ตฌํ˜„
โ€ข ๊ฒ€์ฆ๋œ ๋ฐฑ์—”๋“œ/์ž‘์—…์— ํ•œํ•ด opt-in ํ”Œ๋ž˜๊ทธ๋กœ ํ™œ์„ฑํ™” (๊ธฐ๋ณธ๊ฐ’ OFF) | โ€ข ๋ถ€์ˆ˜ํšจ๊ณผ ์ž‘์—… ์˜ˆ์™ธ ๋ฐ ๋ฌดํŒ์ • fail-closed ํ…Œ์ŠคํŠธ ์™„๋ฃŒ
โ€ข ๊ฒฝ์Ÿ/์žฌ์‹œ์ž‘ ์‹œ๋‚˜๋ฆฌ์˜ค ํ†ต๊ณผ
โ€ข ํ”Œ๋ž˜๊ทธ OFF ์‹œ ๊ธฐ์กด explicit event ๊ฒฝ๋กœ 100% ๋ณด์กด | ํ™˜๊ฒฝ๋ณ€์ˆ˜/ํ”Œ๋ž˜๊ทธ `MAM_AUTO_COMPLETE=0` ์„ค์ •; ์ด๋ฏธ ํ™•์ •๋œ terminal ๋ ˆ์ฝ”๋“œ๋Š” ๋ณด์กดํ•˜๊ณ  ์‹ ๊ทœ ์ž๋™์™„๋ฃŒ๋งŒ ์ค‘๋‹จ | | **Phase 3** | **`run_loop.sh` Thin Wrapper ์ „ํ™˜ ๋ฐ ์ „๋ฉด ํšŒ๊ท€** | โ€ข `run_loop.sh`๋ฅผ ์ธ์ž ์ „๋‹ฌ ๋ž˜ํผ(`exec python3 -m lib_py.loop "$@"`)๋กœ ์ „ํ™˜
โ€ข ํ”Œ๋ž˜๋„ˆ/๋ฆฌ๋ทฐ์–ด/๋ฐ˜๋ก /์Šน๊ฒฉ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋กœ์ง ์™„์ „ ์ด์‹
โ€ข ์—„๊ฒฉํ•œ ํŒ์ • ํŒŒ์„œ(Strict Parser) ์ ์šฉ | โ€ข 5๊ฐœ subprocess ์ „์šฉ ํ…Œ์ŠคํŠธ(~1,621์ค„) ํฌํ•จ ์ „์ฒด 481๊ฐœ+ ํ…Œ์ŠคํŠธ 0-Fail
โ€ข ์‹œ๊ทธ๋„, ๋ฃจํ”„ ๊ฐ€๋“œ, ์ž„์˜ CWD ๋ฐ ๊ณต๋ฐฑ ๊ฒฝ๋กœ ๊ฒ€์ฆ ํ†ต๊ณผ | **์šฐ์•„ํ•œ ํ•ธ๋“œ์˜คํ”„ ์‹œํ€€์Šค**:
1) Quiesce: ์‹คํ–‰ ์ค‘์ธ Python ๋ฃจํ”„ ํ”„๋กœ์„ธ์Šค์— ์ข…๋ฃŒ ์‹ ํ˜ธ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์‹ ๊ทœ ๋””์ŠคํŒจ์น˜ ์ค‘๋‹จ
2) Checkpoint: ํ˜„์žฌ ๋ฃจํ”„ ํšŒ์ฐจ, ํ™œ์„ฑ Job ID ๋ฐ ๋ฆฌ๋ทฐ ์ƒํƒœ๋ฅผ `.mam/loop-checkpoint.json`์— ์›์ž์  ๊ธฐ๋ก
3) Exit: Python ๋ฃจํ”„ ์ •์ƒ ์ข…๋ฃŒ ๋ฐ ๊ฐ€๋“œ ํ•ด์ œ
4) Resume: ๋ฐฑ์—…๋œ ์…ธ ์›๋ณธ ์Šคํฌ๋ฆฝํŠธ๋กœ `run_loop.sh` ๋ณต์› ํ›„ ์ฒดํฌํฌ์ธํŠธ ๊ธฐ๋ฐ˜ ์žฌ๊ฐœ ๊ฒ€์ฆ | | **Phase 4** | **๋ถˆ๋ณ€ ๋Ÿฐํƒ€์ž„ ๊ฒ€์ฆ ๋ฐ Freeze ์ œ๊ฑฐ** | โ€ข ๊ธฐ๋™ ์‹œ ์ „์ฒด ๋ชจ๋“ˆ ์ƒ์ฃผ(Eager Import) ๋ฐ ์ž์‹ ํ…œํ”Œ๋ฆฟ ๋ถˆ๋ณ€์„ฑ ๊ฒ€์ฆ
โ€ข ์ž‘์—… ๋„์ค‘ ์Šคํ‚ฌ ํŒŒ์ผ ๊ต์ฒด ๋ฐ ๋Šฆ์€ ๊ฒฝ๋กœ ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
โ€ข `/tmp/mam-loop-freeze.XXXXXX` ์šฐํšŒ์ฑ… ์™„์ „ ์ œ๊ฑฐ | โ€ข ๋Ÿฐํƒ€์ž„ ์ž๊ธฐ์ˆ˜์ • ํฌ๋ž˜์‹œ(B-13) ์žฌ๋ฐœ ๋ฐฉ์ง€ ๊ฒ€์ฆ
โ€ข Live Helper ๋ฒ„์ „ ํ˜ธํ™˜ ๊ฒŒ์ดํŠธ ๊ฒ€์ฆ ํ†ต๊ณผ
โ€ข ์šด์˜ ๋ฌธ์„œ ๋ฐ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ ๊ฐฑ์‹  | Freeze ๋ณต์‚ฌ ๋กœ์ง(`run_loop.sh:112-127`) ์žฌํ™œ์„ฑํ™” ๋ฐ ๋ผ์ด๋ธŒ ํ—ฌํผ ๋ฒ„์ „ ๊ฒ€์‚ฌ ๋ณต๊ตฌ | --- ## 3. ๋ผ์ด๋ธŒ ํ—ฌํผ ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ ๋ฐ ์ž‘์—… ์ƒํƒœ ์ „์ด ๊ณ„์•ฝ (Live Helper Compatibility Gate) ํ†ตํ•ฉ ๋ณด๊ณ ์„œ(Rev.2) ๋ฐ B-13 ํ•ฉ์˜์— ๋”ฐ๋ผ, `multi-agent-mux-create`, `resume`, `stop` ๋“ฑ 1ํšŒ์„ฑ ์Šคํฌ๋ฆฝํŠธ๋Š” Freeze ๋ณต์‚ฌ๋ณธ์ด ์•„๋‹Œ Live Tree์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Phase 4์—์„œ Freeze๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ „๊นŒ์ง€, ๋ผ์ด๋ธŒ ํ—ฌํผ์™€ ๊ณ ์ • ์‹คํ–‰ ์—”์ง„ ๊ฐ„์˜ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๊ธฐ์กด ์ž‘์—… ์ƒํƒœ ์ „์ด ํšจ๊ณผ๋ฅผ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๊ทœ์น™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค: 1. **ABI ๋ฒ„์ „ ๋ฐ ํ”„๋กœํ† ์ฝœ ํ•ด์‹œ ๊ฒ€์ฆ**: - Live Tree์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋  ๋•Œ, ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ฃจํ”„์˜ `MAM_VERSION` ๋˜๋Š” ๊ณตํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค ํ•ด์‹œ๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. - ๋ฉ”์ด์ € ๋ฒ„์ „ ๋ถˆ์ผ์น˜ ๋˜๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ๊ฐ์ง€๋˜๋ฉด, ๋ผ์ด๋ธŒ ํ—ฌํผ๋Š” ์ฆ‰์‹œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์ค‘๋‹จ(fail-closed)ํ•ฉ๋‹ˆ๋‹ค. 2. **์ž‘์—… ์ทจ์†Œ(`cancelled`) ์ „์ด์˜ ์ •๊ทœ ์„œ๋น„์Šค ๊ฒฝ์œ  ๋ณด์กด**: - `multi-agent-mux-stop/scripts/stop_session.sh`๋Š” ์„ธ์…˜ ๊ฐ•์ œ ์ข…๋ฃŒ ์‹œ ์ž”์—ฌ ํ™œ์„ฑ ์ž‘์—…์— ๋Œ€ํ•ด `cancelled` ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค (`stop_session.sh:242, 322`). - ๋ผ์ด๋ธŒ ํ—ฌํผ๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ JSON ํŒŒ์ผ์„ ์ž„์˜๋กœ ๋ณ€์กฐํ•˜์ง€ ์•Š๊ณ , `delegate_publish_event` ๋ฐ ๊ณตํ†ต ์ƒํƒœ ์ „์ด ์„œ๋น„์Šค(Transition Service)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ CAS ๋ถˆ๋ณ€์‹์„ ์ค€์ˆ˜ํ•˜๋ฉด์„œ ์ž‘์—…์„ ์ •๊ทœ `cancelled` ์ƒํƒœ๋กœ ์ „์ด์‹œํ‚ต๋‹ˆ๋‹ค. - ์ด๋ฅผ ํ†ตํ•ด ์„ธ์…˜ ์ค‘๋‹จ ์‹œ ์ž‘์—…์ด ์˜๊ตฌ ๊ณ ์ฐฉ(hang)๋˜์ง€ ์•Š๊ณ  ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ๋ฃจํ”„๊ฐ€ ์ฆ‰๊ฐ ์ทจ์†Œ๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. --- ## 4. ๋ช…์‹œ์  ๋น„๋ฒ”์œ„(Out of Scope) ๋ฐ ํ˜ธํ™˜์„ฑ ๊ณ„์•ฝ 1. **์ €์žฅ์†Œ ํ†ตํ•ฉ ๊ธˆ์ง€**: - ์„ธ์…˜ ๊ด€๋ฆฌ์šฉ SQLite/YAML ์ €์žฅ์†Œ(`.mam/agent-sessions.yaml`, `.db`)์™€ ๋น„๋™๊ธฐ ์ž‘์—… ๊ด€๋ฆฌ์šฉ JSON ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(`.mam/jobs/`)๋ฅผ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•˜๋ ค ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 2. **์›์ƒท ์Šคํ‚ฌ์˜ Live Tree ์‹คํ–‰ ์œ ์ง€**: - `multi-agent-mux-create`, `resume`, `stop` ๋“ฑ 1ํšŒ์„ฑ ์…ธ ์Šคํฌ๋ฆฝํŠธ๋Š” Freeze ๋ณต์‚ฌ๋ณธ์ด ์•„๋‹Œ ์‹ค์ œ ์ž‘์—… ํŠธ๋ฆฌ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. 3. **ํƒ€์ž„์•„์›ƒ 3์› ๋ถ„๋ฆฌ ๋ณด์กด**: - (a) ์ „์ฒด ๋ฒฝ์‹œ๊ณ„ ํƒ€์ž„์•„์›ƒ, (b) MQTT ๊ฐ€์ž…์ž idle-timeout, (c) TUI idle ์ž๋™์™„๋ฃŒ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉฐ, ์ž๋™์™„๋ฃŒ๊ฐ€ ๊ธฐ์กด ํƒ€์ž„์•„์›ƒ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. --- ## 5. ์„ฑ๋Šฅ ์ˆ˜์šฉ ๊ธฐ์ค€ (Performance Acceptance Criteria) ๊ณ ์ •๋ฐ€ 10ms ํด๋ง ๋Œ€์‹  ์‹ค์ œ ์‹œ์Šคํ…œ ์ž์› ์ธก์ •์„ ๊ธฐ์ค€์œผ๋กœ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค: - **ํ”„๋กœ์„ธ์Šค ํฌํฌ ์ˆ˜ (Fork Count)**: ๋ฃจํ”„ ๋ฐ˜๋ณต๋‹น ์„œ๋ธŒํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ํšŸ์ˆ˜ ๋Œ€ํญ ๊ฐ์†Œ (์…ธ ๋ฃจํ”„ ๋Œ€๋น„ โ‰ฅ70% ๊ฐ์ถ•). - **์œ ํœด CPU ์ ์œ ์œจ (Idle CPU)**: ๋Œ€๊ธฐ ์ค‘ CPU ์‚ฌ์šฉ๋ฅ  1% ๋ฏธ๋งŒ ์œ ์ง€ (์ด๋ฒคํŠธ ๊ตฌ๋™ ๋ฐ ์œ ๊ณ„ ํด๋ง). - **MQTT ์—ฐ๊ฒฐ ์žฌ์‚ฌ์šฉ**: ๋‹จ์ผ ์žฅ์ˆ˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๋‹ค์ˆ˜์˜ ์ž‘์—… ๋ฐœํ–‰ ์‹œ ์—ฐ๊ฒฐ ์žฌ์ˆ˜๋ฆฝ ์˜ค๋ฒ„ํ—ค๋“œ ์ œ๊ฑฐ (p50 ๋ ˆ์ดํ„ด์‹œ ๋‹จ์ถ•).