Review loop (--review-only, --all-reviewer): round 1 (@325b056) 4/4 PASS,
round 2 (@db7f4ca, HERDR_SESSION) 4/4 PASS. Full suite at 325b056 on
macOS / Python 3.9 / bash 3.2 / herdr 0.9.3 from an agent pane:
1845 passed / 0 failed / 56 skipped (18 test_deploy_freshness skips: no
nats-docker submodule in the fresh worktree); the panes of the real
servers (default, multi-agent-mux) and ~/.claude/projects were unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
6.0 KiB
Job b1696427 — HERDR_SESSION isolation review
판정: PASS. 지정된 두 파일 변경에서 차단할 결함을 발견하지 않았다. 관련 테스트 84건 모두 통과했고, 별도 base/head 탐침에서 상속 세션 제거와 fixture 이후의 명시적 설정 보존을 확인했다.
검증 identity
- loop:
loop-20261013T010208Z-f90dd4 - base:
325b056057fcdd717d2c81017fc5ef57183cb4d0 - head:
db7f4cab9c60ff5db009cf3fc625e9a86a465ef6 - tree:
f32cabd3a6c8d775c9223509967f1a810f0cf827 - 검증 cwd:
/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261013T010208Z-f90dd4/1 - Python:
/Users/godopu16/PuKi/laa/canary_projects/multi-agent-mux/.venv/bin/python
HEAD/tree가 지정 identity와 일치하고 git status --short는 비어 있었다. git diff --check 325b056도 통과했다. 이 커밋만 검토했으며 운영 코드·생성 shim 변경은 없다. 소스 수정, creator 작업 트리 실행, 커밋·push는 하지 않았다.
코드 검토
tests/conftest.py:298–301에서 기존 socket/pane/tab 제거 사이에monkeypatch.delenv("HERDR_SESSION", raising=False)를 추가한 것은 적절하다. 값이 없는 실행도 허용하고, pytest monkeypatch의 기존 복원 수명 주기를 따른다..agents/skills/lib.sh:1425–1427,lib_py/pane_lock.py:49–50,lib_py/loop/watcher.py:64–66은 이 값을 우선해서 caller server로 읽으므로 sandbox 시작 전에 상속값을 제거해야 pane 안/밖의 기본 분기가 같아진다.tests/test_herdr_real_server_leak.py:73–88은 새 변수를 가짜 pane 환경에 넣은 뒤 실제mam_sandbox이후 남지 않는지 확인한다. 외부 실행 환경을 미리 scrub했더라도 시험이 스스로 값을 주입하므로 추가된 제거 동작을 검증한다.- 테스트가 의도적으로 지정하는 값은 보존된다.
test_issue23_24_startup_path.py:31–42의 helper는 fixture 이후 subprocess 환경을 구성하고 명시적env를 마지막에 적용한다.:261–266의 HERDR_SESSION 우선순위 시험을 포함한 모듈이 통과했다.test_issue50_pane_lock.py:63–80도 명시적인 환경 mapping으로 caller/lock 식별을 검사한다. 추가 탐침에서도 fixture 이후 설정한 값이 두 helper에 그대로 전달됐다. - 확인한 라우팅·범위 변수
HERDR_SESSION,HERDR_SESSION_NAME,HERDR_SERVER_NAME,HERDR_WORKSPACE_ID,HERDR_SOCKET_PATH,HERDR_PANE_ID,HERDR_TAB_ID와 설정 경로HERDR_CONFIG_PATH,XDG_CONFIG_HOME은 모두conftest.py:290–306에서 제거된다. 실제 fixture setup에 이 9개를 주입한 독립 탐침에서도 head에는 하나도 남지 않았다. 검사한 repository의 caller/scope/config 경로에서 추가 누락 라우팅 변수는 찾지 못했다. 이는 알려진 경로의 검증이며 임의의 미래 herdr 환경변수까지 일괄 제거한다는 의미는 아니다.
mam_sandbox를 사용하지 않는 테스트의 환경 계약은 이 두 파일 변경으로 바뀌지 않는다. 예를 들어 실제 서버용 test_issue50_dispatch_herdr.py는 모든 HERDR_*를 별도로 제거하고, test_issue45_restore.py의 Rig도 HERDR_SESSION을 포함한 scope 변수를 자체 제거한다. 이 실제 서버 모듈은 이번 리뷰에서 실행하지 않았다.
실행 검증
안전 launcher /tmp/b1696427-review/run.py를 사용해 아래 관련 모듈만 실행했다.
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 <Python> /tmp/b1696427-review/run.py tests/test_herdr_real_server_leak.py tests/test_issue50_pane_lock.py tests/test_issue23_24_startup_path.py
- 84 passed in 195.48s, exit 0. skip/failure 없음.
- 로그:
/tmp/b1696427-review/tests.log - basetemp:
/tmp/b1696427-mxmhd4h3/bt— 검증 트리 밖이며 이름에 shim 없음. PYTHONDONTWRITEBYTECODE=1,-p no:cacheprovider, 일회용 HOME, 지정 AGENT_PYTHON_BIN 사용.- launcher는 상속 HERDR_/MAM_/MQTT_/SKS_ 및 제어·에이전트 경로 환경을 추가로 제거했다. 실제 설치 herdr에 도달하기 전에 기록 후 exit 97로 중단하는 fallback 디코이를 PATH에 두었다. fallback 호출 기록 없음. 테스트별 mock과 suite의 로컬 broker를 사용했다.
- 전체 스위트, 실제 herdr, 운영 모니터·서버는 실행하지 않았다.
.mam.envexport/출력이나 실제 사용자 에이전트 홈 변경도 하지 않았다.
독립 base/head 탐침
산출물: /tmp/b1696427-review/probe.py, /tmp/b1696427-review/probe.log.
재현은 위와 같은 env -u ... 및 PYTHONDONTWRITEBYTECODE=1로 지정 Python에서 probe.py를 실행한다. 검증 트리의 git base와 head에서 mam_sandbox 함수 AST를 추출해 pytest decorator만 제거하고, 실제 함수 본문을 별도 /tmp 디렉터리에 실행했다. pytest.MonkeyPatch를 사용하고, 이 setup에서 시작하는 데몬이 없으므로 등록되는 reaper finalizer는 실행하지 않았다. 서버를 실행하는 코드는 호출하지 않았다.
절차와 결과:
- fixture 전에 위 9개 변수에 안전한 sentinel 값을 주입한다.
- base fixture 실행 후 남은 변수는
HERDR_SESSION하나이고 값은caller-sentinel이었다. 실제 Pythonpane_lock.caller_server와 검증 트리에서 추출한 셸_herdr_caller_server모두caller-sentinel을 반환했다. - head fixture 실행 후 남은 변수는 없었다. 두 helper 모두 빈 값을 반환했다. 기대한 기본 호출자 분기 복원이 확인됐다.
- 각 fixture 실행 뒤
HERDR_SESSION=chosen-by-test를 설정하면 두 helper 모두chosen-by-test를 반환했다. 명시적 테스트 설정은 제거되지 않는다.
탐침 exit 0, 모든 assertion 통과. 임시 root는 /tmp/b1696427-probe-6o1gbryi였다. 이전 리뷰의 결과를 현재 커밋 검증으로 대체하지 않고 이번 identity에서 새로 실행했다.
[VERDICT: PASS]