# task-2553+13 — POST_MERGE_SMOKE_HARNESS_ARTIFACT_RECONCILE_AND_CLOSEOUT (Track A, 회장 병행 GO, 코드/파일 자동화)

> **Lv**: Lv.3 — post-merge reconcile + evidence-based closeout. **Executor**: dev5-team 마르둑 (key 109fa85250c6d46b) 1회 한정. **TTL**: 2h.
> **상태**: 회장 병행 결정 — Track A. task-2553+12 = PR #128 merge SUCCESS(비가역) + post-merge smoke false-negative → POST_MERGE_HOLD. 본 task = harness-artifact 분류 확정 + reconcile + task-2553+1 closeout 를 **코드/파일 자동화**로 마감. 문서화만 금지.
> **병행**: Track B(task-2553+14, _load_otp 하드닝)와 SAFE_PARALLEL — B 완료 비대기, B 가 본 분류를 뒤집지 않음(전제 고정). parallel_shard_plan: `memory/events/task-2553-parallel-shard-plan_260517.json`.

---

## 1. 확정 전제 (task-2553+12 — 변경 불가 입력)

- PR #128 **MERGED**(비가역): mergeCommit `d08b8b0efa4d44fea99f1e5e391c1a18695e85f6`, mergedBy `app/jeon-jonghyuk-taskctl-bot`, mergedAt `2026-05-17T06:12:13Z`, head-pinned sha `0ea36fc9a724b1763be34710e283e088fae39a59`, method=merge.
- pre-merge gate **11/11 ALL_PASS**(직전 재측 포함). effective diff **정확히 6파일**. PR #102 보존(`bd5ad74f5d443b354319fc8b3cb006816b8a9025` OPEN). live workspace `20456b5f` 불변.
- post-merge smoke FAIL **= 테스트 하네스 로더 아티팩트**(NOT 머지코드 결함): `_load_otp()` 가 importlib spec_from_file_location 로 exec 시 `sys.modules[name]` 등록 생략 → py3.12 `@dataclass`(dataclasses.py:749 `sys.modules.get(cls.__module__).__dict__`) None 참조 → AttributeError. 3 F1 케이스(_load_otp 경유) FAIL / 스트리밍 4 케이스(_load_otp_streaming 경유) PASS.
- 머지코드 정상 입증: CI **11/11 SUCCESS**(qc-check·gemini-review-gate 포함) + 독립 재현(sys.modules 정상 등록 → IMPORT_OK True, is_duplicate_trigger 존재, ALLOWED_COMMENT_BODY=='/gemini review').

## 2. 목표 (회장 verbatim)

post-merge smoke 실패를 **harness artifact 로 분류**하고, **reconcile evidence + task-2553+1 closeout marker/result** 를 코드/파일 자동화로 생성한다. md 보고서만 완료처리 금지.

## 3. 필수 산출 (전부 실행파일/JSON)

1. `memory/events/task-2553+13.harness-artifact-classification.json` — 분류 결정(merge SUCCESS + smoke harness false-negative), 근거(CI 11/11·독립재현·로더 메커니즘·failing 3 vs streaming 4), 결정적 재현 명령·결과
2. `memory/events/task-2553+13.reconcile.json` — origin/main HEAD==`d08b8b0e` 6파일 반영 / PR #128 state==MERGED·mergeCommit 일치 / PR #102 `bd5ad74f` OPEN 무변 (전부 read-only fetch 증거)
3. `memory/events/task-2553+1.closeout.json` — task-2553+1(F1-solo) 본질 완료기준 ↔ merge evidence 매핑(merge_commit·merged_at·effective_diff_6_verified·ci_11_pass·gemini_resolved·F1 RED→GREEN·F2 byte-identical·preserved tests 무수정), evidence_consistent=true 조건
4. `task-2553+1.result.json` / `memory/reports/task-2553+1.md` — closeout 섹션 **append**(기존 내용 보존, 덮어쓰기 금지)
5. `memory/events/task-2553+1.done` — **runner 가 closeout.json evidence 정합 확인 후에만 생성**(manual echo·evidence 없는 자동 closeout 절대 금지). 기존 `.done`→`.done.acked` lifecycle 프로토콜 준수
6. `memory/reports/task-2553+13.closeout-packet.md` + `memory/events/task-2553+13.result.json` — final packet
7. `scripts/run_post_merge_reconcile_closeout.py` — orchestrator runner (classify → reconcile → closeout marker → packet, fail-closed; evidence 부정합 시 closeout/.done 생성 0 + HOLD)

