# task-2729+14 — POST_PR189_ACTIVATION_INTEGRATION_SIM 결과 보고

- 팀: dev3-team (다그다 팀장 / 루 백엔드 구현)
- 레벨: Lv.3 (isolated integration simulation — production activation 아님)
- 대상 커밋: origin/main `0307748b` (#189 sealed-key launcher_fn wiring)
- 판정: **`POST_PR189_ACTIVATION_INTEGRATION_SIM_PASS_ACTIVE_FALSE`** (로컬 verify)
- 일자: 2026-06-07

## SCQA 요약

- **S(상황)**: #189 머지로 driver `main()` = `build_launcher_fn(CANONICAL_ROOT)` → `scan_once(launcher_fn=...)`
  결선 완성. flag-on + sealed key 시 launcher_fn = `partial(launch_wake, dry_run=False, anu_key_verifier=compare_digest)`.
- **C(복잡성)**: 단위는 통과했으나 flag-on **통합 경로**(scan_once → build_launcher_fn → pickup WAKE_BUILT →
  launch_wake) 를 isolated 환경에서 end-to-end 로, 특히 sealed key 5종 각각의 귀결을 canonical 무손상·
  real spawn 0 으로 재현한 적이 없었다.
- **Q(질문)**: canonical 무손상 + real spawn 0 + ACTIVE=false 로 flag-on 통합 경로를 어떻게 재현/검증?
- **A(답)**: isolated temp DATA root(tempfile) 에서만 flag/real_wake/epoch 생성, legacy 140(pre-epoch) +
  canary 1(post-epoch) 합성, `scan_once(legacy_cutoff=True, launcher_fn=build_launcher_fn(...))` 구동.
  real spawn 은 build_launcher_fn 의 `launch_wake_fn` seam 으로 mock runner 강제 + 전역 subprocess
  sabotage(RuntimeError) 이중 차단.

## 생성 파일 (정확히 5 — EXPECTED FILES 준수)

1. `scripts/harness/v36/post_pr189_activation_integration_sim.py` — isolated temp 통합 sim 하니스(CLI, real spawn 0)
2. `tests/regression/test_post_pr189_activation_integration_sim_2729p14.py` — 회귀 17 케이스
3. `memory/reports/task-2729+14.md` — 본 보고서
4. `memory/plans/p0b-pickup/post_pr189_activation_integration_sim_design_260607.md` — 설계
5. `memory/plans/p0b-pickup/post_pr189_activation_integration_sim_evidence_260607.json` — 하니스 JSON evidence

> driver/runner/launcher 3모듈 **무변경**(git diff dispatch/ = 빈 diff 확인). canonical flag/epoch/result.json 0 터치.

## 테스트 결과

- pytest: **17 passed / 0 failed** (0.18s)
  - legacy_140_all_noop_skip / canary_wake_built_enters_launcher / sealed_a~e(5종) / dedupe×2 /
    terminal_marker×2 / failsafe×2 / no_key_literal×2 / temp_only_no_canonical_write / harness_run_sim_pass
- 하니스 CLI: `status=PASS`, exit 0, verdict `POST_PR189_ACTIVATION_INTEGRATION_SIM_PASS_ACTIVE_FALSE`
  - legacy_skip=140 (전부 NOOP_LEGACY_SKIP, quarantine/processed 0, 원본 잔존)
  - canary=WAKE_BUILT, launcher 진입 1회 (mock, real subprocess 0)
  - sealed: a=LAUNCHED(mock) / b=launcher None + SEALED_KEY_MISSING / c,d,e=FAIL_CLOSED_NON_ANU_KEY
  - real_spawn=0, canonical_touched=false

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

- **서버 재시작**: 해당없음 (서버형 작업 아님 — isolated sim 하니스/회귀)
- **API 응답 확인**: 해당없음 (API 작업 아님). 대체로 하니스 CLI 실제 실행으로 L1 충족:
  `python3 scripts/harness/v36/post_pr189_activation_integration_sim.py --json` → exit 0, status PASS
- **스크린샷**: 해당없음 (프론트 작업 아님)
- L1 충족 근거(subprocess/정제 작업 유형): 실제 프로세스 실행(하니스 CLI) + 결과 JSON 파일 생성/내용 확인
  (`memory/plans/p0b-pickup/post_pr189_activation_integration_sim_evidence_260607.json`).

## 필수 확인 10 (회장 verbatim 대응)

1. **CODE_ROOT=origin/main 0307748b** — `git log -1` = `0307748b task-2729+13 ... (#189)` 동기화 확인. ✔
2. **DATA root=isolated temp만** — 모든 root 인자 = `tempfile.mkdtemp()` / pytest `tmp_path` 하위. ✔
3. **temp 안에서만 flag/real_wake/epoch 생성(canonical 0)** — temp/memory/state/* 만 생성, canonical
   memory/state/** 0 터치. ✔
4. **legacy 140 equiv NOOP_LEGACY_SKIP·이동 0** — 140건 전부 NOOP_LEGACY_SKIP, quarantine/processed 0,
   원본 잔존. ✔
5. **canary 1건 WAKE_BUILT→launcher_fn 진입** — process_one verdict=WAKE_BUILT, launcher_fn 1회 진입
   (mock launch_wake_fn). ✔
6. **sealed 5종 각 별도 fail-closed** — (a)present→LAUNCHED(mock) / (b)absent→build_launcher_fn None +
   pickup_once SEALED_KEY_MISSING / (c)invalid verifier→FAIL_CLOSED_NON_ANU_KEY / (d)verifier exception→
   FAIL_CLOSED_NON_ANU_KEY / (e)non-callable verifier→FAIL_CLOSED_NON_ANU_KEY. 각 별도 케이스 검증. ✔
7. **subprocess/os.system sabotage/mock만** — autouse fixture + 하니스 전역 monkeypatch 로
   subprocess.run/Popen/call/os.system → RuntimeError. mock runner만 사용. ✔
8. **real ANU spawn 0** — real_spawn=0. 첫 launch_wake 이전부터 sabotage 강제. ✔
9. **raw key/full argv 출력 0** — 더미 키(SEALEDKEY/ANUKEY123/WRONGKEY_FAKE)만 사용. LaunchRecord/
   DriverRecord to_json 에 argv/key literal 부재, argv_len(정수)만. 출력에 키 literal 0. ✔
   - 비고: `.env.keys` 는 dispatch 모듈 **import-time read** 1회만 발생(읽기, canonical mtime 불변).
     실제 키는 어떤 argv 에도 미진입(case b 는 argv None). provision/기록 0.
10. **canonical(flag/epoch/result.json/task-2716) 무손상·ACTIVE=false** — canonical `/home/jay/workspace`
    mtime 불변(1780839576 동일), dispatch/ diff 0, task-2716 무수정, ACTIVE=false 유지. ✔

## 금지사항 준수

systemctl enable 0 / production ACTIVE 전환 0 / canonical activation_epoch 생성 0 / real ANU spawn 0 /
canonical result.json 이동·삭제 0 / canonical reset·clean·stash·checkout 0 / task-2716 수정 0 /
G4 counter reset 0 / ACTIVE=true 선언 0 / PR push·merge·comment 0 / raw key 출력 0. 전부 준수.

## 발견 이슈 및 해결

- **이슈**: `scan_once` 기본 `MAX_FILES=50` 상한으로 legacy 140건 중 50건만 처리되고 나머지가
  `NOOP_MAX_FILES_DEFER` 로 기록됨.
- **해결**: 하니스/테스트에서 `max_files=200` 명시 전달로 140건 전수 처리. record 카운트 시 빈
  result_path(`NOOP_MAX_FILES_DEFER`) 제외 로직 추가. 재실행 후 140건 전부 NOOP_LEGACY_SKIP 확인.

## 모델 사용 기록

- 다그다(팀장, Opus): 설계·검토·통합·검증 (직접 코딩 0 — 토큰 절감 doctrine 준수)
- 루(Lugh, 백엔드, Sonnet): 하니스 + 회귀 테스트 2개 파일 구현 — haiku 미사용(보안 민감 통합 검증)

## 머지 판단

- **머지 필요**: No (이번 라운드 = isolated integration sim 구현+검증까지. PR 생성/Gemini gate/merge/
  activation = 별도 회장 승인 전까지 0.)
- **워크트리**: CODE_ROOT=`/home/jay/p0b-pickup-main` detached HEAD @ 0307748b (신규 3파일 + 보고서 + evidence).
- **머지 의견**: 산출물은 read-only 모듈 무변경 + isolated temp + mock/sabotage 로 canonical 무손상.
  PR/activation 은 회장 승인 이후 별도 진행.

## process caveat 인지

본 task 도 finish-task 시 EXTERNAL_DIRTY_BLOCKER(canonical dirty)로 .done/callback 이 막힐 수 있다.
그 경우 task 실패 아님 — ANU 가 CODE_ROOT diff 기준 독립검증으로 회수. callback 미발사 시 별도 환경
블로커로 분리 기록한다. normal callback 성공 과장 금지.
