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

44 lines
3.3 KiB
Markdown

# 🔍 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]