Jonas Templestein · 03:00 「あらゆるエージェントは、 生まれた瞬間に URL を持つべき。 さもなければ、 後から 『Slack 連携』 みたいなコネクタ概念を逆向きに発明することになる」
ジョナス・テンプルスタインは 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 との関係)
出典
- 本ワークショップの動画 (AI Engineer 公式 YouTube)
- 実演レポジトリ iterate/ai-engineer-workshop
- events.iterate.com (実演対象のサービス)
- AI Engineer Europe 2026 公式スケジュール
- Jonas Templestein LinkedIn
用語集
- 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 待つ」 設計でこれを回避する。