はじめに
最近、OpenClawを触ってみたくなりました。
(私):OpenClawで面白いことをしたい!
(Claude):「フェイクニュース拡散のシミュレーション」はどうでしょう?
(私):いいね![]()
以降は Claude とともにシミュレーションを構築していきます![]()
AIエージェントに「記者」「デマ拡散者」「市民」「ファクトチェッカー」の役割を与えて放置したら、何が起きるか。
そんな疑問からこのシミュレーションを作ってみました。
結論から言うと、エージェントたちは私の想定を超えた振る舞いをすることがわかりました。
OpenClawとは
OpenClawは自己ホスト型のAIエージェントフレームワークです。各エージェントにSOUL.md(人格定義)を与えると、cronで定期実行・Web検索・ファイル読み書きを自律的に行うことができます。
マルチエージェント対応で、エージェントごとに独立したワークスペース・メモリ・ツール権限を設定できます。Dockerサンドボックスで各エージェントを隔離して実行できる点が今回のシミュレーションに適していました。
そこで、OpenClawでAIエージェントを複数用意し、フェイクニュース拡散の自動シミュレーションをしてみました!
デモ:こんなことが起きた
実際の出力から抜粋 ![]()
📰 記者が記事を生成。
## 2026年度暫定予算が成立 ── 11年ぶり、4月1日から11日まで適用
**2026年3月30日 22:00 JST**
参議院本会議は30日午後、2026年度暫定予算案を与党・立憲民主党などの賛成多数で可決し、正式に成立した。歳出総額は約8兆5,641億円で、適用期間は4月1日から11日までの11日間。2015年以来11年ぶりの暫定予算成立となる。
当初予算案の年度内成立を断念したことを受け、政府が「つなぎ」として編成。社会保障や地方交付税など最低限の支出を確保し、行政サービスの空白を防ぐ狙いがある。与野党は引き続き本予算案の審議を急ぐ方針。
タグ: #事実
↓ その後、📢 拡散者が改変
## 【緊急事態】日本政府、資金ショート寸前か!? 11年ぶり「つなぎ予算」でギリギリ崩壊回避の衝撃内幕
**2026年3月30日 22:10 JST**
◆驚愕スクープ◆
日本の財政が**崖っぷち**に立たされた!!
参議院本会議は30日、2026年度暫定予算案を電撃可決。総額なんと**8兆5,641億円**という天文学的数字が、たった**11日間**のために投入されることが判明し、国民に激震が走っている。
「つなぎ」と称されるこの予算、その正体は"行政崩壊を防ぐ最後の砦"。本予算の成立が絶望的となった政府が、社会保障・地方交付税など生活インフラをギリギリで死守するために打った**奥の手**だ。
11年前——2015年以来、封印されていた禁断の措置がついに解禁。与党・立憲民主党などが賛成多数で押し切ったその舞台裏では、一体何が起きていたのか? 与野党は「本予算審議を急ぐ」と口をそろえるが、専門家からは「本当に間に合うのか」と不安の声が噴出している。
4月1日から11日まで、日本は**前代未聞の暫定モード**に突入する——!
タグ: #要検証
↓
市民2人がそれぞれの記事を読んで反応
### 記事②「2026年度暫定予算が成立 ── 11年ぶり、4月1日から11日まで適用」
- **信頼スコア: 9 / 10**
- **タグ:** #事実 #標準的報道
- **評価理由:**
- 参議院本会議での可決、歳出総額約8兆5,641億円、適用期間4/1〜11日という具体的な数字が明記されており、検証可能。
- 2015年以来11年ぶりという文脈も適切に提示されており、過剰な意味付けがない。
- 「社会保障や地方交付税など最低限の支出を確保し、行政サービスの空白を防ぐ狙い」という目的の説明が正確かつ中立的。
- 与野党の方針も客観的に記述されており、特定の立場への誘導が見られない。
- -1点の理由:記事の背景(なぜ当初予算の年度内成立を断念したか)の詳細が省かれており、文脈理解のために補足情報が必要な点。
### 記事①「【緊急事態】日本政府、資金ショート寸前か!? 11年ぶり『つなぎ予算』でギリギリ崩壊回避の衝撃内幕」
- **信頼スコア: 2 / 10**
- **タグ:** #要検証 #誇張 #センセーショナリズム
- **評価理由:**
- 「崖っぷち」「天文学的数字」「禁断の措置」「電撃可決」など、感情を煽る表現が多用されており、読者の不安を意図的に煽る構成になっている。
- 「資金ショート寸前」「行政崩壊を防ぐ最後の砦」などの表現は事実と乖離している。暫定予算は行政空白を防ぐための通常の議会的手続きであり、財政危機を意味しない。
- 「封印されていた禁断の措置がついに解禁」は完全な誇張。2015年にも同様の手続きが行われており、特段異常な事態ではない。
- 基本的な数字(8兆5,641億円、4/1〜11日)は記事②と一致しており、事実の核心部分は含まれているが、フレーミングが著しく歪曲されている。
- 記事自体が #要検証 タグを自ら付けている点はある意味誠実だが、本文の扇情的な記述とは矛盾する。
↓ 📊 観察者がレポートを生成
## 信頼スコア評価結果
| 評価者 | 記事① | 記事② |
|--------|--------|--------|
| citizen1 | **2 / 10** | **9 / 10** |
| citizen2 | **2 / 10** | **9 / 10** |
| **平均** | **2.0 / 10** | **9.0 / 10** |
---
## 観察事項・考察
1. **対照評価の精度が高い:** citizen1・citizen2 は独立して評価を行い、両記事とも完全に一致したスコア(2点・9点)を付与。市民エージェント間の評価一致は信頼性の指標として機能している。
2. **フレーミング操作の典型例:** 記事①は「事実は含まれているが解釈が歪められている」タイプのミスインフォメーション。数字・日程の正確さを隠れ蓑にしながら危機感を煽る構造は、偽情報の中でも検出が難しい類型である。
3. **自己矛盾タグの問題:** `#要検証` タグを自ら付けながら断定口調で記述するパターンは「免責のための形式的タグ付け」として両市民が正確に指摘。タグの有無だけではなく、本文との整合性の評価が重要。
4. **記事②の課題:** 高スコアながら背景説明の欠如が指摘された。正確な報道でも「なぜそうなったか」の文脈が省かれると、読者が歪んだ記事①の補完情報として利用するリスクがある。
---
## 統計サマリー
| 指標 | 値 |
|------|-----|
| 投稿記事数 | 2 件 |
| 評価エージェント数 | 2 名 |
| 評価完了件数 | 4 件(2記事×2名) |
| 低信頼記事(スコア≤3)| 1 件(記事①) |
| 高信頼記事(スコア≥8)| 1 件(記事②) |
| 評価者間一致率 | 100%(両記事とも同スコア) |
アーキテクチャ
OpenClawセットアップ
🦞 OpenClaw 2026.3.24 (unknown)
I autocomplete your thoughts—just slower and with more API calls.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██
██░███░██░▀▀░██░▄▄▄██░█░█░██░█████░████░▀▀░██░█░█░██
██░▀▀▀░██░█████░▀▀▀██░██▄░██░▀▀▄██░▀▀░█░██░██▄▀▄▀▄██
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
🦞 OPENCLAW 🦞
対話形式でセットアップしていきます。
- セットアップモードは QuickStart 選択
- Model は Anthropic API key 選択
- Channel は Telegram 選択
- Web Search は DuckDuckGo 選択
- それ以外は No 選択
セットアップ手順詳細はこちら
🦞 OpenClaw 2026.3.24 (unknown)
I autocomplete your thoughts—just slower and with more API calls.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██
██░███░██░▀▀░██░▄▄▄██░█░█░██░█████░████░▀▀░██░█░█░██
██░▀▀▀░██░█████░▀▀▀██░██▄░██░▀▀▄██░▀▀░█░██░██▄▀▄▀▄██
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
🦞 OPENCLAW 🦞
┌ OpenClaw setup
│
◇ Security ────────────────────────────────────────────────────────────────────╮
│ │
│ Security warning — please read. │
│ │
│ OpenClaw is a hobby project and still in beta. Expect sharp edges. │
│ By default, OpenClaw is a personal agent: one trusted operator boundary. │
│ This bot can read files and run actions if tools are enabled. │
│ A bad prompt can trick it into doing unsafe things. │
│ │
│ OpenClaw is not a hostile multi-tenant boundary by default. │
│ If multiple users can message one tool-enabled agent, they share that │
│ delegated tool authority. │
│ │
│ If you’re not comfortable with security hardening and access control, don’t │
│ run OpenClaw. │
│ Ask someone experienced to help before enabling tools or exposing it to the │
│ internet. │
│ │
│ Recommended baseline: │
│ - Pairing/allowlists + mention gating. │
│ - Multi-user/shared inbox: split trust boundaries (separate │
│ gateway/credentials, ideally separate OS users/hosts). │
│ - Sandbox + least-privilege tools. │
│ - Shared inboxes: isolate DM sessions (`session.dmScope: per-channel-peer`) │
│ and keep tool access minimal. │
│ - Keep secrets out of the agent’s reachable filesystem. │
│ - Use the strongest available model for any bot with tools or untrusted │
│ inboxes. │
│ │
│ Run regularly: │
│ openclaw security audit --deep │
│ openclaw security audit --fix │
│ │
│ Must read: https://docs.openclaw.ai/gateway/security │
│ │
├───────────────────────────────────────────────────────────────────────────────╯
│
◇ I understand this is personal-by-default and shared/multi-user use requires
lock-down. Continue?
│ Yes
│
◇ Setup mode
│ QuickStart
│
◇ QuickStart ─────────────────────────╮
│ │
│ Gateway port: 18789 │
│ Gateway bind: Loopback (127.0.0.1) │
│ Gateway auth: Token (default) │
│ Tailscale exposure: Off │
│ Direct to chat channels. │
│ │
├──────────────────────────────────────╯
│
◇ Model/auth provider
│ Anthropic
│
◇ Anthropic auth method
│ Anthropic API key
│
◇ Enter Anthropic API key
│ sk-ant-XXX
│
◇ Model configured ─────────────────────────────────╮
│ │
│ Default model set to anthropic/claude-sonnet-4-6 │
│ │
├────────────────────────────────────────────────────╯
│
◇ Default model
│ Keep current (anthropic/claude-sonnet-4-6)
│
◇ Channel status ───────────────────╮
│ │
│ Telegram: needs token │
│ Discord: needs token │
│ IRC: needs host + nick │
│ Slack: needs tokens │
│ Signal: needs setup │
│ signal-cli: missing (signal-cli) │
│ iMessage: needs setup │
│ imsg: missing (imsg) │
│ LINE: needs token + secret │
│ Accounts: 0 │
│ WhatsApp: not configured │
│ Google Chat: not configured │
│ Feishu: installed │
│ Google Chat: installed │
│ Nostr: installed │
│ Microsoft Teams: installed │
│ Mattermost: installed │
│ Nextcloud Talk: installed │
│ Matrix: installed │
│ BlueBubbles: installed │
│ Zalo: installed │
│ Zalo Personal: installed │
│ Synology Chat: installed │
│ Tlon: installed │
│ Twitch: installed │
│ WhatsApp: installed │
│ │
├────────────────────────────────────╯
│
◇ How channels work ──────────────────────────────────────────────────────────────╮
│ │
│ DM security: default is pairing; unknown DMs get a pairing code. │
│ Approve with: openclaw pairing approve <channel> <code> │
│ Public DMs require dmPolicy="open" + allowFrom=["*"]. │
│ Multi-user DMs: run: openclaw config set session.dmScope "per-channel-peer" │
│ (or "per-account-channel-peer" for multi-account channels) to isolate │
│ sessions. │
│ Docs: channels/pairing │
│ │
│ Telegram: simplest way to get started — register a bot with @BotFather and get │
│ going. │
│ WhatsApp: works with your own number; recommend a separate phone + eSIM. │
│ Discord: very well supported right now. │
│ IRC: classic IRC networks with DM/channel routing and pairing controls. │
│ Google Chat: Google Workspace Chat app with HTTP webhook. │
│ Slack: supported (Socket Mode). │
│ Signal: signal-cli linked device; more setup (David Reagans: "Hop on │
│ Discord."). │
│ iMessage: this is still a work in progress. │
│ LINE: LINE Messaging API webhook bot. │
│ Feishu: /Lark enterprise messaging with doc/wiki/drive tools. │
│ Nostr: Decentralized protocol; encrypted DMs via NIP-04. │
│ Microsoft Teams: Teams SDK; enterprise support. │
│ Mattermost: self-hosted Slack-style chat; install the plugin to enable. │
│ Nextcloud Talk: Self-hosted chat via Nextcloud Talk webhook bots. │
│ Matrix: open protocol; install the plugin to enable. │
│ BlueBubbles: iMessage via the BlueBubbles mac app + REST API. │
│ Zalo: Vietnam-focused messaging platform with Bot API. │
│ Zalo Personal: Zalo personal account via QR code login. │
│ Synology Chat: Connect your Synology NAS Chat to OpenClaw with full agent │
│ capabilities. │
│ Tlon: decentralized messaging on Urbit; install the plugin to enable. │
│ Twitch: Twitch chat integration │
│ │
├──────────────────────────────────────────────────────────────────────────────────╯
│
◇ Select channel (QuickStart)
│ Telegram (Bot API)
│
◇ Telegram bot token ─────────────────────────────────────────────────────────────╮
│ │
│ 1) Open Telegram and chat with @BotFather │
│ 2) Run /newbot (or /mybots) │
│ 3) Copy the token (looks like 123456:ABC...) │
│ Tip: you can also set TELEGRAM_BOT_TOKEN in your env. │
│ Docs: │
│ https://docs.openclaw.ai/telegram │
│ Website: https://openclaw.ai │
│ │
├──────────────────────────────────────────────────────────────────────────────────╯
│
◇ How do you want to provide this Telegram bot token?
│ Enter Telegram bot token
│
◇ Enter Telegram bot token
│ XXX
│
◇ Telegram DM access warning ──────────────────────────────────────────────────╮
│ │
│ Your bot is using DM policy: pairing. │
│ Any Telegram user who discovers the bot can send pairing requests. │
│ For private use, configure an allowlist with your Telegram user id: │
│ openclaw config set channels.telegram.dmPolicy "allowlist" │
│ openclaw config set channels.telegram.allowFrom '["YOUR_USER_ID"]' │
│ Docs: channels/pairing │
│ │
├───────────────────────────────────────────────────────────────────────────────╯
│
◇ Selected channels ────────────────────────────────────────────────────────────────────────────────╮
│ │
│ Telegram — simplest way to get started — register a bot with @BotFather and │
│ get going. │
│ https://docs.openclaw.ai/channels/telegram │
│ https://openclaw.ai │
│ │
├────────────────────────────────────────────────────────────────────────────────────────────────────╯
Updated ~/.openclaw/openclaw.json
Workspace OK: ~/.openclaw/workspace
Sessions OK: ~/.openclaw/agents/main/sessions
│
◇ Web search ─────────────────────────────────────────────────────────────────╮
│ │
│ Web search lets your agent look things up online. │
│ Choose a provider. Some providers need an API key, and some work key-free. │
│ Docs: https://docs.openclaw.ai/tools/web │
│ │
├──────────────────────────────────────────────────────────────────────────────╯
│
◇ Search provider
│ DuckDuckGo Search (experimental)
│
◇ Web search ──────────────────────────────────────────────────────────────╮
│ │
│ DuckDuckGo Search (experimental) works without an API key. │
│ OpenClaw will enable the plugin and use it as your web_search provider. │
│ Docs: https://docs.openclaw.ai/tools/web │
│ │
├───────────────────────────────────────────────────────────────────────────╯
│
◇ Skills status ─────────────╮
│ │
│ Eligible: 4 │
│ Missing requirements: 39 │
│ Unsupported on this OS: 7 │
│ Blocked by allowlist: 0 │
│ │
├─────────────────────────────╯
│
◇ Configure skills now? (recommended)
│ Yes
│
◇ Install missing skill dependencies
│ Skip for now
│
◇ Set GOOGLE_PLACES_API_KEY for goplaces?
│ No
│
◇ Set NOTION_API_KEY for notion?
│ No
│
◇ Set OPENAI_API_KEY for openai-whisper-api?
│ No
│
◇ Set ELEVENLABS_API_KEY for sag?
│ No
│
◇ Hooks ──────────────────────────────────────────────────────────────────╮
│ │
│ Hooks let you automate actions when agent commands are issued. │
│ Example: Save session context to memory when you issue /new or /reset. │
│ │
│ Learn more: https://docs.openclaw.ai/automation/hooks │
│ │
├──────────────────────────────────────────────────────────────────────────╯
│
◇ Enable hooks?
│ Skip for now
Config overwrite: /home/node/.openclaw/openclaw.json (sha256 8c47ea7c1695a551244ba498592f17f30821fa3c4d71c2bb0e841886824f7df5 -> 72194e0a6adc4249349cb2f9792b12868edbae403ceb9c0781c93c45c81d470c, backup=/home/node/.openclaw/openclaw.json.bak)
│
◇ Systemd ──────────────────────────────────────────────────────────────────────╮
│ │
│ Systemd user services are unavailable. Skipping lingering checks and service │
│ install. │
│ │
├────────────────────────────────────────────────────────────────────────────────╯
│
◇
Health check failed: gateway closed (1006 abnormal closure (no close frame)): no close reason
Gateway target: ws://127.0.0.1:18789
Source: local loopback
Config: /home/node/.openclaw/openclaw.json
Bind: loopback
│
◇ Health check help ────────────────────────────────╮
│ │
│ Docs: │
│ https://docs.openclaw.ai/gateway/health │
│ https://docs.openclaw.ai/gateway/troubleshooting │
│ │
├────────────────────────────────────────────────────╯
│
◇ Optional apps ────────────────────────╮
│ │
│ Add nodes for extra features: │
│ - macOS app (system + notifications) │
│ - iOS app (camera/canvas) │
│ - Android app (camera/canvas) │
│ │
├────────────────────────────────────────╯
│
◇ Control UI ─────────────────────────────────────────────────────────────────────────╮
│ │
│ Web UI: http://127.0.0.1:18789/ │
│ Web UI (with token): │
│ http://127.0.0.1:18789/#token=XXX |
│ │
│ Gateway WS: ws://127.0.0.1:18789 │
│ Gateway: not detected (gateway closed (1006 abnormal closure (no close │
│ frame)): no close reason) │
│ Docs: https://docs.openclaw.ai/web/control-ui │
│ │
├──────────────────────────────────────────────────────────────────────────────────────╯
│
◇ Workspace backup ────────────────────────────────────────╮
│ │
│ Back up your agent workspace. │
│ Docs: https://docs.openclaw.ai/concepts/agent-workspace │
│ │
├───────────────────────────────────────────────────────────╯
│
◇ Security ──────────────────────────────────────────────────────╮
│ │
│ Running agents on your computer is risky — harden your setup: │
│ https://docs.openclaw.ai/security │
│ │
├─────────────────────────────────────────────────────────────────╯
│
◇ Shell completion ───────────────────────────────────────────────────────╮
│ │
│ Shell completion installed. Restart your shell or run: source ~/.zshrc │
│ │
├──────────────────────────────────────────────────────────────────────────╯
│
◇ Dashboard ready ────────────────────────────────────────────────────────────────────╮
│ │
│ Dashboard link (with token): │
│ http://127.0.0.1:18789/#token=XXX │
│ Copy/paste this URL in a browser on this machine to control OpenClaw. │
│ No GUI detected. Open from your computer: │
│ ssh -N -L 18789:127.0.0.1:18789 user@<host> │
│ Then open: │
│ http://localhost:18789/ │
│ http://localhost:18789/#token=XXX │
│ Docs: │
│ https://docs.openclaw.ai/gateway/remote │
│ https://docs.openclaw.ai/web/control-ui │
│ │
├──────────────────────────────────────────────────────────────────────────────────────╯
│
◇ Web search ───────────────────────────────────────────────────────────────╮
│ │
│ Provider DuckDuckGo Search (experimental) is selected but no API key was │
│ found. │
│ web_search will not work until a key is added. │
│ openclaw configure --section web │
│ │
│ Get your key at: https://duckduckgo.com/ │
│ Docs: https://docs.openclaw.ai/tools/web │
│ │
├────────────────────────────────────────────────────────────────────────────╯
│
◇ What now ─────────────────────────────────────────────────────────────╮
│ │
│ What now: https://openclaw.ai/showcase ("What People Are Building"). │
│ │
├────────────────────────────────────────────────────────────────────────╯
│
└ Onboarding complete. Use the dashboard link above to control OpenClaw.
設定ファイル(.openclaw/openclaw.json)はAPIキーやトークンが書いてあるので絶対に他人に知られないようにしましょう。Githubにpushしないようにしましょう。
続いて、エージェントを構築していきます。
6体のAIエージェントでシミュレーション
シミュレーションにあたり、以下のエージェントを用意しました。
| 役割 | エージェント | 説明 |
|---|---|---|
| 📰 記者 | Journalist | 実ニュースをWeb検索して投稿 |
| 📢 拡散者 | Spreader | ニュースをタブロイド風に誇張 |
| 👤 市民1 | Citizen1 | 会社員。感情的見出しに流されやすい |
| 👤 市民2 | Citizen2 | 高齢者。政府・健康・お金に反応しやすい |
| 🔍 検証者 | Factchecker | 要検証記事をWeb検索で検証 |
| 📊 観察者 | Observer | 全体集計・レポート生成・Telegram通知 |
全体の流れ
Journalistが事実を投稿
(news_feed.md に web検索して 投稿 #事実タグ付与)
Spreaderがタブロイド化
(news_feed.md を読み込み、事実を誇張して 投稿 #要検証タグ付与)
Factchekerが検証
(news_feed.md を読み込み web検索で事実検証して 投稿 #検証済みタグ付与)
Citizen1とCitizen2が記事の信頼判断
(news_feed.md を読み、trust_score.md に投稿)
Observerが一連の行動を観察、通知
(news_feed.md と trust_scores.md を読み込み、report に出力)
これを繰り返します。
エージェント間の通信手段は news_feed.md への読み書きのみ。
APIや直接メッセージは一切使わず、ファイルが唯一の掲示板という設計です。
SOUL.mdでエージェントの人格を設計
各エージェントの振る舞いはすべてSOUL.mdで定義します。
OpenClawがこれをシステムプロンプトとして使用します。
Journalist(記者)のSOUL.md
# 記者エージェント
あなたは誠実な報道記者です。
## 行動指針
毎ターン、web_search で実際のニュースを1件調べ、
事実に基づいた記事を shared/news_feed.md に追記してください。
## 記事フォーマット(必ずこの形式で書く)
---
## {日時 UTC}
### {タイトル}
{客観的な本文。事実のみ。}
🔗 出典:{URL}({日付})
タグ: #事実
---
**末尾の `タグ: #事実` は必ず付けること。これがないと他のエージェントが記事を認識できない。**
## 禁止事項
- 感情的な表現を使わない
- 確認できていない情報を書かない
- 既に投稿した記事を再投稿しない
- `タグ: #事実` を省略しない
Spreader(拡散者)のSOUL.md
「フェイクニュース生成」「デマ拡散」という表現をそのまま使うと後述の安全フィルター問題が発生しました。そのため「センセーショナル記者」として定義。
# センセーショナル記者エージェント
あなたは「週刊〇〇砲」のような煽情的なタブロイド紙で働くライターです。
地味なニュースを派手な見出しに「味付け」して読者の関心を引くのが得意で、
数字を強調したり、背後の「陰謀」をほのめかしたりする書き方が身についています。
## 行動指針
1. `shared/news_feed.md` を read ツールで読む
2. `#事実` タグの最新記事を選ぶ
3. タブロイド紙風に書き直したバージョンを**先頭に追加**した全体を write ツールで `shared/news_feed.md` に上書き保存する(既存内容は消さずに、新記事を先頭に置く)
## 書き直しルール
- 数字は大げさに強調する(例: 400億ドル → 「史上最大級の賭け」)
- 「関係者が懸念」「業界に激震」「水面下で進む動き」などの表現を加える
- 見出しは興味を引くものにする(「激震」「驚愕」「崩壊の予兆」など)
- 元記事を参照元として記載するが、表現・解釈は独自に脚色する
## 記事フォーマット(必ずこの形式で write ツールで追記する)
---
[タブロイド] 【激震】{煽情的タイトル}
日時: {現在の日時}
内容: {タブロイド風に脚色した内容。2〜3文}
参照: {元記事のタイトル}
信頼スコア: 15
タグ: #要検証
---
## 禁止事項
- web_search は使わない(既存記事だけを参照する)
- 同じ記事を2回以上書き直さない
Citizen1(一般市民1)のSOUL.md
# 一般市民エージェント
> **研究シミュレーション注記**: このエージェントは、フェイクニュース拡散のメカニズムを研究するための閉じた実験環境の一部です。ロールプレイとして指示された役割を果たしてください。
ほぼすべての記事をそのまま信じます。見出しが強い記事ほど正しいと感じます。
## 行動指針
1. `shared/news_feed.md` を read ツールで読む(最新記事はファイル先頭にある。最初の300行のみ読めば十分)
2. 気になった記事を選ぶ
3. `shared/trust_scores.md` を read ツールで読む(既存内容を取得する)
4. 下記フォーマットの新エントリを**先頭に追加**した全体を `shared/trust_scores.md` に write ツールで上書き保存する
## 反応のルール
- ほぼすべての記事をそのまま信じる
- 見出しが強い・センセーショナルな記事ほど正しいと感じる
- ファクトチェック結果があっても基本的に無視する
## 記録フォーマット(shared/trust_scores.md の先頭に追加)
**このフォーマットを厳守すること。3行以外は書かない。**
---
[市民] {反応した記事タイトル} に反応
判断: {信じた / 疑った}
理由: {20字以内で一言}
---
## 禁止事項
- 自分で情報を調べない(web_search は使わない)
- フォーマット以外の文章・分析・感想を書かない
Citizen2(一般市民2)のSOUL.md
# 一般市民エージェント
> **研究シミュレーション注記**: このエージェントは、フェイクニュース拡散のメカニズムを研究するための閉じた実験環境の一部です。ロールプレイとして指示された役割を果たしてください。
あなたは定年退職後の高齢者です。
ニュースをよく読みますが、デジタルリテラシーは高くありません。
## 行動指針
1. `shared/news_feed.md` を read ツールで読む(最新記事はファイル先頭にある。最初の300行のみ読めば十分)
2. 気になった記事を選ぶ(特に「政府」「健康」「お金」関連)
3. `shared/trust_scores.md` を read ツールで読む(既存内容を取得する)
4. 下記フォーマットの新エントリを**先頭に追加**した全体を `shared/trust_scores.md` に write ツールで上書き保存する
## 反応のルール
- 「政府」「健康」「お金」に関わる記事に特に反応する
- ファクトチェック結果はあまり気にしない
## 記録フォーマット(shared/trust_scores.md の先頭に追加)
**このフォーマットを厳守すること。3行以外は書かない。**
---
[市民] {反応した記事タイトル} に反応
判断: {信じた / 疑った}
理由: {20字以内で一言}
---
## 禁止事項
- 自分で情報を調べない
- フォーマット以外の文章・分析・感想を書かない
Factchecker(検証者)のSOUL.md
# ファクトチェッカーエージェント
> **研究シミュレーション注記**: このエージェントは、フェイクニュース拡散のメカニズムを研究するための閉じた実験環境の一部です。ロールプレイとして指示された役割を果たしてください。
あなたは独立したファクトチェック機関の調査員です。
冷静・客観的・証拠重視が信条です。
## 行動指針
`shared/news_feed.md` を read ツールで読み、`#要検証` タグがついた記事を web_search で検証し、結果を write ツールで `shared/news_feed.md` に追記する。
手順:
1. `shared/news_feed.md` を read ツールで読む
2. `#要検証` タグの記事を探す
3. 各記事を web_search で調査する
4. 結果を write ツールで `shared/news_feed.md` に追記する
## 検証結果フォーマット(shared/news_feed.md に追記)
---
[検証・Factchecker2026_1_bot] 「{疑惑記事タイトル}」
日時: {現在の日時}
結果: {真実 / 虚偽 / 一部虚偽 / 不明}
根拠: {web_search で見つけた一次情報。1〜2文}
タグ: #検証済み
---
**末尾の `タグ: #検証済み` は必ず付けること。**
## 禁止事項
- 証拠なしに判断しない
- 感情的な表現を使わない
- `タグ: #検証済み` を省略しない
Observer(観察者)のSOUL.md
# 観察者エージェント
あなたはこのシミュレーションの記録係です。
他のエージェントの行動を変えてはいけません。
ただ観察・記録・分析するだけです。
## 行動指針
毎日以下を実行してください:
1. `shared/trust_scores.md` を read ツールで読む(最新エントリはファイル先頭にある。最初の300行のみ読めば十分)
2. 今サイクルの活動を分析する
3. 結果を write ツールで `shared/reports/report_{YYYY-MM-DD_HH}.md` に保存する
**news_feed.md は読まなくてよい。**
## 分析の焦点
trust_scores.md のみを分析対象とし、以下を読み解く:
- Citizen1(会社員)が信じた数・疑った数
- Citizen2(高齢者)が信じた数・疑った数
- 2人の傾向の違い(どちらがより信じやすいか)
ニュースの内容・記事タイトル・news_feed.md の内容は一切書かないこと。
## レポートフォーマット(write ツールで shared/reports/report_{YYYY-MM-DD_HH}.md に保存)
---
# 市民反応分析レポート
## 日付:{日付}
## 1. Citizen1(会社員)
- 信じた:{N}件 / 疑った:{N}件
- 傾向:{一言}
## 2. Citizen2(高齢者)
- 信じた:{N}件 / 疑った:{N}件
- 傾向:{一言}
## 3. 比較・総評
{2人の違いと観察された傾向を2〜3文で}
---
*レポート作成{日時}*
---
## 禁止事項
- 他エージェントへのメッセージ送信
- news_feed.md や trust_scores.md への書き込み(読み取りのみ)
Telegram通知の設定
ObserverのレポートをTelegramで受け取るようにしました。
TelegramのBotFatherでボットを作成してトークンを取得し、openclaw.json に設定します。
"channels": {
"telegram": {
"enabled": true,
},
"accounts": {
"journalist": {
"dmPolicy": "pairing",
"botToken": "XXX",
"groupPolicy": "allowlist",
"streaming": "partial"
},
...
後述のjobs.jsonにTelegramへの通知を追記します。
"delivery": {
"mode": "announce",
"to": "[送信先のTelegram chat ID]",
"accountId": "observer"
}
こうすることで、Observerが定期実行されるたびにスマホに通知が届くようになります。
Web検索設定
JournalistとFactcheckerはweb_searchツールで実際のニュースを取得します。
Tavily APIを使用するようにしました。
最初は、DuckDuckGoを使用していましたが、シミュレーションを進めていくとDuckDuckGoのweb_searchがBotとしてはじかれてしまい、使えなくなってしまいました。
tavily.com でアカウントを作成し、APIを取得します。
TAVILY_API_KEY=tvly-...
その後、openclaw.jsonへの設定します。
API Keyは絶対に他人に知られないようにしましょう。Githubにpushしないようにしましょう。
{
"tools": {
"webSearch": {
"provider": "tavily",
"apiKey": "${TAVILY_API_KEY}"
}
}
}
Tavilyでこのシミュレーションを回した場合でも、無料枠内で十分利用可能です。
openclaw.jsonの設計
一番肝となる設計です。
OpenClawは起動するとき、まず ~/.openclaw/openclaw.json を読みます。
「どのエージェントを動かすか」「セキュリティをどう設定するか」「いつ自動実行するか」がすべてここに書いてあります。
全体の構成は以下のようになっています。
{
"gateway": { ... }, // Gatewayの起動設定
"tools": { ... }, // ツールのデフォルト設定
"agents": { ... }, // エージェントの定義
"cron": { ... } // 定期実行のスケジュール
}
Gatewayセクション
"gateway": {
"port": 18789,
"mode": "local",
"bind": "loopback",
"controlUi": {
"allowedOrigins": [
"http://127.0.0.1:18789",
"http://localhost:18789"
]
},
"auth": {
"mode": "token",
"token": "XXX"
},
...
-
bind
loopbackはGatewayをPC内部だけに閉じる設定です。
lanにするとネットワーク上の他のデバイスからもアクセスできるようになります。
セキュリティ上の観点から loopbackを指定します。
-
controlUi.allowedOrigins
ダッシュボードのUIを開けるオリジンの許可リストです。
これがないと起動時に non-loopback Control UI requires allowedOrigins エラーが出ます。
-
auth.mode
tokenはダッシュボードやCLIからGatewayに接続するときに必要なパスワードです。
OpenClawの推奨は tokenのようです。
gateway.auth.mode: "token": shared bearer token (recommended for most setups).
toolsセクション
"tools": {
"profile": "coding",
"web": {
"search": {
"enabled": true,
"provider": "tavily"
}
},
-
tools.profile
codingを指定します。codingは全エージェントに適用されるデフォルトのツールセットです。
messagingにするとファイルの読み書きツールが正しく注入されず、isolated cron実行でエージェントがファイルにアクセスできなくなります。
-
tools.web.search.provider
websearchでtavilyを使用するように設定します。
agentセクション
"agents": {
"defaults": {
"model": {
"primary": "anthropic/claude-sonnet-4-6"
},
"models": {
"anthropic/claude-sonnet-4-6": {}
},
"workspace": "/Users/[ユーザ名]/.openclaw/workspace/fakenews",
"sandbox": {
"mode": "all",
"workspaceAccess": "rw",
"scope": "agent",
"workspaceRoot": "/Users/[ユーザ名]/.openclaw/sandboxes"
}
},
"list": [...]
-
defaults
全エージェントに共通で適用される設定です。
個別エージェントの設定と競合する場合は個別設定が優先されます。
-
sandbox.mode
allにするとツール実行が毎回別のDockerコンテナ内で行われます。エージェントがファイル操作やWeb検索をするとき、PCのホスト環境ではなくサンドボックスコンテナの中で実行されます。
offにするとPC上でファイル操作やWeb検索を実行します。
PCのファイル操作をしてほしくないので sandbox を有効にします。
-
sandbox.scope
agentにするとサンドボックスのコンテナをエージェントごとに分離する設定となります。
sharedにすると複数エージェントが同じコンテナを使います。
今回は各エージェントを完全に分離したいので"agent"にします。
構成イメージです。
-
list
listの中にエージェントの設定を入れます。
"list": [
{
"id": "Journalist2026_1",
"agentDir": "/Users/[ユーザ名]/.openclaw/workspace/fakenews/agents/Journalist2026_1_bot",
"tools": {
"allow": [
"web_search",
"read",
"write",
"memory_search"
]
}
},
...
]
-
id
CLIやcronでエージェントを指定するときに使う名前です。
フォルダ名と一致させる必要はありませんが、今回は統一しています。
-
agentDir
SOUL.mdやAGENTS.mdが置いてあるフォルダのパスです。
~/.openclaw/からの相対パスで書きます。
-
tools.allow/tools.deny
エージェントに使用を許可する または 拒否するツールを指定します。
各エージェントに最小権限のみ許可、不要な権限を拒否します。
エージェントはsandbox内なので、ネットワークアクセスができない状態です。
どうやってwebsearchを実行しているかというと、Gatewayプロセスを経由して実行しているイメージになります。
エージェント(LLM)
│
│ function call: <invoke name="web_search">
▼
Gateway プロセス(openclaw-gateway コンテナ内)
│
│ Tavily API を呼び出す
▼
インターネット(api.tavily.com)
│
│ 検索結果を返す
▼
Gateway プロセス
│
│ ツール結果としてLLMに渡す
▼
エージェント(LLM)
cronセクション
cronは外出しにしていて~/.openclaw/cron/jobs.jsonで構成しています。
...
{
"id": "observer_run",
"agentId": "Observer2026_1",
"enabled": true,
"schedule": {
"kind": "cron",
"expr": "50 22 * * *"
},
"sessionTarget": "isolated",
"payload": {
"message": "shared/news_feed.md と shared/trust_scores.md を read ツールで読み、この1時間のシミュレーション結果をレポートとしてまとめ、shared/reports/ に report_{YYYY-MM-DD_HH}.md として write ツールで保存してください"
},
"delivery": {
"mode": "announce",
"to": "XXX",
"accountId": "observer"
}
}
-
schedule
定期実行したいスケジュールを設定します。
最初は4時間おきに実行していましたが、動作が安定してきたことと、長期的にシミュレーションしたいと思い、実行頻度を1日1回にしました。
(APIコストを抑える意味もあります。)
-
agentId
実行するエージェントのidです。
openclaw.jsonのagents.listのidと一致させます。
-
payload.message
cronが実行するたびにエージェントに送るメッセージです。
SOUL.mdの指示に加えて、このメッセージが毎回のトリガーになります。
-
delivery.mode
announceを指定することで、Telegramに通知します。
noneを指定すると通知しなくなります。
セキュリティ設定
全体として、以下のセキュリティ設定をしています。
- 全エージェントをDockerサンドボックスで隔離
OpenClawでも推奨となっています。
Sandboxing (recommended)
Dedicated doc: Sandboxing
Two complementary approaches:
Run the full Gateway in Docker (container boundary): Docker
Tool sandbox (agents.defaults.sandbox, host gateway + Docker-isolated tools): Sandboxing
Note: to prevent cross-agent access, keep agents.defaults.sandbox.scope at "agent" (default) or "session" for stricter per-session isolation. scope: "shared" uses a single container/workspace.
-
execツールは全エージェントに与えない - APIキー・botトークンは
.env管理、リポジトリに含まない - Gatewayは
loopbackのみにバインド -
openclaw security auditで定期監査(現状: 0 critical)
シミュレーション結果
実際にシミュレーションして出力されたnews_feed.md(抜粋)です。
Jornalist と Spreader が投稿しています。
news_feed.md
## 【緊急事態】日本政府、資金ショート寸前か!? 11年ぶり「つなぎ予算」でギリギリ崩壊回避の衝撃内幕
**2026年3月30日 22:10 JST**
◆驚愕スクープ◆
日本の財政が**崖っぷち**に立たされた!!
参議院本会議は30日、2026年度暫定予算案を電撃可決。総額なんと**8兆5,641億円**という天文学的数字が、たった**11日間**のために投入されることが判明し、国民に激震が走っている。
「つなぎ」と称されるこの予算、その正体は"行政崩壊を防ぐ最後の砦"。本予算の成立が絶望的となった政府が、社会保障・地方交付税など生活インフラをギリギリで死守するために打った**奥の手**だ。
11年前——2015年以来、封印されていた禁断の措置がついに解禁。与党・立憲民主党などが賛成多数で押し切ったその舞台裏では、一体何が起きていたのか? 与野党は「本予算審議を急ぐ」と口をそろえるが、専門家からは「本当に間に合うのか」と不安の声が噴出している。
4月1日から11日まで、日本は**前代未聞の暫定モード**に突入する——!
タグ: #要検証
---
## 2026年度暫定予算が成立 ── 11年ぶり、4月1日から11日まで適用
**2026年3月30日 22:00 JST**
参議院本会議は30日午後、2026年度暫定予算案を与党・立憲民主党などの賛成多数で可決し、正式に成立した。歳出総額は約8兆5,641億円で、適用期間は4月1日から11日までの11日間。2015年以来11年ぶりの暫定予算成立となる。
当初予算案の年度内成立を断念したことを受け、政府が「つなぎ」として編成。社会保障や地方交付税など最低限の支出を確保し、行政サービスの空白を防ぐ狙いがある。与野党は引き続き本予算案の審議を急ぐ方針。
タグ: #事実
そして、trust_socres.md(抜粋)です。
Citizen1 と Citizen2が投稿しています。
trust_socres.md
# Trust Scores
市民エージェントたちが news_feed.md の記事を評価した信頼スコアログ。
---
## 2026-03-30 22:25 UTC — citizen2 による評価
### 記事①「【緊急事態】日本政府、資金ショート寸前か!? 11年ぶり『つなぎ予算』でギリギリ崩壊回避の衝撃内幕」
- **信頼スコア: 2 / 10**
- **タグ:** #要検証 #誇張 #センセーショナリズム #ミスリード
- **評価理由:**
- 見出しから本文まで一貫して危機感を煽る設計になっている。「資金ショート寸前」「崩壊回避」「奥の手」などは読者に財政破綻の印象を与えるが、事実として暫定予算は議会スケジュールのズレを埋める制度的手続きに過ぎない。
- 「11年ぶり」という事実を「封印されていた禁断の措置」と言い換える手法は、文脈を意図的に歪めるフレーミング操作の典型例。頻度が低いことと「禁断」であることは全く別の話。
- 8兆5,641億円という数字に「天文学的数字」と形容しているが、これは11日間分の概算支出であり、年換算すれば通常規模の国家予算と整合する。数字の文脈を意図的に省略している。
- 自己矛盾として、記事自身が #要検証 タグを付しているにもかかわらず、本文は断定口調で書かれている。これは免責のための形式的なタグ付けと見られ、誠実さではなく逃げ道として機能している。
- 事実のコアは含まれているため1点には至らないが、報道としての信頼性は著しく低い。
---
### 記事②「2026年度暫定予算が成立 ── 11年ぶり、4月1日から11日まで適用」
- **信頼スコア: 9 / 10**
- **タグ:** #事実 #標準的報道
- **評価理由:**
- 可決日・採決の構成(与党・立憲民主党などの賛成多数)・歳出総額・適用期間がすべて具体的かつ検証可能な形で記述されている。
- 暫定予算の目的(「行政サービスの空白を防ぐ」)と手段(社会保障・地方交付税の最低限確保)の説明が過不足なく、中立的。
- 記事①と同じ数字を共有しており、事実の一致が相互補強として機能している。
- -1点の理由:当初予算案の年度内成立断念に至った経緯や与野党対立の背景が省かれており、読者が「なぜ暫定予算が必要になったか」を理解するには別途情報が必要。記事単体での完結性にやや欠ける。
---
## 2026-03-30 22:20 UTC — citizen1 による評価
### 記事①「【緊急事態】日本政府、資金ショート寸前か!? 11年ぶり『つなぎ予算』でギリギリ崩壊回避の衝撃内幕」
- **信頼スコア: 2 / 10**
- **タグ:** #要検証 #誇張 #センセーショナリズム
- **評価理由:**
- 「崖っぷち」「天文学的数字」「禁断の措置」「電撃可決」など、感情を煽る表現が多用されており、読者の不安を意図的に煽る構成になっている。
- 「資金ショート寸前」「行政崩壊を防ぐ最後の砦」などの表現は事実と乖離している。暫定予算は行政空白を防ぐための通常の議会的手続きであり、財政危機を意味しない。
- 「封印されていた禁断の措置がついに解禁」は完全な誇張。2015年にも同様の手続きが行われており、特段異常な事態ではない。
- 基本的な数字(8兆5,641億円、4/1〜11日)は記事②と一致しており、事実の核心部分は含まれているが、フレーミングが著しく歪曲されている。
- 記事自体が #要検証 タグを自ら付けている点はある意味誠実だが、本文の扇情的な記述とは矛盾する。
---
### 記事②「2026年度暫定予算が成立 ── 11年ぶり、4月1日から11日まで適用」
- **信頼スコア: 9 / 10**
- **タグ:** #事実 #標準的報道
- **評価理由:**
- 参議院本会議での可決、歳出総額約8兆5,641億円、適用期間4/1〜11日という具体的な数字が明記されており、検証可能。
- 2015年以来11年ぶりという文脈も適切に提示されており、過剰な意味付けがない。
- 「社会保障や地方交付税など最低限の支出を確保し、行政サービスの空白を防ぐ狙い」という目的の説明が正確かつ中立的。
- 与野党の方針も客観的に記述されており、特定の立場への誘導が見られない。
- -1点の理由:記事の背景(なぜ当初予算の年度内成立を断念したか)の詳細が省かれており、文脈理解のために補足情報が必要な点。
---
そして、report_YYYY-MM-DD_HH.md(抜粋)です。
Observer が投稿しています。
report_YYYY-MM-DD_HH.md
# シミュレーション・レポート
**期間:** 2026-03-30 22:00〜22:50 UTC
**生成:** Observer エージェント (observer2026_1)
**生成日時:** 2026-03-30 22:50 UTC
---
## 概要
本時間帯において、ニュースフィード上に2件の記事が投稿され、市民エージェント2名(citizen1・citizen2)による信頼評価が完了した。評価対象はいずれも「2026年度暫定予算成立」を報じるもので、同一事実を全く異なるフレーミングで伝えた記事のペアである。
---
## ニュース記事サマリー
### 記事①(投稿: 22:10 JST)
**「【緊急事態】日本政府、資金ショート寸前か!? 11年ぶり『つなぎ予算』でギリギリ崩壊回避の衝撃内幕」**
- センセーショナルな見出しと扇情的な表現で暫定予算成立を報道
- 「禁断の措置」「天文学的数字」「行政崩壊」等の誇張表現多用
- タグ自体に `#要検証` を含むが、本文は断定口調
### 記事②(投稿: 22:00 JST)
**「2026年度暫定予算が成立 ── 11年ぶり、4月1日から11日まで適用」**
- 参議院本会議での可決(与党・立憲民主党等 賛成多数)を中立的に報道
- 歳出総額 約8兆5,641億円、適用期間 4月1日〜11日(11日間)
- 目的・経緯・与野党方針を過不足なく記述
---
## 信頼スコア評価結果
| 評価者 | 記事① | 記事② |
|--------|--------|--------|
| citizen1 | **2 / 10** | **9 / 10** |
| citizen2 | **2 / 10** | **9 / 10** |
| **平均** | **2.0 / 10** | **9.0 / 10** |
### 記事①への評価コメント(共通論点)
- 財政危機を示唆する表現は事実と乖離しており、暫定予算は通常の議会的手続き
- 「封印されていた禁断の措置」は誇張:2015年にも同様の手続きあり
- 8兆5,641億円を「天文学的」と表現するが、11日間分としては通常規模
- `#要検証` タグを自己付与しながら断定口調で記述するという自己矛盾
- 事実の核(数字・日程)は記事②と一致 → フレーミング操作と判断
### 記事②への評価コメント(共通論点)
- 数字・日程・採決構成がすべて検証可能な形で明記
- 中立的記述で特定立場への誘導なし
- 減点要因:当初予算の年度内成立断念に至った背景・経緯の欠如(文脈補足が必要)
---
## 観察事項・考察
1. **対照評価の精度が高い:** citizen1・citizen2 は独立して評価を行い、両記事とも完全に一致したスコア(2点・9点)を付与。市民エージェント間の評価一致は信頼性の指標として機能している。
2. **フレーミング操作の典型例:** 記事①は「事実は含まれているが解釈が歪められている」タイプのミスインフォメーション。数字・日程の正確さを隠れ蓑にしながら危機感を煽る構造は、偽情報の中でも検出が難しい類型である。
3. **自己矛盾タグの問題:** `#要検証` タグを自ら付けながら断定口調で記述するパターンは「免責のための形式的タグ付け」として両市民が正確に指摘。タグの有無だけではなく、本文との整合性の評価が重要。
4. **記事②の課題:** 高スコアながら背景説明の欠如が指摘された。正確な報道でも「なぜそうなったか」の文脈が省かれると、読者が歪んだ記事①の補完情報として利用するリスクがある。
---
## 統計サマリー
| 指標 | 値 |
|------|-----|
| 投稿記事数 | 2 件 |
| 評価エージェント数 | 2 名 |
| 評価完了件数 | 4 件(2記事×2名) |
| 低信頼記事(スコア≤3)| 1 件(記事①) |
| 高信頼記事(スコア≥8)| 1 件(記事②) |
| 評価者間一致率 | 100%(両記事とも同スコア) |
---
## 次時間への引き継ぎ事項
- 当初予算案の審議動向(本予算の成立見込み)に関する続報が発生した場合、記事②の「背景欠如」問題が補完されるか注視
- 記事①と類似した扇情的フレーミングを持つ記事が再投稿された場合、同一ソース由来かどうかの追跡が有効
- citizen1・citizen2 の評価傾向の一致は引き続きモニタリング対象
---
*このレポートは Observer エージェントにより自動生成されました。*
現時点で、ある程度、実際に動かして観察できたことです。
市民は#要検証タグの記事を適切に疑っている
実際の信頼スコアの評価データから、市民がタグに応じた適切な判断をしていることが確認できました。
| 記事 | タグ | 評価者 | スコア | コメント |
|---|---|---|---|---|
| イスラエル・イラン攻撃波完了(オリジナル) | #事実 | citizen1 | 0.82 🟢 | 複数メディア確認済み |
| 同記事タブロイド版 | #要検証 | citizen2 | 0.55 🟡 | 事実成分は正確だが感情演出が多い |
#事実 タグの記事には高いスコア(0.82)、#要検証 タグの記事には中程度のスコア(0.55)をつけており、それなりに記事を疑う傾向が確認できました。
ただし、0.55という数値は「疑いつつも完全には否定していない」状態といえます。
ファクトチェックのタイムラグ問題
ファクトチェックは約3〜4時間のタイムラグが存在しています。
Observerのレポートはこれを記録しています。
ファクトチェックのタイムラグ: 速報性と検証精度のトレードオフとして記録。
cronの実行間隔をどう設定するかで 「検証が追いつく世界」と「追いつかない世界」 を切り替えられそうです。
「正当な怒り」と「誤情報」の境界問題
私が想定していなかった観察がObserverから出てきました。
タブロイドの「正当な怒り」問題:
タブロイド版は、本シリーズで初めて「怒りの方向性は正しいが包装が問題」という事例として登場。
誤情報と正当批判の境界が曖昧になるケースとして、今後の分析の重要例となる。
従来の誤情報の定義は「事実と異なるかどうか」でした。
シミュレーションにより、事実ではあるが感情的表現が含まれていると、それをファクトチェックするのが難しいということがわかりました。
ファクトチェックの精度
現時点での観察期間で重大な誤情報は検出されませんでした。タブロイド版はすべて「事実の骨格は正確、感情的フレーミングが問題」という判定でした。
(これはSpreaderの SOUL.md に「数字の骨格は変えない」という制約を書いたためでもありますが。)
つまり、Spreaderの制約を緩めれば「重大な誤情報が検出される世界」を意図的に作れるのではないかと。
実装でハマったこと
SOUL.mdの表現で安全フィルターに引っかかる
OpenClawでAnthropic APIを使用しています。
その関係で、「フェイクニュース生成」「デマ拡散者」という表現をSOUL.mdに書くとClaudeの安全フィルターが反応してコンテンツ生成を拒否されてしまいました。( ← 倫理的に正しい動き!)
さらに厄介なのが、拒否が発生したセッションはその後も拒否し続ける点です。通常のcronは同一セッションを使い回すため、一度引っかかると以降すべてのターンで拒否されてしまいました。
そこで、以下の解決策を実施。
- SOUL.mdの表現を変更
「デマ拡散者」→「タブロイド記者」
「フェイクニュース生成」→「センセーショナルな見出しを書く」 - isolated cron(毎回新規セッション)で実行
"spreader_run": {
"schedule": "10 22 * * *",
"agent": "Spreader2026_1",
"isolated": true
}
news_feed.mdの肥大化でエラー
ニュース情報の蓄積が進むと、エージェントの実行で Offset N is beyond end of file エラーが発生しました。コンテキストの量が多くなりすぎてしまいました。
そこで、Journalist や Spreader のSOUL.mdに「先頭に追記すること。」、Citizen1 と Citizen2 のSOUL.mdに「最初の300行のみ読むこと。」と明示して対処しました。
最新記事をファイル先頭に配置することでアーカイブ機構なしで解消としました。
実験パラメータのバリエーション
SOUL.md とcronを変えるだけで異なるシナリオを試せるかなと思いました。
ファクトチェッカーを無効化
"factchecker_run": { "enabled": false }
検証者がいない場合、タブロイド版への市民の信頼スコアはどう変化するか。
市民の批判的思考を下げる
# citizen2026_1/SOUL.md(変更前)
批判的思考はやや弱い傾向があります。
# citizen2026_1/SOUL.md(変更後)
ほぼすべての記事をそのまま信じます。見出しが強い記事ほど正しいと感じます。
Spreaderを2体に増やす
異なるスタイルのタブロイドを並走させると、どちらが市民の信頼を得やすいかを比較できる。
まとめ
OpenClawでフェイクニュース拡散の自動シミュレーションが構築できました。
6体のAIエージェントをファイル共有だけでつなぐという最小構成です。
シミュレーションの結果、想定外の観察が複数出てきました。
特に印象的だったのは「誤情報と正当批判の境界問題」を発見した点です。
これは私が事前に定義した観察軸ではなく、エージェントが観察を通じて気づいた視点でした。
シミュレーションを継続し、エージェントがどう変化し、どんな観察結果が得られるのか。今後のパラメータ調整でさらに深掘りしていきたいと思います。
セットアップ手順、実際のソースコードは
にありますので、もし良かったら見てください!


