# task-2781 — merge_group Evidence Auditor 구현 (코드+테스트까지만, ACTIVE=false)

## 레벨
Lv3 (신규 스크립트 2 + 회귀 테스트). 코드 작업.

## allowed_resources (본 task의 capability)

```yaml
allowed_resources:
  paths:
    - "scripts/merge_group_evidence_auditor.py"
    - "scripts/merge_group_pr_resolver.py"
    - "tests/regression/test_merge_group_evidence_auditor_2781.py"
    - "memory/reports/task-2781.md"
  forbidden_paths:
    - "scripts/gemini_evidence_verify.py"
    - "scripts/gemini_review_gate.py"
    - "scripts/finish-task.sh"
    - "dispatch.py"
    - ".git/hooks/**"
    - ".github/**"
    - ".claude/**"
    - ".env*"
    - "memory/state/**"
    - "**/inbox/**"
    - "**/archive/**"
    - "**/quarantine/**"
  commands:
    - "git"
    - "pytest"
    - "python3"
    - "gh"
  merge_policy: "manual"
  ttl_hours: 8
```

## 목표
merge queue의 merge_group 단계에서 `gemini-review-gate` job이 skipped=success로 우회되는 **false-pass**를 차단하는 evidence auditor를 구현한다. **코드+테스트 작성까지만.** CI/ruleset/required 등록/Merge Queue 활성화/8팀 병렬 실행은 **금지**(별도 승인 단계).

## 단일 소스 (반드시 먼저 읽을 것)
설계서: `memory/reports/merge_group_evidence_auditor_design_260701.md`
sha256: `98144f1010e0be72813ef1f36e8ff431513ebe2ff3716a790fa26266cc75ba2e`
(설계서 §1~§10 그대로 구현. 아래 강제조건이 설계서와 충돌하면 STOP 후 ANU 콜백.)

## 강제 조건 (5 — 절대 훼손 금지, GPT verbatim)
1. **SHA 3종 분리 유지.** Gemini evidence 검증은 **반드시 원본 PR head SHA(`pr_head_sha`) 기준**. `merge_group_sha`를 `evaluate_gate`에 넘기는 구현 **금지**.
2. **merge_group freshness = SHA 일치 기반.** 300초 wall-clock freshness 사용 금지. `evidence commit_sha == pr_head_sha` + admission 이후 새 push 없음으로 판정.
3. **PR 역추적 fail-closed.** GitHub API/GraphQL 1차 신뢰원, `gh-readonly-queue` ref명·commit trailer 파싱은 **fallback only**. 포함 PR 목록 또는 head SHA 확정 못하면 `MERGE_GROUP_PRS_UNRESOLVED`로 **fail-closed**.
4. **skipped=success 뒤집기.** gemini-review-gate check conclusion을 신뢰하지 말고 **evidence 직접 판정**. success여도 evidence 없음/SHA 불일치/skipped면 fail.
5. **evaluate_gate 본체 수정 금지.** `scripts/gemini_evidence_verify.py::evaluate_gate` 그대로 사용. 신규 auditor 레이어에서만 hold→fail 재해석, admission drift 검사, PR 역추적, 결과 집계 처리.

## expected_files (이 범위만)
- `scripts/merge_group_evidence_auditor.py` (신규)
- `scripts/merge_group_pr_resolver.py` (신규; auditor 내부 모듈 흡수 허용)
- `tests/regression/test_merge_group_evidence_auditor_2781.py` (신규)

## forbidden_paths (건드리면 즉시 STOP)
- `.github/workflows/ci.yml` 및 `.github/**` 전체
- ruleset / branch protection / required check 등록
- `scripts/gemini_evidence_verify.py` (evaluate_gate 본체)
- `scripts/gemini_review_gate.py` (참조만, 수정 금지)
- 그 외 expected_files 밖 모든 파일

## 실패 상태 enum (설계서 §9 그대로)
PASS / MERGE_GROUP_PRS_UNRESOLVED / GEMINI_EVIDENCE_SKIPPED_OR_MISSING / GEMINI_EVIDENCE_STALE / HEAD_ADVANCED_AFTER_ADMISSION / UNRESOLVED_HIGH_OR_CRITICAL / OWNER_RESOLVE_PENDING / AUDITOR_INTERNAL_ERROR.
- PASS만 exit 0. 그 외 전부 exit≠0. **어떤 미결정도 통과로 보지 않는다(fail-closed).**

## 테스트 (설계서 §10, 12케이스 전수 — API는 mock/monkeypatch)
설계서 §10 1~12 케이스 그대로. 특히 케이스5(merge_group_sha 실수 투입 시 fail = 함정1 회귀방지), 케이스11(500초 경과·evidence fresh → PASS = 함정2 wall-clock 미적용 회귀방지)는 필수.

## ACTIVE=false 불변식
- CI job 추가/등록 0. required check 등록 0. ruleset 변경 0. Merge Queue 활성화 0. real fire 0.
- 산출물은 **스크립트 파일 + 테스트 + 로컬 pytest 통과**까지. 실제 merge_group 이벤트 결선은 별도 승인.

## 산출물 & 보고 (PR 생성 전 선보고 필수)
1. **구현 후보 PR 생성 전에** ANU에게 먼저 보고: (a) 실제 수정/생성 파일 범위 (b) 로컬 `pytest tests/regression/test_merge_group_evidence_auditor_2781.py` 결과 (c) 코드/CI/ruleset 변경 0 유지 증거(`.github/` diff 없음 확인).
2. ANU 확인 후에만 PR 생성.
3. 봇 종료 전 **ANU callback 필수**(성공/실패/blocked 무관). callback envelope만(task_id·result_path·test 요약·file scope·sha256). UTF-8 ≤3900 bytes.

## 검증 루프
자체 리뷰 1회 후 pytest 통과 확인. evaluate_gate 무수정 확인. forbidden_paths 무접촉 확인.

## goal_assertions (auto-generated)
- `pytest tests/regression/test_merge_group_evidence_auditor_2781.py`
