🤖
3078 in / 2000 out / 5078 total tokens
memradar의 AI 역할 분류기 평가 파이프라인을 v3 스펙에 맞게 전면 정비했다. 핵심은 세 가지. 새 검증기 추가, 리포트 버그 수정, 스크립트 파라미터화.
가장 먼저 validate-eval-samples.mts를 새로 만들었다. v3 §5 스펙에 따라 샘플 JSON 파일을 세 갈래로 검사한다. §5-1 구조 검증은 스키마·교대 규칙·툴 화이트리스트·acceptableRoles 길이를 체크해서 에러를 낸다. §5-2 자연성 휴리스틱은 stuffing, review 어조 쏠림, 메시지 길이, toolUses 빈도를 돌려서 경고를 띄운다. §5-3 신호 주입 검사가 재밌는데, 블라인드 생성 위반을 사후에 잡아내는 회로다. 외부 AI가 샘플을 만들 때 phraseStrong을 과다 주입하면 엔진이 너무 잘 맞추는 편향이 생기니, 이걸 탐지하는 용도다. usageProfile.ts에서 CATEGORY_SIGNALS를 read-only로 export한 이유가 정확히 여기 있다. 엔진 내부 데이터는 캡슐화하되 검증기만 신호 사전을 읽을 수 있게 한 설계다.
test-eval-and-report.mts는 상당히 많이 건드렸다. 역할별 precision/recall/F1을 계산하고, v3의 4카테고리(pure, mixed, ambiguous, edge)를 제대로 반영했다. v1 잔재인 'consistency' 카테고리를 드디어 걷어냈다. undecided 비율과 mixed 완전정답률도 새로 표시한다. 그리고 정확도 카드에 *100이 누락된 버그를 잡았다. 0.85를 85%로 보여줘야 하는데 0.85%로 찍히고 있었다. QA가 ISSUE-001으로 올려준 걸로, 리뷰어는 놓친 부분이다.
generate-eval-samples-zai.mts에 --role, --difficulty, --per-bucket 플래그를 추가했다. 인자 없이 돌리면 기존처럼 109개를 생성하고, 특정 역할만 뽑거나 난이도를 지정할 수 있다. 평가 반복 돌릴 때 특정 버킷만 재생성해야 하는 경우가 종종 있어서 불가피한 변경이었다.
윈도우 경로 버그도 세 스크립트에서 동시에 수정했다. import.meta.url을 fileURLToPath로 변환하지 않고 path.dirname에 직접 넘기면 윈도우에서 file:///C:/... 형태의 URL 문자열이 그대로 경로로 쓰여서 깨진다. 리눅스에서는 우연히 돌아가는 버그라 놓치기 쉽다.
마지막으로 AI-ROLE-EVAL-EXECUTION-PLAN.md에 사실 오류가 있었다. Codex CLI를 샘플 생성에 쓴다고 적어놨는데, 실제 코드상으로는 Z.AI/GLM만 사용 중이었다. 문서를 코드에 맞췄다.
Co-Authored-By가 Claude Opus 4.7로 되어 있는 걸 보면 페어 프로그래밍 세션에서 나온 커밋이다. Scout→Coder→Reviewer→QA 파이프라인을 탔고, QA 단계에서 정확도 카드 버그를 잡아낸 구조다. 8.5/10 리뷰 통과 후 QA가 한 방 먹인 셈이다.
// validate-eval-samples.mts 핵심 구조 (축약) type SampleCategory = 'pure' | 'mixed' | 'ambiguous' | 'edge'
// §5-1: 스키마·교대·툴 화이트리스트 → 에러
// §5-2: stuffing/어조 쏠림/길이 → 경고
// §5-3: phraseStrong 과다 매칭 → 주입 위반 경고
// 에러 1건 이상 → exit 1
검증기 없이 평가를 돌리는 건 테스트 없이 배포하는 것과 같다. 이제 샘플 품질을 자동으로 걸러낼 수 있다.
평가 도구를 믿지 못하면 평가 결과도 믿을 수 없다. 검증기를 먼저 만들어라.