실전 사례
har_eval를 증류해 낸 실 결정들. 두 사례 모두 “느낌”이 아니라 측정·재평가로 판정이 정해졌다.
사례 1 — 메모리 도구: 데이터로 “안 만든다”
질문: 사내 영속 코딩-메모리 도구를 v2로 재설계하고 “현재보다 고도화”할까? → har_eval가 “애초에 만들 필요가 있나?” 로 재프레임.
진행
- Frame — 메모리 도구 빌드 vs “현재 스택(LSP 심볼-nav + 큐레이션된 MEMORY.md + git + 문서)으로 충분”. 잘못된 yes의 비용 = 그래프DB + 임베더 빌드 수 시간.
- Inventory — 사내 그래프 인덱싱 도구가 죽었는데 참조는 남음, 메모리 도구는 설치됐지만 유휴.
- Design — 하이브리드 검색기 + 전달, core/edge 분리.
- Audit — 자기감사 8건 → 교차모델(Codex)이 자기감사가 놓친 13건을 추가 포착(cross-repo wrong-transfer, verified-source 충돌 등) + 4건 재보정.
- Buy-before-build — Control vs 기성 후보 2종을 비용 $0로 동결 비교.
- Measure — 후보 #1: 깔끔한 구조 태스크에서 ~17% 토큰 절감, 진단 태스크에선 싸지만 틀림. 후보 #2: Control이 6/6 정답.
- Decide — “현재로 충분, 아무것도 안 만듦.” 후보 #1은 선택적 한계 보조. 청소: 설치물·죽은 참조 제거.
메커니즘 (H8) — 후보 #2가 싸고 정확하게 답한 이유는 사용자가 결정을 문서화하기 때문(커밋 근거·ADR·설계 스펙) + 큐레이션된 MEMORY.md 바닥. 이 습관은 6개 태스크를 넘어 일반화된다 → 메모리 도구가 비집고 들어갈 여지 없음.
가드레일이 된 약점
- 후보 #1 판정이 n=3 에 의존 → H1(n≥6), H3(정지 규칙)
- 후보 #2는 실제로 안 돌리고 “여지 없음”을 추론 → H2(미측정 arm 추론 금지), H10(신뢰도 라벨)
- 정직한 라벨: #1 = measured(n=3, 약함), #2 = inferred + mechanism-backed
사례 2 — serena: 폐기 직전 뒤집힌 판정 (H2 시연)
질문: serena(LSP 심볼-nav MCP)를 유지할까 폐기할까?
함정 (벌어질 뻔한 일) — Inventory에서 serena는 설정돼 매 세션 부팅되지만 실 툴콜 0회. 빠른 판단: “0 사용 → 죽은 무게 → 폐기.”
H2 포착 (추론 말고 재평가) — 그 판정은 활성화된 적 없는 arm 에서 그려질 뻔했다. serena는 켜진 적이 없었다(opt-in 핸드셰이크가 안 울려 툴이 프라임되지 않음). “안 돌린 것”에서 “효과 없음”을 단정하는 건 H2가 정확히 금지하는 일이다.
제대로 활성화 후 측정: 강타입(TypeScript) 심볼-nav 태스크에서, 네이티브 grep+read가 8 툴콜로 답하던 질문을 find_referencing_symbols 단 1콜(~3–4k 토큰) 으로 — grep이 놓치는 타입 참조까지 포함해 — 해결.
판정 — 뒤집힘 — 폐기 아님. serena는 강타입 심볼-nav에서 진짜 가치 있다. 단지 기본 비활성이었을 뿐. 신뢰도: measured(n=1, 강함) + mechanism-backed(LSP는 타입 코드에서 참조를 정확히 해석).
조치 (싼것부터) — 유지 + 발화시키되 범위 한정: TS/강타입 심볼-nav → serena, Python/동적/SQL-문자열 로직 → 네이티브 Read/Grep(LSP 약함).
교훈 — 0-사용 인구조사는 폐기 판정처럼 보이지만 “활성화된 적 없음” ≠ “효과 없음”. 안 돌린 arm은 추론하지 말고 — 돌려라.