# task-2561 context notes

## Track D diagnosis 근거

- 근거 파일: `memory/events/baseline-noise-diagnosis.20260512T142519Z.json`
- classification: `MIS_SCOPED_TEST`
- introducing commit: `37d52f42d4bdfe4f24e4493ff275088dfda1b2d2` (task-2539+1, PR #91, 2026-05-11)
- failure mechanism: `git diff --name-only origin/main..HEAD` 결과를 task-2539+1 의 7-paths whitelist 와 강제 비교 → 모든 non-task-2539+1 branch deterministic FAIL
- 영향 받은 task: task-2550, task-2557, task-2550+1 baseline 에서 이미 인용된 baseline noise

## 회장 §명시 우선순위 (Track B 2순위, 2026-05-12)

1. **Option A 우선** — scope-guard 추가
2. **Option B 허용** — fixture 정적 비교
3. **Option C 최후 수단** — test 삭제 (우선 선택 금지)

채택: Option A primary + Option B 보조 fixture/회귀.

## scope-guard 설계

다음 셋 중 하나만 true 여도 in-scope (관대한 OR):

1. `os.environ.get("TASK_ID") == "task-2539+1"` — dispatch.py 가 worktree 진입 시 설정하는 env
2. 현재 git branch 가 `task/task-2539+1` prefix — branch name pattern 매칭
3. worktree dir basename 이 `task-2539+1` 포함 — `.worktrees/task-2539+1-*` 패턴

→ 셋 다 false 면 deterministic `pytest.skip(reason)` (no live `git diff`, no flake)

## baseline_noise_repro_2561.json 설계

- `task_ref`: "task-2561"
- `source_test`: file + function + line_range
- `classification`: "MIS_SCOPED_TEST"
- `allowed_paths_hardcoded`: 7 paths (diagnosis 와 1:1)
- `failure_mechanism`: diagnosis summary
- `repro_cases`:
  - `in_scope_clean_diff`: in-scope + diff in ALLOWED_PATHS → expect PASS
  - `out_of_scope_branch`: out-of-scope + arbitrary diff → expect SKIP (deterministic)
  - `in_scope_forbidden_path`: in-scope + diff with forbidden path → expect AssertionError
- 정적 fixture (live git 의존 0) → CI / 후속 branch 에서 deterministic

## 4 회귀 테스트 (mis-scoped noise 영구 박제)

1. `test_baseline_noise_fixture_2561_present_and_well_formed` — fixture 존재 + 필수 키
2. `test_clean_origin_main_skipped_outside_task_2539plus1_scope` — env 모두 빈 값 → SKIP
3. `test_clean_origin_main_runs_under_task_2539plus1_scope_with_clean_diff` — env=task-2539+1 + diff stub clean → PASS
4. `test_clean_origin_main_in_scope_detects_forbidden_path` — env=task-2539+1 + diff stub forbidden → AssertionError (보호 의도)

## subprocess.run / monkeypatch 전략

- `subprocess.run` 자체를 monkeypatch 로 stub 하여 deterministic diff 출력 주입
- `os.environ.get` 도 monkeypatch 로 deterministic 처리

## 후속 영향

- PR #110 / task-2550+1 같은 후속 worktree 에서 `test_clean_origin_main_base_assertion` SKIPPED → baseline noise 0
- task-2557 / task-2550 등 과거 task 가 baseline 으로 인용하던 노이즈 종결
- Track A (task-2560) FUC-4 / Track C (task-2562) G4 영역과 PR 분리 — 회장 §명시 forbidden

## 14단계 표준 14단계

1. cokacdir current time / task spec 읽기
2. worktree create (`task-2561-dev2`)
3. plan/context/checklist 작성
4. test 수정 + fixture 신설
5. pytest 회귀 검증
6. BOT identity commit
7. push to origin
8. BOT PR 생성 (admin override 0)
9. Gemini fresh review (owner_trigger 또는 scheduler 자동)
10. unresolved 0 확인
11. CI 11/11 통과
12. CLEAN 상태 확인
13. BOT squash merge (admin override 0)
14. post-merge smoke + reconcile + 보고서 + .done
