コンテンツにスキップ

Shopify「River」と「Aquifer」— Slack 常駐エージェントとそれを支える社内エージェント基盤

作成日: 2026-09-27 出典: Burke Libbey / Javier Moreno / River「Under the River」Shopify Engineering(2026-05-28) 関連: 社内saasデータ統合基盤_ai活用_事例比較_整理 / メルカリ_arca_ai時代の高速プロトタイピング基盤_整理 / 社内aiエージェント基盤_company_brain_比較_整理 / stripe_toolshed_minions_社内mcpとコーディングエージェント_整理


0. 要点(3行)

  • 一言で: 「エージェントは公開チャンネルでしか働かせない」ことで、個人の試行錯誤を全社の資産に変えた。River は Slack 常駐のエージェントで、コード・テスト・PR・データウェアハウス・本番トレースを扱い、マージされる PR の8本に1本が River 共著。
  • 支えているのは基盤 Aquifer。構成要素は session / harness / sandbox / gateway / 永続イベントログ / credentials proxy / observability。設計原則は「セッションだけは死なせない(プロセス・sandbox・マシンは使い捨て)」と「頭脳(harness)と手(sandbox)を分離する」。
  • 新しいエージェント製品は新しい基盤ではなく「profile(設定の束)」として足す。River も PR レビューもヘッドレス agent も同じ基盤の上の profile。前提として 2024 年にモノレポ化(World)と Nix による環境の再現性に投資していた。

1. 前史 — 2024年の「退屈な」賭け

2024年春の Shopify は、多数のリポジトリ、チームごとにバラバラの開発環境、遅いフィードバックという状態だった。そこで2つの決定をした。

決定 中身 痛み 見返り
モノレポ化 Shopify が出すもの全部を1リポジトリ「World」に CI を桁違いにスケール、merge queue とビルドキャッシュが基盤化、テスト基盤を作り直し リポジトリ直下のエージェントが全領域を横断できる
Nix で全部作る 開発環境・CI・本番イメージを1つの再現可能な基盤に 散らばった前提を1つずつ剥がす dev / CI / 本番が同じ環境

賭けの言葉は「コードはますます AI が書くようになる。インフラはその土台にならなければならない」(2024年初頭)。

2つの気づき 1. エージェントに優しい ≒ 人間に優しい。再現できない環境はエージェントも再現できない。分断されたリポジトリはエージェントも横断できない。書き残されていない知識は誰も学べない。エージェントは技術的負債を可視化する。 2. ローカルのエージェントには天井がある。各自の PC で動くエージェントの工夫は、そのセッションと一緒に消える。エージェント同士も学び合わない。


2. River — 公開チャンネル限定の Slack エージェント

sequenceDiagram
    participant U1 as 社員A
    participant Sl as 公開Slackチャンネル
    participant Rv as River
    participant U2 as 社員B
    participant Wd as World モノレポ / DWH / 本番トレース
    U1->>Sl: @river で質問
    Sl->>Rv: セッション開始
    Rv->>Wd: ファイルを読む・クエリ・テスト実行
    Rv->>Sl: 途中経過を投稿
    U2->>Sl: リンクを見て合流し制約や方針転換を追加
    Sl->>Rv: 新しい文脈
    Rv->>Wd: 会話を失わずに作業継続
    Rv->>Sl: 結果 / PR
    Note over Sl: スレッドは検索可能な記録になり<br>次の人の出発点になる
  • 呼び出しは公開チャンネルで @river。DM は不可。すべての会話が、社内に既定で公開されたスレッドになる
  • できること: コードを読む、テストを回す、PR を出す、データウェアハウスにクエリする、本番トレースを見る、悪い計画には反論する
  • セッション中央値 19分、ツール呼び出し中央値 50回
  • その会話コーパスを分析し、パターンを River のスキル・プロンプト・既定値に還元する。モデルの再学習なしに賢くなる
  • 誰かが River で問題を解くと、スキルの更新・AGENTS.md の差分・新しい共有スキルなどの「記憶」が World に残る

利用規模(直近30日)

指標 値
River セッション 59,918
使われた Slack チャンネル 5,170
関与した社員 7,000人超(5月上旬から約1,200人増)
River 共著でマージされた PR 3,536
マージ PR に占める River 共著 8本に1本

数値は River 自身が毎セッション書き込む river_sessions テーブルから出している。


3. Aquifer — 「100個の River」を作るための基盤

River を出すと、他チームが「うちにも」と言い出した(PR レビュー、リサーチ、マイグレーション、コンプライアンススキャン、性能調査…)。1つの River は作れたが、「100個の River を作れるもの」はまだ無かった。そこで作ったのが Aquifer。