## 4. 허용 (회장 verbatim)

merge verification evidence / post-merge smoke failure evidence / independent reproduction evidence / harness-artifact classification JSON / reconcile evidence JSON / task-2553+1 closeout marker·result / final closeout packet / Codex audit + ANU-Codex adjudication / normal+fallback callback.

> reconcile = origin/main **read-only fetch** 검증만(`git fetch` + `gh pr view` read). 독립 재현 = isolated tmp 격리(머지 tarball d08b8b0e, sys.modules 정상 등록) — live workspace·운영코드 미접촉.

## 5. 금지 (회장 verbatim)

rollback / revert / force push / rebase / admin override / PR #128 재수정 / PR #102 원본 변경 / F2 수정 / phase3·mqe 수정 / **_load_otp 수정**(Track B 도메인) / **code change**(production·test 일체) / credential·OWNER PAT 조작 / **evidence 없는 closeout** / manual .done echo / live `/home/jay/workspace` @ `task/task-2553p1-f1-clean-replacement` `20456b5f` cleanup·reset·stash·rm — 전후 HEAD/branch/ref assertEqual.

> 본 task 는 **코드 변경 0**(분류·검증·marker 생성만). Track B 의 _load_otp 하드닝과 write 도메인 분리(parallel_shard_plan overlap_matrix A_vs_B=SAFE_PARALLEL).

## 6. HOLD_FOR_CHAIR 조건

