# task-2775+10 완료 보고서 — limited_runtime+activation_intended 동시충돌 fail-closed STOP exit-code 보정

> 작성: 오딘(dev2 팀장) | 일시: 2026-06-27 KST | 팀: dev2-team | PR #255 (`task/task-2775-dev2`)
> 성격: +10 micro-fix 1회(fail-closed 의미를 exit code까지 맞추는 마감 보정) · **ACTIVE=false / merge 금지 / real fire 0**

---

## SCQA 요약

**S (Situation)**: PR #255는 limited activation 3경계(kill/N/T) bound gate + 의미충돌 가드를 갖춘 driver다.
`main(argv, activation_intended, limited_runtime)` 진입 최상단에 `limited_runtime AND activation_intended`
동시 True(두 안전모델 충돌) 시 즉시 fail-closed STOP(fire 0·scan/governor/preflight 0) 가드가 있다.

**C (Complication)**: 이 충돌 경로가 fail-closed STOP이면서 `return 0`이라, systemd/orchestrator/쉘이
exit code로 성공 판단할 때 **치명적 설정 충돌로 중단됐는데 정상 종료로 오인**(오류 감지·자동 재시작 미수행)
→ fresh-head Gemini fresh MEDIUM 2건(driver:2235 + test:1182, 사실상 1 finding). MERGE_CANDIDATE 미확정.

**Q (Question)**: fail-closed STOP의 fire 0·scan 0 의미를 100% 보존하면서, 충돌 경로의 반환 코드만
0 → non-zero로 바꿔 OS-level exit-code 의미를 일치시킬 수 있는가? (정상 no-op/default-OFF/limited 정상/
canary 경로의 exit code는 불변 유지)

**A (Answer)**: 회장 verbatim·Gemini 제안대로 충돌 경로 한정 `return 0` → **`return 1`**. driver 1줄 +
print 메시지에 `; exit 1` 명시 1줄, test 31 assertion `rc == 0` → `rc == 1` + docstring 1줄.
총 **2파일·4줄(+4/-4)**. 다른 모든 `return 0`(bound gate NOOP 2284 / preflight 2310 / 정상 2402 등)과
test 32(legacy 정상 경로 `rc == 0`)·test 22/23(activation_intended 단독)은 **불변**. 2775 63 / 2760 36 /
2721 driver 34 전부 PASS, py_compile OK, L1 런타임 exit-code 관측 1/1 PASS, real fire 0.

---

## return code 변경 위치 (필수)

- 파일: `dispatch/anu_pickup_driver.py`
- 함수: `main()` 의 `if limited_runtime and activation_intended:` 블록 (의미충돌 fail-closed STOP 경로)
- **라인 2235**: `return 0` → `return 1`
- 라인 2232(print 메시지): `... no scan/pickup/governor)` → `... no scan/pickup/governor; exit 1)` (메시지 일치)
- ★ 이 경로 한정. 다른 `return 0`(라인 568/570/603 helper · **2284** bound gate NOOP · **2310** preflight ·
  **2402** 정상 종료)은 grep 재확인 결과 전부 원본 무손상.

테스트:
- 파일: `tests/regression/test_limited_activation_bounds_2775.py`
- **라인 1182** (test 31 `test_main_limited_runtime_and_activation_intended_conflict_stop`):
  `assert rc == 0` → `assert rc == 1` (의미충돌 fail-closed STOP → non-zero 기대)
- **라인 1122** (test 31 docstring): `즉시 return 0` → `즉시 return 1(non-zero, exit code 충돌 감지용)`
- ★ test 32(`...legacy_preserved`, 라인 1225) `assert rc == 0`은 **불변**(legacy 정상 경로 0 유지 검증 보존).

---

## PR / SHA / diff (필수)

- PR #255 head: `task/task-2775-dev2`, state=OPEN, mergeable=true
- base SHA: `e8925d91959fee06d003e14c93d15facce28810c`
- new head SHA: `3f70960786820c2b263244dfa6e7c250a7ae8589` (이전 head `0d5bff6b` → push 갱신)
- 이번 +10 커밋 diff 파일 수: **2** (`dispatch/anu_pickup_driver.py` +4/-4 중 실변경 2줄, `tests/.../test_limited_activation_bounds_2775.py` 실변경 2줄)
- PR 전체 diff 파일 수: **2** (expected_files 2개와 정확히 일치, **expected_files 밖 수정 0**)
- 커밋: `3f709607 [task-2775+10] 토르+헤임달: ... return 0→1 ... fire 0 유지, ACTIVE=false`

---

## 테스트 결과

