# Branch / Worktree Isolation Incident Analysis (260508)

- **task**: task-2498 (internal_doc / Lv.1 audit)
- **작성**: dev5-team (마르두크) — 분석 자료 수집: 닌기르수
- **작성일**: 2026-05-08
- **본질**: 최근 병렬 작업에서 발생한 merge conflict, branch/worktree isolation 사고를 사례 기반으로 정리한 감사 문서
- **승인 모드**: 회장 한정승인 (X팀 한정승인 — dev5 팀장 자체 G1/G2/G3 통과)

## 0. Scope / Constraints (회장 명시)

| 항목 | 값 |
|---|---|
| 코드 변경 | 0건 |
| 테스트 변경 | 0건 |
| PR 변경 | 0건 |
| branch 변경 | 0건 |
| 오딘 task-2487+1 | 비개입 |
| 다른 봇 worktree 정리 | 금지 |
| 산출물 | 본 문서 단일 |
| 후속 작업 제안 | 가능, 실행은 금지 |

본 문서는 **observation + 분류만** 수행한다. 실행 가능한 hardening 항목은 §6에서 제안만 한다 (실행 금지 의무).

---

## 1. 사례 인덱스

본 분석은 `memory/events/` + `memory/reports/` + `memory/feedback/` + `memory/orchestration/` 의 read-only 자료를 근거로 한다.

| task | 사고 1줄 요약 | 핵심 출처 |
|---|---|---|
| **task-2472+1** | PR #42가 workflow regex의 `task-N+M` 미인식으로 CI 2건 FAIL, 6시간 stale → MERGE_PENDING_DEPENDENCY | `events/task-2472+1.stop.txt`, `events/task-2472+1.merge-pending.conditions`, `events/task-2472+1.followup.txt`, `events/task-2472+1.merge-pending-rerun-evidence` |
| **task-2472+2** | `.github/workflows/{guard,ci}.yml` regex fix를 task-2472+1이 무단 수정 → STOP 후 surface 복구 | `events/task-2472+2.followup.txt` |
| **task-2472** | dispatch.py 휴리스틱이 hardening spec 본문 단어를 디자인 작업으로 오분류 | `events/task-2472.followup.txt` |
| **task-2483** | PR #45 정상 merge 후 main workspace의 타 팀 잔여물로 post-merge close 차단 → MERGED_CLOSE_BLOCKED_EXTERNAL | `events/task-2483.close-blocked-external`, `reports/task-2483.md` |
| **task-2485+1** | `browser_verify.py`가 `+` suffix 미지원 → task_id 자체를 거부, 3회 ESCALATE → ESCALATED_VERIFIER_LIMITATION | `events/task-2485+1.essence-pass-escalated-verifier-limitation`, `events/task-2485+1.g3-fail`, `reports/task-2485+1.md` |
| **task-2487** | Gemini 미해결 review thread 17건(dot-phase 회귀)으로 PR #49/#50/#51 BLOCKED → REVIEW_OR_APPROVAL_PENDING_WITH_REGRESSION | `events/task-2487.review-or-approval-pending` |
| **task-2488** | 다른 봇이 동일 branch(`task/task-2479-dev1`)에 commit 누적 → scope-guard 오탐, worktree 격리 미작동 | `events/task-2488.essence-pass-poc-isolated`, `events/task-2488.scope-violation.json`, `reports/task-2488.md` |

---

## 2. 충돌 패턴 식별 (회장 명시 10건 매핑)

### 패턴 1 — 병렬 작업 충돌 발생 패턴

task-2472+1과 task-2472+2가 동시 진행되는 동안 task-2472+1이 STOP 명령 수신 이전에 `.github/workflows/guard.yml` / `ci.yml`을 수정(commit `05d9ea17`)했다. 이는 task-2472+2의 P0 surface와 직접 overlap.

> 출처 `events/task-2472+1.stop.txt`:
> "commit 05d9ea17 ... .github/workflows/** 수정 → task-2479의 P0 surface와 직접 overlap / task-2472+1 allowed_resources에 .github/workflows/** 미선언"

### 패턴 2 — 같은 파일 수정 충돌

