0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【要約】Building effective agent automations ― 定期実行エージェントを「信頼できる」ものにする6つのルール 🤖

0
Posted at

はじめに 📝

2026年10月8日に Claude 公式ブログで公開された記事 「Building effective agent automations」(著者: Lance Martin、CJ Avilla)の内容を、日本語で要約して紹介します。

Anthropic 社内では「スケジュールで起動 → バックグラウンドで情報収集 → 大事なことだけ報告」というシンプルなエージェント自動化が使われているそうです。記事ではその参考実装として、Claude Managed Agents(ベータ) で作った「デイリーブリーフ」エージェントを題材に、運用で効いてくる設計上のポイントが解説されています。

このエージェントは Slack チャンネルや GitHub リポジトリを読み、前回実行時からの差分を把握して、要点を Slack に投稿します。

イメージを掴むために、デプロイ定義(deployment.md)の一部を載せておきます 👇

deployment.md
---
name: Daily brief
agent: ./agent.md
environment_id: ./environment.yaml
schedule:
  type: cron
  expression: "32 7 * * 1-5"
  timezone: America/New_York
vault_ids: [vlt_...]   # Sources の手順で作成する Vault
resources:
  - path: ./memory_store_preferences.yaml
    access: read_only
    instructions: The reader's preferences. Re-read them every run. Never write here.
  - path: ./memory_store_state.yaml
    access: read_write
    instructions: Your state. Bookmarks, ledger, notes, proposals, and run records.
---

Write today's brief.
The reader's time zone is America/New_York. Work out every date in that zone.

Follow your run steps in order. Today's edition is titled "Daily brief, <weekday> <month> <day>".
ant apply deployment.md                              # デプロイを適用
ant beta:deployments run --deployment-id <id>       # 手動でテスト実行

3行まとめ ✨

  • 📌 情報源は「直近24時間」のような固定窓ではなく、ソースごとのブックマーク(タイムスタンプ) から読む
  • ✅ 投稿前に各項目をライブで再確認し、Slack の成功応答を確認してから状態を更新する
  • 🔒 設定(preferences)はエージェントが編集できない場所に置き、読み取り専用権限と予算上限でガードレールを張る

全体構成:6つのコンポーネント 🧩

エージェントは次の6要素で構成されています。

コンポーネント 役割
Sources(情報源) Slack チャンネル、GitHub リポジトリなど
Destination(出力先) Slack の1チャンネル
Agent モデル・ツール・実行手順(agent.md)
Schedule cron、タイムゾーン、Vault、メモリ、予算(deployment.md)
Memory preferences(読み取り専用)と state(読み書き)
Guardrails 権限・ネットワーク・予算の制限

参考実装のリポジトリ構成は以下の通りです。

daily-brief/
├── agent.md                        モデル、ツール、指示
├── deployment.md                   スケジュール、タイムゾーン、予算、入力メッセージ
├── environment.yaml                ネットワーク許可リスト
├── memory_store_preferences.yaml   ユーザーの好み設定
├── memory_store_state.yaml         ブックマーク、台帳、メモ、実行記録
├── vault.yaml                      認証情報を保持する Vault
├── claude-lock.json                ant apply が書き出すリソースID
└── slack/manifest.yaml             Bot アプリ1つ

Sources:情報源の読み方 📥

🔑 エージェント専用のスコープ付き認証情報を渡す

シークレットはサンドボックスの外にある Vault に保存します。MCP 呼び出しはプロキシ経由で行われ、シェルからは $SLACK_BOT_TOKEN のようなプレースホルダーしか見えません。

const vaultId = process.env.VAULT_ID!; // claude-lock.json にある Vault の ID

await client.beta.vaults.credentials.create(vaultId, {
  display_name: "SLACK_BOT_TOKEN",
  auth: {
    type: "environment_variable",
    secret_name: "SLACK_BOT_TOKEN",
    secret_value: process.env.SLACK_BOT_TOKEN!,
    networking: { type: "limited", allowed_hosts: ["slack.com"] },
    injection_location: { header: true },
  },
});

🔖 前回の続きから読む(ブックマーク方式)

「直近24時間」と指定するのではなく、ソースごとのタイムスタンプを bookmarks.json に保存します。これにより、

  • 実行が遅れても取りこぼしが出ない
  • 実行が早まっても同じ項目を重複して報告しない
"slack": "2026-09-14T13:02:11Z"

⚠️ 読み込み失敗を「静かな日」と取り違えない

あるソースの読み込みに失敗したら、

  1. そのソースのブックマークは進めない
  2. 他のソースの内容は通常どおり報告する
  3. ブリーフの最後に「読めなかったソース」を明記する

「何もなかった」と「読めなかった」は全く違う、という点が強調されています。

Destination:投稿先の扱い 📤

  • 日付入りタイトルで、Slack の1チャンネルに投稿する
  • 投稿前に当日分が既に投稿済みか確認し、重複を防ぐ

✅ 投稿が届いたことを確認してから記録する

