Issue #9·#14 를 해결한 fix/issue-9-14(v4.4.2, HEAD 9e1f0b6) 리뷰 루프에서 리뷰어 4명(claude·agy·grok·codex)이 PASS 판정과 함께 남긴 비차단 권고와, 2회차 반복에서 관측된 codex 무응답 사례를 하나의 후속 과제로 묶습니다. 모두 같은 코드 영역 — send_keys_safe 의 전달 확인과 위임 래퍼의 생존(liveness) 판정 — 에 걸친 빈틈·문서화 누락이며, 현재 동작이 깨져 있는 것은 아닙니다.
내용: grok 리뷰가 CLAUDE_CODE_SSE_PORT 미포함을 지적. 현재 목록은 이번 실측에서 관측된 마커 + orc_onboard.sh 가 아는 family id 만 담고 있음. Claude Code 및 다른 에이전트 CLI 의 호스트/세션 마커를 한 번 더 조사해 보강(단, 설정값은 계속 상속).
내용: 화면 리사이즈·모달 팝업·이전 턴의 애니메이션 등 프롬프트 제출과 무관한 변화도 전달 신호로 읽힐 수 있음(codex·claude 리뷰 공통 지적). busy 토큰·working 상태에 비해 약한 신호이므로, 입력 영역 변화 제외·모달 토큰 재검사 등으로 좁히거나 마지막 수단으로만 쓰도록 검토.
관련 사례 (항목 8): 2회차 루프 반복 2 에서 codex 리뷰 job e657c660 이 주입 성공으로 처리됐으나 codex 대화 기록에 해당 프롬프트 흔적이 없고 4분간 이벤트가 없어 deadline_timeout 으로 닫힘. 이 신호의 오탐이었을 가능성이 있음.
3. _inject_acknowledged 의 dispatch 토큰 미고정
위치: multi-agent-mux-delegate-job:577
내용: pending 이 아닌 어떤 상태든 "에이전트가 받았다"로 봄. 외부 취소·오류 등 에이전트가 아닌 기록자의 전이도 같은 조건을 만족(codex 1회차 지적). 이후 터미널 처리가 error/cancelled 를 성공으로 바꾸지는 않지만, 판정을 현재 dispatch 의 dispatch_token/attempt_id 에 고정하면 더 정확함.
4. _agent_still_working 의 busy 토큰 필터
위치: multi-agent-mux-delegate-job:596
내용: pane 최근 8줄의 esc to interrupt 문자열만 보므로, 인용된 옛 출력이나 도움말 텍스트에 같은 문구가 남아 있어도 "작업 중"으로 읽힘. 대기는 벽시계로 유한하지만 판정 정밀도를 높일 여지 있음(예: 상태 줄 위치·스피너 패턴 결합).
5. _within_deadline 의 "Terminated" 출력 잡음
위치: multi-agent-mux-delegate-job:606
내용: 마감 시 프로브 프로세스를 kill 하면 셸이 Terminated 를 stderr 에 찍어 래퍼 로그를 어지럽힘. 동작 문제는 없음. wait 전 리다이렉트나 disown/서브셸로 정리.
6. 무응답 잡 fail-close 시간 증가를 계약 문서에 명시
위치: multi-agent-mux-delegate-job:743-754 (R1 유예 창), 계약 문서 .agents/MULTI_AGENT_RULES.md "Timeout Configuration" 및 docs/contracts/issue-6/*
내용: Issue #6 은 무응답 잡을 IDLE_TIMEOUT + 5s 에 닫는다고 약속했으나, 디스크 heartbeat 유예 도입 후 실제로는 마지막 와이어 이벤트 기준 약 2 × IDLE_TIMEOUT(구독자 idle 대기 + 유예 창)이며 heartbeat 간격도 최대 약 2 × IDLE_TIMEOUT 까지 허용됨. VERSIONS.md v4.4.2 에는 적혀 있으나 규칙·계약 문서는 아직 이전 값. 문서를 갱신하거나 창 크기를 별도 knob 으로 분리.
내용: ebe58f6 이후 events.log 는 브로커 발행 전에 기록되므로 "수락된(ACK 된) 이벤트"가 아니라 "시도된 이벤트"의 기록(CAS 에서 거부된 발행분 포함). 이 파일을 상태 판단에 쓰는 코드가 생기지 않도록 한 줄 명시.
8. codex 무응답 사례 조사 (e657c660)
관측: 2026-09-12 17:30:18Z 등록 → 주입 성공 처리 → codex 이벤트 0건 → 17:34:21Z deadline_timeout. ~/.codex/sessions 의 codex 대화 기록에 job id 가 전혀 등장하지 않음. 반복 3 에서는 같은 세션이 정상 리뷰(0ad7cb06, PASS).
가설: (a) 항목 2 의 오탐(모달 등이 입력을 삼킨 뒤 화면만 변화), (b) herdr 가 codex 의 working 을 보고하지 않아 wait_for_agent_idle 이 턴 도중에도 idle 로 판단, 이전 턴이 끝나기 전에 프롬프트가 주입됨. 재현 시 pane 캡처·herdr 상태를 함께 남기는 진단 로그 추가 검토.
참고
리뷰어 공통 확인 사항: 위 항목들은 모두 비차단으로 분류됐고, 브랜치는 만장일치 PASS·전체 스위트 819/819 통과 상태.
MAM Version: v4.4.2 (fix/issue-9-14 @ 9e1f0b6, main 4d444ce 위)
Agent: codex (planner-reviewer-codex-01, gpt-6-astra high) 외 claude/agy/grok
## 개요 (Summary)
Issue #9·#14 를 해결한 `fix/issue-9-14`(v4.4.2, HEAD `9e1f0b6`) 리뷰 루프에서 리뷰어 4명(claude·agy·grok·codex)이 **PASS 판정과 함께 남긴 비차단 권고**와, 2회차 반복에서 관측된 codex 무응답 사례를 하나의 후속 과제로 묶습니다. 모두 같은 코드 영역 — `send_keys_safe` 의 전달 확인과 위임 래퍼의 생존(liveness) 판정 — 에 걸친 빈틈·문서화 누락이며, 현재 동작이 깨져 있는 것은 아닙니다.
근거 리포트: `.agents/reports/planner-reviewer-claude-01/report-2d3f24e4.md` §3, `.agents/reports/reviewer-grok-01/report-d7e66053.md` §4, `.agents/reports/planner-reviewer-codex-01/report-0ad7cb06.md`, 1회차 `.mam/jobs/df9215c6/codex-reports/report-final.md` "Non-blocking".
---
## 항목 (Items)
### 1. 서버 env denylist 보강 — 추가 런타임 마커
- **위치**: `.agents/skills/lib.sh:236` (`deny = (...)`)
- **내용**: grok 리뷰가 `CLAUDE_CODE_SSE_PORT` 미포함을 지적. 현재 목록은 이번 실측에서 관측된 마커 + `orc_onboard.sh` 가 아는 family id 만 담고 있음. Claude Code 및 다른 에이전트 CLI 의 호스트/세션 마커를 한 번 더 조사해 보강(단, 설정값은 계속 상속).
### 2. `send_keys_safe` 의 "pane 변화" 전달 신호 오탐 가능성
- **위치**: `.agents/skills/lib.sh:2548` (accepted 제출 후 `cur_pane != rpc_pre_pane` 이면 전달로 인정)
- **내용**: 화면 리사이즈·모달 팝업·이전 턴의 애니메이션 등 프롬프트 제출과 무관한 변화도 전달 신호로 읽힐 수 있음(codex·claude 리뷰 공통 지적). busy 토큰·`working` 상태에 비해 약한 신호이므로, 입력 영역 변화 제외·모달 토큰 재검사 등으로 좁히거나 마지막 수단으로만 쓰도록 검토.
- **관련 사례 (항목 8)**: 2회차 루프 반복 2 에서 codex 리뷰 job `e657c660` 이 주입 성공으로 처리됐으나 codex 대화 기록에 해당 프롬프트 흔적이 없고 4분간 이벤트가 없어 `deadline_timeout` 으로 닫힘. 이 신호의 오탐이었을 가능성이 있음.
### 3. `_inject_acknowledged` 의 dispatch 토큰 미고정
- **위치**: `multi-agent-mux-delegate-job:577`
- **내용**: `pending` 이 아닌 어떤 상태든 "에이전트가 받았다"로 봄. 외부 취소·오류 등 에이전트가 아닌 기록자의 전이도 같은 조건을 만족(codex 1회차 지적). 이후 터미널 처리가 error/cancelled 를 성공으로 바꾸지는 않지만, 판정을 현재 dispatch 의 `dispatch_token`/`attempt_id` 에 고정하면 더 정확함.
### 4. `_agent_still_working` 의 busy 토큰 필터
- **위치**: `multi-agent-mux-delegate-job:596`
- **내용**: pane 최근 8줄의 `esc to interrupt` 문자열만 보므로, 인용된 옛 출력이나 도움말 텍스트에 같은 문구가 남아 있어도 "작업 중"으로 읽힘. 대기는 벽시계로 유한하지만 판정 정밀도를 높일 여지 있음(예: 상태 줄 위치·스피너 패턴 결합).
### 5. `_within_deadline` 의 "Terminated" 출력 잡음
- **위치**: `multi-agent-mux-delegate-job:606`
- **내용**: 마감 시 프로브 프로세스를 `kill` 하면 셸이 `Terminated` 를 stderr 에 찍어 래퍼 로그를 어지럽힘. 동작 문제는 없음. `wait` 전 리다이렉트나 `disown`/서브셸로 정리.
### 6. 무응답 잡 fail-close 시간 증가를 계약 문서에 명시
- **위치**: `multi-agent-mux-delegate-job:743-754` (R1 유예 창), 계약 문서 `.agents/MULTI_AGENT_RULES.md` "Timeout Configuration" 및 `docs/contracts/issue-6/*`
- **내용**: Issue #6 은 무응답 잡을 `IDLE_TIMEOUT + 5s` 에 닫는다고 약속했으나, 디스크 heartbeat 유예 도입 후 실제로는 마지막 와이어 이벤트 기준 약 `2 × IDLE_TIMEOUT`(구독자 idle 대기 + 유예 창)이며 heartbeat 간격도 최대 약 `2 × IDLE_TIMEOUT` 까지 허용됨. VERSIONS.md v4.4.2 에는 적혀 있으나 규칙·계약 문서는 아직 이전 값. 문서를 갱신하거나 창 크기를 별도 knob 으로 분리.
### 7. `events.log` 의 의미 문서화
- **위치**: `lib_py/delegation/registry.append_event` docstring, `MESSAGING.md`
- **내용**: `ebe58f6` 이후 `events.log` 는 브로커 발행 **전에** 기록되므로 "수락된(ACK 된) 이벤트"가 아니라 "시도된 이벤트"의 기록(CAS 에서 거부된 발행분 포함). 이 파일을 상태 판단에 쓰는 코드가 생기지 않도록 한 줄 명시.
### 8. codex 무응답 사례 조사 (`e657c660`)
- **관측**: 2026-09-12 17:30:18Z 등록 → 주입 성공 처리 → codex 이벤트 0건 → 17:34:21Z `deadline_timeout`. `~/.codex/sessions` 의 codex 대화 기록에 job id 가 전혀 등장하지 않음. 반복 3 에서는 같은 세션이 정상 리뷰(`0ad7cb06`, PASS).
- **가설**: (a) 항목 2 의 오탐(모달 등이 입력을 삼킨 뒤 화면만 변화), (b) herdr 가 codex 의 `working` 을 보고하지 않아 `wait_for_agent_idle` 이 턴 도중에도 idle 로 판단, 이전 턴이 끝나기 전에 프롬프트가 주입됨. 재현 시 pane 캡처·herdr 상태를 함께 남기는 진단 로그 추가 검토.
---
## 참고
- 리뷰어 공통 확인 사항: 위 항목들은 모두 비차단으로 분류됐고, 브랜치는 만장일치 PASS·전체 스위트 819/819 통과 상태.
- 우선순위 제안: 2·8(오탐/무응답) > 3·4(판정 정밀도) > 6·7(문서) > 1·5(보강/정리).
## 환경 정보 (Environment)
- OS: macOS (Darwin 25.6.0), herdr 0.9.0
- MAM Version: v4.4.2 (`fix/issue-9-14` @ `9e1f0b6`, main `4d444ce` 위)
- Agent: codex (`planner-reviewer-codex-01`, gpt-6-astra high) 외 claude/agy/grok
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
개요 (Summary)
Issue #9·#14 를 해결한
fix/issue-9-14(v4.4.2, HEAD9e1f0b6) 리뷰 루프에서 리뷰어 4명(claude·agy·grok·codex)이 PASS 판정과 함께 남긴 비차단 권고와, 2회차 반복에서 관측된 codex 무응답 사례를 하나의 후속 과제로 묶습니다. 모두 같은 코드 영역 —send_keys_safe의 전달 확인과 위임 래퍼의 생존(liveness) 판정 — 에 걸친 빈틈·문서화 누락이며, 현재 동작이 깨져 있는 것은 아닙니다.근거 리포트:
.agents/reports/planner-reviewer-claude-01/report-2d3f24e4.md§3,.agents/reports/reviewer-grok-01/report-d7e66053.md§4,.agents/reports/planner-reviewer-codex-01/report-0ad7cb06.md, 1회차.mam/jobs/df9215c6/codex-reports/report-final.md"Non-blocking".항목 (Items)
1. 서버 env denylist 보강 — 추가 런타임 마커
.agents/skills/lib.sh:236(deny = (...))CLAUDE_CODE_SSE_PORT미포함을 지적. 현재 목록은 이번 실측에서 관측된 마커 +orc_onboard.sh가 아는 family id 만 담고 있음. Claude Code 및 다른 에이전트 CLI 의 호스트/세션 마커를 한 번 더 조사해 보강(단, 설정값은 계속 상속).2.
send_keys_safe의 "pane 변화" 전달 신호 오탐 가능성.agents/skills/lib.sh:2548(accepted 제출 후cur_pane != rpc_pre_pane이면 전달로 인정)working상태에 비해 약한 신호이므로, 입력 영역 변화 제외·모달 토큰 재검사 등으로 좁히거나 마지막 수단으로만 쓰도록 검토.e657c660이 주입 성공으로 처리됐으나 codex 대화 기록에 해당 프롬프트 흔적이 없고 4분간 이벤트가 없어deadline_timeout으로 닫힘. 이 신호의 오탐이었을 가능성이 있음.3.
_inject_acknowledged의 dispatch 토큰 미고정multi-agent-mux-delegate-job:577pending이 아닌 어떤 상태든 "에이전트가 받았다"로 봄. 외부 취소·오류 등 에이전트가 아닌 기록자의 전이도 같은 조건을 만족(codex 1회차 지적). 이후 터미널 처리가 error/cancelled 를 성공으로 바꾸지는 않지만, 판정을 현재 dispatch 의dispatch_token/attempt_id에 고정하면 더 정확함.4.
_agent_still_working의 busy 토큰 필터multi-agent-mux-delegate-job:596esc to interrupt문자열만 보므로, 인용된 옛 출력이나 도움말 텍스트에 같은 문구가 남아 있어도 "작업 중"으로 읽힘. 대기는 벽시계로 유한하지만 판정 정밀도를 높일 여지 있음(예: 상태 줄 위치·스피너 패턴 결합).5.
_within_deadline의 "Terminated" 출력 잡음multi-agent-mux-delegate-job:606kill하면 셸이Terminated를 stderr 에 찍어 래퍼 로그를 어지럽힘. 동작 문제는 없음.wait전 리다이렉트나disown/서브셸로 정리.6. 무응답 잡 fail-close 시간 증가를 계약 문서에 명시
multi-agent-mux-delegate-job:743-754(R1 유예 창), 계약 문서.agents/MULTI_AGENT_RULES.md"Timeout Configuration" 및docs/contracts/issue-6/*IDLE_TIMEOUT + 5s에 닫는다고 약속했으나, 디스크 heartbeat 유예 도입 후 실제로는 마지막 와이어 이벤트 기준 약2 × IDLE_TIMEOUT(구독자 idle 대기 + 유예 창)이며 heartbeat 간격도 최대 약2 × IDLE_TIMEOUT까지 허용됨. VERSIONS.md v4.4.2 에는 적혀 있으나 규칙·계약 문서는 아직 이전 값. 문서를 갱신하거나 창 크기를 별도 knob 으로 분리.7.
events.log의 의미 문서화lib_py/delegation/registry.append_eventdocstring,MESSAGING.mdebe58f6이후events.log는 브로커 발행 전에 기록되므로 "수락된(ACK 된) 이벤트"가 아니라 "시도된 이벤트"의 기록(CAS 에서 거부된 발행분 포함). 이 파일을 상태 판단에 쓰는 코드가 생기지 않도록 한 줄 명시.8. codex 무응답 사례 조사 (
e657c660)deadline_timeout.~/.codex/sessions의 codex 대화 기록에 job id 가 전혀 등장하지 않음. 반복 3 에서는 같은 세션이 정상 리뷰(0ad7cb06, PASS).working을 보고하지 않아wait_for_agent_idle이 턴 도중에도 idle 로 판단, 이전 턴이 끝나기 전에 프롬프트가 주입됨. 재현 시 pane 캡처·herdr 상태를 함께 남기는 진단 로그 추가 검토.참고
환경 정보 (Environment)
fix/issue-9-14@9e1f0b6, main4d444ce위)planner-reviewer-codex-01, gpt-6-astra high) 외 claude/agy/grok