Files
multi-agent-mux/.agents/reports/reviewer-grok-01/report-4c34bbf5.md
T
GodopuandClaude Opus 5.5 53f87e4560 release(v4.8.0): bump framework and eight skills to 4.8.0 in lockstep; archive PR #41 reviews (three rounds)
Issue #33 (job budget, wall_clock_timeout vs deadline_timeout) and
Issue #30 (notify-only stall watcher). Reviews of PR #41 in the merge
workspace: round 1 (@1673818) claude N1 / codex R1 R2 NOT PASS, agy grok
PASS; round 2 (@af0a2a2) grok N1 / codex D1 D2 NOT PASS, claude agy PASS;
round 3 (@9200562) 4/4 PASS. Reports and the round-3 identity sidecars go
to .agents/reports/<session>/. The design consensus on items A-D is in the
VERSIONS.md entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
2026-09-26 16:08:37 +09:00

3.3 KiB

🔍 Review Report — Job 4c34bbf5 (PR #41 델타 1673818...af0a2a2)

  • Reviewer: reviewer-grok-01 · 2026-09-26
  • 검증 경로: /var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20260926T052018Z-597343/1
  • identity: head af0a2a2 tree 0310682 (일치)
  • 본 체크아웃: main 8ea65bb 유지

git diff --check 1673818...HEAD 클린. 커밋 1개.

NOT PASS

N1. TERM 을 삼킨 감시자를 죽이는 5초가 idle 유예보다 앞에서 돌아, 침묵 잡이 14초 안에 안 닫힌다

stop_stall_watch (multi-agent-mux-delegate-job:715-723) 는 TERM 후 최대 5초를 재고 나서야 KILL·wait 한다. 그 다음에야 finalize_unfinished 의 디스크 유예가 시작된다 (:385 다음 :391).

test_wrapper_idle_timeout_grace_ignores_pane_busy_token 은 started 뒤 14초 침묵이면 rc 2 / deadline_timeout 이고, 그 사이 update --status completed 는 거부되어야 한다 (test_issue14_delivery_ack.py:352-361). 이번 실행 stderr:

subscriber ... idle timeout (3s) → stall watch ... ignored TERM; killed → liveness: ... diagnostic only → wrapper rc 0.

감시자가 fork-exec 창에서 TERM 을 삼키면 닫기 시계가 약 5초 늦고, 3초 idle + 5초 kill + 3초 유예가 14초를 넘는다. 테스트의 completed 쓰기가 아직 열린 잡에 들어가 래퍼가 0 으로 끝난다. 같은 테스트 재실행도 실패.

대안: 유예 시계를 감시자 kill 과 겹치게 하거나, 이 테스트의 대기를 kill 예산+유예보다 길게(예: 25초) 하라. 전자가 맞다. 삼킨 TERM 이 deadline_timeout 자체를 미루면 안 된다.

이 델타에서 닫힌 것

항목 결과
N1 무한 wait TERM 5초 후 KILL 뒤 wait. STALL_PID 비면 즉시 return. 이미 죽었으면 wait 로 회수하고 rc 를 stderr 에 남긴다. KILL 이 거부되면 wait 가 다시 무한이 될 수 있다(비차단, 같은 uid 에서는 안 남).
--watch-pid ProcessLookupError 만 죽음. PermissionError 는 살아 있음 (stall_watch.py _alive). pid 0 은 그룹 신호라 조기 종료되지 않음.
R1 trap 없음 래퍼가 사라지면 감시자가 다음 herdr wait(≤60초) 안에 rc 0. herdr CLI 는 timeout 안에 끝난다. trap 합성은 항목 4 로 미룬 판단이 맞다.
R2 wait 직후와 nudge 직전 _dispatch_open. 파일 없음은 종료, 읽기 실패는 계속. 발행 거부면 prompt 없음(nudged 유지). blocked 알림도 wait 직후 검사 뒤에만 _act 에 들어가므로, 대기 중 닫힌 잡에는 안 나간다.
M8 S6 만 /proc. r4 stub 은 time.time(). macOS 에서 맞다.
SKILL 수명 한 줄, v4.8.0, rc 2 는 idle, 예산 소진은 wall_clock_timeout, 브로커 행은 예산이 닿으면 wall.

1회차 비차단 중 이 커밋이 닫은 것: 감시자 수명(TERM/KILL, watch-pid), S6 의 macOS skip, SKILL 종료 코드 문구. 남은 것: MAM_TEST_UNRELIABLE_AGENT 훅, B3 공개 브로커 지연, 라벨 선택의 Python 이전(항목 4).

테스트

test_issue30_stall_watch_stop.py + test_issue30_stall_watch.py + test_issue14_delivery_ack.py + test_tier1_unit.py

1 failed, 132 passed, 1 skipped in 575s. 실패는 위 N1. 신규 종료 테스트 7건은 통과. 재실행도 같은 실패.

[VERDICT: NOT PASS]