[Bug] 2×K 그리드 워크스페이스 오버플로 시 후속 워크스페이스 패킹(Packing) 미적용 결함 #7

Closed
opened 2026-09-07 23:02:53 +00:00 by Godopu · 1 comment
Owner

1. 현상 (Phenomenon)

팀 리더 에이전트 6개를 생성하거나 복원(multi-agent-mux-create / multi-agent-mux-resume)했을 때, 원래 의도된 레이아웃은 2×2(최대 4개) 그리드 정책에 따라 **4 + 2 (총 2개의 워크스페이스)**로 배치되어야 합니다.
그러나 실제 런타임에서는 **4 + 1 + 1 (총 3개의 워크스페이스)**로 분산 배치되는 현상이 발생합니다. 4개 이후 추가되는 에이전트마다 새로운 herdr 워크스페이스가 1개씩 계속 생성되어 워크스페이스 리소스가 불필요하게 파편화됩니다.

2. 원인 분석 (Root Cause)

.agents/skills/lib.sh의 new-session 구현부(705~721행)에서 대상 CWD와 일치하는 워크스페이스(existing_ws)를 탐색할 때 다음과 같이 첫 번째 일치 항목만 취하고 루프를 탈출(break)합니다:

# lib.sh:712-718
matched_ws = ''
for p in panes:
    p_cwd = os.path.realpath(p.get('cwd', '')) if p.get('cwd') else ''
    if target_abs and p_cwd == target_abs and p.get('workspace_id'):
        matched_ws = p.get('workspace_id')
        break  # 문제의 원인
  • 에이전트 5번 생성 시: w38이 이미 4개 페인으로 가득 차 있으므로 lib_py.layout이 overflow를 반환하고, 새 워크스페이스 w39가 생성됩니다. (정상)
  • 에이전트 6번 생성 시: herdr pane list의 앞부분에 여전히 꽉 찬 w38의 페인들이 위치하므로, 탐색 코드가 w38을 먼저 발견하고 break합니다. 그 결과 w38의 4개 페인 상태를 기준으로 다시 overflow가 판정되어, 여유 공간(3칸)이 남아있는 w39를 검사하지 않은 채 세 번째 워크스페이스(w3C)를 새로 생성합니다.

3. 기대 동작 (Expected Behavior)

동일 CWD를 가진 워크스페이스 목록을 순회하며:

  1. 해당 워크스페이스의 페인 레이아웃이 4개 미만으로 여유가 있는 경우(split_dir가 right 또는 down), 해당 워크스페이스에 페인을 분할 배치(Packing).
  2. 매칭되는 모든 워크스페이스가 4개(2×2)로 꽉 차서 모두 overflow 판정을 받을 때만 herdr workspace create로 새로운 워크스페이스를 생성.
  3. 6개 에이전트 기준: 워크스페이스 1 (4개) + 워크스페이스 2 (2개) 로 총 2개의 워크스페이스만 생성되어야 함.

4. 대상 파일 및 검증 계획

  • 수정 대상: .agents/skills/lib.sh (new-session 처리부)
  • 회귀 검증: tests/test_layout.py 및 다중 세션 생성 테스트
### 1. 현상 (Phenomenon) 팀 리더 에이전트 6개를 생성하거나 복원(`multi-agent-mux-create` / `multi-agent-mux-resume`)했을 때, 원래 의도된 레이아웃은 2×2(최대 4개) 그리드 정책에 따라 **4 + 2 (총 2개의 워크스페이스)**로 배치되어야 합니다. 그러나 실제 런타임에서는 **4 + 1 + 1 (총 3개의 워크스페이스)**로 분산 배치되는 현상이 발생합니다. 4개 이후 추가되는 에이전트마다 새로운 herdr 워크스페이스가 1개씩 계속 생성되어 워크스페이스 리소스가 불필요하게 파편화됩니다. ### 2. 원인 분석 (Root Cause) `.agents/skills/lib.sh`의 `new-session` 구현부(705~721행)에서 대상 CWD와 일치하는 워크스페이스(`existing_ws`)를 탐색할 때 다음과 같이 첫 번째 일치 항목만 취하고 루프를 탈출(`break`)합니다: ```python # lib.sh:712-718 matched_ws = '' for p in panes: p_cwd = os.path.realpath(p.get('cwd', '')) if p.get('cwd') else '' if target_abs and p_cwd == target_abs and p.get('workspace_id'): matched_ws = p.get('workspace_id') break # 문제의 원인 ``` - **에이전트 5번 생성 시**: `w38`이 이미 4개 페인으로 가득 차 있으므로 `lib_py.layout`이 `overflow`를 반환하고, 새 워크스페이스 `w39`가 생성됩니다. (정상) - **에이전트 6번 생성 시**: `herdr pane list`의 앞부분에 여전히 꽉 찬 `w38`의 페인들이 위치하므로, 탐색 코드가 `w38`을 먼저 발견하고 `break`합니다. 그 결과 `w38`의 4개 페인 상태를 기준으로 다시 `overflow`가 판정되어, 여유 공간(3칸)이 남아있는 `w39`를 검사하지 않은 채 세 번째 워크스페이스(`w3C`)를 새로 생성합니다. ### 3. 기대 동작 (Expected Behavior) 동일 CWD를 가진 워크스페이스 목록을 순회하며: 1. 해당 워크스페이스의 페인 레이아웃이 4개 미만으로 여유가 있는 경우(`split_dir`가 `right` 또는 `down`), 해당 워크스페이스에 페인을 분할 배치(Packing). 2. 매칭되는 모든 워크스페이스가 4개(2×2)로 꽉 차서 모두 `overflow` 판정을 받을 때만 `herdr workspace create`로 새로운 워크스페이스를 생성. 3. 6개 에이전트 기준: **워크스페이스 1 (4개) + 워크스페이스 2 (2개)** 로 총 2개의 워크스페이스만 생성되어야 함. ### 4. 대상 파일 및 검증 계획 - 수정 대상: `.agents/skills/lib.sh` (`new-session` 처리부) - 회귀 검증: `tests/test_layout.py` 및 다중 세션 생성 테스트
Author
Owner

main 8e7282c 에 병합되어 해결되었습니다 (v4.4.4, 브랜치 fix/issue-12-8-7).

  • lib.sh new-session 이 같은 cwd 의 모든 후보 워크스페이스를 순회하며, 2×K 그리드에 여유가 있는 워크스페이스에 패킹합니다. 모두 가득 찼을 때만 새 워크스페이스를 만듭니다 (6개 에이전트 → 4+2).
  • 단일 워크스페이스 동작(idle pane 재사용, 첫 여유 워크스페이스 우선)은 이전과 동일합니다.
  • 테스트: tests/test_issue7_workspace_packing.py (5건).
  • 리뷰: claude·agy·grok·codex 4인 [VERDICT: PASS].
main `8e7282c` 에 병합되어 해결되었습니다 (v4.4.4, 브랜치 `fix/issue-12-8-7`). - `lib.sh` `new-session` 이 같은 cwd 의 모든 후보 워크스페이스를 순회하며, 2×K 그리드에 여유가 있는 워크스페이스에 패킹합니다. 모두 가득 찼을 때만 새 워크스페이스를 만듭니다 (6개 에이전트 → 4+2). - 단일 워크스페이스 동작(idle pane 재사용, 첫 여유 워크스페이스 우선)은 이전과 동일합니다. - 테스트: `tests/test_issue7_workspace_packing.py` (5건). - 리뷰: claude·agy·grok·codex 4인 `[VERDICT: PASS]`.
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: tmpl/multi-agent-mux#7