eval-forgelisted
Install: claude install-skill This-HW/claude-code-kit
# Eval Forge — 결함을 회귀 게이트로 굳히기
`/self-improve`의 HARD-GATE는 **eval 커버리지가 있는 대상에서만** 이중 게이트다.
실제 커버리지는 33개 에이전트 중 소수뿐이라, 대부분의 정의 파일 수정은
"사용자 승인 단일 게이트"로 퇴화한다. 스킬이 그 한계를 정직하게 고지하고는 있지만,
**고지는 해결이 아니다.** 이 스킬은 커버리지를 늘리는 비용을 낮춰 그 구멍을 메운다.
> **적용 범위**: 이 스킬은 `evals/` 하네스(`evals/run.py`)가 있는 프로젝트 —
> 즉 **kit 레포 자체의 개발**에서 동작한다. 그 하네스가 없는 소비자 프로젝트에서는
> 스크립트가 exit 2(SKIPPED)로 정직하게 멈춘다. `/self-improve`·`/native-watch`와 같은
> kit-개발용 스킬 계열이다.
## 사용 시점
| 상황 | 왜 |
| --- | --- |
| ledger에 에이전트 행동 결함이 올라왔다 | 같은 결함이 다시 나면 기계가 잡게 만든다 |
| eval 커버리지 없는 에이전트의 정의를 고치려 한다 | 고치기 **전에** 안전망을 깐다 (없으면 self-improve가 게이트 없이 돈다) |
| 리뷰형 에이전트가 결함을 놓치는 걸 목격했다 | 거짓 음성은 eval의 1순위 표적이다 |
## 절차
### 1. 대상과 실패 형태를 확정한다 [건너뛰기 금지]
"무엇을 놓쳤는가"가 아니라 **"통과/실패를 무엇으로 판정할 것인가"**를 먼저 정한다.
판정 기준 없이 시나리오를 만들면 채점 불가능한 자산이 트리에 남는다.
- 리뷰/스캔형 → 출력에 **반드시 등장할 표현**(OR 묶음)과 **등장하면 실패인 표현**
- 수정/구현형 → `pytest_green` + 필요하면 `file_contains`
### 2. 픽스처를 준비한다
결함을 심은 최소 코드. 아래는 **강제 규칙**이다 (러너가 거부한다):
- `conftest.py` 금지 — 채점 시 임의 코드 실행 통로 (있으면 생성기가 제거한다)
- **모듈 스코프(=import 시 실행되는 위치)에서 위험 호출 금지.** 러너가 AST로 판정하며,
대상은 최상위 문장뿐 아니라 **클래스 본문·데코레이터 표현식·함수 기본 인자 값**까지다
(전부 import 시 실행된다). 함수/메서드 **본문**은 실행되지 않으므로 자유롭다 —
결함 코드는 함수 안에 두면 된다.
- 차단: `os.system`·`os.popen`·`os.remove` 류, `subprocess.*`, `socket.*`, `requests.*`,
`shutil.rmtree`, `eval`/`exec`/`__import__`/`getattr`/`setattr`, `importlib.*`
- 차단: 별칭·재바인딩·`from X import *` 우회 (`import os as x`, `f = os.system`,
`getattr(os,"system")` 모두 잡힌다)
- **허용**: `o