# task-2553+14 — TEST_LOADER_SYS_MODULES_REGISTRATION_HARDENING (Track B, 회장 병행 GO, 코드/파일 자동화)

> **Lv**: Lv.3 — 테스트 헬퍼 하드닝 + 재현/regression. **Executor**: dev6-team 페룬 (key 1e41a2324a3ccdd0) 1회 한정. **TTL**: 2h.
> **상태**: 회장 병행 결정 — Track B. task-2553+12 post-hold-diagnosis 가 root cause 확정. 본 task = `_load_otp()` 테스트 헬퍼의 sys.modules 등록 누락(py3.12 dataclass false-negative) 보강 + 재현 + 방지 regression 을 **코드/파일 자동화**로. 문서화만 금지.
> **병행**: Track A(task-2553+13, reconcile/closeout)와 SAFE_PARALLEL — A 완료 비대기, A 의 harness-artifact classification 을 **뒤집지 않음**(B 는 헬퍼 보강만, 분류 전제 고정). parallel_shard_plan: `memory/events/task-2553-parallel-shard-plan_260517.json`.

---

## 1. 확정 전제 (task-2553+12 post-hold-diagnosis — 변경 불가 입력)

- root cause: `tests/regression/test_owner_trigger_2553_plus1_high_fix.py` 의 `_load_otp()` 헬퍼(및 runner import 1-liner)가 `importlib.util.spec_from_file_location` 로 모듈 exec 시 `sys.modules[name] = mod` 등록 생략 → Python 3.12.3 `@dataclass` 처리(dataclasses.py:749 `sys.modules.get(cls.__module__).__dict__`)가 합성 spec 모듈명 부재로 None → `None.__dict__` AttributeError.
- 영향: F1 케이스 3건(`test_allowed_comment_body_is_exactly_gemini_review` / `test_args_allowlist_rejects_foreign_endpoint` / `test_args_allowlist_rejects_foreign_body`) — `_load_otp()` 경유 FAIL. 스트리밍 4건 — `_load_otp_streaming()` 경유 PASS(영향 없음).
- 머지된 운영코드(`anu_v2/owner_trigger_pat.py` @ d08b8b0e)는 **정상**(CI 11/11 + 독립재현 입증) — 본 task 는 운영코드 미접촉, 테스트 헬퍼만 보강.

## 2. 목표 (회장 verbatim)

`_load_otp()` 테스트 헬퍼가 importlib exec 시 sys.modules 등록을 누락해 Python 3.12 dataclass false-negative 를 내는 문제를 보강한다.

## 3. 작업 환경·필수 산출 (전부 실행파일/JSON)

- **작업 기준**: origin/main post-merge HEAD `d08b8b0efa4d44fea99f1e5e391c1a18695e85f6` 의 **isolated worktree**(`git worktree add <iso> d08b8b0e`). live `/home/jay/workspace` 미접촉. push·PR·merge **미승인**(산출 = 코드+테스트+evidence+패치 캡처, landing 은 별건 회장 결정).
1. `memory/events/task-2553+14.repro.json` — 보강 전 py3.12 dataclass false-negative **결정적 재현**(명령·3 FAIL/4 PASS·AttributeError 스택 라인)
2. (isolated wt) `tests/regression/test_owner_trigger_2553_plus1_high_fix.py` — `_load_otp()`(및 동류 import 헬퍼)에 `sys.modules[spec_name] = mod` 등록 추가(최소 수정, 기존 assertion·streaming 헬퍼 무변, F1 3건 GREEN 복원)
3. `tests/regression/test_load_otp_sysmodules_2553plus14.py` — 신규 regression: ① 보강 후 F1 3건 PASS ② sys.modules 등록 정적/런타임 assert ③ smoke false-negative 방지 가드(미등록 시 검출)
4. `memory/fixtures/load_otp_sysmodules_*.json` (필요 시)
5. `memory/events/task-2553+14.fix-decision.json` — 변경 범위·근거·production code 미접촉 증명·streaming 무회귀
6. `memory/events/task-2553+14.patch.diff` — 전체 변경 캡처(isolated wt diff)
7. `memory/events/task-2553+14.activation-decision.json` / `.hold-for-chair.json`(조건부) / `.result.json` / `memory/reports/task-2553+14.md` — final packet

## 4. 허용 (회장 verbatim)

_load_otp 테스트 헬퍼의 sys.modules 등록 보강 / 해당 테스트·fixture·regression 추가 / Python 3.12 dataclass import false-negative 재현·해소 / 기존 smoke false-negative 방지 regression / Codex audit + ANU-Codex adjudication / normal+fallback callback.

## 5. 금지 (회장 verbatim)

PR #128 merge/rollback/revert 관련 조작 / **task-2553+1 closeout marker 수정**(Track A 도메인) / **F1·F2 운영코드 수정** / phase3·mqe 수정 / credential·OWNER PAT 조작 / expected_files 밖 광범위 테스트 수정 / **production code 수정 필요 시 → HOLD_FOR_CHAIR**(테스트 헬퍼만 허용, 운영코드 손대야 하면 즉시 HOLD) / GitHub write·push·PR·merge(미승인) / live `/home/jay/workspace` cleanup·reset·stash·rm — 불변.

> 변경은 **테스트 인프라(헬퍼/regression/fixture)에만** 국한. `anu_v2/owner_trigger_pat.py` 등 production code byte 0 변경(diff 로 증명). Track A 의 closeout/classification marker 미접촉(parallel_shard_plan A_vs_B=SAFE_PARALLEL).

