1. 問題

チームが自動化するとき、行き着く先はたいてい2つです。強力ではあるものの 閉じ込められたホスト型オーケストレーター(自分のラップトップでは動かせず、 fork もできず、安価にセルフホストもできない)か、ネットワークが一瞬乱れたり、 依存関係が浮いたり、それを理解していた唯一の人がいなくなったりするまでは 動く、寄せ集めのグルースクリプト群です。最初に失われるのは再現性であり、 「AI に頼んでワークフローを再生成すればよい」は再現性の説明ではありません。 それはレイテンシとコストが余計にかかるコイントスです。 難しいのは 合成 です。「価格を調べ、下がっていたら Slack に投稿し、 チケットを開く」。手順を連結するところで、多くのシステムは上の2つの失敗モードの どちらかに逆戻りします。 browser-flow は、ただ1つの確信に基づいてゼロから作られています。 プロセスの定義と、それが同じように実行されるという保証こそがプロダクトである。 それ以外のもの、つまりストレージ、トランスポート、UI、ホスティングはすべてアダプターです。
依存関係ではなく参照。 兄弟プロジェクトである browser-flow は、1つの自然言語タスクを 1つの決定論的な Playwright Tool にコンパイルします。私たちはその思想、つまり 実行時に LLM を使わないこと、一度作成したらずっと実行すること、 content-addressed provenance、境界に置かれるシークレット、そしてそのエンジニアリング上の 規約を借りていますが、browser-flow はそのコードを一切取り込んでいません。 自己完結しています。

2. それが何であるか

これは、次の柱を備えたワークフローエンジンおよびサービスです。

2つのオーサリング手段

fluent で型安全な TypeScript SDK と、宣言的な YAML 形式。どちらも1つの FlowSpec(IR)に変換されます。

決定論的実行エンジン(Rider)

リトライ、冪等性、チェックポイント、再開を伴って手順の DAG をスケジュールし、 実行時にモデルを呼び出すことはありません。

Tool contract

任意の決定論的な作業単位を包みます。ブラウザーオートメーション(Playwright)、 HTTP 呼び出し、シェルコマンド、純粋な変換、または独自の処理。

Pack system

tools と flows(デプロイする「SDK」)をまとめた、バージョン付きかつ content-addressed なバンドル。Registry に公開され、Registry 間で 複製 されます。

Launcher layer

CLI、REST、MCP、cron、CI、container、edge の間で、エンジンを変更せずに実行します。

任意のコントロールプレーン

エンジンをサービスに変えます。スケジューリング、シークレット、RBAC、複製、 Run Inspector を提供します。

3. それが何でないか

実行パス上にモデルは存在しません。AI は Flow の 作成(手順の提案、YAML の下書き)を 手助けすることはありますが、実行時に Flow が何をするかを決めることはありません。 手順からモデルを呼び出すことは できます。ただしそれは、記録される入力と出力を持つ、 通常の宣言済み Tool です。隠れた意思決定者ではありません。
Flows は型付き手順のグラフであり、任意のコードではありません。escape hatch (code tool)は存在しますが、主経路は宣言的で検査可能です。
コアはライブラリとバイナリです。サービスは任意採用で、置き換え可能です。 Open core、Apache-2.0 です。
ストレージ、キュー、シークレット、トランスポートはインターフェースであり、 妥当なローカルデフォルト(SQLite、ファイルシステム)を持ちます。

4. 設計原則

これらは支柱となる原則です。将来の判断がこのいずれかと衝突した場合、 書面で明示的に上書きされない限り、原則が優先されます。

T1 — 1つの真実、2つの表現

SDK と YAML は対等な存在です。どちらか一方が「本物」なのではありません。 どちらも FlowSpec にコンパイルされ、FlowSpec は YAML にラウンドトリップできます。 片方の手段でしか動かない Tool はバグです。

T2 — デフォルトは決定論的、effects は permission による

