AI에게 검색 필터를 고치게 했더니 “타입 검사와 테스트가 모두 통과했습니다”라는 답이 돌아왔습니다.
그런데 브라우저에서 필터를 두 번 바꾸고 뒤로 가기를 누르면, URL은 이전 값인데 입력창은 새 값으로 남습니다.
코드가 컴파일되고 일부 테스트가 통과해도 사용자가 기대한 동작까지 확인한 것은 아닙니다.
이런 재작업을 줄이려면
기대 동작을 고정하고, 실행 결과를 다음 수정의 입력으로 돌려주는 검증 루프
가 필요합니다.
이번 글에서는 검색 필터를 예제로 실패 재현, 작은 수정, 재검증, 완료 판단을 연결해 보겠습니다.
Claude와 Codex에 같은 방식으로 적용할 수 있는 작업 요청과 완료 보고 템플릿도 함께 정리합니다.
예시는 /search가 q만 사용하는 URL을 만들고, 입력창과 버튼에 위 접근성 이름이 있는 화면을 가정합니다.
실제 저장소에서는 경로·쿼리 구조·요소 이름을 맞춰야 합니다.
여러 쿼리 파라미터가 있다면 문자열의 끝을 비교하기보다 URL.searchParams로 q를 검증하는 방식으로 바꿉니다.
Playwright의 toHaveURL, toHaveValue 같은 웹 단언은 기대 조건을 만족할 때까지 재시도합니다.
일정 시간을 무조건 기다리는 방식 대신 실제 URL과 입력값을 조건으로 삼을 수 있습니다.
Playwright 단언 문서↗
👍
수정 전 테스트가 실패하더라도 원인을 확인해야 합니다.
입력창을 찾지 못해 실패한 것은 필터 복원 버그를 재현한 결과가 아닙니다.
의도한 지점에서 “alpha를 기대했지만 beta가 남았다”는 실패가 나오는지 확인합니다.
실패를 고정한 뒤 원인 가설 하나를 선택해 관련 코드만 수정합니다.
예를 들어 초기 렌더링에서만 URL 값을 읽는 구조라면, 뒤로 가기로 쿼리가 바뀌었을 때 입력 상태가 갱신되는지 확인합니다.
이때 검색 API나 정렬 규칙까지 동시에 바꾸면 어떤 변경이 문제를 해결했는지 추적하기 어려워집니다.
실패 재현, 작은 수정, 재검증, 완료 판단과 실패 시 수정 단계로 돌아가는 AI 코드 검증 루프
수정 뒤에는 같은 입력과 같은 단언으로 다시 실행합니다.
이번 문제를 잡는 테스트가 통과하면, 연결된 기존 동작도 확인합니다.
검색어 직접 입력, 빈 값 처리, 새로고침, 뒤로 가기처럼 변경의 영향을 받는 경로를 선택합니다.
OpenAI의 Codex 예제도 검토·수정·검증을 연결하고, 남은 실패를 다음 수정의 입력으로 전달하는 반복 구조를 설명합니다.
OpenAI의 반복 수정 루프 예제↗
AI에게 “테스트 실패했어, 다시 고쳐”만 전달하면 같은 가설을 반복할 수 있습니다.
전체 로그를 붙여 넣기 전에 실패한 명령, 테스트 이름, 기대값과 관찰값, 관련 로그 위치를 정리합니다.
원본 로그는 필요할 때 다시 읽을 수 있도록 보관합니다.
검증 실패 전달
명령: npx playwright test tests/search-history.spec.ts실패: 뒤로 가기 뒤 검색어가 URL과 함께 복원된다기대: 입력값 alpha관찰: URL은 q=alpha, 입력값은 beta통과: 첫 검색, 두 번째 검색, URL의 뒤로 가기변경: SearchForm의 초기값 처리다음 확인: URL 변경을 입력 상태가 다시 읽는지로그: test-results/search-history/error-context.md
실패 요약에는 실제로 확인한 사실과 다음 가설을 구분해 적습니다.
“URL은 바뀌었다”는 관찰이고, “상태 동기화가 빠졌다”는 아직 확인해야 할 가설입니다.
이 구분이 있어야 AI가 추측을 확정된 원인처럼 취급하지 않습니다.
“모두 정상입니다”보다 검증 범위가 드러나는 보고가 다음 작업에 도움이 됩니다.
실행한 명령, 확인한 동작, 남은 한계를 구분하면 사람이 무엇을 더 볼지 바로 판단할 수 있습니다.
완료 보고 예시
변경: URL 변경 시 검색 입력값도 동기화통과: 타입 검사, 검색 상태 단위 테스트통과: alpha → beta → 뒤로 가기 → 새로고침 E2E확인: URL과 입력값이 alpha로 복원미검증: Safari 실행 환경이 없어 해당 브라우저 미확인제외: 검색 API와 정렬 규칙은 변경하지 않음
위 보고는 형식을 설명하는 예시이며, 이 글에서 실제 서비스에 실행한 결과는 아닙니다.
실제 작업에서는 확인하지 않은 명령이나 브라우저를 통과 목록에 넣지 않습니다.
👨💻
검증 뒤 코드를 다시 수정했다면 그 수정에 영향을 받는 검사를 다시 실행합니다.
이전 버전의 통과 결과를 최종 코드의 근거로 재사용하지 않습니다.
Claude와 Codex에 다음 요청을 작업 내용에 맞춰 전달할 수 있습니다.
명령과 완료 조건을 구체적으로 적으면 AI가 코드 작성과 검증을 하나의 작업으로 다룰 수 있습니다.
AI 코드 수정 요청
목표: 검색 필터의 뒤로 가기 복원 오류 수정재현: alpha로 검색 → beta로 검색 → 뒤로 가기기대: URL과 입력값이 모두 alpha, 새로고침 뒤에도 유지범위: 검색 폼 상태와 관련 테스트검증: 기존 package.json의 타입 검사와 관련 테스트 실행회귀: 위 재현을 잡는 테스트를 수정 전후로 확인재시도: 같은 실패에 새 근거가 없으면 원인과 상태를 보고완료 보고: 변경 요약, 실행 명령, 결과, 미검증 범위
작은 수정에는 필요한 항목만 사용합니다.
모든 작업에 긴 템플릿을 반복하기보다, 오류를 판단할 기준과 확인할 수단이 빠지지 않도록 유지합니다.