Merge-workspace review loop (--all-reviewer): round 1 (@8241bd5) claude grok PASS, agy NOT PASS (two static wrapper-literal tests did not follow _decided/_exit_for), codex NOT PASS (R1: a yes/no decision that could not run read as "no"); fixed in541c3feand65b78b6. Round 2 (@65b78b6) 4/4 PASS. Full suite at65b78b6on macOS / Python 3.9 / herdr 0.9.3: 1730 passed / 0 failed / 56 skipped; 18 of the skips were the uninitialized nats-docker submodule in the fresh worktree, and with it tests/test_deploy_freshness.py is 31 passed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
6.0 KiB
Issue #17 follow-ups, round 2 — Codex review
Job: fc553fcd
Loop: loop-20261007T224638Z-cf1efb
Base: 56d0bfda54
Previous round: 8241bd53b1
Head: 65b78b6ec4
Tree: b805d9f9e6
Validation path: /var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261007T224638Z-cf1efb/2
Conclusion
PASS. The prior R1 failure-to-success path is closed. No new blocking defect was found in the cumulative change or the two follow-up commits. This review uses the brief's permitted network-free validation; it does not claim full broker or real-herdr integration execution in this sandbox.
Previous finding closure
| Case | Previous round | Current head | Result |
|---|---|---|---|
| subscriber-up execution error, direct submit, subscriber rc 0 | submit exits 0 | submit exits 1 with decision-failure diagnostic | R1 closed |
| Same error in loop submit | submit exits 0 | submit exits 1 | R1 closed |
| stall-watch execution error | submit exits 0 | submit exits 1 | Related ambiguity closed |
| Successful yes/no answers | Truth encoded in process status | --print emits yes/no with process status 0; Bash restores the same branches | Normal semantics preserved |
| Invalid successful predicate stdout in if / OR context | No printed-answer validation | Exit 1, no continuation | Guard verified |
Independent negative controls executed the exact previous-round shell wrapper in a temporary dependency layout and the current wrapper against the same selective module-error shim. All three old/new pairs above were reproduced. The added tests also cover rc 127 and empty successful output. Probe source: /tmp/fc553fcd-probes.py.
Code evidence:
- .agents/skills/lib_py/delegation/wrapper.py:301-309 adds optional --print; :335-353 separates yes/no output from execution status. Without --print, the existing predicate CLI still returns 0/1.
- .agents/skills/multi-agent-mux-delegate-job/multi-agent-mux-delegate-job:112-130 checks execution status, nonempty output and the exact yes/no vocabulary. _decision_failed exits the calling shell explicitly, so the failure is not suppressed by Bash's conditional-context errexit rules.
- Both subscriber branches now use _decided_yes (:396, :568), as does start_stall_watch (:730). The prior unchecked predicate paths are gone.
Cumulative requirements and scope
The herdr cwd expectation accepts both documented versions; the placeholder handling retains session identity, live-agent and isolated-server filtering. Its unit cases include the valid placeholder, missing restore marker and another process-info error. The implementation and restore tests are unchanged since the prior review, where the new placeholder test was demonstrated to fail on base and pass on head.
Printed decision failures remain normalized to exit 1. The intentional empty finalize-end result for OwnerGone remains allowed. The prior base-vs-head exit-code negative control (255 -> 1) remains applicable because that helper is unchanged in this round.
N1's package-import/paho explanation and N3's PATH python3 explanation remain accurate, with no additional runtime changes. The two stale static test literals now match _decided/_exit_for; both corrected contract tests passed.
The round adds two commits and modifies five files relative to the prior head. AST comparison confirms wrapper.py's existing executable changes since that head are confined to _parser and main, plus the new _yes_no function; timing, owner checks, disk/event handling and finalization are unchanged. The cumulative diff contains nine files, no version bump or VERSIONS entry.
Validation
- tests/test_issue17_item4_decisions.py and tests/test_issue45_restore_unit.py, --noconftest -k "not unreaped": 299 passed, 4 deselected in 262.30s. Log: /tmp/fc553fcd-selected.log.
- tests/test_issue33_budget.py, --noconftest -k "not test_b3 and not test_r3 and not test_b7": 13 passed, 7 deselected in 28.77s. Log: /tmp/fc553fcd-budget.log.
- The two modified static contract tests in test_issue5_phase1_delegation.py and test_tier1_unit.py: 2 passed in 0.16s, using --noconftest and a minimal temporary mam_sandbox fixture.
- Total executed pytest cases: 314 passed; 11 explicitly deselected for the documented sandbox/integration limitations.
- Independent previous/head predicate-failure comparisons and invalid-output probes: all assertions passed.
- No product-test failures occurred among the executed cases.
All tests used the designated issue17-followups/.venv Python 3.9, disabled bytecode/cache writes and external basetemp directories. /bin/bash is the native 3.2 implementation. Both changed shell files pass bash -n; all changed Python files pass AST parsing; git diff --check passes. The review HEAD/tree matched the brief, and the final working tree was clean.
Environment limits and isolation
The inherited sandbox prevents loopback socket binding and ps execution. As diagnosed in the prior round, the four unreaped-owner cases depend on ps; they were explicitly deselected here rather than reported as product failures. Broker-dependent budget cases and real-herdr restore integration remain for the orchestrator, as the brief permits. No claim is made that these omitted integration cases passed in this session.
Inherited HERDR_, MAM_, MQTT_, SKS_ and control-plane binding variables were removed before test/probe execution. HOME, HOME_DIR, WORKSPACE_ROOT, XDG_CONFIG_HOME and absent MAM_ENV_FILE were redirected to temporary paths. The decisions suite used an environment-only pytest plugin to give every test its own WORKSPACE_ROOT. The two static contract tests used a minimal temporary fixture with a read-only link to the review skills and temporary registry data. No live herdr server, real agent session or .mam.env export was used. No source files, commits, branches, PRs or issue states were modified.
The requested started command ran first, but MQTT exhausted three attempts with Operation not permitted and exited 2. Completion publication is attempted after saving the report.
[VERDICT: PASS]