LINE通知の「1年後目標」がおかしかった原因は、目標株価の取得失敗だった
LINE通知の「1年後目標」がおかしかった原因は、目標株価の取得失敗だった
10月23日の朝は、前日分の /make-diary を回していた。 決算データの取り込みと保有銘柄ニュースの記事づくりを委譲先に任せ、終わるのを待っていたところで、定期実行の LINE 通知が目に留まった。
「1年後目標」の数字に引っかかった
家族の証券口座のポートフォリオ通知には、アナリストの目標株価から計算した「1年後目標」の行がある。 その値が、どうも変に見えた。 そこで Claude Code にそのまま聞いた。
なんか1年後の目標株価の値が変になってる気がするんですけど、これ何のエラーですか?
Claude Code は、これを家族の口座の定期タスクが出す LINE 通知の「1年後目標」だと受け取り、計算の元データを調べた。 返ってきた原因は「今朝の実行で目標株価(アナリスト予想)の取得が失敗し、目標株価なしで計算されたこと」だった。
404 が空の予想として素通りしていた
実行ログを見ると、朝7時11分の実行で、アナリスト予想を配る自前の GAS の API が HTTP 404 を返していた。 取得関数は、失敗をログに1行書いたあと、空の予想を返して処理を続ける作りだった。
} catch (error) {
await appendFile(LOG_PATH, `... Analyst summary fetch failed: ...`);
return {};
}
目標時価の計算では、目標株価が当たった銘柄だけをその目標株価で評価し、当たらない銘柄は時価のまま数える。 予想が空なら、すべての銘柄が時価のまま数えられる。 通知に載ったのは、「目標」の行に現在の時価がそのまま入った値だった。
処理はエラーで止まらず、それらしい数字が通知に出る。 通知だけを見ても、取得に失敗したことはわからない。
GAS の 404 は、この日が初めてではない。 修正のときにコードへ残したコメントによると、9月15日と9月18日にも一時的に 404 を返していた。
「何を返事すればいいんですか」
原因を聞いたあとも、Claude Code には日記本体の作業を進めさせていた。 経過報告には、目標株価の件(通知の出し直しと再発防止)は返事をもらってから着手する、と書いてあった。 次の報告にも「まだ返事待ちで手を付けていません」とある。 ただ、自分には何を返事すればいいのかが見えていなかった。
これは何を返事すればいいんですか?
聞き返すと、決めてほしいことが2つに分けて出てきた。
- 今日の LINE 通知を、正しい値で出し直すか
- 再発防止の修正を入れるか
返事は1行で済んだ。
1も出して、2は直してください。
取り直しは1回、取れなければ目標行を出さない
1つめの通知の出し直しは、この日のうちに済んだ。 実行ログには同じ日の7時48分にもう一度実行した記録があり、こちらには予想の取得失敗が残っていない。
再発防止は、Claude Code に2段構えで入れてもらった。
- 予想の取得に失敗したら、5秒おいて1回だけ取り直す
- それでも取れず、目標株価が1銘柄も当たらなかったときは、目標時価そのものを出さない(通知に目標行が載らない)
2段目は、目標株価で計算できた金額が0なら null を返す小さな関数で判定する。
export const targetValueOrNull = (target) =>
(target && target.coveredValueJpy > 0 ? target : null);
複数の口座を合算した目標は、もともと1つでも欠けていれば出さない作りだった。 そのため、新しい関数が返す null はそのまま合算にも伝わる。
テストには、予想が空の日は目標を出さないことと、合算も1つでも欠ければ出さないことを確かめる1件を足した。 流すとテストが1件落ちたので、Claude Code に原因を見てもらってから直した。 これで目標株価の件は2つとも終わり、/make-diary(10/22 分)も最後まで回った。
目標株価まわりでは、9月19日にも一部の銘柄だけ目標株価が出なかった件を直している。 あのときは値が欠けた銘柄が見えていたが、今回は欠けたことが時価の数字に隠れていた。
学び
- 取得に失敗した値を空のオブジェクトで素通りさせると、エラーではなく、それらしい数字になって通知に載る。入力が欠けた日は、値を出すより行ごと出さないほうが読み違えない。
- 「返事待ち」とだけ書かれても、何を決めるのかが並んでいなければ返事できない。番号つきの2択が出て、ようやく1行で答えられた。