Files
multi-agent-mux/.agents/reports/reviewer-agy-01/report-41f07cde.md
T
GodopuandClaude Fable 5.1 6b7198f73c release(v4.7.1): bump framework and eight skills to 4.7.1 in lockstep; archive PR #32 merge-side reviews
Issue #25: a promoted plan is reused only with --plan-file; the implicit
newest-plan load is gone in both runners, and an empty planner report no
longer passes silently. VERSIONS.md carries the entry; the four merge-side
review reports and their identity sidecars (base 6fc9194 -> head 1e82651,
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-22 00:38:10 +09:00

114 lines
8.3 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 Review Report: PR #32 (`fix/issue-25`)
- **Job ID**: `41f07cde`
- **Target Agent**: `agy` (Session: `herdr:reviewer-agy-01`)
- **Role**: Reviewer
- **Target Worktree Context**:
- **Loop ID**: `loop-20260921T150212Z-97d845`
- **Base Commit**: `6fc9194f896eb2e13e123b8ebe7a9089b629764d` (v4.7.0)
- **Head Commit**: `1e826515cc2a07ea1f8da0ff1259e1ea4dde86fd`
- **Tree SHA**: `4fd82ad1c2682d12c3f5114818f97291af28a032`
- **Verification Path**: `/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20260921T150212Z-97d845/1`
---
## 1. Executive Summary
PR #32 resolves Issue #25 ("승격된 계획서 재사용을 --plan-file 로만 허용 — 암묵적 자동 로드 제거") across 5 commits and 4 files (+486 / −31):
- `1e82651` fix(issue-25): a relative --plan-file is taken against the control root, as its usage line says
- `5fa5923` docs(issue-25): the loop skill documents --plan-file and the empty-report handling
- `a334083` test(issue-25): plan reuse is explicit only and empty plan reports are not silent (P1-P11)
- `e551e3b` fix(issue-25): one plan-text check for every load; an empty planner report stops the loop, an empty refine keeps the plan
- `a28711c` fix(issue-25): reuse a promoted plan only with --plan-file; drop the implicit newest-plan load
All checklist criteria have been verified in the isolated verification path. All 17 new tests in `test_issue25_plan_reuse.py` and all 115 baseline regression tests passed with zero regressions.
---
## 2. Detailed Verification Against Checklist Items
### (1) Removal of Implicit Plan Loading
- **Python Runner (`lib_py/loop/runner.py`)**:
- Removed `import glob` and the directory scan `glob.glob(str(self.workspace_root / ".agents" / "reports" / planner_session / "plan-*.md"))`.
- In Phase 1 Self-Planning mode, if `--plan-file` was not supplied, `self.current_plan` remains empty and the runner logs: `"No plan loaded; the Creator plans by itself (reuse one with --plan-file <path>)."`.
- **Legacy Shell Runner (`scripts/run_loop.sh`)**:
- Removed `EXISTING_PLAN_FILE=$(ls -t ".agents/reports/$PLANNER_SESSION"/plan-*.md 2>/dev/null | head -n 1 || true)`.
- In Self-Planning mode, logs `"No plan loaded; the Creator plans by itself."`.
- **Parity & Search Check**:
- Test `test_p8_neither_loop_implementation_globs_for_a_plan_any_more` confirms the string pattern `plan-*.md` does not appear anywhere in `runner.py` or `run_loop.sh`.
- Automatic planner resolution (`resolve_planner_session`) is not called or consulted to retrieve stored plans in Phase 1 self-planning mode.
### (2) `--plan-file <path>` CLI Option Semantics
- **Control Root Resolution**:
- Relative paths are anchored against `self.workspace_root` via `(self.workspace_root / Path(self.plan_file).expanduser()).resolve()`. This guarantees identical path resolution whether the command is run from the repository root, a subdirectory, or an isolated worktree (`test_p3c`).
- Absolute paths and user home expansion (`~`) remain untouched and work as expected (`test_p3d`).
- **Fail-Closed Early Validation**:
- Evaluated in `parse_args()` before any agent delegation or job submission occurs (`test_p3`, `test_p3b`).
- If the path is non-existent, a directory, unreadable, or contains whitespace-only text, the runner logs an error naming the resolved path and immediately exits with rc=1.
- **Mutual Exclusion & Option Combinations**:
- Combining `--plan-file` with `--plan` exits 1 with a clear mutual exclusion error (`test_p4`).
- Specifying `--plan-file` without an argument exits 1 (`test_p4`).
- When combined with `--review-only`, the runner logs a warning and ignores the plan (`self.current_plan = ""`), because Phase 2 implementation is skipped (`test_p5`, `test_p5b`).
- **Legacy Shell Rejection**:
- When invoked with `MAM_LOOP_PY=0`, `run_loop.sh` explicitly detects `--plan-file` and terminates with code 1 before the loop marker/guard is created (`test_p7b`).
### (3) Centralized Plan Text Validation (`e551e3b`)
- **Shared Validation Method**:
- `LoopRunner._plan_text(path: Path) -> Optional[str]` enforces:
1. Regular file check (`path.is_file()`).
2. Safe decoding with error replacement (`read_text(encoding="utf-8", errors="replace")`).
3. Stripped text check (`text if text.strip() else None`).
- **Initial Plan Failure**:
- In `--plan` mode, if the initial planner report is empty or whitespace-only, the runner logs `the planner's report has no plan text: <path>` and exits with code 1 (`test_p9`). This eliminates the regression where an empty plan silently demoted the run to self-planning.
- **Refinement Retention (Debate & Review Escalation)**:
- In Phase 1 interactive debate (`--plan-talk`) and Phase 3 review escalation (`[ESCALATE: PLANNER]`), an empty refinement report logs a warning and preserves the previously valid plan (`test_p10`, `test_p11`).
- This prevents prompt corruption in `correction_prompt = f"갱신된 다음 계획서에 입각하여 ... 계획서:\n{self.current_plan}"`.
### (4) Checkpoint Integrity
- `LoopRunner` persists `current_plan` to `.mam/loop-checkpoint.json` for diagnostic and monitoring visibility during active loops.
- `LoopRunner` never reads `.mam/loop-checkpoint.json` at startup to populate `self.current_plan`. `self.current_plan` is always initialized cleanly (`self.current_plan = ""`).
- Existing checkpoint files in the workspace (such as unrelated historical plan text from prior issues) cannot contaminate new loop runs.
### (5) Baseline Behavior & Creator Prompts
- In self-planning mode without `--plan-file`, the initial Creator prompt retains the exact contract:
`"계획서가 존재하지 않으므로, 작업자(Creator)의 판단하에 스스로 구현 계획 및 설계를 수립한 뒤, 이를 바탕으로 코드를 구현하고 다음 작업 목표를 완성해주세요. 작업 목표: {self.task}"`.
- With `--plan-file <path>`, the prompt receives:
`"이미 수립된 다음 계획서에 입각하여 작업자의 판단하에 코드를 구현하고 작업 목표를 완성해주세요. 계획서:\n{self.current_plan}\n\n작업 목표: {self.task}"`.
- Subsequent review corrective rounds strictly provide reviewer feedback without repeating the initial plan (`test_p2`).
- Promotion of newly planned tasks via `--plan` to `.agents/reports/<planner>/plan-<id>.md` remains operational and protected (`test_p6`).
### (6) Test Suite Execution & Isolation (P1–P11)
- All 17 test cases in `tests/test_issue25_plan_reuse.py` operate strictly within isolated `tmp_path` fixtures with stubbed delegations.
- Real `.mam/jobs`, live daemon processes, and global agent sessions remain completely untouched.
- Execution timing: 17 tests passed in 2.02 seconds.
### (7) Documentation Integrity
- `.agents/skills/multi-agent-mux-loop/SKILL.md` was thoroughly updated:
- Completely purged the stale statement ("기존에 승격된 계획서가 있다면 이를 로드").
- Updated Sequence Diagram and Phase 1 documentation to reflect explicit `--plan-file` reuse.
- Added a dedicated section: `### 계획서가 비어 있을 때 (Empty plan reports)`.
- Updated CLI Option mapping table and Workflow examples.
- No dangling references to the old implicit loading mechanism exist across the repository.
### (8) Versioning & Merge Readiness
- Version lockstep bump to `v4.7.1` is reserved for the orchestrator release commit in accordance with release procedures.
- Formatting and git diff checks (`git diff 6fc9194...HEAD --check`) reported 0 issues.
- No merge blockers, regression risks, or side-effects detected.
---
## 3. Test Execution Summary
| Test Suite | Result | Duration | Notes |
| :--- | :--- | :--- | :--- |
| `tests/test_issue25_plan_reuse.py` | **17 / 17 PASS** | 2.02s | P1–P11 test matrix covering all reuse/empty-plan conditions |
| `tests/test_loop_cli.py` | **9 / 9 PASS** | 38.97s | CLI interface and argument validation regressions |
| `tests/test_issue5_phase2a_loop.py` | **91 / 91 PASS** | 2.91s | Core loop state machine, dispatching, and verdict handling |
| `tests/test_issue5_phase3_loop.py` | **12 / 12 PASS** | 0.54s | Runner orchestration, timeouts, and signal handling |
| `tests/test_version_consistency.py` | **3 / 3 PASS** | 0.21s | Version consistency checks |
| `git diff 6fc9194...HEAD --check` | **0 errors** | 0.05s | Zero trailing whitespace / formatting errors |
---
[VERDICT: PASS]