(A) task-2472+1이 `allowed_resources` 범위 외 `.github/workflows/guard.yml`, `ci.yml`을 수정해 task-2472+2와 파일 레벨 충돌.

(B) task-2487 PR #51의 `dashboard/helpers.py` / `report_parser.py`가 dot-phase task-N.M 호환 회귀를 유발하며 PR #50과 중복 경로 DRY 위반 발생.

> 출처 `events/task-2487.review-or-approval-pending`:
> "pr_51_group_c_dashboard_report.high_priority_findings: task-9.1 dot-phase 회귀 (dashboard/helpers.py) / V2 regex 패턴 중복 (DRY 위반)"

### 패턴 3 — 같은 테스트 경로 수정 충돌

task-2487 PR #49 Group A에서 "테스트 로컬 regex (production utils 미사용)" 발견. production `utils/task_id_parser.py` SSOT를 쓰지 않고 테스트 파일에 자체 regex를 복사해, task-2485+1 산출물(SSOT 도입)과 테스트 경로 계약이 충돌.

> 출처 `events/task-2487.review-or-approval-pending`:
> "pr_49_group_a_dispatch.high_priority_findings: 테스트 로컬 regex (production utils 미사용)"

### 패턴 4 — PR 순서 의존성

task-2487 PR #49/#50/#51 머지는 PR #47(task-2485 utils/task_id_parser.py SSOT) 선결을 명시적으로 요구.

> 출처 `events/task-2487.review-or-approval-pending`:
> "merge_order_recommendation.logical_dependency: PR #47 (task-2485) utils/task_id_parser.py 머지 선결 필요 / recommended_order_after_regression_fix: 1. PR #47 task-2485 ..."

### 패턴 5 — critical chain 중복 투입 문제

critical chain `task-2472+1 → task-2472+2 → task-2485+1 → task-2487+1`에서 task-2472+1 봇이 타 task 영역(`.github/workflows/**`)에 중복 투입. STOP으로 수습됐으나 stale 4시간+.

> 출처 `events/task-2472+1.stop.txt`:
> "이 명령 처리 후 finish-task 재호출. / task-2485+1 essential action: active_critical_chain 단독 명시"

### 패턴 6 — worktree dirty 상태 문제 (두 형태)

**형태 A — main repo dirty**: task-2483 post-merge close 단계에서 `git_evidence`가 `4 unstaged + 9 staged` 잔여물 탐지. 본 task의 worktree가 아닌 main workspace의 dirty 상태(dev1 task-2479 영역 / systemd 운영 복사본 / 시스템 활동 파일).

> 출처 `events/task-2483.close-blocked-external`:
> "fail_detail: 4 unstaged + 9 staged in main workspace (외부 영역 잔여물) / external_owners: dev1 task-2479 영역 산출물, systemd 운영 복사본, 메인 workspace 시스템 활동 파일"

**형태 B — 동일 branch에 복수 봇 commit 누적**: task-2488에서 `task/task-2479-dev1` 브랜치에 task-2479/2489/2493 변경이 섞여 들어와 `task-scope-guard`가 타 task 파일을 위반으로 오탐.

> 출처 `reports/task-2488.md`:
> "Worktree 격리 미작동: 다른 봇이 같은 브랜치(task/task-2479-dev1)에 commit 누적 ... task-scope-guard main..HEAD 검증 시 다른 task의 production 파일이 위반으로 잡힘"

### 패턴 7 — branch naming / task_id mapping 문제

(A) workflow regex `task-[0-9]+`가 `task-2472+1`을 `task-2472`로 잘라 인식 → `taskctl-state-guard`가 task-2472 기준으로 검증해 `utils/g3_fail_classifier.py`를 scope 외 파일로 오판.

> 출처 `events/task-2472+1.merge-pending-rerun-evidence`:
> "task_id_recognized_correctly: task-2472+1 (workflow regex fix 효과 확인됨) / but_b3_failed_anyway: true / root_cause_hypothesis: ... B-3 검증 로직이 다른 capability를 로드하거나 path 매칭 버그"

