# task-2619 — Track C: finish-task.sh/git_evidence Layer-A no-git false-positive 자동화 보완 설계안 (read-only)

> **상태**: COMPLETED / PASS — read-only 설계 only. 실제 finish-task.sh/QC 수정은 회장 별도 승인. **md 단독 아님** — 설계 json 3종 + decision/result json + 본 보고서.
> **spec_sha256**: `e139877c58dde11ed16ba622d9b798820a7ac9becd570cf0ef41a26786231359` (일치 확인). **git HEAD**: `20456b5f...` 전후 EQUAL.
> **callback**: 독립 ANU key `c119085addb0f8b7` only (executor self `a999e2ea4c06d2fb` 절대 금지·+49 정본).

## 1. 인식 지점 — execution_class 부재 원인

- 코드베이스 전체 grep 결과 `execution_class` / `LAYER_A_NO_GIT` / `NO_COMMIT_ALLOWED` **0건** (worktree 제외, `memory/tasks/task-2619.md` 본 spec만 보유).
- 유일한 git 게이트 우회 경로 = **non-code SKIP**:
  - `git_evidence.py:79-94` `_is_non_code_task()` — `memory/tasks/<id>.md` 의 `## 레벨` 섹션에서 정규식 `코드 수정 없음|문서 업데이트만|문서만|리서치만` 매치 시에만 `verify()` → `status=SKIP`.
  - `finish-task.sh:397-417`(SCOPE) · `576-601`(GIT_GATE) — 동일 정규식 **인라인 2중 복제**.
  - `qc_verify.py:221,565-566` — git_evidence 를 OPTIONAL_CHECKS 로 등록·위임만, 자체 LAYER_A 인지 0.
- **부재 원인**: non-code SKIP 은 '산출물이 코드가 아닌' task 전용(task-2031: 코드 커밋 없이 .done 방지). ANU Layer-A no-git = '코드/스키마를 실제 수정·검증하되 git HEAD 를 spec 상 의도적으로 전진 안 함'이라는 **제3 범주** — 기존 이분법(코드+커밋 필수 ↔ 비코드 SKIP) 어디에도 안 속함. 게다가 task 의 '커밋 정책(no-git 의도성)'을 구조화 필드로 전달하는 입력 자체가 없어, 게이트가 자연어 키워드 외엔 분류 신호를 얻지 못함.

## 2. COMMIT_EXISTS 구조적 false-positive 메커니즘 (task-2613+1 실사례)

- 게이트: `git_evidence.py:372-389` (`git log --all --fixed-strings --grep=<task_id>` ≥1 **OR** mergeCommit evidence) · `finish-task.sh:612-617` (`COMMIT_COUNT==0 → exit 1` 하드 머지 차단).
- **메커니즘**: ANU Layer-A no-git spec 은 `git HEAD 전후 EQUAL · 산출물 untracked(커밋 0)` 을 **필수 요구**로 규정 → spec 을 **준수**할수록 게이트가 요구하는 커밋·머지 증거가 **부재**하고, spec 을 **위반**해야만 증거가 **존재**. 즉 정답을 항상 오답으로 판정하는 구조적 false-positive (true-negative 불가능 영역에서 무조건 false-fail). 코드성 작업이라 `## 레벨` 비코드 키워드도 없어 SKIP 도 안 됨.
- **실사례 task-2613+1** (회장 §2 인정):
  - `result.json`: `status=COMPLETED · PASS · real_entrypoint_rerun(C1..C10 10/10·mock_only=false) · sha256 3파일 · invariant 전항 true · head_pre==head_post==20456b5f · writes_outside_allowlist=0`.
  - 하니스 반응: `.escalate {"reason":"동일 verifier 3회 연속 FAIL: git_evidence","same_fail_count":4}` + `.done.escalated`(done-watcher `stale_done_unacknowledged`).
  - `independent-anu-adjudication_260519.json`(collector `c119085addb0f8b7`, authoritative): `git_evidence_false_positive = "CONFIRMED — ... ANU Layer-A no-git 작업 미인지 구조적 false-positive(dev3 판단 정확·git HEAD 실제 불변)"`.
  - **양면 caveat**: 동 adjudication 은 별개 독립 Codex 재audit 가 미보고 Critical7(`main(--out)` arbitrary fs write)을 적발 → `CHAIR_HOLD`. ⟹ false-positive 해소가 Critical7 무사통과로 변질되면 안 됨 → 대체 완료증거에 **Codex HIGH/CRITICAL 0** 을 필수 AND 게이트로 포함.

