# task-2839 보고서 — PR-D2 egress-gate 쿼리/프래그먼트 거부 fetch-spy 통합 패리티

## Situation
`isAllowedCrmUrl` egress 게이트는 이미 완성(포트 `""`/`443`·userinfo 거부·pathname exact·쿼리/프래그먼트 거부). `:444` 비표준 포트 케이스는 실제 egress 전송함수(searchCandidates/createCustomer → crmFetch)를 관통하며 fetch-spy로 "fetch 미호출"을 end-to-end 증명한다.

## Complication
Codex 3차 잔여 지적: **쿼리스트링/프래그먼트 거부는 boolean helper(`isAllowedCrmUrl()`)로만** 증명되고, `:444`처럼 실제 전송 경로를 관통하지 않아 **통합 레벨 패리티 미달**(실 리스크 아님 — 테스트 완결성 문제).

## Question
`:444` 테스트와 동일한 fetch-spy 하네스로 쿼리/프래그먼트 케이스도 전송함수를 관통시켜 fetch 0회를 증명할 수 있는가? (test-only — 소스 변경 0)

## Answer
`extension/__tests__/prd2-crm-egress-gate.test.ts`에 통합 테스트 2건 추가. 기존 파일 6건 → 8건, 확장 전체 378 → 380건. 소스 변경 0.

---

## 수정 파일 목록
- `extension/__tests__/prd2-crm-egress-gate.test.ts` (+43 lines, append only)
  - 신규 describe: `쿼리스트링/프래그먼트 허용경로 → egress 전송 함수 관통 시에도 fetch 미호출(통합)`
  - it 1 (쿼리스트링 통합): `searchCandidates`를 `CRM_PROD_ORIGIN + CRM_SEARCH_PATH + "?x=1"` 로 유도 → `{ok:false, code:"URL_NOT_ALLOWED"}` + `fetchSpy` 0회
  - it 2 (프래그먼트 통합): `createCustomer`를 `CRM_PROD_ORIGIN + CRM_CREATE_PATH + "#frag"` 로 유도 → `{ok:false, code:"URL_NOT_ALLOWED"}` + `fetchSpy` 0회
  - `:444` 테스트와 동일한 `vi.fn` fetch-spy 하네스(beforeEach/afterEach globalThis.fetch 교체) 재사용

## 소스 미변경 증명
```
 extension/__tests__/prd2-crm-egress-gate.test.ts | 43 ++++++++++++++++++++++++
 1 file changed, 43 insertions(+)
```
background/, content.js, src/, server/, .github/ 등 forbidden_paths 소스 파일 diff 0건. `merge_policy: none` 준수(머지 금지).

## 테스트 결과
- 대상 파일: **Test Files 1 passed, Tests 8 passed** (기존 6 + 신규 2, fetch spy 0회 단언 포함)
- 확장 전체 회귀: **Test Files 16 passed, Tests 380 passed** (378 → 380), 실패 0
- 명령: `npx vitest run extension/__tests__/`

## L1 스모크테스트 결과
test-only 작업(vitest 유닛 테스트 추가, 실행 가능 소스/서버 변경 없음). 서버/브라우저 대상 없음.
- 서버 재시작: 해당없음 (프로덕션 소스·서버 코드 변경 0, test 파일만)
- API 응답 확인: 해당없음 (API 경로 변경 없음)
- 스크린샷: 해당없음 (프론트 변경 없음)
- **실동작 검증(L1 대체)**: `npx vitest run` 실제 실행으로 신규 2건 + 전체 380건 PASS 확인 (아르고스 보고 + 팀장 직접 재실행 교차검증). fetch-spy call count 0 단언이 실제 전송함수(crmFetch) 관통 후 통과됨을 실증.

## 발견 이슈 및 해결
없음. 지시된 하네스 패턴 그대로 append, 첫 실행에서 8건/380건 PASS.

## 머지 판단
- **머지 필요**: No (task 지시: `merge_policy: none`·**머지 금지**)
- **브랜치**: `task/task-2836-dev1` (PR #120) — 새 PR 금지, 이어서 커밋
- **워크트리 경로**: `/home/jay/projects/InsuRo/.worktrees/task-2836-dev1`
- **커밋**: `3f5f146 [task-2839] 아르고스: egress-gate 쿼리/프래그먼트 거부 fetch-spy 통합 패리티 2건(378→380)`
- **머지 의견**: test-only·소스 변경 0·회귀 0. finish-task push로 PR #120 반영. 머지는 ANU 독립검증 후 별도 판단(본 task는 머지 금지).

## 모델 사용 기록
- 아르고스(테스터): sonnet — 정확한 하네스 패턴 복제 필요(정밀성). 테스트 코드 append + vitest 실행.
- 팀장(헤르메스, Opus): 설계/검토/교차검증/micro-commit만 수행, 직접 코딩 없음.

## 비고
- dev6 금지 준수 (dev1 수행).
- 소스 변경 절대 0 — 테스트 파일 1개만. Codex 지적 통합 패리티 갭 해소.

## 세션 통계
- 총 도구 호출: 0회