(B) `browser_verify.py`도 자체 regex `r'^task-\d[\w.\-]*$'`로 `+` suffix 미지원 → task-2485+1 task_id 거부.

> 출처 `events/task-2485+1.essence-pass-escalated-verifier-limitation`:
> "failure_pattern: TASK_ID_PATTERN regex가 + suffix 미지원으로 task_id 거부 / verifier_path: teams/dev1/qc/verifiers/browser_verify.py:11 / regex_current: r'^task-\\d[\\w.\\-]*$'"

### 패턴 8 — merge chain 선행 조건

task-2472+1 merge 선행 6항목: (1) task-2472+2 DONE → (2) PR #42 CI rerun → (3) taskctl-state-guard 2건 PASS → (4) PR #42 MERGED → (5) post-merge lifecycle close → (6) `.done` 발행. 하나라도 미충족 시 `.done` 발행 회장 명시 금지.

> 출처 `events/task-2472+1.merge-pending.conditions`:
> "1. task-2472+2 MERGED/DONE ... 2. PR #42 CI rerun ... 위 조건 미충족 상태에서 .done 발행 ❌"

### 패턴 9 — 안전 병행 가능 / 불가능 작업 기준

**불가능**: `.github/workflows/**` 수정(P0 surface 단일 소유), 동일 SSOT 파일을 참조하는 PR 동시 rebase, 동일 branch에 복수 봇 push.

**가능**: PoC 격리 경로(`tools/poc/**`, `memory/poc/**`) 작업, 신규 파일 추가 전용 작업, lifecycle 처리 전용(코드 변경 0건) 작업.

> 출처 `events/task-2488.essence-pass-poc-isolated`:
> "production_integration_status.approved: false / rule: production 통합 전 검증 자료로만 사용 / production 0 변경, 외부 AI 호출 0, 실제 lifecycle 파일 생성 0, pytest 12 PASS"

### 패턴 10 — 향후 isolation hardening 후보

phase_b_integration_items §8.3 + §9.4 명시.

> 출처 `memory/orchestration/phase_b_integration_items_260507.md`:
> "§8.3: worktree/branch isolation 미작동 — 병렬 task 간 격리 깨짐, surface 침범 위험 → task-N (별도 hardening)"
> "§9.4: branch/worktree isolation hardening (8.3에 이미 등록됨, 우선순위 ↑) / allowed_resources glob 미스매치 사전 감지 — lint 또는 자동 생성 로직"

---

## 3. 금지해야 할 병렬 유형 (FORBIDDEN)

### F-1. P0 surface(`.github/workflows/**`)를 공유하는 병렬 작업

근거: task-2472+1 STOP 사례 (`.github/workflows/** 수정 → task-2479의 P0 surface와 직접 overlap`). P0 surface는 한 번에 하나의 task만 소유해야 한다.

### F-2. critical chain 내 의존 관계가 있는 SSOT 파일 동시 수정

근거: task-2487 PR 머지 순서 제약 (`PR #47 utils/task_id_parser.py 머지 선결 필요`). SSOT가 main 반영 전에 의존 PR이 같은 파일 계층을 수정하면 stale base 충돌이 발생한다.

### F-3. 동일 worktree branch에 복수 봇이 commit 누적

근거: task-2488 (`다른 봇이 같은 브랜치(task/task-2479-dev1)에 commit 누적 ... main..HEAD diff가 다른 task 변경을 포함`). branch가 task_id에 1:1 매핑되지 않으면 scope 검증 전체가 신뢰 불가.

### F-4. SSOT 미반영 상태에서 동일 테스트/verifier 수정

근거: task-2487 PR #49 (`테스트 로컬 regex (production utils 미사용)`). SSOT 적용 여부에 따라 테스트 통과 기준이 달라지므로, SSOT 반영 task가 merge되기 전에 같은 테스트/verifier 경로를 수정하는 병렬 작업을 허용해서는 안 된다.

### F-5. main workspace 공유 상태에서 복수 task의 post-merge close 동시 진행

근거: task-2483 (`git_evidence: NO_UNCOMMITTED / external_owners: dev1 task-2479 영역 산출물, systemd 운영 복사본, 메인 workspace 시스템 활동 파일`). 복수 팀 공유 환경에서 post-merge QC가 전체 workspace dirty를 검사하면 무관한 task가 블로킹된다.

