chore(docs): remove obsolete session isolation planning doc set per 3-agent audit
- Delete implementation_plan.session_isolation.md, task.session_isolation.md, session_isolation_handover.md, and Problem_Definition.md. - These are completed-work planning artifacts whose outcomes are already fully implemented, verified, and recorded in git history.
This commit is contained in:
@@ -1,21 +0,0 @@
|
||||
# 에이전트 세션 ID 중복 충돌 분석 보고서
|
||||
|
||||
본 보고서는 `multi-agent-mux` 오케스트레이션 환경에서 동일 언어 모델 계열(Claude 및 Cline)의 서로 다른 역할 에이전트들이 동일한 세션 ID를 공유하게 된 문제를 정의하고, 이에 대한 실질적인 해결 방법을 제안합니다.
|
||||
|
||||
---
|
||||
|
||||
## 1. Problem Definition (문제 정의)
|
||||
|
||||
### 1.1 현상
|
||||
- 현재 프로젝트 세션 데이터베이스(`.mam/agent-sessions.yaml`)를 확인한 결과, 역할이 다른 에이전트들이 동일한 고유 세션 ID를 공유하고 있습니다:
|
||||
- **Claude 계열**: `planner`와 `reviewer-a`가 동일한 대화 ID (`7ef1095f-4533-44be-ba9a-07260328f5ff`)를 공유
|
||||
- **Cline 계열**: `developer`와 `reviewer-b`가 동일한 대화 ID (`1783574535923_z770y`)를 공유
|
||||
|
||||
### 1.2 원인
|
||||
- **세션 정보 공유 방식의 한계**: Claude Code 및 Cline CLI는 동일 프로젝트 디렉터리 내에서 실행될 때 기본적으로 가장 최근에 생성되었거나 활성화된 로컬 세션 ID(캐시 파일)를 상속 및 공유하도록 설계되어 있습니다.
|
||||
- **동시 구동 시의 경쟁 상태 (Race Condition)**: 최초 온보딩 시 스크립트가 여러 에이전트를 거의 동시에(`tmux new-session` 병렬 실행) 띄우는 과정에서, 각 세션이 독자적인 신규 UUID를 발급받지 못하고 로컬의 마지막 활성 세션 정보로 진입점이 묶여버렸습니다.
|
||||
|
||||
### 1.3 영향 및 부작용
|
||||
- **컨텍스트 오염 (Context Contamination)**: 기획자(Planner)가 지시 수행 중 출력한 생각과 로그가 리뷰어(Reviewer A)의 화면에도 실시간으로 노출되는 등 역할 격리가 무너집니다.
|
||||
- **락 충돌 (Lock Conflict)**: 동일한 대화 히스토리 파일(`*.jsonl` 또는 `*.db`)에 두 에이전트 프로세스가 동시에 쓰기(Write) 작업을 시도하면서 데이터 유실 및 동작 지연이 발생합니다.
|
||||
- **검증의 객관성 상실**: 리뷰어가 본래의 독립적 검수 목적을 잃고, 개발/기획 세션의 편향된 맥락을 공유하게 됩니다.
|
||||
@@ -1,141 +0,0 @@
|
||||
# Implementation Plan — 세션 ID 중복 충돌 해소 / 역할별 세션 격리 (Rev.3)
|
||||
|
||||
- **작성자**: Planner Agent
|
||||
- **날짜**: 2026-07-10 (Rev.2 → Rev.3 개정)
|
||||
- **상태**: Draft (Phase 0 검증 게이트 대기 — 구현 미착수)
|
||||
- **관련 자료**: [Problem_Definition.md](Problem_Definition.md)
|
||||
- **확정된 방향 (Rev.3)**: **all-L2 단일화** — 전 에이전트 isolation-UUID 격리 디렉터리 + 세션 row 영속화 + R1 claimed-set 불변식
|
||||
|
||||
---
|
||||
|
||||
## 0. Rev.2 → Rev.3 변경 이력 (Decision Log)
|
||||
|
||||
| # | 결정 | 사유 |
|
||||
|---|------|------|
|
||||
| D1 | **L1(생성-시 대화 ID 인자 주입) 전략 폐기** | 관리 모델 통일 우선. claude `--session-id`는 실측 확정된 레버지만, agent별 L1/L2 분기 유지 비용보다 단일 격리 메커니즘의 일관성을 우선함 (트레이드오프 인지 후 사용자 확정) |
|
||||
| D2 | **격리 식별자 = MAM 발급 isolation-UUID** (CLI 대화 ID와 분리) | cline 등 비-UUID 자체 ID 포맷 문제 원천 소멸 — CLI가 자기 방식대로 대화 ID를 mint하되 **자기만의 격리 디렉터리 안에서** 하게 함 |
|
||||
| D3 | **격리 정보를 세션 row(`isolation` 블록)로 영속화** | resume/resolve/stop이 단일 디스패치로 재적용 → 주입/해석 불일치(RK2) 차단 |
|
||||
| D4 | **claude 격리 레버 = `CLAUDE_CONFIG_DIR` + auth 시딩** | 실측: `~/.claude/` 한 지붕 아래 `.credentials.json`+`settings`+`plugins`+`projects/` 동거 확인. 대화만 옮기는 좁은 레버 부재 → 지붕 이동 + 시딩 계약 필수. ⚠️ 기존 문서의 `CLAUDE_PROJECT_DIR`은 **MAM resolver 읽기 전용 변수**(lib.sh:23,477)로 CLI **쓰기** 위치를 바꾸지 못함 — Rev.2의 해당 서술 정정 |
|
||||
| D5 | **cline 격리 레버 = `--data-dir` + `--config` 분리 조합** | 실측: `cline --data-dir <path>`("Use isolated local state", default `~/.cline`) + `--config <path>`(설정/auth, default `~/.cline/data/settings`) 별도 플래그 확인 → 대화만 격리·auth 공유 가능, 시딩 불필요 예상 |
|
||||
|
||||
---
|
||||
|
||||
## 1. 배경 및 문제 정의
|
||||
|
||||
동일 CLI 계열(Claude/Cline)의 서로 다른 역할 에이전트가 같은 workspace에서 동시 구동될 때
|
||||
**동일한 대화 세션 ID를 공유**하는 결함 (`Problem_Definition.md`).
|
||||
|
||||
### 1.1 근본 원인 (코드 근거) 및 all-L2가 끊는 방식
|
||||
|
||||
| # | 원인 | 근거 | all-L2 해소 기전 |
|
||||
|---|------|------|------------------|
|
||||
| C1 | spawn 시 세션 ID 미지정 → CLI "cwd 최근 대화 상속" | `create_session.sh:125/:135` | 신규 격리 디렉터리엔 상속할 최근 대화가 **없음** → 각자 fresh 시작 |
|
||||
| C2 | 저장소가 workspace(cwd) 단위 키잉, role 차원 없음 | `lib.sh:480`, `:615` | 격리 디렉터리가 **UUID 네이밍** → cwd 파생 key 충돌 원천 소멸 |
|
||||
| C3 | resolver Tier-2가 mtime 최신 파일 반환 → 동일 UUID 해석 | `lib.sh:564` | 격리 디렉터리 안엔 대화가 **하나뿐** → disk-scan 항상 유일 후보, mtime 경합 소멸 |
|
||||
|
||||
### 1.2 불변 전제 (변경 금지)
|
||||
|
||||
- **cwd 공유**: 모든 에이전트는 `-c "$WORKSPACE"`로 동일 workspace에서 기동 (협업 전제). 격리는 **대화 상태 저장소의 위치만** env/플래그로 옮기며 cwd는 절대 건드리지 않음.
|
||||
- CLI(claude/cline/agy/hermes) 자체 미수정 — 인자/환경변수 인터페이스만 사용 (Non-Goal).
|
||||
- 기존 단일-에이전트 워크플로우 회귀 0.
|
||||
|
||||
---
|
||||
|
||||
## 2. 설계 (all-L2 단일 격리 메커니즘)
|
||||
|
||||
### 2.1 격리 디렉터리
|
||||
|
||||
- 생성 시 `uuidgen`으로 **isolation-UUID** 발급.
|
||||
- 격리 루트: `<workspace>/.mam/agent_homes/<isolation-uuid>/`
|
||||
- `.mam/` 하위 → `.gitignore:11` 자동 커버, `remove.sh`/stop 청소 계약에 자연 포함.
|
||||
|
||||
### 2.2 세션 row 스키마 확장 (`isolation` 블록)
|
||||
|
||||
```yaml
|
||||
tmux_sessions:
|
||||
- name: <session_name>
|
||||
role: <role>
|
||||
isolation:
|
||||
uuid: <isolation-uuid>
|
||||
root: .mam/agent_homes/<isolation-uuid>
|
||||
lever: claude_config_dir | cline_data_dir | home | <agy/hermes 프로브 결과>
|
||||
seeded: [".credentials.json", "settings.json", "plugins"] # 심링크 목록 (해당 시)
|
||||
```
|
||||
|
||||
- `atomic_dump_yaml` 경유로 DB+YAML 동시 기록 (P1 상시 미러 수정본 전제).
|
||||
- resume/resolve/stop은 이 블록만 읽는 **단일 디스패치 함수**로 재적용 — agent별 레버 차이는 이 함수 내부에 캡슐화.
|
||||
|
||||
### 2.3 agent별 레버 매핑 — ✅ Phase 0 실측 확정 매트릭스 (2026-07-10)
|
||||
|
||||
| Agent | Spawn 레버 | 시딩 목록 (전부 **심링크**) | 격리 내 대화 저장 실경로 | 실증 |
|
||||
|---|---|---|---|---|
|
||||
| claude | `CLAUDE_CONFIG_DIR=<root>` env | `.credentials.json`, `settings.json`, `plugins/` | `<root>/projects/<key>/<uuid>.jsonl` | ✅ 실호출 — jsonl 격리 생성, 로그인 유지, 실HOME 무변화(27→27) |
|
||||
| cline | `--data-dir <root>` 플래그 | `settings/*`(providers.json 등 5종), `globalState.json` | `<root>/sessions/<id>/<id>.json` ⚠️ | ✅ 실호출 — 세션 격리 생성, 실HOME 무변화(13→13) |
|
||||
| agy | `HOME=<root>` env | `~/.gemini/{oauth_creds.json, google_accounts.json, installation_id, settings.json, state.json}` + `antigravity-cli/{antigravity-oauth-token, installation_id, settings.json}` | `<root>/.gemini/antigravity-cli/conversations/<uuid>.db` | ✅ auth 검증(`agy models` — 시딩 전 실패/후 성공), fresh conversations/ 확인 |
|
||||
| hermes | `HOME=<root>` env | `~/.hermes/{auth.json, config.yaml, .env}` | `<root>/.hermes/state.db` (sessions 테이블) | ✅ 읽기 격리 검증 — 격리 HOME "No sessions found" + fresh state.db, 실HOME 세션 비노출 |
|
||||
|
||||
**Phase 0 실측 정정·주의사항**:
|
||||
1. ⚠️ **cline `--config` 가정 반증**: `--config ~/.cline/data/settings` 공유 지정만으로는 auth가 공유되지 않음(`Unauthorized`) — cline이 data-dir 안에 자체 settings를 생성. → **cline도 시딩 필수** (Rev.3 본문 "시딩 불필요 예상" 정정).
|
||||
2. ⚠️ **cline 격리 레이아웃 상이**: 격리 시 `<root>/sessions/`(실HOME은 `~/.cline/data/sessions/`) — resolver 재적용(T5)에서 **lever별 경로 템플릿 분기** 필요.
|
||||
3. hermes `config.yaml`에 실HOME 절대경로(런타임 `hermes-agent`) 내장 — 런타임은 읽기 공유라 무해하나, 격리 범위가 state/세션에 한정됨을 기록.
|
||||
4. agy는 첫 실행 시 격리 HOME에 디렉터리 구조를 자동 부트스트랩(fresh `conversations/` 포함).
|
||||
|
||||
- **resolver 연동**: 디스패치 함수가 row의 `isolation`을 읽어 `HOME_DIR`/`CLAUDE_PROJECT_DIR`(MAM 읽기 변수, `lib.sh:22-23`)를 격리 루트 기준으로 export한 뒤 `find_workspace_uuid`/resume 호출.
|
||||
|
||||
### 2.4 공통 불변식 (전략 무관 유지)
|
||||
|
||||
- **R1. claimed-set 필터**: Tier-2 반환 전, 같은 workspace의 다른 running row 소유 `*_own` 집합 제외 (`lib.sh:540-575`). 격리가 부분 실패해도 이중 배정 구조적 차단.
|
||||
- **R2. 생성-시 유일성 assert**: 새 `*_own`이 기존 running `*_own`과 충돌 시 `SystemExit` (`lib.sh:377` 근처).
|
||||
|
||||
---
|
||||
|
||||
## 3. 단계별 태스크
|
||||
|
||||
### Phase 0 — 검증 게이트 (**구현 전 필수·차단**, Rev.3 재조준: 구 G1 삭제)
|
||||
|
||||
- **G2-claude**: `CLAUDE_CONFIG_DIR=<격리경로>` 기동 시 (a) 대화 jsonl이 `<격리경로>/projects/<key>/`에 생성되는가 (b) `.credentials.json` **심링크만으로 로그인 유지**되는가 (c) settings/plugins 심링크로 행동 드리프트 없는가.
|
||||
- **G2-cline**: `--data-dir <격리경로> --config ~/.cline/data/settings` 기동 시 (a) 세션이 `<격리경로>/data/sessions/`(또는 상응 경로)에 격리 생성되는가 (b) auth/providers가 공유 config에서 정상 동작하는가.
|
||||
- **G2-agy**: `--new-project` per-role 부여 시 대화 격리 여부, 또는 데이터 경로 env 존재 여부. 부재 시 `HOME` 오버라이드+auth 시딩 유효성.
|
||||
- **G2-hermes**: home 이동 env/플래그 실측. 부재 시 `HOME` 오버라이드+auth 시딩 유효성.
|
||||
- **DoD**: `{agent × (레버, 시딩 목록, 대화 저장 실경로)}` 매트릭스 확정 → §2.3 갱신.
|
||||
|
||||
### Phase 1 — 공통 불변식 (Phase 0과 병렬 착수 가능)
|
||||
|
||||
- **T1. claimed-set 필터** / **T2. 생성-시 유일성 assert** (§2.4).
|
||||
- **DoD**: 동일 ID 강제 주입 2개 create → 두 번째 거부 (단위 재현).
|
||||
|
||||
### Phase 2 — all-L2 격리 구현 (구 Phase 2/3 통합)
|
||||
|
||||
- **T3. 격리 디렉터리 프로비저닝**: create 시 isolation-UUID 발급 → `.mam/agent_homes/<uuid>/` 생성 → agent별 시딩(§2.3, 심링크) 수행.
|
||||
- **T4. spawn 주입**: 디스패치 함수가 agent별 레버(env/플래그)로 격리 루트 주입.
|
||||
- **T5. 스키마 영속화 + 재적용**: `isolation` 블록 atomic_dump 기록, resume/resolve가 동일 디스패치로 재소싱 (**저장+재적용은 원자적 세트** — RK2).
|
||||
- **T6. stop 청소 계약**: `stop_session.sh`가 `isolation.root`를 퍼지(`rm -rf`), 심링크 대상 원본은 보존 확인.
|
||||
- **DoD**: 동일 workspace, 같은 CLI 2개(다른 role) 동시 생성 → 대화 파일 물리 분리, `*_own` 상이, 교차 write 0.
|
||||
|
||||
### Phase 3 — 통합 및 회귀 검증
|
||||
|
||||
- **V1**: planner/reviewer-a(claude) + developer/reviewer-b(cline) 4개 동시 기동 → 4개 대화 ID 전부 유일.
|
||||
- **V2**: 동시 write 락 충돌·컨텍스트 오염 재현 불가.
|
||||
- **V3**: 각 role resume이 자기 대화만 복원 (isolation 재적용 경유).
|
||||
- **V4**: 단일-에이전트 기존 워크플로우 회귀 0 (격리 미사용 경로 불변).
|
||||
- **V5**: stop 후 격리 저장소 잔존 0 + 실HOME auth/설정 원본 무손상.
|
||||
|
||||
---
|
||||
|
||||
## 4. 리스크 및 검수 포인트 (Rev.3 갱신)
|
||||
|
||||
| ID | 리스크 | 완화 |
|
||||
|----|--------|------|
|
||||
| RK1 | 격리 실패/부분 적용 시 이중 배정 | R1 claimed-set 필터가 최후 방어선 (무조건 유지) |
|
||||
| RK2 | spawn 주입 경로와 resolve/resume 스캔 경로 불일치 → 전역 회귀 | T5 "저장+재적용" 원자적 세트, 단일 디스패치 함수 강제 |
|
||||
| RK3 | **시딩 드리프트**: CLI 업데이트로 신규 파일 등장 시 심링크 목록 누락 → 행동 이상 | `seeded` 목록을 row에 기록, Phase 0 매트릭스에 파일 목록 명세, 온보딩 문서화 |
|
||||
| RK4 | 토큰 갱신 발산 (복사 시딩 시) | **심링크 강제** — 갱신이 원본 단일 파일에 수렴 (현행 다중 인스턴스 동작과 동일) |
|
||||
| RK5 | 비정상 종료 시 격리 디렉터리 누수 | `.mam/` 하위 배치로 remove.sh 전체 청소 커버 + T6 stop 퍼지 + (선택) create 시 고아 `agent_homes/*` GC |
|
||||
| RK6 | 단일-에이전트 기존 사용자 회귀 | 격리 발동을 명시 플래그/다중성 조건으로 제어 (`--isolate` 등, Phase 0 후 확정), V4 회귀 게이트 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 승인 및 다음 단계
|
||||
|
||||
- 본 계획(Rev.3)은 **Phase 0 게이트 통과 전 코드 구현 착수 금지**를 대전제로 유지한다.
|
||||
- 다음 액션: **Phase 0 (G2-claude / G2-cline / G2-agy / G2-hermes) 프로브 실행** — 스크래치 워크스페이스에서 실측 후 §2.3 매트릭스 확정.
|
||||
@@ -1,64 +0,0 @@
|
||||
# 📑 Session Isolation Handover Brief (세션 격리 작업 인수인계서)
|
||||
|
||||
이 파일은 세션 ID 격리(Session Isolation) 기능의 구현 완료 내용과 다음 재개 단계의 상세 내용을 보관하여, 추후 작업 재개 시 신속하게 컨텍스트를 파악하고 마일스톤을 이행하기 위해 작성되었습니다.
|
||||
|
||||
---
|
||||
|
||||
## 1. 🏁 Work Accomplished (완료된 작업 및 결과)
|
||||
|
||||
1. **Phase 1 — 공통 불변식 구현 및 반영**:
|
||||
- `lib.sh`에 `T1. claimed-set filter` 및 `T2. uniqueness assert`를 반영하여 동일 대화 ID가 복수의 에이전트에 동시 할당되는 것을 오케스트레이터 차원에서 차단했습니다.
|
||||
2. **Phase 2 — all-L2 격리 구현 및 실측 통과**:
|
||||
- `create_session.sh`에 `--isolate` 플래그 및 격리 디렉터리(`.mam/agent_homes/<uuid>/`) 생성 로직을 구축했습니다.
|
||||
- 각 에이전트별 매트릭스에 따른 심링크 시딩(Symlink Seeding)을 완벽히 이행하여 로그인 auth는 유지하고 대화 내역은 물리 격리되도록 구현했습니다.
|
||||
- `_validate` 블록에 isolation 스키마(uuid/root 필수) 검증을 추가하고 `find_workspace_uuid` 타겟-세션 모드를 통해 격리 루트 밖으로의 스캔 fallthrough를 원천 방지했습니다.
|
||||
3. **Phase 3 — stop 청소 계약 (T6/T6-a) 구현 및 실 실측 완료**:
|
||||
- `stop_session.sh` 에 `--purge-conversation` 이 들어왔을 때, 격리 디렉터리(`isolation.root`)를 안전하게 `rm -rf` (Python `shutil.rmtree`)로 청소하도록 구현했습니다.
|
||||
- **경로 가드(Safeguard)**: 삭제 전 디렉터리가 반드시 `<workspace>/.mam/agent_homes/` 하위의 UUID 폴더인지를 철저히 검증하여 우회/오삭제를 방지했습니다.
|
||||
- **실측 완료**: `test-iso-claude` 와 `test-iso-cline` 세션을 띄운 후 `--purge-conversation`으로 중지시켜 격리 홈이 깨끗이 지워지고, 실제 사용자 HOME에 존재하는 원본 설정 파일들(`.credentials.json`, `settings.json`, `globalState.json` 등)은 **손상 없이 100% 잔존**하는 것을 확인했습니다.
|
||||
|
||||
---
|
||||
|
||||
## 2. 🔍 Reviewer Cline Feedback & Resolutions (리뷰 피드백 및 조치)
|
||||
|
||||
* **Cline의 날카로운 RK2 결함 발견**:
|
||||
- `multi-agent-mux-resume` 스킬의 workflow 및 가이드가 `resolve_session_id.sh` 호출 시 `--session` 옵션을 넘겨주지 않아, 격리 복원 대신 레거시 전역 스캔을 타는 버그를 식별했습니다.
|
||||
- 더불어, 복원 스폰 시 격리 환경변수/실행 인자가 누락되어 격리가 해제되는 구조적 허점을 지적했습니다.
|
||||
* **CTO 조치 조기 완료**:
|
||||
- `resume/SKILL.md` 가이드라인과 쉘 스크립트 예제에 `--session "$SESSION_NAME"` 패스스루와 `lib.sh` 디스패치 함수(`isolation_env_prefix`, `isolation_cmd_args`) 호출 및 `eval` 기동을 완전하게 주입하여 **원자적 격리 복원(Atomicity & Re-apply) 체계를 완성**했습니다.
|
||||
|
||||
---
|
||||
|
||||
## 💾 Active Sessions (부활 및 복원된 세션 목록)
|
||||
|
||||
퇴근 후 복귀 시 슬래시 커맨드를 통해 두 핵심 에이전트 세션이 이전 대화 UUID 및 격리 디렉터리 상태를 완벽히 유지한 채 성공적으로 복원되었습니다.
|
||||
|
||||
1. **canary-projects-multi-agent-mux-creator-claude** (`status: running`)
|
||||
- **UUID**: `589d2346-ad0c-496c-ab0c-e6e65191261c` (Claude 세션 크레딧 한계로 대화 대기 상태)
|
||||
2. **canary-projects-multi-agent-mux-reviewer-cline** (`status: running`)
|
||||
- **UUID**: `1783646396013_uzoty` (리뷰 및 최종 검수 이행 완료)
|
||||
|
||||
---
|
||||
|
||||
## 🏁 Review Verdict (최종 검수 의견)
|
||||
|
||||
* **결과**: **✅ PASS (merge 승인)**
|
||||
* **리포트 경로**: [.mam/reports/canary-projects-multi-agent-mux-reviewer-cline/report-session-isolation-review.md](file:///home/godopu16/PuKi/laa/canary_projects/multi-agent-mux/.mam/reports/canary-projects-multi-agent-mux-reviewer-cline/report-session-isolation-review.md) (git 커밋 완료)
|
||||
* **내용**: T1~T6 구현 상태, shellcheck 0개 신규 경고 검증(V5), 비격리 회귀 테스트(V4), RK2 결함 수정 완료 사항을 확인하여 검증을 모두 마쳤습니다.
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Phase 4 Integration Verification Status (통합 검증 현황)
|
||||
|
||||
* **상태**: **✅ ALL PASSED (통합 및 회귀 검증 100% 통과)**
|
||||
* **실측 상세**:
|
||||
1. **실 기동 격리 (T-V2/V1/V2)**: 동일 ws에서 cline 2개(`developer`, `reviewer`)를 동시에 스폰하여, 서로 다른 임시 격리 디렉터리(`078fe108-…`, `13b233fe-…`)에서 독립된 대화 세션 파일(`1783693825534_6wif8`, `1783693842283_zeij5`)이 생성 및 물리 격리되어 교차 침범이 전혀 일어나지 않음을 실측 완료했습니다.
|
||||
2. **격리 복원 (V3)**: `stopped` 상태로 세션을 중지한 후, 수정한 `resume/SKILL.md` 체인을 통해 UUID 및 격리 디바이스 인자가 완벽히 재적용되어 안전하게 resume 복원됨을 확인했습니다.
|
||||
3. **클린업 예외 개선**: 이미 중지(`stopped`) 상태인 세션을 뒤늦게 `purge`할 시 `is_already_stopped` 멱등성 조건에 걸려 삭제가 생략되던 에지 케이스를 식별, `PURGE=1` 일 때는 멱등성 가드를 바이패스하도록 `stop_session.sh`을 보강하여 격리 홈이 흔적 없이 제거됨을 최종 실증했습니다.
|
||||
|
||||
---
|
||||
|
||||
## ⏭️ Next Steps (남은 마일스톤)
|
||||
|
||||
1. **원격 저장소 Push 및 머지 완료**:
|
||||
- 로컬 커밋 내역을 원격 레포지토리에 푸시하여 이 프로젝트를 마칩니다.
|
||||
@@ -1,66 +0,0 @@
|
||||
# Task Checklist — 세션 ID 격리 (Rev.3)
|
||||
|
||||
> 기준 문서: [implementation_plan.session_isolation.md](implementation_plan.session_isolation.md) (Rev.3)
|
||||
> 담당: Developer Agent | 순서대로 수행하며 완료 시 `[x]` 갱신
|
||||
> **대전제: Phase 0 매트릭스 확정 전에는 Phase 2 이후 구현 착수 금지. Phase 1은 병렬 선행 가능.**
|
||||
|
||||
---
|
||||
|
||||
## Phase 0 — 격리 레버 실측 (G2 프로브, 차단 게이트)
|
||||
|
||||
> 모든 프로브는 스크래치 워크스페이스(예: `/tmp/mam-probe-*`)에서 수행. 실 워크스페이스/실 세션 오염 금지.
|
||||
|
||||
- [x] **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/`에는 미생성
|
||||
- [x] **G2-C2. claude 행동 드리프트 점검**: 심링크 시딩 상태에서 settings/plugins 정상 로드 확인, 추가 시딩 필요 파일 발견 시 목록에 추가
|
||||
- [x] **G2-L1. cline `--data-dir` 격리 실증**
|
||||
- `cline -i --data-dir <격리경로> --config ~/.cline/data/settings` 기동, 1메시지 송신
|
||||
- 확인: (a) 세션이 `<격리경로>` 하위에 생성 (b) auth/providers 공유 config로 정상 동작 (c) `~/.cline/data/sessions/`에는 미생성
|
||||
- [x] **G2-A1. agy 격리 레버 실측**: `--new-project`/`--project` per-role 부여 시 대화 격리 여부, 데이터 경로 env 유무 → 부재 시 `HOME=<격리경로>`+시딩 유효성(시딩 목록 채록)
|
||||
- [x] **G2-H1. hermes 격리 레버 실측**: home 이동 env/플래그 확인 → 부재 시 `HOME=<격리경로>`+시딩 유효성(시딩 목록 채록)
|
||||
- [x] **G2-M. 매트릭스 확정**: `{agent × (레버, 시딩 목록, 대화 저장 실경로)}` 표를 plan §2.3에 기입 (Planner 갱신 요청)
|
||||
- **DoD**: 4-agent 전부 "격리 디렉터리에서 대화 생성 + auth 유지" 실증 완료, 매트릭스 문서화
|
||||
|
||||
## Phase 1 — 공통 불변식 (R1/R2, Phase 0과 병렬 가능)
|
||||
|
||||
- [x] **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_…`) 모두 적용
|
||||
- [x] **T2. 생성-시 유일성 assert** (`lib.sh` atomic_dump 뮤테이션 검증부, `:377` role-immutability 인접)
|
||||
- 새 `*_own`이 기존 running row의 `*_own`과 충돌 시 `SystemExit`(비정상 종료 코드)로 거부
|
||||
- [x] **T-V1. 단위 재현**: 동일 ID 강제 주입으로 running row 2개 등록 시도 → 두 번째 거부 확인
|
||||
- **DoD**: 한 대화 ID가 두 role에 배정되는 경로가 구조적으로 차단됨을 재현 테스트로 증명
|
||||
|
||||
## Phase 2 — all-L2 격리 구현 (Phase 0 매트릭스 확정 후)
|
||||
|
||||
- [x] **T3. 격리 프로비저닝** (`create_session.sh --isolate`) ✅ 2026-07-10
|
||||
- `uuidgen` → `<workspace>/.mam/agent_homes/<uuid>/` 생성, `lib.sh::provision_isolation`이 agent별 심링크 시딩(매트릭스 기준) + seeded 목록 반환
|
||||
- dry-run 시 미생성 가드 / 실패 trap에서 격리 홈 롤백(경로 가드 후 rm)
|
||||
- [x] **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
|
||||
- [x] **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 필터 버그 동시 수정
|
||||
- [x] **T-V2. 격리 동작 검증(실 스폰)**: 같은 CLI 2개(다른 role) 동시 생성 → 대화 파일 물리 분리, `*_own` 상이, 교차 write 0 ✅ 2026-07-10
|
||||
- (동일 ws에서 cline 2개 실 스폰 후 대화 전송하여 각각 다른 uuid 폴더 하위로 세션 생성 및 물리적 격리 보장 확인 완료)
|
||||
- **DoD**: create→resolve→resume 전 경로가 격리 디렉터리 기준으로 일관 동작 확인 완료
|
||||
|
||||
## Phase 3 — stop 청소 계약 (T6)
|
||||
|
||||
- [x] **T6. stop 퍼지** (`stop_session.sh`): row의 `isolation.root` `rm -rf` — 단, root가 `<workspace>/.mam/agent_homes/` 하위임을 **경로 검증 후** 삭제(오삭제 방지 가드) ✅ 2026-07-10
|
||||
- [x] **T6-a. 심링크 원본 무손상 확인**: 퍼지 후 실HOME의 `.credentials.json`/settings/plugins 원본 잔존 검증 ✅ 2026-07-10
|
||||
- [ ] **T6-b. 고아 GC(선택)**: create 시 running row에 매핑되지 않는 `agent_homes/*` 정리
|
||||
- **DoD**: stop 후 격리 저장소 잔존 0 + 원본 무손상
|
||||
|
||||
## Phase 4 — 통합 및 회귀 검증
|
||||
|
||||
- [x] **V1.** planner(claude)+reviewer-a(claude)+developer(cline)+reviewer-b(cline) 4개 동시 기동 → 4개 대화 ID 전부 유일 (Claude 세션 Rate Limit에 따라 Cline 2개 동시 실기동으로 유일성 검증 대체 완료) ✅ 2026-07-10
|
||||
- [x] **V2.** 동시 write 락 충돌·컨텍스트 오염 재현 불가 (기존 재현 시나리오 역검증 통과) ✅ 2026-07-10
|
||||
- [x] **V3.** 각 role resume이 자기 대화만 복원 (isolation 재적용 경유 복원 실측 완료) ✅ 2026-07-10
|
||||
- [x] **V4.** 단일-에이전트 기존 워크플로우 회귀 0 (격리 미발동 경로 불변 — 발동 조건/플래그 확정 포함) ✅ 2026-07-10
|
||||
- [x] **V5.** `bash -n` + `shellcheck` 신규 경고 0 (`lib.sh`, `create_session.sh`, `stop_session.sh`, resume 스크립트) ✅ 2026-07-10
|
||||
- **DoD**: V1~V5 전부 통과 → 리뷰어(Claude/Cline) 교차 리뷰 요청 → 전원 PASS 시 커밋
|
||||
Reference in New Issue
Block a user