Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
9.8 KiB
9.8 KiB
Code Review Report — PR #79 (Issue #68: worktree_prepare.sh Default Creator Onboarding & create --no-onboard Warning)
- Job ID:
ace63ec3 - Reviewer:
agy(herdr:reviewer-agy-01) - Loop ID:
loop-20261029T045625Z-74296d(Round 1) - Review Snapshot Path:
/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261029T045625Z-74296d/1 - Branch:
fix/issue-68 - Base Commit:
b9c828f09214b4bed6651a223cbb941e7b432647 - Head Commit:
3b81f9973223d2a910369711c08adc772003639d(5 commits) - Tree Hash:
ff705b61bf25fe40d0ff054c372a399eacc79730
1. 확인한 것 (Files & Line Ranges Inspected in Review Snapshot)
- 기준 문서 대조 (
INSTRUCTION.md,tea issues 68 --comments,tea pulls 79):INSTRUCTION.md:1-13(스크립트·테스트 우선 원칙 및SKILL.md와 코드의 줄 단위 일치 원칙 확인)- Issue #68 댓글("구현 전에 정한 것", 결정 1–4 및 완료 조건)과 PR #79 설명 대조
- 어댑터
id_lifecycle및facts브리지:.agents/skills/lib_py/agents/__main__.py:4, 75(from lib_py.agents.base import POST_DISCOVERED,MAM_ID_POST_DISCOVERED={1 if adapter.id_lifecycle == POST_DISCOVERED else 0}).agents/skills/lib_py/agents/base.py:174-175, 379(기본값POST_DISCOVERED:agy,codex,hermes,opencode).agents/skills/lib_py/agents/adapters/claude.py:188,grok.py:18(PRE_ASSIGNED:claude,grok)- 다른
lib_py.agents facts호출 지점 영향 확인:.agents/skills/lib.sh:2596-2598(wait_for_tui_readyeval "$_facts").agents/skills/lib.sh:2957(send_keys_safeeval ...).agents/skills/lib.sh:3156-3170(_mam_load_dialog_facts—sed -n으로 특정 키만 추출)tests/test_issue23_24_startup_path.py:480-500(MAM_STARTUP_DIALOGS=행만 필터링)- 모든 기존 호출자가 새
MAM_ID_POST_DISCOVERED키 추가에 전혀 영향받지 않음을 확인.
create_session.sh및worktree_prepare.sh구현·문서 대조:.agents/skills/multi-agent-mux-create/scripts/create_session.sh:67, 88, 207-211:ONBOARD=1기본 유지,--no-onboard유지.eval "$("$(_delegate_py_bin)" -m lib_py.agents facts "$AGENT" 2>/dev/null || true)"직후if [ "$ONBOARD" = 0 ] && [ "${MAM_ID_POST_DISCOVERED:-0}" = 1 ]; then으로 stderr 경고 1줄 출력(create_session.sh:209-211).facts호출이 실패하거나 빈 값일 때도${MAM_ID_POST_DISCOVERED:-0}기본값0으로set -u아래 안전하게 통과.spawn및--dry-run분기(219)보다 앞에 위치하여--dry-run이나 이후#63대기 거부(225) 시에도 경고가 먼저 출력되며, 종료 코드와 레지스트리 행은 전혀 바꾸지 않음.
.agents/skills/multi-agent-mux-create/scripts/worktree_prepare.sh:6-19, 30, 42-43, 231-232:ONBOARD=1로 기본값 변경(30),--onboard는ONBOARD=1로 계속 허용(42),--no-onboard는ONBOARD=0설정(43),create_session.sh에--onboard또는--no-onboard전달(232).- 상단 주석(
6-19,usage()가sed -n '2,15p'로 출력하는 범위 포함)이 코드와 정확히 일치.
.agents/skills/multi-agent-mux-create/SKILL.md:173, 202-214:- 옵션 표(
173)와worktree_prepare.sh시놉시스(205),--creator-agent설명(210), 종료 코드 설명(213)을 줄 단위로 코드와 대조하여 일치 확인.
- 옵션 표(
- 저장소 전체
--creator-agent호출 전수 조사 (git grep -- "--creator-agent"):tests/test_issue21_acceptance.py:47, 207:--no-onboard명시 추가됨.tests/test_issue21_phase2_loop_a.py:339: 기존--onboard명시.tests/test_issue21_phase2_loop_a.py:355: 서브모듈 초기화 실패(단계 4) 테스트로 creator 단계(단계 5)에 도달하지 않음.tests/test_issue21_phase2_loop_a.py:422:--no-onboard명시 추가됨.tests/test_issue50_dispatch_herdr.py:868,tests/test_issue50_onboard.py:192,tests/test_issue57_logs_follow_registry.py:276: 모두 기존--onboard명시.docs/design/worktree-creator-model.md:50: 실제 워크트리 creator 생성 예시로 기본 온보딩 의도와 부합.
- 핀 이동 및 정수 환경변수 분류:
tests/data/skill_code_blocks.json:create_session.sh208행 이후 참조들이 정확히+4행,worktree_prepare.sh43행 이후 참조가+1행(250→251),SKILL.md:202-206블록 해시가8bfabafb0328로 내용 그대로 이동됨을 확인.tests/test_issue26_ints.py:111:NOT_ARITHMETIC에"MAM_ID_POST_DISCOVERED"등록 확인.
- 신규 테스트 (
tests/test_issue68_onboard_default.py:1-247) 검증:- 총 25개 케이스:
test_facts_expose_post_discovered(6),test_no_onboard_warning_dry_run(6),test_no_onboard_warning_keeps_exit_and_row(6),test_no_onboard_warning_precedes_a_later_refusal(1),test_prepare_forwards_onboarding_choice(4),test_prepare_onboards_by_default_end_to_end(1),test_prepare_no_onboard_sends_none(1). - base
b9c828f기준 대조 결과:claude·grok경고 없음 4건(dry_run2 +keeps_exit_and_row2)과--onboard전달 1건을 제외한 20건이 base에서 정확히 실패함을 코드로 확인(작성자 주장 일치).
- 총 25개 케이스:
2. 결정 1–4 및 완료 조건 대조표
| 항목 | 요구사항 요약 | 구현 위치 | 테스트 커버리지 | 상태 |
|---|---|---|---|---|
| 결정 1 | create_session.sh의 --no-onboard 유지, 기본값 온보딩(ONBOARD=1) 유지 |
create_session.sh:67, 88 |
test_no_onboard_warning_dry_run, test_no_onboard_warning_keeps_exit_and_row |
충족 |
| 결정 2 | worktree_prepare.sh --creator-agent 기본을 온보딩(ONBOARD=1)으로 변경, --no-onboard 추가 및 전달, 기존 --onboard도 동일 동작으로 수용 |
worktree_prepare.sh:30, 42-43, 232 |
test_prepare_forwards_onboarding_choice, test_prepare_onboards_by_default_end_to_end, test_prepare_no_onboard_sends_none |
충족 |
| 결정 3 | create --no-onboard 시 후발견 ID 에이전트(agy·codex·hermes·opencode)에만 #63 대기 가능성 경고 1줄 출력, claude·grok에는 미출력, 종료 코드·레지스트리 행 불변 |
lib_py/agents/__main__.py:75, create_session.sh:207-211 |
test_facts_expose_post_discovered, test_no_onboard_warning_dry_run, test_no_onboard_warning_keeps_exit_and_row, test_no_onboard_warning_precedes_a_later_refusal |
충족 |
| 결정 4 | multi-agent-mux-create/SKILL.md 옵션 표와 worktree 준비 절의 기본값 설명만 최소 수정 |
multi-agent-mux-create/SKILL.md:173, 205, 210, 213 |
tests/test_issue42_skill_blocks.py |
충족 |
| 완료 조건 3 | 기존 worktree 테스트 중 기본 미온보딩을 전제하던 호출 수정 및 macOS 통과 | test_issue21_acceptance.py:47, 207, test_issue21_phase2_loop_a.py:422, test_issue26_ints.py:111 |
아래 macOS 실측 265 passed | 충족 |
빠진 완료 조건: 없음.
3. 실행한 테스트와 결과 (macOS 실측)
검증 경로(/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261029T045625Z-74296d/1)에서 브리프의 격리 실행 명령으로 바뀐 테스트 파일과 create/worktree 관련 테스트를 모두 실행했습니다.
명령 1 (test_issue68_onboard_default.py, test_issue26_ints.py, test_issue42_skill_blocks.py, test_issue50_onboard.py)
BT="$(mktemp -d "${TMPDIR:-/tmp}/mam-rev-ace63ec3-1.XXXXXX")"
trap 'rm -rf "$BT"' EXIT
cd /var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261029T045625Z-74296d/1 && \
env -u HERDR_SOCKET_PATH -u HERDR_PANE_ID -u HERDR_TAB_ID -u HERDR_WORKSPACE_ID -u HERDR_SESSION_NAME -u HERDR_SESSION -u WORKSPACE_ROOT -u MAM_ENV_FILE -u MAM_JOBS_DIR -u DELEGATE_JOB_LOGS_DIR \
PYTHONDONTWRITEBYTECODE=1 /Users/godopu16/PuKi/laa/canary_projects/multi-agent-mux/.venv/bin/python -m pytest -p no:cacheprovider --basetemp="$BT/pytest" \
tests/test_issue68_onboard_default.py \
tests/test_issue26_ints.py \
tests/test_issue42_skill_blocks.py \
tests/test_issue50_onboard.py
- 결과:
177 passed, 1 skipped in 245.18s (0:04:05)(exit code0)
명령 2 (test_issue21_acceptance.py, test_issue21_phase2_loop_a.py, test_issue57_logs_follow_registry.py, test_issue63_same_cwd_ids.py)
BT="$(mktemp -d "${TMPDIR:-/tmp}/mam-rev-ace63ec3-2.XXXXXX")"
trap 'rm -rf "$BT"' EXIT
cd /var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261029T045625Z-74296d/1 && \
env -u HERDR_SOCKET_PATH -u HERDR_PANE_ID -u HERDR_TAB_ID -u HERDR_WORKSPACE_ID -u HERDR_SESSION_NAME -u HERDR_SESSION -u WORKSPACE_ROOT -u MAM_ENV_FILE -u MAM_JOBS_DIR -u DELEGATE_JOB_LOGS_DIR \
PYTHONDONTWRITEBYTECODE=1 /Users/godopu16/PuKi/laa/canary_projects/multi-agent-mux/.venv/bin/python -m pytest -p no:cacheprovider --basetemp="$BT/pytest" \
tests/test_issue21_acceptance.py \
tests/test_issue21_phase2_loop_a.py \
tests/test_issue57_logs_follow_registry.py \
tests/test_issue63_same_cwd_ids.py
- 결과:
88 passed in 485.68s (0:08:05)(exit code0)
명령 3 (/bin/bash -n 구문 검사 및 프로세스·워크트리 무결성 확인)
create_session.sh,worktree_prepare.sh/bin/bash -n통과 (exit 0).git status --short: 출력 없음 (검증 스냅샷 깨끗함).ps -ef: 본 체크아웃의 기존reconcile.sh --subscribe데몬(PID3714)만 정상 유지 중이며, 테스트가 남긴 자식·더미 프로세스 없음.
4. 발견 사항 (차단 / 비차단)
- 차단 (Blocking): 없음.
- 비차단 (Non-Blocking):
[N-1]tests/test_issue68_onboard_default.py:18: 쓰이지 않는import yaml1줄이 남아 있습니다(PR #79 본문에서도 인지됨, 동작에 영향 없음).
5. 사용자 확인 필요
- 없음.
[VERDICT: PASS]