# task-2628+1 — TEST_HARNESS_PORTABILITY_GAP_REMEDIATION (import isolation worktree-portable fix)

- **task_id**: task-2628+1
- **work_level**: Lv.2 (single test file micro-remediation + clean isolated worktree 검증)
- **dispatched_by**: ANU (회장 판정 2026-05-21 — task-2628 closeout NOT READY → micro-remediation 별도 진행)
- **assignee**: dev6 페룬 (anu_v3 dependency closure context 연속 — task-2627/2628)
- **base_commit**: d8ea371f (task-2628 산출물 · anu_v3 12 dependency + test 포함)
- **base_docs**:
  - memory/events/task-2628.clean_isolated_closeout.json (ANU 검증 — test_02a 실패 진단)
  - memory/events/task-2627.anu_v3_dependency_closure_audit.json

---

## 0. PRE-DISPATCH SPEC (회장 verbatim 박제 · D-SPEC-EXACTNESS · paraphrase 금지)

회장 판정 (2026-05-21):

> 현재 clean isolated finish path 결과를 CLOSEOUT_READY로 인정하지 않는다.
> 이유: clean isolated worktree에서 regression이 8/8이 아니라 7/8 FAIL했다. 실패한 test_02a는 이번 task의 핵심인 conftest false-pass 차단 / import isolation 검증에 해당한다. /tmp에서 8/8 PASS가 나왔더라도, clean isolated worktree에서 실패한 이상 ANU_V3_DEPENDENCY_READY_ACCEPTED로 closeout하면 안 된다.
> 최종 상태: ANU_V3_DEPENDENCY_READY_PARTIAL / TEST_HARNESS_PORTABILITY_GAP
> 다음 조치: test_02a import isolation regression을 수정하는 micro-remediation task를 별도로 진행하라.

회장 verbatim 목표:

> hardcoded SRC=/home/jay/workspace 제거만으로 import isolation을 판단하지 말고, pytest rootdir/worktree root가 sys.path에 들어가도 false-pass가 발생하지 않도록 테스트를 고쳐라. 핵심은 anu_v3가 없는 환경에서는 반드시 import failure가 발생하고, anu_v3 12개 closure만 주입한 환경에서는 import가 통과하는 것을 검증하는 것이다.

---

## 1. 결함 진단 (ANU 확정 — root cause)

- 파일: `tests/regression/test_anu_v3_dependency_isolation_2628.py`
- 함수: `_isolated_import` (L119-149) 의 sys.path 필터링이 결함.
  ```
  kept = [p for p in saved_path if os.path.realpath(p or ".") != os.path.realpath(SRC)]
  sys.path[:] = [tmp] + kept
  ```
  → 하드코딩 `SRC=/home/jay/workspace`(L37) 와 일치하는 경로만 제거. pytest 가 worktree root / rootdir 를 sys.path 에 prepend 하면 그 경로(= anu_v3 포함)가 `kept` 에 잔존 → 빈 closure tmp 에서도 `anu_v3` 가 worktree 경로로 해소 → `_isolated_import` 가 None(성공) 반환 → test_02a `assert err is not None` 실패.
- 증상: clean isolated worktree(/home/jay/.cokacdir/workspace/iso-closeout-2628) 에서 실행 시 test_02 FAIL (7/8). /tmp 중립 실행·메인 workspace 실행 시 8/8. 즉 테스트가 anu_v3 와 같은 트리에 위치+그 트리에서 실행될 때만 발생하는 환경 의존(non-portable).
- production anu_v3 12 모듈 import 동작은 결함 아님(전 컨텍스트 동일·clean). 본 task = **테스트 하니스 이식성 수정만**.

---

## 2. 필수 구현 방향 (회장 verbatim · 6항목)

1. import isolation test에서 /home/jay/workspace뿐 아니라 current worktree root / pytest rootdir / repo root 후보를 모두 제거하거나
2. subprocess를 완전한 tempdir에서 실행하고 PYTHONPATH를 명시적으로 제어하거나
3. importlib를 쓰되 sys.path를 allowlist 방식으로 재구성하라.
4. empty closure 환경에서는 anu_v3 import가 반드시 ModuleNotFoundError가 되어야 한다.
5. closure 환경에서는 anu_v3 12개만으로 callback dependency import가 통과해야 한다.
6. conftest.py sys.path 주입에 의존하면 FAIL로 판정하라.

