---
task_id: task-2430
type: context
scope: task
created: 2026-05-03
updated: 2026-05-03
status: completed
---

# 맥락 노트: task-2430

**task**: task-2430

---

## 결정 근거

### 결정 1: Phase A 핫픽스를 `server/tests/__init__.py` 삭제 + `server/conftest.py` 추가로 결정

- **분석**: InsuRo 루트 `tests/`와 `server/tests/` 모두 pytest의 `tests` 패키지로 인식되어 충돌. server/tests/__init__.py가 존재할 때 pytest의 prepend import mode가 `tests.conftest`를 server/tests/conftest.py로 매핑하려 하지만 sys.path에 server가 없어 실패.
- **검증**: `mv server/tests/__init__.py /tmp/...` 후 root pytest 실행 → 31 errors → 694 collected, 0 errors로 즉시 해소.
- **대안과 기각 이유**:
  - **옵션 A** (pyproject.toml `--import-mode=importlib`): 토르 진단 시 추천했으나, allowed_resources에 root pytest 설정 파일이 없고 pytest 내부 import 모드 변경은 다른 테스트 영향 가능. 좀 더 침습적.
  - **옵션 C** (server/scripts/__init__.py 추가): 토르의 server-단독 진단으로 별개 에러(`tests.test_standby_fallback`) 해소책. 사고 본질(root에서 pytest 실행 시 `tests.conftest`)과 무관.
  - **옵션 B** (server/conftest.py + server/tests/__init__.py 삭제): 가장 minimal. server/conftest.py는 sys.path 보정 안전망 역할만 하며, __init__.py 삭제가 진짜 fix.

### 결정 2: Phase B/C는 task 명세를 거의 그대로 따름 (smoke 1건, baseline pre-flight)

- **분석**: SCOPE_MAP 미매치 시 smoke 1건만 실행은 false negative 위험이 있다는 Codex 우려가 있었으나, 회장 task 본문에 명시된 의도("full sweep 금지")를 따름. 공용 영역 변경의 경우 보수적 보호 < 무차별 revert 차단 우선.
- **baseline pre-flight**는 PR 책임/사전 결함 분리. probe FAIL 시 머지 직전 sha로 checkout하여 동일 fail 확인 후, 둘 다 fail이면 사전 결함으로 판정 → revert 차단 + `.probe-baseline-fail` 마커.

### 결정 3: 두 영역 별도 commit/PR (workspace 직접, InsuRo PR #100)

- **분석**: workspace는 시스템 인프라 (직접 main commit + push), InsuRo는 별도 git repo (worktree + PR). task의 이중 영역 작업 본질상 분리 불가피.
- **셀프 검증 보장**: 본 task의 changed_paths가 `_resolve_test_scope`에 통과되면 `server/tests/` + `tests/scripts/`가 매치 → server/tests 663 tests + 회귀 테스트 7 모두 실행 → revert 안 일어남 (메타).

## 3 Step Why 자문

- **1st Why**: 왜 이 설계(scope-aware probe)가 필요한가?
  - **A**: 사고 시점의 무딘 scope (모든 PR이 server/tests fail에 노출) 때문에 환경 결함 1건이 모든 익스텐션/디자인 PR을 무차별 revert. 즉 sigle point of failure를 분산해야 함.

- **2nd Why**: 왜 SCOPE_MAP + baseline pre-flight 조합이 최선의 접근인가?
  - **B**: SCOPE_MAP은 변경 영역과 검증 영역을 1:1 매핑하여 "관련 없는 fail" 자체를 차단. 그러나 SCOPE_MAP만으로는 `server/` PR + server 사전 결함 시 여전히 무차별 revert 가능 → baseline pre-flight로 PR 적용 전후 비교하여 PR 책임/사전 결함 분리. 두 layer 결합으로 false positive를 두 차원에서 차단.

- **3rd Why**: 왜 B가 다른 대안(전체 차단 / 실행 안 함 / 전체 sweep)보다 나은가?
  - **C**:
    - "auto_revert 비활성화" 대안: 정당한 회귀 PR도 통과 → 메인 오염 누적, 결국 더 큰 사고.
    - "전체 sweep 그대로 + 환경 결함만 fix": fix 누락된 새 환경 결함이 또 발생할 때 동일 사고 재발. 즉 근본 처방 아님.
    - "수동 검증으로 회피": 자동화 인프라의 가치 상실.
    - **B**는 자동화 유지하면서 false positive를 두 layer (SCOPE + BASELINE)로 분산 차단 → 회귀 보호도 유지 + 사고 재발도 차단 + 인간 개입 최소화.

✅ A-B-C 논리 일관: 무차별 revert 차단 → SCOPE+BASELINE 두 layer → 자동화 + 회귀 보호 동시 달성.

## 참조 자료

- task 명세: `/home/jay/workspace/memory/tasks/task-2430.md`
- 사고 commit (InsuRo): `f64bcb1` (task-2423 revert), `9ceed5c` (task-2429 revert)
- audit log: `/home/jay/workspace/memory/audit/auto-merge.log` (sequence 16-20)
- 토르 Phase A 진단 결과 (이 task 1차 분석)
- 마아트 독립 검증 결과 (이 task G2 검증)
- Codex G1 결과: `/home/jay/workspace/memory/events/task-2430.codex-gate`
- 회장 4-Layer 진단 (task 본문)

## 주의사항

- post_merge_probe.py의 baseline 분기는 git stash + git checkout을 사용하므로, project_path가 dirty working tree여도 안전하지만 finally로 원복 보장 필수 (구현 검증됨).
- SCOPE_MAP 미매치 시 smoke 디렉토리(`tests/smoke/`)가 존재하지 않으면 `_run_tests_scoped`는 (True, "no scoped test target — skipped") 반환. 이는 의도된 fail-open (false positive 차단 우선).
- InsuRo의 server/conftest.py는 sys.path 보정만 수행. 핵심 fix는 `__init__.py` 삭제. conftest.py 단독으로는 root pytest 실행 시 fix 불충분 (이미 검증함).
