---
task_id: task-2700+1
type: plan
scope: task
level: 3
created: 2026-05-28
updated: 2026-05-28
status: completed
---

# 계획서: task-2700+1 — LOCAL_MAIN_DIVERGENCE_PREVENTION FRESH RE-EXTRACT

## 목표 (1줄)
origin/main **최신 SHA(f3550d9f)** 기준 fresh clean worktree에서 task-2700 **순수 산출 7파일만** 재적용 → 새 fresh PR. (stale/local main 유입 0)

## 배경
- task-2700 산출은 논리 유효하나 **stale 로컬 main 기반**(merge-base 6220f5b5 ≠ origin/main) → PR/merge 금지.
- task-2700 branch(`task/task-2700-dev6` · HEAD `141ea946`)는 **보존 evidence**(미접촉).
- 박제: `memory/events/pr159-release-watcher-plus-task2700-stale-base-260527.json`

## 범위 (재적용 순수 산출 7파일)
1. `utils/divergence_guard.py` (신규 · 336L)
2. `utils/dirty_registry.py` (신규 · 389L)
3. `utils/callback_cause_classifier.py` (신규 · 160L)
4. `scripts/worktree_manager.py` (수정 · origin/main + task-2700 +217L 3-way merge)
5. `scripts/pre_dispatch_divergence_guard.sh` (신규 · 66L)
6. `scripts/finish-task.sh` (수정 · GIT-GATE dirty 분리진단 B-1 + merge-base 검증 B-2만 · PR#155 enforce 블록 보존)
7. `tests/regression/test_local_main_divergence_prevention_2700.py` (신규 · 519L · 8+ 시나리오)

## 핵심 base 결정
- 발사 시점 origin/main 최신 = **f3550d9f** (PR #159 merge 반영) — `git fetch origin` 실측 확인.
- 로컬 main = f14b3850 (ahead 6, behind 69) → **절대 base 금지**.
- worktree base SHA = f3550d9f 강제.

## 재적용 전략 (파일별)
- **5 신규 파일**: origin/main에 부재 확인 → task-2700(141ea946)에서 byte-exact 복사. 충돌 0.
- **worktree_manager.py**: origin/main의 task-2575 lock_sha(+17L)와 task-2700 base-marker(+217L)가 copy_env+return 영역에서 겹침 → 3-way merge 후 **양쪽 모두 보존** 수동 해소.
- **finish-task.sh**: origin/main(+322L, PR#155 NORMAL-CALLBACK-ENFORCE 포함) 기준 + task-2700 **B-1(dirty 분리진단)·B-2(merge-base 검증) 2개 hunk만** 선택 적용. task-2569 stash-audit hunk(stale 오염)는 **제외**.

## 금지 (회장 verbatim)
- expected_files(7) 외 포함 / stale·local main 기반 파일 유입(dispatch/__init__.py, memory/plans/task-2568·2569, reports, protection-list 등)
- dispatch.py 직접 변경 (외부 preflight/hook 유지)
- 로컬 main 기준 worktree 분기
- 로컬 main reset/stash/checkout / dirty 일괄 정리 / ahead·behind commit 손실
- PR #158 · PR #159 · 기존 task-2700 branch 접촉
- own dirty FAIL 완화 / fail-closed bypass flag
- manual .done / auto-merge / merge

## 게이트
- G1 설계: 3문서 + Codex 사전검증 PASS + sanitize.
- G2 구현: regression PASS(8 시나리오) + Gemini PR 리뷰 + 마아트 독립검증.
- G3 머지: g3_independent_verifier PASS. **머지는 회장 결재**(no_merge).

## M1 dispatch 연결 보류
`pre_dispatch_divergence_guard.sh` = dispatch.py 미변경 pre-flight hook 진입점. 라이브 dispatch 연결(M1)은 **HOLD_FOR_CHAIR** — 회장 별도 승인 대기.

## 완료 목표
**`TASK_2700_FRESH_REEXTRACT_READY`** (not MERGE_READY / not MERGED)
