# [fix] ingest.js isAllowedIngestUrl — crm.js와 동일 egress 가드(port/query/fragment 거부)

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "extension/background/ingest.js"
    - "extension/__tests__/**"
  forbidden_paths:
    - "src/**"
    - "server/**"
    - ".github/**"
    - "extension/background/crm.js"
    - "extension/content.js"
    - "extension/manifest.json"
  commands: ["npx vitest","git"]
  merge_policy: "none"
  ttl_hours: 4
```
> ★ merge_policy=none. 브랜치 **`task/task-2851-dev1`**(플러밍 PR 예정)에 이어서 커밋(새 PR 금지).

## 배경 (Codex 검토 — 비대칭 갭)
`crm.js` `isAllowedCrmUrl`(~69-75)은 exact-origin 가드 완비: prod host 포트(`""`/`443`)만 허용 + `url.search`/`url.hash` 비어야 통과. 그런데 **`ingest.js` `isAllowedIngestUrl`(~126-143)은 port/query/fragment 미검증** → `https://api.insuro.biz:444/...`·`?x=1`·`#frag` 통과. ingest 는 **PII+분석+consent 를 나르는 실 egress** 라 crm 보다 민감 → 동일하게 닫는다.

## 작업 (surgical — crm.js 미러)
`isAllowedIngestUrl`(ingest.js) 에 crm.js 와 동일 규율 추가:
1. prod host: `url.hostname === "api.insuro.biz"` + **`(url.port === "" || url.port === "443")`** 만 허용.
2. pathname exact-match(기존 INGEST_PATH) **뒤에** `if (url.search !== "" || url.hash !== "") return false;` 추가.
3. username/password(userinfo) 거부 등 crm.js 에 있는 다른 가드가 ingest 에 없으면 동일 추가. localhost(:8000) 테스트 경로는 그대로.
- `isAllowedIngestUrl` **외 로직 건드리지 마라**(host 상수·조립·flag 불변).

## 검증 (신규 테스트 + 회귀)
- 신규: `api.insuro.biz:444/<INGEST_PATH>` 거부 · `?x=1` 거부 · `#frag` 거부 · `api.insuro.biz/<INGEST_PATH>`(443 기본) 허용 · `insuro.biz` 여전히 거부. 가능하면 전송함수 관통 no-fetch 통합(crm egress-gate 패턴 참고).
- 확장 전체 vitest 회귀 0(394 기준). single-egress·canary·계약 골든 유지.

## 완료 (★ 순서 B)
- `extension/background/ingest.js` + 테스트 외 변경 0.
- **dev6 금지** — dev1. 커밋 → push → finish-task **foreground 1회** → .done 즉시 종료. **background+wait 금지.** ANU 원격 검증·머지.