# task-2553+21 — PR #129 PROFILE-DRIVEN MERGE LIFECYCLE — CLOSEOUT PACKET

**Track**: M · **Outcome**: `PRE_MERGE_HOLD` (merge call = 0) · **Profile**: `test_only_hardening_pr_merge_v1` (read/apply only, modify/regenerate 0) · **task md sha256**: `47d24f02…6061` 검증 통과

## 1. PR #129 merge 상태

- **결정: PRE_MERGE_HOLD** — merge API call **0건** (irreversibility_policy.pre_merge_hold = merge_call_0). PR #129 **OPEN 유지·비가역 변경 0**.
- pre-merge gate: 8개 predicate 중 **7 PASS / 1 FAIL** + **auth fail-closed**.

| predicate | expected | measured | pass |
|---|---|---|---|
| mergeable | MERGEABLE | MERGEABLE | ✅ |
| mergeStateStatus | CLEAN | CLEAN | ✅ |
| reviewDecision | {APPROVED,""} | "" | ✅ |
| CI all SUCCESS | true | true (11/11) | ✅ |
| unresolved threads | 0 | 0 | ✅ |
| effective diff test-only | true | true (2 test) | ✅ |
| production byte-0 | 7b7d996a… | 7b7d996a… | ✅ |
| head_sha_eq_sanctioned | **2753e3cf…** (profile stale) | 03ec91d1… | ❌ |

(표는 Markdown이지만 §3 산출 evidence JSON 1:1 반영 — 가독 보조)

## 2. HOLD 사유 (2개 독립 fail-closed, §6 회장 보고 트리거)

**(A) AUTH fail-closed — credential/OWNER PAT (§6 트리거)**
sanctioned `taskctl-bot` GitHub App installation token (`BOT_GITHUB_TOKEN`, `ghs_`) **부재**. 유일 가용 credential = `gh` CLI OWNER PAT (`ghp_`, account `JonghyukJeon`) — profile `auth.owner_pat_forbidden:true` + boundary §5 `credential·OWNER PAT 금지`. bot token 발급/치환 = permission expansion = 금지 → **auto-resolve 불가**.

**(B) PROFILE stale sanctioned_head_sha — profile invalid, Track P 도메인 (§6 트리거)**
profile `target.sanctioned_head_sha` = `2753e3cf7dad4d0d926d0197875fc3078a3cb19b` (+16 작성 시점 고정, +18 T1/T2 fix push 이전 값). 실제·task md §1 sanctioned PR #129 head = `03ec91d14a094a1792d240107a592ed6ddf0c29b`. +16 runner는 `head_sha_eq_sanctioned`를 profile 값에 바인딩 → predicate FAIL. boundary §5상 profile **수정·재생성 금지**(Track P 도메인, read/apply only) → **auto-resolve 불가**.

> 주의: head_sha FAIL은 **profile 값 노후**가 원인이며 PR #129 실 결함이 아님. 라이브 PR #129는 task md §4.2 측정 기준 **실질 MERGE_READY** (mergeable/CLEAN/CI 11건 SUCCESS/unresolved 0/diff 2 test/production byte-0 전부 PASS, head=03ec91d1 = task md §1 일치).

## 3. merge_method provenance

repo allow_*: squash=true, merge=true, rebase=true → resolution_priority[squash,merge] → **M=squash** 선택(provenance 기록). 단 gate 미충족·auth fail-closed로 merge 미실행.

## 4. post-merge (smoke / reconcile / closeout)

pre-merge HOLD → post_merge_steps **NOT_ENTERED** (worktree 0, test 0, fabrication 0). closeout = PRE_MERGE_HOLD packet(evidence-based, manual .done echo 0). rollback/revert/force **0** (애초에 merge 0 → 비가역 행위 자체 없음).

## 5. 불변식·boundary 준수

- live `/home/jay/workspace` git tracked **HEAD/branch/ref 전후 assertEqual PASS**: `20456b5f83fc039f2fd6f50f4b94095c29b41bfb` / `task/task-2553p1-f1-clean-replacement` / ref `20456b5f` (pre==post, mutation 0).
- PR #129 content·sanctioned head·tracked ref read-only (pre-merge mutation 0). PR #128/#102 무변(read-only, fetch 0).
- production code / profile 4파일 / Track A·C artifact / F2·phase3·mqe / credential·OWNER PAT / force·rebase·admin — **전부 무변**.
- task-2553+21.* artifact = git-untracked batch-internal channel (§5: 위반 아님).

## 6. 회장 요청 결정 (HOLD_FOR_CHAIR)

병렬 2건 필요 후 Track M 재디스패치:
1. **(A)** sanctioned `taskctl-bot` App token(`BOT_GITHUB_TOKEN` `ghs_`) 공급 (merge auth).
2. **(B)** Track P에 profile `target.sanctioned_head_sha` `2753e3cf` → `03ec91d1` 갱신 권한 부여 (본 task boundary 밖 profile mutation).

## 7. 산출물 (§3 전량)

`memory/events/task-2553+21.{pre-merge-gate,merge-exec,smoke,reconcile,closeout,activation-decision,hold-for-chair,result}.json` + `.smoke.log` + 본 `memory/reports/task-2553+21.closeout-packet.md`. callback (a) ANU Result Collector cron 자가등록(+10s, 1회).
