5월 27일 첫 결함리포트가 도착했습니다. AI 에이전트 플랫폼 XGEN의 GS인증 시험에서 나온 결함 20건이 적혀 있었습니다. 이후 6월 2일 2차 리포트에 24건, 6월 10일 3차 리포트에 36건이 더해져 2주 사이 총 80건의 결함을 받았고, 수정 작업은 그로부터 일주일을 더해 약 3주간 이어졌습니다. 그런데 80건을 하나씩 코드와 대조해 보니, 코드가 실제로 잘못 동작한 경우는 절반이 되지 않았습니다. 나머지는 "코드는 의도대로 동작하지만 사용자가 그 사실을 확인할 수 없는" 항목들이었습니다.
이 시리즈는 그 3주 동안 결함 80건을 어떻게 읽고, 어떤 코드를 고쳤는지에 대한 기록입니다. 1편에서는 결함리포트라는 문서 자체를 다룹니다.
결함 80건 중 코드 버그는 절반이 되지 않았습니다
시험기관(TTA)의 결함리포트는 결함마다 품질특성을 분류해서 옵니다. 80건을 특성별로 세어 보면 기능적합성 41건, 사용성 30건, 보안성 5건, 일반적 요구사항 4건이었습니다. 숫자만 보면 기능 결함이 절반이지만, 기능적합성으로 분류된 41건 안에도 "기능이 고장난" 경우와 "기능은 동작하는데 그렇게 보이지 않는" 경우가 섞여 있었습니다.
예를 들어 웹 검색 노드의 '최대 결과 수' 옵션은 검색 도구가 수집하는 자료의 건수를 제한하는 기능입니다. 값을 1로 줄여도 AI는 수집된 1건과 자체 지식을 바탕으로 여러 항목의 답변을 만들 수 있습니다. 옵션은 정확히 동작했지만, 답변만 보는 사람에게는 아무것도 달라지지 않았습니다. 리포트에는 "기능이 정상적으로 작동하지 않음"으로 적혔고, 저희는 이 판정을 반박하는 대신 받아들이기로 했습니다. 옵션의 효과를 확인할 방법이 화면에 없다면, 사용자에게 그 옵션은 없는 것과 같기 때문입니다.
시험원은 코드를 보지 않고 화면만 봅니다
당연한 사실인데 체감하는 것은 달랐습니다. 시험원은 설정을 바꾸고, 실행하고, 화면에 나타난 차이를 관찰합니다. 차이가 관찰되지 않으면 결함입니다. 내부 로그에는 차이가 있다거나, 도구 출력에는 반영됐다는 설명은 판정을 바꾸지 못했습니다.
이 기준을 받아들이자 수정 방향이 명확해졌습니다. 옵션이 실제로 고장난 곳은 고치고, 동작하지만 보이지 않는 곳은 차이가 보이도록 출력을 바꾸고, 그래도 화면에 나타나지 않는 옵션은 효과를 확인하는 위치를 안내 문구로 밝혔습니다. 이 작업의 구체적인 내용은 4편에서 다룹니다.
의도한 동작도 안내가 없으면 결함이었습니다
공유받은 에이전트플로우는 최초 생성자만 배포할 수 있습니다. 활성 상태인 스케줄은 실수 삭제를 막기 위해 지울 수 없습니다. 둘 다 저희가 의도한 정책이었지만, 두 건 모두 결함으로 접수됐습니다. 버튼을 눌렀을 때 아무 일도 일어나지 않았기 때문입니다.
시험기관의 회신은 간결했습니다. "의도한 사항이라면 안내 메시지를 띄우고 매뉴얼에 기재해 주세요." 정책이 있다는 사실과 그 정책이 사용자에게 전달되는 것은 별개의 일이었습니다. 배포 권한이 없는 사용자가 버튼을 누르면 경고 문구가 나오도록 고쳤고, 활성 스케줄 삭제 시도에도 이유를 설명하는 안내를 붙였습니다. 소리 없이 무시되는 클릭을 없애는 것이 이번 인증에서 반복된 수정 패턴 중 하나였습니다.
시험 환경도 제품의 일부였습니다
3차 리포트의 첫 두 건은 심각도 H였습니다. 사용자가 작성하지 않은 질문에 대한 답변이 채팅에 나타나고, 알 수 없는 문자열이 답변에 섞여 나온다는 내용이었습니다. 원인은 코드가 아니라 환경이었습니다. 데이터베이스와 Redis, MinIO를 공유하는 두 사이트가 마이그레이션 충돌을 일으키고 있었습니다.
같은 맥락의 결함이 더 있었습니다. 문서 검색 노드가 동작하지 않은 원인은 배포된 pod 간 버전 불일치였고, 시험 계정에 superuser 권한을 줄 수 없어 사용자 삭제가 실패하던 문제는 권한 설계의 문제였습니다. 시험은 애플리케이션 코드만이 아니라 배포 구성, 계정 권한, 인프라까지를 하나의 제품으로 보고 있었습니다. 이 관점은 이후 시험 범위 밖 기능을 계정 권한으로 분리하는 작업으로 이어졌고, 그 내용은 5편에서 다룹니다.
결함리포트는 버그 목록이 아니었습니다
3주가 지나고 80건이 모두 "수정완료"로 닫혔을 때, 결함리포트를 다시 처음부터 읽어 봤습니다. 고장 신고보다 많았던 것은 "사용자가 이 동작을 이해할 수 없다"는 신고였습니다. 성공 메시지와 오류 로그가 한 화면에 함께 뜨고, 모든 실패가 같은 문장으로 보고되고, 옵션을 켜도 결과가 같아 보이는 지점들이었습니다.
결함리포트는 버그 목록이 아니었습니다. 사용자가 제품을 이해하는 데 실패한 지점의 목록이었습니다. 다음 편에서는 80건 중 수는 가장 적었지만 가장 깊은 수정이 필요했던 보안성 결함 5건, 그중에서도 운영 중인 시스템의 비밀번호 해시를 argon2id로 교체한 과정을 다룹니다.

