6.0 KiB
6.0 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/--projectper-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_…) 모두 적용
- Tier-2/Tier-3 후보 반환 전, 같은 workspace의 다른 running row가 소유한
- T2. 생성-시 유일성 assert (
lib.shatomic_dump 뮤테이션 검증부,:377role-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-10uuidgen→<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-dirargs — CMD_FULL/START_CMD/spawn 모두 단일 디스패치 경유 - 격리 시 claude wrapper 경로 자동 비활성(env 운반 불가) / 격리 미사용 시 기존 명령과 byte-identical
- claude·agy·hermes: env prefix(
- T5.
isolation스키마 영속화 + 재적용 ✅- row에
isolation: {uuid, root, lever, seeded[]}기록(atomic_dump, DB+YAML 미러 확인) +_validateuuid/root 필수 검증 find_workspace_uuid <ws> <agent> [session]target-모드: 격리 row는 자기 격리 루트 안에서만 해석(전역 fallthrough 금지), cline<root>/sessions/경로 템플릿 분기 반영resolve_session_id.sh --session/stop_session.shcapture·purge에 세션 컨텍스트 전달 / T1 claimed-set의 자기-ID 필터 버그 동시 수정
- row에
- T-V2. 격리 동작 검증(실 스폰): 같은 CLI 2개(다른 role) 동시 생성 → 대화 파일 물리 분리,
*_own상이, 교차 write 0- (스크래치 기능 검증은 완료: 동일 ws의 cline 2-row가 111_aaa/222_bbb로 상이 해석, claude iso jsonl 해석, 불량 isolation 거부, T2 중복 거부, 레거시 no-target 무회귀 — 실 TUI 동시 스폰만 잔여)
- DoD: create→resolve 경로 검증 완료 / resume 실측은 T-V2와 함께
Phase 3 — stop 청소 계약 (T6)
- T6. stop 퍼지 (
stop_session.sh): row의isolation.rootrm -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 전부 유일
- V2. 동시 write 락 충돌·컨텍스트 오염 재현 불가 (기존 재현 시나리오 역검증)
- V3. 각 role resume이 자기 대화만 복원 (isolation 재적용 경유)
- V4. 단일-에이전트 기존 워크플로우 회귀 0 (격리 미발동 경로 불변 — 발동 조건/플래그 확정 포함)
- V5.
bash -n+shellcheck신규 경고 0 (lib.sh,create_session.sh,stop_session.sh, resume 스크립트) - DoD: V1~V5 전부 통과 → 리뷰어(Claude/Cline) 교차 리뷰 요청 → 전원 PASS 시 커밋