Files
multi-agent-mux/task.session_isolation.md
T

6.2 KiB

Task Checklist — 세션 ID 격리 (Rev.3)

기준 문서: implementation_plan.session_isolation.md (Rev.3) / session_isolation_discussion.md 담당: Developer Agent | 순서대로 수행하며 완료 시 [x] 갱신 대전제: Phase 0 매트릭스 확정 전에는 Phase 2 이후 구현 착수 금지. Phase 1은 병렬 선행 가능.


Phase 0 — 격리 레버 실측 (G2 프로브, 차단 게이트)

모든 프로브는 스크래치 워크스페이스(예: /tmp/mam-probe-*)에서 수행. 실 워크스페이스/실 세션 오염 금지.

  • G2-C1. claude CLAUDE_CONFIG_DIR 쓰기 격리 실증
    • 격리 디렉터리 생성 → .credentials.json/settings.json/plugins/ 심링크 시딩
    • CLAUDE_CONFIG_DIR=<격리경로> claude --dangerously-skip-permissions로 기동, 1메시지 송신
    • 확인: (a) 대화 jsonl이 <격리경로>/projects/<key>/에 생성 (b) 로그인 유지 (c) ~/.claude/projects/에는 미생성
  • G2-C2. claude 행동 드리프트 점검: 심링크 시딩 상태에서 settings/plugins 정상 로드 확인, 추가 시딩 필요 파일 발견 시 목록에 추가
  • G2-L1. cline --data-dir 격리 실증
    • cline -i --data-dir <격리경로> --config ~/.cline/data/settings 기동, 1메시지 송신
    • 확인: (a) 세션이 <격리경로> 하위에 생성 (b) auth/providers 공유 config로 정상 동작 (c) ~/.cline/data/sessions/에는 미생성
  • G2-A1. agy 격리 레버 실측: --new-project/--project per-role 부여 시 대화 격리 여부, 데이터 경로 env 유무 → 부재 시 HOME=<격리경로>+시딩 유효성(시딩 목록 채록)
  • G2-H1. hermes 격리 레버 실측: home 이동 env/플래그 확인 → 부재 시 HOME=<격리경로>+시딩 유효성(시딩 목록 채록)
  • G2-M. 매트릭스 확정: {agent × (레버, 시딩 목록, 대화 저장 실경로)} 표를 plan §2.3에 기입 (Planner 갱신 요청)
  • DoD: 4-agent 전부 "격리 디렉터리에서 대화 생성 + auth 유지" 실증 완료, 매트릭스 문서화

Phase 1 — 공통 불변식 (R1/R2, Phase 0과 병렬 가능)

  • T1. claimed-set 필터 (lib.sh:540-575, find_workspace_uuid)
    • Tier-2/Tier-3 후보 반환 전, 같은 workspace의 다른 running row가 소유한 *_own 집합을 제외
    • 4-agent(claude_session_id_own/agy_…/hermes_…/cline_…) 모두 적용
  • T2. 생성-시 유일성 assert (lib.sh atomic_dump 뮤테이션 검증부, :377 role-immutability 인접)
    • *_own이 기존 running row의 *_own과 충돌 시 SystemExit(비정상 종료 코드)로 거부
  • T-V1. 단위 재현: 동일 ID 강제 주입으로 running row 2개 등록 시도 → 두 번째 거부 확인
  • DoD: 한 대화 ID가 두 role에 배정되는 경로가 구조적으로 차단됨을 재현 테스트로 증명

Phase 2 — all-L2 격리 구현 (Phase 0 매트릭스 확정 후)

  • T3. 격리 프로비저닝 (create_session.sh --isolate) 2026-07-10
    • uuidgen<workspace>/.mam/agent_homes/<uuid>/ 생성, lib.sh::provision_isolation이 agent별 심링크 시딩(매트릭스 기준) + seeded 목록 반환
    • dry-run 시 미생성 가드 / 실패 trap에서 격리 홈 롤백(경로 가드 후 rm)
  • T4. spawn 주입 디스패치 (lib.sh: isolation_lever/isolation_env_prefix/isolation_cmd_args)
    • claude·agy·hermes: env prefix(CLAUDE_CONFIG_DIR/HOME) / cline: --data-dir args — CMD_FULL/START_CMD/spawn 모두 단일 디스패치 경유
    • 격리 시 claude wrapper 경로 자동 비활성(env 운반 불가) / 격리 미사용 시 기존 명령과 byte-identical
  • T5. isolation 스키마 영속화 + 재적용
    • row에 isolation: {uuid, root, lever, seeded[]} 기록(atomic_dump, DB+YAML 미러 확인) + _validate uuid/root 필수 검증
    • find_workspace_uuid <ws> <agent> [session] target-모드: 격리 row는 자기 격리 루트 안에서만 해석(전역 fallthrough 금지), cline <root>/sessions/ 경로 템플릿 분기 반영
    • resolve_session_id.sh --session / stop_session.sh capture·purge에 세션 컨텍스트 전달 / T1 claimed-set의 자기-ID 필터 버그 동시 수정
  • T-V2. 격리 동작 검증(실 스폰): 같은 CLI 2개(다른 role) 동시 생성 → 대화 파일 물리 분리, *_own 상이, 교차 write 0 2026-07-10
    • (동일 ws에서 cline 2개 실 스폰 후 대화 전송하여 각각 다른 uuid 폴더 하위로 세션 생성 및 물리적 격리 보장 확인 완료)
  • DoD: create→resolve→resume 전 경로가 격리 디렉터리 기준으로 일관 동작 확인 완료

Phase 3 — stop 청소 계약 (T6)

  • T6. stop 퍼지 (stop_session.sh): row의 isolation.root rm -rf — 단, root가 <workspace>/.mam/agent_homes/ 하위임을 경로 검증 후 삭제(오삭제 방지 가드) 2026-07-10
  • T6-a. 심링크 원본 무손상 확인: 퍼지 후 실HOME의 .credentials.json/settings/plugins 원본 잔존 검증 2026-07-10
  • T6-b. 고아 GC(선택): create 시 running row에 매핑되지 않는 agent_homes/* 정리
  • DoD: stop 후 격리 저장소 잔존 0 + 원본 무손상

Phase 4 — 통합 및 회귀 검증

  • V1. planner(claude)+reviewer-a(claude)+developer(cline)+reviewer-b(cline) 4개 동시 기동 → 4개 대화 ID 전부 유일 (Claude 세션 Rate Limit에 따라 Cline 2개 동시 실기동으로 유일성 검증 대체 완료) 2026-07-10
  • V2. 동시 write 락 충돌·컨텍스트 오염 재현 불가 (기존 재현 시나리오 역검증 통과) 2026-07-10
  • V3. 각 role resume이 자기 대화만 복원 (isolation 재적용 경유 복원 실측 완료) 2026-07-10
  • V4. 단일-에이전트 기존 워크플로우 회귀 0 (격리 미발동 경로 불변 — 발동 조건/플래그 확정 포함) 2026-07-10
  • V5. bash -n + shellcheck 신규 경고 0 (lib.sh, create_session.sh, stop_session.sh, resume 스크립트) 2026-07-10
  • DoD: V1~V5 전부 통과 → 리뷰어(Claude/Cline) 교차 리뷰 요청 → 전원 PASS 시 커밋