エアギャップが特別な出来事ではない理由
このエンジンは注入されたcapabilityに対する純粋関数です(原則 T2/T4)。クラウドSDKをインポートせず、ambient globalを読まず、時計、RNG、ネットワーク、ファイルシステム、シークレットにはRunDepsを通じてのみ触れます(実行)。FlowSpecとそのPackはcontent-addressedなので、接続されたノートPCで検証済みのFlowは、境界内でもバイト単位で再現されます。FlowSpecとPackのdigestが同一だからです(原則 T3)。
したがって、境界を越えるものは、自己完結しdigestで検証された次の3つの成果物だけです。
| 成果物 | 含むもの | 必須 |
|---|---|---|
| FlowSpec | コンパイル済みFlow(*.flow.json、例: sha256:7f3a…) | はい |
| Pack(s) | Flowが参照する固定済みTool実装 | はい |
| Journal | hermetic replay / 監査のための記録済みRun | 任意 |
daily-price-watchです。ブラウザTool(search-price@1.2.0)が価格を読み取り、transformがその形を変え、条件付きのhttp.postがシークレットwebhookに通知します。
手順
接続された側で自己完結したPackをエクスポートする
Registryに到達できるマシンで、固定済みPackを単一のdigest検証済みバンドルとしてエクスポートします。正確なバージョンを固定してください。digestが契約です。生成される
pricing.packは自己完結しています。daily-price-watch Flowが参照するTool実装(search-price@1.2.0を含む)を含み、digestで検証されます。FlowSpecがまだPackの横に置かれていない場合は、同じ方法でFlowSpecもエクスポートします。境界を越えて移動する
境界が許可する任意の方法で成果物を運びます。USBメディア、内部ミラー、一方向のファイルドロップなどです。話すべきプロトコルはありません。これは通常のファイルです。FlowSpecと、監査グレードの再現をしたい場合はJournalも、同じ方法で移動します。
境界内でインストールして実行する
分離された側でバンドルをインストールし、Flowを実行します。インストール時には、何かを信頼する前にdigestが再検証されます。CLI Launcherにインフラは不要です。SQLiteストア、ファイルシステム上の成果物、ブラウザTool用のローカルChromium、そして環境自身のシークレットプロバイダーだけで動きます(Launcher)。
daily-price-watchが条件付きのhttp.postに到達すると、webhook認証情報は呼び出しの瞬間にそのローカルSecrets providerから供給されます。運び込んだ何かから供給されるわけではありません。Journalで監査グレードの結果を再現する
外部には一切触れない決定論的な再現のために、記録済みJournalも運び込み、hermeticにリプレイします。デフォルトモードはいかなる種類の外部呼び出しも行わず、シークレットも必要としません。記録済みのすべての
net、clock、random、fs read、browser effectはJournalから提供されます(実行)。--verifyは、すべての手順出力が記録済みdigestと一致することを表明します。そのため、エアギャップ環境での再現は、接続された側で記録されたものと同じRunであることを証明できます。シークレットを境界の外に置いたままにできる理由
シークレットは式レイヤーを通過しません。静的に強制されるtaint ruleによって締め出されます。そのため、シークレット値が実体化する唯一の場所は、解決を行うToolの内側です。そこはeffectを記録するレイヤーでもあります。Recorderはどのバイトがシークレット由来かを把握し、それらをredactします。シークレットを含むヘッダー、クエリパラメーター、bodyフィールドは、値そのものではなく、安定したプレースホルダー({secret:<slot>})としてJournalに記録されます(実行)。
hermeticな
replay / --verifyは、何にも触れないため、エアギャップに適したToolです。オプトインの--rerunモードは異なります。effectをライブで再実行するため、条件付きのhttp.postは実際に再度発火し、関連するシークレットを実行時に再解決する必要があります。境界内のライブシステムに対してFlowを再駆動する意図がある場合にのみ、--rerunを使ってください。よくある質問
エアギャップ環境でFlowを実行するにはJournalが必要ですか?
エアギャップ環境でFlowを実行するにはJournalが必要ですか?
いいえ。Journalが必要なのはhermetic replay(記録済みの特定のRunを監査グレードで再現すること)だけです。境界内でFlowを新しく実行するには、FlowSpecと固定済みPackが必要です。ブラウザとネットワークのcapabilityはローカルで実行され、シークレットは環境自身のproviderから取得されます。
境界内で手順のretryが必要になった場合はどうなりますか?
境界内で手順のretryが必要になった場合はどうなりますか?
retryの扱いは変わりません。各手順呼び出しは安定した冪等性キー(
hash(run_id, step_id, inputs_digest))を持ちます。このキーは意図的に試行回数を除外するため、webhookへのhttp.postはそれを渡すことができ(例: Idempotency-Keyヘッダーとして)、retryされたRunが二重に発火することはありません(実行)。境界内で中断されたRunは再開できますか?
境界内で中断されたRunは再開できますか?
はい。再開はJournalからコンテキストを再構築します。完了済みの手順は記録済み出力を返し、記録済みeffectは記録済み結果を返すため、外部のものが再発火することはありません(原則 T7)。シークレットだけは例外です。再開時にライブで再解決され、Journalから読まれることはありません(実行)。
関連
Registryを複製する
境界の内側にある内部RegistryへPackとFlowをミラーします。
テストとリプレイ
Journalをfixtureとして固定し、
--verifyでToolアップグレードをゲートします。シークレット
分離環境自身のproviderが実行時に認証情報を供給する仕組みです。