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 (base6fc9194-> head1e82651, 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
8.3 KiB
8.3 KiB
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
- Loop ID:
1. Executive Summary
PR #32 resolves Issue #25 ("승격된 계획서 재사용을 --plan-file 로만 허용 — 암묵적 자동 로드 제거") across 5 commits and 4 files (+486 / −31):
1e82651fix(issue-25): a relative --plan-file is taken against the control root, as its usage line says5fa5923docs(issue-25): the loop skill documents --plan-file and the empty-report handlinga334083test(issue-25): plan reuse is explicit only and empty plan reports are not silent (P1-P11)e551e3bfix(issue-25): one plan-text check for every load; an empty planner report stops the loop, an empty refine keeps the plana28711cfix(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 globand the directory scanglob.glob(str(self.workspace_root / ".agents" / "reports" / planner_session / "plan-*.md")). - In Phase 1 Self-Planning mode, if
--plan-filewas not supplied,self.current_planremains empty and the runner logs:"No plan loaded; the Creator plans by itself (reuse one with --plan-file <path>).".
- Removed
- 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.".
- Removed
- Parity & Search Check:
- Test
test_p8_neither_loop_implementation_globs_for_a_plan_any_moreconfirms the string patternplan-*.mddoes not appear anywhere inrunner.pyorrun_loop.sh. - Automatic planner resolution (
resolve_planner_session) is not called or consulted to retrieve stored plans in Phase 1 self-planning mode.
- Test
(2) --plan-file <path> CLI Option Semantics
- Control Root Resolution:
- Relative paths are anchored against
self.workspace_rootvia(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).
- Relative paths are anchored against
- 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.
- Evaluated in
- Mutual Exclusion & Option Combinations:
- Combining
--plan-filewith--planexits 1 with a clear mutual exclusion error (test_p4). - Specifying
--plan-filewithout 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).
- Combining
- Legacy Shell Rejection:
- When invoked with
MAM_LOOP_PY=0,run_loop.shexplicitly detects--plan-fileand terminates with code 1 before the loop marker/guard is created (test_p7b).
- When invoked with
(3) Centralized Plan Text Validation (e551e3b)
- Shared Validation Method:
LoopRunner._plan_text(path: Path) -> Optional[str]enforces:- Regular file check (
path.is_file()). - Safe decoding with error replacement (
read_text(encoding="utf-8", errors="replace")). - Stripped text check (
text if text.strip() else None).
- Regular file check (
- Initial Plan Failure:
- In
--planmode, if the initial planner report is empty or whitespace-only, the runner logsthe 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.
- In
- 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}".
- In Phase 1 interactive debate (
(4) Checkpoint Integrity
LoopRunnerpersistscurrent_planto.mam/loop-checkpoint.jsonfor diagnostic and monitoring visibility during active loops.LoopRunnernever reads.mam/loop-checkpoint.jsonat startup to populateself.current_plan.self.current_planis 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
--planto.agents/reports/<planner>/plan-<id>.mdremains operational and protected (test_p6).
(6) Test Suite Execution & Isolation (P1–P11)
- All 17 test cases in
tests/test_issue25_plan_reuse.pyoperate strictly within isolatedtmp_pathfixtures 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.mdwas thoroughly updated:- Completely purged the stale statement ("기존에 승격된 계획서가 있다면 이를 로드").
- Updated Sequence Diagram and Phase 1 documentation to reflect explicit
--plan-filereuse. - 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.1is 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]