flowchart TB
    subgraph Profiles[profile 群]
        River[River<br>対話型]
        PRReview[PR レビュー<br>自動化型]
        Vanilla[Vanilla<br>ヘッドレス agent]
    end
    subgraph Aquifer[Aquifer 基盤]
        Session[(Session<br>追記専用イベントログ<br>Postgres)]
        Harness[Harness<br>エージェントループ<br>使い捨て]
        Sandbox[Sandbox<br>FS・shell・リポジトリ<br>使い捨て]
        Gateway[Gateway]
        Cred[Credentials proxy]
        Obs[Observability]
    end
    Profiles --> Harness
    Harness -->|履歴を読む・書く| Session
    Harness -->|ツール実行の意図| Sandbox
    Harness --> Gateway
    Sandbox -.->|外部アクセス| Cred
    Harness --> Obs

図の Gateway / Credentials proxy / Observability の具体的なつながり方は記事に書かれておらず、構成要素として名前が挙がっているだけ。配置は自分の推定。

3-1. 分解

要素 役割 寿命
Session 永続的な ID。追記専用のイベントログ(Postgres)。「これまで何が起きたか」の正本 永続
Harness エージェントループ。履歴を読み、モデルを呼び、ツールの意図を出す 使い捨て(再作成が安い)
Sandbox コードが動く場所。ファイルシステム・shell・リポジトリ。bash / edit / build / test 使い捨て(暖機済みのことも、新品のことも)

3-2. 頭脳と手を分ける

harness は sandbox の外に住む(Anthropic「Scaling Managed Agents」2026年4月の "Decouple the brain from the hands" を引用)。ここから3つの性質が得られ、後付けはできない。

性質 理由
安全性 エージェントループが rm -rf と同じ被害範囲にいない
交換可能性 モデル・ランタイム・言語を harness 側で替えても sandbox に影響しない
観測性 判断の流れが全部 harness 側にあり、1か所で見える

3-3. Session cell(家畜であってペットではない)

  • セッションが動き出すと、ホスト上に一時プロセス「session cell」を立てる(Go ランタイムと harness が同じプロセスグループ)
  • アイドルになると終了。次の操作では別ホストに新しい cell が立つこともあるが、会話は Postgres にあるので続きから再開できる
  • 「どのオーケストレーターを使うか」より「セッション単位で cattle-not-pets を妥協しない」原則の方が大事、としている

3-4. profile と3つの利用モード

profile は「システムプロンプト・スキル群・拡張・sandbox ポリシー・モデル既定値」をまとめたデータで、Nix でビルドしバンドルとして配る。新しいエージェント製品=新しいバンドル。

flowchart LR
    Sub[共通基盤<br>session モデル・sandbox・gateway]
    Sub --> Mode1[対話型<br>River<br>永続セッション・人が常駐]
    Sub --> Mode2[自動化型<br>PR レビュー<br>外部システムが起こす・人なしが多い]
    Sub --> Mode3[ジョブ型<br>CI・バッチ<br>使い捨て・セッションログは任意]

「別のアーキテクチャを試すたびに、この3モードのどれかを作り直していた」ので、同じ session モデル・sandbox・gateway で3つを賄う形に落ち着いた。


4. データ・SaaS アクセスの観点で読む

観点 記事から言えること 記事に無いこと
DWH River はデータウェアハウスにクエリする どの DWH か、権限・行列制御の方法
資格情報 Aquifer に credentials proxy がある 仕組み(トークンの差し替え方、どの SaaS 向けか)。二次情報では「プレースホルダを出口で本物に差し替える」と説明されるが、一次資料では未確認
監査 判断の流れは harness 側で1か所に見える。全会話が公開スレッド 監査ログの保管・検知の仕組み
知識 World にスキル・AGENTS.md・runbook・意図文書が蓄積 —

読み取れる設計思想: データや SaaS へのアクセスを個別に守る前に、「全部の作業が公開の場で、1つの基盤を通る」ことで、監査・学習・再利用を同時に得ている。メルカリ Arca の「外に出る経路を1本にする」とは、守る対象が違う(Arca は通信、Shopify は会話と判断の流れ)が、1か所に集めて見えるようにする点で同じ発想。


5. まとめ — 持ち帰れること

一言で: 「エージェントを私物にせず公開の場で働かせ、その下に死なないセッション基盤を敷く」。

状況 Shopify から借りるアイデア
各自のローカル agent の知見が共有されない 公開チャンネル限定の共有エージェントにし、会話ログをスキルに還元
エージェントの種類が増えて基盤が乱立しそう profile(プロンプト・スキル・sandbox ポリシーの束)として足す
長時間セッションが落ちる セッションを Postgres の追記ログにし、実行プロセスは使い捨て
エージェントの暴走が怖い harness を sandbox の外に置き、被害範囲を分ける
導入効果を示したい エージェント自身にセッション記録テーブルを書かせ、数値を出す

参考リンク

  • Shopify Engineering「Under the River」: https://shopify.engineering/under-the-river
  • Anthropic「Scaling Managed Agents」(記事内で引用。本ノートでは未読)

作成: 2026-09-27 / 最終更新: 2026-09-27