# ๐Ÿ” Design Review โ€” Job e89f62d5 (์›ŒํฌํŠธ๋ฆฌ ์šด์˜ ๋ชจ๋ธ ์ œ์•ˆ, `design/worktree-model` @ `fe96db1`) - **Reviewer**: `planner-reviewer-claude-01` (role: planner,reviewer) ยท 2026-09-14 - **๋Œ€์ƒ**: `docs/design/worktree-creator-model.md`(์›ŒํฌํŠธ๋ฆฌ `multi-agent-mux-wt/design-worktree-model`, ์ปค๋ฐ‹ `fe96db1`, 1ํŒŒ์ผ +86). - ๋ณธ ์ฒดํฌ์•„์›ƒ์€ ์ด ์žก ๋‚ด๋‚ด `main` @ `5611859`(v4.5.0 ์ฝ”๋“œ)์— ์žˆ๋‹ค. - ์•„๋ž˜์˜ ์ฝ”๋“œ ๊ทผ๊ฑฐ(ํŒŒ์ผ:๋ผ์ธ)๋Š” ๋ชจ๋‘ ์ด `main` ๊ธฐ์ค€์ด๋‹ค. - **๋ฐฉ๋ฒ•**: - ๋ฌธ์„œ๋ฅผ ์ •๋…ํ–ˆ๋‹ค. - ๋ฌธ์„œ๊ฐ€ ๊ธฐ๋Œ€๋Š” ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ createยทstatusยทmonitorยทstopยทresumeยทdelegate-jobยทloop ๋Ÿฌ๋„ˆ ์ˆœ์œผ๋กœ ์ถ”์ ํ–ˆ๋‹ค. - scratchpad ์ž„์‹œ git ์ €์žฅ์†Œ์—์„œ ์‹คํ—˜ 1๊ฑด์„ ํ–ˆ๋‹ค(gitignore ์™€ symlink). - ๋ฌธ์„œยท์ฝ”๋“œ๋Š” ์ˆ˜์ •ํ•˜์ง€ ์•Š์•˜๋‹ค. ์ฒดํฌ์•„์›ƒ ์ „ํ™˜, ์›ŒํฌํŠธ๋ฆฌ ์กฐ์ž‘, ์‹ค์ œ `.mam`ยท์„ธ์…˜ ์กฐ์ž‘๋„ ์—†์—ˆ๋‹ค. ## 0. ์š”์•ฝ | ํ•ญ๋ชฉ | ํŒ์ • | ํ•ต์‹ฌ | |---|---|---| | ยง6-Q1 ๋‘ ๋ฌธ์ œ ํ•ด์†Œ | **๋ณด์™„** | ์ปค๋ฐ‹ ๊ฒฉ๋ฆฌ๋Š” ํ•ด์†Œ๋œ๋‹ค. ๋ณ‘๋ ฌ์„ฑ์€ "๋ฃจํ”„ ๋ฐ– creator ๋ณ‘๋ ฌ + ๋ฆฌ๋ทฐ ๋ฃจํ”„ 1๊ฐœ" ๋กœ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค(๋ฃจํ”„ lock ์ด ๋‘ ๋ฒˆ์งธ ๋ฃจํ”„๋ฅผ ๊ฑฐ๋ถ€). ๋†“์นœ ๊ฒฝ๋กœ 5๊ฑด(ยง2) | | ยง6-Q2 / ๋ธŒ๋ฆฌํ”„ (1) ์ œ์–ด ํ‰๋ฉด env override | **๋ณด์™„** | statusยทmonitorยทstop ์€ ํ–‰์˜ `pane.cwd` ๋ฅผ ์กด์ค‘ํ•ด ์•ˆ์ „ํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ resume ์€ `--workspace $WT` ๊ฐ€ ํ•„์ˆ˜์ด๊ณ , ๋ชจ๋‹ˆํ„ฐ ๋ฐ๋ชฌ์ด ์›ŒํฌํŠธ๋ฆฌ ์ฝ”๋“œ๋กœ ๋œฐ ์ˆ˜ ์žˆ๋‹ค | | ๋ธŒ๋ฆฌํ”„ (2) ์ฃผ์ž… ๋ฌธ๊ตฌ ์ƒ๋Œ€๊ฒฝ๋กœ | **๋™์˜ + ๋ฒ”์œ„ ํ™•๋Œ€** | brief ๊ฒฝ๋กœ๋ฟ ์•„๋‹ˆ๋ผ `--registry-dir .mam/jobs` ์™€ Output Report Path ๋„ ์ƒ๋Œ€๊ฒฝ๋กœ๋‹ค. ์ด๋Œ€๋กœ๋ฉด creator ์˜ `started` ๊ฐ€ ์‹คํŒจํ•œ๋‹ค(rc 1 `agent_blocked`). ยง5-1 ์€ ์ฒซ ์‚ฌ์šฉ ์ „ ํ•„์ˆ˜๋‹ค | | ๋ธŒ๋ฆฌํ”„ (3) ๋Ÿฌ๋„ˆ diffยท`base_commit` | **๋™์˜ + ๊ตฌ์ฒดํ™”** | `runner.py:397-411`, `:564-565` ๋Š” ๋ชจ๋‘ `workspace_root` ๊ธฐ์ค€์ด๋‹ค. `--worktree` ๋Š” diffยทbase ๋งŒ ๋ฐ”๊พธ๊ณ  wrapperยท๋ ˆ์ง€์ŠคํŠธ๋ฆฌยท์ฒดํฌํฌ์ธํŠธ๋Š” ๋ณธ ์ฒดํฌ์•„์›ƒ์— ๋‘์–ด์•ผ ํ•œ๋‹ค | | ๋ธŒ๋ฆฌํ”„ (4) `.mam` ๊ฒฝํ•ฉยทยง5-4 | **๋ณด์™„** | ๋ฌธ์„œ์˜ "๊ฒฝ๊ณ " ๊ฐ€ ์•„๋‹ˆ๋ผ **๊ฑฐ๋ถ€**๋‹ค(`run_loop.sh:189-203`). 1๋‹จ๊ณ„๋Š” ยง5-4 ์—†์ด ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค | | ๋ธŒ๋ฆฌํ”„ (5) ๋†“์นœ ์‹คํŒจ ๊ฒฝ๋กœ | **๋ณด์™„** | `.venv` symlink ๊ฐ€ ๋ฌด์‹œ๋˜์ง€ ์•Š์Œ(์‹คํ—˜), `.pytest_cache` ๋ฏธ๋ฌด์‹œ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ creator ์˜ ์‚ด์•„ ์žˆ๋Š” ํŠธ๋ฆฌ์—์„œ ๊ฒ€์ฆ, ์›ŒํฌํŠธ๋ฆฌ ๋ชจ๋‹ˆํ„ฐ ๋ฐ๋ชฌ, ์›ŒํฌํŠธ๋ฆฌ ์‚ญ์ œ ๋’ค resume ๋ถˆ๊ฐ€ | | ยง6-Q3 / ๋ธŒ๋ฆฌํ”„ (6) A/B/C ํ‰๊ฐ€ | **๋™์˜ + ๋Œ€์•ˆ 2๊ฑด** | C ๊ฐ€ ๋งž๋‹ค. ์ถ”๊ฐ€๋กœ โ‘  ๋ณธ ์ฒดํฌ์•„์›ƒ ์ปค๋ฐ‹ ๊ฐ€๋“œ, โ‘ก ๋ฆฌ๋ทฐ๋งˆ๋‹ค detached ์›ŒํฌํŠธ๋ฆฌ | | ยง6-Q4 ยง5 ๋ˆ„๋ฝยท๊ณผ์ž‰ | **๋ณด์™„** | ยง5-1ยทยง5-2ยทยง5-3 ๋ฒ”์œ„๋ฅผ ๋„“ํžˆ๊ณ  3๊ฑด์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ยง5-4 ๋Š” ๋ณด๋ฅ˜ํ•ด๋„ ๋œ๋‹ค | | ยง6-Q5 / ๋ธŒ๋ฆฌํ”„ (7) #17 ํ•ญ๋ชฉ 4 ์ˆœ์„œ | **์กฐ๊ฑด๋ถ€ ๋™์˜** | ๋ ˆ์‹œํ”ผยท๋ฌธ์„œ ๋จผ์ €. ๋‹จ ยง5-1ยทยง5-2 ๋‘ ์ฝ”๋“œ ๋ณ€๊ฒฝ์€ ์ง€๊ธˆ ํ•œ๋‹ค | **๊ฒฐ๋ก **: ๊ทผ๋ณธ ๊ฒฐํ•จ์€ ์—†๊ณ  C ์•ˆ์€ ์ฑ„ํƒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋งŒ ยง7 ์˜ ๋ฌธ์„œ ์ˆ˜์ •๊ณผ ยง5 ๋ณด๊ฐ•์ด ์ฒซ ์ ์šฉ ์ „์— ํ•„์š”ํ•˜๋‹ค. ## 1. ๋ธŒ๋ฆฌํ”„ (1) ยท ยง6-Q2 โ€” ์ œ์–ด ํ‰๋ฉด env override ๊ฐ€ ์Šคํ‚ฌ๋งˆ๋‹ค ์กด์ค‘๋˜๋Š”๊ฐ€ | ๊ตฌ์„ฑ์š”์†Œ | override ์กด์ค‘ | ์›ŒํฌํŠธ๋ฆฌ `pane.cwd` ํ–‰ ์ฒ˜๋ฆฌ | ๊ทผ๊ฑฐ | |---|---|---|---| | `lib.sh` | `WORKSPACE_ROOT`(`:26`)์™€ `AGENT_SESSIONS_YAML`(`:34`)์„ env ์šฐ์„ ์œผ๋กœ ์“ด๋‹ค | โ€” | `lib.sh:26`, `:34` | | **create** | yamlยท๋ ˆ์ง€์ŠคํŠธ๋ฆฌ โœ…(`create_session.sh:353`, `:372-386`) | pane cwd = `--workspace`(`:219`, `:223`, `:229`)์ด๊ณ  ํ–‰์— ๊ธฐ๋ก๋œ๋‹ค(`:309`, `:428`, `:494`). herdr ์„œ๋ฒ„๋Š” `--herdr-session` ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด **์›ŒํฌํŠธ๋ฆฌ ์Šฌ๋Ÿฌ๊ทธ**๊ฐ€ ๋œ๋‹ค(`:163-172`) | ์•„๋ž˜ โš ๏ธ1 | | **status** | yaml โœ…(`status.sh:22`) | claude ๋Œ€ํ™” ํ‚ค๋ฅผ **ํ–‰์˜ cwd** ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค โœ…(`:59-76`) | ์•ˆ์ „ | | **monitor (reconcile)** | yamlยท`WORKSPACE_ROOT` โœ… | herdr ์„œ๋ฒ„๋ฅผ **ํ–‰๋งˆ๋‹ค** ๋ชจ์•„ ์กฐํšŒํ•œ๋‹ค(`reconcile.sh:491-500`). ๋‹ค๋ฅธ ์„œ๋ฒ„์˜ ์›ŒํฌํŠธ๋ฆฌ ํ–‰๋„ ๊ด€์ธก๋˜๋ฏ€๋กœ ๊ฑฐ์ง“ drift A ๊ฐ€ ์—†๋‹ค. drift B ์ž๋™ ๋“ฑ๋ก์€ ๋ณธ ์ฒดํฌ์•„์›ƒ ์•„๋ž˜ pane ๋งŒ ํ•œ๋‹ค(`:651-653`). C0 ๊ฒ€์ฆ์€ ํ–‰ cwd ๋ฅผ ์“ด๋‹ค(`:727-730`, `verify_session.py:90-93`) | ์•ˆ์ „ | | **stop** | yaml โœ…, purge ๋งˆ์ปค๋Š” ๋ณธ ์ฒดํฌ์•„์›ƒ `.mam`(`stop_session.sh:103`) | uuid ์บก์ฒ˜ยทpurge ๊ฐ€ **ํ–‰ cwd** ๋ฅผ ์“ด๋‹ค(`:133-143`, `:189`). herdr ์†Œ์ผ“์€ ํ–‰์˜ `herdr_session` ์„ ๋จผ์ € ์“ด๋‹ค(`lib.sh:1484-1490`) | ์•ˆ์ „ | | **resume** | yaml โœ… | `--workspace` ๊ฐ€ ํ•„์ˆ˜๋‹ค(`resume_session.sh:42`). ํ–‰์„ `cwd == --workspace` ๋กœ ์ฐพ๋Š”๋‹ค(`workspace_uuid.py:58`). claude ํ‚ค๋Š” ์›ŒํฌํŠธ๋ฆฌ ๊ฒฝ๋กœ๋‹ค(`verify_session.py:75-81`) | โš ๏ธ2 | | **delegate-job ๋ž˜ํผ** | `.mam.env` ๋Š” `REPO_ROOT`(= ๋ณธ ์ฒดํฌ์•„์›ƒ, `:20-24`) โœ…. **`MAM_JOBS_DIR` ์€ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค**. `REGISTRY_DIR_DEFAULT=".mam/jobs"`(`:71`) | ์ฃผ์ž… ๋ฌธ๊ตฌยท๋ธŒ๋ฆฌํ”„๊ฐ€ ์ƒ๋Œ€๊ฒฝ๋กœ๋‹ค | ยง3 ์—์„œ ๋‹ค๋ฃฌ๋‹ค | | **loop ๋Ÿฌ๋„ˆ** | `workspace_root` = `MAM_REAL_ROOT`/`WORKSPACE_ROOT`/cwd(`runner.py:58`) | โ€” | ยง4 ์—์„œ ๋‹ค๋ฃฌ๋‹ค | - โš ๏ธ1 **์›ŒํฌํŠธ๋ฆฌ ๋ชจ๋‹ˆํ„ฐ ๋ฐ๋ชฌ**: - create ๋Š” `start_watchdog "$DELEGATE_JOB_ID" "$WORKSPACE"`(`create_session.sh:527`)๋ฅผ ๋ถ€๋ฅธ๋‹ค. - ๊ทธ๋Ÿฌ๋ฉด ๋ฐ๋ชฌ์ด `/.agents/skills/โ€ฆ/reconcile.sh`(`daemon.py:35-36`, `:63-85`)๋กœ ๋œฌ๋‹ค. ์ค‘๋ณต ํŒ์ •์ด **์Šคํฌ๋ฆฝํŠธ ๊ฒฝ๋กœ ๊ธฐ์ค€**(`:39-55`)์ด๋ผ ๋ณธ ์ฒดํฌ์•„์›ƒ ๋ฐ๋ชฌ์„ ๋ณด์ง€ ๋ชปํ•œ๋‹ค. - `WORKSPACE_ROOT=$MAIN` ์ด ์ƒ์†๋˜๋ฉด, ์ด ๋ฐ๋ชฌ์€ ๋ณธ ์ฒดํฌ์•„์›ƒ์˜ `monitor.lock` ์„ ์–ป์ง€ ๋ชปํ•ด ๊ณง ๋๋‚œ๋‹ค. - ๊ทธ๋Ÿฌ๋‚˜ **๋ณธ ์ฒดํฌ์•„์›ƒ ๋ฐ๋ชฌ์ด ์—†๋˜ ์ˆœ๊ฐ„**์ด๋ฉด ์ด ๋ฐ๋ชฌ์ด ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ชจ๋‹ˆํ„ฐ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ œ์–ด ํ‰๋ฉด์ด **์ด์Šˆ ๋ธŒ๋žœ์น˜์˜ ๋ฏธ๊ฒ€ํ†  ์ฝ”๋“œ**๋กœ ๋ˆ๋‹ค. - ยง3 ๋ ˆ์‹œํ”ผ์— `MAM_NO_SUBSCRIBER_DAEMON=1`(#19 ์˜ตํŠธ์•„์›ƒ)์„ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค. - โš ๏ธ2 **resume**: - `--workspace $WT` ๋กœ ๋ถˆ๋Ÿฌ์•ผ ์›ŒํฌํŠธ๋ฆฌ ํ–‰๊ณผ ๋Œ€ํ™”๋ฅผ ์ฐพ๋Š”๋‹ค. `$MAIN` ์„ ์ฃผ๋ฉด ํ–‰์„ ์ฐพ์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ pane ์ด ๋ณธ ์ฒดํฌ์•„์›ƒ cwd ๋กœ ๋–  ๋Œ€ํ™” ํ‚ค๊ฐ€ ์–ด๊ธ‹๋‚œ๋‹ค. - **์›ŒํฌํŠธ๋ฆฌ๋ฅผ ์ง€์šฐ๋ฉด ๋Œ€ํ™”๋ฅผ ์žฌ๊ฐœํ•  ์ˆ˜ ์—†๋‹ค**(ํ‚ค๊ฐ€ ๊ฒฝ๋กœ๋‹ค). ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ์›ŒํฌํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. - ๋ฌธ์„œ ยง2-C ์˜ "๋๋‚˜๋ฉด ์ •์ง€(๋Œ€ํ™” ๋ณด์กด, ํ•„์š” ์‹œ ์žฌ๊ฐœ)" ์— "์žฌ๊ฐœํ•˜๋ ค๋ฉด ์›ŒํฌํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ์žฌ์ƒ์„ฑ" ์„ ๋ง๋ถ™์—ฌ์•ผ ํ•œ๋‹ค. - **pane ๋Ÿฐํƒ€์ž„ env** (ํ™•์ธ ๊ถŒ๊ณ ): - create ๋Š” herdr ์— `CMD_FULL` ๋งŒ ๋„˜๊ธด๋‹ค(`create_session.sh:219`). create ํ˜ธ์ถœ์ž๊ฐ€ export ํ•œ override ๊ฐ€ **์—์ด์ „ํŠธ ํ”„๋กœ์„ธ์Šค์˜ env** ์— ๋‚จ๋Š”์ง€๋Š” herdr ์„œ๋ฒ„ ๋™์ž‘์— ๋‹ฌ๋ ธ๋‹ค. - ๋‚จ์ง€ ์•Š์œผ๋ฉด creator ๊ฐ€ ์›ŒํฌํŠธ๋ฆฌ์—์„œ `bash .agents/skills/โ€ฆ` ๋กœ ๋ถ€๋ฅด๋Š” ์Šคํ‚ฌ์€ **์›ŒํฌํŠธ๋ฆฌ์˜ `.mam`** ์„ ์ œ์–ด ํ‰๋ฉด์œผ๋กœ ์“ด๋‹ค(`lib.sh:26`). - ๋ธŒ๋ฆฌํ”„์— "์›ŒํฌํŠธ๋ฆฌ์—์„œ ์ œ์–ด ํ‰๋ฉด ์Šคํ‚ฌ์„ ์‹คํ–‰ํ•˜์ง€ ๋ง ๊ฒƒ" ์„ ๋„ฃ๊ฑฐ๋‚˜, `CMD_FULL` ์„ `env WORKSPACE_ROOT=โ€ฆ MAM_JOBS_DIR=โ€ฆ` ๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค. ## 2. ยง6-Q1 ยท ๋ธŒ๋ฆฌํ”„ (5) โ€” ๋‘ ๋ฌธ์ œ์˜ ํ•ด์†Œ์™€ ๋†“์นœ ๊ฒฝ๋กœ - **์ฒดํฌ์•„์›ƒ ์ „ํ™˜ ์‚ฌ๊ณ **: ์ปค๋ฐ‹ํ•˜๋Š” ์ฃผ์ฒด(creator, ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ)๊ฐ€ ๋ชจ๋‘ ์›ŒํฌํŠธ๋ฆฌ์—์„œ ์ปค๋ฐ‹ํ•˜๋ฏ€๋กœ **ํ•ด์†Œ๋œ๋‹ค**. - ๋‹ค๋งŒ ๋ณธ ์ฒดํฌ์•„์›ƒ์—์„œ ๋ˆ„๊ตฌ๋“  `git checkout` ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์€ ๊ทธ๋Œ€๋กœ๋‹ค. - ์‹ธ๊ณ  ์ง๊ตํ•˜๋Š” ๋ฐฉ์–ด๋กœ **๋ณธ ์ฒดํฌ์•„์›ƒ ์ปค๋ฐ‹ ๊ฐ€๋“œ**๋ฅผ ํ•จ๊ป˜ ๊ถŒํ•œ๋‹ค: `pre-commit` hook ์ด `git branch --show-current` ๋ฅผ ํ™•์ธํ•ด ๊ฑฐ๋ถ€ํ•œ๋‹ค. - **๋ณ‘๋ ฌ์„ฑ**: ๋ฃจํ”„ lock ์ด ๊ฐ™์€ `.mam` ์—์„œ ๋‘ ๋ฒˆ์งธ ๋ฃจํ”„๋ฅผ **exit 1 ๋กœ ๊ฑฐ๋ถ€**ํ•œ๋‹ค(`run_loop.sh:144`, `:189-203`, loop SKILL.md `:235`). - ๋”ฐ๋ผ์„œ C ์•ˆ์˜ 1๋‹จ๊ณ„ ๋ณ‘๋ ฌ์€ ๋‹ค์Œ ํ˜•ํƒœ๋ฟ์ด๋‹ค: **creator ๊ตฌํ˜„์€ ๋ฃจํ”„ ๋ฐ–(delegate-job direct ๋‚˜ ๋Œ€ํ™”)์—์„œ ๋ณ‘๋ ฌ๋กœ, ๋ฆฌ๋ทฐ ๋ฃจํ”„๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜**. - ยง4 ์™€ ยง6-Q4 ์— ์ด ์šด์˜ ํ˜•ํƒœ๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. - **๋†“์นœ ์‹คํŒจ ๊ฒฝ๋กœ**: 1. **๋ฆฌ๋ทฐ์–ด๊ฐ€ creator ์˜ ์‚ด์•„ ์žˆ๋Š” ์›ŒํฌํŠธ๋ฆฌ์—์„œ ๊ฒ€์ฆ**ํ•œ๋‹ค(ยง2-C "๊ทธ ๊ฒฝ๋กœ์—์„œ `git diff`ยทํ…Œ์ŠคํŠธ"). - creator ๊ฐ€ ๋ฆฌ๋ทฐ ์ค‘์— ์ปค๋ฐ‹ยทํŽธ์ง‘ํ•˜๋ฉด ๊ฒ€์ฆ ๋Œ€์ƒ์ด ๋ฐ”๋€๋‹ค. #18ยท#19 ์—์„œ ๋ฆฌ๋ทฐ ์ค‘ HEAD ์ด๋™์ด ์„ธ ๋ฒˆ ์žˆ์—ˆ๋‹ค. - ๋ฆฌ๋ทฐ์–ด์˜ ํ…Œ์ŠคํŠธ ์‚ฐ์ถœ๋ฌผ์ด creator ํŠธ๋ฆฌ์— ๋‚จ๋Š”๋‹ค. - โ†’ ๋ฆฌ๋ทฐ๋งˆ๋‹ค **detached ์›ŒํฌํŠธ๋ฆฌ**(`git worktree add --detach "$TMP/review-" `, ๋ฆฌ๋ทฐ ๋’ค ์ œ๊ฑฐ)๋กœ ๊ฒ€์ฆ ๋Œ€์ƒ์„ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค ๊ฒƒ์„ ๊ถŒํ•œ๋‹ค. ์ƒˆ ์—์ด์ „ํŠธ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š” ์—†๋Š” C ์•ˆ์˜ ๋ณด๊ฐ•์ด๋‹ค. 2. **ยง3 ์˜ `.venv` symlink ๊ฐ€ git ์—์„œ ๋ฌด์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค.** ์‹คํ—˜(์ž„์‹œ ์ €์žฅ์†Œ, `.gitignore` ์— `.venv/`): symlink `.venv` ๋Š” `?? .venv` ๋กœ ๋ณด์ธ๋‹ค. ๋””๋ ‰ํ„ฐ๋ฆฌ ์ „์šฉ ํŒจํ„ด์€ symlink ์— ๋งž์ง€ ์•Š๋Š”๋‹ค. - ๊ทธ๋ž˜์„œ creator ์˜ `git add -A` ๊ฐ€ symlink ๋ฅผ ์ปค๋ฐ‹ํ•œ๋‹ค. - ๋˜ ์ €์žฅ์†Œ `.gitignore` ์— `.pytest_cache` ๊ฐ€ ์—†์–ด์„œ(`.gitignore:14-25` ์— `.mam/`ยท`.venv/`ยท`__pycache__/`ยท`.mam.env*` ๋งŒ ์žˆ์Œ), `-p no:cacheprovider` ์—†์ด ๋Œ๋ฆฐ pytest ๋„ ์‚ฐ์ถœ๋ฌผ์„ ๋‚จ๊ธด๋‹ค. - โ†’ ์›ŒํฌํŠธ๋ฆฌ์˜ `.git/info/exclude` ์— `/.venv`ยท`.pytest_cache/` ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์„ ์ค€๋น„ ํ—ฌํผ(ยง5-3)์— ํฌํ•จํ•œ๋‹ค. 3. **์›ŒํฌํŠธ๋ฆฌ ๋ชจ๋‹ˆํ„ฐ ๋ฐ๋ชฌ**(ยง1 โš ๏ธ1). 4. **์›ŒํฌํŠธ๋ฆฌ ์‚ญ์ œ ๋’ค ๋‚จ๋Š” yaml ํ–‰**: herdr ๊ฐ€ ์ฃฝ์œผ๋ฉด reconcile ์ด drift A ๋กœ `terminated` ํ‘œ๊ธฐํ•œ๋‹ค(`reconcile.sh:581-600`). ํ–‰์€ ๋‚จ์ง€๋งŒ ๋Œ€ํ™”๋Š” ์žฌ๊ฐœํ•  ์ˆ˜ ์—†๋‹ค. โ†’ ํ•ด์ฒด ์ˆœ์„œ๋ฅผ ๋ฌธ์„œํ™”ํ•œ๋‹ค: **stop โ†’ (์žฌ๊ฐœ ๋ถˆํ•„์š” ํ™•์ธ) โ†’ ์›ŒํฌํŠธ๋ฆฌ ์ œ๊ฑฐ**. 5. **ํ† ํ”ฝ ์ง€๋ฌธยทHMAC**: ๋ฌธ์ œ์—†๋‹ค. - ์žก ํ† ํ”ฝ์€ ๋ ˆ์ฝ”๋“œ์˜ `topic_prefix`(`python/mqtt/jobs/`, `mqtt_common.py:137`, `:351`)์ด๊ณ , HMAC ์€ ์žก ๋ ˆ์ฝ”๋“œ์˜ `auth_token` ์ด๋‹ค. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ฒฝ๋กœ๋งŒ ๋งž์œผ๋ฉด(ยง3) ์›ŒํฌํŠธ๋ฆฌ์™€ ๋ฌด๊ด€ํ•˜๋‹ค. - ์ง€๋ฌธ์€ **๋ชจ๋‹ˆํ„ฐ ๊ตฌ๋…**์—๋งŒ ์“ฐ์ธ๋‹ค(`reconcile.sh:288-291`). ์ œ์–ด ํ‰๋ฉด์ด ํ•˜๋‚˜๋ฉด ์ง€๋ฌธ๋„ ํ•˜๋‚˜๋‹ค. - ๋ฌธ์„œ ยง1 ํ‘œ์˜ ํ•ด๋‹น ํ–‰์— ์ด ์ ์„ ์ ์–ด ๋‘˜ ๊ฒƒ. 6. (๋ถ€์ˆ˜) ๋Ÿฌ๋„ˆ๋Š” ๋ฆฌํฌํŠธ๋ฅผ `workspace_root/.agents/reports/โ€ฆ` ๋กœ ๋ณด๊ด€ํ•œ๋‹ค(`runner.py:554`, `:770-780`). C ์•ˆ์—์„œ๋Š” ๋ณธ ์ฒดํฌ์•„์›ƒ, ์ฆ‰ `main` ํŠธ๋ฆฌ๋กœ ๊ฐ„๋‹ค. ์ด์Šˆ ๋ธŒ๋žœ์น˜๋กœ ๋ณด๋‚ผ์ง€ ์ •ํ•ด์•ผ ํ•œ๋‹ค. ## 3. ๋ธŒ๋ฆฌํ”„ (2) โ€” ์ฃผ์ž… ๋ฌธ๊ตฌ์˜ ์ƒ๋Œ€๊ฒฝ๋กœ (ยง5-1) - **๋™์˜, ๊ทธ๋ฆฌ๊ณ  ๋ฒ”์œ„๊ฐ€ ๋” ๋„“๋‹ค.** ๋ž˜ํผ๊ฐ€ ์—์ด์ „ํŠธ์— ์ฃผ๋Š” ์„ธ ๊ฒฝ๋กœ๊ฐ€ ๋ชจ๋‘ cwd ์ƒ๋Œ€๋‹ค. | ๋ฌธ์ž์—ด | ์œ„์น˜ | ์›ŒํฌํŠธ๋ฆฌ cwd creator ์—๊ฒŒ | |---|---|---| | ๋ธŒ๋ฆฌํ”„ `.mam/jobs/$JOB_ID/brief.md` | ๋ž˜ํผ `:199`, `:455` | ์—†์Œ(๋ฌธ์„œ๊ฐ€ ์งš์€ ๋ถ€๋ถ„) | | ๋ฐœํ–‰ ๋ช…๋ น `--registry-dir $REGISTRY_DIR`(๊ธฐ๋ณธ `.mam/jobs`, `:71`) | `:198`, `:454` | `$WT/.mam/jobs` ๋กœ ํ•ด์„๋œ๋‹ค โ†’ `job record not found`, rc 1. heartbeat ํƒ€์ด๋จธ๋„ ์ƒ๋Œ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌยทcwd ๋กœ ๋œฌ๋‹ค. **`started` ๊ฐ€ ์•ˆ ๋‚˜๊ฐ€๋ฏ€๋กœ T ๋’ค `agent_blocked` ๋กœ ๋‹ซํžŒ๋‹ค** | | Output Report Path `.mam/jobs/$JOB_ID/โ€ฆ/report-final.md` | `:178`, `:352` | ๋ฆฌํฌํŠธ๊ฐ€ `$WT/.mam/โ€ฆ` ์— ์“ฐ์ธ๋‹ค. ๋Ÿฌ๋„ˆ์˜ `find_report`(`runner.py:389-395`, ๋ณธ ์ฒดํฌ์•„์›ƒ `.mam`)๊ฐ€ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค | - ๋ž˜ํผ๊ฐ€ `MAM_JOBS_DIR` ์„ ๋ณด์ง€ ์•Š์œผ๋ฏ€๋กœ env override ๋กœ๋Š” ํ’€๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. - โ†’ ยง5-1 ์„ "`REGISTRY_DIR` ์„ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์ •๊ทœํ™”ํ•˜๊ณ , ๋ธŒ๋ฆฌํ”„ยท๋ฐœํ–‰ ๋ช…๋ นยท๋ฆฌํฌํŠธ ๊ฒฝ๋กœ ์„ธ ๊ณณ ๋ชจ๋‘ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ" ๋กœ ๊ณ ์น˜๊ณ , **์ฒซ C ์•ˆ ์ ์šฉ ์ „ ํ•„์ˆ˜**๋กœ ํ‘œ์‹œํ•œ๋‹ค. ## 4. ๋ธŒ๋ฆฌํ”„ (3)ยท(4) โ€” ๋Ÿฌ๋„ˆ diffยท`base_commit`, `.mam` ๊ฒฝํ•ฉ - **(3) ๋™์˜**: - `collect_changes_diff` ๋Š” `workspace_root` ์˜ ์Šคํฌ๋ฆฝํŠธ์™€ cwd ๋ฅผ ์“ด๋‹ค(`runner.py:397-411`). - `base_commit` ์€ `workspace_root` ์˜ `HEAD` ๋‹ค(`:564-565`). ๋ณธ ์ฒดํฌ์•„์›ƒ์ด `main` ์ด๋ฉด diff ๋Š” ๋น„๊ณ  base ๋Š” `main` ์ด๋‹ค. ์ด๋ฒˆ #18 ๋ธŒ๋ฆฌํ”„๋“ค์˜ "(no changes since base commit)" ๊ณผ ๊ฐ™์€ ์ฆ์ƒ์ด๋‹ค. - ยง5-2 ์˜ `--worktree` ๋Š” ๋‹ค์Œ์„ ์ •ํ™•ํžˆ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค: **๋ฐ”๋€Œ๋Š” ๊ฒƒ**์€ diff ์ˆ˜์ง‘ ๊ฒฝ๋กœ, `base_commit`(์›ŒํฌํŠธ๋ฆฌ์—์„œ `git merge-base main HEAD`), ๋ธŒ๋ฆฌํ”„์— ๋„ฃ๋Š” ๊ฒฝ๋กœยทbaseยทhead ๋ฟ์ด๋‹ค. **๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ**์€ wrapper ๊ฒฝ๋กœ(`:288`), ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ, ์ฒดํฌํฌ์ธํŠธ(`:60`), ๋ฆฌํฌํŠธ ๋ณด๊ด€์ด๋ฉฐ ๋ณธ ์ฒดํฌ์•„์›ƒ์˜ ๊ฒƒ์„ ์“ด๋‹ค. - **(4) ๋ณด์™„**: - ๋ฌธ์„œ ยง4 ๋Š” "๋™์‹œ ๋ฃจํ”„ ๊ธˆ์ง€" ๋ฅผ ๊ฒฝ๊ณ ๋กœ ์„œ์ˆ ํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” lock ์ด **๊ฑฐ๋ถ€**ํ•œ๋‹ค(`run_loop.sh:189-203`). ์ฒดํฌํฌ์ธํŠธ๋„ ํŒŒ์ผ ํ•˜๋‚˜๋‹ค(`runner.py:60`). - ์„ธ์…˜ DB ๋Š” SQLite ์ฝ๊ธฐ์ด๊ณ  `timeout=10`(`runner.py:199-203`)์ด๋‹ค. ์“ฐ๊ธฐ ๊ฒฝํ•ฉ์€ yaml ์˜ `atomic_dump_yaml`(flock) ์ชฝ์ด๋‹ค. - ๋ฆฌ๋ทฐ์–ด busy ๋Š” rc 5 โ†’ `MAM_SESSION_BUSY_RETRY_S`(๊ธฐ๋ณธ 30) ๋’ค 1ํšŒ ์žฌ์‹œ๋„(`runner.py:312-322`) โ†’ ์‹คํŒจ๋กœ ์ด์–ด์ง„๋‹ค. ๋ฃจํ”„ ๋‘˜์ด ๊ฐ™์€ ๋ฆฌ๋ทฐ์–ด๋ฅผ ๋‘๊ณ  ๋‹คํˆฌ๋ฉด ํ•œ์ชฝ์ด ์‹คํŒจํ•œ๋‹ค. - **๊ฒฐ๋ก **: 1๋‹จ๊ณ„๋ฅผ "๋ฆฌ๋ทฐ ๋ฃจํ”„๋Š” ํ•˜๋‚˜์”ฉ, creator ๊ตฌํ˜„๋งŒ ๋ณ‘๋ ฌ" ๋กœ ์‹œ์ž‘ํ•˜๋ฉด ยง5-4 ๋Š” ํ•„์š” ์—†๋‹ค. ๋ฃจํ”„ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋™์‹œ์— ๋Œ๋ฆฌ๋Š” ๊ฒƒ์€ ยง5-4(๋ฃจํ”„ id ๋ณ„ markerยท์ฒดํฌํฌ์ธํŠธ, ๋ฆฌ๋ทฐ์–ด ๋Œ€๊ธฐ ํ)๋ฅผ ๋๋‚ธ ๋’ค๋กœ ๋ฏธ๋ฃฌ๋‹ค. ## 5. ยง6-Q3 ยท ๋ธŒ๋ฆฌํ”„ (6) โ€” A/B/C ํ‰๊ฐ€ - **๋™์˜**: - A ์˜ ๋น„์šฉ(์—์ด์ „ํŠธ ์ˆ˜ยทํ† ํฐ ํ•œ๋„๊ฐ€ ์ด์Šˆ ์ˆ˜์— ๋น„๋ก€, ๋ฌธ๋งฅ ์ดˆ๊ธฐํ™”, ๊ด€์ธก ๋ถ„์‚ฐ) ํ‰๊ฐ€๋Š” ํƒ€๋‹นํ•˜๋‹ค. - B ๋Š” creator ๊ฐ€ ์—ฌ์ „ํžˆ ๋ณธ ์ฒดํฌ์•„์›ƒ์—์„œ ๋ธŒ๋žœ์น˜๋ฅผ ์˜ฎ๊ธฐ๋ฏ€๋กœ #18 ์œ ํ˜•์ด ๋‚จ๋Š”๋‹ค๋Š” ํŒ๋‹จ์ด ์˜ณ๋‹ค. - C ๊ฐ€ ์“ฐ๋Š” ์ชฝ๋งŒ ๊ฒฉ๋ฆฌํ•˜๋Š” ์ตœ์†Œ ๋ณ€๊ฒฝ์ด๋‹ค. - **๋Œ€์•ˆยท๋ณด๊ฐ• 2๊ฑด**: 1. **๋ณธ ์ฒดํฌ์•„์›ƒ ์ปค๋ฐ‹ ๊ฐ€๋“œ**(`pre-commit` hook ๋˜๋Š” ์ปค๋ฐ‹ ๋ช…๋ น ๋ž˜ํผ์˜ `git branch --show-current` ํ™•์ธ). ๋ฌธ์ œ 2 ๋ฅผ C ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ง‰๋Š” ๊ฐ€์žฅ ์‹ผ ๋ฐฉ์–ด๋‹ค. C ์ฑ„ํƒ๊ณผ ํ•จ๊ป˜ ๋„์ž…ํ•  ๊ฒƒ. 2. **๋ฆฌ๋ทฐ๋งˆ๋‹ค detached ์›ŒํฌํŠธ๋ฆฌ**(ยง2-1). ๋ฆฌ๋ทฐ์–ด ํ’€์€ ๊ณต์œ ํ•˜๋˜ ๊ฒ€์ฆ ๋Œ€์ƒ์€ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ ๋‹ค. A ์˜ ๊ฒฉ๋ฆฌ ์ด์ ์„ ์—์ด์ „ํŠธ ์ฆ์„ค ์—†์ด ์–ป๋Š”๋‹ค. ## 6. ยง6-Q4 ยท ยง6-Q5 โ€” ยง5 ์ž‘์—… ํ•ญ๋ชฉ๊ณผ #17 ํ•ญ๋ชฉ 4 ์ˆœ์„œ - **ยง5 ์ˆ˜์ • ์ œ์•ˆ**: - ยง5-1: ๋ฒ”์œ„ ํ™•๋Œ€(ยง3). ์ฒซ ์ ์šฉ ์ „ ํ•„์ˆ˜. - ยง5-2: `--worktree` ์˜ ์˜ํ–ฅ ๋ฒ”์œ„ ๋ช…์‹œ(ยง4). ์ฒซ ์ ์šฉ ์ „ ํ•„์ˆ˜. - ยง5-3: ์ค€๋น„ ํ—ฌํผ์— ๋‹ค์Œ์„ ํฌํ•จํ•œ๋‹ค. - `MAM_NO_SUBSCRIBER_DAEMON=1` - `.git/info/exclude`(`/.venv`, `.pytest_cache/`) - `--herdr-session <๋ณธ ์„œ๋ฒ„>` ๊ณ ์ • - `.mam.env` ๋Š” ์›ŒํฌํŠธ๋ฆฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์“ธ ๋•Œ๋งŒ ํ•„์š”(๋ž˜ํผยท`mqtt_common` ์€ ์Šคํฌ๋ฆฝํŠธ ์œ„์น˜ ๊ธฐ์ค€์œผ๋กœ ์ฐพ๋Š”๋‹ค: ๋ž˜ํผ `:20-24`, `mqtt_common.py:54-65`) - ยง5-4: ๋ณด๋ฅ˜ํ•ด๋„ ๋œ๋‹ค(ยง4). - **์ถ”๊ฐ€**: - ยง5-6: ์›ŒํฌํŠธ๋ฆฌ creator ์˜ stopยทresume ๋ ˆ์‹œํ”ผ์™€ ํ•ด์ฒด ์ˆœ์„œ(resume ์€ `--workspace $WT`, ์‚ญ์ œ ์ „ stop). - ยง5-7: ๋ฆฌ๋ทฐ์–ด detached ์›ŒํฌํŠธ๋ฆฌ ๊ทœ์•ฝ. - ยง5-8: ๋ณธ ์ฒดํฌ์•„์›ƒ ์ปค๋ฐ‹ ๊ฐ€๋“œ. - **ยง6-Q5 (์กฐ๊ฑด๋ถ€ ๋™์˜)**: - ์ด ๋ชจ๋ธ์„ ๋ฌธ์„œยท๋ ˆ์‹œํ”ผ๋กœ ๋จผ์ € ๊ตณํžˆ๊ณ  #17 ํ•ญ๋ชฉ 4(์…ธ ๊ณ„์ธต ์ถ•์†Œ)์—์„œ ์ฝ”๋“œ๋กœ ํก์ˆ˜ํ•˜๋Š” ์ˆœ์„œ๊ฐ€ ๋งž๋‹ค. - ๋‹จ ยง5-1(๋ž˜ํผ ๊ฒฝ๋กœ)๊ณผ ยง5-2(๋Ÿฌ๋„ˆ ์˜ต์…˜)๋Š” ์ž‘์€ ๋ณ€๊ฒฝ์ด๊ณ  **์—†์œผ๋ฉด C ์•ˆ์ด ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ** ์ง€๊ธˆ ํ•œ๋‹ค. ํ•ญ๋ชฉ 4 ๊ฐ€ ๋ž˜ํผ๋ฅผ `lib_py` ๋กœ ์˜ฎ๊ธธ ๋•Œ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋œ๋‹ค. - ํ—ฌํผ(ยง5-3)์™€ ํ์ž‰(ยง5-4)์€ ํ•ญ๋ชฉ 4 ์•ˆ์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ํŽธ์ด ์ค‘๋ณต์„ ์ค„์ธ๋‹ค. ## 7. ๋ฌธ์„œ ์ˆ˜์ • ์ง€์  (์ ˆยท๋ฌธ์žฅ) - **ยง1 ํ‘œ** "๋ชจ๋‹ˆํ„ฐ ํ† ํ”ฝ ์ง€๋ฌธ" ํ–‰: "(๋ชจ๋‹ˆํ„ฐ ๊ตฌ๋…์—๋งŒ ์“ฐ์ธ๋‹ค. ์žก ํ† ํ”ฝยทHMAC ์€ ์žก ๋ ˆ์ฝ”๋“œ์˜ `topic_prefix`ยท`auth_token`)" ์„ ๋ง๋ถ™์ธ๋‹ค. - **ยง2-C** "creator = ์›ŒํฌํŠธ๋ฆฌ ์ „์šฉ ์ธ์Šคํ„ด์Šค โ€ฆ ๋๋‚˜๋ฉด ์ •์ง€(๋Œ€ํ™” ๋ณด์กด, ํ•„์š” ์‹œ ์žฌ๊ฐœ)" ์— "์žฌ๊ฐœ๋Š” ๊ฐ™์€ ์›ŒํฌํŠธ๋ฆฌ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค" ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. - **ยง2-C** "์ œ์–ด ํ‰๋ฉด = โ€ฆ": ๋ชจ๋‹ˆํ„ฐ ๋ฐ๋ชฌ ์˜ตํŠธ์•„์›ƒ๊ณผ, pane ๋Ÿฐํƒ€์ž„ env ์— override ๊ฐ€ ๋‚จ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. - **ยง2-C** "๋ฆฌ๋ทฐ์–ด ํ’€ = โ€ฆ": ๋ฆฌ๋ทฐ์–ด๋Š” creator ์˜ ์›ŒํฌํŠธ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ head sha ์˜ detached ์›ŒํฌํŠธ๋ฆฌ์—์„œ ๊ฒ€์ฆํ•œ๋‹ค๊ณ  ๊ณ ์นœ๋‹ค. - **ยง3 ๋ ˆ์‹œํ”ผ**: - `MAM_NO_SUBSCRIBER_DAEMON=1` ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. - `ln -s .venv` ์˜†์— `.git/info/exclude` ์ฒ˜๋ฆฌ๋ฅผ ์ ๋Š”๋‹ค. - stopยทresume ๋ช…๋ น ์˜ˆ์‹œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. - "์ฃผ์ž… ๋ฌธ๊ตฌ์˜ ์ƒ๋Œ€๊ฒฝ๋กœ โ€ฆ" ๋ฌธ์žฅ์„ ๋ฐœํ–‰ ๋ช…๋ น์˜ `--registry-dir` ์™€ Output Report Path ๊นŒ์ง€ ๋„“ํžŒ๋‹ค. - **ยง4** ์„ธ ๋ฒˆ์งธ ํ•ญ๋ชฉ: "๊ฒฝ๊ณ " ๋ฅผ "lock ์ด ๋‘ ๋ฒˆ์งธ ๋ฃจํ”„๋ฅผ ๊ฑฐ๋ถ€(`run_loop.sh:189-203`)" ๋กœ ๊ณ ์นœ๋‹ค. 1๋‹จ๊ณ„ ์šด์˜ ํ˜•ํƒœ(๊ตฌํ˜„ ๋ณ‘๋ ฌ, ๋ฆฌ๋ทฐ ๋ฃจํ”„ 1๊ฐœ)๋ฅผ ๋ช…์‹œํ•œ๋‹ค. - **ยง5**: 1ยท2ยท3 ์„ ์ˆ˜์ •ํ•˜๊ณ  6ยท7ยท8 ์„ ์ถ”๊ฐ€ํ•˜๋ฉฐ, 4 ๋Š” "๋ณด๋ฅ˜ ๊ฐ€๋Šฅ" ์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค(ยง6). ## 8. ์ข…ํ•ฉ - C ์•ˆ(์“ฐ๋Š” ์ชฝ๋งŒ ์›ŒํฌํŠธ๋ฆฌ, ์ฝ๋Š” ์ชฝ ๊ณต์œ , ์ œ์–ด ํ‰๋ฉด ํ•˜๋‚˜)์€ ๋‘ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์ด๋‹ค. - statusยทmonitorยทstop ์ด ํ–‰์˜ `pane.cwd` ์™€ ํ–‰๋ณ„ herdr ์„œ๋ฒ„๋ฅผ ์ด๋ฏธ ์กด์ค‘ํ•˜๋ฏ€๋กœ ํ˜„์žฌ ์ฝ”๋“œ์™€๋„ ๋Œ€์ฒด๋กœ ๋งž๋Š”๋‹ค. - ๋ณด๊ฐ•์ด ํ•„์š”ํ•œ ๊ณณ: - ์ฒซ ์ ์šฉ ์ „ ํ•„์ˆ˜: ๋ž˜ํผ ๊ฒฝ๋กœ 3์ข…์˜ ์ ˆ๋Œ€๊ฒฝ๋กœํ™”, ๋Ÿฌ๋„ˆ `--worktree` ๋ฒ”์œ„, ๋ชจ๋‹ˆํ„ฐ ๋ฐ๋ชฌ ์˜ตํŠธ์•„์›ƒ, `.venv` symlink exclude - ์šด์˜ ๊ทœ์•ฝ: resumeยทํ•ด์ฒด, ๋ฆฌ๋ทฐ์–ด detached ์›ŒํฌํŠธ๋ฆฌ, ์ปค๋ฐ‹ ๊ฐ€๋“œ - ๋ชจ๋‘ ๋ฌธ์„œ ๋ณด๊ฐ•๊ณผ ์ž‘์€ ์ฝ”๋“œ ๋ณ€๊ฒฝ์œผ๋กœ ํ•ด๊ฒฐ๋˜๋ฉฐ ์„ค๊ณ„๋ฅผ ๋’ค์ง‘์„ ๊ฒฐํ•จ์€ ์•„๋‹ˆ๋‹ค. [VERDICT: PASS]