# task-2553+21 — PR #129 PROFILE-DRIVEN MERGE LIFECYCLE (Track M, 회장 GO, 코드/파일 자동화)

> **Lv**: Lv.4 — 실 BOT merge + post-merge 자동화. **Executor**: dev2-team 오딘 (key fedf78d1d09509f5) 1회 한정 (profile 작성자 — continuity). **TTL**: 2h.
> **상태**: 회장 Track M GO — task-2553+20 ACCEPT·PR #129 MERGE_READY 인정. `test_only_hardening_pr_merge_v1` profile(+16 작성, live workspace 존재) **적용**하여 pre-merge gate→BOT merge→post-merge smoke→reconcile→closeout 자동 진행. profile **재생성 0**(이미 존재, read/apply only). md-only 금지.
> **선행**: +15(PR#129 OPEN)·+18(T1/T2 코드 fix push·T2 resolved)·+20(T1 resolve→MERGE_READY). Track C(task-2553+19)=옵션 A closeout 완결(독립·인용 0). Track P(profile hardening)=본 M 후속 직렬(profile 파일 충돌 회피).

---

## 1. 확정 전제 (ANU read-only 확인 19:29 — 변경 불가)

PR **#129** OPEN, head **`03ec91d14a094a1792d240107a592ed6ddf0c29b`**, branch `task/task-2553+15-dev7-testloader-hardening`, base main, mergeable **MERGEABLE**, mergeStateStatus **CLEAN**, reviewDecision "", reviewThreads total 2 **unresolved 0**(T1·T2 모두 resolved). +20 reclassification=MERGE_READY. production owner_trigger_pat.py byte-0(sha256 `7b7d996aae3c368561f63600f8e71017f7af85b86a63b5533153e956bdec7135`), effective diff = 2 test 파일(test_load_otp_sysmodules_2553plus14.py 신규 + test_owner_trigger_2553_plus1_high_fix.py +1).

profile (+16 작성, **live workspace untracked** — 본 task read/apply, **수정 0**): `/home/jay/workspace/schemas/policy_profiles/test_only_hardening_pr_merge_v1.schema.json` · `/home/jay/workspace/memory/policy_profiles/test_only_hardening_pr_merge_v1.json` · `/home/jay/workspace/scripts/run_test_only_hardening_pr_merge.py` · `/home/jay/workspace/tests/regression/test_test_only_hardening_pr_merge_2553plus16.py`. 부재·schema-invalid → §7 HOLD(profile 재생성·수정 금지 — Track P 도메인).

## 2. 목표 (회장 verbatim)

PR #129 merge lifecycle: `test_only_hardening_pr_merge_v1` 적용 → pre-merge gate → BOT merge → post-merge smoke → reconcile evidence → closeout packet, 코드/파일 자동화. 회장 gate/HOLD/packet 재열거 안 함(profile engine 자동).

## 3. 필수 산출 (실행파일/JSON, md-only 금지)

`memory/events/task-2553+21.pre-merge-gate.json` / `.merge-exec.json` / `.smoke.json`+`.smoke.log` / `.reconcile.json` / `.closeout.json` / `.activation-decision.json` / `.hold-for-chair.json`(조건부) / `.result.json`(final packet) + `memory/reports/task-2553+21.closeout-packet.md`. (+16 profile loader `scripts/run_test_only_hardening_pr_merge.py` 재사용 — 신규 runner 작성 불요, 기존 호출).

## 4. merge lifecycle (profile-driven, 9-R 상속 = task-2553+16 9-R.1~9-R.6 + task-2553+12 irreversibility)

1. **profile load**(read-only): test_only_hardening_pr_merge_v1 predicate·hold·merge_method·auth·post_merge·irreversibility 로드. profile 수정 0.
2. **pre-merge gate**: PR #129 실시간 관측 ↔ profile predicate(9-R.2 상속): mergeable==MERGEABLE / mergeStateStatus==CLEAN(BLOCKED/UNSTABLE/DIRTY/BEHIND/UNKNOWN→merge 0) / reviewDecision∈{APPROVED,""}(""=CLEAN+CI 전건 SUCCESS+unresolved 0 동반시 affirmative-safe) / CI 전건 SUCCESS / unresolved review thread==0(현재 0) / effective diff=2 test only / production byte-0(sha `7b7d996a…`) / head==`03ec91d1`(관측 sanctioned). → `pre-merge-gate.json`(각 boolean+측정+ALL_PASS). ALL_PASS=false→pre-merge HOLD.
3. **Codex audit + ANU-Codex adjudication**(loop 자동, LOW/MED·micro-fix·fixture·regression 회장 보고 0). **이 loop 는 PR #129 content·sanctioned head `03ec91d1…`·live tracked ref 에 대해 read-only**(pre-merge mutation 0 — gate·head-pin 이전 어떤 PR/profile/ref write 도 불가).
4. **merge atomicity(9-R.1 상속)**: merge 직전 gate 전건 재측 + `gh api -X PUT /repos/Jeon-Jonghyuk/dev_workspace/pulls/129/merge -f sha=03ec91d14a094a1792d240107a592ed6ddf0c29b -f merge_method=<M>`. **M 결정 규칙(fail-closed, 단일값)**: repo allow_* 관측 → `allow_squash_merge` 활성이면 M=**squash** / 아니면 `allow_merge_commit` 활성이면 M=**merge** / 그 외(rebase-only·미해결·다중 충돌·불명) → **pre-merge HOLD**(임의 선택 0). 선택 M+repo allow_* 관측 `pre-merge-gate.json.merge_method_provenance` 기록. head 불일치 409→pre-merge HOLD. 비핀 gh pr merge 금지. auth(9-R.5)=기존 taskctl-bot GitHub App installation token 단일, 그외 credential→fail-closed HOLD.
5. **irreversibility(task-2553+12 9-R.2 상속)**: pre-merge HOLD=merge 0 / post-merge(smoke·reconcile·closeout 실패)=merge 비가역 유지·rollback/revert/force 0·후속중단·hold-for-chair.json(stage=POST_MERGE,merge_commit)+회장 보고. idempotency: 이미 MERGED→no-op success 후 후속 계속 / 409·blocked→pre-merge HOLD. liveness(9-R.3): persistent non-CLEAN/CI-pending budget 초과→pre-merge HOLD(spin 금지).
6. **post-merge smoke**: isolated worktree(merged origin/main)에서 11 passed(F1 3+streaming 4+신규 가드 4)+production import OK. **smoke 판정(task-2553+12 doctrine 인라인 재기술)**: harness-loader artifact(예: _load_otp sys.modules 미등록류 — 독립 재현으로 입증) → **HOLD 0·rollback 0**(머지 유지, 회장 보고 0) / 실 production 결함 입증 → **POST_MERGE HOLD packet only**(rollback/revert/force 0).
7. **reconcile**: origin/main 이 merge commit 포함·effective diff 2 test·PR #129 MERGED·PR #128/#102 무변(read-only fetch).
8. **closeout**: evidence-based(manual .done echo·evidence 없는 closeout 0). `task-2553+21.result.json`(final packet) + closeout-packet.md.

## 5. boundary (회장 verbatim)

production code 변경 / **profile 파일 수정·재생성**(Track P 도메인 — read/apply only) / PR #128·#102 변경 / Track A closeout artifact(task-2553+13.*·task-2553+1.*) / Track C artifact(task-2553+19.*) 수정 / F2·phase3·mqe / credential·OWNER PAT / force·rebase·admin override / evidence 없는 closeout / profile 밖 merge / anu_v3 coordinator(Track 2+3 도메인) — 전부 금지. live `/home/jay/workspace` git tracked HEAD/branch/ref(`task/task-2553p1-f1-clean-replacement` `20456b5f`) 전후 assertEqual(task-2553+21.* marker = git-untracked batch-internal 보고 채널, 위반 아님 — 9-R.1 상속). post-merge 작업 = isolated worktree·gh api only.

## 6. HOLD_FOR_CHAIR (profile engine 자동 산출)

profile hold_conditions 자동 평가 + 회장 보고 트리거(공통원칙): Critical7 / credential·OWNER PAT·permission expansion / forbidden touch / production diff / profile 부재·invalid(수정 불가 — Track P 도메인) / merge·profile gate auto-resolve 불가 / Codex unresolved HIGH·CRITICAL / ANU-Codex 반복충돌 / goal 달성불가. 그외(CI 대기·LOW·MED·micro-fix·regression·smoke false-positive·callback dup·fixture) 회장 보고 0 loop 자동.

## 7. 완료 (consolidated summary 통합 — 단독 보고 0)

batch consolidated summary 항목1(PR#129 merge 상태) + 항목2(smoke/reconcile) + 항목4(track별). final packet(result.json): profile 경로·pre-merge-gate ALL_PASS·mergedAt/mergeCommit·merged head·CI/CLEAN·effective diff 2 test·post-merge smoke·reconcile·PR#128/#102 보존·closeout·callback collector·HOLD 여부.

## 8. ANU-Codex loop + callback (자동, 중간보고 0)

batch plan(§3) → Codex lint → ANU refine(9-R) → re-lint → dispatch(dev2 1회 TTL2h, callback (a) normal+fallback, 4-tuple task_id=task-2553+21 분리·Track C/A artifact 인용 0) → profile load→gate→merge→smoke→reconcile→closeout → post-result audit → adjudication → result.json → batch 통합. §6 트리거만 회장 보고.

## 9. task-2553 계열

+16=PR#129 merge lifecycle→HOLD(2 thread, profile 작성) / +18=T1/T2 코드 fix push·T2 resolved / +20=T1 resolve→MERGE_READY / **+21(Track M 본건)=PR#129 profile-driven merge lifecycle(profile 적용·재생성 0)** / +19=Track C(옵션 A closeout 완결, 독립) / +22=Track P(policy profile hardening, M 후속 직렬).
