# task-2637 — real merge executor wiring 코드화 결과 (activation false default · 실제 merge 실행 0)

- 담당: dev6 페룬
- Level: Lv.3 (거버넌스 자동화 · 코드화)
- 단일소스 spec: `memory/specs/system_real_merge_executor_wiring_spec_260523.md`
  - sha256: `bcaf654e981a43083af50879164021c918eeac9753cad3b3ad146209a1a62765` ✅ 일치
- base: origin/main `88a1f2b0` (CALLBACK_GOVERNANCE_STACK_PRODUCTION_VERIFIED)
- 결과 commit: `ac82d47ee2857b5178e53da4c7c754ddd95f9c18` (로컬 한정 · push/PR/merge 0)
- 작업 worktree: `/home/jay/.cokacdir/workspace/8BEC0683/iso-2637-dev6`
- 시작/종료: 2026-05-23T02:50:08Z → 2026-05-23T03:09:03Z (UTC)

## 회장 10결정 verbatim 반영
1. activation 절차: env var + chair_authorization JSON 둘 다 필요 (`real_merge_hooks.real_merge_execute` Step 1/2)
2. signature 방식: verbatim token 1차 (`chair_authorization_validator` chair_signature 텍스트 매칭 · HMAC 후속 hardening 주석 표기)
3. gate_snapshot TTL: 5분 확정 (`GATE_SNAPSHOT_TTL_SECONDS = 300`)
4. post-merge smoke 실패 시 rollback: 자동 금지 · 보고 only (`post_smoke_fail_report_only` fixture + `chair_report_required=True`)
5. low-risk pilot target: 본 task 범위 외 (별도 회장 결정 task)
6. artifact 위치: `memory/events/real_merge/pr_<num>/<head_sha>/` 확정 (`REAL_MERGE_EVENTS_RELDIR`)
7. batch scope 확대: pilot 1회 성공 후 별도 결정
8. dryrun→real switch 위치: 신규 `utils/real_merge_hooks` 모듈 · `dispatch/finalize_hooks.py` 무수정
9. forbidden paths 갱신: 명시 정책 (`FORBIDDEN_PATHS`/`FORBIDDEN_DIR_PREFIXES` 11+종)
10. 코드화 task 발행: 본 task 완료

## 구현 파일 (총 35 files)

### 신규 모듈 5
- `utils/activation_flag_validator.py` — `ACTIVATION_FLAG_DEFAULT=False` hardcoded + import time assertion + env var
- `utils/chair_authorization_validator.py` — `anu.chair_merge_authorization.v1` validator (TTL/sig/pr-head 매칭)
- `utils/gate_snapshot_validator.py` — 11종 gate 검증 + 5분 TTL
- `utils/real_merge_artifact_schema.py` — writer 3 (merge_decision/pre_gate_snapshot/execution_result) + post_smoke schema-only
- `utils/real_merge_hooks.py` — `real_merge_execute()` 순수함수 + dryrun→real switch + forbidden 가드

### 결선 (1줄)
- `dispatch/__init__.py` — `from utils.real_merge_hooks import dryrun_to_real_switch`

### fixtures 8 시나리오 (24 files + INDEX)
- `no_op_no_authorization`, `would_merge_but_disabled`, `stale_snapshot`, `chair_auth_expired`
- `admin_override_required` (CHAIR_REPORT), `blocking_secret_detected` (CHAIR_REPORT)
- `post_smoke_fail_report_only` (schema-only)
- `pass_path_inert_artifact_only` (subprocess_runner=None · 실 gh pr merge 0)

### regression 4 (41 PASS)
- `test_real_merge_executor_no_op_paths.py` — 6 NO_OP fixture finalize_result 단언 + 실 subprocess 호출 0
- `test_chair_authorization_validator.py` — 13 cases (verbatim signature · TTL · pr/head_sha 매칭)
- `test_gate_snapshot_validator.py` — 14 cases (11 gate + 5분 TTL boundary)
- `test_real_merge_inert_pass_path.py` — 5 cases (3 artifact + dedupe + forbidden + admin-token-zero)

## regression 결과
- **신규 41 PASS**
- **기존 baseline 유지** — 1356 PASS + 11 SKIPPED (excl. test_stash_origin_audit_compat)
- **full new fail 0** (3 pre-existing test_stash_origin_audit_compat fail 은 88a1f2b0 base 에서 동일 fail · 본 task 무관)

## 안전 불변식 (단언 결과)
- `gh pr merge` 실호출 0 (subprocess injection mock 만 · trap_runner 가 호출 시 AssertionError)
- admin override CLI 옵션 (`--admin` / `--force`) 코드 경로 0 (정적 가드 + argv 검증)
- branch protection 우회 0
- non-admin merge path 만 (`--merge --delete-branch=false` 고정)
- ANU key `c119085addb0f8b7` 단일출처 변경 0
- envelope UTF-8 ≤3900 bytes 유지
- live cokacdir 실호출 0 (테스트 monkeypatch)
- forbidden paths 11+종 무수정

## 다음 단계 (별도 회장 승인 필요)
- low-risk PR pilot 1차 target 식별 (test/fixture only PR ≤ 10 files)
- chair_authorization JSON 발행 (per_pr scope · TTL ≤1h)
- `ACTIVATION_FLAG_DEFAULT` 는 영구 False · 활성화는 env var `ANU_REAL_MERGE_EXECUTOR_ACTIVE=1` + chair_authorization 둘 다 필수
- post-merge smoke writer 구현 (pilot 단계)

## frozen anchor 충족 확인
- ANCHOR-1: 코드화/비활성 구현 까지만 · 실제 merge 실행 0 · activation false default ✅
- ANCHOR-2: hardcoded False + chair_auth 부재 시 NO_OP_NO_AUTHORIZATION ✅
- ANCHOR-3: non-admin merge 만 · admin override 코드 경로 0 · gh pr merge 실호출 0 ✅
- ANCHOR-4: dryrun WOULD_MERGE → real merge_decision artifact 매핑 verdict byte-equal ✅
- ANCHOR-5: artifact 3 writer + post_smoke schema-only · atomic write · dedupe ✅
- ANCHOR-6: forbidden paths 11+종 정적 가드 무수정 ✅
- ANCHOR-7: low-risk pilot 별도 task ✅
- ANCHOR-8: callback governance stack (88a1f2b0) 와 별개 wiring layer ✅
