Files
multi-agent-mux/.agents/reports/reviewer-agy-01/report-3121d389.md
T
GodopuandClaude Fable 5.1 c3e6a7e96d release(v4.7.3): bump framework and eight skills to 4.7.3 in lockstep; archive PR #37 merge-side reviews
Issue #36: delegated prompts travel by file, a delegation that fails ends
the loop with rc 1. VERSIONS.md carries the entry; the merge-side reports
(round 1 @59be1c8 and round 2 @708262a with identity sidecars, base
59be1c8 -> head 708262a, evidence review-tree) are archived under
.agents/reports/<session>/.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
2026-09-24 18:10:28 +09:00

77 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Pre-Merge Independent Delta Review Report: PR #37 (`fix/issue-36` Round 2)
- **Job ID**: `3121d389`
- **Target Agent**: `agy` (Session: `herdr:reviewer-agy-01`)
- **Role**: Reviewer
- **Target Worktree Context**:
- **Loop ID**: `loop-20260924T085626Z-b8987e`
- **Base Commit**: `59be1c89209a232059aec0c5aeecc2329929cb49` (Round 1 target)
- **Head Commit**: `708262a598c4301c0ccc70efba5401093b4b1e30` (1 delta commit: +68 / −7)
- **Tree SHA**: `d601c2d01bb4c09931e5e1989e140b01d51f5b96`
- **Verification Path**: `/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20260924T085626Z-b8987e/1`
---
## 1. Executive Summary
This second review round examines delta commit `708262a` ("fix(issue-36): merge review - handle prompt write failure in runner; reject empty prompt file; make test_s9 stderr check portable").
The commit directly resolves all three findings identified during Round 1:
1. **R1 / H1 (Prompt Write Failure Handling in `runner.py`)**: `_run_cmd` now wraps temporary prompt file creation and writing in `try ... except OSError:`. If writing fails (e.g. `ENOSPC`, `EFBIG`), any partial prompt file is unlinked and a `CompletedProcess(..., 126, "", msg)` is returned. The wrapper is not invoked, no unhandled exceptions bubble to `LoopRunner.run()`, and the failure is logged cleanly. Verified by new test `test_s4c`.
2. **R2 / N1 (macOS Portability in `test_s9`)**: In `tests/test_issue36_prompt_transport.py`, line 637 guards the assertion `assert "File too large" in result.stderr` with `if sys.platform == "linux":`. This accommodates macOS `/bin/bash` 3.2.57 behavior while continuing to assert `result.returncode != 0`, clean file removal (`assert not leftovers`), and the portable MAM diagnostic (`assert "delegate_job_safe: cannot write the prompt file" in result.stderr`) across all platforms.
3. **H3 (Empty Prompt File Rejection)**: `multi-agent-mux-delegate-job` now asserts `[[ -s "$PROMPT_FILE" ]]` in `cmd_submit()`, rejecting empty files before registration. Verified by new test `test_s1e`.
All 23 applicable tests in `tests/test_issue36_prompt_transport.py` passed cleanly in the macOS verification environment (with 1 platform-specific test skipped on Darwin as intended).
---
## 2. Detailed Verification Against Checklist Items
### (1) Verification of the Three Delta Fixes & Side-Effect Analysis
- **Prompt File Creation & Cleanup in `runner.py` (R1/H1)**:
- `prompt_file` is initialized to `""`.
- In `_run_cmd`, `tempfile.NamedTemporaryFile` and `fh.write(p_text)` are wrapped in `try ... except OSError as e:`.
- If writing fails:
* If `prompt_file` exists, it is unlinked immediately in the `except` block.
* Returns `subprocess.CompletedProcess(["bash", str(wrapper_script), "submit"], 126, "", msg)`.
* Because it returns directly from the `except` block, the downstream `subprocess.run(cmd)` and the outer `finally:` block do not execute. The wrapper is never invoked with an incomplete file.
- On the normal path:
* The wrapper executes, and the outer `finally: os.unlink(prompt_file)` ensures the file is deleted exactly once.
- The returned exit code 126 triggers the existing retry mechanism in `delegate_job()`; if the write still fails, the error message is logged cleanly and `delegate_job()` returns `None`, terminating the loop with exit code 1 without tracebacks.
- Verified by `test_s4c_a_prompt_file_that_cannot_be_written_is_a_failed_submit`.
- **macOS Test Portability for `test_s9` (R2/N1)**:
- Scoping `assert "File too large" in result.stderr` to `sys.platform == "linux"` eliminates the macOS `AssertionError` that caused the Round 1 `NOT PASS`.
- Portable assertions across Darwin and Linux verify:
* `assert result.returncode != 0` (non-zero exit upon write failure).
* `assert not leftovers` (partial `.mam/prompt-shloop-*` files are deleted).
* `assert "delegate_job_safe: cannot write the prompt file" in result.stderr` (MAM error diagnostics printed to stderr).
- Verified by running `tests/test_issue36_prompt_transport.py::test_s9_shell_loop_removes_a_partial_prompt_file_and_says_why` on macOS (PASS).
- **Empty Prompt File Rejection (H3)**:
- `cmd_submit()` in `multi-agent-mux-delegate-job` checks `[[ -s "$PROMPT_FILE" ]] || { echo "submit: --prompt-file $PROMPT_FILE is empty" >&2; exit 1; }`.
- Rejects zero-byte prompt files fail-closed before invoking `registry.py`.
- Verified by `test_s1e_an_empty_prompt_file_is_refused`.
### (2) Impact of Empty File Rejection on Valid Workflows
- In MAM, all valid delegated prompts (task instructions, review requests, refinement briefs, compliance orders) require meaningful textual context.
- Loop brief provisioning (`prompt.md`) always writes non-empty markdown briefs containing metadata and task descriptions.
- Enforcing `-s` prevents unintended empty job dispatches without affecting legitimate system workflows.
### (3) Overall Merge Readiness
- Commit `708262a` cleanly addresses all review concerns with minimal, surgical changes (+68 / −7).
- `git diff 59be1c8...HEAD --check` reported 0 whitespace or formatting errors.
- Version bump to `v4.7.3` is scheduled for the orchestrator release commit.
- Zero blockers remaining.
---
## 3. Test Execution Summary
| Test Suite / Target | Result | Duration | Notes |
| :--- | :--- | :--- | :--- |
| `tests/test_issue36_prompt_transport.py` | **23 PASS, 1 SKIP** | 42.4s | 23 passed on macOS; `test_s1b` skipped (`linux_only` constant test); `test_s9`, `test_s4c`, `test_s1e` all pass |
| `git diff 59be1c8...HEAD --check` | **0 errors** | 0.05s | Clean formatting and no whitespace errors |
---
[VERDICT: PASS]