# ANU 전수검사 보고 — task-3075 플랜 off-by-one

작성: 2026-08-31 12:1x KST · 검토자: 아누 · 대상 보고서 해시 `b4e922ff7c4447c3`

## 결론

**머지 `ac4b1d01` · 배포 완료 · 라이브 검증 통과.** 벤치마킹이 회장님께 실제로 나갑니다.
다만 **이번 수정은 빙산의 일각**입니다 — 같은 off-by-one 이 권한 게이트 40곳을 관통합니다.

---

## 1. ANU 가 직접 재측정한 것 (봇 자기보고 미승계)

| 항목 | ANU 실측 | 봇 보고 | 판정 |
|---|---|---|---|
| DB 플랜 스케일 | Free0 Basic1 Pro2 Max3 Hidden4, `count 0-4/5` | 동일 | 일치 |
| 활성 구독 | 10명 = Hidden5·Max2·Pro1·Basic1·Free1 | 동일 | 일치 |
| base 증상 | 5개 플랜 **전부** benchmark_prompt 0자 | 동일 | 재현 |
| head 수정 | Hidden 만 2,120자 + 환각금지 | 2,209자(픽스처 차이) | 재현 |
| 회귀 | base 3254p/5s/**0f** → head 3280p/7s/**0f** | 동일 | 일치 |
| diff | 5 files **+512/-14**, `src/**` 0줄 | +59/-14 | ★수치 부정확(신규 테스트 453줄 누락) |
| CI 적색 | `Errno 28` 디스크풀로 pip 사망 → 파이썬 테스트 **미실행** | 동일 | 로그로 직접 확인 |
| e2e | 실패 3 + flaky 1 | 실패 3 | 일치 |

**CI 가 이 PR 의 서버 테스트를 한 번도 검증하지 못했습니다.** 제 로컬 실행이 유일한 검증입니다.

## 2. 봇이 제 명세를 반증했고, 봇이 옳습니다

제가 "어긋난 dict 는 `PLAN_SKILL_ACCESS` 하나뿐"이라고 썼는데 틀렸습니다.
코드 자체 상수 `PLAN_ORDER`(무료1…히든5) 기준으로 전수 대조하니 **9건**이었고,
PR #287 이 1건 해소, **8건 잔존**입니다. 제 검사법(`[4]==[5]` 비교)이 최상위만 봤습니다.

## 3. ★ ANU 신규 발견 — 봇도 놓친 더 큰 폭발반경

off-by-one 은 dict 5종에 그치지 않고 **실제 권한 게이트를 관통**합니다.

- **`require_feature` 19개 중 18개 오게이팅** — Pro 8기능·Max 7기능·Basic 2기능 부당 차단
- **`require_plan("히든")` 11개 엔드포인트는 아무도 도달 불가** (필요 5 > 최대 4)
  → `/ai/naver-onestop`·`/ai/tistory-upload`·`/ai/thread-auto`·`/ai/schedule`·`/pipeline/*`·`/wiki/*`
- **Max(월 79,000원)가 opus 요청 시 "이 모델은 맥스 플랜 이상에서 사용 가능합니다" 자기모순 403**
- `PLAN_MODEL_ALLOWLIST` 는 한글 키인데 DB 는 영문명 → 전 플랜 `["haiku"]` 폴백
- 공개 API `/premium/remaining-seats` 가 **`occupied` 0 고정** (실제 Max 2명, 라이브 `remaining:100`)

## 4. ★ 봉인 구멍 — ANU 자작 변이 7종 중 2 생존

- **A4 `benchmark_prompt = ""` SURVIVED** — **이번 사고와 같은 실패 양식인데 봉인이 없습니다.**
  테스트가 결선 라인을 관찰하지 않고 테스트 안에서 재구현했고, 엔드포인트 테스트는
  근거 **없는** 경로만 타서 400 만 봅니다. 저비용 보완 가능(엔드포인트 테스트 1건).
- A1 관대한 기본값 폴백 SURVIVED — 오늘은 미도달(경미)
- KILL 5종: 상한 상수 과소·백도어·키 개명·게이트 기준 변경·`[5]` 단독 제거

## 5. 부수 판정

- 봇의 기존 테스트 정정 3건은 **약화가 아니라 강화**입니다 (승인)
- 배포해도 회장님 화면에 새 400 안 뜹니다 — 프론트 선행 가드가 먼저 차단
- 봇 봉투의 "미해결 없음"은 사실과 다릅니다(조치요청 실재)

## 6. 회장님 결정 필요

1. **권한 게이트 40곳 off-by-one** — 고치면 권한·과금이 즉시 바뀝니다 (양방향)
2. dict 8건 잔존 어긋남
3. 잠복 2건 — `plan_id` 미반환 / `sort_order=0` falsy 승격
4. A4 봉인 구멍 보완
