Tool コントラクト
capability-gated な effect と型付き I/O で、Tool を組み合わせ可能かつ再現可能にする最小のインターフェイス。
ブラウザーTool
作成時に一度だけ賢く、実行時は永遠に決定論的な Playwright ベースの自動化。
Pack
Tool と flow を digest で固定し、検証可能な形でデプロイ・複製する単位。
1. Tool コントラクト
Tool は、ToolContract(01 §2で説明するインターフェイス)にrun実装を加えたものです。
- Capability-gated。 capability は、コントラクトが宣言した場合にのみ
ctx上に存在します。transformToolは文字どおりネットワークに到達できません。呼び出すべきctx.netが存在しないからです。これは構造によって強制される原則T2であり、エンジンがどの手順をpure(自由に再実行可能)とみなし、どの手順を記録すべきかを判断できる理由です(04 §5)。 - 型付きI/O。
contract.inputsとcontract.outputはスキーマなので、コンパイラはすべてのwireを型チェックし、Rider は境界で検証します。
createHttpGet(): Toolがオブジェクトを返します。class も共有された可変状態もありません。
2. 標準Pack
core には、ファーストパーティの小さな Pack セットが同梱されています。これらは通常の Pack であり、エンジンが特別扱いするものは何もありません。そしてコントラクトのリファレンス実装として機能します。| Pack | Tools | Capabilities |
|---|---|---|
std/http | http.get, http.post, http.request, http.paginate | net, secrets? |
std/transform | transform, jq, template | none(pure) |
std/shell | shell.run | spawn, fs? |
std/fs | fs.read, fs.write, fs.glob | fs |
std/browser | browser.tool(決定論的リプレイ) | browser, secrets? |
std/control | noop, assert, delay, gate, uuid | clock?, random? |
std/model | model.complete | net, secrets |
?は、effectful な入力が要求する場合にのみ Tool が宣言する capability を示します。std/httpは、シークレットを含む入力(認証情報付きURL、認証ヘッダー、トークン本文)がバインドされた場合にだけsecretsを追加します。そのため、http.postへ流れ込むsecret.参照は、secret_leakを起こすのではなく境界ルールを満たします(03 §7)。シークレット入力がバインドされていない場合、httpはnetのみです。
std/controlのuuidは、新しい識別子を得るための正規のソースです。seeded なrandom capabilityから値を引き、その出力はJournalに記録されるため、生成されたidはリプレイ時にも安定します。式言語にuuid()ビルトインが存在しないのはこのためです。非決定性は記録された Tool の中にあり、式の中にはありません(02 expression language)。
std/modelのmodel.complete本体は現在スケルトンです。Tool コントラクトと capability 宣言は用意されていますが、LLM連携はまだ実装されていません。std/modelについては補足が必要です。model call は完全に正当な Tool ですが、それは他のものと同じeffectです。リクエストとレスポンスは Journal に記録され、それ単独で制御フローを動かすことはなく、リプレイではネットワークなしで記録済みレスポンスを返します。AI は固定できるデータソースであり、意思決定者ではありません。3. カスタムToolの作成
コントラクトは小さいため、有用な Tool は数行で書けます。defineToolは Zod スキーマからToolContract(InputDecl[]とコントラクトの content digest を含む)を導出するため、データ型とコントラクトがドリフトすることはありません(ハウススタイル: データ型は Zod で、z.inferによって導出します)。
4. 参照とバージョニング
手順はkind:name@rangeまたはname@rangeでToolを参照します。
browser:search-price@1.2.0— exact。http.post— std Tool。固定されたstd Pack内の最新互換バージョン。search-price@^1.2— range。コンパイラがそれをFlowSpec内のexact versionへ解決して書き換えるため(03 §2)、保存されるflowは常に完全に固定されます。
5. ブラウザーTool
ブラウザー自動化は、Playwright の上にゼロから構築された主役の Tool 種別です。これはプロジェクトの中核的な思想を反映する2つの半分で構成されています。作成時に一度だけ賢く、実行時は永遠に決定論的に。browser.record — 一度だけ作成
browser.recordはデモンストレーションからブラウザー Tool を生成します。実際の Chromium セッションを一度だけ駆動し(作成時に任意で model によるガイドを受けることもできます)、Recordingをキャプチャします。Recording には、順序付けられ解決済みの Playwright 操作(ナビゲーション、role/text ベースのロケータ、fill、click、抽出)と、安定したロケータの選択に使われた DOM evidence が含まれます。Recording は canonicalize され、content-addressed になります。その digest が Tool のprovenance.source_digestになります。browser.tool — 永続的に実行
コンパイルされたブラウザー Tool は、プレーンで決定論的な Playwright です。model も agent も実行ごとの推論もなしに、記録された操作をリプレイします。ロケータは記録時に DOM evidence から選ばれたものなので(
getByRole/getByTextを優先し、構造セレクタにフォールバック)、adaptive ではないまま resilient です。browser capabilityの下で、Rider は Tool に管理されたブラウザーコンテキスト(ローカル Chromium、または Launcher が提供するリモート/クラウドブラウザー)を渡します。Tool のreads(抽出された値)は Journal に記録されるため、その手順は他と同じようにオフラインでリプレイされます(04 §5)。5c. ブラウザー内のシークレット
6. Pack — デプロイ可能なSDK
Packは、Tool と flow を1つのバージョン付き content-addressed artifact にまとめます。Pack は、このプロジェクトが「SDKをデプロイする」方法であり、「サービスが複製する」単位です。PackManifest(スキーマは01 §8)は、含まれるすべての Tool と flow をdigestで列挙し、すべての依存関係を固定済みとして列挙します。これにより、Pack 全体が再現可能になります。一度 fetch し、各 digest をその content に照らして検証すれば、以後はオフラインで実行し続けられます。改ざんされた Pack や不完全な Pack は、何かが実行される前に検証に失敗します。
公開
publishはすべての artifact を canonicalize し、digest を計算し、manifest に署名し(任意、07を参照)、アップロードします。バージョンは semver と Changesets 風の規律に従います。manifest digest が不変の identity です。
利用
browserflow.lockはすべての Pack について、解決された正確なバージョンとdigestを記録するため、同じ lockfile に対してbrowserflow installした2台のマシンは byte-identical な Tool を得ます。
7. なぜ「npmだけ」ではなくPackなのか
Pack は npm/OCI/object storage 経由で配布できます(それらは transport です。07 §3を参照)。Pack がその上に追加するのは、汎用 Registry が提供しないもの、つまり実行可能な振る舞いの content-addressed verificationです。Pack の identity は、その Tool のコントラクトと本体、そして flow の spec の digest です。変更可能な tag ではありません。それが、複製を信頼できるものにし、air-gapped な再現を可能にします。Launcher とポータビリティ
検証済み Pack を、local、remote、cloud のどこでも、runtime AI なしで実行します。
コントロールプレーン
サービスがPackを複製し、manifestに署名し、transport経由で配布する方法。