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, base59be1c8-> head708262a, 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
45 lines
3.0 KiB
Markdown
45 lines
3.0 KiB
Markdown
# 🔍 Review Report — Job 93408cd8 (PR #37 @ `59be1c8`)
|
||
|
||
- **Reviewer**: `reviewer-grok-01` · 2026-09-24
|
||
- **검증 경로**: `/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20260924T080014Z-2b3df0/1`
|
||
- **identity**: base `1debc7d` head `59be1c8` tree `a009c90` (일치)
|
||
- **본 체크아웃**: `main` `1debc7d` 유지
|
||
|
||
`git diff --check` 클린. 6커밋.
|
||
|
||
## NOT PASS
|
||
|
||
### N1. S9 가 macOS 에서 실패한다
|
||
|
||
`tests/test_issue36_prompt_transport.py:602` 가 stderr 에 리터럴 `File too large` 를 요구한다. 이 호스트(Darwin)에서 `ulimit -f 1` 로 `delegate_job_safe` 쓰기가 실패하면 rc 는 1 이고 stderr 는 이식 가능한 문장뿐이다:
|
||
|
||
`delegate_job_safe: cannot write the prompt file under …/.mam`
|
||
|
||
bash 가 libc 문구 `File too large` 를 찍지 않아 단언이 깨진다. 같은 스위트는 **1 failed, 99 passed, 1 skipped** (`s1b` 는 `linux_only`).
|
||
|
||
**대안**: 잔여 파일 없음과 `cannot write the prompt file` 은 모든 플랫폼에서 단언하고, `File too large` 는 Linux 에서만 보거나 빼라. 제품 경로(`run_loop.sh` 의 `rm -f` + stderr)는 이미 그 계약이다.
|
||
|
||
## 그 외 (N1 만 막음)
|
||
|
||
**(1) 전달.** 러너 `_run_cmd` 는 `--prompt-file` 만 (`runner.py:485`). 래퍼는 파일이면 그 경로를 registry 에 넘기고, 그 전에 읽는다 (`multi-agent-mux-delegate-job:188-199`). `cli.py` / `registry.py` 는 `--prompt` 와 `--prompt-file` 상호 배타. `lib.sh` 제출 두 곳과 `delegate_job_safe` 가 `--prompt` 를 파일로 바꾼다. 옛 셸 러너의 `--prompt` 호출은 모두 `delegate_job_safe` 를 탄다. 문서의 `--prompt` 예시는 하위 호환. 임시 파일은 제어 루트 `.mam/prompt-*`, 래퍼 반환 후 삭제. 셸 쓰기 실패는 `rm -f`.
|
||
|
||
**(2) 실패.** OSError → rc 126, 재시도도 같은 처리, 등록 실패면 `None` → 루프 rc 1. 재심·중재 **미등록** 은 rc 1. 순응 잡은 미등록뿐 아니라 `wait_for_job` 실패도 rc 1 (`runner.py:1393-1395`). 코드가 안 고쳐진 채 다음 라운드로 가면 안 되므로 강화가 맞다. 로그 문장이 wait 실패에도 “Failed to register” 인 것은 비차단.
|
||
|
||
**(3) diff 상한.** `diff_collect.sh` 주석: 증거만 자르고 전달은 파일. 잘린 diff 의 diff-only 원격 거부는 `runner.py:1204` 그대로.
|
||
|
||
**(4) create.** 주입문은 brief 절대경로만. `delegate_publish_cmd` 와 `--expect-dispatch-token` 유지. S8(100·130500) 통과.
|
||
|
||
**(5) 테스트.** 140KB 는 실제 wrapper/registry subprocess. S1b(E2BIG)는 Linux 전용 — macOS 는 커널 상한이 없어 skip 이 맞다. 경로는 파일을 검증한다. S8/S9 는 mock 이 아님.
|
||
|
||
**(6)–(8).** `--prompt` 짧은 문자열은 그대로. 4.7.3 bump 는 오케스트레이터 예정.
|
||
|
||
## 테스트
|
||
|
||
검증 경로, `AGENT_PYTHON_BIN` = 컨트롤 `.venv`, basetemp `/tmp`:
|
||
|
||
`test_issue36_prompt_transport.py` + `test_issue23_24_startup_path.py` + `test_loop_cli.py`
|
||
|
||
**1 failed, 99 passed, 1 skipped in 237.33s.**
|
||
|
||
[VERDICT: NOT PASS]
|