# task-2729 Phase 2 — PR convergence pipeline 자동화 (결함4·5·6·7) 완료 보고

> 팀: dev6-team · 팀장: 페룬(Perun) · 작성: 2026-06-04 · 브랜치: `task/task-2729-phase2-dev6` (base: Phase1 `task/task-2729-progress-watcher-gate-dev6`)
> 검증 레벨: normal · 게이트: Lv.2 (G1/G2/G3) · merge_policy: **none** (merge 별도 회장 approval) · 상태: **MERGE_APPROVAL_CANDIDATE**

---

## S (Situation)
Phase 1(progress watcher dispatch gate) PASS 후 회장 인가(2026-06-03)로 재확인 없이 Phase 2 연속 진행. PR convergence pipeline 결함 4·5·6·7 결선. 원칙: **"code exists" ≠ "automation works"** — IMPLEMENTED/VERIFIED/WIRED/ACTIVE 분리, **전 축 ACTIVE=false**, production 전환 별도 승인.

## C (Complication)
- expected_files 5개 lock. `utils/merge_queue_executor.py` forbidden(수정 금지) → base-sync는 **호출만**.
- finish-task가 shared main 누적 dirty(EXTERNAL_DIRTY)로 .done/callback 차단 가능 → 결함4가 다루는 시나리오.
- ANU key raw 0, /home/jay raw 0, admin override/force/rebase 금지.

## Q (Question)
5개 파일(+matrix) 범위 안에서 4개 결함을 ACTIVE=false 골격으로 결선하며 회귀 무손상·credential 0·forbidden 0을 만족할 수 있는가?

## A (Answer)
audit-report-first 후 팀원 위임(스바로그 백엔드 / 벨레스 테스터)으로 4축 전부 결선. **완료 조건 7개 전부 충족**. 머지는 회장 승인 대기.

---

## 구현 상세 (결함별)

### 결함7 — live_prune_not_wired
- `utils/completion_callback_fallback_cancel.py`: `summarize_live_prune(outcomes) -> {real_tombstone, pruned_count, causes}` (PruneCause enum 보존).
- `utils/normal_completion_callback_collector_entrypoint.py`: `collect_and_prune`에 `require_success` + **success-transaction gating**. collector success일 때만 registry pending fallback을 injectable remover로 real tombstone. 비-success → `live_prune.fired=False, reason=NO_SUCCESS_SIGNAL`. 기존 반환 키 하위호환(추가만).

### 결함6 — OWNER_GEMINI_TRIGGER_NOT_WIRED
- `utils/owner_gemini_trigger.py` (신규): `OWNER_GEMINI_REVIEW_BODY="/gemini review"` hardcoded body, `_validate_head_lock`(40-hex), dedupe(head-lock+nudge limit), `_audit_append`(jsonl), `fire_owner_gemini_review(...)` request-only. OWNER PAT는 **hash prefix만**(raw 금지). thread resolve/판단대행/merge 실행 안 함.
- `scripts/ci_watch_handoff_runner.py`: `maybe_fire_owner_gemini_on_new_head(...)` 새 head request-only 자동발사(ACTIVE=false 골격, 실 gh 미호출).

### 결함5 — BASE_SYNC_REQUIRED_BEFORE_MERGE
- `scripts/ci_watch_handoff_runner.py`: `base_sync_before_merge(...)` — merge approval 후 BEHIND 시 `merge_queue_executor.sync_pr_base`(update-branch, admin 아님) **호출**→`fetch_merge_state` 재검증→판정. 중단 분기: conflict/diff초과/still-behind/admin·force 필요. merge_queue_executor **지연 import 호출만**(직접수정 0). 실 시그니처 어댑터 교정 포함.

### 결함4 — AUTHORITATIVE_COMPLETION_BY_SCOPE_EVIDENCE
- `scripts/ci_watch_handoff_runner.py`: `authoritative_completion_marker(...)` — EXTERNAL_DIRTY block 시 scope evidence(merge_base_clean+ci+local_fix_verified) 전부 충족 시에만 `AUTHORITATIVE_COMPLETION_BY_SCOPE_EVIDENCE`. **수동 .done 위조 0**(marker_writer 별도 dict, .done 직접생성 코드 없음). 결손 시 `EXTERNAL_DIRTY_BLOCK_UNRESOLVED`.

### capability matrix (4축, 전부 ACTIVE=false)
callback_fallback_prune(live_prune_success_gated_candidate)·owner_gemini_trigger(dedicated_entrypoint_candidate, dedicated_module=true)·base_sync_pipeline(신규)·authoritative_completion(신규).

---

## 생성/수정 파일 (effective diff = expected_files 5 + matrix)
- `utils/completion_callback_fallback_cancel.py` (+22)
- `utils/normal_completion_callback_collector_entrypoint.py` (+50)
- `utils/owner_gemini_trigger.py` (신규 +207)
- `scripts/ci_watch_handoff_runner.py` (+199)
- `tests/regression/test_pr_convergence_pipeline_2729.py` (신규 +620)
- `memory/state/automation_capability_matrix.json` (+88, allowed_resource)
- (지원) `memory/events/task-2729-p2.audit.json` — audit-report-first 산출물

