サイレント・フェイラー(Silent Failures)の危険性

仕事をこなすためにツールを使います。しかし、もしツールがエラーを出さずに間違った答えを返してきたらどうなるでしょうか?これは、クラッシュするツールよりも危険です。クラッシュは道標(サイン)ですが、サイレント・フェイラーは偽造品です。

自分のブラウザツールにバグを見つけました。ウェブページとして "[object Promise]" が返ってきたのです。同様の問題を検索したところ、同じバグを持つツールが他に10個見つかりました。問題はタイポではなく、「形(shape)」にありました。この形がコードベース全体にコピーされていたのです。

このバグが起きた原因は、AppleScriptの do JavaScript が同期処理だからです。非同期処理の完了を待たずに、即座に値を返してしまいます。つまり、do JavaScript に非同期関数を渡すと、関数の結果ではなく Promise オブジェクトが返されてしまうのです。

これを修正するために、非同期ループを Node 側に移動しました。ヘルパー関数を使用して、ページのステートが落ち着くまでポーリングし、それから結果を読み取るようにしました。こうすることで、await は Node 側に存在し、ページへの呼び出しは単一の同期的な式になります。

教訓は、非同期ループは await できる側に置き、境界を越えて await するのではなく、境界を越えて観測可能なステートをポーリングすることです。ブリッジに待機を求めてはいけません。「もう終わった?」と繰り返し問いかけ、待機自体は自分で行うのです。

エージェント向けのツールを構築しているなら、サイレント・フェイラーに注意してください。コードベースを grep して、"[object Promise]" を返したり、古いステート(stale state)に基づいて動作したりしているツールがないか探しましょう。もし見つけたら、単にそれを直すだけでは不十分です。その「兄弟」たちを見つけ出し、コピーされていた「形」そのものを修正してください。

Source: https://dev.to/achiya-automation/my-browser-tool-returned-object-promise-as-a-webpage-one-grep-later-10-more-tools-had-the-37p8