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
6.4 KiB
PR #51 (refactor/issue-17-item4) Round 2 Delta Review Report
- Reviewer Agent:
agy(session:herdr:reviewer-agy-01) - Job ID:
f430b100 - Verification Directory:
/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261007T155310Z-56d5a7/1 - Base Commit:
518bedac5d8ab832347bfc6682b146f3201021f1(Round 1 head) - Head Commit:
4c86107846d1e037f9a69a1201257725e8673179(Round 2 head) - Delta Under Inspection:
git diff 518beda 4c86107(Commit4c86107)
1. Executive Summary
In Round 1, claude, agy, and grok approved PR #51 (PASS), while codex reported finding R1: wrapper._sleep previously computed elapsed intervals using time.time(). If the host wall clock stepped backward during broker re-observation or heartbeat grace loops (due to NTP sync or clock adjustments), the sleep duration was artificially extended by the step-back delta (e.g. 1s became 11s), deviating from bash's sleep which measures elapsed time via monotonic OS timers.
Commit 4c86107 fixes this issue by switching _sleep to time.monotonic(). Absolute deadlines, evidence windows, and timestamps continue to use wall clock (time.time()), strictly matching the original bash behavior.
All review criteria have been evaluated and verified. The unit tests and full relevant suites passed cleanly (321 passed, 0 failed).
2. Evaluation of Codex R1 Finding
| # | Item | Defect Description | Resolution in 4c86107 |
Verification Status |
|---|---|---|---|---|
| R1 | Sleep duration stretched by wall clock step-back | wrapper._sleep used end = time.time() + seconds and left = end - time.time(). A backward wall clock shift increased left, unduly delaying broker re-observation (up to 3s) and disk heartbeat grace checks (1s). |
In lib_py/delegation/wrapper.py:_sleep, interval tracking switched to time.monotonic() (end = time.monotonic() + seconds, left = end - time.monotonic()). |
CLOSED (Verified) |
3. Analysis Against Review Criteria
Criterion 1: Resolution of Codex R1
In the baseline bash implementation, sleep 1 or sleep "$left" invokes the kernel sleep syscall, which measures relative elapsed duration monotonically and is completely unaffected by wall clock time adjustments.
With commit 4c86107, _sleep now computes relative duration strictly using time.monotonic(), eliminating any sensitivity to system clock backward jumps and restoring complete behavioral identity with bash.
Criterion 2: Monotonic vs. Wall-Clock Separation & Policy Preservation
The usage of time.monotonic() is strictly confined to internal sleep duration slicing in _sleep:
- Sleep Span Measurement:
end = time.monotonic() + secondsandleft = end - time.monotonic()measure relative elapsed time. - Process Liveness Polling:
time.sleep(min(left, 0.5))ensures the parent wrapper's PID is inspected via_check_owner()at least every 0.5s. - Absolute Deadlines: In
finalize_beginandfinalize_end, deadline calculation and comparison remain anchored to the wall clock:deadline = (start_time if start_time is not None else _now()) + timeoutleft = deadline - _now()if _now() >= deadline: clock = "wall"
- Evidence Windows:
evidence_until = _now() + idle_timeoutandif _now() >= evidence_until: breakuse wall clock. - Timestamping: Event logging and
events.logtimestamps rely on UTC calendar time (time.time()/time.gmtime()).
There is zero conflation between the clocks: relative interval sleeping uses monotonic time, while protocol deadlines and audit timestamps use wall clock.
Criterion 3: Test Determinism and Coverage
The new test test_u_a_wait_is_not_stretched_by_a_wall_clock_step_back utilizes a mock _SteppedClock:
- Simulates a 10s backward jump of the wall clock during the first sleep cycle.
- Advances both
wallandmonodeterministically uponsleep(dt). - Validates that for
seconds = 1andseconds = 3, total elapsed slept time is bounded within[seconds, seconds + 0.5]. - Because the mock clock operates virtually in memory without real-time OS sleep delays, execution completes in microseconds with 100% determinism.
Criterion 4: Scope and Surgical Precision
The delta across commits 518beda..4c86107 modifies only 2 files:
lib_py/delegation/wrapper.py: +5 lines, -2 lines (updated docstring and clock source).tests/test_issue17_item4_decisions.py: +37 lines (added mock clock class and unit test). Zero unrelated files or formatting changes were touched.
4. Test Suite Execution & Verification Results
All tests were executed within the designated review directory:
/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261007T155310Z-56d5a7/1
4.1. Decisions & Budget Suites (Primary Delta)
AGENT_PYTHON_BIN=/Users/godopu16/PuKi/laa/canary_projects/multi-agent-mux-wt/pr-51/.venv/bin/python \
PYTHONDONTWRITEBYTECODE=1 \
/Users/godopu16/PuKi/laa/canary_projects/multi-agent-mux-wt/pr-51/.venv/bin/python \
-m pytest -p no:cacheprovider -q --basetemp=/tmp/pytest-pr51-r2 \
tests/test_issue17_item4_decisions.py \
tests/test_issue33_budget.py
- Exit Code:
0 - Output:
278 passed in 318.06s (0:05:18)
4.2. Auxiliary Liveness & Delivery Ack Suites
AGENT_PYTHON_BIN=/Users/godopu16/PuKi/laa/canary_projects/multi-agent-mux-wt/pr-51/.venv/bin/python \
PYTHONDONTWRITEBYTECODE=1 \
/Users/godopu16/PuKi/laa/canary_projects/multi-agent-mux-wt/pr-51/.venv/bin/python \
-m pytest -p no:cacheprovider -q --basetemp=/tmp/pytest-pr51-r2-ack \
tests/test_issue18_liveness_contract.py \
tests/test_issue14_delivery_ack.py
- Exit Code:
0 - Output:
43 passed in 229.14s (0:03:49)
Combined Results: 321 passed, 0 failed.
5. Non-Blocking Informational Notes
The non-blocking suggestions surfaced in Round 1 (claude N1–N5: package import vs paho docstring note, _decide 255 fallback, lib_int.sh python3 path, PR description typo 0.2s vs 0.5s) are recognized as follow-up cleanup items that do not compromise correctness or security.
6. Conclusion & Final Verdict
Codex R1 is cleanly resolved with surgical precision. Interval sleeping is monotonic, deadline policy is preserved, and all tests pass deterministically.
[VERDICT: PASS]