# task-3072 — 복사 버튼 금소법 우회 + 벤치마킹 맨몸 생성 차단

레벨: Lv.2 (라이브 결함) · repo: InsuRo · 담당: dev1
승인: 제이회장님 2026-08-31

## 배경

Agent 미팅(2026-08-30) 조사 중 발견된 **라이브 결함 2건**. ANU 가 코드로 확인했다.
미팅 결론과 무관하게 독립적으로 고쳐야 한다.

## 결함 A — 복사 버튼이 금소법 수정본을 무시한다 (최우선)

`src/pages/Generate.tsx:483`

```
const handleCopy = () => {
  navigator.clipboard.writeText(result);   // ← 원본
```

같은 파일 `:465` 저장 경로는 탭을 올바르게 반영한다:
`activeResultTab === "revised" && revisedResult ? revisedResult : result`

**복사만 틀렸다.** 설계사가 "수정본" 탭(금소법 위반이 고쳐진 글)을 **보면서** 복사해도
클립보드엔 원본이 들어간다. 토스트는 "복사 완료!" 만 뜨고 에러가 없다.
회장 지시: 설계사는 이 출력을 **그대로 복사해 네이버에 발행**한다 → 금소법 위반 문구가 그대로 나간다.

### A-2 — 같은 함수가 이미지 프롬프트 구획도 함께 복사한다

화면은 `splitImagePrompts()` 로 `## 이미지 프롬프트` 이하를 떼어 보여주는데
복사는 분리 전 `result` 전체를 넘긴다 → 블로그 본문 끝에 이미지 프롬프트 N줄이 발행된다.

### 요구

- 복사는 **화면에 보이는 것과 동일**해야 한다: 활성 탭 반영 + 이미지 구획 분리 후 본문만
- 이미지 프롬프트는 **별도 복사 수단**을 제공하라(본문과 섞지 마라)
- 저장 경로(`:465`)와 복사 경로가 **같은 소스를 쓰도록** 통일하라 — 재발 방지의 핵심

## 결함 B — 벤치마킹 근거 부재 시 "맨몸 생성"

`server/main.py:1806`

```
benchmark_prompt = ""
if req.benchmark is not None and BENCHMARK_SKILL_ID in filtered_skills:
    benchmark_prompt = build_benchmark_prompt(req.benchmark)
```

`req.benchmark` 가 `None` 이면 `benchmark_prompt` 가 빈 문자열이 된다.
그 안에 **회장 최우선 지시인 환각 금지 규칙(`_BENCHMARK_HALLUCINATION_GUARD`)** 이 들어있다.
→ 근거가 없으면 **환각 가드·분량·이미지 지시가 전부 사라진 채 생성된다.**
화면상 벤치마킹 스킬은 켜져 있고 에러도 없다. **가장 위험한 조합이 가장 조용하다.**

추가 확인: `server/skill_prompts/benchmark.txt` **파일 자체가 없다**
→ `load_skill_prompt("benchmark")` 도 빈 문자열을 반환한다.

### 요구

- 벤치마킹 스킬이 선택됐는데 `req.benchmark` 가 없으면 **생성을 거부**하고
  사용자에게 사유를 알려라(조용한 통과 금지). 400 계열이 적절하다.
- 프론트도 대응하라 — 사용자가 무엇을 해야 하는지 보이게(예: "1위 글 분석을 먼저 실행하세요")
- `benchmark.txt` 부재 건: **신설하거나 스킬 목록에서 제거하거나** 둘 중 하나로 정리하라.
  판단 근거를 보고서에 남겨라

## 검증

- [ ] A: 수정본 탭 활성 상태에서 복사 → 클립보드에 **수정본**이 들어가는지 (실브라우저)
- [ ] A-2: 복사 결과에 `## 이미지 프롬프트` 이하가 **포함되지 않는지**
- [ ] B: `benchmark=None` + 벤치마킹 스킬 선택 → **생성 거부**되는지 (실호출)
- [ ] B: 정상 케이스(benchmark 있음)는 영향 없는지 — 가용성 파손 금지
- [ ] 기존 회귀 0건 (base sha 에서 기준선 재측정 후 대조)
- [ ] **변이 테스트**: A/B 수정을 각각 되돌리면 테스트가 죽는가.
      변이 주입 전 `assert 원문 in 소스` 로 no-op 아님을 입증할 것

## 하지 말 것

- 분량/글자수 관련 수정 금지 (별도 태스크에서 미팅 결론에 따라 진행 중)
- 모델 제한(haiku 차단 등) 추가 금지 — 회장 지시로 철회됨
- 채널 프롬프트(`generateOptions.ts`)의 `## 마크다운 아님` 은 **이번 범위 밖**. 건드리지 마라

## 종결

- **PR 까지만. 머지하지 마라** (ANU 가 한다)
- `CI_WATCH_HANDOFF` 12필드 생성 · 콜백 prompt UTF-8 **≤3900 bytes**
- `gh` 호출 시 `GH_TOKEN="$BOT_GITHUB_TOKEN"` 주입 (회장 개인 PAT 금지)
- 봉투에 "머지 불필요·미해결 없음" 을 근거 없이 쓰지 마라