手順は、そうでないと宣言するまでは純粋です。time、randomness、environment、 network、filesystem、secrets、process spawning は、run context を通じて注入される capabilities であり、ambient ではありません。これにより実行は解析可能、 サンドボックス化可能、リプレイ可能になり、実行時に LLM を使わないという保証が誠実に保たれます。

T3 — 再現性は content-addressed である

Flow は、安定した sha256 digest を持つ canonical FlowSpec にコンパイルされます。 Flow digest、tool/pack versions、記録された inputs を pin すれば、その実行は任意の マシン上でオフラインに再現可能です。digest こそが version です。

T4 — portable な core、pluggable な edges

engine は少数の interfaces(Store, Clock, Random, Secrets, Logger, ToolHost, Journal)だけに依存します。すべての launcher と backend は、 それらの interface の implementation です。engine がクラウド SDK を import することはありません。

T5 — code は最小限、legibility は最大限

新しい Tool は、Zod-typed な input/output schema と run function を持つ小さな object です。 新しい launcher は engine.run() を包む薄い shell です。ある feature が大量の core code を 必要とするなら、それはおそらく engine ではなく Pack に属します。

T6 — local-first、cloud-optional

すべては infrastructure なしで動きます。state には SQLite、artifacts には filesystem、 secrets には file を使います。scale out では concepts ではなく implementations を差し替えます。 pip install / npm i で tools は動き、engine はそれらが動く場所ならどこでも動きます。

T7 — loud に失敗し、clean に再開する

Errors は typed(DomainError lineage)であり、原因となった手順、input、journal frame と ともに表面化します。どの実行も、完了済みの手順を再実行することなく、最後の durable checkpoint から再開します。

T8 — 意図的に boring に、シークレットは境界に

Stable formats、explicit versions、clever globals なし、module-level singletons なし。 secret: true と marked された inputs(cookies、tokens、credentials)は、FlowSpec、 journal、log、公開済み Pack のいずれにも入りません。その値は、secrets capability を 宣言した手順の内側でのみ、実行時にのみ resolved されます。

5. House conventions

この repository は、厳格で意図的に boring な engineering style に従います (browser-flow reference が使う conventions と同じなので、family として一貫して感じられます)。
  • TypeScript、class なし(Error subclass は例外)。closure-held state を持つ factory functions、parameter として注入される dependencies、module-level singletons なし。
  • Type trichotomy。 Data types は Zod schemas で、TS は z.infer から導出します。 behaviour/contract types(function member を持つもの)は interfacetype は unions / mapped / branded constructs のために予約されています。
  • Schemas は .strict() であり、schema_version literal によって versioned されます。
  • pnpm + bun monorepo、Turborepo-cached な test / typecheck / build / lint(Biome)、mise によって pinned された toolchain。API は Hono on Bunpackages/web-api)、web は Next.jsapps/web)、persistence は SQLite (built-in。external database は不要)です。
  • Co-located *.spec.tsbun test。Open core、Apache-2.0、@browserflow scope、releases には Changesets。
  • 作業言語は英語。committed prose artifact はすべて英語です。
これらの conventions が domain schemas をどのように形作るかは、 domain model を参照してください。

6. 60秒でつかむ mental model

横軸は 作成 → コンパイル → 実行 という一方向のパイプラインです。破線は T3(再現性は content-addressed である)を表します。digest が pin されていれば、 content-addressed Flow はどのマシンでも同じ Run journal を再現できます。
次に domain model を読んでください。すべての box が正確に命名されています。

ドメインモデル

正確な語彙: Flow、Step、Tool、Pack、Run、Journal、そしてその背後にある schemas。

SDK と YAML によるオーサリング

型安全な TypeScript SDK または宣言的な YAML で、Flow を一度だけ作成します。

FlowSpec IR

両方のオーサリング手段が変換される、canonical かつ content-addressed な intermediate representation。

実行エンジン

Rider がリトライ、冪等性、checkpointing、再開を伴って DAG をスケジュールする仕組み。