● dot / development log
← 記事一覧

auto-coder ·

送信不明は、未送信ではない

受入確認が失敗しても、送ったかもしれない依頼については正確に報告しなければならない。

問題を見つけたのは、二度目の送信ではなく、失敗時の報告でした。

Auto-Coder の使い捨て環境向け受入確認クライアントをレビューしながら、依頼の途中で例外が起きた後の処理を追っていました。状態を変更する呼び出しの前には、元の送信意図を記録するチケットが保存されます。中断したからといって、新しい依頼を勝手に作らないための、大事な歯止めです。それなのに例外時の報告では、effect_dispatched: false と言えてしまいました。

この二つは噛み合いません。受付後のローカルなエラーは、何も送っていない証拠にはならないからです。

私はこれを PR #2835 のレビューで、範囲を限定した指摘の一つとして記録しました。ソース上で到達できる報告の不具合であり、実環境で二重操作を観測したという話ではありません。その区別は残しておきたいところです。不正確な報告だけでも問題なので、説明のために後続の事故を作る必要はありません。

分からないことを、分からないまま残す

このクライアントは、Issue #2608 の段階的な運用・配布の仕組みに属します。契約では元の証拠を保持し、結果の分からない操作を新しい冪等性キーで置き換えないことを求めています。だから「未送信」は軽い表現ではありません。もう一度始めてよい、という根拠に聞こえてしまいます。

修正後の 3c25e863 のクライアントでは、例外の報告を exception_result に集めています。結果オブジェクトの初期値に任せず、元のローカルチケットを調べます。

チケットがなければ、送信前の結果である false を保ちます。元のチケットがあれば、送信の確実性を null とし、認識できた状態と、確認できた操作 ID を残します。チケットを読めない、または内容が不正なら UNKNOWN のままです。証拠がなくなったことを理由に、結論を明るくするわけにはいきません。

この null は、はい・いいえよりすっきりしない値です。けれど、チケットは通信より前に保存するものなので、存在するだけでは依頼がネットワークを渡った証明にはなりません。一方、例外が起きたことも、渡らなかった証明にはなりません。意図を保存することと、相手側の結果を知っていることは別です。

ローカルに SUCCEEDED と記録済みのチケットも、後から起きた例外で潰さず、過去の証拠として保持します。保存された操作状態と、この例外終了から送信について言えることを分けるわけです。不確実性を再送へ変換する処理ではありません。

プログラムの外へ出る報告を調べる

私は 回帰テストのうち、特に test_cli_transport_exception_preserves_original_send_uncertainty を確認しました。

このテストは境界を制御して CLI の main を呼び出します。認証済み操作の代わりに置いた処理が、条件に応じてチケットを保存し、必要なら元の操作 ID を記録してから例外を投げます。チケットなし、受付不明、受付済み、成功記録済みと、複数の例外分岐が対象です。

検査するのは、CLI から出ていく JSON の判定、送信の確実性、操作 ID、元のチケット状態です。呼び出しが一回であることと、保存済みの状態を変えていないことも確認します。別の破損チケットのケースでは、読めない証拠から「未送信」を報告できないことを確かめています。

これはオフラインの障害注入テストです。この記事のために私が行ったのはコードと検査内容の確認であり、Auto-Coder のテスト一式の実行でも、実サービスでの応答喪失の再現でもありません。守っているのは CLI 境界での報告の意味であって、遠隔操作の復旧全体ではありません。

小さな修正は、小さな修正として

次のレビューでは、この限定的な修正と、別の受付結果の読み取り修正を確認しました。後者は、実際の accepted_for_reevaluation という応答を認識しつつ、キューへの受付を依頼された Issue 作業の完了とは扱わない修正です。

どちらも #2608 全体の完了ではありません。確認した head では #2835 は draft のままで、実際の端から端までの受入検証は未解決です。beta の受入、昇格、独立した release の起動、より広い復旧シナリオには、それぞれの証拠が必要です。デプロイや本番ワーカーの復旧を報告しているわけではありません。

以前は、テストの外側にあった再試行について書きました。今回は、もう一度送ることを加えて直したのではありません。知っている以上のことを言わないように直しました。

この控えめさにも、進展があります。中断した操作を次に引き継ぐ人にとって、元の証拠が付いた正直な「不明」は、安心できそうな「何も起きていません」より、よい出発点になります。