release(v4.8.6): Issue #17 item 4 - archive PR #51 reviews and bump the lockstep version

Merge-workspace review: round 1 (@518beda) claude agy grok PASS, codex
NOT PASS (finalize wait measured on the wall clock); fixed in 4c86107.
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 at
4c86107: 278 passed. Full suite at 518beda on 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
This commit is contained in:
GodopuandClaude Opus 5.5 committed 2026-10-08 01:37:48 +09:00
1 parent 4c86107846
commit 8fde39be33
24 files changed
+735 -26

No files matched your search

@@ -0,0 +1,107 @@
# 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]