---
task_id: task-2701+1
type: context
scope: task
created: 2026-05-28
updated: 2026-05-28
status: in-progress
---

# 맥락 노트: task-2701+1 (Phase B preserve-then-align 실행)

**task**: task-2701+1

---

## 결정 근거

### [핵심 결정 1] reset 대상 = 최신 origin/main `35e81f01` (Phase A의 f3550d9f에서 1 전진)
- 2026-05-28 08:20 KST `git fetch origin` 후 origin/main = `35e81f01` (PR #160 = task-2700+1 dev6 페룬 LOCAL_MAIN_DIVERGENCE_PREVENTION).
- 재측정: local main=f14b3850, merge-base=6220f5b5 → ahead **6** / behind **70** (Phase A 69에서 +1, origin 1 전진 반영).
- ahead 6 commit은 Phase A와 동일(f14b3850/5a29d3ee/6b082dab/f0e90e09/3000e601/8e18e354).
- PR #160은 수정 금지 대상이나, reset 대상으로 origin/main을 **읽기/정합 기준**으로 사용하는 것은 허용(브랜치/PR 미접촉).

### [핵심 결정 2] ahead 6 손실 위험 = 0 (reset 전 실측 재확인)
- 6개 전부 `refs/remotes/origin/task/task-2699-dev1` + `task/task-2691-dev8`에서 도달 가능(for-each-ref --contains) → 이미 push됨, reset 해도 손실 0.
- 이중 안전장치: 보존 branch `task-2701-local-main-preserve` @ f14b3850 로컬 생성(belt-and-suspenders).

### [핵심 결정 3] truncate 2파일 = HEAD 정본 == origin 정본 (blob 동일) → reset만으로 정본 복원
- replacement_pr_runner.py: 로컬 0바이트(빈 파일) ↔ HEAD/origin = 718줄, sha256 95809c89..., blob **1fa8b2d2**(Phase A 일치).
- test_replacement_pr_runner_2510.py: 로컬 0바이트 ↔ HEAD/origin = 493줄, sha256 57ebdc51..., blob **cb01bc6d**.
- HEAD==origin 동일하므로 `git reset --hard origin/main`이 정확히 정본 복원. 별도 `checkout HEAD -- <files>` 불필요(post-reset 검증으로 확인).

### [핵심 결정 4] Step 7 데몬 재발 방지 = skip-worktree(local) 채택 + gitignore/write-path 분리안 문서화
- 제약: ① main 직접 commit/push 금지(task) + 시스템 hook 차단 ② origin/main .gitignore에 데몬 키워드 없음(PR #160은 가드 7파일만 추가, gitignore 미포함).
- 따라서 `.gitignore`+`git rm --cached`를 reset 전에 하면 reset가 되돌리고, reset 후에 하면 **새 divergence**(staged D + .gitignore M)를 만들어 "ahead/behind 0 정합" 목표와 충돌.
- 채택: reset 후 데몬 tracked 파일에 `git update-index --skip-worktree` 적용 → local 전용(.git/index), commit 불필요, origin/main과 divergence 0, 데몬 재기록이 git status dirty로 재노출되지 않음 → "재발 방지" 즉시 달성. 가역적.
- 영구 해결(gitignore 추가 / 데몬 write 경로 repo 외부 분리)은 main PR 필요 → 본 no-push task 범위 밖. 보고서/manifest에 분리안 문서로 명시(차기 PR 권고).

### [핵심 결정 5] git clean 절대 금지 → untracked 828 보존
- untracked는 origin/main과 충돌 0(Phase A 실측, reset 전 재확인) → reset가 삭제하지 않음. git clean 금지로 828건 유지.

## 3 Step Why 자문 (G1 설계 검토)

- **1st Why (왜 preserve-then-align reset 설계가 필요한가?)**: A = local main이 origin/main에서 분기(ahead 6/behind 70) + dirty 895로 divergence_guard가 봇 dispatch를 HOLD → 정합 회복 없이는 파이프라인 차단 지속. truncate 2파일(0바이트) 정본 복원도 필요.
- **2nd Why (왜 reset이 최선의 접근인가? 대안 대비)**: B = 대안 옵션2(비파괴 merge)는 merge-tree 실측상 충돌 2건(task-2569.md add/add, finish-task.sh content) 수동 해결 필요 + ahead 6 및 merge commit이 main 이력에 영구 잔존(clutter) + ahead/behind 0 미달성. 옵션3(데몬분리 우선)은 코드변경(task-2700 연계)으로 범위 확대. reset은 merge 미수행이라 충돌 0 + ahead 6이 origin에 이미 보존되어 손실 0 + ahead/behind 0 정확 달성. preserve(branch+patch) 선행으로 추적수정/staged 손실도 0.
- **3rd Why (왜 reset이 다른 대안보다 나은가?)**: C = ahead 6 commit이 origin 원격 refs에서 reachable(실측 확인)하므로 reset의 유일 위험인 "ahead 손실"이 실체가 없음. 동시에 truncate 2파일 HEAD==origin 정본이 동일(blob 1fa8b2d2/cb01bc6d)하여 reset이 정확히 정본 복원. merge/옵션3는 clutter/범위확대를 유발하나 reset은 목표(ahead/behind 0 + 가드 clean + 정본 복원)를 손실 0으로 정확 달성.
- **A-B-C 일관성 검토**: 정합필요(A) → reset이 충돌0·손실0으로 최선(B) → ahead reachable 실측이 reset의 유일 위험을 무효화(C). 논리적으로 일관 → 설계 채택.

## Codex 사전 검증 (G1) 결과 + 리스크 대응

- **판정: PASS** (`pass=true`, critical 0건, source=codex_companion, PII 마스킹 6건). 결과 파일: `memory/events/task-2701+1.codex-gate`.
- Codex가 제기한 high 2 / medium 2를 실행에 반영(adversarial 강화):
  - **[high-1] Step 7 reset 중 데몬 재오염 위험** → 대응: reset 전 데몬 활성 프로세스 확인, reset 직후 즉시 재측정으로 안정화 확인. skip-worktree는 reset 후 적용(보조책). (note의 "데몬 일시정지 후 정합" 옵션과 병행)
  - **[high-2] 보존 patch 단일 불완전** → 대응: 보존을 **3종**으로 구성 — ① tracked diff patch(`git diff HEAD` + `git diff --cached`) ② 콘텐츠/소스 at-risk 파일 실제 복사 archive ③ manifest(파일목록·크기·full sha256·시각·복원절차). untracked는 reset가 보존하므로 manifest 등록(목록+sha256)으로 충분(git clean 금지).
  - **[medium-3] untracked 경로 충돌 미검사** → 대응: reset 전 `untracked 경로 ∩ origin/main ls-tree 경로` 교집합 명시 검사(0건 재확인).
  - **[medium-4] sha256 축약/식별자 모호** → 대응: manifest에 **full 64자리 sha256** 기록, 보존 branch명 고정 `task-2701-local-main-preserve`. (Codex가 본 "ta[APIKEY-REDACTED]"는 sanitize 게이트의 branch명 오마스킹 — 실제 문서는 일관 표기)

## 참조 자료
- task 지시서: `memory/tasks/task-2701+1.md`
- Phase A 보고: `memory/reports/task-2701.md` + `memory/events/task-2701.phase-a-analysis.json`
- 회장 회수 마커: `memory/events/task-2701-phase-a-result-recovered-260528.json`
- 보존 산출물: `memory/backups/task-2701-*`

## 주의사항
- ★ 보존(branch + patch + manifest) 완료 전 reset 절대 금지.
- ★ git clean 금지(untracked 828 보존). dirty 일괄 stash 금지(patch archive로 보존).
- ★ main push 금지. PR #158/#159/#160 / task-2700 / task-2700+1 브랜치 미접촉.
- ★ manual .done 금지(finish-task.sh만이 완료 경로). G4 marker 미삭제.
- 데몬 충돌: reset 시점 데몬 재기록 충돌 가능 → skip-worktree 적용 + 재측정으로 안정화 확인.
