# task-2865+1 — e2e locator 충돌 회귀 수정 (PR #141 GREEN 화)

## 팀 / 성격
- 팀: dev1-team (헤르메스)
- 레벨: Lv.2 (버그/회귀 수정) · merge_policy: none (finalize-only, 머지는 ANU)
- 성격: task-2865가 유발한 e2e 회귀의 bounded remediation. 기존 브랜치 `task/task-2865-dev1` 위에 이어서 커밋하여 **PR #141 을 갱신**한다 (신규 PR 만들지 말 것).

## 배경 (ANU 독립검증으로 확정)
- PR #141 (`task/task-2865-dev1`, head 00fe818) CI 결과: `ci`(vitest+build) PASS, 그러나 `e2e-test` FAIL → mergeStateStatus=UNSTABLE → 머지 불가.
- e2e 실패 원인 = **task-2865의 실제 회귀** (봇 보고의 "pre-existing/.env 이슈"는 오진):
  - 기존 e2e `tests/e2e/composite-design-vpath.spec.ts:404` `page.locator("text=2사 조합")` 는 base 에서 CompositeComboResult 의 단일 "2사 조합" 만 매칭 → PASS.
  - task-2865 신규 `src/lib/rpComparison.ts` 가 RP 블록 타이틀 `"1사 최저 vs 2사 조합"`, `"2사 조합 vs 3사 조합"` 를 추가 렌더 → 페이지에 "2사 조합" 3개 → **strict mode violation: resolved to 3 elements** → FAIL.
  - line 405 `text=3사 조합` 도 동일 충돌(RP 블록 `"2사 조합 vs 3사 조합"`, `"1사 최대 vs 3사 조합"`) — fail-fast 로 404 에서 먼저 터졌을 뿐 405 도 잠재 충돌.
- CI 로그 실증: `strict mode violation: locator('text=2사 조합') resolved to 3 elements at composite-design-vpath.spec.ts:404:46`.

## 목표 (Goal-Driven)
`e2e-test` 잡이 PASS 하도록 e2e locator 충돌을 제거한다. **RP 블록은 의도된 신규 UI 이므로 프로덕션 코드(rpComparison.ts / RpComparisonBlocks.tsx)는 건드리지 말 것.** 수정은 e2e 테스트 locator 를 CompositeComboResult(1·2·3사 최적조합) 섹션으로 **특정(scoped)** 해 disambiguate 하는 것이다.

## 작업 지시
1. `tests/e2e/composite-design-vpath.spec.ts` line 403~405 의 loose `text=` locator 를 CompositeComboResult 컨테이너 내부로 좁힌다.
   - 우선순위 A: CompositeComboResult 렌더 루트에 안정적 앵커(role/heading/기존 testid)가 있으면 그 컨테이너를 `locator()` 로 잡고 그 안에서 `getByText("2사 조합")` 로 스코프.
   - 우선순위 B: 마땅한 컨테이너 앵커가 없으면 `src/components/composite/CompositeComboResult.tsx` 렌더 루트에 `data-testid="composite-combo-result"` 1개만 최소 추가(Surgical)하고 e2e 에서 그 testid 하위로 스코프. (이 경우만 프로덕션 파일 1줄 변경 허용 — 표시/로직 무변경, testid 부착만)
   - `.first()` 단순 회피는 **금지**(의미 없는 매칭 은폐). 반드시 combo-result 섹션을 겨냥.
2. 같은 파일 내 동일 패턴의 다른 loose `text=1사 최저가/2사 조합/3사 조합` 재사용처가 있으면 함께 정합 처리(전수).
3. crm-customers-vpath.spec.ts 등 다른 e2e 에 동일 취약 locator 가 있는지 grep 확인하고 있으면 동일 스코프 처리.

## 검증 (필수)
- 로컬 clean /tmp worktree(CI parity)에서 해당 e2e 스펙 실행 → **composite-design-vpath 케이스 A PASS** 확인. (오염된 파일럿 .env worktree 금지 — regression 판정은 clean worktree 기준)
- `npx tsc --noEmit` EXIT 0.
- vitest 회귀 0 유지(신규 실패 0).
- push 후 PR #141 의 `e2e-test` + `ci` 잡이 GREEN 되는지 원격 확인.

## 종결 프로토콜
- 기존 브랜치 `task/task-2865-dev1` 에 커밋·push (PR #141 갱신). 신규 브랜치/PR 금지.
- merge_policy=none → finalize-only. 봇은 push + `.done` 까지. **머지는 ANU** (원격 독립검증 후).
- 완료 시 `memory/reports/task-2865+1.md` 작성 + ANU 독립 콜백(봇 self-key 아님).
- callback prompt UTF-8 ≤3900 bytes envelope 만(task_id·result_path·report_path·pr=141·e2e_green 여부·머지판정 한줄).

## 코딩 4원칙
Surgical Changes 최우선: e2e locator 스코핑만. 프로덕션 로직 무변경(필요 시 testid 1개만).

## goal_assertions (auto-generated)
- `npx tsc --noEmit`
