# task-2553+22 — Track P: test_only_hardening_pr_merge_v1 PROFILE REFRESH (sanctioned_head_sha) (회장 GO, 코드/파일 자동화)

> **Lv**: Lv.3 — profile sanctioned_head_sha refresh + 재발방지. **Executor**: dev4-team 비슈누 (key 7943afbe12c12f7d) 1회 한정. **TTL**: 1.5h.
> **상태**: 회장 GO Track P — +21 PRE_MERGE_HOLD 2 precondition 중 #2(profile sanctioned_head_sha stale: `2753e3cf` → 현재 PR#129 head `03ec91d1`) 해소. profile-refresh runner/schema validation/decision JSON/regression — 임의 편집 금지. md 박제만 금지.
> **선행**: +16(profile 작성, live workspace untracked). +21(PRE_MERGE_HOLD, head_sha_eq_sanctioned fail). **병렬**: Track AUTH(task-2553+24) SAFE_PARALLEL(expected_files ∅). +23(callback infra) 비간섭.

---

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

+21 pre-merge-gate: **7/8 PASS**(mergeable·mss CLEAN·reviewDecision allowlist·CI all SUCCESS·unresolved 0·effective diff test-only·production byte-0), **fail = head_sha_eq_sanctioned**(profile sanctioned_head=`2753e3cf…`(구) vs PR#129 현재 head `03ec91d14a094a1792d240107a592ed6ddf0c29b`). merge 미호출. 코드 결함 아님 = profile stale.
profile (+16 작성, **live workspace untracked**): `/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`(sanctioned_head_sha 필드 보유).

## 2. 목표 (회장 verbatim)

test_only_hardening_pr_merge_v1 profile 의 `sanctioned_head_sha` 를 PR #129 현재 head **`03ec91d14a094a1792d240107a592ed6ddf0c29b`** 로 갱신. profile 수정 = 임의 편집 아니라 **profile-refresh runner / schema validation / decision JSON / regression** 으로 처리.

## 3. 구현 방향 (코드/파일 자동화)

1. **profile-refresh runner**(예: `scripts/run_profile_refresh.py` 또는 +16 loader 확장): 입력=profile 경로 + new_head_sha + 근거(PR#129 live `gh pr view 129 --json headRefOid` 실측 == 03ec91d1). 동작: profile JSON 의 `sanctioned_head_sha` 필드 **그 1개 키만** 갱신(타 키·구조 무변), atomic write, 변경 전후 diff·sha 기록. 임의 편집·타 필드 변경 0.
2. **schema validation**: 갱신 후 profile 이 `test_only_hardening_pr_merge_v1.schema.json` 에 **valid** 재검증(PASS 필수, 실패→롤백·HOLD).
3. **live 일치 가드**: refresh 직전·직후 `gh pr view 129 --repo Jeon-Jonghyuk/dev_workspace --json headRefOid` 실측이 `03ec91d1` 와 일치(불일치=PR#129 head drift → HOLD, refresh 0). new_head_sha 는 hard-code 가 아니라 live 실측값으로 확정(03ec91d1 와 동일해야 진행).
4. **decision JSON**: `memory/events/task-2553+22.profile-refresh-decision.json`(old/new sanctioned_head_sha·근거 live headRefOid·schema valid·diff·전후 sha·timestamp).
5. **regression**: profile-refresh runner 단위 — ①정상 refresh→sanctioned_head==03ec91d1·schema valid ②타 키 무변(diff=sanctioned_head_sha 1키만) ③live head drift→HOLD refresh 0 ④schema invalid→롤백 ⑤idempotent(이미 03ec91d1면 no-op).
6. **stale 재발방지 evidence**: profile 에 `sanctioned_head_provenance`(갱신 ts·근거 PR#129 headRefOid·refresh runner 경유) 기록 + 향후 Track M gate 가 live head ↔ profile sanctioned_head 불일치 감지 시 명시 신호(profile-stale) 산출하도록 evidence/decision 에 명문화(재발 시 즉시 식별).

## 4. 허용

profile-refresh runner / schema validation / decision JSON / regression / stale 재발방지 evidence / live `gh pr view` read-only 실측 / result·report marker.

## 5. 금지 (회장 verbatim + scope)

profile 밖 임의 수정 / sanctioned_head_sha 외 profile 키·구조 변경 / PR #129 코드 변경 / production code / PR #128·#102 변경 / F2·phase3·mqe / credential·OWNER PAT / force·rebase·admin override / merge / branch·commit·push·PR(profile 은 live workspace untracked 파일 직접 갱신, git commit/push 0) / dev 재가동·dispatch / Track AUTH(task-2553+24)·+23·Track M·coordinator artifact 수정·인용 / 조건 미충족 merge. live `/home/jay/workspace` git tracked HEAD/branch/ref(`task/task-2553p1-f1-clean-replacement` `20456b5f`) 전후 assertEqual(profile=untracked·task-2553+22.* marker=git-untracked batch-internal, 위반 아님).

## 6. HOLD_FOR_CHAIR

profile refresh 가 현재 PR head 와 불일치(live headRefOid ≠ 03ec91d1) / PR #129 head drift / profile 부재·schema invalid 회복 불가 / sanctioned_head 외 변경 필요 / Codex unresolved HIGH·CRITICAL / ANU-Codex 반복충돌 / credential·permission expansion / Critical7.

## 7. 완료 조건 (회장 verbatim)

profile `sanctioned_head_sha == 03ec91d14a094a1792d240107a592ed6ddf0c29b` / profile schema validation PASS / profile-refresh decision JSON 생성 / regression PASS / stale profile 재발방지 evidence 생성.

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

batch consolidated summary 항목2(profile refresh 결과)에 통합. final packet(result.json): old→new sanctioned_head·근거 live headRefOid·schema valid·diff(1키)·regression·재발방지 evidence·HOLD 여부. AUTH+P 둘 다 충족 시 Track M 재실행 전제.

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

batch plan(§3) → Codex lint → ANU refine(9-R) → re-lint → ANU→executor 1회 위임(loop 기계; dev4 1회 TTL1.5h, callback (a) normal+fallback, 4-tuple task_id=task-2553+22 분리·타 track artifact 인용 0) → refresh→schema→decision→regression → post-result audit → adjudication → result.json → batch 통합. 회장 보고 트리거(§6)만, 그외 자동 수렴.

## 11. 9-R — Codex lint 반영 (NEEDS_REFINEMENT → 자동 수렴, agent ac21d456c2290e455: CRITICAL1/HIGH3/MED3/LOW2)

### 9-R.1 (CRITICAL+HIGH#1) profile 변경 = sanctioned_head_sha 값 1키 only — provenance 는 profile 밖
§3.6 정정: **stale 재발방지 evidence·provenance 는 profile 에 절대 추가 0**(§3.1/§5 단일키 규칙 우선). profile 의 유일 delta = `sanctioned_head_sha` **값 1개**(키 추가·구조·타 키 0 변경). 모든 provenance(갱신 ts·근거 live headRefOid·refresh runner 경유)는 **profile 밖 별도 marker** `memory/events/task-2553+22.profile-refresh-decision.json` + `memory/events/task-2553+22.stale-detection-signal.json` 에만 기록. §2/§3.6 의 "profile 에 sanctioned_head_provenance 기록" 문구 폐기.

### 9-R.2 (HIGH#2) one-key diff = 기계적 acceptance gate (관찰 아님)
§3.1 "diff·sha 기록" → **acceptance gate**: 갱신 write 는 **profile 의 semantic/파일 delta 가 정확히 `sanctioned_head_sha` 값 1개일 때만 commit**(그 외 어떤 키·구조·공백·순서 변화 감지 시 write reject·rollback·HOLD). diff 가 1키 초과 → 자동 거부(관찰 기록이 아니라 차단 게이트).

### 9-R.3 (HIGH#3) stale-detection = profile 밖 machine-readable signal
재발방지 = `memory/events/task-2553+22.stale-detection-signal.json`(schema: {profile_path, sanctioned_head_sha, source_pr:129, source_headRefOid_live, refreshed_ts, refresh_runner, contract:"향후 Track M gate 는 live `gh pr view 129 headRefOid` ↔ profile sanctioned_head_sha 비교, 불일치 시 PROFILE_STALE 신호 산출"}). profile 미변경, 신호는 별도 artifact 단일 권위. 향후 gate 가 이 contract 로 자동 stale 감지(profile mutation 0). **신호 artifact 자체도 schema validation PASS 필수**(stale-detection-signal.json 이 정의 schema 에 valid — invalid·필드 누락 시 HOLD, refresh evidence 미완 처리).

### 9-R.4 (MED#1+#2) target=live 실측 only + idempotent 경로도 evidence 산출
§2/§3.3/§7: new sanctioned_head 값 = **live `gh pr view 129 --repo Jeon-Jonghyuk/dev_workspace --json headRefOid` 실측 결과** 단일 출처. 진행 조건 = live headRefOid == `03ec91d14a094a1792d240107a592ed6ddf0c29b`(불일치=PR head drift → refresh 0·HOLD). hard-code 03ec91d1 는 기대값 대조용일 뿐 write 값은 live 실측. **idempotent(이미 03ec91d1)** 분기도 decision JSON + before/after sha + diff(0키 변경) 기록 후 정상 종료(no-op success, HOLD 아님).

### 9-R.5 (MED#3+LOW) loop 용어·HOLD 보강·tracked 무변 명시
§9 "Codex lint→refine→re-lint→위임→callback" = **ANU-Codex loop 기계 프로세스**(타 track/coordinator artifact 인용 아님 — 프로세스 메타). §6 HOLD 추가: schema valid 후라도 **decision JSON·diff·sha 기록 실패 → HOLD**(증거 없는 refresh 0). §5 명시 보강: untracked profile 직접 refresh 는 git tracked worktree status 무변(allowed untracked marker 외 tracked 변화 0, `git status --porcelain` tracked 항목 전후 동일).

→ 9-R.1~9-R.5 로 CRITICAL1+HIGH3+MED3+LOW2 해소. Codex re-lint GO_READY 시 dispatch.

## 10. task-2553 계열

+16=profile 작성 / +21=Track M PRE_MERGE_HOLD(head_sha stale + auth absent) / **+22(Track P 본건)=profile sanctioned_head_sha refresh→03ec91d1** / +24=Track AUTH(BOT token preflight, 병렬) / Track M 재실행=AUTH+P 후.
