Reelier
公式エージェントは主張を行う。Reelierはレシートを書き出す——エージェントのツール呼び出しワークフローを一度記録し、0トークンで決定論的に再生し、実行の差分を取ってドリフトを検出する。
Reelier MCPで何ができますか?
- Scan agent history for replayable workflows —
reelier_scanは、過去の Claude Code、Codex、Windsurf、または OpenClaw セッションから、スキルにコンパイル可能なツール呼び出しシーケンスを発見します。 - Compile a session into a deterministic skill —
reelier_from_sessionは、記録されたトレースをSKILL.mdファイルに変換し、各ステップにアサーションを付与します。LLM は関与しません。 - Replay a skill at zero tokens —
reelier_replayは、コンパイルされたスキルをミリ秒単位で決定論的に実行します。デフォルトでは読み取り専用で、バイト単位で同一のレシートを生成します。 - Diff two runs to catch drift —
reelier_diffは、リプレイをステップごとに比較し、SAME または DRIFTED を失敗したアサーションとともに報告し、ドリフト時には非ゼロで終了します。 - Push a receipt for a shareable permalink —
reelier_pushは、実行レシートを台帳に同期し、オプションで検証済みリプレイバッジを生成します。
ドキュメント
Reelier
エージェントは主張する。Reelier はレシートを書く。
成功した実行を記録し、それを決定論的に再生する — 0 トークン、バイト単位で同一、全ステップにレシート — そして reelier diff はそれがずれた日を捉えます。
エージェントのツール呼び出しワークフローに対する CI + スナップショットテストと考えてください。
あなたのエージェントは毎回同じワークフローを再導出し、トークンを消費し、静かにずれていきます。Reelier は成功した実行を SKILL.md ファイルにコンパイルし、それを決定論的に再生し(LLMなし、0トークン、全ステップがレシートとしてアサート)、実行結果を差分比較して、一致しなくなった日を捉えます。「実行された」が証明にならない、定常的な本番ワークフローを担うエージェントのために。
インストール → 60秒で最初のレシートを
npm i -g reelier && reelier init
reelier init は、まずあなたが既に行った作業をスキャンします — Claude Code、Codex、Windsurf、OpenClaw 全体から — そして、実際の過去のセッションを再生可能なスキルに変換することを提案します。そのような履歴がない場合は、ゼロセットアップのデモを実行し、実際のレシートを出力して終了します。
Your receipt:
skill: reelier-init-demo
steps: 2 total, 2 passed, 0 unchecked, 0 failed
replay time: 44ms [measured]
LLM tokens: 0 [measured]
An agent doing a comparable task re-reasons every run (~2.8s, ~18k tokens on
our benchmark). Your replay: 44ms, 0 tokens.
または Docker で実行 — Node のインストール不要
docker run --rm ghcr.io/seldonframe/reelier --help
# Replay a skill from the current directory:
docker run --rm -v "$PWD:/work" -w /work ghcr.io/seldonframe/reelier run my.skill.md
# Record from your agent history (mount it read-only):
docker run --rm -v "$HOME/.claude:/root/.claude:ro" -v "$PWD:/work" -w /work \
ghcr.io/seldonframe/reelier scan
理由
- エージェントは毎回ジョブを再学習し、静かにずれていきます。 毎回の実行でワークフローが再導出され、小さな「合理的な」修正が積み重なります — 長期運用者が瘢痕組織と呼ぶものです。コンパイルされたスキルは再学習せず、ずれることもありません。
- 本当の問題はコストです。 「あれはいくらかかった?」 は、長時間のエージェント実行が受ける最初の返信です。Reelier は 0 トークンで再生し、レシートを伴います。
- 脆弱な RPA ではありません。 ツール呼び出し(型付きJSONの入出力)を再生し、ピクセルではありません — そして各ステップは独自のアサーションを持つため、壊れたステップは大声で失敗し、決して黙って通過しません。
- モデルをアップグレードしましたか? 再生は固定されています — 新しいモデルで再記録し、凍結されたベースラインに対して
reelier diffします:本番環境に到達する前に、ステップごとに SAME または DRIFTED。 - 「決定論的なものはすべてコードであるべきだ」 同意します — あなたのエージェントは既にそれを書きました。Reelier はその実際の動作する実行をテスト済みファイルにキャプチャします。手作業のコーディングなしで決定論を実現します。
仕組み — 記録 → コンパイル → 再生 → 差分 → レシート
reelier init # 60s: record → compile → replay → your receipt
reelier run <name>.skill.md # replay deterministically — 0 tokens (read-only by default)
reelier diff <name> # SAME or DRIFTED, per step — exit 1 on drift
reelier push <name>.skill.md # sync receipts to your ledger (opt-in)
- 記録 — 3つの方法:
reelier mcp --wrap "<your mcp server>"(エージェントのツールの前に立つロスレスプロキシ)、既存のセッションから直接(reelier scan/reelier from-session)、またはガイド付きのreelier init。 - コンパイル —
reelier compileはトレースを決定論的にSKILL.mdに変換し(LLM呼び出し0回)、全ステップにアサーションを持つレシピを作成します。コンパイラが正直に認識したギャップは、推測ではなく未解決の質問(リテラルな日付、UUID、タイムスタンプなどを「これは変数にすべきか?」とフラグ付け)として出力されます。 - 再生 —
reelier runはそれをレベル0で実行します:LLMなし、ミリ秒単位、バイト単位で同一。デフォルトで読み取り専用 — 書き込みステップ(idempotent-write)は、--allow-writesを渡さない限り再実行されません。 - 差分 —
reelier diffはスキルの2回の実行を比較し、ステップごとに SAME または DRIFTED を報告し、失敗したアサーションを理由として示します。ずれがあると終了コード1を返すため、スケジュールされた再生のゲートとして機能します。 - レシート — すべての実行はレシートです(ステップごとの結果、タイミング、0トークン)。
reelier pushはオプションでそれらをレシート台帳に同期し、共有可能なパーマリンクと埋め込み可能な検証済み再生バッジを提供します。
エージェントスキルの変換
指示スキルと1回の記録された実行を、決定論的な再生に変換します — モデルを除いた、あなたのスキルです:
reelier mcp --wrap "<your mcp server>" # record: agent runs the skill's task once
reelier compile trace.jsonl --from-skill ./my-skill/SKILL.md
# → my-skill.skill.md — name + description carried from your SKILL.md,
# steps ONLY from the recorded run (never generated from instruction text)
任意のエージェントからセッションをインポート
再生可能なワークフローは、既にエージェント自身のセッションログにあります。reelier scan がそれらを見つけ、reelier from-session が1つをスキルに変換します。フォーマットはファイルの内容から自動検出されます — サポートされているエージェントにフラグは不要です:
reelier scan # discovers sessions from every known agent under your home dir
reelier from-session ~/.claude/projects/*/*.jsonl # Claude Code
reelier from-session ~/.codex/sessions/**/rollout-*.jsonl # Codex CLI
reelier from-session ~/.openclaw/agents/*/sessions/*.jsonl # OpenClaw
| エージェント | セッションの場所 | ステータス |
|---|---|---|
| Claude Code | ~/.claude/projects/<project>/<uuid>.jsonl | サポート済み |
| Codex CLI | ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl | サポート済み |
| OpenClaw | ~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl | サポート済み |
| Cursor | .../User/globalStorage/state.vscdb (SQLite、非公開) | 検出、まだ解析不可 |
| Windsurf | .../User/globalStorage/state.vscdb (SQLite、非公開) | 検出、まだ解析不可 |
再生可能な呼び出し(Reelier自身のビルトイン、または mcp__<server>__<tool> 呼び出し)のみがスキルにコンパイルされます — ネイティブのファイル/シェル/検索アクションはスキップとして報告され、ステップとして捏造されることはありません。自動検出の代わりにフォーマットを強制するには --agent <claude-code|codex|openclaw> を渡します。reelier scan / reelier from-session --agent cursor(または --agent windsurf)は、文書化されていないバイナリ形式を推測するのではなく、ディスク上の内容を正直に報告します。
3つのテスト、1つのスキル
1つの記録されたスキルから、それに対して尋ねる3つの異なる質問が得られます。
- 決定性 —
reelier run <skill.md>は記録したアサーションに対して再生します。同じステップ、同じアサート、0トークン。答える問い:これはまだ以前と同じことをするか? - リカバリ —
reelier run <skill.md> --fail N[=status]は、そのステップの実際のツール呼び出しをディスパッチする代わりに、ステップN(デフォルトステータス500、--fail N=429で上書き、繰り返し可能)で合成障害を注入し、実際の障害がヒットするのと同じエスカレーションラダーを実行します。ネットワーク外では実際には何も起こりません — モックされたステップはそのツールを決して呼び出さないため、--allow-writesなしで副作用なく書き込みステップのリカバリテストができます。答える問い:これが壊れた場合、スキルは気づいて修復するか?(モック実行はローカルテストのみです —reelier pushはその公開を拒否します。以下を参照。) - ドリフト —
reelier run <skill.md> --wrap "<your mcp server>"は、記録されたトレースではなく、ライブの読み取り専用依存関係に対して再生します。以下のreelier manifestと組み合わせることで、実際の再生前にツールのスキーマがあなたの下から移動するのを捉える方法です。
分類は、ローンチ投稿に対する Mads Hansen のレビューによるものです。
ツールスキーマのドリフト: reelier manifest
スキルのステップは、特定の引数形状で特定のツールを呼び出します。ラップされたMCPサーバーのツールスキーマが記録時から変更された場合、再生は間違った引数を黙って埋めるのではなく、大声で拒否すべきです。reelier manifest は、スキルのステップが実際に使用するすべてのツールのスキーマダイジェストをスタンプします:
reelier manifest <skill.md> --wrap "<your mcp server>" # stamp/refresh the manifest from live servers
reelier run <skill.md> --wrap "<your mcp server>" # preflight checks the manifest BEFORE step 1 runs
スタンプされたツールのスキーマがずれている(またはツールがなくなっている)場合、reelier run は何も実行する前にフェイルクローズドします — MANIFEST DRIFT — refusing to replay。--ignore-manifest は、ずれが問題ないと分かっている場合の明示的な緊急時用の上書きです。それでも実行時に記録されるため(manifestIgnored: true)、黙ってバイパスされることはありません。マニフェストが全くないスキルはアドバイザリノートを受け取るだけです — マニフェスト以前のすべてのスキルは変更なしで動作し続けます。
ステップごとの書き込み承認: reelier approve
--allow-writes/--yes は包括的なフラグです — それらは「この実行は書き込む可能性がある」と言うものであり、「この正確な書き込みがレビューされた」という意味ではありません。reelier approve は、承認を1つの特定のステップのツール + 引数テンプレートにハッシュバインドします:
reelier approve <skill.md> # walk each write/destructive step, y/N to approve
reelier approve <skill.md> --all # approve every write step non-interactively
ツール/引数がスタンプされたハッシュとまだ一致する承認済みステップは、フラグなしで実行されます。承認以降にステップのツールまたは引数が変更された場合、再生はフェイルクローズドします — Approval mismatch — そして、それを上書きするフラグはありません。再レビューして再承認します。approve: フィールドのない書き込みステップは、今日の正確な --allow-writes/--yes の動作を変更せずに維持します。
形状だけでなく、値をアサートする
スキルのアサーションは、再生を証明にするものです。文法はステータス、構造、そして値をチェックします:
- assert: status == 200
- assert: json.results is array
- assert: json.count >= 1 # numeric range
- assert: json.plan is string # type
- assert: json.id matches /^usr_/ # value pattern
- assert: body contains "ok"
コーディングエージェント内で使用する (MCP)
reelier serve は Reelier 自身のコマンドを MCP ツールとして公開するため、Claude Code / Cursor / Windsurf / Codex がセッション中にそれを呼び出すことができます:
{ "mcpServers": { "reelier": { "command": "npx", "args": ["-y", "reelier", "serve"] } } }
エージェントは reelier_scan、reelier_from_session、reelier_replay、reelier_diff、reelier_push を取得します — それぞれをいつ使うべきか(そしていつ使うべきでないか)を正確に伝える説明付きです。決定論的なタスクを一度記録し、再推論する代わりに再生します。
ツール
- reelier_scan — エージェントセッション履歴(Claude Code、Codex、Windsurf、OpenClaw)をスキャンし、再生可能なツール呼び出しワークフローを探します
- reelier_from_session — 記録されたセッションを、全ステップにアサーションを持つ再生可能な SKILL.md にコンパイルします
- reelier_replay — スキルを0 LLMトークンで決定論的に再生します(デフォルトで読み取り専用。書き込みは
--allow-writesの背後でゲートされます) - reelier_diff — 2回の実行を比較します:ステップごとに SAME または DRIFTED、失敗したアサーションを理由として表示。ずれがあると終了コード1
- reelier_push — 実行レシートを台帳に同期し、共有可能なパーマリンクを取得します(オプトイン)
測定された証明
実際のライブな直接比較ベンチマーク(エージェント vs. Reelier、同じタスク、同じデータ)から — 完全な表と方法論は examples/benchmark にあります:
- 1,000 / 1,000 回の再生がバイト単位で同一 (N=1000 裾分散テスト)
- 再生あたり 0 トークン — 想定ではなく、実行記録から検証
- 約50倍安価 ($0.000000/再生 vs. エージェント群の平均 $0.019068/実行)
- 約59倍高速 (48ms vs. 平均レイテンシ 2,842ms)
- 実際のドリフトは約$0.001で一度自己修復され、その後は毎回無料で再生
レイテンシはネットワークによって異なります — レベル0再生はスキルのツール呼び出しを再実行するため、実時間は接続に依存します。変わらないもの:0 LLMトークン、毎回同じステップ、そしてレシート。独立して裏付けられています — arXiv 2605.14237 は、同じ記録と再生のパターンで93.3~99.98%のトークン削減を発見しました。
任意のモデルで動作 (BYOK)
レベル0再生(デフォルト)はモデルを決して呼び出しません — 構造上、0トークンです。エスカレーション(--max-level 1|2)はオプトインであり、1つの狭いBYOKサーフェス(--llm-base-url + --llm-model)を通じて通信します:ネイティブAnthropic Messagesアダプター、およびその他すべて(OpenRouter、Ollama、GeminiのOpenAIエンドポイント、Groq、vLLM、LM Studio、Kimiなど)用のOpenAI互換アダプター。より強力なモデルに向けると、すべてのスキルの次の自己修復が無料で賢くなります。
所有する — MIT、BYOK、ローカルファースト
どこでも使用し、何にでも組み込めます — コピーレフトの制約はなく、法的レビューは不要です。あなたのスキル、トレース、実行記録はあなたのデータです — 退出はフォルダをコピーするだけです。フォーマットは SPEC.md で規定されており、誰でもソースを読まずにそれらを出力または消費できるように、規範的なRFCスタイルのリファレンスです。
貢献
Issue と PR を歓迎します — フォーマットについては SPEC.md を参照してください(仕様がコードよりも優先されます。仕様ではなくコードを修正してください)。npm test は完全なスイートを実行します。PRの前には npm run build && npx tsc --noEmit を実行してください。
git clone https://github.com/seldonframe/reelier && cd reelier
npm install && npm test
スター履歴
ライセンス
MIT — フォーク、組み込み、監査、自己ホストを永久に自由に行えます。(バージョン0.16.0以前はAGPL-3.0でリリースされており、そのままです。)
Reelier が再実行を節約したなら、スターを付けてください ⭐ — 他のビルダーが見つける方法です。