Review of0282312(planner-reviewer-claude-01, N1): conversation_in_use excluded the purge's whole ancestor lineage, and that lineage includes the agent CLI that launched the skill. An orchestrator purging its own UUID from its own session was therefore never refused - the only process naming the UUID was excluded, and claude keeps no transcript open for lsof - so its live conversation was deleted, contrary to what orc-onboard SKILL.md promises. - base.conversation_in_use: in use when one of the caller's session-id variables (CLAUDE_CODE_SESSION_ID, ANTIGRAVITY_CONVERSATION_ID, HERMES_SESSION_ID, GROK_SESSION_ID, OPENCODE_SESSION_ID) equals the uuid; the command-line check now excludes only the purge's own helper chain and stops at the nearest agent CLI ancestor (basename claude/agy/hermes/grok/ opencode/codex, read like detect_nearest_agent), which counts as a holder when it names the uuid; the lsof check is unchanged - tests: the non-agent helper chain is excluded but an agent ancestor is counted; the purge CLI is refused under an agent CLI naming the uuid and with each of the five session variables set to it; orc_onboard --remove --purge-conversation --yes is refused from the orchestrator's own session (exit 5, registration kept). The eight new cases fail on0282312- job_subscriber --registry-dir now defaults to default_registry_dir() like the other entry points (review R-d) - orc-onboard SKILL.md spells out how the calling session is recognised; VERSIONS.md v4.4.3 item 2 and the new-test count (24) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HCGpJXhSZasJLU38ksDghe
69 KiB
📜 Multi-Agent Mux 버전 이력 (VERSIONS.md)
이 문서는 multi-agent-mux 프레임워크의 버전별 주요 기능 추가, 아키텍처 개선, 버그 수정 및 품질 검증 이력을 기록합니다.
📌 현재 버전 개요 (Current Release)
- 프레임워크 버전:
v4.4.3 - 최신 릴리스 일시: 2026-09-13 (KST)
- 기준 브랜치:
main - 핵심 아키텍처:
- Terminal 상태 단방향 불변성 (
engine.py, Issue #6 Phase 1):completed,error,cancelled터미널 상태 진입 후 후속 이벤트나 업데이트에 의한 덮어쓰기를 엄격히 차단(Terminal Immutability).registry.py close서브커맨드 및 fail-closed 조기 종료 도입. - Herdr 턴 완료 핸드셰이크 (
lib.sh: wait_for_agent_idle, Issue #6 Phase 2): 위임 에이전트(claude,agy,hermes,codex등)의 프롬프트 전송 후 Herdr 뷰포트 및 프로세스 상태를 관측하여 비동기 턴 종료를 결정론적으로 대기하는 핸드셰이크 프로토콜 확립. - Loop 모드
attempt_id추적 및 안전 전이 (Issue #6 Phase 3): 워커/리뷰어 전환 시 동일 회차 내 재전이 충돌을 방지하는attempt_id규약 적용 및 4단계 fail-closedfinalize_unfinished보장. - 결정론적 종료 코드 계약 (Issue #6 Phase 4 & R1):
0(Success),1(Failure / Inject error),2(Subscriber timeout; 단, 에이전트가 Herdr에서 working 중이면 벽시계 --timeout까지 디스크 재관측 후 fail-close),3(Broker unavailable),5(Precondition failed / session_busy) 표준화. (send_keys_safe 헬퍼의 배달 실패/busy 타임아웃 rc=4는 래퍼 차원에서 rc=1 실패로 수용). - 4-Way 버전 락스텝:
lib.sh(MAM_VERSION) ↔lib_py/loop/eager.py(FRAMEWORK_VERSION) ↔VERSIONS.md↔ 8개SKILL.md.
- Terminal 상태 단방향 불변성 (
🧭 스킬 패키지 버전 매트릭스 (Skills Version Matrix)
모든 8개 스킬은 YAML frontmatter 메타데이터(author, version, platforms, environments) 표준화를 통해 v4.4.3로 동기화되어 배포됩니다.
| 스킬명 | 버전 | 역할 및 주요 책임 | 상태 |
|---|---|---|---|
multi-agent-mux-create |
4.4.3 |
에이전트 세션 신규 생성 및 Herdr 컨테이너 격리 스폰 | ✅ 배포 |
multi-agent-mux-stop |
4.4.3 |
대화 UUID 원자적 캡처 및 세션 안전 종료 (Graceful Stop) | ✅ 배포 |
multi-agent-mux-resume |
4.4.3 |
온디스크 대화 컨텍스트 기반 Tier-1 초고속 세션 복원 | ✅ 배포 |
multi-agent-mux-status |
4.4.3 |
실시간 Herdr 세션 및 레지스트리 드리프트 스냅샷 조회 | ✅ 배포 |
multi-agent-mux-monitor |
4.4.3 |
YAML ↔ 런타임 상태 간 자율 조정자 (Reconciler Loop) | ✅ 배포 |
multi-agent-mux-delegate-job |
4.4.3 |
MQTT 이벤트 채널 기반 비동기 단위 작업 위임 | ✅ 배포 |
multi-agent-mux-loop |
4.4.3 |
Planner-Creator-Reviewer 3자 자율 계획·실행·피어리뷰 루프 | ✅ 배포 |
multi-agent-mux-orc-onboard |
4.4.3 |
오케스트레이터 UUID 격리 등록 및 서브 세션 오염 방지 | ✅ 배포 |
📋 버전별 상세 변경 내역 (Changelog)
🚀 v4.4.3 — Issue #10·#13 대화 purge 완결, Issue #11 메시지 정정, Issue #15 레지스트리 워크스페이스 고정 (2026-09-13)
패치 마일스톤 (PATCH Release): agy 대화 purge 가 resume 가능한 부속 파일을 남기던 문제(Issue #10), herdr 세션 행이 없는 오케스트레이터 대화를 어떤 스킬로도 지울 수 없던 문제(Issue #13),
orc_onboard.sh --remove의 "removeed" 오타(Issue #11), 호출자 cwd 를 따라가던 잡 레지스트리·감사 로그 때문에 pytest 스위트가 실제.mam/jobs에 테스트 레코드를 남기던 문제(Issue #15)를 해결했다. 새 서브커맨드·옵션은 모두 추가 기능이다. 레지스트리·감사 로그의 기본 경로는WORKSPACE_ROOT가 있으면 cwd 대신 그 워크스페이스를 따르며, 명시적--registry-dir와MAM_JOBS_DIR/DELEGATE_JOB_LOGS_DIR는 그대로 우선한다.
🌟 주요 개선 사항
- agy purge 부속 파일 완결 (Issue #10,
lib_py/agents/adapters/agy.py):purge_artifacts가 대화 DB·brain/<uuid>에 더해 SQLite 부속 파일(-wal/-shm/-journal— DB 를 열 때마다 생기고 stop 경로의 ID 캡처도 이를 만들며, 체크포인트되지 않은 WAL 에는 대화 내용이 남을 수 있다), 제목 annotation(annotations/<uuid>.pbtxt), presence lock(presence/<uuid>.lock)까지 지운다. presence lock 은conversation_in_use가 거짓일 때만 지우고, 사용 중이면 남긴 채 경고한다. 새residual_artifacts()는~/.gemini/antigravity-cli아래에 그 uuid 를 이름에 가진 경로가 남아 있으면 보고한다. db+brain 만 있는 경우 2건을 돌려주는 어댑터 계약은 유지. - 오케스트레이터 대화 purge CLI (Issue #13,
python -m lib_py.agents purge <agent|auto> <uuid> [workspace]):orchestrator_uuids는 uuid 만 저장하므로 디스크에서 어댑터를 판별한다.auto는agy → claude → hermes → grok → codex → opencode순으로(opencode 는 모든 uuid 에 대해 존재하는 공유 DB 라 마지막) 각 어댑터의verify_artifact(revalidate 모드 — 오케스트레이터 대화는 워크스페이스 캐시에 없음)를 먼저, 그다음 uuid 가 들어간 artifact 경로의 존재를 확인한다. 살아 있는 프로세스가 그 uuid 를 참조하면 거부한다(base.conversation_in_use: ① 호출 환경의 세션 id —CLAUDE_CODE_SESSION_ID·ANTIGRAVITY_CONVERSATION_ID·HERMES_SESSION_ID·GROK_SESSION_ID·OPENCODE_SESSION_ID— 가 그 uuid 이면 사용 중, 즉 오케스트레이터가 자기 세션 안에서 자기 대화를 purge 하는 경우를 막는다(claude 는 transcript 를 열어 두지 않아 아래 두 검사로는 보이지 않는다). ② 프로세스 명령줄 검사에서 purge 자신의 헬퍼 사슬(python·셸·스크립트)만 빼되 가장 가까운 에이전트 CLI 조상에서 멈추고, 그 조상의 명령줄에 uuid 가 있으면 보유자로 센다. ③lsof로 artifact 점유 확인). 결과는 JSON 한 줄(agent·purged·residual·in_use)이며 종료 코드는 0 purge 완료 / 4 사용 중이라 거부(아무것도 삭제하지 않음) / 5 해당 uuid 의 artifact 없음. orc_onboard.sh --remove <uuid> --purge-conversation --yes [--agent <name>](Issue #13): 위 purge 를 레지스트리 갱신 전에 실행하므로 거부되면 등록이 바뀌지 않는다.--yes가 없으면 경고 후 exit 4, 대화가 사용 중이면 exit 5(등록 유지), 디스크에 대화가 없으면 경고 후 등록만 해제,--dry-run은 예정 작업만 출력,--purge-conversation은--remove와 함께일 때만 허용(exit 2). 성공 시 purge 된 경로와 잔여(residual) 검사 결과를 출력한다.orc_onboard.sh성공 메시지 과거형 (Issue #11):add/remove를added/removed로 명시 활용해 "Successfully removeed" 를 없앴다.- 잡 레지스트리·감사 로그의 워크스페이스 고정 (Issue #15,
mqtt_common.default_registry_dir·get_logs_dir): 기본 경로가MAM_JOBS_DIR/DELEGATE_JOB_LOGS_DIR→$WORKSPACE_ROOT/.mam/jobs·$WORKSPACE_ROOT/.mam/delegate_job_logs→ cwd 기준.mam/…순으로 정해진다.registry.py·publish_event.py·service.py와create_session.sh·stop_session.sh가 같은 순서를 쓴다. 저장소 루트에서 돈 pytest 스위트(기본 온보딩 잡을 등록하는create_session.sh)가 호출자 cwd 를 따라 실제.mam/jobs에 테스트 레코드 593건을 남기던 문제를 해소했고, 샌드박스 픽스처(tests/conftest.py)는 두 환경변수를 모두 고정한다.
✅ 품질 검증
- 신규 테스트 24개:
tests/test_issue10_13_purge.py17개(agy 부속 파일·annotation·lock 삭제, 사용 중 lock 보존, 존재한 것만 보고, 자기 계보를 뺀 in-use 판정, 비-에이전트 헬퍼 사슬만 제외하고 에이전트 CLI 조상은 검사, purge CLI 의 auto 판별·사용 중 거부·자기 에이전트 세션 안에서 거부·세션 id 환경변수 5종으로 거부·미해결 uuid,orc_onboardpurge 의--yes요구·삭제 후 등록 해제·사용 중 거부·오케스트레이터 자기 세션에서 거부·artifact 없음에도 등록 해제·--remove필수·dry-run 무변경),tests/test_issue15_registry_isolation.py7개(MAM_JOBS_DIR우선,WORKSPACE_ROOT추종, cwd 폴백, 로그 경로 동일 순서, CLI 기본값의 프로세스별 해석, 명시 env 로 온보딩 잡 샌드박스 유지,WORKSPACE_ROOT만으로도 샌드박스 유지). - 기존 테스트 조정: O-13(
tests/test_orc_onboard.py)이 정정된 메시지를 단정하고, R1 헬퍼·B-9 로그 경로 테스트와publish_event스냅샷(tests/test_issue5_phase1_delegation.py·tests/test_tier1_unit.py)이 워크스페이스 고정 계약에 맞게 조정됨. - 실측 (커밋
c82ea75·위임 브리프 기록): 전체 스위트 839/839 통과, 스위트 실행 전후 실제.mam/jobs레코드 881건 불변.
🚀 v4.4.2 — Issue #9 herdr 서버 환경 격리 및 Issue #14 프롬프트 전달 확인 보강 (2026-09-12)
패치 마일스톤 (PATCH Release): 에이전트 런타임(예: Claude Code 오케스트레이터) 안에서 herdr 서버가 처음 기동될 때 세션 식별 마커가 서버와 이후 모든 에이전트 pane 에 상속되던 문제(Issue #9)와,
working을 보고하지 않는 에이전트(herdr 0.9.0 의 codex)에게 정상 전달된 프롬프트를send_keys_safe가 실패로 오판해 잡을agent_blocked로 닫고 에이전트의started/completed를 거부하던 문제(Issue #14)를 해결했다. 신규 환경변수는 모두 기본값이 있는 추가 설정이며 공개 계약·종료 코드 변경은 없다.
🌟 주요 개선 사항
- herdr 서버 기동 env 마커 denylist (Issue #9,
lib.sh쉼): 쉼이herdr --session <name> server를 부트스트랩할 때 세션 식별 마커만 제거한 환경을 넘긴다 —CLAUDECODE,CLAUDE_CODE_CHILD_SESSION,CLAUDE_CODE_SESSION_ID,CLAUDE_CODE_SESSION_ATTENDED,CLAUDE_CODE_ENTRYPOINT,CLAUDE_PID,CLAUDE_CODE_MESSAGING_TOKEN,CLAUDE_CODE_MESSAGING_SOCKET,CLAUDE_CODE_BRIDGE_SESSION_ID,ANTIGRAVITY_CONVERSATION_ID,HERMES_SESSION_ID,GROK_SESSION_ID,OPENCODE_SESSION_ID.CLAUDE_PROJECT_DIR·CLAUDE_CONFIG_DIR등 사용자 설정은 그대로 상속된다. 상속된CLAUDE_CODE_CHILD_SESSION때문에 서브에이전트 claude 의 transcript 저장이 꺼져 resume 이 불가능하던 증상을 해소. - 조회 경로 자동 기동 금지
MAM_NO_AUTOSTART=1(Issue #9): 이 값이 설정되면 쉼은 서버를 띄우지 않고 호출만 전달한다.status.sh·reconcile.sh가 이를 export 하므로 read-onlymulti-agent-mux-status조회가 더 이상 서버 데몬을 기동하지 않는다. - 쉼
ls의 "no server running" 번역 (Issue #9): 서버가 내려가 있으면 쉼의ls가no server running (herdr session <name>)으로 보고하고,reconcile.sh는 이를 빈 서버로 판정해herdr_confirmed를 유지한다(파싱 실패로 모든 서버의 drift 감지가 멈추는 회귀 방지). 번역은agent list가 실패하고 그 오류 봉투(stderr·stdout 어느 쪽이든)의error.code가 정확히server_not_running일 때만 적용한다. 성공한 목록에 같은 문자열이 들어 있으면(예: 에이전트 이름server_not_running-codex) 번역하지 않으므로 살아 있는 서버가 빈 서버로 오판되어 drift A 로 전 세션이 종료 처리되지 않는다. 그 밖의 실패는 출력이 목록 파서에 닿기 전에 비-0 으로 끝나(… state unknown, reconcile 의 빈 서버 문구와 겹치지 않음) unknown(herdr_confirmed=False)으로 남는다 — stdout 으로 온 오류 문서도 더 이상 빈 목록으로 읽히지 않는다. - accepted 제출의 전달 확인
SKS_DELIVERY_GRACE_S(Issue #14,send_keys_safe):agent prompt --wait결과가timeout/agent_prompt_stalled이면 herdr 가 입력을 이미 수락한 것으로 보고,SKS_DELIVERY_GRACE_S(기본 15초) 동안agent_statusworking, 제출 전 화면에 없던 busy 토큰(esc to interrupt), 제출 전 스냅샷 대비 pane 변화 중 하나를 전달 확인 신호로 인정한다. 신호가 없으면 종전대로 rc 4 로 fail-closed 하고, 그 밖의 오류(transport_error등)는 accepted 로 취급하지 않는다. 단일 주입 계약(재전송 없음)은 유지된다. - 래퍼 레지스트리 ack 유예
MAM_INJECT_ACK_GRACE_S(Issue #14,multi-agent-mux-delegate-job):send_keys_safe가 전달을 확인하지 못해도 잡을agent_blocked로 닫기 전에MAM_INJECT_ACK_GRACE_S(기본 10초) 동안 레지스트리를 관측하고,pending이 아닌 상태(에이전트의started등)가 보이면 전달된 것으로 보고 진행한다(_inject_acknowledged). - R1 유예의 pane busy 토큰·디스크 heartbeat 인정 (Issue #14,
_agent_still_working,_recent_disk_heartbeat): 구독자 idle 타임아웃 후 R1 유예가 herdrworking외에 pane 최근 8줄의esc to interrupt토큰, 그리고 잡events.log의 최근 이벤트(publish_event가 와이어 발행 전에 로컬에 기록하는progressheartbeat — 브로커가 느리거나 죽어 있어도 발행·재시도를 기다리지 않고 즉시 디스크에 남는다. CLIpublish_event.py와DelegationService.publish_event모두record_local_event로 먼저 기록하고, 감사 로그의 발행 결과와 상태 동기화만 발행 뒤에 남긴다)도 작업 중 근거로 받아들인다. 유예에 들어가면IDLE_TIMEOUT창 하나가 열리고, 근거가 관측될 때마다 그 시점부터 창이 다시 열린다. 따라서 아무 근거도 없는 무응답 에이전트는 마지막 와이어 이벤트 후 약 2×IDLE_TIMEOUT에 닫히고(디스크 heartbeat 를 인정하기 전에는IDLE_TIMEOUT; Issue #6 수용 기준 "≤IDLE_TIMEOUT+5s 내error"는 "≤ 2×IDLE_TIMEOUT+ 여유"로 바뀐다), heartbeat 간격은 약 2×IDLE_TIMEOUT까지 허용된다(heartbeat 하나가IDLE_TIMEOUT만큼 오래될 때까지 근거로 인정되므로). 근거는 idle 창만 늘릴 뿐 벽시계는 늘리지 않는다: 루프는 매 반복 시계로 다시 읽은START_TIME + TIMEOUT에서 끝나고, herdr 관측 호출도 그 시각에 끊는다(_within_deadline).broker_unavailable디스크 재관측 루프도 같은 시계 기준이다. 이로써 idle 타임아웃보다 긴 codex 리뷰, heartbeat 간격이 한 번 idle 창을 넘긴 리뷰, 백그라운드 셸로 테스트를 돌려 herdr 에 idle 로 보이는 creator 가 턴 도중deadline_timeout으로 닫히고 이후completed가 거부되던 문제를 막는다.
✅ 품질 검증
- T1-7 트리거 변경 (
tests/test_issue6_fail_closed.py): 주입 실패 유발값을prompt_wait_result=timeout→transport_error로 변경(Issue #14 이후timeout은 accepted 제출이므로 더 이상 확정 실패가 아님)하고MAM_INJECT_ACK_GRACE_S=1로 대기를 단축. - 신규 테스트 21개:
tests/test_issue9_server_env.py9개(마커 제거,MAM_NO_AUTOSTART부트스트랩 생략·호출 전달, status 조회 무기동, 정적 opt-out,ls번역(최소·herdr 0.9 실제 오류 봉투·stdout 봉투), 성공 목록 속server_not_running문자열 비오판, 그 밖의 실패 unknown 유지(stderr·stdout), reconcile drift A 비발생, 다른 실패 시 reconcileherdr_confirmed=False),tests/test_issue14_delivery_ack.py12개(busy 토큰·pane 변화 확인, 무신호 fail-closed, 선행 busy 토큰 배제,transport_error비수용, mock herdr timeout 확인, 래퍼 레지스트리 ack, idle 타임아웃 pane busy 유예, idle 타임아웃 디스크 heartbeat 유예(publish_event실제 경로), heartbeat 가 이어져도 벽시계TIMEOUT안에서 종료, 와이어 발행 전 로컬 기록, 발행 실패·재시도에도 로컬 기록 1회). - 테스트 기대값 정정:
tests/test_a4_adapter_contract.py가4d444ce의 agyexit_key=/exit변경을 반영하도록 수정(그동안 전체 스위트에서 1건 실패하던 문제 해소). - 실측 (커밋
497633f기록): 새로 부트스트랩한 서버에 마커가 없고 claude pane 의 transcript 저장이 복구됨, codex 잡d04ebcb5의started/completed가agent_blocked없이 수락됨.
🚀 v4.4.1 — Issue #6 비동기 잡 위임 안정화 및 Fail-Closed / Turn Handshake 완결 (2026-09-08)
패치 마일스톤 (PATCH Release): Issue #6 비동기 잡 위임 파이프라인에서 발생하던 터미널 상태 덮어쓰기 레이스, Herdr 프롬프트 완료 관측 부재, Subscriber 타임아웃 시 pending 방치 버그를 근본 해결. 결정론적 종료 코드 계약(0, 1, 2, 3, 5) 및 4단계 fail-closed finalizer를 완비했다.
🌟 주요 개선 사항
- Terminal 상태 단방향 불변성: 터미널 상태(
completed,error,cancelled)에 도달한 잡에 대해 이후 도착하는 이벤트의 임의 상태 변경을 원천 차단.registry.py close서브커맨드로 비정상 중단 시 단방향 종료 처리 보장. - Herdr 턴 완료 핸드셰이크 (
lib.sh: wait_for_agent_idle,watcher.py):wait_for_agent_idle을 통해 에이전트 프롬프트 전송 전후 유휴 상태를 확인하고, 턴이 완전히 완료되어 입력 대기 상태로 복귀할 때까지 신뢰성 있게 추적. - Loop 모드
attempt_id전이 격리: 동일 iteration 내에서 워커→리뷰어 전환 시attempt_id를 갱신하여 CAS 재전이 충돌(rc=4)을 구조적으로 방지. - Subscriber 비정상 종료 시 Fail-Closed 및 R1 Working 회복력 보장: 구독기 프로세스가 타임아웃되더라도 에이전트가 Herdr에서 여전히 작업 중(
working)이면 벽시계--timeout까지 유예하며 디스크 완료 상태를 재관측(R1)하고, 미종료 잡을 안전하게error로 완결. - 결정론적 종료 코드 계약:
multi-agent-mux-delegate-job종료 코드를 정규화(0=성공,1=실패/주입 오류,2=구독기 타임아웃,3=브로커 장애,5=세션 선결 조건 미충족/session_busy).
🚀 v4.4.0 — Issue #5 Python 코어 마이그레이션 완결 및 main 병합 (2026-09-07)
주요 마일스톤 (MINOR Release): Issue #5 Phase 1~4 전 단계 완료 및
refactor→main병합. 위임·루프 오케스트레이션의 구현 언어를 Bash에서 Python으로 옮기고, CAS 단일 상태 전이·섀도우 와처·자동 완료 게이트·Eager Import 불변 런타임을 도입했다. 공개 계약(스크립트 경로, CLI 인자·종료 코드, 이벤트 와이어 스키마schema_version=1, YAML 레이아웃)은 한 건도 제거·변경되지 않았으며, 모든 기본 동작 변경은 환경변수 한 개로 즉시 되돌릴 수 있다.
⚖️ SemVer 판정 근거 (MINOR — v4.4.0, MAJOR v5.0.0 미채택)
SemVer 2.0.0 §8은 MAJOR를 하위 호환을 깨는 공개 API 변경에 한정한다. 본 릴리스는 규모는 크지만 그 조건을 충족하지 않는다.
| 판정 축 | 관측 사실 | 근거 |
|---|---|---|
| 공개 계약 제거/이동 | Issue #5 전 구간에서 삭제·rename 파일 0건 | git diff --name-status fc0bd96..HEAD |
| 와이어 스키마 | SCHEMA_VERSION = 1 불변 |
mqtt_common.py:135 |
| 스크립트 리터럴 경로 | scripts/*.py 4종 전부 존속 (호환 shim) |
Phase 1 D2 |
| CLI 인자·종료 코드 | run_loop.sh·publish_event·job_subscriber 계약 회귀 통과 |
G-1~G-9 |
| 기본 동작 변경의 가역성 | MAM_DELEGATION_PY=0 / MAM_ENGINE_CAS=0 / MAM_LOOP_PY=0 / MAM_LOOP_FREEZE=1 로 이전 동작 완전 복원 (레거시 본체 존치, 968줄 셸 루프 포함) |
test_issue5_phase3_loop.py, test_issue5_phase4_runtime.py |
| 최고위험 신규 기능 | 자동 완료는 기본 비활성 옵트인 | MAM_AUTO_COMPLETE 기본값 0 |
운영자 조치 필요 사항 없음: 마이그레이션 절차, 설정 변환, 재배포가 요구되지 않는다. 이것이 MAJOR를 채택하지 않은 결정적 이유다. 다만
MAM_VERSION불일치는 새로 fail-closed 거부되므로, 프레임워크 트리는 부분 갱신하지 말고 통째로 배포해야 한다(§ 아래 주의).
🌟 신규 기능 및 아키텍처 확장
- Phase 1 —
lib_py.delegation패키지 추출:v4.3.0에서 선행 완료(하단 항목 참조). - Phase 2a — CAS 단일 상태 전이 엔진 및 섀도우 와처: 잡 레코드 전이를
claim/redispatch시점에 발급되는 불투명dispatch_token을 선결 조건으로 하는 compare-and-set으로 결속. 관측 증거 수집(attribution.py)·판정 정책(policy.py)·증거 저장소(store.py)를 분리하고,shadow.py가 실제 전이 없이 "Would-Complete" 판정만 기록한다. - Phase 2b — 자동 완료 게이트 (
autocomplete.py): 섀도우 증거가 충분할 때에만 잡을 자동 종결하는 평가기.MAM_AUTO_COMPLETE(기본0),MAM_AUTO_COMPLETE_BACKENDS로 백엔드 단위 옵트인. CAS가 롤백된 상태(MAM_ENGINE_CAS=0)에서는 스스로 비활성화한다. - Phase 2b — 내구성 있는 보류 알림 (
notifier.py): 알림 의도를 잡 레코드에 저장하고 CAS 락 바깥에서 발행한 뒤notification_settled부기 요청으로 조건부 정산. 재시도는 새 와이어 시퀀스를 받으므로 단조 시퀀스 가드로는 중복을 식별할 수 없고, 안정적인(seq, event, timestamp)의도 신원으로 중복을 판별한다. - Phase 3 —
run_loop.sh얇은 래퍼 전환 및lib_py.loop승격: 936줄 Bash 오케스트레이션을 단일 제어 구조의 Python 모듈로 이식.run_loop.sh는 CLI 계약과 기존 정적 검사 앵커를 보존하는 래퍼가 되었고,MAM_LOOP_PY=0으로 레거시 셸 루프를 그대로 실행할 수 있다. - Phase 3 — Strict 판정 파서 (
parser.py): 마크다운 코드 펜스(```,~~~) 내부를 제거한 뒤 마지막 비공백 라인만을 판정으로 인정한다. 리포트 본문의 예시 코드에 적힌[VERDICT: PASS]가 실제 판정으로 오인되던 결함(baseline.mdGap)을 해소했다. 판정 부재·PASS/NOT PASS모호 충돌·미지 태그는 모두 fail-closedNOT PASS. - Phase 3 — 원자적 체크포인트 및 우아한 정지 (
checkpoint.py):.mam/loop-checkpoint.json에 회차·활성 잡·계획·리뷰 상태·기준 커밋을 임시 파일 +replace원자 커밋으로 기록. SIGINT/SIGTERM 수신 시 서브프로세스를 정리하고 체크포인트를 남긴 뒤 가드를 해제하고 종료(130/143). - Phase 4 — Eager Import 불변 런타임 (
eager.py): 기동 최우선 단계에서 표준·프레임워크 코어 모듈 전량을sys.modules에 상주시켜, 루프 실행 중 디스크의.py가 편집되어도 런타임이 영향을 받지 않는다.PYTHONDONTWRITEBYTECODE=1로.pyc파편에 의한 작업 트리 오염을 차단한다. - Phase 4 — B-13 Freeze 스냅샷 제거: Bash가 실행 중 스크립트를 디스크에서 재독해하며 발생하던 크래시(B-13)의 원인이 Python 상주 프로세스 전환으로 근본 해소되었으므로, 임시 비계였던
/tmp/mam-loop-freeze.XXXXXX트리 복사를 기본 경로에서 철거했다. 턴당 수백 개 파일 복사 오버헤드가 사라진다.
🔒 롤백 및 안전장치
- 단일 환경변수 롤백 4종:
MAM_DELEGATION_PY=0(위임 셸 헬퍼 레거시 본체),MAM_ENGINE_CAS=0(무조건 병합 복원),MAM_LOOP_PY=0(레거시 셸 루프),MAM_LOOP_FREEZE=1(Freeze 스냅샷 재활성화). 재배포·revert 불필요. - ⚠️ 부분 배포 금지 (신규 fail-closed 게이트):
lib.sh의MAM_VERSION과lib_py/loop/eager.py의FRAMEWORK_VERSION이 다르면verify_framework_version()이RuntimeError로 루프 기동을 거부한다. 두 파일 중 하나만 갱신된 혼재 트리는 실행되지 않으므로, 프레임워크는 항상 트리 단위로 배포한다. - 4-Way 락스텝 자동 검증:
test_version_consistency.py가lib.sh↔eager.py↔VERSIONS.md(현재 버전 + 매트릭스 8행) ↔ 8개SKILL.mdfrontmatter의 완전 일치를 강제한다.eager.py커버리지는 본 릴리스에서 신규 추가되었다.
✅ 품질 검증
- 전체 테스트 스위트 750개 통과, 0 실패, 0 skip (Issue #5 착수 시점 510개 대비 +240).
- Issue #5 전용 회귀:
test_issue5_phase{0,1,2a,2b,3,4}_*.py. - 테스트 격리 결함 1건 수정 (
tests/conftest.py):lib.sh가 export한MAM_VERSION이 pytest를 기동한 셸에서 상속되어, 루프 테스트가 검사 대상 트리가 아니라 러너를 띄운 셸이 언제lib.sh를 source했는지에 따라 통과·실패하고 있었다. 지금까지는 상속값과 상수가 우연히 같아 잠복해 있었고, 본 릴리스의 버전 상승이 이를 드러냈다(4건 실패). 세션 스코프 fixture가 상속된 값을 제거하여 스위트가 트리를 측정하도록 바로잡았다.- 프로덕션 경로는 영향 없음:
run_loop.sh:17이 실행 최초에lib.sh를 source하고lib.sh:32-33이MAM_VERSION을 무조건 재export하므로, 낡은 상속값은 파이썬 기동 전에 항상 덮어써진다(MAM_VERSION=4.3.0 bash -c 'source lib.sh; echo $MAM_VERSION'→4.4.0).
- 프로덕션 경로는 영향 없음:
🚀 v4.3.0 — lib_py.delegation 패키지 추출 및 장수 MQTT 연결 프로토타입 (2026-09-06)
주요 마일스톤 (MINOR Release): Issue #5 Phase 1.
lib.sh의 위임 헬퍼 3종과multi-agent-mux-delegate-job/scripts/*.py4종을lib_py/delegation/파이썬 패키지로 추출. 스크립트 경로는 와이어 계약이므로 호환 shim으로 보존하며, 프로덕션 동작·이벤트 스키마·자동완료 정책은 한 줄도 바뀌지 않는다.
🌟 신규 기능 및 아키텍처 확장
- 패키지 바인딩 shim (D2):
scripts/{mqtt_common,registry,publish_event,job_subscriber}.py는lib_py.delegation패키지를 자기 옆 트리에 프로세스당 1회 바인딩하고sys.path를 건드리지 않는다.import mqtt_common은lib_py.delegation.mqtt_common과 동일한 모듈 객체가 된다.sys.path.insert(0, ...)방식은 pytest에서 최초로 임포트된 샌드박스 사본이lib_py.agents/layout/state까지 세션 전체에 걸쳐 가로채므로 채택하지 않았다.- 모듈 단위 파일 적재 방식은 형제를 임포트하는 모듈이 다른 트리의 의존성을 끌어와 freeze(B-13) 보호를 부분 상실하므로 채택하지 않았다.
DelegationService/cli.py/daemon.py: 셸 헬퍼 3종의 본체를python -m lib_py.delegation.cli로 교체.start_watchdog은ensure_subscriber_daemon의 별칭으로 유지.PersistentPublisher프로토타입 (publisher.py) 및 벤치마크 하니스 (bench.py): 장수 연결은 Phase 2a 엔진용이며 프로덕션 경로(CLI·셸)는 계속 1회성 연결을 사용한다.ensure_env_loaded()(D6):.mam.env로딩을 임포트 시점에서 프로세스 진입점으로 이동. 라이브러리 임포트가os.environ을 변경하지 않는다.
🔒 롤백 및 안전장치
MAM_DELEGATION_PY=0: 셸 헬퍼가 보존된 레거시 인라인 본체(_*_legacy)로 즉시 분기. 재배포·revert 불필요. 레거시 본체 제거는 Phase 4.- 특성화 테스트 선행 (P1-00): 이전까지 위임 셸 헬퍼 3종을 직접 검증하는 테스트가 0건이었으므로, 이동 전에 골든 테스트를 먼저 추가하고 두 경로(
MAM_DELEGATION_PY0/1) 모두에서 통과시켰다.
🚀 v4.2.0 — OpenAI Codex First-Class Agent Backend Integration (2026-09-05)
주요 마일스톤 (MINOR Release): OpenAI Codex CLI(
codex)를 6번째 정식 1급 에이전트 백엔드로 통합. 46개 전체 아키텍처 결합 지점(Shell 라이프사이클, Python 어댑터, 레지스트리, 상태 머신, 동기화 루프, 테스트 스위트, 문서) 전면 연동 완료.
🌟 신규 기능 및 아키텍처 확장 (New Features & Architecture)
- A-1: Codex Agent Adapter (
CodexAgentAdapter) 신규 구현 (codex.py,registry.py):BaseAgentAdapter완전 구현:name='codex',own_key='codex_session_id_own',ready_tokens='Codex|Ask Codex to do anything',exit_key='Ctrl+C',delegate_agent_key='codex-cli'.- Class A 에이전트 라이프사이클 채택: 세션 생성 시 UUID를 사전 할당하지 않고 런타임에 동적으로 발견.
- Rev.2 동적 SQLite DB 탐색: 고정 버전 파일 대신
state_*.sqlite패턴을 최신 mtime 순으로 탐색하여threads테이블에서(rollout_path, cwd)를 O(1)로 색인. - Fallback 탐색: SQLite 미존재 시
~/.codex/sessions/*/*/*/rollout-*-<uuid>.jsonldate-nested 경로 및 재귀 패턴 지원. - Safe Purge:
codex delete <uuid> --forceCLI 호출 및 온디스크 jsonl/DB 레코드 폴백 삭제.
- A-2: Shell 라이프사이클 및 오케스트레이션 46개 지점 완전 연동:
lib.sh:resolve_agent_type_from_registry,_sanitize_herdr_agent_name,send_keys_safe에 codex 등록.create_session.sh:--agent codex허용,~/.codex/auth.json/OPENAI_API_KEY프리플라이트 검증,--dangerously-bypass-approvals-and-sandbox플래그 스폰,codex_session_id_own: null초기화.resume_session.sh:codex복원 지원, 0-turn 세션에 대한FRESH_SPAWN=1Class A 안전 폴백.update_yaml_resumed.sh:codex세션 복원 시 YAML 필드 원자적 갱신.stop_session.sh:codex지원, 종료 시 최종 session id 캡처 및 저장.orc_onboard.sh: flag-tolerant regex 기반으로codex resume [options] <uuid>명령행에서 UUID 정확 추출.reconcile.sh: drift C (codex) 전용 감지 블록 추가 (state DB 우선 + glob 폴백), discovery sweep 연동.status.sh: text/JSON 포맷터 양측에 codex 온디스크 복원 가능 여부 검사 로직 연동.
- A-3: 문서 및 표준 헌장 동기화:
README.md,README.ko.md,BOOTSTRAP.md,BOOTSTRAP.ko.md,deploy/INSTALL.md,.agents/MULTI_AGENT_RULES.md,.mam.env.example,docs/NEW_AGENT_INTEGRATION_GUIDE.md전면 업데이트.
🛠️ v4.1.3 — Herdr Daemon Isolation & Class A 0-Turn Resume Reliability Fixes (2026-08-31)
주요 마일스톤 (PATCH Release): Issue #3 결함 해소 — Herdr 백그라운드 데몬의
start_new_session=True기반 프로세스 그룹(setsid) 완전 격리, Class A(agy,hermes,opencode) 에이전트 0-turn 중지 세션의FRESH_SPAWNfallback 및 discovery epoch 원자적 재설정, Class B(claude,grok) 계약 불변 보존, 455개 전체 테스트 스위트 100% PASS 달성.
🩹 버그 수정 및 안정성 개선 (Bug Fixes & Resilience)
- C-1: Herdr 데몬 프로세스 그룹(PGID/SID) 완전 분리 (
lib.sh):.mam/shim/herdr템플릿의nohup ... & disown스폰 방식을 파이썬subprocess.Popen(..., start_new_session=True)기반 전용 스포너로 대체하여 자식 프로세스에서os.setsid()호출 보장.- 부모 셸이나 테스트 러너의 시그널 브로드캐스트(
SIGTERM/SIGINT)로 인해 백그라운드 Herdr 데몬이 예기치 않게 종료되는 결함을 원천 차단 (test_h26).
- C-2: Class A 에이전트 0-turn resume 자율 Fallback 및 Discovery Watermark 갱신 (
resume_session.sh,update_yaml_resumed.sh):- 대화 턴이 발생하기 전에 중지된 Class A(
agy,hermes,opencode) 세션 resume 시, UUID 미존재로 인한 비정상 hard-fail(RC=1) 대신FRESH_SPAWN=1로 자동 전환하여spawn-spec기반의 정상 재스폰 수행 (test_t14). - fresh-spawn resume 시
update_yaml_resumed.sh에서herdr_session_epoch를 resume 시점의 타임스탬프로 즉시 갱신하고session_id_source: pending-discovery로 재설정하여, 세션 생성과 복원 사이에 생성된 무관한 이전 대화 파일이reconcile.sh의 discovery sweep에 의해 오인 캡처되는 것을 방지 (test_t16). - Class B(
claude,grok) 에이전트의verify_session.py:99-101assigned escape hatch 및test_t8계약은 수정 없이 완벽히 보존 (test_t15).
- 대화 턴이 발생하기 전에 중지된 Class A(
🛠️ v4.1.2 — Pane Resolution & Reuse Reliability Fixes (2026-08-30)
주요 마일스톤 (PATCH Release):
bug-report/mam_upstream_bug_fix_report.md에 보고된 4건을 실 코드 대비 독립 검증 — 2건은 실재하는 결함으로 확인되어 수정(SemVer 2.0.0 §6 PATCH), 1건(ready_tokens)은 v4.1.1에서 이미 해결됨을 확인, 1건(resume_specmaterialized게이트)은 5개 어댑터 공통의 의도된 안전장치로 판단되어 제안된 수정을 채택하지 않음(근거는 아래 참조).
🩹 버그 수정 및 안정성 개선 (Bug Fixes & Resilience)
- C-1:
_resolve_herdr_pane_idGenericagent_kind오인 매칭 방지 (lib.sh):- 세션명 매칭 실패 시 수행되던
agent_kind광역 폴백을 호출 대상 자체가 kind 리터럴(예:"agy")인 경우로만 한정하고, 상위 루프의 exact match 대상에서'agent'를 제외하여 동종 페인 다수 존재 시 R-1 fail-closed 계약이 온전히 적용되도록 보장. 이전에는 대상 세션의 yaml 항목에서 조회한 kind로 "동종 페인 아무거나" 검색을 수행해, 워크스페이스 내 무관한 동종 에이전트(예: 별도 오케스트레이터agy세션)가 단 1개라도 살아있으면 그 페인을 대상으로 오인 반환하는 결함이 있었음.
- 세션명 매칭 실패 시 수행되던
- C-2:
new-session유휴 페인(Idle Pane) 우선 재사용 및 환경변수 주입 보전 (lib.sh):- 기존 워크스페이스가 감지되면 곧바로
pane split을 호출하던 기존 동작을 변경, 워크스페이스 내 에이전트 미할당(유휴) 페인이 존재하면 이를target_pane으로 즉시 재사용하고 split을 생략. 재사용 시 호출자가 전달한$env_flags및HERDR_WORKSPACE_ID가 유실되지 않도록env접두어로$final_cmd에 주입하여 환경변수 전달 일관성 보장. 오버플로우 시 신규 워크스페이스 생성 정책(W2b)은 유휴 페인이 없는 경우에만 그대로 적용됨.
- 기존 워크스페이스가 감지되면 곧바로
- 검토 후 미채택 —
opencode.py::resume_specmaterialized게이트:- 보고서는
if materialized and session_uuid:조건 제거를 제안했으나, 이는claude/grok/agy/hermes/opencode5개 어댑터 전원에 동일하게 존재하는 의도된 계약이며,materialized는verify_artifact()(opencode의 경우 실제 SQLite 세션 DB 조회)로 산출됨 — 존재하지 않는 세션 ID로--session을 넘겨 CLI가 실패/행(hang)하는 것을 막기 위한 안전장치. 제안대로 수정 시 5-어댑터 일관성이 깨지고 안전장치가 무력화되므로 채택하지 않음.resume_session.sh는WORKSPACE를 필수 인자로 검증하므로ctx가 비어materialized가 거짓이 되는 경로도 확인되지 않음.
- 보고서는
- 재확인(조치 불필요) —
opencode.py::ready_tokens:- 보고서가 지적한 ASCII 배너 미인식 문제는 v4.1.1(B-1, job
c38ddfcf)에서 이미 해결되어 현재ready_tokens가 보고서의 "수정 후" 값과 완전히 일치함을 확인. 보고서 작성 시점이 v4.1.1 이전 체크아웃이었던 것으로 추정.
- 보고서가 지적한 ASCII 배너 미인식 문제는 v4.1.1(B-1, job
🛠️ v4.1.1 — Agent Creation & Runtime Reliability Fixes (2026-08-30)
주요 마일스톤 (PATCH Release): 에이전트 생성 및 런타임 신뢰성 향상을 위한 4대 보편 버그 수정(SemVer 2.0.0 §6 PATCH), Herdr 격리 환경
PYTHONPATH자동 주입, OpenCode TUI 레디 토큰 보강, 세션 페인 식별자 Fast-Path 및 시작 타임아웃 복원력 강화.
🩹 버그 수정 및 안정성 개선 (Bug Fixes & Resilience)
- B-1: OpenCode TUI 준비 감지 토큰 보강 (
lib_py/agents/adapters/opencode.py):ready_tokens를'OpenCode|Chat|Ask anything|tab agents|ctrl\+p|Build auto|commands'로 확장하여 ASCII 배너 및Build auto초기 화면에서 30초 대기 없이 즉각 준비 완료 판정.
- B-2: Herdr Shim 템플릿 내 독립
PYTHONPATH주입 (lib.sh):.mam/shim/herdr스크립트 상단에서 자신의 경로를 기준으로_SKILL_DIR을 산출하고PYTHONPATH에 주입하여 부모 셸 환경변수 미상속 서브셸에서도lib_py모듈 정상 로드 보장.
- B-3:
herdr agent start타임아웃 복원력 및 send-text 폴백 (lib.sh):- 시작 타임아웃 발생 시 무조건 실패 처리하지 않고, 실제 에이전트 프로세스 생존을 확인하거나
pane send-text+ Enter 폴백으로 명령을 직접 재주입하여 세션 초기화 성공률 제고.
- 시작 타임아웃 발생 시 무조건 실패 처리하지 않고, 실제 에이전트 프로세스 생존을 확인하거나
- B-4:
_resolve_herdr_pane_id페인 ID Fast-Path 및 워크스페이스 레이블 매칭 (lib.sh):- 이미 해석된 페인 ID(
wN:pM) 입력 시 즉각 반환하는 Fast-Path 추가. herdr workspace list를 활용하여 워크스페이스 레이블(예:mam-agents)을 실제workspace_id로 자동 변환 매칭.
- 이미 해석된 페인 ID(
🚀 v4.1.0 — OpenCode AI Agent Integration (2026-08-29)
주요 마일스톤 (MINOR Release): OpenCode AI 에이전트(
anomalyco/opencode) 백엔드 완전 통합(SemVer 2.0.0 §7 MINOR), 5대 핵심 에이전트(claude,agy,hermes,grok,opencode) 표준화, 29개 CLI 스크립트/스킬 연동 및 447개 전체 테스트 100% PASS 달성.
✨ 주요 변경 사항 (New Features & Enhancements)
- F-1: OpenCode 에이전트 어댑터(
OpenCodeAgentAdapter) 구현:lib_py/agents/adapters/opencode.py신규 구현 및lib_py/agents/registry.py등록.- SQLite 스토리지(
opencode.db) 내directory및time_created(밀리초) 실 스키마 기반의 방어적 세션 검증(verify_artifact) 및 멀티 후보자 발견(discover) 지원. _resolve_db()를 통한opencode db pathCLI 동적 해석 및 샌드박스 환경(HOME/XDG_DATA_HOME) 격리 지원.
- F-2: CLI 라이프사이클 및 스크립트 전면 연동 (29개 터치포인트):
create_session.sh,resume_session.sh,stop_session.sh,status.sh,reconcile.sh,run_loop.sh,orc_onboard.sh내--agent opencode완전 지원.- 세션 생성 및 재개 시
OPENCODE_PERMISSION='{"*":"allow"}'자동 내보내기 및 사용자 사전 설정 보존(Empty-Guard). - 백그라운드 조정자(
reconcile.sh) drift-C 블록에서 어댑터 공유 헬퍼를 통한 세션 ID 사후 자율 감지 및 YAML 등록.
- F-3: 포괄적 테스트 스위트 확장:
tests/test_a4_adapter_contract.py: 어댑터 계약, 실 스키마 밀리초 비교, CLI DB 경로 동적 해석 검증.tests/test_tier1_unit.py,tests/test_tier2_component.py,tests/test_c1_tui_readiness.py: TUI 및 라이프사이클 통합 검증 (총 447개 테스트 100% 통과).
🚀 v4.0.0 — Complete Cline Agent Deprecation & Hermes Modernization (2026-08-28)
주요 마일스톤 (MAJOR Release):
cline에이전트 백엔드의 완전한 제거 및 폐지(Breaking Change per SemVer 2.0.0 §8), Hermes 에이전트 풀 모더니제이션 및 Ollama 로컬 연동 정식 지원, 4대 핵심 에이전트(claude,agy,hermes,grok) 표준화 및 439개 전체 테스트 100% PASS 달성.
⚠️ 동작 변경 및 마이그레이션 안내 (Breaking Changes)
- B-1:
--agent cline지원 완전 제거 및 파서 거부:adapters/cline.py삭제 및registry.py등록 해제에 따라 모든 스킬 엔트리포인트(create_session.sh,resume_session.sh,stop_session.sh,reconcile.sh,orc_onboard.sh,multi-agent-mux-delegate-job등)에서--agent cline입력 시exit 2로 즉시 거부됩니다.- 지원되는 에이전트 패밀리는
claude,agy,hermes,grok4종으로 엄격히 제한됩니다.
- B-2: 영향도 확인 (Detection):
- 저장된 스크립트나 커스텀 세션에서 Cline 관련 설정이 남아있는지 확인:
grep -rn "agent: cline\|cline_conversation_id_own\|--agent cline" .mam/ *.sh 2>/dev/null
- 저장된 스크립트나 커스텀 세션에서 Cline 관련 설정이 남아있는지 확인:
- B-3: 업그레이드 전 세션 정리 (Pre-upgrade Cleanup — 권장):
- v3.1.0 상태에서
deploy/update.sh실행 전, 기존의 활성/보관 중인 Cline 세션을 원자적으로 정리:multi-agent-mux-stop --session <session-name> --agent cline --purge-conversation --yes
- v3.1.0 상태에서
- B-4: 업그레이드 후 고아 세션 레코드 정리 (Post-upgrade YAML Pruning):
deploy/update.sh는.mam/agent-sessions.yaml을 덮어쓰지 않고 보존하므로, 사전에 정리되지 않은 v3.xcline세션 행은 아래 원자적 갱신 명령을 통해 안전하게 정리할 수 있습니다:source .agents/skills/lib.sh atomic_dump_yaml .mam/agent-sessions.yaml <<'MUT' d['herdr_sessions'] = [ s for s in d.get('herdr_sessions', []) if s.get('agent') != 'cline' and not str(s.get('name', '')).endswith('-cline') ] MUT
- B-5: Hermes 에이전트 모더니제이션:
- 헤드리스 플래그(
--yolo --accept-hooks), TUI 입력 영역 구분자(─{10,}및❯), 준비 토큰 강화,reconcile.sh타임스탬프 기반 다중 후보자 동등성(discover()) 지원이 정식 통합되었습니다.
- 헤드리스 플래그(
🚀 v3.1.0 — 2-Tier TUI Readiness Model, Adapter Modal Contract & Fail-Closed Pane Resolution (2026-08-28)
주요 마일스톤: 다이얼로그 기아(starvation) 구조적 해소를 위한 2계층 TUI 준비 판정 모델(
S ∨ (W ∧ C)), 모달/힌트 2계층 토큰 분리, 어댑터별modal_tokens계약(T-2d) 정립, 동종 페인 다중 매치 fail-closed 방어, 준비 실패 세션 진단 보존(create_session.sh),lib.sh런타임 버전 상수(MAM_VERSION="3.1.0") 신설 및 436개 전체 테스트 100% PASS 달성.
⚠️ 동작 변경 및 마이그레이션 안내
- B-1: TUI 미준비 세션 보존 (
create_session.sh):- TUI 준비 감지 타임아웃 발생 시, PID가 생존해 있다면 세션을 강제 종료(
kill-session)하지 않고status: running,last_visible_status: tui-ready-timeout으로 등록한 뒤exit 0(성공)으로 반환합니다. - 구
v3.0.1의 무조건 롤백 및 종료 동작을 원할 경우MAM_KILL_ON_READY_TIMEOUT=1을 설정하십시오.
- TUI 준비 감지 타임아웃 발생 시, PID가 생존해 있다면 세션을 강제 종료(
- B-2: 프로세스 사망 시 종료 코드 변경:
create_session.sh실행 중 PID가 사망한 경우 명시적 구분 코드42(MAM_EXIT_READY_TIMEOUT)로 종료합니다.
- B-3: 동종 페인 다중 매치 시 Fail-Closed 거부 (
_resolve_herdr_pane_id):- 동일한 에이전트 종류의 페인이 여러 개 발견되고 정확한 세션명 일치가 실패할 경우, 임의의 첫 번째 페인을 선택하지 않고 즉시
exit 1로 실패하여 교차 세션 오염을 원천 차단합니다.
- 동일한 에이전트 종류의 페인이 여러 개 발견되고 정확한 세션명 일치가 실패할 경우, 임의의 첫 번째 페인을 선택하지 않고 즉시
- B-4 & B-5: 환경변수 전파 (
WORKSPACE_ROOT,MAM_VERSION):WORKSPACE_ROOT및MAM_VERSION이 자식 프로세스로 자동export됩니다.MAM_VERSION은 런타임 위조 방지를 위해 환경변수 오버라이드가 차단됩니다.
🔧 기존 워크스페이스 사용자 안내
기존 배포된 워크스페이스 사용자는 .mam.env에 아래 3종의 신규 환경변수를 추가하여 동작을 튜닝할 수 있습니다:
| 변수명 | 기본값 | 설명 |
|---|---|---|
MAM_KILL_ON_READY_TIMEOUT |
0 |
1로 설정 시 TUI 준비 타임아웃 발생 시 세션을 보존하지 않고 강제 종료(v3.0.1 동작) |
MAM_DIALOG_TAIL_LINES |
8 |
블로킹 모달 시그니처를 검사할 페인 하단 비공백 라인 수 |
MAM_READY_EMPTY_GIVEUP |
5 |
wait_for_tui_ready가 페인을 관측 불가(Headless)로 판정하기까지의 연속 빈 캡처 횟수 |
1. 2계층 TUI 준비 판정 모델 (S ∨ (W ∧ C))
- 단독 충분 강한 신호 (
S):strong_ready_tokens또는 8자 이상의 유의미한input_placeholder(Ask anything...) 일치 시 준비 완료 선언. - 보강 결합 약한 신호 (
W ∧ C):weak_ready_tokens(history,Chat등)는input_prompt(❯,>) 또는input_rule_pattern(─{10,})과 동시 일치할 때만 준비 완료로 판정하여 오탐 차단. - 하강 호환성 (Fallback):
input_*속성이 미정의된 에이전트(Hermes 등)는 강한 토큰 단독 검사로 안전하게 하강.
2. 모달/힌트 토큰 분리 및 어댑터 modal_tokens 계약 (T-2a / T-2d)
- 토큰 집합 분리:
_MAM_MODAL_TOKENS(고신뢰 블로킹 모달)와_MAM_HINT_TOKENS(자연어 TUI 안내 팁)를 분리._pane_dialog_open이 힌트 텍스트로 인해 영구 차단(Starvation)되는 결함 해소._MAM_DIALOG_TOKENS는 하위호환용 합집합으로 존치. BaseAgentAdapter.modal_tokens: 에이전트별 특화 모달(Claude의Try the new fullscreen renderer?, Cline의Select API Provider등)을 팩트 브리지(MAM_MODAL_TOKENS)로 통합.
3. Fail-Closed 페인 해석 및 워크스페이스 스코프 강화 (R-1 / R-2)
_resolve_herdr_pane_id에서 다중 매치 시sys.exit(1)처리 및export WORKSPACE_ROOT보강으로 격리 안정성 확보.
4. 준비 실패 세션 진단 보존 및 MAM_VERSION 스탬프
create_session.sh실패/타임아웃 시.mam/diagnostics/<session>-<timestamp>.txt로 페인 덤프 및MAM Version스탬프 자동 기록.
5. 런타임 버전 상수 MAM_VERSION 신설 및 3자 락스텝 검증
lib.sh내MAM_VERSION="3.1.0"선언 및test_version_consistency.py를 통한lib.sh↔VERSIONS.md↔ 8개SKILL.md3자 일치 자동 검증.
6. 신규 환경변수 3종 문서화
.mam.env.example에MAM_KILL_ON_READY_TIMEOUT,MAM_DIALOG_TAIL_LINES,MAM_READY_EMPTY_GIVEUP3종 등록.
7. 테스트 스위트 확장: 412 → 436 (+24, 100% PASS)
test_c1_tui_readiness.py(21 tests),test_adapter_modal_tokens_contract,test_version_consistency.py신설 등 총 436개 테스트 무결점 통과.
8. 교차 피어 리뷰 이력
- F-1~F-8 및 R-1, R-2 총 10건의 피어 리뷰 이슈 도출 및 해소:
- F-1 (
Yes, try it팁 오탐 제거), F-2 (업셀 모달 선행 검사), F-3 (변수 스코프 격리), F-4 (리뷰어 실측 검증 후 자진 철회), F-5/F-6/F-7 (어댑터 팩트 연동 및 세션 패턴 보강), F-8 (비-클로드 어댑터 modal_tokens 계약 정립), R-1 (Fail-closed 페인 리졸버), R-2 (WORKSPACE_ROOTexport 전파). - 계획 단계 챌린지(
b9c29c3b)를 통한 C-1 (MAM_VERSION3자 락스텝) 및 C-2 (마이그레이션 안내) 수용.
- F-1 (
🚀 v3.0.1 — Herdr Shim Routing Contract Refactor, Multi-Workspace Isolation & 412-Test Milestone (2026-08-27)
주요 마일스톤: Herdr 심 라우팅 5대 결함(ISSUE-1
5) 및 F-1F-4 보완 완결,HERDR_WORKSPACE_ID환경 변수 스코핑 및 파일 기반 격리 영속화 엔진 탑재,pane send-text기반 단일 안전 삽입 계약 정립, 부분 문자열 매칭(in tn) 완전 제거, 412개 전체 테스트 100% PASS 달성.
1. Herdr 심 라우팅 및 다중 워크스페이스 격리 강화 (.agents/skills/lib.sh)
HERDR_WORKSPACE_ID명시적 스코프 & 영속화 (ISSUE-3,F-2b):_herdr_ws_id_file(),_herdr_persist_ws_id(),_herdr_ws_scope()헬퍼 도입.new-session시 생성된 워크스페이스 ID를$WORKSPACE_ROOT/.mam/herdr_workspace_id에 영속화._herdr_agent_get_scoped는 호출자의 환경변수(HERDR_WORKSPACE_ID)만을 우선 평가하여 단축 경로에서의 교차 워크스페이스 라우팅 오염 차단.
- 엄격 일치(Exact-Match) 단일 페인 리졸버 정립 (
ISSUE-2,ISSUE-5,F-3):- 기존의 에이전트 CLI 명칭 부분 문자열 매칭(
in tn,agent in tn) 완전 제거. - 단일 중앙 헬퍼
_resolve_herdr_pane_id로has-session,kill-session,capture-pane,send-keys,paste-buffer의 페인 해석 통합. - 영숫자 워크스페이스 식별자 패턴(
^w[A-Za-z0-9]+:p[A-Za-z0-9]+$) 지원 (H-20).
- 기존의 에이전트 CLI 명칭 부분 문자열 매칭(
2. 원자적 텍스트 삽입 및 안전 전송 계약 교정 (ISSUE-1, F-4)
paste-buffer의pane send-text전용화:- Herdr CLI에 미존재하던
agent send제거 및pane send-text로 교체. - 삽입과 제출(Enter) 책임을 분리하여 의도치 않은 자동 제출 및 이중 제출(Double Submit) 방지.
- 페인 미해석 또는 삽입 실패 시
send_keys_safe로 에러 코드(rc 3) 명시적 전파.
- Herdr CLI에 미존재하던
capture-pane폴백 체인 복원 (F-4):pane read실패 시agent read로의 폴백 체인을 안정적으로 복원하여 TUI 캡처 신뢰성 보장.
3. TUI 준비 상태 감지 및 다이얼로그 토큰 정밀화 (N-1, F-1)
_MAM_DIALOG_TOKENS일반 팁 토큰 분리:- 일반 대화형/TUI 팁에 등장하는
Yes, try it을 블로킹 다이얼로그 토큰 목록에서 제외하여 세션 시작 시의 오탐 방지. - 풀스크린 업셀 모달에 대해서는 전용 Escape 거절 브랜치로 격리 처리.
- 일반 대화형/TUI 팁에 등장하는
4. 테스트 스위트 및 Mock Herdr 계약 정기 동기화 (tests/)
- Mock Herdr (
tests/conftest.py): 실제 Herdr 0.8.2 CLI 계약과 완벽 동기화 (pane send-text,pane read,pane rename반영, 미지원agent send실패 처리). - 신규 계약 & 회귀 테스트 19건 추가:
test_herdr_shim_contract.py: H-15 ~ H-23 (단일 리졸버 불변식, 워크스페이스 격리, 단축경로 스코핑).test_b19_headless_reconcile_fixes.py: D-4 ~ D-7 (set -e 안전성, send_keys_safe 실패 전파, 다이얼로그 토큰 제외 회귀 방지).
- 전체 테스트 결과: 412 passed in 681.20s (100% PASS).
🚀 v3.0.0 — 5th Agent (Grok) Ecosystem Expansion, Mux Loop CLI Redesign & Deterministic 2xK Layout Engine 2.0 (2026-08-26)
주요 마일스톤: 5번째 공식 에이전트
grok(Grok Build) 전면 통합,/multi-agent-mux-loop의--target-agent폐지 및--creator/--planner역할 분리(Breaking Change), 2×2 대칭 그리드를 보장하는 결정론적 레이아웃 엔진 2.0 탑재, 393개 전체 테스트 100% PASS 달성.
⚠️ Breaking Changes & Migration Guide
multi-agent-mux-loopCLI 플래그 개편:- 기존의 단일 대상 지정 플래그
--target-agent <session>가 공식 제거(Drop) 되었습니다. - 기존 명령은 이제
ERROR: --target-agent was removed. Use --creator <session> instead.와 함께 종료(exit 1)됩니다. - 마이그레이션 방법:
- 기존:
bash run_loop.sh --target-agent <dev-session> --task "..." - 변경:
bash run_loop.sh --creator <dev-session> --task "..." - 플래너 지정 시:
bash run_loop.sh --plan --planner <plan-session> --creator <dev-session> --task "..."
- 기존:
- 기존의 단일 대상 지정 플래그
1. 5번째 공식 AI 에이전트 Grok Build (grok) 전면 통합
- 어댑터 및 수명 주기 관리 (
lib_py/agents/,lib.sh):GrokAgentAdapter구현 및 레지스트리 공식 등록 (claude, agy, hermes, cline, grok).create_session.sh,resume_session.sh,stop_session.sh,resolve_session_id.sh의 에이전트 화이트리스트 및 디스패치 지원 완비.- 온디스크 세션 UUID 해석 및 TUI 렌더링 준비 감지 토큰 반영.
2. 결정론적 2×K 그리드 레이아웃 엔진 2.0 (lib_py/layout.py, lib.sh)
N=1\to 2right분할 우선 정책 (R-1 결함 해소):- 1개 페인에서 2번째 에이전트 추가 시
down대신right로 분할(single_pane_split_right)하여 좌/우 2개의 전고(Full-height) 열 확보. - 이후 $N=3$(좌측 down), $N=4$(우측 down)로 이어져 완벽한 2×2 균등 대칭 격자 기하학(
widths=[138,139], heights=[39]) 완성.
- 1개 페인에서 2번째 에이전트 추가 시
- GUI ↔ 헤드리스 단일 결정표 통합 (
_decide_from_cols):- 기존의 불완전한
n % 2홀짝 패리티 로직을 폐기하고, 열 점유 상태(cols=(a, b)) 기반의 통합 3단계 결정 매트릭스로 일원화.
- 기존의 불완전한
- 안전 가드 및 4중 용량 배선:
_full_height_pane가드로 반쪽 열 분할 원천 차단.layout.py기본값(default=2),lib.sh:435CLI 인자(--max-cols,--max-rows),.mam.env.example동기화 완료.
3. 사전 검증 및 인프라 동기화
create_session.sh의--workspace필수 인자 사전 검증(preflight) 강화.- 사설 NATS 브로커(
nats-docker) 2.14-alpine 최신 태그 동기화.
🚀 v2.2.1 — Single-Workspace 2xK Multi-Pane Tiling Optimization & Premature Overflow Fix (2026-08-24)
주요 마일스톤:
MAM_MIN_PANE_COLS기본값 60→40 완화, 표준 80~100컬럼 터미널 뷰포트에서 조기 워크스페이스 오버플로(가상 데스크톱 분리) 방지 및 단일 워크스페이스 2x2 통합 타일링 완성, 신규 80/79 경계 및 90/100 col 타일링 테스트 6종 추가, 다중 에이전트 피어 리뷰 100% PASS 달성.
1. 2xK 레이아웃 엔진 최소 폭 완화 (lib_py/layout.py, lib.sh)
compute_2xk_layout기본min_cols및 CLI--min-cols,lib.sh:432의${MAM_MIN_PANE_COLS:-40},.mam.env.example문서를40으로 4중 일치화.- 90~100컬럼 너비 터미널에서 3번째, 4번째 에이전트 생성 시 불필요하게 가상 데스크톱(Workspace)이 분리되던 현상 완전 해소.
2. 경계값 및 타일링 자동화 테스트 확충 (tests/test_layout.py, tests/test_tier1_unit.py)
80컬럼(분할 성공) vs79컬럼(오버플로) 하한 경계값 검증.90및100컬럼 단일 워크스페이스 1→2→3→4 단계 2x2 타일링 및 5번째 에이전트 오버플로 전 과정 수명 주기 검증.
🚀 v2.2.0 — Herdr Workspace Label Standardization, Runtime Sync & Legacy Fallback Decoupling (2026-08-24)
주요 마일스톤:
--herdr-workspace옵션 전 스킬 도입 및 YAML 독립 직렬화, Herdr 런타임 워크스페이스 레이블 실시간 동기화, 레거시 소켓 폴백 체인 분리(Breaking Change 방어), 최신 Claude Code TUI 감지 토큰 반영, 27개 신규 테스트 추가 및 만장일치 PASS 달성.
1. --herdr-workspace 옵션 도입 및 Herdr 런타임 레이블 동기화
- CLI 옵션 및 YAML 직렬화 표준화:
create_session.sh,resume_session.sh,update_yaml_resumed.sh,stop_session.sh에--herdr-workspace <name>파서 및 환경변수(HERDR_WORKSPACE) 지원 추가.agent-sessions.yaml에herdr_session(소켓명)과herdr_workspace(워크스페이스 라벨)를 각각 독립 필드로 영구 직렬화.
- Herdr 런타임 워크스페이스 레이블 실시간 연동 (
lib.sh,resume_session.sh):herdr workspace create호출 시--label "$MAM_WS_LABEL"전달 및 기존 워크스페이스 사용 시herdr workspace rename자동 호출.resume_session.sh실행 시 저장된herdr_workspace를 읽어 Herdr 런타임 레이블 복원 보장.
2. 레거시 소켓 폴백 체인 분리 및 Breaking Change 원천 차단
- 소켓 vs 워크스페이스 함수 완전 분리 (
lib.sh):resolve_herdr_session(): 데몬/소켓 세션명만 반환 (rowherdr_session-> rowherdr_server-> env -> slug).resolve_herdr_workspace(): 워크스페이스 라벨만 반환 (rowherdr_workspace->pane.cwdslug -> callerwsarg).- 기존 코드베이스 6개 지점(
lib.sh:1027,reconcile.sh:135, 399, 495,status.sh:145, 270)에서 소켓 검색 시herdr_workspace를 오인 참조하던 구문을 완전히 제거.
- 외부 세션 입양(Drift-B) 보강 (
reconcile.sh):- 외부 세션 입양 시
herdr_workspace와herdr_server를 자동 채번 및 직렬화.
- 외부 세션 입양 시
3. 최신 에이전트 TUI 준비 감지 보강 (claude.py, lib.sh)
- 최신 Claude Code(
v2.1.241)의 시작 배너(Claude Code,Opus 5 with high effort등)를ready_tokens에 추가하여 세션 생성 타임아웃 방지.
🚀 v2.1.0 — 2xK Grid Layout Engine, Explicit Agent Standardization & Herdr Session Hardening (2026-08-24)
주요 마일스톤: 2xK 우측 성장 그리드 레이아웃 엔진(
lib_py.layout) 구축(B-20), 전 스크립트--agent/--herdr-session표준화 및 전파 가드, 전체 346개 테스트 스위트 100% PASS 달성.
1. 2xK 우측 성장 그리드 레이아웃 엔진 구축 (B-20 / I-2, I-3, C-1, J-1)
- 순수 파이썬 레이아웃 엔진 신설 (
lib_py/layout.py):tput기반 터미널 크기 동적 감지 및 2xK(2행 고정, 우측 열 추가) 그리드 기하학 계산 엔진 구현.- 패널 번호 순서(0:좌상, 1:좌하, 2:중상, 3:중하...)에 따른 우측 확장 타일링 분할 명령(
split-pane -h/-v,select-pane) 계산. - 헤드리스/CI 최소 차원(최소 너비 60, 최소 높이 20) 가드 및
default=60falsy-zero trap 해결 (_env_int).
- 33개 신규 레이아웃 단위/회귀 테스트 구축 (
tests/test_layout.py):- 1~8개 패널 수식 검증, 비정상 인자/환경변수 방어, 무한 루프 방지 가드 검증.
2. 에이전트 인자 표준화 및 레지스트리 자동 추론
stop_session.sh,create_session.sh,resume_session.sh,update_yaml_resumed.sh,resolve_session_id.sh전반에 걸쳐--agent <claude|agy|hermes|cline>명시적 표준화.- 미지정 시 YAML 레지스트리(
agent-sessions.yaml) 기반 에이전트 타입 자동 추론(resolve_agent_type_from_registry) 연동.
3. --herdr-session 격리 세션 옵션 표준화 및 전파 가드
create_session.sh,resume_session.sh,stop_session.sh,update_yaml_resumed.sh전반에--herdr-session <NAME>표준 옵션화 (레거시--herdr-server완전 호환).create_session.sh에서 명시적 세션명이 워크스페이스 슬러그에 의해 덮어씌워지지 않도록 가드 보강.resume_session.sh의 post-spawn 재개 시 신규 Herdr 세션명이 YAML 레지스트리에 정확히 전파되도록 갱신 로직 및 신규 Tier 2 테스트 5건 추가.
4. 테스트 스위트 확장 및 피어 리뷰 전원 만장일치 PASS
- 전체 테스트 스위트 수 276건 → 346건 (100% PASS) 확장.
- Multi-Agent Loop를 통한 Reviewer(
claude,cline) 전원[VERDICT: PASS]검증 완료.
🚀 v2.0.0 — Unified Agent Adapter Architecture & Herdr Standardization (2026-08-17)
주요 마일스톤: 에이전트 지식 계층 단일 소스화(A-4), 레거시 격리 완전 폐기(Option B), 셸 브리지 하드닝 및 스킬 메타데이터 규격화 완료.
1. 에이전트 지식 계층 마이그레이션 (A-4 Phase 2 / P3-1)
BaseAgentAdapter추상 클래스 및 4대 어댑터 구축:.agents/skills/lib_py/agents/base.py:DiscoveryContext및 추상 인터페이스 정의 (ready_tokens,exit_key,delegate_agent_key,identity_cache_fields,artifact_path,verify_artifact,purge_artifacts,spawn_spec,resume_spec,auth_ok,discover)..agents/skills/lib_py/agents/adapters/:ClaudeAgentAdapter,AgyAgentAdapter,HermesAgentAdapter,ClineAgentAdapter4개 구체 클래스 구현.
facts브리지 셸 인터페이스 하드닝:lib_py.agentsCLI 모듈을 통해 8개MAM_*변수를shlex.quote안전 인용 처리하여 방출.wait_for_tui_ready빈 토큰 시 전량 매칭 오탐 방지 및 미지 에이전트 fail-closed 가드 내장.
- 셸 스크립트 전반 어댑터 이관:
create_session.sh,resume_session.sh,stop_session.sh,reconcile.sh에 산재되어 있던 40여 개 하드코딩 분기를 어댑터 호출로 일원화.
2. 레거시 isolation.root 및 C-3b 소비자 완전 폐기 (Option B)
- Universal Global Config 전환 이후 남아있던 4개 레거시 격리 소비자 코드(
lib.sh::mam_session_iso_root,workspace_uuid.py::iso_root_of,verify_session.py,stop_session.sh) 및atomic_yaml.py의 레거시 유효성 검사 절 100% 삭제. - 저장소 내 격리 잔재 참조 0건 달성.
3. 셸 브리지 보안 및 예외 처리 강화 (R1, R2, N1 교정)
- R1 (위임 에이전트 키 폴백 보강): 브리지 미작동 시
delegate_agent가antigravity-cli로 일괄 퇴화하지 않고claude-code,hermes-agent,cline-agent로 명시적case폴백하도록 개선. - R2 (
argv서브커맨드 전환):python -c셸 변수 문자열 보간을spawn-spec,resume-spec,exit-key서브커맨드로 전면 전환하여 공백/작은따옴표 경로 에러 및 코드 주입 위협 원천 차단. - N1 (클린 환경 격리 가드):
test_a4_adapter_contract.py내 CLI 테스트가 앰비언트PYTHONPATH없이도 독립 통과하도록 환경 격리 보강.
4. 스킬 메타데이터 규격화 및 피어 리뷰 100% PASS
- 8개
SKILL.mdfrontmatterversion: 2.0.0통일 및 배포 무결성 검증. - Reviewer
cline(Jobe7b9812b) 및 Planner/Senior Reviewerclaude(Job31730364) 전원[VERDICT: PASS]획득.
5. 레거시 주석 및 사용법 정합성 최신화 (C-6)
stop_session.sh상단 주석 및usage()내 폐기된 플래그(--mode soft|hard,--capture-id,--graceful) 안내 문구를 완전 제거하고 현행 4대 에이전트(claude,agy,hermes,cline) 및 플래그 체계로 동기화.- 회귀 방지 컴포넌트 테스트(
test_comp_stop_usage_matches_parser) 신설. - 회귀 및 계약 테스트: 263/263 PASS (100%) 달성.
6. macOS NFS 감지 df -P 폴백 검증 및 종결 (B-5)
_check_is_nfs(lib.sh)의 macOS/BSD 환경 내 GNU 전용df --output구문 오류 시 POSIXdf -P폴백 동작을 실측 및 단위 테스트(test_stop_check_is_nfs_local)로 검증 완료하여 B-5 이슈를 정식 종결.
7. agent_identities tier-3 신원 캐시 완전 제거 및 UUID 해결 경로 PyYAML 탈의존 (B-10 / Option A)
- 쓰기 경로가 존재하지 않아 구조적으로 히트 불가였던 tier-3 폴백과 부속 소비자(
workspace_uuid.py,reconcile.shdrift D,stop_session.sh캐시 소거)를 전면 삭제. - UUID 해결 경로를 tier-1(per-row own id) → tier-2(어댑터
discover()) 2단계로 단순화. verify_session.py::mam_orchestrator_uuids의 즉시yamlimport 를 YAML 폴백 분기로 이동, UUID 해결 경로가 PyYAML 없이 완주함을 실행 가드로 고정(atomic_yaml.py의 시스템 PyYAML 요구는 설계상 유지).- 회귀 가드 3종 신설 — 읽기 경로 부활 차단,
import yamlAST 검사(지연 import 포함), 실행 경로 검증. - 회귀 및 계약 테스트: 266/266 PASS (100%) 달성.
8. 셀프 호스팅 루프 런타임 프리즈 스냅샷 (B-13 / Stage 2)
- 루프 기동 시
.agents/skills/를$TMPDIR에 1회 동결하고 스냅샷에서 재실행하여, 턴 도중 프레임워크 스킬 편집이 진행 중인 루프를 깨뜨리지 못하도록 차단. - 코드 루트(스냅샷)와 상태 루트(
MAM_REAL_ROOT)를 분리해 레지스트리·루프 락·diff 수집은 실제 저장소를 계속 사용. - 재실행 시 원본 argv 를 배열로 보존해 인자 유실을 방지(파서가
$@를 소비하므로 필수). - 스냅샷 생성 실패 시
log_*정의 이전 구간임을 고려해echo로 경고하고 미동결 진행. MAM_LOOP_NO_FREEZE=1로 비활성화 가능. 스냅샷 생성 실패는 경고 후 기존 동작으로 폴백.- 회귀 가드 5종 신설 — argv 보존, 파손 래퍼 면역, 스킬 트리 무오염(B-6 경계), 락 해제 및 스냅샷 정리(B-12 경계), 비활성화 스위치.
- 회귀 및 계약 테스트: 271/271 PASS (100%) 달성.
9. 감사 로그 루트 지연 평가 (B-9 / P4-1)
mqtt_common.LOGS_DIR의 import 시점 cwd 고정을 제거하고 호출 시점에 해석하는get_logs_dir()를 도입.chdir이후에도 감사 로그가 현재 워크스페이스에 정확히 기록됨.- PEP 562 모듈
__getattr__로LOGS_DIR속성 접근 하위 호환 유지(동적 평가). - PEP 562
__dir__병행 정의로dir()·탭 완성 가시성 유지. DELEGATE_JOB_LOGS_DIR환경변수가 실행 중 변경까지 반영.- 회귀 가드 5종 신설 — cwd 추종, 실제 파일 생성, 환경변수 동적 반영, 전역 재도입 차단, dir() 탐색성.
- 회귀 및 계약 테스트: 276/276 PASS (100%) 달성.
🛠️ v1.4.0 — Stability, Cleanup & Safe Job Delegation (2026-08-16)
주요 마일스톤: 격리 잔재 정리, 서브셸 루프 락 조기 해제 버그 픽스, 신규 파일 캡처 및 경량화.
- P2-2 (C-3a / C-4 레거시 격리 스텁 및 미사용 심볼 제거):
lib.sh내 빈 스텁 4종(provision_isolation,isolation_lever,isolation_env_prefix,isolation_cmd_args) 및_REAL_HERDR_PATH완전 삭제.registry.py::TERMINAL_STATUSES및create_session.sh::ISOLATE제거.
- P2-1 (B-6 / B-12
delegate_job_safe안정화):.agents/skills/...내 불필요한.tmp복사본 생성 제거 및 인플레이스 직접 실행(bash "$orig_script") 전환.- 서브셸 내
trap으로 인한 루프 락 마커(.mam/loop-guard-active) 조기 삭제 결함(D1) 원천 차단.
- P0-2 (O-2 중복 루프 기동 방지 원자적 락):
loop_lock.sh신설:set -C기반 원자적 락 획득 및 PID + lstart 소유권 검증으로 동시 실행 방지.
- P0-1 (B-7 외곽 diff 수집 및 미추적 파일 캡처):
diff_collect.sh도입: CWD 독립$REPO_ROOT기준 diff 수집 및git ls-files -o미추적 파일 병합.
- B-4 (시프트
ls동적 포시스 타임스탬프 복원):lib.sh554행의created=999999하드코딩을 실시간 타임스탬프(int(time.time()))로 복원.
- 테스트 슈트 경량화:
- 노후화된 중복 레거시 테스트 7개 파일(1,559줄) 삭제 (
cf51b2c).
- 노후화된 중복 레거시 테스트 7개 파일(1,559줄) 삭제 (
🛡️ v1.3.0 — Orchestrator Onboarding & Scoped Guarding (2026-08-15)
주요 마일스톤: 오케스트레이터 신원 격리 및 다중 에이전트 협업 가드레일 확립.
multi-agent-mux-orc-onboard스킬 신설:- 오케스트레이터(
agy)의 대화 UUID를.mam/agent-sessions.yaml내orchestrator_uuids리스트로 등록. find_workspace_uuid및verify_session_uuid에서 오케스트레이터 UUID를 스킵하여 서브에이전트 세션 오염 방지.
- 오케스트레이터(
- O-3 (조건부 오케스트레이션 위임 가드 — Scoped Guard):
- 오케스트레이터가
/multi-agent-mux-loop활성화 상태에서 직접 코드를 수정하지 않고 스크립트로 위임하도록 통제. AGENTS.md§5 및MULTI_AGENT_RULES.md내 가드레일 명시.
- 오케스트레이터가
- 배포 및 패키징 파이프라인 현대화:
deploy/lib_ownership.sh신설 및hooks.json3-way 병합(MERGE_REGISTRY) 지원.- Gitea CI/CD 파이프라인 (
deploy/gitea-ci.yml) 연동.
🔌 v1.2.0 — Universal Herdr Server Isolation & Cline Integration (2026-08-14)
주요 마일스톤: Herdr 단일 서버 격리 및 다중 AI 에이전트 확장.
- Universal Herdr Session Isolation:
HERDR_SESSION_NAME기반으로 격리 서버를 통일하여 프로세스 충돌 방지.
- Cline 에이전트 통합:
clineCLI 기반 대화 세션 생성, 정지, 복원 및 TUI 레디 토큰 핸들링 지원.
- SQLite WAL 트랜잭션 동시성:
- 세션 레지스트리 동시 쓰기 시 발생하는 락 충돌을 방지하기 위해 SQLite WAL 모드 전면 적용.
🧱 v1.0.0 ~ v1.1.0 — Initial Multi-Agent Mux Framework (2026-08-10 ~ 2026-08-13)
주요 마일스톤: 터미널 다중 에이전트 오케스트레이션 기초 설계 및 비동기 루프 완성.
- 핵심 수명주기 스킬군 구축:
create,stop,resume,status,monitor스킬 기본 구현. - MQTT 기반 비동기 잡 위임:
multi-agent-mux-delegate-job을 통한 에이전트 간 이벤트 통신 및 결과 구독. - 자율 협업 루프:
multi-agent-mux-loop컨트롤러를 통한 Planner-Creator-Reviewer 역할 분담 체계 정립.
🧪 품질 보증 및 검증 기준 (Verification Standards)
모든 릴리스는 다음 4단계 엄격한 검증을 통과해야 배포됩니다:
- 정적 문법 검사:
bash -n(모든 셸 스크립트) 및 AST 미사용 코드 분석. - 단위 및 컴포넌트 테스트 (Tier 1~2): 인플레이스 및 컴포넌트 간 상호작용 검증.
- 통합 및 계약 테스트 (Tier 3~4 / Contract): clean environment (
env -u PYTHONPATH) 하에서의 어댑터 계약 및 CLI 브리지 검증. - 멀티에이전트 교차 피어 리뷰: Planner(
claude) 및 Reviewer(cline) 간 교차 검증 및[VERDICT: PASS]100% 합의.