Files
multi-agent-mux/.agents/reports/planner-reviewer-codex-01/report-fc553fcd.md
T
GodopuandClaude Opus 5.5 cd82ab6e72 release(v4.8.7): Issue #17 follow-ups - archive the review reports and bump the lockstep version
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 in 541c3fe and 65b78b6. Round 2 (@65b78b6) 4/4
PASS. Full suite at 65b78b6 on 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
2026-10-08 11:32:39 +09:00

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]