merge 무결성 미확인(d08b8b0e·6파일·PR#102 중 1 실패) / reconcile 실패 / closeout evidence 부정합(완료기준 매핑 1개라도 미충족) / classification 근거 부족 / forbidden 접촉 필요 / live workspace drift / Codex HIGH·CRITICAL unresolved / ANU-Codex 반복충돌 / cross-task contamination(Track B callback 혼입 등). 적중 시 closeout/.done 생성 0 + `task-2553+13.hold-for-chair.json` + 회장 보고.

## 7. 완료 후 최종 packet

1. harness-artifact classification 경로+결정 2. merge verification(d08b8b0e/mergedBy/mergedAt) 3. effective diff 6파일 일치 4. reconcile 결과 5. PR #102 보존 최종확인 6. task-2553+1 closeout marker/result/.done 경로+상태 7. 독립 재현 결과 8. Codex audit + ANU-Codex adjudication 9. HOLD 여부 10. callback collector 결과(9R5 수용기준) 11. Track A 단독 완결 상태(Track B 비대기 명시)

## 8. ANU-Codex loop + callback

batch plan(§3) → Codex lint → ANU refine(필요 시 9-R) → Codex re-lint → dispatch(dev5 1회, TTL2h, callback (a) normal+fallback, 4-tuple 분리) → classify·reconcile·closeout → regression(runner fail-closed 단위) → post-result audit → ANU·Codex adjudication → 최종 packet → 회장 보고. 회장 중간 라우팅 0, §6 HOLD 적중 시만 보고.

## 10. 9-R — Codex lint 반영 정밀 보강 (NEEDS_REFINEMENT → 자동 수렴, agent aeffd3f9b538a88ad: CRITICAL 1 / HIGH 3 / MED 3 / LOW 2)

### 9-R.1 (CRITICAL 해소) "code change 0" 의미 명확화 — Track A 자체 runner 는 허용
§5 "code change 0" = **기존 production·test·operational code(anu_v2/owner_trigger_pat.py·_load_otp·F1/F2·phase3·mqe·기타 운영/테스트 파일) byte 변경 0** 의미. 회장이 명시 요구한 **Track A 자체 자동화 산출물**(`scripts/run_post_merge_reconcile_closeout.py` 신규 orchestrator)은 "기존 코드 변경"이 아니라 **본 task 의 automation deliverable** — 회장 공통원칙 "schema/runner/... 자동화 파일 생성, 문서화만 금지" 에 따라 **필수**. §3.7 ↔ §5 모순 제거: §5 의 금지 대상 = 기존 코드 mutation, 신규 Track A runner 생성은 §3 mandatory(기존 파일 0 변경).

### 9-R.2 (HIGH 해소) reconcile = "contains mergeCommit" (tip== 금지, race-free)
§3.2 정정: `origin/main HEAD==d08b8b0e` **삭제** → ① `git fetch origin main` 후 **`origin/main` 이 merge commit `d08b8b0efa4d44fea99f1e5e391c1a18695e85f6` 를 포함**(`git merge-base --is-ancestor d08b8b0e origin/main` 또는 `git rev-list origin/main | grep d08b8b0e`) ② 해당 mergeCommit 의 effective diff(parent..d08b8b0e)가 6파일 evidence 와 일치 ③ `gh pr view 128` state==MERGED·mergeCommit==d08b8b0e ④ PR #102 `bd5ad74f` OPEN. 타 merge race 시 tip 이동해도 false HOLD 0. **단일 observation window**: 모든 remote 관측을 1회 fetch 세트로 캡처, fetched ref SHA + timestamp 를 reconcile.json 에 기록(read 간 TOCTOU 최소화).

### 9-R.3 (HIGH 해소) task-2553+1.result.json append = schema-safe 비파괴
`task-2553+1.result.json` 은 **in-place 문자열 append 금지**(JSON 손상). 방식: read → parse → **최상위 신규 key `"closeout_2553p13"` 추가**(기존 key/값 1개도 변경·삭제 0) → atomic write(tmp+rename). 불가 시 **sidecar `memory/events/task-2553+1.closeout.json` 단일 권위**로 분리(result.json 무변경). `task-2553+1.md` 는 명시적 `## task-2553+13 closeout` 섹션을 **파일 끝에 append**(기존 라인 무변경). 파싱 실패·기존 key 변형 감지 → HOLD(write 0).

### 9-R.4 (HIGH 해소) .done = runner 독립 재검증 게이트 (boolean 신뢰 금지)
`.done` 생성 전 runner 가 `closeout.json` 의 **모든 완료기준 키를 독립 재검증**: merge_commit(==d08b8b0e gh 재확인) / merged_at / effective_diff_6(실측 재대조) / ci_11_pass(gh checks 재조회) / gemini_resolved(reviewThreads unresolved==0 재조회) / F1 RED→GREEN(evidence log 존재·내용) / F2 byte-identical(sha 재도출) / preserved tests 무수정. **`evidence_consistent=true` boolean 단독 신뢰 금지** — 각 키가 closeout.json 에 present AND 개별 evidence 로 재증명될 때만 `.done` 생성. 1개라도 미증명 → `.done` 0 + HOLD.

### 9-R.5 (MED 해소) callback/result namespace 격리
Track A callback·result·collector artifact 는 `task-2553+13.*` / `task-2553+1.closeout*` namespace 한정. Track B(`task-2553+14.*`) artifact 회수·인용·근거 사용 0. callback 4-tuple(task_id=task-2553+13 / dispatch_cron / normal_collector / fallback) 분리, Track B cron id 혼입 시 HOLD(cross-task contamination).

→ 9-R.1~9-R.5 로 CRITICAL 1 + HIGH 3 + MED 3 해소(LOW 2 = §3.2 분리 서술·§1 분류근거, 9-R.2 에 흡수). Codex re-lint GO_READY 시 dispatch.

## 9. task-2553 계열

+9=PR#128 OPEN / +10=스트리밍 fix push / +11=thread resolve / +12=BOT merge SUCCESS+POST_MERGE_HOLD(smoke false-negative) / **+13(Track A 본건)=harness-artifact 분류+reconcile+closeout** / +14=Track B(_load_otp 하드닝, 병행) / +15=Track C(policy profile, A후 직렬·회장 결정 대기).