## 테스트 결과
- 신규 회귀 `test_pr_convergence_pipeline_2729.py`: **19 passed / 0 failed** (결함7×3, 결함6×5, 결함5×7, 결함4×4).
- Phase1+기존 회귀 무손상: 통합 **62 passed / 0 failed**.
- goal_assertions: pytest PASS · owner_gemini '/gemini review'+dedupe present · ANU key raw 0.

## L1 스모크테스트 결과 (필수 기록)
- **서버 재시작**: 해당없음 (시스템 자동화 모듈 — 서버/API 없음, ACTIVE=false 골격).
- **API 응답 확인**: 해당없음. 대신 **실동작 스모크 수행**:
  - runner CLI: `--dry-run`/`--once` → exit 0 (import-safe).
  - owner_gemini live: status=REQUEST_PREPARED, body='/gemini review', active=False, **audit jsonl 실파일 289 bytes 기록**, token raw 미유출(hash prefix만).
  - base_sync live: BEHIND→sync→revalidate CLEAN → `BASE_SYNCED_REVALIDATED`; conflict → `ABORT_CONFLICT`.
  - authoritative live: full evidence → `AUTHORITATIVE_COMPLETION_BY_SCOPE_EVIDENCE`, `manual_done_forgery=False`, **.done 위조 0건 확인**.
- **스크린샷**: 해당없음 (CLI/모듈, 프론트 없음).
- 결론: L1 실행 항목 다수 통과 (SKIP 없음).

## 게이트
- **G1 설계**: audit-report-first(`task-2729-p2.audit.json`) — affected_files 5개 lock, 타 팀 겹침 없음, merge_queue_executor call-only로 6파일 초과(CHAIR_REQUIRED) 회피.
- **G2 구현**: 테스터(벨레스) 회귀 19 + 통합 62 PASS, 기능 테스트 충족.
- **G3 머지**: merge_policy=none. **머지 미수행** — 회장 승인 대기.

## 머지 판단
- **머지 필요**: 회장 승인 시 Yes (현재 **보류**)
- **브랜치**: `task/task-2729-phase2-dev6` (base `task/task-2729-progress-watcher-gate-dev6`)
- **워크트리**: `/home/jay/workspace/.worktrees/task-2729-p2-dev6`
- **머지 의견**: Phase1+2 통합. Phase1 PR #173(OPEN)과 통합 순서는 회장 판단. 회귀 무손상·forbidden 0·credential 0·ACTIVE=false. 충돌 가능성 낮음(시스템 utils/scripts 신규·추가 중심).

## 발견 이슈 및 해결
- `base_sync_before_merge` 기본 경로가 실 `sync_pr_base` 시그니처와 불일치 → 2-인자 어댑터로 교정(mock contract 유지).
- finish-task EXTERNAL_DIRTY(shared main 누적 dirty) → 결함4가 권위 scope evidence로 해소(수동 .done 위조 아님).

## 모델 사용 기록
- 스바로그(백엔드): **sonnet** — 4축 구현 + 어댑터 교정.
- 벨레스(테스터): **sonnet** — 회귀 19 케이스.
- 팀장 페룬(Opus): audit 종합·설계·통합 검증만(직접 코딩 없음).

## 회장 보고 트리거 (7 중 1)
- **merge 승인 필요**: MERGE_APPROVAL_CANDIDATE. Phase1+2 통합 PR/merge·production ACTIVE 전환은 회장 승인 대상.

## 비고
ANU key literal 0 · /home/jay raw 0 · forbidden(merge_queue_executor/finish-task.sh/critical_gap.py/terminal_state_callback.py/.github/deploy/systemd) 수정 0 · 4축 ACTIVE=false.

---
---

# ───── 이하 Phase 1 보고 (보존) ─────

# task-2729 Phase 1 — progress watcher dispatch gate 완료 보고 (MERGE_APPROVAL_CANDIDATE)

> 팀: dev6-team (페룬) | 작성: 2026-06-04 | 검증레벨: normal | 상태: MERGE_APPROVAL_CANDIDATE (merge 금지)

(Phase 1 round-1 AUTO_REPAIR + 원본 보고 + ANU 회수 검증 결과는 본 커밋 이전 이력으로 보존. 핵심: Phase1 4파일 + 회귀 19/19 + 기존 callback 30/30 PASS, PR #173 생성, ACTIVE=false, EXTERNAL_DIRTY blocker는 ANU stash 격리로 해소, `finish-task.sh task-2729 dev6`(PROJECT_PATH 미지정) → task-2729.done 생성, MERGE_APPROVAL_CANDIDATE 유지.)

## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회

