# task-2377 보고서: worktree_manager `.env` 자동 복사 옵션

## SCQA 요약

- **Situation**: 멀티봇 환경에서 InsuRo 등 신규 워크트리 생성 시 `.env`가 따라가지 않아 E2E/서버 부팅 단계에서 환경 진단 시간을 다수 소비함.
- **Complication**: 페룬(task-2373) 사례에서 `cp .env` 1회로 해결됐지만, 모든 봇이 동일 함정에 노출. 회장 결정 "지금 위임"으로 즉시 보강.
- **Question**: `worktree_manager.py create`가 워크트리 생성 직후 root의 `.env*` 파일을 자동 복사하면서, 안전(secret 노출 0)·회귀(기존 흐름 유지)·옵션(`--no-copy-env` 비활성화) 세 조건을 만족할 수 있는가?
- **Answer**: 헬퍼 1개 + signature 1줄 + argparse 1줄 + 응답 키 1개의 surgical 변경으로 전부 충족. 단위 6/6 + 회귀 7/7 + 실 CLI 스모크 2건 PASS.

## 변경 요약

### 수정 파일
- `scripts/worktree_manager.py` (+68 / −3 라인, git diff 기준)
  - 신규: `_ENV_COPY_PATTERNS` 상수, `_copy_env_files()` 헬퍼
  - 수정: `cmd_create()` signature(`copy_env: bool = True`) 및 3개 분기(skipped/reused/created) 모두 `copied_env_files` 응답 키 포함
  - 수정: `build_parser()`의 `p_create`에 `--no-copy-env` (store_true) 추가
  - 수정: `main()` create 분기에서 `copy_env=not args.no_copy_env` 전달

### 신규 파일
- `tests/dev3/test_worktree_manager_env_copy.py` (139라인, 6 테스트)

### 변경 금지 파일 — 모두 미수정 확인
finish-task.sh / auto_merge.py / done-watcher.py / task-scope-guard.sh / post_merge_probe.py / auto_revert.py / anu_confirm_bot/** / daily_digest.py / bot_status_resolver.py / dispatch.py / CLAUDE.md / memory/capabilities/** / memory/audit/** / .github/**

## 검증 시나리오 매트릭스 (7/7 PASS)

| # | 시나리오 | 방식 | 결과 |
|---|---------|------|------|
| 1 | 기본 동작: `.env` + `.env.local` 복사 + 응답 포함 | 임시 git repo + `worktree_manager.py create` 실행 | ✅ `copied_env_files: [".env", ".env.local"]` |
| 2 | `--no-copy-env`: 복사 0건 | 동일 명령 + 플래그 | ✅ `copied_env_files: []`, 워크트리 내 `.env` 없음 |
| 3 | 누락 silent: `.env` 없음 → 에러 X | `test_copy_env_silent_when_absent` (pytest) | ✅ `[]` 반환, 예외 없음 |
| 4 | 회귀 0: 기존 워크트리 흐름(rate limit, branch, blast radius, push) 정상 | `tests/test_worktree_auto_fix_1993.py` 7/7 + 실 CLI `status: created` | ✅ |
| 5 | 권한 보존: 0o600 유지 | `chmod 600 .env` 후 `stat -c %a` | ✅ `600` 유지 (`shutil.copy2` 사용) |
| 6 | 단위 테스트 | `tests/dev3/test_worktree_manager_env_copy.py` 6 테스트 | ✅ 6/6 PASS (0.10s) |
| 7 | 타입 회귀 0 | `pyright scripts/worktree_manager.py` | ✅ 0 errors / 0 warnings (mypy 잔존 yaml stub 에러는 line 372 기존, 본 변경 영역 외) |

### 페룬 task-2373 사례 차단 시뮬레이션
- **기존**: 페룬 → `worktree_manager.py create /home/jay/projects/InsuRo task-2373 dev6` → 워크트리 생성 → E2E 실행 → `.env` 미존재 → 환경 진단 다수 소비
- **변경 후**: 동일 명령 → 워크트리 생성 직후 `_copy_env_files`가 `.env`/`.env.local` 자동 복사 → 응답 dict의 `copied_env_files: [".env", ...]`로 봇이 즉시 인지 → E2E 바로 실행 가능 → 1라인 차단 ✔

## L1 스모크테스트 결과 (필수)

- **서버 재시작**: 해당없음 (CLI 도구, 데몬 아님)
- **API 응답 확인**: 해당없음 (CLI). 대신 실 CLI 실행 결과:
  - `python3 scripts/worktree_manager.py create $TMPDIR task-2377-test dev3` → `{"status":"created","copied_env_files":[".env",".env.local"]}` (정상)
  - `python3 scripts/worktree_manager.py create --no-copy-env $TMPDIR task-2377-noflag dev3` → `{"status":"created","copied_env_files":[]}` (정상)
- **스크린샷**: 해당없음 (UI 아님)
- **CLI help**: `worktree_manager.py create --help`에 `--no-copy-env` 옵션 표시 확인
- **실 파일 시스템 검증**: 워크트리 디렉터리에 `.env`(권한 600), `.env.local`(권한 644) 복사 확인. `.env.example` 미복사 확인.

## 발견 이슈 및 해결
없음. 작업 범위 내 모든 항목 정상 완료.

## 모델 사용 기록
- 루(Lugh, 백엔드) — sonnet (코딩 위임 기본값)
- 모리건(Morrigan, 테스터) — sonnet (테스트 코드 작성)
- 다그다(팀장) — opus (설계/검토/통합만, 직접 코딩 0)

## 머지 판단
- **머지 필요**: No (시스템 인프라, project_path 없음 — `/home/jay/workspace` 메인 디렉토리 직접 작업)
- **워크트리 경로**: 해당없음 (시스템 작업으로 worktree 미생성)
- **머지 의견**: finish-task.sh가 `/home/jay/workspace`에 대한 머지 처리(또는 commit)를 자동 수행. 단위 6/6 + 회귀 7/7 + 실 CLI 2/2 모두 PASS, pyright 0건이라 머지/커밋 가능.

## 비고
- `cmd_create`의 "reused", "skipped"(read_only) 분기는 `_copy_env_files`를 호출하지 않음 — 기존 워크트리 미변경 원칙 준수, 응답 일관성을 위해 `copied_env_files: []` 키만 추가.
- secret 안전: 헬퍼는 basename 리스트만 반환, 파일 내용/절대경로 로그 금지. 실패 시 `logger.warning`에 파일명만 기록.
- `@validate_worktree_safety` 데코레이터는 positional 인자 3개 + `read_only` kwarg만 검사하므로, 신규 `copy_env` kwarg 추가에 영향 없음.
- 자기 참조 주의(task 지시서 명시): 본 변경은 머지 직후의 다음 워크트리 생성부터 효력 발생.

## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회