### 2.1 구현 권고 (anchor · 봇 최종 판단)
- 가장 hermetic 한 경로는 #2(subprocess + 명시 PYTHONPATH) 또는 #3(allowlist: sys.path 를 `[tmp] + stdlib-only` 로 재구성, repo/worktree/cwd/rootdir 후보 전부 배제).
- subprocess 채택 시: `subprocess.run([sys.executable, "-c", "import anu_v3.runtime_reconcile_checkpoint"], cwd=<empty_tmp>, env={"PYTHONPATH": <closure_tmp or empty>}, ...)` 로 in-process sys.path 누수 원천 차단. empty closure → returncode!=0 + ModuleNotFoundError, full closure(12) → returncode==0.
- allowlist 채택 시: stdlib 경로 식별은 `sysconfig.get_paths()` / `sys.base_prefix` 기준. cwd("")·repo root·worktree root·SRC·rootdir 후보를 명시적으로 모두 배제.
- 수정 범위 최소화: `_isolated_import` 및/또는 test_02a 한정. test_01/03/04/05/06/07 의 통과 의미 변경 금지(기존 검증 강도 유지).

---

## 3. ★ clean isolated worktree 검증 (HARD GATE — 회장 핵심)

수정 후 반드시 **3개 컨텍스트 전부 8/8** 확인 (단순 main workspace 8/8 으로 불충분):
1. **clean isolated worktree** (origin/main 4187332c base + d8ea371f 13 files 중 test 는 FIX 버전) 에서 `pytest tests/regression/test_anu_v3_dependency_isolation_2628.py` → **8/8 PASS** (이전 실패 시나리오 재현 환경)
2. **/tmp 중립** (workspace conftest 미적용) → 8/8 PASS
3. **메인 workspace** → 8/8 PASS
- 특히 (1) 이 본 task 의 핵심 합격선. (1) 8/8 아니면 완료 판정 금지.

---

## 4. 작업 환경 (foreign dirty 회피)

- **fresh worktree 권장**: `git worktree add <path> d8ea371f` (d8ea371f commit 기준 → 메인 workspace 의 uncommitted foreign dirty 5건 부재한 clean 트리). 여기서 test 수정·검증·micro-commit.
- 메인 workspace 의 foreign dirty 5건(memory/specs ×3 + utils/replacement_pr_runner.py + tests/regression/test_replacement_pr_runner_2510.py)은 **건드리지 말 것**.
- finish-task GIT-GATE 가 메인 workspace foreign dirty 로 차단되면 → **FOREIGN_DIRTY_BLOCKER** 로 분류(task-2628 패턴 동일)·반복 루프 금지·micro-commit + reflection-ready 보고로 종료. (finish-task GIT-GATE 미스파이어 = feedback_finish_task_shared_branch_gate_misfire_260521)

---

## 5. expected_files

1. `tests/regression/test_anu_v3_dependency_isolation_2628.py` (test_02a / _isolated_import 이식성 수정 — 유일 변경 파일)

추가 산출:
- `memory/events/task-2628+1.result.json` (callback contract 9 fields + 7항목 보고 + 3-context regression 결과)
- `memory/reports/task-2628+1.md`

---

## 6. 금지 (회장 verbatim · 7항목)

- d8ea371f를 closeout accepted로 승격 금지
- write-tree만으로 finish 완료 판정 금지
- callback reflection 진행 금지
- push/PR/merge 금지
- foreign dirty 5건 정리 금지
- replacement_pr_runner 수정 금지 (utils/replacement_pr_runner.py + test_replacement_pr_runner_2510.py)
- production enforcement 완료 판정 금지

추가 금지(기존 doctrine):
- anu_v3 12 production 파일 내용 수정 금지(blob 동결 — 본 task 는 test 하니스만)
- self-collector 결과 authoritative 승격 금지
- 문서/report 만으로 완료 처리 금지
- hook 우회(--no-verify) 금지

---

## 7. 완료 보고 (회장 verbatim · 7항목)

result.json + report 가 답변:
1. test_02a 실패 원인
2. 수정한 import isolation 방식
3. clean isolated worktree regression 결과 (8/8 여부 — §3 (1))
4. /tmp neutral regression 결과
5. conftest false-pass 차단 증거
6. d8ea371f 또는 후속 micro commit diff
7. ANU_V3_DEPENDENCY_READY_ACCEPTED 가능 여부