## 3. COMMIT_EXISTS 대체 완료증거 실행 설계 (5-요소 AND)

`execution_class ∈ {LAYER_A_NO_GIT, NO_COMMIT_ALLOWED}` 로 분류된 task 한정으로 COMMIT_EXISTS 를 다음 5-요소 **AND** 게이트로 치환 (그 외 task 는 기존 경로 byte-동치 — 회귀 0):

- **F1 독립 ANU collector result** — `c119085addb0f8b7` adjudication `authoritative=true · verdict≠CHAIR_HOLD · executor_self=false`.
- **F2 산출물 sha256** — result.json sha256 맵 ≡ 디스크 재계산, allowlist 내 경로만.
- **F3 실 entrypoint 재현** — 독립 collector 가 spec entrypoint 재실행 → regression all-pass · `mock_only=false`.
- **F4 Codex HIGH/CRITICAL 0** — 독립 Codex 재audit `high=0·critical=0·critical7=false`. non-Critical 잔존→`AUTO_REMEDIATION_HOLD`, Critical7→`CHAIR_HOLD`(collector downgrade 권한 0).
- **F5 allowed write surface** — `head_pre==head_post`(독립 재측정·no-git 에선 HEAD 불변이 PASS 조건)·`writes_outside_allowlist=0`·`PR/main/credential=0`·`.done 수동생성 0`.

**판정**: classify(fail-closed, 미상→STANDARD) → LAYER_A_NO_GIT 시 `PASS ⟺ F1∧F2∧F3∧F4∧F5`; 부분(F4 non-Crit)→AUTO_REMEDIATION_HOLD; F4 Crit7→CHAIR_HOLD; 그 외→FAIL(기존 escalate/done-watcher 안전망 유지). false-positive→false-negative 역전 방지: AND·독립 권위(executor self-* 0)·fail-closed 분류·F5 HEAD 독립 재측정·F4 Critical7 CHAIR_HOLD.

## 4. 구현 후보 (설계만 · 구현 0 · 회장 승인 필요)

- **py**: `execution_class_resolver.py`(분류·fail-closed) · `layerA_completion_evidence.py`(F1..F5 AND) · `git_evidence.py` additive 분기 1곳〔회장 승인〕 · `finish-task.sh` additive 분기〔회장 승인·본 task 금지〕.
- **sh**: `scripts/layerA_evidence_collect.sh`(독립 collector 재현 래퍼).
- **yaml**: `config/layerA_completion_policy.yaml`(분류 규칙·임계값·fail-closed).
- **json**: `schemas/layerA_completion_evidence.schema.json` · `memory/fixtures/task-2619.layerA-falsepositive-fixture.json`(2613+1 익명 회귀 픽스처).
- **test**: `test_layerA_completion_evidence.py`(T1..T7 양방향+STANDARD 회귀 0) · `test_execution_class_resolver.py`(fail-closed).
- 순서: 데이터/계약 → resolver → 게이트 → git_evidence/finish-task.sh〔승인〕 → 회귀 픽스처. 전 항목 additive·LAYER_A_NO_GIT 한정·STANDARD 회귀 0 미보증 시 적용 0.

## 5. 스코프 준수 / HOLD

`read-only` ✔ · finish-task.sh/git_evidence/qc_verify/Track A(2617)/B(2618)/task-2553·2604 multitrack·2610~2618 산출물 **byte-0** ✔ · write overlap A/B = **0** ✔ · `.done 수동생성`·QC 우회·executor self-*·PR/main/credential·doc-only·+53/+54/+55/Track E·durable-success write-back **0** ✔ · git HEAD 전후 EQUAL ✔. **신규 Critical7 / shared invariant 파손 없음** (additive·fail-closed → HOLD_FOR_CHAIR 불요). 실제 자동화 적용은 회장 별도 승인. authoritative = 독립 ANU collector `c119085addb0f8b7` only.

## 6. 산출물

- `memory/events/task-2619.gitevidence-falsepositive-analysis.json`
- `memory/events/task-2619.completion-evidence-design.json`
- `memory/events/task-2619.implementation-candidates.json`
- `memory/events/task-2619.{decision,result}.json`
- `memory/reports/task-2619.md` (본 문서)