---

## 4. 허용 가능한 병렬 유형 (PERMITTED)

### A-1. 격리 경로(`tools/poc/**`, `memory/poc/**`) 내 PoC 작업

근거: task-2488 (`production 0 변경, 외부 AI 호출 0, 실제 lifecycle 파일 생성 0, pytest 12 PASS`). production 경로 0 변경을 보장하는 PoC는 병렬 진행 가능.

### A-2. 신규 파일만 추가하는 독립 스크립트/테스트 작업

근거: task-2483 (`scripts/refresh_bot_token.py`(신규) + 회귀 테스트(신규) + systemd unit 수정(외부 파일) / 기존 코드 수정 0건 / 충돌 가능성 0). 기존 코드 미변경 시 file 수준 충돌 구조적 불가.

### A-3. lifecycle 처리 전용 작업 (코드 변경 0건)

근거: task-2485+1 (`Lv.2 (lifecycle, 코드 변경 0건) / 수정/생성 파일: 0건`). PR rebase, Gemini fresh evidence, review thread resolve만 수행하는 순수 lifecycle 작업.

### A-4. critical chain 선행 task 완료 후 downstream 그룹 병렬 진행

근거: task-2487 (`file_collision: none / independent_merge_possible_post_fix: true`). 선행 SSOT가 main에 반영된 뒤에는 file collision이 없는 하위 그룹을 병렬로 진행 가능.

### A-5. memory/events, memory/reports, memory/orchestration 메타 파일 전용 작업

근거: 본 task-2498 자체. 감사·보고서·이벤트 마커 파일 작업은 production 코드에 접근하지 않으므로 복수 팀 동시 진행해도 merge conflict 불가.

---

## 5. 후속 isolation hardening 후보 (제안만, 실행 금지)

phase_b_integration_items_260507.md §8.3 / §9.4 + 본 분석에서 도출된 항목. **본 task의 권한 범위 외이므로 별도 task로 발행 권장.**

### H-1. worktree / branch isolation hardening (§8.3 #1, §9.4 #1, 우선순위 상향)

dispatch.py가 worktree 생성 시 브랜치 이름에 task_id를 고유하게 포함시키고, 다른 봇이 동일 브랜치에 push하지 못하도록 branch protection 또는 lock 메커니즘 도입.

근거: task-2488 scope-guard 오탐 사례.

### H-2. allowed_resources glob 미스매치 사전 감지 lint / 자동 생성 (§8.3 #2)

task 발행 시점에 명세의 산출물 목록과 `allowed_resources.paths` 글롭을 자동 비교해 불일치를 사전 차단.

근거: task-2488 (`tools/poc/__init__.py`, `.json` fixtures, `cycle_advancer_dry_run.py`가 paths 글롭 누락).

### H-3. task_id parser/verifier 계층 자기참조 regex 제거 + SSOT 단일화 (§9.4 #6, #7)

`utils/task_id_parser.py`의 SSOT pattern을 모든 verifier(`teams/*/qc/verifiers/*`)와 workflow(`.github/workflows/*`)가 import/공유하도록 전수 교체.

근거: `browser_verify.py:11`(`r'^task-\d[\w.\-]*$'`) + workflow `task-[0-9]+` 양쪽이 독립 regex로 task-N+M 미지원 결함을 별도 발현.

### H-4. git_evidence 검사의 main workspace / worktree 분리

`finish-task.sh`의 `git_evidence` 검사 범위를 해당 task의 worktree로 제한.

근거: task-2483, task-2472+2 양쪽에서 main workspace 타 팀 dirty 상태가 본 task scope로 오인된 사례 (`feedback_merged_close_blocked_external_classification_260507.md` §9).

### H-5. task-timer.py `--reason` 옵션 추가 + 분류별 마커 발행 (§7.1 1단계, §2.2)

PENDING 계열(MERGE_PENDING_DEPENDENCY 등)에서 `.done` 자동 생성을 차단하기 위해 `task-timer.py end --reason` 옵션 도입. `--reason merge_pending_dependency` 시 `.merge-pending` 발행 / `.done` skip.

