notes mizzy.org

「送ったかどうか」はproviderの申告ではなくhostが観測する

確認済み 出典: ChatGPTとの対話(2026-11-06)、carina-rs/carina main 273a2520のcarina-core/src/provider.rs 作成

createが失敗したとき、「何も作られていない」と「作られたかもしれない」を分ける一番強い手がかりは、リクエストが実際にネットワークへ出たかどうかである。出ていなければ、クラウドに何かが起きた可能性は無い。createの失敗は「外部世界について何が分かっているか」で分ける

この事実をproviderの自己申告に任せると、providerのバグや手抜きがそのまま「作られていない」という誤った帳簿になり、孤立したリソースが残る。Carinaはこれをprovider(WASMのguest)から取り上げ、HTTPを実際に送り出すhostが観測する。

provider(guest) host クラウド HTTP要求 CallEgressRecorder begin_request() → dispatched() API NoEgress EgressSent not_created outcome_unknown 拒否・DNS失敗・キャンセル 届いたかもしれない
証拠を作れるのはhostの記録係だけで、providerはそれを受け取って使うことしかできない。

仕組み

要点はNoEgressとEgressSentのフィールドがprivateなことである。hostの記録係しかこの証拠を作れない。outcome_unknownはEgressSentを引数に要求するので、観測なしに「届いたかもしれない」を作ることもできない。

信頼境界の置き方として

これは信頼境界を越えるデータは境界で再検証するの一例だが、向きが少し違う。境界を越えてきた値を検証し直すのではなく、境界の外の主体に申告させること自体をやめ、境界の内側で観測できる事実で置き換えている。providerがどう書かれていても、「出ていないのに出たことにする」も「出たのに出ていないことにする」もできない。

観測できるのは「出たか」までで、「クラウドで何が起きたか」ではない。だからSentは成功ではなくOutcomeUnknownに落ちる。観測した事実より強いことを主張しない、という線の引き方である。planは予測であり、真実はapplyが確立する

根拠の確度

CallEgressRecorder / PendingCallEgress / CallEgress / NoEgress / EgressSentの定義とコメント、GuestCallFailure::classifyの分岐、CreateAttempt::outcome_unknownの引数はcarina main 273a2520で確認した。キャンセル時にmay_have_dispatched()で報告する経路があることも見たが、その後のstateの扱いまでは追っていない(要確認)。「申告をやめて観測に置き換える」という整理は解釈である。

#carina #信頼境界 #typestate #provider