# task-3078 — 엔드포인트 결선 봉인 + 인포키워드 스킬 제거 + 플랜 드리프트 알림

레벨: Lv.2 · repo: InsuRo · 담당: dev1
승인: 제이회장님 2026-08-31 · 선행 t3077(`4c713f1`) 머지·배포 완료

## 작업 A — ★★ 엔드포인트 결선 봉인 (최우선)

### 문제 — 오늘만 네 번째 반복된 유형이다

t3077 ANU 자작 변이 21종 중 **A4/A5(엔드포인트 결선)가 SURVIVED** 했다.
**`seo_mode` 결선 한 줄을 지우면 기능이 조용히 전멸하는데 205개 테스트가 하나도 못 잡는다.**

같은 유형 전례:
- **t2970** — 회귀 테스트가 원격에 없어 CI 11/11 GREEN 인데 구멍 3개
- **t3014** — 테스트가 **상수만** import 해 강제로직 무방비, 변이 2종 생존
- **t3075** — M8 변이 1차 SURVIVED, 테스트가 상수만 읽고 `main.py:1981` 실제 결선 미통과
- **t3077** — 위 A4/A5

**근본**: 테스트가 **상수를 읽는 것**과 **그 상수가 실제로 요청 처리에 실리는 것**을 구분하지 않는다.
상수는 그대로 두고 결선 한 줄만 지워도 테스트는 전부 통과한다.

### 요구

1. **`seo_mode` 결선을 봉인하라** — 결선 라인을 제거/무력화하면 죽는 테스트.
   상수 존재 여부가 아니라 **실제 엔드포인트를 통과시켜 응답/프롬프트에 반영됐는지**를 오라클로 삼아라.
2. **같은 유형을 전수 점검하라** — 프롬프트 조립에 실리는 다른 결선(스킬 필터·채널 프롬프트 변환·
   플랜 게이트)도 **상수만 검사하는 테스트**인지 확인하고 표로 보고하라.
   전부 고치라는 게 아니라 **어디가 무방비인지 지도를 만드는 것**이 이번 목표다.
3. 가능하면 재사용 가능한 **패턴**을 만들어라 (예: "엔드포인트를 통과시켜 조립된 프롬프트를
   돌려받아 단언하는" 테스트 헬퍼). 개별 태스크마다 반복하지 않게.

★ 변이 주입 전 `assert 원문 in 소스` 로 no-op 아님을 선증명하라.

## 작업 B — 인포키워드 글쓰기 스킬 제거

`src/config/planSkillMap.ts` 의 Max·Hidden 배열에서 **`infokeyword_analyze` 항목만** 뺀다.

### ★★ 오해 금지 — 프로그램을 지우는 게 아니다
아래는 **전부 그대로 유지**한다:
- `/infokeyword` 인포키워드 분석 화면
- `/admin/infokeyword` 관리 화면
- `/api/insuro/infokeyword/generate` 프록시 API
- `PLAN_FEATURE_MAP["infokeyword_analyze"]` (기능 게이트) — **건드리지 마라**
- InfoKeyword worker 프로그램 자체

**빼는 것은 "AI 콘텐츠 작성 화면의 글쓰기 스킬 체크박스 목록" 하나뿐이다.**

### 근거
회장 지시: **"글쓰기 스킬이 아닌데 왜 검토한거야"** — 인포키워드는 전용 화면에서 쓰는
분석 기능이지 글쓰기 스킬이 아니다. 게다가 `server/skill_prompts/infokeyword_analyze.txt` 가
**없어서** 켜도 빈 문자열이 붙는다(효과 0). 사용자에게 "쓸 수 있다"고 보이는데 아무 일도 안 일어난다.

t3076 이 만든 `KNOWN_SKILL_DRIFT` 항목도 함께 정리하라(제거 후엔 드리프트가 아니다).

## 작업 C — 플랜 카탈로그 드리프트 알림 (회장 확정 방식)

t3076 이 부팅 시 DB↔코드 대조를 **ERROR 로그로만** 남기게 했다.
**로그만 남기면 아무도 안 본다** — off-by-one 이 몇 달간 방치된 게 그 증거다.

### 회장 확정 (2026-08-31)
> **"어긋남이 감지되면 관리자모드에 남기고 아누 너가 체크해서 나한테 보고하는 형태"**

### 요구
- 드리프트 감지 시 **관리자 화면에서 볼 수 있는 형태**로 기록하라
  (기존 관리자 페이지 패턴을 따르되, 새 테이블이 필요하면 **DDL 은 SQL 파일 제출까지**.
   적용은 ANU 가 한다)
- ANU 가 주기적으로 조회할 수 있는 **경로**를 보고서에 명시하라 (API 또는 테이블)
- `INSURO_STRICT_PLAN_CATALOG=1` 하드 실패 스위치는 **그대로 둔다**(회장 승인된 판단)
- 알림 자체가 장애를 만들면 안 된다 — 기록 실패가 API 기동을 막지 않게 하라

## 검증

- [ ] A: `seo_mode` 결선 제거 변이가 이제 **KILL** 되는가
- [ ] A: 상수만 검사하는 테스트 전수 점검 표
- [ ] B: 스킬 목록에서만 빠지고 **화면·API·기능게이트는 무영향**인지 실측
- [ ] C: 드리프트 주입 시 관리자 경로에 실제로 기록되는가
- [ ] 회귀 0건 (base sha 기준선 재측정 후 대조)

## 하지 말 것

- **인포키워드 프로그램·화면·API·기능게이트 삭제 금지** (작업 B 오해 금지 절 참조)
- DB `subscription_plans` 수정 금지
- SEO 모드 로직(t3077)·플랜 게이트 상수(t3076) 를 건드리지 마라
- 프로덕션 DDL 직접 적용 금지 (SQL 제출까지가 범위)

## 종결

- **PR 까지만. 머지·배포 금지** (ANU 가 한다)
- `CI_WATCH_HANDOFF` 12필드 · 콜백 prompt UTF-8 **≤3900 bytes**
- `gh` 호출 시 `GH_TOKEN="$BOT_GITHUB_TOKEN"` 주입