---

## 8. callback contract (필수 — self-key 위험 인지)

본 task callback runtime enforcement(task-2627) 가 main 미반영이므로 self-key 위험 잔존:
- 봇은 normal callback 을 **ANU key(c119085addb0f8b7) 전용** 발사 시도. executor self-key(1e41a2324a3ccdd0) 면 fail-closed → collector 결과 NON_AUTHORITATIVE → ANU 독립 재검증.
- callback prompt **envelope-only · UTF-8 ≤3900 bytes** (초과 시 CALLBACK_PROMPT_TOO_LARGE fail-closed).
- result.json 에 callback contract 9 fields 기록: callback_prompt_utf8_bytes, callback_prompt_chars, callback_cron_id, callback_registration_status, callback_role("COLLECTOR_ANU"), envelope_only_compliance, fallback_prompt_utf8_bytes, fallback_safety_net_registered, fallback_safety_net_role_single_purpose("RECOVERY_ONLY_NO_FINAL_REPORT_TRIGGER").
- callback envelope: task_id=task-2628+1 / result_path / report_path / sha256 / collector_role=ANU / owner_key=c119085addb0f8b7 / canonical_root=/home/jay/workspace / summary.

---

## 9. 판정 기준

- §3 (1) clean isolated worktree 8/8 + (2) /tmp 8/8 + (3) main 8/8 전부 충족 시에만 "test fix verified".
- conftest.py sys.path 주입에 의존해 통과하면 FAIL.
- empty closure 에서 anu_v3 import 가 ModuleNotFoundError 가 아니면 FAIL.
- full closure(12) 에서 import 통과 안 하면 FAIL.
- Critical7 / credential expansion / forbidden path 발생 시 즉시 CHAIR_HOLD.
- 위 충족 시 "ANU_V3_DEPENDENCY_READY_ACCEPTED 가능" 으로 보고(최종 ACCEPT 판정은 ANU 독립 재검증 후 회장).

---

## doctrines (필수)

- D-SPEC-EXACTNESS (회장 금지/목표 verbatim 보존)
- baseline 3-way blob 재검증 (feedback_audit_baseline_3way_blob_verify_260521)
- per-task diff 기준 검증 (main..HEAD divergence 금지)
- fresh worktree clean base (foreign dirty 회피 · feedback_finish_task_shared_branch_gate_misfire_260521)
- BOT App token 부재 → 로컬 micro-commit + reflection-ready (project_no_bot_app_token_local_only_completion_260521)
- callback ANU self-key 전용 (feedback_callback_self_key_helper_not_wired_260521)
- attempt-1 only · spec drift/baseline 불일치 시 HOLD + 회장 escalate

---

## allowed_resources (본 task의 capability)

```yaml
allowed_resources:
  paths:
    - "tests/regression/test_anu_v3_dependency_isolation_2628.py"
    - "memory/events/task-2628+1.result.json"
    - "memory/reports/task-2628+1.md"
    - "memory/tasks/task-2628+1.md"
  forbidden_paths:
    - "anu_v3/**"
    - "dispatch/**"
    - "utils/replacement_pr_runner.py"
    - "utils/merge_queue_executor.py"
    - "tests/regression/test_replacement_pr_runner_2510.py"
    - "memory/specs/**"
    - "memory/tasks/task-2619.md"
    - "memory/events/task-2625.*"
    - "anu_v2/**"
    - ".github/**"
    - ".env*"
    - "*.pem"
    - "*.key"
  commands:
    - "pytest"
    - "python3 -m py_compile"
    - "ruff"
    - "git"
  merge_policy: "manual"
  ttl_hours: 24
```

> 주: anu_v3/** 와 dispatch/** 를 forbidden 에 둔 이유 = 본 task 는 test 하니스 한 파일만 수정. 단 test 가 anu_v3/dispatch 를 import/copy 해 검증하는 것은 read 이며 허용(수정 0).

## 10. 산출물

- `tests/regression/test_anu_v3_dependency_isolation_2628.py` (이식성 수정 micro-commit)
- `memory/events/task-2628+1.result.json` (9 fields + 7항목 + 3-context regression)
- `memory/reports/task-2628+1.md`
- 로컬 micro-commit (push/PR/merge 0 · 회장 승인 대기)

끝

## goal_assertions (auto-generated)
- `pytest tests/regression/test_anu_v3_dependency_isolation_2628.py`
