Files
multi-agent-mux/.agents/reports/reviewer-agy-01/report-701757db.md
T
GodopuandClaude Opus 5.5 3563a6fc17 release(v4.8.2): bump framework and eight skills to 4.8.2 in lockstep; archive the follow-up loop's reports
PR #41/#43 review follow-ups F1-F6, implemented by creator-claude-01 in a
loop and reviewed by claude, agy, grok and codex: round 1 (@95eabc6)
codex NOT PASS (a failed env load cached as loaded), fixed in 75f364e;
round 2 4/4 PASS. Full suite at 75f364e 1380 passed / 0 failed. Reviewer
reports (round 2 with identity sidecars) and the creator's reports go to
.agents/reports/<session>/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
2026-10-03 00:27:24 +09:00

106 lines
9.4 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.
# Final Review Report: Job 701757db (Round 2)
## 1. Review Identity & Metadata
- **Loop ID**: `loop-20261001T230324Z-b511bf`
- **Job ID**: `701757db`
- **Reviewer**: agy (session: `herdr:reviewer-agy-01`)
- **Base Commit**: `0051fd6c3b088f8b265928ccd94ea31053fdde7e`
- **Head Commit**: `75f364e4b47d8db95ce2a7e041b69b8e8b473e64` (9 commits)
- **Tree Hash**: `ec1fdc453ec6fdf2c09165c92a64d54e684f5a3a`
- **Verification Path**: `/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2`
- **Git Status**: Clean (no uncommitted or untracked changes)
- **Git Diff Whitespace Check (`git diff base...HEAD --check`)**: Clean (0 errors)
---
## 2. Commit Range Audit (base..head)
The branch contains 9 atomic commits implementing requirements F1–F6 plus review follow-up R1:
1. `75936f1`: `test(followups): F1 - A8 writes the marker lstart as loop_lock.sh reads it`
2. `5edf913`: `fix(followups): F2 - Python entry points report an unreadable env file in one line`
3. `71ea809`: `fix(followups): F3 - .mam.env BOM, repeated keys and a missing MAM_ENV_FILE`
4. `8b04639`: `fix(followups): F4a/F4c - the runner's wait knobs follow the integer rule; MAM_WAIT_GRACE_S documented`
5. `fb1b93c`: `fix(followups): F4b - bash integer knobs that reach [ -ge/-le/-gt ] or sleep go through mam_int_knob`
6. `c252ac4`: `fix(followups): F5 - no test switch in the stall watcher`
7. `1e92ddc`: `test(followups): F6 - the wrapper vanishes inside the second wait; the <= 60 s is the herdr wait's`
8. `95eabc6`: `fix(followups): F2 - job_subscriber returns the env-file failure by name`
9. `75f364e`: `fix(followups): F2 review R1 - a failed env load is not cached as loaded`
---
## 3. Requirement Verification & Findings
### F1: Date-dependent Test Bug Resolution
- **Issue**: `tests/test_issue21_acceptance.py::test_a8_second_loop_is_refused_before_a_scheduler_exists` failed on calendar days 1–9 due to `ps -o lstart=` double-space padding vs `mam_lstart` single-space normalization (`tr -s ' '`).
- **Implementation**:
- `_marker_lstart` normalizes ps output with `" ".join(out.split())` in [`tests/test_issue21_acceptance.py`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/tests/test_issue21_acceptance.py#L554-L559).
- Parameterized with `_PADDED_PS` shim to deterministically test single-digit day padding across all runs.
- **Verification**: `test_issue21_acceptance.py` passes completely (10/10 passed).
### F2: Python Entry Point EnvFileError Reporting & Retry Behavior (including R1)
- **Issue**: Missing/unreadable `.mam.env` should produce a single error line (`ERROR: <path>: cannot read (<exception type>)`) and exit with returncode 1, without a Python traceback or leaking secrets. Furthermore, a failed load must not be cached as loaded so subsequent entry point invocations in the same process can retry or fail consistently.
- **Implementation**:
- [`load_env_or_report()`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.agents/skills/lib_py/delegation/mqtt_common.py#L130-L141) wraps `ensure_env_loaded()` and prints `ERROR: <e>` to `sys.stderr` returning `False`.
- In [`mqtt_common.py`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.agents/skills/lib_py/delegation/mqtt_common.py#L125), `_env_loaded = True` is only assigned after `_load_dotenv()` successfully completes.
- All process entry points (`publish_event`, `registry`, `job_subscriber`, `cli`, `bench`, `heartbeat`, `remote`) guard their main functions with `if not mqtt_common.load_env_or_report(): return 1`.
- Added [`test_a1_a_failed_load_is_not_cached_as_loaded`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/tests/test_issue26_envfile.py#L721-L740) validating that consecutive invocations with broken files fail with rc 1 and do not register jobs, and once repaired, reload and succeed.
- Updated documentation in [`MESSAGING.md`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/MESSAGING.md#L509-L511).
- **Verification**: `tests/test_issue26_envfile.py` passes all 38 tests.
### F3: `.mam.env` Refinements
- **Implementation**:
- `parse()` in [`lib_py/delegation/envfile.py`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.agents/skills/lib_py/delegation/envfile.py#L58) uses `utf-8-sig` encoding, properly ignoring leading BOMs.
- Repeated keys retain their first defined value, documented in [`.mam.env.example`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.mam.env.example#L497).
- Missing `MAM_ENV_FILE` is skipped silently without falling back to ambient search.
- **Verification**: Regression tests `test_a7_a_leading_bom_is_not_part_of_the_first_key`, `test_a7_a_repeated_key_keeps_its_first_value_as_documented`, and `test_a7_a_missing_explicit_file_loads_nothing_and_says_nothing` all pass.
### F4: Integer Knob Expansion & `lib_int.sh`
- **Implementation**:
- Created standalone [`.agents/skills/lib_int.sh`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.agents/skills/lib_int.sh) containing `mam_int` and `mam_int_knob`. Added to [`deploy/remove.sh`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/deploy/remove.sh#L85).
- Sourced by scripts executed with and without `lib.sh` ([`loop_lock.sh`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.agents/skills/multi-agent-mux-loop/scripts/loop_lock.sh), [`diff_collect.sh`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.agents/skills/multi-agent-mux-loop/scripts/diff_collect.sh), [`lib.sh`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.agents/skills/lib.sh), [`reconcile.sh`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.agents/skills/multi-agent-mux-monitor/scripts/reconcile.sh)).
- Python loop runner [`LoopRunner._int_knob`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.agents/skills/lib_py/loop/runner.py#L355) parses `MAM_WAIT_GRACE_S`, `MAM_CHILD_WAIT_S`, and `MAM_JOB_TREE_MAX`, falling back cleanly to defaults upon invalid input.
- Documented in [`multi-agent-mux-loop/SKILL.md`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.agents/skills/multi-agent-mux-loop/SKILL.md#L427).
- Fractional float nature of `SKS_QUIESCENT_INTERVAL` is preserved and documented in `NOT_ARITHMETIC`.
- **Verification**: `tests/test_issue26_ints.py` passes all 93 test cases.
### F5: Removal of Test Hooks in Production Code
- **Implementation**:
- Removed `MAM_TEST_UNRELIABLE_AGENT` from [`lib_py/stall_watch.py`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.agents/skills/lib_py/stall_watch.py).
- [`tests/test_issue30_stall_watch.py`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/tests/test_issue30_stall_watch.py#L924-L938) sets `adapter.agent_status_reliable = property(lambda self: False)` via test-side injection.
- **Verification**: `test_s13_the_unreliable_case_needs_no_switch_in_the_product` and all 48 stall watch tests pass.
### F6: Documentation Precision & Mid-Wait Termination Testing
- **Implementation**:
- Refined `<= 60 s` comment in [`multi-agent-mux-delegate-job/SKILL.md`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/.agents/skills/multi-agent-mux-delegate-job/SKILL.md#L412) to specifically denote herdr wait duration.
- Added `in_wait` hook in [`tests/test_issue30_stall_watch_stop.py`](file:///var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2/tests/test_issue30_stall_watch_stop.py#L979-L1018) ensuring deterministic termination during the second wait tick.
- **Verification**: All 11 tests in `test_issue30_stall_watch_stop.py` pass cleanly.
---
## 4. Test Suite Execution Results
All required test suites were executed inside the verification path (`/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T230324Z-b511bf/2`) using Python venv with `--basetemp=/tmp/pytest-followups-clean`:
| Test Suite | Result | Time |
|---|---|---|
| `tests/test_issue26_envfile.py` | 38 passed | 8.26 s |
| `tests/test_issue26_ints.py` | 93 passed | 38.29 s |
| `tests/test_issue30_stall_watch_stop.py` + `tests/test_version_consistency.py` | 14 passed | 31.16 s |
| `tests/test_tier1_unit.py` | 67 passed | 59.75 s |
| `tests/test_issue21_acceptance.py` | 10 passed | 39.56 s |
| `tests/test_issue30_stall_watch.py` | 48 passed, 1 skipped | 263.44 s |
**Total Tests**: 270 passed, 1 skipped, 0 failed.
---
## 5. Scope & Quality Checks
- **Out-of-Scope Modifications**: None. No version bump, no push/merge/PR creation, no extraneous refactoring.
- **Security & Secret Handling**: No secrets or credential values printed or logged.
- **Whitespace & Formatting**: Zero errors reported by `git diff base...HEAD --check`.
All completion criteria for F1–F6 and review follow-up R1 are fully met with comprehensive test coverage.
[VERDICT: PASS]