# task-2700+1 — LOCAL_MAIN_DIVERGENCE_PREVENTION FRESH RE-EXTRACT (7파일 · origin/main 최신 base · 회장 verbatim 2026-05-27)

- Level: Lv.3 (인프라/거버넌스 · fresh re-extract 복구)
- 담당: **dev6-team Perun 페룬** (★ 회장 verbatim 2026-05-27 지정 · bot key 1e41a2324a3ccdd0 · task-2700 산출 동일 컨텍스트)
- chair_authorization_id: **`CHAIR-AUTH-TASK-2700-PLUS1-FRESH-REEXTRACT-DIVERGENCE-PREVENTION-20260527-JJONGS-IMPLEMENT-001`** (★ 회장 verbatim 2026-05-27 발급 확정)
- ★ 발사 시점 origin/main 최신 = **f3550d9f** (PR #159 merge 반영)
- 완료 목표: **`TASK_2700_FRESH_REEXTRACT_READY`** (★ not MERGE_READY / not MERGED)

## ★ 배경

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

## ★ 목표 (1줄)

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

## ★ 재적용 순수 산출 7파일 (★ task-2700 worktree 141ea946 에서 read-only 추출)

1. `utils/divergence_guard.py` (ahead/behind 측정 + fail-closed HOLD · --fail-open 없음)
2. `utils/dirty_registry.py` (dirty ownership registry JSONL)
3. `utils/callback_cause_classifier.py` (NORMAL_CALLBACK_MISSING vs FINISH_TASK_GIT_GATE_BLOCKED)
4. `scripts/worktree_manager.py` (origin/main SHA 강제 + base marker + spawn 검증)
5. `scripts/pre_dispatch_divergence_guard.sh` (pre-flight hook · dispatch.py 미변경 진입점)
6. `scripts/finish-task.sh` (★ GIT-GATE own/unrelated dirty 분리진단 + merge-base 검증 확장 · 코어 보존)
7. `tests/regression/test_local_main_divergence_prevention_2700.py` (8 시나리오 + task-2699 fixture)

## ★ 작업 절차 (★ base SHA 명시 강제)

1. `git fetch origin` → **origin/main 최신 SHA 확인** (발사 시점 최신 · task marker 기록)
2. **`git worktree add <new> <origin/main 최신 SHA>`** (★ 로컬 main f14b3850 분기 절대 금지)
3. base SHA 를 task marker 에 기록
4. task-2700 worktree(141ea946)에서 7파일 read-only 추출 → fresh base 재적용
5. ★ **stale/local main 기반 무관 파일 유입 0** (dispatch/__init__.py · memory/plans/task-2568/2569 · protection-list 등 절대 포함 금지)
6. finish-task.sh 확장분이 origin/main 최신 finish-task.sh 와 충돌 없는지 확인 (PR#155 NORMAL-CALLBACK-ENFORCE 블록 보존)
7. regression: `python3 -m pytest tests/regression/test_local_main_divergence_prevention_2700.py -q` PASS
8. fresh branch commit + push → fresh PR open (base origin/main 최신)
9. merge-base == origin/main 최신 SHA 검증
10. finish-task → .done → ANU callback (clean origin base)

## ★ M1 dispatch 연결 보류 명확 기록 (★ 회장 verbatim)

pre_dispatch_divergence_guard.sh = **dispatch.py 미변경 pre-flight hook 진입점**. 라이브 dispatch 연결(M1)은 **HOLD_FOR_CHAIR — 회장 별도 승인 대기**. 보고/PR 설명에 "M1 dispatch live-wire 보류" 명시.

## ★ 금지 (★ 회장 verbatim)

- expected_files(7파일) 외 포함 / stale·local main 기반 파일 유입
- dispatch.py 직접 변경 (★ 외부 preflight/hook 방식 유지)
- 로컬 main 기준 worktree 분기 (★ origin/main 최신 SHA)
- 로컬 main reset/stash/checkout / dirty 881 일괄 정리 / ahead·behind commit 손실 조치
- PR #158 · PR #159 · 기존 task-2700 branch 접촉
- own dirty FAIL 완화 / fail-closed bypass flag
- manual .done 생성 / auto-merge / merge

## ★ Spawn Verification + base SHA 검증

fire+5분 4 신호 + **worktree base SHA == origin/main 최신 확인** (stale 면 즉시 HOLD).

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "utils/divergence_guard.py"
    - "utils/dirty_registry.py"
    - "utils/callback_cause_classifier.py"
    - "scripts/worktree_manager.py"
    - "scripts/pre_dispatch_divergence_guard.sh"
    - "scripts/finish-task.sh (★ 분리진단 확장 · PR#155 enforce 블록 보존)"
    - "tests/regression/test_local_main_divergence_prevention_2700.py"
  forbidden_paths:
    - "dispatch.py · dispatch/__init__.py (★ 미변경 · preflight/hook 만)"
    - "settings.json · hooks/** · Axis/** · .github/** · **/.env*"
    - "memory/** · reports/** · plans/** (★ stale 유입 0 · artifact 0)"
    - "PR #158 / PR #159 / task-2700 기존 branch"
  commands:
    - "git fetch / worktree add <new> <origin/main 최신 SHA> / log / diff / show / commit / push"
    - "gh pr create / gh pr view / gh api (read)"
    - "python3 -m pytest"
  merge_policy: "no_merge_chair_approval_required"
  ttl_hours: 8
```

## ★ 보고 필드

1. worktree base SHA (== origin/main 최신 검증)
2. fresh branch/PR 번호 + head SHA
3. 7파일 재적용 evidence (stale 유입 0)
4. M1 dispatch 연결 보류 기록
5. dispatch.py 미변경 evidence
6. finish-task PR#155 enforce 블록 보존 evidence
7. regression PASS (8 시나리오 + task-2699 fixture)
8. merge-base == origin/main 최신 검증
9. finish-task .done + callback
10. forbidden_action_count

## 종결

성공: **`TASK_2700_FRESH_REEXTRACT_READY`** (★ merge 회장 결재)

★ 회장 verbatim 2026-05-27. task-2700 stale base 복구. origin/main 최신 base 강제. 7파일만. M1 보류 기록. dispatch.py 미변경.

끝

## goal_assertions (auto-generated)
- `python3 -m pytest tests/regression/test_local_main_divergence_prevention_2700.py -q`
