# PR #152 CONFLICT DECOMPOSITION PACKET (★ read-only · 회장 verbatim 옵션 3 · 2026-05-27)

- 작성: 2026-05-27T12:00 KST · ANU 본 chair-facing session
- 모드: **read-only** (★ conflict resolve / rebase / merge / commit / push 모두 금지)
- 전제: PR #152 = CONFLICTING (PR #155 a2a20f94 merge 후)
- 완료 상태: `PR152_CONFLICT_DECOMPOSITION_PACKET_READY`

## 0. baseline

- origin/main: `a2a20f94` (★ PR #155 merge)
- PR #152 head: `bd3f7ee` / base: `319170b9` (stale) / merge-base: 319170b9
- mergeStateStatus: DIRTY / mergeable: CONFLICTING
- 충돌 3파일: helper / schema / finish-task.sh

## 1. PR #155 가 이미 main 반영한 callback registration enforcement 범위 (★ 13파일/1753줄)

- `utils/normal_callback_registration_validator.py` +482 (신규 · 4-source validator)
- `utils/callback_registration_marker.py` +198 (신규 · NOT_REGISTERED marker)
- `dispatch/normal_fallback_callback_helper.py` +149 (★ `EnforceResult` class + `assert_normal_callback_actually_registered`)
- `schemas/anu_normal_callback_envelope_v1.json` +93 (★ schedule_id/schedule_type/cron_id 계열 + chair_facing_sid 단수)
- `scripts/finish-task.sh` +60 (★ L981-1047 callback enforce 단계 + helper enforce 호출 + .done 차단)
- tests/regression/finish_task_callback_fail_closed/* (3) + normal_callback_registration_enforcement/* (4)

## 2. PR #152 가 추가 제공하는 session propagation 고유 가치 (★ PR #155 에 전혀 없음)

- `dispatch/__init__.py` +10 (★ callback registrar 결선)
- `dispatch/prompt.py` +50 (★ `--session` argv 결선 · session propagation 핵심)
- `dispatch/normal_fallback_callback_helper.py` 의 session 함수:
  - `is_valid_session_id` (★ session 검증)
  - `resolve_chair_facing_sid` (★ chair-facing SID 해소)
  - `SessionPropagationVerdict` class
  - `classify_session_propagation` (★ session 분류)
- `tests/regression/callback_session_propagation/*` (5 files · ★ session propagation 핵심 regression)
- schema `callback_resume_required` + 3 SID (chair_facing/collector/delivery)

## 3. 충돌 3파일별 중복/고유/위험 라인 분리

### 충돌1 — dispatch/normal_fallback_callback_helper.py
- **PR #155 추가 함수** (main): `EnforceResult`, `assert_normal_callback_actually_registered` (★ registration enforce)
- **PR #152 추가 함수**: `is_valid_session_id`, `resolve_chair_facing_sid`, `SessionPropagationVerdict`, `classify_session_propagation` (★ session propagation)
- ★ **기능 직교** (다른 함수 추가 · 중복 아님) / 단 같은 파일 line 위치 겹침 → **텍스트 충돌만**
- **위험 라인**: build_anu_owned_callback_request 수정부 (★ PR #152 와 PR #155 둘 다 동일 함수 인접 수정 가능)

### 충돌2 — schemas/anu_normal_callback_envelope_v1.json
- **PR #155 properties** (main): schema/schedule_id/schedule_type/emitted_at/inbound_evidence/collector_receipt/envelope_sha256/executor_key/cron_id_* + chair_facing_sid(단수)
- **PR #152 properties**: result_path/report_path/sha256/collector_role/callback_kind/source_attribution/canonical_root/at + 3 SID(chair_facing_session_id/collector_session_id/delivery_session_id) + callback_resume_required
- ★ **다른 필드 집합** (상호보완) / 단 동일 JSON 객체 → 통합 필요
- **위험**: PR #152 의 chair_facing_sid 단수 vs 3 SID 명명 불일치 (★ PR #155 = chair_facing_sid / PR #152 = chair_facing_session_id)

### 충돌3 — scripts/finish-task.sh
- **PR #155 변경 영역** (main): L981-1047 (★ callback enforce 단계)
- **PR #152 변경 영역**: L1361-1382 (★ notify-completion + collector_role=ANU)
- ★ **다른 라인 영역** (★ PR #155 L981 / PR #152 L1361) → 텍스트 충돌 적을 수 있음 (★ git 인접 판정 가능)

## 4. PR #152 unresolved 1건 PR #155 반영 후 유효성

- unresolved thread: dispatch/normal_fallback_callback_helper.py (outdated=False)
- ★ PR #155 가 helper 를 main 에 반영 → PR #152 의 helper 변경은 fresh base 위에서 재평가 필요 → **현 unresolved thread 는 stale base 기준이라 fresh PR 시 무효화** (★ 재작성 시 새 thread)

## 5. conflict resolve vs fresh PR 판단

- conflict resolve (merge main into branch): helper 1061줄 vs 963줄 수동 병합 + schema 통합 + ★ **callback registration enforcement(PR #155) 덮어쓸 위험** (항목 10)
- fresh PR: origin/main(a2a20f94 · PR #155 반영) 기준 session propagation 고유분만 재적용 → enforce 코드 보존 + 충돌 0
- ★ **fresh PR 이 안전** (★ PR #153 scope leak 사고 회피 + enforce 보호)

## 6. PR #152 고유분 fresh branch 재작성 가능성

- 고유분 = dispatch/__init__.py(+10) + dispatch/prompt.py(+50) + helper session 함수(4개) + callback_session_propagation tests(5) + schema 3 SID/callback_resume_required
- ★ origin/main(PR #155 반영) 위에 재적용 가능 (★ PR #155 의 helper enforce 함수와 직교 → 같은 helper 에 session 함수 추가)
- 단 schema 통합 필요 (★ PR #155 chair_facing_sid 단수 ↔ PR #152 3 SID)

## 7. expected_files 재정의 필요 여부

- ★ **필요**: fresh PR 시 expected_files = dispatch/__init__.py + dispatch/prompt.py + helper(session 함수만) + schema(3 SID 추가) + callback_session_propagation tests
- 제외: utils/callback_authority_4source_validator.py (★ 항목 9 참조 · PR #155 registration_validator 와 중복 검토)

## 8. forbidden_paths 유지 여부

- ★ 유지 + 강화: dispatch.py 전역 / settings.json / hooks / Axis / PR #154·151·149 혼합 / **PR #155 가 main 반영한 enforce 코드 영역(validator/marker/finish-task.sh L981-1047) 변경 금지** (★ enforce 보호)

## 9. regression 재사용 가능 여부

- callback_session_propagation tests (5) = ★ 재사용 가능 (★ 고유 · PR #155 무관)
- callback_4source_validator + callback_envelope_actual_cron_crosscheck + callback_owner_enforcement tests = ★ **PR #155 의 normal_callback_registration_enforcement/validator_4_source 와 기능 중복 검토 필요** (★ 중복 시 폐기)

## 10. callback registration enforcement 덮어쓸 위험 여부

- ★ **conflict resolve 시 위험 있음**: PR #152 의 옛 helper(1061줄)/schema/finish-task.sh 가 PR #155 의 enforce 코드(EnforceResult/assert_normal_callback_actually_registered/L981-1047)를 덮을 수 있음
- ★ **fresh PR 시 위험 0**: origin/main(enforce 반영) 위에 session 함수만 추가 → enforce 보존

## ★ 권장 결론 enum

### `PR152_FRESH_PR_REEXTRACT_RECOMMENDED`

**근거**:
1. PR #152 helper 변경 = session propagation 함수 (★ PR #155 enforce 함수와 기능 직교 / 텍스트만 충돌)
2. conflict resolve 는 enforce 코드 덮어쓸 위험 + helper 수동 병합 복잡 (★ PR #153 scope leak 위험)
3. fresh PR (origin/main a2a20f94 기준) 재작성 = enforce 보존 + 충돌 0 + 깨끗한 base
4. PR #152 고유 가치(session propagation: dispatch/__init__.py + prompt.py --session + helper session 함수 + session_propagation tests + schema 3 SID)는 명확히 추출 가능
5. PR #152 의 4source_validator + 일부 regression 은 PR #155 와 중복 검토 후 폐기/재사용 판단

## 다음 작업안 (★ 회장 verbatim 결정 대기)

1. **PR #152 fresh re-extract task 발의** — origin/main(a2a20f94) 기준 fresh worktree + session propagation 고유분만 재적용 (★ executor + chair_authorization_id 필요 · self-key fail-open runtime 검증 동반 관찰)
2. **PR #152 close + preserve** — fresh PR 로 대체 시 PR #152 는 preserve marker 후 close (★ 회장 결정)
3. PR #152 의 4source_validator vs PR #155 registration_validator 중복 정밀 비교 (★ fresh PR 범위 확정)

## forbidden_action_count

**0** (★ read-only decomposition only · conflict resolve/rebase/merge/commit/push/PR 생성 0)

끝