근거: task-2472+1에서 `.done` 자동 생성 사고 → 회장이 즉시 제거 명시.

### H-6. auto-merge.yml main 부재 복구 및 audit (§9.4 #4)

`.github/workflows/auto-merge.yml`이 main에 없어 PR #49/#50/#51에 auto-approve 0회. 마지막 실행 2026-05-04 PR #17. green path가 시스템 차원에서 끊긴 결함 복구 필요.

근거: `events/task-2487.review-or-approval-pending` (`root_cause: main 브랜치에서 auto-merge.yml 파일 부재`).

### H-7. lifecycle classifier dispatch 자동 분류 통합 (§2.1, §7.1 2단계)

`MERGE_PENDING_DEPENDENCY` / `MERGED_CLOSE_BLOCKED_EXTERNAL` / `ESCALATED_VERIFIER_LIMITATION` 신규 분류를 dispatch.py가 PR 상태 + CI rollup + followup.txt 입력으로 자동 결정.

근거: task-2472+1 / task-2483 / task-2488 모두 retry_count 초과 후 ESCALATED 분기로 잘못 빠지거나 stale 장기화.

---

## 6. 결론 — 회장 명시 5항목 응답

| # | 항목 | 응답 |
|---|---|---|
| 1 | 문서 경로 | `/home/jay/workspace/memory/orchestration/incident-analysis/branch-worktree-isolation.md` |
| 2 | 식별한 충돌 패턴 | §2 — 10개 패턴 (P0 surface overlap, 같은 파일 수정, 테스트 경로 충돌, PR 순서 의존, critical chain 중복 투입, worktree dirty 2형태, branch naming/task_id mapping, merge chain 선행 6조건, 안전/불가 병행 기준, hardening 후보) |
| 3 | 금지해야 할 병렬 유형 | §3 — F-1 ~ F-5 (P0 surface 공유 / SSOT 동시 수정 / 동일 branch 복수 봇 commit / 미반영 SSOT 상태 테스트·verifier 수정 / 공유 main workspace post-merge close) |
| 4 | 허용 가능한 병렬 유형 | §4 — A-1 ~ A-5 (격리 PoC / 신규 파일 / lifecycle 전용 / 선행 완료 후 downstream / 메타 파일 전용) |
| 5 | 후속 hardening 후보 | §5 — H-1 ~ H-7 (worktree branch isolation / allowed_resources lint / verifier regex SSOT 단일화 / git_evidence 범위 제한 / task-timer reason / auto-merge.yml 복구 / lifecycle classifier 통합) |

---

## 부록 A — 참조 출처 인덱스

### Events
- `memory/events/task-2472.followup.txt`
- `memory/events/task-2472+1.stop.txt`
- `memory/events/task-2472+1.merge-pending.conditions`
- `memory/events/task-2472+1.merge-pending-rerun-evidence`
- `memory/events/task-2472+1.followup.txt`
- `memory/events/task-2472+2.followup.txt`
- `memory/events/task-2483.close-blocked-external`
- `memory/events/task-2483.followup.txt`
- `memory/events/task-2485+1.essence-pass-escalated-verifier-limitation`
- `memory/events/task-2485+1.g3-fail`
- `memory/events/task-2487.review-or-approval-pending`
- `memory/events/task-2488.essence-pass-poc-isolated`
- `memory/events/task-2488.scope-violation.json`

### Reports
- `memory/reports/task-2483.md`
- `memory/reports/task-2485+1.md`
- `memory/reports/task-2488.md`

### Feedback
- `memory/feedback/feedback_escalated_verifier_limitation_classification_260508.md`
- `memory/feedback/feedback_merged_close_blocked_external_classification_260507.md`
- `memory/feedback/feedback_merge_pending_dependency_classification_260507.md`

### Orchestration
- `memory/orchestration/phase_b_integration_items_260507.md` (§8.3, §9.4 우선순위)

---

*문서 끝. 본 문서는 read-only 감사 산출물이며 실행 권한이 없는 제안만 포함한다.*
