Final-round reports of the fix/issue-9-14 review loop: planner-reviewer-claude-01
(2d3f24e4), reviewer-agy-01 (47a845e0), reviewer-grok-01 (d7e66053) and
planner-reviewer-codex-01 (0ad7cb06), all [VERDICT: PASS] on ebe58f6.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
60 lines
3.8 KiB
Markdown
60 lines
3.8 KiB
Markdown
# 🔍 Review Report — Job d7e66053 (`fix/issue-9-14`, HEAD `ebe58f6`)
|
||
|
||
- **Reviewer**: `reviewer-grok-01` (role: reviewer) · 2026-09-13
|
||
- **범위**: `git log`/`git diff` **`4d444ce...HEAD`**
|
||
- **HEAD**: `ebe58f6` `fix(issue-14): record every event on disk before the wire publish`
|
||
- **선행**: 본 세션 `b0591d20` `[VERDICT: NOT PASS]` — `publish_event` 가 MQTT 재시도 **뒤**에 `events.log` 를 써서 `test_wrapper_idle_timeout_grace_accepts_disk_heartbeat` 가 2/2 실패.
|
||
- **리뷰 중 소스 무변경.** REBUT 없음 — 지적 수용.
|
||
|
||
커밋: `497633f` … `7c40bf4` → `d5a191c` → `952657e` → **`ebe58f6`**.
|
||
|
||
## 1. Round-2 차단 항목 반영 (`ebe58f6`)
|
||
|
||
| 지적 | 반영 | 교차 확인 |
|
||
|---|---|---|
|
||
| `events.log` 를 MQTT `with_retry` **전**에 기록 | `record_local_event` (`publish_event.py:165-175`) 가 `prepare_event` 직후, `publish()` 직전 (`:358-360`) | ✅ |
|
||
| `DelegationService` 동일 순서 | `service.py:89` local, `:94` publish, `:95-99` outcome | ✅ |
|
||
| 중복 append 금지 | `record_outcome(..., local_event_recorded=True)` 이면 `registry.append_event` 생략 (`:204-205`). 플래그 기본 `False` 라 다른 호출자는 종전대로 뒤에 기록 | ✅ |
|
||
| 테스트는 **`publish_event.py` 경로 유지** | `test_wrapper_idle_timeout_grace_accepts_disk_heartbeat` 여전히 `PUBLISH_PY` 사용 | ✅ |
|
||
| 순서·1회 기록 잠금 | `test_publish_event_records_the_heartbeat_before_the_wire_publish`: `_publish_once` 시점에 이미 `["progress"]`, 이후도 1줄. `test_publish_event_failed_publish_keeps_one_local_record`: 재시도 2회 내내 디스크 1줄, audit `published=False` | ✅ |
|
||
| VERSIONS.md 항목 6 | "와이어 발행 **전에** 로컬 기록" 으로 정정 | ✅ |
|
||
|
||
이전에 2/2 실패하던 래퍼 테스트를 이번 HEAD 에서 관련 스위트에 포함해 다시 돌렸다 → **통과**.
|
||
|
||
## 2. 항목 (1)–(6) 재확인
|
||
|
||
| # | 판정 |
|
||
|---|---|
|
||
| (1) denylist / 설정 상속 | ✅. `CLAUDE_CODE_SSE_PORT` 미포함은 Non-blocking |
|
||
| (2) `MAM_NO_AUTOSTART` + `ls` | ✅ `7c40bf4` 구조화 `error.code` + `952657e` 그 외 실패는 파서에 안 넣음 (`state unknown`). reconcile `is_empty` 와 정합 |
|
||
| (3) `send_keys_safe` | ✅ timeout/stalled only accepted; transport_error rc 4; 무신호 rc 4; 재전송 없음 |
|
||
| (4) R1 | ✅ 디스크 heartbeat(이제 publish **전** 기록) + busy token + working. 창은 관측마다 `IDLE_TIMEOUT` 재개방. 벽시계 `START_TIME+TIMEOUT` (`_within_deadline`). 무응답 ~2×`IDLE_TIMEOUT` 종료는 changelog 에 명시 |
|
||
| (5) T1-7 `transport_error` | ✅ |
|
||
| (6) 락스텝 4.4.2 | ✅ `lib.sh` / `eager.py` / 8 SKILL.md / VERSIONS.md / README·BOOTSTRAP·MESSAGING. 릴리스 커밋 `0918917` |
|
||
|
||
## 3. 테스트
|
||
|
||
```
|
||
.venv/bin/python -m pytest -q \
|
||
tests/test_issue14_delivery_ack.py tests/test_issue9_server_env.py \
|
||
tests/test_issue6_fail_closed.py tests/test_issue6_turn_handshake.py \
|
||
tests/test_a4_adapter_contract.py tests/test_loop_cli.py \
|
||
tests/test_issue5_phase4_runtime.py tests/test_version_consistency.py
|
||
```
|
||
|
||
**119 passed in 382.64s.** (직전 HEAD 는 같은 목록에서 1 fail / 116 pass.)
|
||
|
||
issue9 함수 9 + issue14 함수 12 = changelog 신규 21과 정합. `bash -n` lib.sh/wrapper 클린. `git diff --check 4d444ce...HEAD` 클린.
|
||
|
||
## 4. Non-blocking
|
||
|
||
- `CLAUDE_CODE_SSE_PORT` denylist 미포함.
|
||
- 이미 오염된 herdr 서버는 재기동 전까지 pane 에 마커를 물려줌 (create SKILL.md 명시).
|
||
- 무응답 잡의 fail-close 가 Issue #6 의 `IDLE_TIMEOUT+5s` 에서 ~2×`IDLE_TIMEOUT` 으로 늘었고 changelog 에 적혀 있음.
|
||
|
||
## 5. 종합
|
||
|
||
지난 NOT PASS 의 원인(디스크 heartbeat 가 브로커 ACK 뒤에 찍힘)은 CLI·라이브러리 양쪽에서 고쳤고, 같은 `publish_event.py` 경로 테스트가 통과한다. ls unknown 경로와 R1 벽시계는 유지된다. 설계 재작업 불필요.
|
||
|
||
[VERDICT: PASS]
|