# Post-PR#259 Local Main Sync — Preflight (read-only, 실행 미승인)

상태명: `POST_PR259_LOCAL_MAIN_SYNC_PREFLIGHT_REQUESTED_ACTIVE_FALSE`
조사: ANU read-only (2026-06-29 KST). pull/reset/stash/discard/commit/gitignore 전부 **미실행**. 근거: 회장 단계판정(PR#259 수용 + sync preflight only).

## ★ 정정 (이전 "dirty 7개"는 착오)
이전 보고 "7개"는 grep이 deleted/untracked를 못 세서 나온 수치. **실제 = tracked M 7 + tracked D 44 + untracked 366.**

## 1. SHA / ff 가능성
- local main `b12a4226` / origin main `42c785f2` → **1 commit behind**, **ff-only 가능(YES)**: local은 origin 조상.
- pull될 커밋 = `42c785f2`(PR#259) 1개, 변경 **3파일만**(pre_push_terminal_guard.py 신규·test_pre_push_terminal_guard_2779.py 신규·terminal_artifact_index.py +2).
- **이 3파일은 현재 dirty 목록과 안 겹침 → ff pull 시 코드 충돌 0.** (단 dirty는 pull 후에도 그대로 남음 — sync가 dirty를 정리하진 않음.)

## 2. tracked M 7개 — 분류
- `config/constants.json` (8줄): dev2 봇 설정 실제 변경(dev2_Odin_bot→dev2_Odin_v2_bot, opus-4-6→sonnet-4-6, last_updated). → **NEEDS_CHAIR_DECISION** (CLAUDE.md "bot_settings 직접 변경 금지"와 연관 — 누가 바꿨는지/유지할지 회장 판단)
- `dashboard/data/skill-usage.jsonl` (+1 append): 런타임 사용 로그. → **KEEP_AS_RUNTIME / IGNORE_CANDIDATE**
- `memory/specs/anu-system-spec-changelog.md` (+18): update-system-spec cron 자동 생성("cron 데이터 변경" 6h마다). → **KEEP_AS_RUNTIME** (참고: [[project_update_system_spec_cron_anu_chat_unset]])
- `memory/specs/anu-system-spec.md` (+38): 위 cron 자동 갱신. → **KEEP_AS_RUNTIME**
- `memory/tasks/task-2.md` (2줄): 문서 소폭. → **COMMIT_CANDIDATE** (사소)
- `tests/regression/test_replacement_pr_runner_2510.py` (**0바이트 truncate**): → **DISCARD_CANDIDATE** (HEAD 복원)
- `utils/replacement_pr_runner.py` (**0바이트 truncate**): → **DISCARD_CANDIDATE** (HEAD 복원)

★ A6/A7 = 메모리 반복 기록된 **finish-task 훅 replacement_pr_runner 런타임 0바이트 truncate 재발**. `git checkout HEAD -- <2파일>`로 복원이 정답(로컬 변경 폐기). 이번 sync의 가장 명확한 정리 대상.

## 3. tracked D 44개 — 분류
`memory/events/task-2309~2395.done.acked/.notified/.escalated` 약 44개가 canonical에서 삭제 표기. **확인: 동일 파일이 `memory/events/archive/`에 존재**(archiver가 이동, archive에 task-23xx 57개). → **KEEP_AS_RUNTIME** (done-archiver 정상 동작). 단 tracked deletion이라 sync 전 commit 안 하면 계속 dirty로 남음 → **NEEDS_CHAIR_DECISION** (archive 이동을 git에 반영할지 / ignore할지).

## 4. untracked 366개 — 분류
거의 전부 `memory/` 하위 generated artifact: reports/ 117 · events/ 80 · tasks/ 62 · plans/ 43 · backups/ 35 · daily/ 10 등.
- 대부분 **IGNORE_CANDIDATE** (ANU/봇 산출물, git 비추적이 자연스러움).
- 단 **보존 필수(증거)**: `memory/events/terminal_artifact_index/task-2778_a.json`(P0c 증거) · `memory/reports/p0c_phase1_observed_260629.md` · `task2779a_*` 3종 · `terminal_callback_enforcement_contract_260629.md` → **KEEP / COMMIT_CANDIDATE**(증거 보존). **현재 전부 보존됨 ✓**(sync로 사라지지 않음 — untracked는 pull에 영향 없음).

## 5. 증거 보존 / worktree
- P0c·PR#259 closeout 증거 전부 untracked로 **보존 확인 ✓** (ff pull은 tracked만 건드림 → untracked 안전).
- task-2779_a worktree(`.worktrees/task-2779_a-dev2`, 73f02922)는 merge 완료분 — 별도 정리(worktree prune은 금지).

## 6. sync 없이 다음 작업 시 위험
- 다음 task worktree가 계속 구 main(`b12a4226`) 기준 생성 → origin/main(`42c785f2`)과 merge-base 어긋남 → 매 PR마다 BEHIND/rebase 필요(deviation 반복).
- A6/A7 0바이트 파일이 import되면 런타임 오류 가능(replacement_pr_runner 사용 경로).

## 7. 권장 sync 절차 (실행 미승인 — 회장 결정용)
1. A6/A7 truncate 2파일 → `git checkout HEAD -- <2파일>` 복원(DISCARD)
2. A1 config·D 44 archive·A3/A4 spec = 회장 결정(commit/ignore/keep)
3. dirty가 pull 3파일과 안 겹치므로 → `git pull --ff-only origin main` (또는 dirty stash 없이 직접 ff)
4. sync 후 local main == origin `42c785f2` 확인
※ 위 전부 **이번엔 미실행**. 회장 승인 시 단계별 진행.

## 분류 요약표
- KEEP_AS_RUNTIME: skill-usage.jsonl · spec(.md/changelog) · D44 done-archive
- COMMIT_CANDIDATE: task-2.md · 증거 reports(p0c/2779a/contract) · terminal_artifact_index/task-2778_a.json
- IGNORE_CANDIDATE: untracked memory/* 대부분(생성물)
- DISCARD_CANDIDATE: replacement_pr_runner.py · test_replacement_pr_runner_2510.py (0바이트 truncate)
- NEEDS_CHAIR_DECISION: config/constants.json(봇설정) · D44 git 반영 여부