Slack が "ok": true とメッセージの ts を返したときだけ「送信済み」とみなし、その後で台帳(ledger)とブックマークを更新します。結果が不明な場合は「maybe posted」として記録し、それ以外は何も変更しないのがポイントです。

curl -s https://slack.com/api/chat.postMessage \
  -H "Authorization: Bearer $SLACK_BOT_TOKEN" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{"channel": "C0123456789", "text": "Daily brief, Tue Sep 15 ..."}'

Agent:ブリーフの中身を作る 🧠

agent.md のフロントマターではモデル・MCP サーバー・ツールを定義します(Web 検索・Web 取得は無効化)。

---
name: Daily brief
model: claude-sonnet-5-5
mcp_servers:
  - type: url
    name: github
    url: https://api.githubcopilot.com/mcp/
tools:
  - type: agent_toolset_20260401
    configs:
      - name: web_search
        enabled: false
      - name: web_fetch
        enabled: false
  - type: mcp_toolset
    mcp_server_name: github
    default_config:
      permission_policy:
        type: always_allow
---

✂️ ブリーフは短く

項目に載せるのは、読み手が今日行動するもの、またはこれから下す判断を変えるものだけ。迷ったら載せない。

  • 「レビュー待ち12件」のような件数は項目ではない → ブロックされているものだけリンクする
  • 台帳にあってまだ未解決の項目は「still waiting, day 3」のように1行で継続表示
  • クローズされた項目は何も言わずに外す
  • preferences で「もう不要」とされた話題は復活させない

台帳(ledger.md)はこんな形式です。

2026-09-09 slack:C0123456789 1788963600.000100 refund thread: customer waiting on a decision
2026-09-11 github 481 review blocked, day 2 (still waiting)
2026-09-11 slack:C0234567891 1789117333.000300 enterprise escalation: owner named, in progress

🔁 投稿直前にもう一度確認する

読み込んでから投稿するまでの間にも状況は変わります。報告する項目ごとに、投稿直前にライブのソースを再確認します。

  • 解決済みになっていたら → 外す
  • 未解決だが変化があったら → 行を修正
  • 確認できなかったら → 外して、実行記録の「cuts」に残す

古い「まだあなた待ちです」が1つあるだけで、10件の抜け漏れより信頼を損なう

だからこそ、ステータスは断言するか、外すか。曖昧にぼかさない。また、リンクは手で組み立てず、PR の html_url や Slack の permalink などソース自身のリンクフィールドをコピーします。

Schedule:スケジュール ⏰

デプロイメントが cron スケジュール、タイムゾーン、Vault、メモリストア、予算を保持します。

🌏 日付は読み手のタイムゾーンで計算する

エージェントの日付計算を読み手のタイムゾーンに合わせておかないと、「今日」を「昨日」と呼んでしまう事故が起きます。

Memory:2種類のメモリ 💾

メモリ エージェントの権限 内容
preferences 読み取り専用(書くのは読み手) 読み手の好み。毎回読み直し、読めなければ停止
state 読み書き ブックマーク、報告済み項目の台帳、実行記録、設定変更の提案、ソースの挙動メモ

エージェントが自分の設定を書き換えられないようにしつつ、変更は「提案」として state に残す設計になっています。

Guardrails:ガードレール 🛡️

🚧 できることを制限する

プロンプトインジェクションされた場合の被害を抑えるため、

  • GitHub トークンは読み取り専用
  • preferences は読み取り専用
  • 環境のネットワーク許可リスト
  • Bot は必要なチャンネルにだけ招待

💰 予算上限は実測から決める

まずは通常実行コストの 3〜5倍 に上限を設定し、実際の数値を見ながら絞り込みます。

budget:
  type: limit
  max_list_cost:
    amount: "500" # セント単位の文字列: "500" は $5.00
    currency: USD

上限に達した実行は budget_reached で一時停止しますが、これが**「静かな日のブリーフ」に見えてしまう**点に注意が必要です。

まとめ 🎯

記事のガイドラインは、最終的に次の6つのルールに集約されています。

  1. 📖 各ソースは固定の時間窓ではなくブックマークから読む
  2. ⚠️ 読み込み失敗は「静かな日」ではなく読めなかったと報告する
  3. 🔁 すべての項目を投稿直前に再確認する
  4. ✅ Slack が確認を返したときだけ送信済みとし、その後でブックマークと台帳を更新する
  5. 🔒 preferences はエージェントが編集できないストアから毎回読み直す
  6. 🛡️ 読むだけの場所は読み取り専用にし、実行ごとの支出に上限を設ける

どれも「エージェントが賢いかどうか」ではなく、定期実行の自動化を毎日信頼して使えるかどうかに効く設計です。Managed Agents を使わない場合でも、cron + LLM で日報やアラート要約を作っている方にはそのまま応用できる内容だと思います。

まずは参考実装をクローンして、自分のチームの Slack チャンネル・リポジトリ向けにデイリーブリーフを動かしてみるのがおすすめです 🚀

参考リンク 🔗

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?