Make Your Own Event-Sourced Agent Harness — agent の全てを event に (Jonas Templestein / Iterate)

AI Engineer Europe 2026 (London) ワークショップ / 2026/05/14

Jonas Templestein · 03:00 「あらゆるエージェントは、 生まれた瞬間に URL を持つべき。 さもなければ、 後から 『Slack 連携』 みたいなコネクタ概念を逆向きに発明することになる」

AI Engineer Europe 2026 (Queen Elizabeth II Centre、 London、 2026/04/08-10 開催、 2026/05/14 公開) Day 1 ワークショップトラックより。 ジョナス・テンプルスタイン (Jonas Templestein、 Iterate 共同創業 CEO、 元 Monzo CTO) と Misha (Iterate) の共同登壇 (約 64 分)。 実演レポジトリ: iterate/ai-engineer-workshop、 サービス本体: events.iterate.com

ジョナス・テンプルスタインは Monzo Bank の共同創業 CTO (2015-2023、 約 9 年) を経て、 2024 年に Iterate 2024 年に Jonas Templestein と Oliver Beattie が共同創業した英国・スイスのソフトウェアスタートアップ (旧 Nustom)。 シードで OpenAI、 Index Ventures、 Accel、 General Catalyst、 Naval Ravikant 等から資金調達。 公開製品はまだだが、 「agent harness の本来の基盤を再設計する」 方向を探索中 を Oliver Beattie と共同創業。 シード投資家に OpenAI、 Index Ventures、 Accel、 General Catalyst、 Naval Ravikant らが並ぶ。 本ワークショップは Iterate がまだ公開製品を持たない段階で 「我々が agent harness を設計するならこう作る」 という思考実験を公開実演する形式。

開始から 1 分で本人が宣言した通り 「pure chaos」 の進行となった — 一週間前に登壇依頼を受けて急遽準備、 SDK を 1 分前にプッシュ、 live demo 中に Cursor がフリーズ、 OpenAI クォータエラー、 laptop 不調で再起動・スワップ。 結果として実演としては半壊したが、 「全ての失敗が event として記録できれば、 その瞬間からデバッグできる」 という主張は live demo の崩壊そのものから逆に明確に伝わってきた、 という独特の登壇となった。

1、 Event-sourced = debuggable + extensible — agent harness の全てを 「append-only event stream + reducer + after-append hook」 で書き直す設計。 LLM ストリーミングチャンク、 tool call、 エラー、 UI フィードバック、 全部 「イベント」 として保存する。 デバッグ性が桁違いに上がる代わりに、 開発体験はかなりラディカル。

2、 Distributed by design — plug-in 同士が別マシン・別言語で動いてもいい。 Rust の安全性チェッカーが TypeScript の coding agent に対して 「あなたの次の LLM 呼び出しまでに 200ms あげるから、 何か言いたいことがあれば event を append しなさい」 と通信する世界観。 before-hook を持たないことで context cache 破壊問題を回避する。

3、 Deploy as event — Cloudflare dynamic worker に source code を載せた event を append するだけで stream に処理 logic が紐づく。 「サーバを立てる」 概念がなく、 agent そのものが自分のロジックを event として書き換えていける。 LLM 自身に新しい processor の source code を生成させて自己拡張させる、 という運用も射程に入る。

着眼点

「あらゆるエージェントは、 生まれた瞬間に URL を持つべき」 (03:00)

Templestein の出発点。 既存の agent SDK (Pi、 Claude Code、 OpenCode 等) は内部に event log を持っているが、 外向きの interface としては関数呼び出しや MCP を出している。 これだと Slack 連携や webhook は 「後から付け足すコネクタ」 という別概念として実装することになる。

Iterate の主張は逆 — 「最初から HTTP で世界と話せる存在」 として設計すれば、 Slack 連携も webhook も 「stream への event 追加」 の特殊ケースに統一できる。 これは Viktor (Fryderyk Wiatrowski、 AI Engineer Code Summit) の Slack に住む会社 AI の発想と通底している — agent を 「他システムから呼ばれる関数」 ではなく 「世界と HTTP で会話する独立した存在」 として位置づける。

「Reducer は state + event → new_state、 副作用は after_append で」 (33:00)

processor の signature 設計の核心。 「state を更新する純粋関数」 と 「副作用を起こす関数」 を明確に分ける。 これは関数型プログラミングの定石だが、 agent harness の文脈では特に重要 — 中断・再開・再生 (replay) が容易になる。

具体例として Templestein が出したのは circuit breaker processor。 直近 100 個の event のタイムスタンプを reducer で蓄積し、 「最後の 100 個が 1 秒以内に発生していたら」 という条件を after_append で判定して、 検知時には pause event を append する。 stream 自体を制御する logic も event として表現される。

