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
2.2 KiB
🔍 Review Report — Job 47664c25 (PR #41 3회차 af0a2a2...9200562)
- Reviewer:
reviewer-grok-01· 2026-09-26 - 검증 경로:
/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20260926T062809Z-914379/1 - identity: head
9200562treec8425e2(일치) - 본 체크아웃:
main8ea65bb유지
git diff --check af0a2a2...HEAD 클린. 커밋 1개.
(1) KILL — 타당
stop_stall_watch (multi-agent-mux-delegate-job:711-716) 는 살아 있으면 kill -9 후 wait. 감시자의 TERM 핸들러는 os._exit 뿐이라 flush 할 상태가 없다. KILL 은 fork-exec 창에서도 삼켜지지 않고, wait 는 즉시 좀비를 거둔다. STALL_PID 가 비면 return. 이미 끝났으면 wait 로 rc 만 보고한다. herdr CLI 와 publish_event 자식은 각자 timeout(30s/120s) 으로 끝난다. 2회차의 5초 예산은 없다.
(2)(3) prompt 앞 게이트
_may_prompt (stall_watch.py) 는 래퍼가 살아 있고 strict 레코드(읽힘, 비종결, 같은 token/attempt)일 때만 키를 보낸다. 발행 rc 는 보지 않고 레코드를 다시 읽는다. 읽기 오류는 strict 에서 거부. _wrapper_gone 은 루프 머리, 매 wait 직후(알림보다 앞), _may_prompt 에 있다. 게이트와 prompt() 사이 마이크로초 창은 레지스트리 락 없이는 못 닫는다. 알림 전용이라 그 창은 받아들여도 된다.
(4) 테스트
신규 4건은 in-process (wait_once/_notify 주입). 프로세스 테스트는 finally 에서 kill. 잔류를 남기는 경로가 없다.
2회차 N1
| 항목 | 상태 |
|---|---|
5초 TERM 예산이 deadline_timeout 을 미룸 |
닫힘. KILL 은 시계를 밀지 않는다. |
test_issue14 pane-busy |
이 실행에서 통과. 작성자가 본 실패(구독자 handshake 타임아웃, ignored TERM 없음, 브로커가 ~14초 무전달)는 감시자 5초와 다른 플레이크다. 그 분류에 동의한다. |
테스트
test_issue30_stall_watch_stop.py + test_issue30_stall_watch.py + test_issue14_delivery_ack.py
70 passed, 1 skipped in 426.71s.
종합
2회차 N1 과 codex D1/D2 가 코드·이 실행과 맞다. 설계 재작업 불필요.
[VERDICT: PASS]