- `py_compile` (driver + test): **COMPILE_OK**
- 2775 bounds 전체: **63 passed** (test 31 rc==1 갱신 포함)
- test-2760 (`test_p0b_event_strategy_2760` + `_wiring_2760`): **36 passed**
- 2721 driver 인접 회귀 (`test_anu_pickup_driver_2721`): **34 passed**
- +9 blank-line correctness / +8 bounded reverse scan / +7 0644·fail-closed 회귀: 2775 63건 내 포함 무회귀
- `__main__` → `main(limited_runtime=True)` 경로 / limited 정상 / default-OFF / legacy / canary 경로: 무회귀(2775 green)
- 비고: `test_base_source_isolation_2729p9.py`는 무관한 환경 특정 테스트(worktree 경로 `wt-2729p9` 하드코딩)로
  현재 워크트리에서 collection 단계 에러 — 이번 변경과 무관, 대상 파일 직접 지정으로 우회 확인.

---

## L1 스모크테스트 결과 (필수)

- 서버 재시작: **해당없음** (driver `main()` 단일 함수 exit-code 보정, 상주 서버 아님)
- API 응답 확인: **해당없음** (HTTP API 아님)
- subprocess/런타임 실동작 관측 (충돌 경로 실제 호출):
  - `python3 -c "from dispatch import anu_pickup_driver as d; rc=d.main([], limited_runtime=True, activation_intended=True)"` → `CONFLICT_PATH_RC=1`
  - 쉘 exit code 관측 (`sys.exit(d.main(...))`): **SHELL_EXIT_CODE=1** ← systemd/orchestrator/쉘이 이제 치명적 설정 충돌을 **실패로 감지**(정상종료 오인 해소)
  - stderr 메시지: `[anu_pickup_driver] limited_runtime + activation_intended 동시 True 의미 충돌 → fail-closed STOP (fire 0, no scan/pickup/governor; exit 1)`
  - fire 0: 가드가 어떤 flag/epoch 접근·scan/governor/preflight 진입 **이전**에 즉시 반환 → real fire 0 유지
- 스크린샷: **해당없음** (프론트엔드 아님)
- L1 통과: **1/1 실제 실행 + 통과** (.done 조건 충족)

---

## ACTIVE=false / real fire 0 증거

- 변경은 충돌 경로의 반환값(0→1)·메시지·테스트 assertion뿐. flag 생성/머지/activation/systemctl/canary/cron 0건.
- L1 실행은 충돌 가드 즉시반환 경로만 타므로 scan/governor/launcher/preflight **미진입**(test 31에서 spy 5종 0회 검증).
- production flag 파일(`p0b_driver_enabled` 등) write 0 (test 31 flag 'enabled' 유지 assertion green).
- **merge 0 / real fire 0 / activation 0** — ACTIVE=false 불변.

---

## fresh-head Gemini 재리뷰 필요 여부

- **필요함**. 회장 verbatim(+10 이후 경로): +10 완료 후 다시 **ANU 독립검증 → fresh-head Gemini 재리뷰 →
  CI 확인** 순서. Gemini High 0 / Critical 0 / fresh Medium 0 / efficiency 0 + CI green이면 → 다음은
  unresolved thread 정리 단계.
- new head `3f709607` 기준 fresh-head Gemini 재리뷰 대상. OUTDATED/stale-fresh thread 임의 resolve 금지(회장/OWNER 승인 전).

---

## 머지 판단

- **머지 필요**: No (본 task **merge 금지**. PASS여도 ANU 독립검증 → fresh-head Gemini 재리뷰 → CI 확인 → MERGE_CANDIDATE로만 보고)
- **브랜치**: `task/task-2775-dev2` (PR #255, 같은 브랜치 commit 추가 — 새 PR 미생성)
- **워크트리 경로**: `/home/jay/workspace/.worktrees/task-2775-dev2`
- **머지 의견**: 충돌 경로 exit-code 보정 4줄, 2775/2760/2721 전부 green, L1 exit-code 실관측 PASS,
  expected_files 밖 수정 0. fresh-head Gemini High 0 + CI green 확인 후 MERGE_CANDIDATE.

---

## 모델 사용 기록

- 토르(백엔드): `claude-sonnet-4-6` — driver return 0→1 1줄 외과 수정 (haiku 미사용: 충돌경로 정밀 식별 필요)
- 헤임달(테스터): `claude-sonnet-4-6` — test assertion/docstring 갱신 (haiku 미사용: 금지 assertion 회피 정밀도 필요)
- 팀장(오딘): Opus — 충돌 경로 식별·정확 라인 지정·통합 검증·L1 관측·보고

## 게이트

- G1(설계): affected_files 2개 = expected_files 2개 일치, 다른 팀/파일 겹침 0.
- G2(구현): 헤임달 기능 테스트 + 팀장 통합 pytest(2775/2760/2721) + L1 exit-code 실관측 PASS.
- G3(머지): **merge 금지 task** — PR 갱신만. ANU 독립검증 → fresh-head Gemini → CI 경로로 위임.

## 자기검증(인지)

- diff `git diff --stat` 직접 관측: 정확히 2파일·4줄(+4/-4). 다른 `return 0` grep 무손상 확인.
- L1에서 QC PASS가 아닌 **실제 exit code(쉘 $?=1)** 를 직접 관측 — 절차검증 아닌 실동작 검증.