## 6. HOLD_FOR_CHAIR 조건

production code 수정 필요 / expected_files 밖 광범위 수정 필요 / py3.12 재현 불가 / 기존 테스트(streaming 4·기타 preserved) 회귀 / GitHub write 필요 / Codex HIGH·CRITICAL unresolved / ANU-Codex 반복충돌 / cross-task contamination(Track A callback 혼입). 적중 시 코드변경 0 + `task-2553+14.hold-for-chair.json` + 회장 보고.

## 7. 완료 후 최종 packet

1. 재현 결과(보강 전 3 FAIL/4 PASS + 스택) 2. 적용 변경 요약(헬퍼 sys.modules 등록) 3. 보강 후 결과(F1 3건 GREEN·streaming 4 무회귀·전체 suite) 4. production code 미접촉 증명(diff·sha) 5. 신규 regression 결과 6. patch.diff 경로 7. Codex audit + ANU-Codex adjudication 8. HOLD 여부 9. callback collector 결과(9R5) 10. Track B 단독 완결 상태(Track A 비대기·classification 불변 명시) 11. landing(PR/merge) 별건 회장 결정 대기 명시

## 8. ANU-Codex loop + callback

batch plan(§3) → Codex lint → ANU refine(필요 시 9-R) → Codex re-lint → dispatch(dev6 1회, TTL2h, callback (a) normal+fallback, 4-tuple 분리) → repro → 헬퍼 보강 → regression → post-result audit → ANU·Codex adjudication → 최종 packet → 회장 보고. 회장 중간 라우팅 0, §6 HOLD 적중 시만 보고.

## 10. 9-R — Codex lint 반영 정밀 보강 (NEEDS_REFINEMENT → 자동 수렴, agent af1216ccb48228a30: CRITICAL 0 / HIGH 2 / MED 3 / LOW 2)

### 9-R.1 (HIGH 해소) 코드 편집 = `_load_otp()` 단독 (scope 최소화)
§3.2 "`_load_otp()`(및 동류 import 헬퍼)" → **`_load_otp()` 단독으로 한정**. 추가 헬퍼 수정은 §1 root-cause evidence 로 그 헬퍼도 동일 sys.modules 미등록 결함임이 **명시 증명될 때만**(repro.json 에 해당 헬퍼 failing 증거 + 명시 열거) 허용, 그 외 헬퍼·로더(특히 `_load_otp_streaming` 등 PASS 경로) **무변경**. 변경 = 정확히 `sys.modules[spec_name] = mod` 등록 1줄 추가(최소 수정, 테스트 시맨틱 불변).

### 9-R.2 (HIGH 해소) 비열거 공유파일 접촉 = HOLD (narrow out-of-contract 차단)
§6 "expected_files 밖 광범위 수정 필요" → **§3 열거 파일 외 어떤 공유/비테스트 파일이라도 접촉 필요 시 HOLD**(범위 무관). 특히 `conftest.py`·공유 test infra·비-test 모듈·다른 helper 모듈 1byte 접촉 필요 시 즉시 HOLD_FOR_CHAIR(코드변경 0). "광범위"만 아니라 **narrow out-of-contract 도 HOLD**.

### 9-R.3 (MED 해소) streaming 무회귀 = 단일 명시 acceptance
분산 서술(§3.2·§6·§7) 통합 — **단일 acceptance**: 보강 후 `_load_otp_streaming` 경유 streaming 4 case + 기타 preserved 테스트를 **실제 재실행**하여 "4 PASS unchanged + preserved 무회귀" 를 result.json 에 명시 증거로 기록(헬퍼 불변 추론만으로 불충분, 실측 필수).

### 9-R.4 (MED 해소) production-code 무변경 증명 = 단일 표준
§5/§7 통합 — 표준: `git diff <iso_wt>` 가 production 파일(anu_v2/owner_trigger_pat.py 등) **0 변경** AND `anu_v2/owner_trigger_pat.py` sha256 가 d08b8b0e 기준값과 **동일**(재도출). diff+sha 양쪽 fix-decision.json 에 기록. 불일치 → HOLD.

### 9-R.5 (MED 해소) 산출 boundary = mandatory vs non-blocking
회장 Track B deliverable 본질 = **code+tests+evidence+patch.diff**. mandatory: repro.json / 헬퍼 보강 / 신규 regression / fix-decision.json / patch.diff. non-blocking aux: activation-decision/hold-for-chair(조건부)/result.json/report — ANU 보고 채널(누락 시 WARN, mandatory 누락 시 HOLD). callback 4-tuple(task_id=task-2553+14) 분리, Track A artifact 인용 0(cross-task contamination 시 HOLD).

→ 9-R.1~9-R.5 로 HIGH 2 + MED 3 해소(LOW 2 = §2 acceptance 집약·§8 callback 서술, aux 표기로 흡수). Codex re-lint GO_READY 시 dispatch.

## 9. task-2553 계열

+12=BOT merge SUCCESS+POST_MERGE_HOLD(smoke false-negative, root cause=_load_otp sys.modules 미등록) / +13=Track A(harness-artifact 분류+reconcile+closeout, 병행) / **+14(Track B 본건)=_load_otp sys.modules 등록 하드닝+재현+regression** / +15=Track C(policy profile, A후 직렬).
