Second-round reports of the fix/issue-12-8-7 review loop on ea911d7:
planner-reviewer-claude-01 (b368210a), reviewer-agy-01 (3f5d1cd4) and
reviewer-grok-01 (cc059645), all [VERDICT: PASS]. The codex review is
deferred until its usage limit resets; the branch merges only after it.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
4.7 KiB
🔍 Review Report — Job cc059645 (fix/issue-12-8-7 2회차 @ ea911d7)
- Reviewer:
reviewer-grok-01(role: reviewer) · 2026-09-13 - 범위:
git log/git diff8a09e02...HEAD(루프 수집 diff 는 비어 있음) - HEAD:
ea911d7fix(issue-8,7): harden install_state merge and pin sibling-workspace edge cases - 1회차 HEAD:
4176d75(grok PASS). 이번 초점:0fedae2(claude N1) +ea911d7(비차단 권고) - 안전: 실제
.mam/jobs에scrub-secrets미실행. 실제 홈 purge 없음. 소스 무변경. codex 세션 미접촉.
커밋: e629cc1 → 4176d75 → 0fedae2 → ea911d7. git diff --check 8a09e02...HEAD 클린.
(1) 0fedae2 N1 — scrub-secrets 값 기준 선택
_cmd_scrub_secrets (registry.py:360): "password" in broker → broker.get("password"). JSON null·빈 문자열·키 없음은 모두 falsy 라 목록에도 재기록에도 안 넣음. 값이 있는 문자열만 pop 후 _atomic_write_record. lock 범위는 그대로 전체 순회지만 쓰기는 비밀이 있는 레코드만.
test_scrub_secrets_cli_migrates_a_registry: dirty("leaked-earlier") 1건만 dry-run/실제 대상. password: null 레코드는 stdout 에 id 가 없고 파일 바이트 불변. 키 없는 clean 레코드도 불변. --dry-run 은 dirty 파일의 유출 문자열을 그대로 둠. 4176d75 에서는 null 키까지 세어 would scrub 2 가 났을 테스트.
_atomic_write_record 의 _scrub_record_secrets 는 여전히 키만 보면 pop — null 키는 다음 일반 쓰기 때 정리. scrub 가 901건을 재기록하지 않는 분업과 맞음.
문서: VERSIONS.md v4.4.4 항목 2, registry.md:60-62 가 “저장된 값만 / null 은 다음 쓰기”로 정합.
(2) ea911d7 #8 — install_state 병합 보강
deploy/update.sh:243-256:
- 비어 있지 않고 마지막 바이트가 개행이 아니면 (
tail -c1+$(…)가 trailing newline 을 지우는 관용)printf '\n'— 첫 병합 키가 마지막 줄에 붙지 않음. case *=*로=없는 줄 무시.awk -F= -v k="$key" '$1 == k'정확 문자열 비교.grep -q "^${key}="의 정규식 해석 없음.- 실패
restore_on_failure(:168-171) 는 세 파일cp -f그대로. 성공 경로만 변경.
test_issue8_update_state.py 실제 install→stale stamps→update.sh --force 통과(아래 스위트).
(3) ea911d7 #7 테스트 2건 — 실제 경로
test_idle_pane_in_a_later_workspace_is_reused: w1=4(overflow) + w2=1 + state["panes"] 에 agent 없는 w2:p_idle. mock pane list 는 에이전트 pane 에 agent 를 넣고 extra pane 은 안 넣으므로, lib.sh:771 not p.get('agent') 가 w2 에서 idle 을 고름. split/create 없음, agent start … --pane w2:p_idle. idle 우선이 깨지면 w2 split 으로 실패.
test_ws_label_rename_targets_only_the_chosen_workspace: 같은 4+1 에서 MAM_WS_LABEL=team-b. lib.sh:854-856 은 선택된 existing_ws 에만 workspace rename. 호출 로그가 정확히 ["workspace", "rename", "w2", "team-b"] — w1 이나 생성 경로 --label 이 아님.
(4) 1회차 PASS 회귀 + 락스텝
#12 to_registry_block password 제외, env 복원, G6 _cmd_scrub_secrets 예외, auth_token 유지. #7 후보 순회·overflow continue·단일 ws 동치. #8 성공 경로 version/hashes 비복원. 회귀 없음.
lib.sh/eager.py/8 SKILL.md/VERSIONS.md 개요·매트릭스 / README·BOOTSTRAP·MESSAGING = 4.4.4. 릴리스 커밋 4176d75 제목 유지. env -u MAM_VERSION 아래 verify_framework_version 통과. 현재 버전 안내 문서에 잔여 4.4.3 없음.
Non-blocking (1회차와 동일): 락스텝이 v4.4.3 품질 문장을 24/17 → 26/19 로 고친 것은 fae70c1 작업이지 이 베이스가 아님. v4.4.4 품질 불릿은 아직 “테스트 8개/issue7 3개” — 이후 테스트 2건·N1 보강은 changelog 항목 2·코드에만 반영. 기능 결함 아님.
(5) 테스트
env -u MAM_VERSION .venv/bin/python -m pytest -q \
tests/test_issue7_workspace_packing.py tests/test_issue8_update_state.py \
tests/test_issue12_registry_secrets.py tests/test_issue5_phase1_delegation.py \
tests/test_issue5_phase2a_loop.py tests/test_herdr_shim_contract.py \
tests/test_layout.py tests/test_deploy_layout.py tests/test_loop_cli.py \
tests/test_issue5_phase4_runtime.py tests/test_version_consistency.py
244 passed in 134.54s (1회차 242 + #7 테스트 2). bash -n lib.sh/update.sh 클린. 전체 스위트 미실행.
종합
N1(null password 901건 재기록)은 값 기준으로 닫혔고, install_state 병합과 #7 idle/rename 경로가 테스트로 고정됐다. 1회차 PASS 항목 회귀 없음. 설계 재작업 불필요.
[VERDICT: PASS]