통과했지만 틀렸다: API 마이그레이션 후 LLM 코드 수리의 조용한 실패
Accepted but Wrong: Silent Failures of LLM Code Repairs after API Migrations
TL;DR Highlight
릴리스 노트 기반 엣지 입력 하나로 틀린 수리 통과율이 0.410에서 0.065로 줄었다
Who Should Read
런타임·API 업그레이드 때 LLM이 고친 코드를 일반 테스트만으로 배포해 불안한 백엔드 개발자
Core Mechanics
- 테스트는 통과했는데 결과는 틀렸다
- 호출은 성공하는데 결과값만 바뀌는 조용한 변경이 있다.
- 예로 enum이 Priority.HIGH 대신 3으로 찍히고, Buffer.poolSize가 8배로 커진다.
- 대표 입력만 쓰면 틀린 수리의 0.410이 배포 게이트를 통과했다.
- 핵심은 단언이 아니라 입력이다
- 릴리스 노트에서 뽑은 엣지 입력 하나를 추가하자 통과율이 0.065가 됐다.
- 정상 수리를 막는 비율(false rejection)은 0.010 그대로였다.
- LLM이 테스트 입력을 대신 써도 된다
- 프로그램을 못 본 GPT-5.6-luna가 입력 3개를 써서 0.070에 도달했다.
- 작성자는 모델 호출 1번이면 된다.
- 로컬 모델 작성자 둘은 사전 등록 기준을 통과하지 못했다.
- "옛 출력이 유효한 입력"을 모델이 고르게 하면 역효과다
- 모델이 legacy-binding으로 표시한 입력만 쓰면 0.157로 오히려 나빠졌다.
- 모델이 non-binding으로 표시한 입력이 바로 변경을 드러내는 입력이었다.
- 자기 테스트는 효과가 약했다
- 모든 모델에서 틀린 통과가 줄었지만 다중비교 보정 후 유의하지 않았다.
- 작은 모델은 유효한 테스트를 적게 쓰고, 쓴 테스트도 자기 오해를 반영했다.
- 어려운 함정에서는 틈이 남는다
- 대표 입력에서는 옛 출력과 같지만 틀린 후보 233개를 추가했다.
- 엣지 입력 후에도 그중 0.168이 통과했다.
Evidence
- 엣지 입력 하나로 통과율 0.410→0.065
- CPython·Node.js·SQLite 테스트 52개 태스크의 전체 수리 공간 기준이다.
- 대표 입력만 쓴 게이트와 비교했다.
- 새로 만든 15개 클러스터에서는 0.471→0.061이다.
- 모델별 틀린 릴리스가 시도당 줄었다
- Qwen3-8B는 0.233→0.057이다.
- gpt-oss-20b는 0.181→0.020이다.
- qwen3.6-35b-a3b는 0.120→0.018이다.
- 메뉴를 1491개 조각으로 키워도 유지됐다
- 엣지 입력은 0.278→0.045이다.
- 블라인드 작성자 입력 3개는 0.053이다.
- 모델 자기 테스트는 약했다
- Qwen3-8B의 자기 테스트(가드 없음)는 전체 수리 공간에서 틀린 것의 0.240을 통과시켰다.
- 블라인드 작성자는 0.070이었다.
How to Apply
- 수리 PR마다 릴리스 노트 엣지 입력 1개 추가하기
- 업그레이드 대상의 릴리스 노트에서 동작이 바뀐 지점을 찾는다.
- 그 경계값을 입력으로 만들어 기존 테스트 옆에 추가한다.
- 기대값은 옛 런타임에서 옛 코드로 돌려 얻는다.
- 별도 LLM으로 엣지 입력 3개 생성하기
- 수리 모델과 분리된 호출에 요구사항과 릴리스 노트만 준다.
- 코드와 숨은 테스트는 보여주지 않는다.
- 옛 런타임에서 에러가 나거나 비결정적인 입력은 버린다.
- 작성자에게 옛 출력 유효 여부를 판단시키지 않기
- 입력 필터링을 모델의 라벨에 맡기지 않는다.
- 옛 런타임에서의 실행 성공과 결정성 검사로 거른다.
- 약한 수리 모델일수록 강한 모델로 테스트 쓰기
- 수리는 저렴한 모델에 맡긴다.
- 테스트 입력 작성은 더 강한 모델에 맡긴다.
Try It
# Claude나 ChatGPT에 그대로 붙여넣기 (논문 방법의 간이 버전: 블라인드 엣지 입력 작성)
당신은 테스트 입력 작성자입니다. 아래 요구사항과 릴리스 노트만 보고, 코드는 보지 마세요.
[요구사항]
{{요구사항}}
[릴리스 노트 발췌]
{{릴리스 노트}}
[대표 입력과 옛 출력]
{{대표 입력}}
지시: 릴리스 노트의 변경이 결과를 바꿀 법한 경계 입력을 최대 3개 JSON으로 출력하세요. 대표 입력과 같은 키와 값 타입을 쓰세요. 각 입력이 변경의 어떤 점을 건드리는지 한 줄로 쓰세요. 옛 출력이 아직 유효한지는 판단하지 마세요.
이어서 해 볼 것: 나온 입력을 옛 런타임에서 실행해 기대값을 얻고, 새 런타임에서 수리된 코드와 비교해 보세요.Terminology
관련 논문
노트북의 Qwen 3.8 27B도 모델 가중치를 해석한다
로컬 Qwen 3.8 27B에 가중치 숫자만 줬더니 게임 3종을 맞혔다
AI를 거부하는 학교는 Google 검색도 꺼진다는 논란
학교가 AI를 끄면 Google 검색도 꺼진다는 보도에 댓글이 갈렸다
'Astra가 가중치를 읽고 써서 Qwen을 개선했다'는 글은 오해를 부른다
Qwen 개선은 가중치만 본 게 아니라 Python 코드와 모델 실행을 썼다
Momentic Mo: 앱을 직접 써 보며 버그를 찾는 AI QA 에이전트
프롬프트로 앱을 탐색해 버그를 찾는 Mo, QA Bench에서 라벨 버그 약 269개 발견
Mistral Large 4 가중치 공개: 코딩·사이버보안 특화 1T 모델
Mistral이 1조 파라미터 Large 4 가중치를 공개해 오픈 코딩 벤치 선두를 주장했다
Gemini 4 Carbon, Artificial Analysis Intelligence Index v5 1위
Gemini 4 Carbon이 Index v5 59점으로 1위, 코딩 에이전트는 2위
Gemini 4 Carbon 발표: 사이버보안·장시간 에이전트 작업 특화 모델
Google이 Gemini 4 Carbon을 공개했지만 아직 일부 보안 파트너에게만 열렸다
Dayjob: Tax – 전문 세무 업무 50건으로 AI 에이전트 평가
세무 실무 50건을 맡겼더니 최고 모델도 통과율 10.8%에 그쳤다
Original Abstract (Expand)
After a runtime or API migration, an LLM-repaired procedure can run cleanly yet return wrong results, and a release check on typical test inputs ships it. We report a preregistered study of 73 tasks covering 60 documented changes in CPython, Node.js and SQLite. Every candidate is executed on the real runtimes against withheld contracts. Over the complete repair space, the all-assertions gate on typical inputs released 0.410 of wrong repairs. One edge input written from the release note cut this to 0.065, and to 0.061 on 15 unseen clusters. Three inputs from a blind GPT-5.6-luna writer that never saw the program reached 0.070. Two further frozen stages enlarged the menu to 1491 fragments and then added 233 hard distractors that match the legacy output on typical inputs. The edge input (0.058) and the frontier-model writer (0.058) passed their preregistered tests. Yet 0.168 and 0.153 of the hard wrong programs still passed. Two local-model writers failed their preregistered tests. Across four model families, the edge input cut wrong releases per attempt in all three open-weight families on all three menus, for example from 0.233 to 0.057, without lowering correct completion. Self-tests helped less. A blind AI audit flagged 34 contracts as stricter than their requirements. Dropping the disputed checks changed 0 verdicts, but class-label disputes remain open. No model-written code was executed. Artifacts are available from the authors on request.