LINE通知の「1年後目標」がおかしかった原因は、目標株価の取得失敗だった

開発financial-data

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つに分けて出てきた。

  1. 今日の LINE 通知を、正しい値で出し直すか
  2. 再発防止の修正を入れるか

返事は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行で答えられた。
#LINE通知#GAS#目標株価#リトライ#テスト#デバッグ