Merge-workspace review: round 1 (@518beda) claude agy grok PASS, codex NOT PASS (finalize wait measured on the wall clock); fixed in4c86107. Round 2 delta (@4c86107) claude agy grok PASS; codex (24b21b9c, after 817d1650 closed deadline_timeout with no report) found R1 closed and no new defect, but withheld PASS only because its sandbox could not bind the suite's loopback broker. The same two-file suite run here at4c86107: 278 passed. Full suite at518bedaon macOS / Python 3.9: 1711 passed / 1 failed / 38 skipped; the failure (test_issue45_restore, herdr 0.9.3 cwd restore) also fails on main. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
3.7 KiB
3.7 KiB
리뷰 리포트 — Job b0c15e45 (PR #51 2회차 델타, 518beda..4c86107)
- 리뷰어: planner-reviewer-claude-01 (claude)
- 리뷰 identity: loop-20261007T155310Z-56d5a7 / base
518beda/ head4c86107/ treee6f67f6— 검증 경로에서git rev-parse HEAD 'HEAD^{tree}'일치, 미커밋 변경 없음 - 범위(항목 4): lib_py/delegation/wrapper.py
_sleep(+6/−3, 주석 포함)과 테스트 1개 추가. 래퍼 bash·문서·버전 변경 없음.
결론 요약
codex R1 이 닫혔다. monotonic 은 _sleep 의 대기 길이에만 쓰이고, 마감·evidence 창·이벤트 시각은 벽시계 그대로라 옛 bash 정책과 같다. 새 테스트는 결정적이며 이전 코드에서 실패한다. 차단 결함 없음.
1. R1 종결
| 지적 (codex 1회차) | 수정 | 확인 |
|---|---|---|
R1 _sleep 이 time.time() 으로 남은 시간을 재서, 대기 중 벽시계가 뒤로 바뀌면 대기가 늘어남(1 s→11 s, 3 s→13 s) |
wrapper.py:145-156 — end/left 를 time.monotonic() 으로 계산 |
새 테스트 test_u_a_wait_is_not_stretched_by_a_wall_clock_step_back[1, 3] 통과. 이전 wrapper.py(518beda)를 넣은 스크래치 사본에서는 assert 11.0 <= 1.5, assert 13.0 <= 3.5 로 2 failed — 지적한 증상 그대로 재현 |
2. 벽시계 정책이 섞이지 않는가
- monotonic 이 쓰이는 곳은
_sleep(:150, :153) 뿐이다. 벽시계는 그대로:_now()(:45-46, bashdate +%s), 마감start_time + timeout(:203), broker 재관측의 남은 시간deadline - _now()(:208)와 마감 도달 판정(:218), 유예 루프 조건·evidence 창·마감 판정(:226-240), 디스크 heartbeat 의 나이time.time() - seen(:115, 이벤트 timestamp 가 벽시계이므로 맞다). - 옛 bash 와 같다:
sleep 1/sleep "$left"는 경과 시간(벽시계 무관)이고, 마감·창은$(date +%s). broker 루프는min(deadline - _now(), 3)을 벽시계로 구한 뒤 그 길이만큼 monotonic 으로 잔다 — bash 의left계산 후sleep "$left"와 동일. - 래퍼 생존 확인(0.5 s 간격)은
_sleep안의time.sleep(min(left, 0.5))와 매 반복_check_owner로, 간격 자체가 monotonic 남은 시간 기준이 되었을 뿐 확인 빈도·조건은 같다.
3. 테스트 결정성
_SteppedClock이 모듈의time을 대체해 실제 시간·sleep 을 쓰지 않는다(0.1 s 에 끝). 첫 sleep 중 벽시계만 10 s 역행시키고slept를 정확히 누적하므로 결과는 입력으로 결정된다(현재 코드에서 slept == seconds). 3회 반복 모두 통과. 상한seconds + 0.5와 옛 결과(+10)의 차이가 커서 오탐 여지가 없다.- 이 테스트는 벽시계가 앞으로 뛰는 경우는 다루지 않지만, 그 경우는 옛 bash 와 마찬가지로 마감 쪽(벽시계)이 일찍 끝나는 것이 정책이므로 대상이 아니다.
4. 테스트 실행
| 실행 | 결과 |
|---|---|
| 지정 2개 파일(test_issue17_item4_decisions, test_issue33_budget), pr-51 .venv Python 3.9.6 | 278 passed / 0 failed (325 s) |
| 새 테스트, 이전 wrapper.py 사본 | 2 failed (11.0, 13.0) |
- 브리프 주의대로 모든 실행을
env -i로 HERDR_·MAM_·MQTT_*·WORKSPACE_ROOT 를 비우고 임시 HOME(스크래치)으로 돌렸다(탐침 사본에는 WORKSPACE_ROOT 를 그 사본으로 명시). 실제 .mam·다른 워크스페이스·herdr 서버를 건드리지 않았다. - PR 설명의 전체 스위트 실패 1건(test_issue45_restore 의 $HOME 복원, herdr 0.9.3)은 이 델타가 건드리지 않는 파일이며 main 에서도 같다는 설명과 일치한다(이번에 재실행하지 않음).
5. 비차단
1회차 N1~N3·N5 는 후속으로 남겨 둔 데 동의한다. 이번 델타에 새 관찰은 없다.
[VERDICT: PASS]