# task-2779_a Axis A pre-push warn — ANU 독립 재검증 (read-only)

상태명: `TASK2779A_AXIS_A_PRE_PUSH_WARN_CODE_CANDIDATE_VERIFIED_WITH_CLOSEOUT_DEVIATION_ACTIVE_FALSE`
검증: ANU 직접 (2026-06-29 KST), read-only. 코드 수정 0. 근거: GPT 단계판정(260629, "PR/Gemini 전 ANU read-only 재검증 11항목 + closeout deviation 분리").

## 결론
**코드 후보 = 양호(수용 후보).** 11항목 read-only 검증 전수 통과. 단 **closeout 절차 deviation 2건**(GOALGATE canonical materialize / TASKCTL_BYPASS)은 코드 결함 아닌 **infra followup으로 분리**. 아직 PR/Gemini/merge 미진입(회장 승인 대기).

## 11항목 검증 결과
1. worktree `task/task-2779_a-dev2` HEAD = **73f02922** ✓ (GPT 명시와 일치)
2. diff 정확히 3파일 ✓: `dispatch/terminal_artifact_index.py`(+2) · `scripts/pre_push_terminal_guard.py`(238 신규) · `tests/regression/test_pre_push_terminal_guard_2779.py`(356 신규)
3. expected_files 밖 수정 0 ✓ (allowed paths 4종 내, forbidden 0)
4. canonical 원복 후 잔여 deliverable 0 ✓ (canonical에 guard.py·test.py ABSENT, terminal_artifact_index.py 변경 0)
5. P0c 증거 `memory/events/terminal_artifact_index/task-2778_a.json` 무변경 ✓ (sha `e6736ec5…`, mtime 04:49 불변)
6. result.json 필드 ✓: `callback_fired_by_executor:false` · `schedule_created_by_executor:false` · `owner_pickup_required:true` · `report_path:memory/reports/task-2779_a.md` · terminal_state=EXECUTOR_RESULT_WRITTEN · authoritative=false
7. report 위치 = **canonical 존재**(7257 bytes), worktree에는 ABSENT. → ANU 초기 "MISSING"은 **이른 시점 확인**(GPT 추정 맞음). 현재 canonical에 정상 존재 ✓
8. TASKCTL_BYPASS: 별도 evidence 파일/보고서 문자열 없음(dev2 세션 로그 기반). underscore↔precommit regex 불일치 = **알려진 backlog** → followup B 분리. 치명 위반 아님
9. GOALGATE canonical cwd FAIL → deliverable 임시 materialize→통과→원복: 코드 결함 아닌 **closeout infra followup** → followup A 분리
10. 테스트 재실행(worktree) ✓: py_compile 3파일 PASS · 2779 regression **8 passed** · 2778 무회귀 **31 passed**
11. forbidden touch 0 ✓: 실제 `.git/hooks/pre-push` 미설치 · 실제 push 0 · subprocess git push 0 · cokacdir/cron/systemctl 호출 0 · strict/blocking 미구현(blocked 항상 False, exit 0) · 소스 raw/ANU key 0(테스트는 negative-assert뿐) · real fire 0 · ACTIVE=false(driver disabled, REAL_FIRED 1 불변)

## 코드 핵심 (설계 부합 확인)
guard = warn/envelope mode: terminal artifact 존재→manifest surface / 부재→`PUSH_ATTEMPT_WITHOUT_TERMINAL_MARKER` 마커 surface. **항상 exit 0(push 비차단)**, 어떤 예외도 밖으로 안 던짐(fail-open + `GUARD_INTERNAL_ERROR_FAIL_OPEN` marker). 기존 build_manifest/surface_manifest 재사용, containment helper 통과.

## closeout deviation 2건 (followup backlog 분리 — 코드결함 아님)
- **A. `FINALIZE_ONLY_GOAL_GATE_WORKTREE_CWD_GAP`**: finalize-only/worktree task에서 GOALGATE가 canonical cwd로 assertion 실행→FAIL→deliverable 임시 canonical materialize 후 원복으로 통과. 구조적 closeout 갭. (기존 [[finish_task_worktree_finalize_foreign_branch]] 계열과 동축)
- **B. `TASK_ID_UNDERSCORE_PRECOMMIT_REGEX_GAP`**: branch `task/task-2779_a-dev2` underscore가 precommit task-id 정규식 불일치→TASKCTL_BYPASS 사용. (기존 메모리 branch-regex-underscore backlog와 동일)

## 다음 (회장 승인 대기)
PR 생성·push·fresh Gemini·merge **전부 미진입**. 회장 승인 시 → PR 후보 생성 → fresh Gemini → active HIGH 0 → CI → MERGE_CANDIDATE_READY. closeout deviation 2건은 별도 트랙(이번 코드 merge 가부와 분리).
