# task-2624 범위 A — RECONCILE_EVIDENCE_CONTRACT_DRY_RUN

- **ts_kst**: 2026-05-21 10:15 KST
- **mode**: read-only · dry-run · proposal-only · production 코드 수정 0
- **executor**: ANU 직접 audit
- **verdict**: **DRY_RUN_PASS** — gap/schema/timing 실증 + backward-compat 위험 사전 발견

## Baseline 선검증 (doctrine 260521 적용)
- `post_merge_smoke_runner.py`: HEAD=origin/main=working-tree=`a2c69bca` · 590L · clean ✅
- `lifecycle_reconciliation_manager.py`: HEAD=origin/main=working-tree=`2ccfe44f` · 1932L · clean ✅
- → task-2623 baseline error 재발 0 · 두 모듈 검증된 baseline

## 9 필수 항목 결과

1. **post_merge_smoke evidence 생성** — `to_json()` 보유(L132)하나 `main()`은 stdout print만(L579) · **file write 결선 0**
2. **reconcile lookup 경로** — `memory/events/{task_id}.qc-result` substring 매칭(L711-720). ★ 이 qc-result는 실은 **QC gate(qc_verify.py --gate) 산출물** — 머지 前 self-QC지 post-merge smoke 아님
3. **evidence json schema proposal** — `post-merge-smoke.json` (qc-result와 분리) · first_line `SMOKE_STATUS=<enum>` 마커 + rich fields
4. **path/timing dry-run fixture** — REV1~REV5 · path 단절 + status enum mismatch(5 vs 3) + substring false-positive 확인
5. **reconcile 실패 케이스 fixture** — REF1~REF5 · evidence 부재/손상 시 STUCK 잔류(안전 측) · QC gate 충돌 위험
6. **최소 B 범위** — post-merge smoke 전용 path 분리 + reconcile 별도 lookup (additive). single-sided rejected (QC gate 충돌)
7. **B expected_files/LOC/risk** — 3 files · ~50 production LOC · LOW-MEDIUM risk
8. **Critical7** — 아님
9. **write/merge/credential 0** — 코드 변경 0 · PR/merge/branch/push 0 · credential 0

## ★ 핵심 발견 (backward-compat 위험 사전 차단)
`memory/events/{task_id}.qc-result`는 **이미 QC gate + finish-task.sh + task-timer 산출물**입니다 (`teams/shared/qc_verify.py` L594, `scripts/finish-task.sh` L336/381, `memory/task-timer.py`). reconcile의 "smoke_status" lookup은 사실 **머지 前 QC gate 결과**를 읽는 것이지 post-merge smoke가 아닙니다 — 두 개념이 conflate되어 있습니다.

따라서 직전 `reconcile_evidence_contract_proposal.json`이 제안했던 "post_merge_smoke가 qc-result에 write" single-sided 접근은 **QC gate 산출물과 충돌**할 뻔했습니다. **회장의 "production 모듈 수정 전 dry-run 선검증" 지시가 정확히 이 충돌을 차단**했습니다 (task-2623 baseline error 학습의 실효).

## 완료 보고
- **dry-run 검증**: **PASS**
- **evidence path 가정**: FALSE (stdout vs qc-result 단절)
- **schema 가정**: PARTIAL_MISMATCH (5 status vs 3 인식 · TIMEOUT/BLOCKED 오분류 + substring false-positive)
- **timing 가정**: OK (path 단절로 무의미)
- **B 필요**: YES
- **B expected_files (3)**: post_merge_smoke_runner.py + lifecycle_reconciliation_manager.py + test_reconcile_evidence_contract_2624.py
- **B 예상 LOC**: ~50 production / ~140 with test
- **regression fixtures**: REV1~REV5 + REF1~REF5 (10)
- **Critical7**: 아님

## 회장 승인 필요 (B 진입 전)
1. B 범위 승인 — post-merge smoke 전용 evidence path 분리(`post-merge-smoke.json`) · additive · QC gate 무영향
2. REF4 정책 — smoke SKIPPED 시 reconcile FINALIZED 허용 여부
3. smoke_command registry 확장 의무화 여부
4. post-merge-smoke.json vs qc-result 역할 분리 문서화

## Critical7 — false (read-only · 코드 변경 0)

## 산출물
- `memory/events/task-2624.reconcile_evidence_dry_run.result.json`
- `memory/events/reconcile_evidence_json_schema_proposal.json`
- `memory/events/reconcile_evidence_dry_run_fixture_matrix.json`
- `memory/events/reconcile_evidence_B_scope_estimate.json`
- `memory/reports/task-2624.reconcile_evidence_dry_run.md`

**범위 B는 미승인. 범위 A PASS 확인 후 별도 승인 검토.** auto_progress=false.
