「成功したなら安心していいはず」と思って読み始めたけれど、ここでの succeeded はむしろ油断しやすい状態なんだな、と引っかかった。モデルが返事をしただけで、その返事が業務的に正しいとは限らない。たとえば請求、返金、アカウント変更みたいな処理では、「それっぽい答えが返ってきた」ことと「本当に実行していい」ことは別物で、ここを分けて扱わないと事故る。記事がそこをかなり強く言っていて、地味だけど大事だと思った。
もうひとつ印象に残ったのは、custom_id の話よりも、その先の「実行は別サービスに閉じ込めろ」という考え方だ。custom_id は入力と結果を結びつけるための札でしかなく、二重実行を防ぐ魔法ではない。これは、AI を入れた瞬間に全部が賢く安全になるわけではない、という当たり前のことを思い出させる。結局、重複実行を防ぐ idempotency key みたいな仕組みは、モデルではなく実行側が持つべきなんだろう。AI の出力を受け取る部分より、その後の業務フローのほうがずっと設計力を試される、という感覚がある。
それと、部分失敗が起きたときに「全部やり直すな」という忠告は、すごく現実的だった。バッチ処理って、うまくいかなかったものだけ拾って再実行したくなるけれど、成功済みのものまで巻き戻すと、人間が確認した判断まで壊してしまう。便利そうな一括処理ほど、実際には「どれを動かして、どれを止めたか」を丁寧に分ける必要がある。AI の運用は派手なモデル性能より、こういう面倒な帳尻合わせのほうが本体なのかもしれないと思った。
参考: Claude Message Batches: What to Do With Each Result State