Files
multi-agent-mux/.agents/reports/planner-reviewer-codex-01/report-b1696427.md
T
GodopuandClaude Opus 5.5 50c8da8269 release(v4.9.1): tests no longer reach a real herdr server - archive the review reports and bump the lockstep version
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
2026-10-13 10:33:04 +09:00

6.0 KiB
Raw Blame History

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는 하지 않았다.

코드 검토

  1. 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 안/밖의 기본 분기가 같아진다.
  2. tests/test_herdr_real_server_leak.py:73–88은 새 변수를 가짜 pane 환경에 넣은 뒤 실제 mam_sandbox 이후 남지 않는지 확인한다. 외부 실행 환경을 미리 scrub했더라도 시험이 스스로 값을 주입하므로 추가된 제거 동작을 검증한다.
  3. 테스트가 의도적으로 지정하는 값은 보존된다. 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에 그대로 전달됐다.
  4. 확인한 라우팅·범위 변수 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.env export/출력이나 실제 사용자 에이전트 홈 변경도 하지 않았다.

독립 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는 실행하지 않았다. 서버를 실행하는 코드는 호출하지 않았다.

절차와 결과:

  1. fixture 전에 위 9개 변수에 안전한 sentinel 값을 주입한다.
  2. base fixture 실행 후 남은 변수는 HERDR_SESSION 하나이고 값은 caller-sentinel이었다. 실제 Python pane_lock.caller_server와 검증 트리에서 추출한 셸 _herdr_caller_server 모두 caller-sentinel을 반환했다.
  3. head fixture 실행 후 남은 변수는 없었다. 두 helper 모두 빈 값을 반환했다. 기대한 기본 호출자 분기 복원이 확인됐다.
  4. 각 fixture 실행 뒤 HERDR_SESSION=chosen-by-test를 설정하면 두 helper 모두 chosen-by-test를 반환했다. 명시적 테스트 설정은 제거되지 않는다.

탐침 exit 0, 모든 assertion 통과. 임시 root는 /tmp/b1696427-probe-6o1gbryi였다. 이전 리뷰의 결과를 현재 커밋 검증으로 대체하지 않고 이번 identity에서 새로 실행했다.

[VERDICT: PASS]