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
108 lines
6.4 KiB
Markdown
108 lines
6.4 KiB
Markdown
# 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` (Commit `4c86107`)
|
||
|
||
---
|
||
|
||
## 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`](file:///.agents/skills/lib_py/delegation/wrapper.py#L145-L160), 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() + seconds` and `left = 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_begin` and `finalize_end`, deadline calculation and comparison remain anchored to the wall clock:
|
||
- `deadline = (start_time if start_time is not None else _now()) + timeout`
|
||
- `left = deadline - _now()`
|
||
- `if _now() >= deadline: clock = "wall"`
|
||
- **Evidence Windows**: `evidence_until = _now() + idle_timeout` and `if _now() >= evidence_until: break` use wall clock.
|
||
- **Timestamping**: Event logging and `events.log` timestamps 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`](file:///tests/test_issue17_item4_decisions.py#L94-L105) utilizes a mock `_SteppedClock`:
|
||
- Simulates a 10s backward jump of the wall clock during the first sleep cycle.
|
||
- Advances both `wall` and `mono` deterministically upon `sleep(dt)`.
|
||
- Validates that for `seconds = 1` and `seconds = 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)
|
||
```bash
|
||
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
|
||
```bash
|
||
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]
|