「Before-hook は最悪、 context cache を破壊する。 after-append で 200ms 待つ方がいい」 (47:30)

Q&A セッションで Templestein が踏み込んだ主張。 OpenCode などで pre-prompt フックを使うと、 context cache が無効化されて推論コストが跳ね上がる事例を引いた。

代わりの設計: agent loop は次の LLM 呼び出しまでに最大 200ms 待つ。 その間に他の processor が 「私から付け足したい context があります」 と event を append できる。 期限を過ぎたら agent はそのまま LLM を呼ぶ。 これは エージェント観測の議論 や RAG パイプライン (Notion 知識ベースの indexed version から context を 「間に合えば」 注入する) と同じ哲学。 「全システムを eventually consistent として設計する」 が core。

「ワークショップが半壊することそれ自体が、 event-sourcing が必要な理由の証明」 (38:00 前後の流れ全体)

Templestein は live demo の途中で Cursor がフリーズし、 OpenAI が quota error を返し、 laptop を再起動し、 ついには Misha と laptop を交換しながら進めた。 にもかかわらず、 「全ての失敗が event として記録できる stream さえあれば、 後からデバッグできる」 というメッセージはむしろ live demo の崩壊から逆に明確に伝わってきた。

これは 「実演プロダクトとしての完成度」 と 「アイデアの説得力」 が直交している珍しい例。 来場者の Q&A も 「これは dumb か cool か、 まだ判定できない」 と Templestein 本人が認めた状態で、 アイデア提案として残った。

動画の構成 (主要セクション)

  • (00:00) ジョナス + ミーシャ自己紹介、 「pure chaos」 宣言、 SDK を 1 分前にプッシュ
  • (02:15) 設計原則 4 つ: event-sourced (= debuggable) / extensible / edge-rootable / distributed
  • (05:00) events.iterate.com の基本: agent path = file system 階層、 curl で append、 SSE で live=true 購読
  • (11:00) idempotency key、 pause / resume、 circuit breaker (1 秒 100 event で発火) のメカニクス
  • (15:00) スケジュール event、 heartbeat 5 秒、 JSONata transformer のような plug-in
  • (18:00) live demo 崩壊フェーズ突入 — Cursor フリーズ、 laptop 交換、 コンピュータ再起動
  • (28:00) plan B: agent input added event → OpenAI responses API のブリッジングを口頭で walkthrough
  • (33:00) reducer signature の説明、 state + event → new_state、 side effect は after_append で
  • (40:00) dynamic worker configured event — script 文字列を event に乗せて Cloudflare worker としてデプロイ
  • (47:30) Q&A: before-hook なしの理由 (context cache 破壊問題、 200ms timeout 方式)
  • (58:00) durable streams の標準化議論 (Electric SQL / Jetstream NATS との関係)

出典

用語集

Event-sourced agent harness
Agent の状態と挙動を、 append-only event stream で完全に表現する設計パターン。 LLM 呼び出し、 tool call、 エラー、 UI フィードバック、 すべてを event として保存。 中断・再開・再生 (replay) が容易になり、 デバッグ性が桁違いに上がる。 Iterate の Templestein が提唱。
Reducer + after_append hook
Processor の 2 つの関数。 reducer は state + event → new_state の純粋関数 (副作用なし、 何度呼んでも同じ結果)。 after_append hook はその後で副作用 (新 event 追加、 LLM 呼び出し、 外部 API コール等) を起こす。 関数型の純粋・副作用分離を agent harness に持ち込む設計。
Durable Stream
Append-only event log + offset tracking の web 標準提案。 Kafka や Jetstream NATS、 Electric SQL などが類似の実装。 Iterate の events.iterate.com もこの仕様に近いが、 push subscription (server から client へ通知) も持つ点が独自。
Dynamic worker configured event
events.iterate.com の特殊な event 型。 ペイロードに JavaScript の処理ロジックを文字列として持ち、 stream に append されると Cloudflare workers 上で実行される。 「サーバを立てずに stream の処理を変更する」 デプロイモデル。 LLM 自身が新 processor の source code を生成して self-extending する射程に入る。
Circuit breaker (Iterate 実装)
直近 N 個の event タイムスタンプを reducer で蓄積し、 高頻度 event の連発を検知したら自動で stream を pause する仕組み。 「無限ループ防止のための stream-level safety」 を event 自身で実装する例。
Before-hook の context cache 破壊問題
Pre-prompt フックを実装すると、 各呼び出しで context が微妙に変わるため LLM プロバイダ側の context cache が効かなくなり、 推論コストが跳ね上がる現象。 Templestein は 「before-hook を持たず、 after-append で 200ms 待つ」 設計でこれを回避する。