Wealth Agent — 自律型収益エージェント
「チャットで相談するAI」ではなく、長期目標を持ち、実際に仕事を進め続けるAIエージェント。
ユーザーが目標を一度設定すると、エージェントは自分で計画 → 調査 → 実行 → 検証 → 失敗分析 → 改善 → 次のタスク選択 を繰り返します。初期費用・継続費用はゼロ。iPhoneのホーム画面に追加して単体アプリとして動作します。
30秒で把握する
| 項目 | 内容 |
|---|---|
| 自律ループ | Cron Trigger + クライアントポーリングで tick を回し続け、各ステップで状態・証拠・チェックポイントを永続化 |
| タスク状態 | queued → planning → running → testing → verifying → improving → completed/failed/waiting_* |
| 無限ループ防止 | 進捗が止まったら N 回で戦略切替、M 回でオーナー判断待ちに自動移行(反復失敗を永遠に繰り返さない) |
| AIルーター | Gemini / Groq / OpenRouter をタスク種別で使い分け。キーが無くても決定的エンジンで全機能が動作 |
| 収益エンジン | FX(バックテスト・非リペイント検査・ウォークフォワード・過剰最適化検出)/ポイ活/副業Web事業/横断ランキング |
| 誠実性 | 実測 / 第三者報告 / 推定 / 未確認 を常に分離。証拠のない「実測」は自動で降格 |
| 安全性 | 実売買・入出金・課金・登録・外部公開・削除は人間の承認必須。承認なしでは絶対に実行しない |
| 費用 | Cloudflare Workers Free + D1 Free + GitHub Pages。0円で運用可能 |
クイックスタート(ローカルで動かす/検証する)
cd wealth-agent
npm run test:unit # 純粋ロジックのユニットテスト
npm test # 受入テスト A〜L(実DB・実Workerコード)
npm run dev # http://localhost:8787 で起動
npm run dev は 本番と同じ Worker コード を Node 22 の node:sqlite(D1互換アダプタ)上で動かします。モックではありません。初回起動時にスキーマ適用と初期データ投入を自動実行します。
# 自律ループを実際に回し続ける(60秒ごとに tick)
npm run dev -- --autorun --port 8787
AIキーを設定しなくても、計画・調査・検証・ランキング・バックテストはすべて動作します(決定的エンジン)。AIキーを設定すると推論品質が上がります。
GEMINI_API_KEY=xxx GROQ_API_KEY=yyy npm run dev
アーキテクチャ
┌──────────────────────────────┐
│ iPhone / Android / PC (PWA) │ GitHub Pages で配信(静的)
│ 12画面 + 補助チャット │ Service Worker でアプリシェルをキャッシュ
└───────────┬──────────────────┘
│ HTTPS / Bearer OWNER_TOKEN
┌───────────▼──────────────────┐
│ Cloudflare Worker (無料枠) │ ← Cron Trigger が自律ループの心臓
│ ├ api.js ルーティング │ 5分ごとに tick(状態は常に永続化)
│ ├ engine/ 自律実行ループ│
│ ├ income/ 収益4モジュール│
│ ├ research/ 調査・知識 │
│ ├ ai/router.js AIプロバイダ │
│ └ safety.js 権限ゲート │
└───────────┬──────────────────┘
│ D1 API(完全互換)
┌───────────▼──────────────────┐
│ Cloudflare D1 (SQLite, 無料) │ 記憶・タスク・実績・チェックポイント
└──────────────────────────────┘
詳細は docs/ARCHITECTURE.md、デプロイ手順は DEPLOY.md を参照。
無料枠の実測値(2026年10月時点)
| サービス | 無料枠 | 本アプリでの対応 |
|---|---|---|
| Cloudflare Workers Free | 100,000 req/日、Cron Trigger 15分/回・5本/アカウント、CPU 10ms/呼び出し | tick は「1回あたり数ステップ」に制限。重い計算は分割実行 |
| Cloudflare D1 Free | 5M rows read/日、100k rows written/日、5GB | 市場データ・検索結果・取得ページをすべてキャッシュ |
| GitHub Pages | 無料(静的のみ) | PWAのフロントエンド配信 |
| Gemini API | 無料枠あり(モデル別 RPM/RPD、AI Studio で確認) | planner / researcher に使用 |
| Groq | 無料・カード不要(≒30 RPM、14,400 RPD) | 高速ロール(critic/summarizer)に使用 |
| OpenRouter | :free モデルあり |
フォールバック |
| FXデータ | Yahoo Finance chart API / ECB(Frankfurter) | キー不要。日足OHLCを取得 |
重要: Cron Trigger はブラウザーを閉じていても動きます。ただし Free プランは 1回の Cron 実行の CPU 時間が 10ms という制約があるため、1回の tick で行う作業を意図的に小さく設計しています(
ENGINE_STEPS_PER_TICK)。ネットワーク待ちは CPU 時間に算入されないため、「調査 → 記録 → 次のtick」を分割して進める方式が最も安定します。この制約は隠さず、設定画面と本ドキュメントに明記しています。
自律性レベル
| レベル | 内容 |
|---|---|
| L1 | 提案中心 |
| L2 | 計画と調査を自動化 |
| L3 | 安全なタスクを自動実行 |
| L4 | 実行・テスト・改善を自動反復(初期設定) |
| L5 | 複数ミッションを並行管理し、長期目標に向けて継続実行 |
L5 でも 資金移動・実売買・課金・アカウント登録・外部公開・不可逆操作・個人情報送信 は自動許可されません。
キャラクター(Character Studio)
A. 野心的な事業家 / B. 冷徹な研究者 / C. 自律型エンジニア / D. 戦略家 / E. カスタム
名前・口調・価値観だけでなく、優先度の重み(上振れ/速度/証拠/リスク/コスト)がタスク選択スコアと機会ランキングに直接反映されます。慎重さとリスク許容度は重みを再計算し、同じ状況でも選ぶタスクが人格によって変わります(受入テスト X8 で検証)。
収益エンジン
FX Research
- 戦略仮説の自動生成(EMAクロス / RSI平均回帰 / ボリンジャー / ドンチャン)
- Pine Script v5/v6 生成 + 非リペイント検査(
lookahead_on・確定前バー・varip・calc_on_every_tick等を検出) - バックテスト:シグナルは確定バーのみ、約定は翌バー始値、スプレッド・スリッページ・手数料を毎回控除
- 指標:PF・勝率・期待値・最大DD・シャープ・CAGR
- ウォークフォワード(再最適化なしの逐次検証)+ 過剰最適化検出(IS 70% で最適化 → OOS 30% で検証)
- 負けトレード分析 → 改善仮説 → パラメータ変更 → 再テスト → バージョン管理
- 実口座発注は行いません(研究・バックテスト・デモ検証のみ)
Rewards Research(ポイ活)
日本から利用可能か、登録条件、最低換金額、出金方法、手数料、規約適合性を確認して登録。確認できない項目は unknown とし、利用可能と断定しません。換金実績は第三者報告の有無を区別します。
Side Hustle Research
アフィリエイト・広告・小規模SaaS・デジタル商品・Webツール・コンテンツ・自動化サービス・面接なしオンライン案件。需要/競合/集客経路/実行難易度を比較し、MVP作成まで進めます。訪問・登録・クリック・成約・売上を計測できるまで収益とは扱いません(recordFunnel)。
Opportunity Ranking Engine
初期費用・継続費用・作業時間・自動化可能性・収益化までの時間・想定収益・根拠・リスク・継続性・換金可能性・日本での利用可否・規約適合性・確認済み成果 を重み付きで評価し、次の資源配分を決定します。
受入テスト A〜L
npm test で実行されます(実Workerコード・実SQLite・ネットワークはスタブ)。
| ID | 検証内容 |
|---|---|
| A | キャラクター設定を保存し、再読み込み後も保持される(+人格由来の重みを検証) |
| B | ミッション登録で自動的に複数タスクへ分割(FX/ポイ活/副業を認識) |
| C | タスク完了後、次のタスクが自動選択される(選定理由つき) |
| D | テスト失敗時、ログ保存+診断+別計画の試行(再試行はパラメータを実際に変更) |
| E | 停止 → 再開でチェックポイントから続行(attempt はリセットされない) |
| F | APIエラーで無限ループせず、リトライ/切替/待機のいずれかが発生(429→バックオフ→フォールバック、401→即切替) |
| G | APIキーがブラウザー・公開リポジトリに露出しない(プレゼンスフラグのみ返す/401を強制) |
| H | 実績収益と推定収益が別々に表示される(証拠なしの「実測」は拒否) |
| I | iPhone幅で主要操作が可能(44pxタップ領域・safe-area・12画面・ホーム画面の必須表示項目) |
| J | ブラウザーを閉じてもバックエンドが継続(Cron駆動・制約を明示) |
| K | 危険な外部操作が承認なしに実行されない(4種の承認必須ツール+有料API遮断) |
| L | 過去の失敗手法と却下候補が次の計画に反映される |
加えて X1〜X9(FXパイプライン、ログ/チェックポイント、データ分析、コード生成→テスト、ワークフロー、深層リサーチ、ブラウザ安全制約、人格重みの反映、キー無し決定的動作)を検証します。
ディレクトリ構成
wealth-agent/
├── src/
│ ├── index.js Worker エントリ(API・静的配信・Cron)
│ ├── api.js 全エンドポイント
│ ├── db.js D1互換データアクセス層+スキーマ
│ ├── truth.js 実測/推定の分離(誠実性レイヤー)
│ ├── safety.js 権限ゲート・支出ガード・プロンプト注入無害化
│ ├── scheduler.js Cron の心臓(tick・ワークフロー・日次補正)
│ ├── ai/router.js AIプロバイダルーター+決定的フォールバック
│ ├── engine/ planner / executor / verifier / peer / tools / engine
│ ├── memory/ 検索可能な長期記憶(FTS5)
│ ├── income/ fx / backtest / pine / rewards / sidehustle / ranking
│ ├── research/ web / deep / knowledge
│ ├── code/ data/ browser/ workflow/
├── public/ PWA(index.html / app.js / styles.css / sw.js / manifest)
├── server/local.mjs ローカル実行サーバー(本番Workerコードをそのまま使用)
├── schema.sql D1 スキーマ
├── wrangler.toml Cloudflare 設定
└── tests/ unit.test.mjs / run.mjs(受入A〜L)
制約の正直な開示
- Cron の CPU 制限(Free 10ms) — 重い計算は1回で完結させず、tick を分割して進めます。
- ブラウザーエージェント — HTTP 取得による読み取り専用です。ログイン・CAPTCHA・フォーム送信・決済は行いません(できません)。
- コードテスト実行 — 純粋関数のみを制限付きサンドボックスで実行します。Cloudflare Workers は動的評価を禁止しているため、その環境では「テスト実行できません(ローカル/CIで実行が必要)」と正直に報告します。テスト合格を偽装しません。
- FX の成績 — 過去データの結果は将来の利益を保証しません。初期状態では実口座発注は無効です。
- 収益 — 実測収益は証拠(URL・記録)がない限り「実測」として記録できません。
ライセンス / 注意
本ソフトウェアは研究・個人利用を目的とします。投資助言ではありません。各サービスの利用規約と日本の法令を遵守してください。多重アカウントによる報酬獲得など、規約違反の手法は実装していません。
キャラクターアイコン(アップロード / 指示文で生成)
キャラクター設定画面から、アイコンを アップロード することも 指示文から生成 することもできます。
- 保存形式 — キャラクター行の
avatar_urlに data URL を1枚だけ保持します(オブジェクトストレージ不要、オフラインでも表示可)。画像はブラウザー側で 256px へ縮小してから 送るため、DBの行が肥大化せず、ダッシュボードの応答も数KB増で収まります。元画像は端末から送信されません。 - アップロード — 写真・スクリーンショットを選択 → 中央基準で256pxに切り出し →
POST /api/character/avatar。SVGだけはベクターのまま保存します(すでに約2KBのため)。 - 指示文で生成 —
POST /api/character/avatar/generateで生成し、プレビュー後にそのまま保存(avatar_source='generated')。指示文は日本語のままで構いません。AIプロバイダが使える場合は、画像モデルが最も忠実に再現できる英語プロンプトへ 書き換えてから 渡します(書き換えに失敗しても、元の指示文でそのまま生成します)。 - 生成エンジン(無料枠優先・自動フォールバック)
workersai—@cf/black-forest-labs/flux-1-schnell(Cloudflareへデプロイ時はAPIキー不要)gemini— Nano Banana 系画像モデル(GEMINI_API_KEYがあるとき)local— 指示文から決定的に描画するSVG。AI不使用・キー不要・失敗しない ため、キーが1本も無くても機能は止まりません(UI上も「ローカル生成(AI不使用)」と明示)
- 差し替え可能 —
IMAGE_MODEL_WORKERSAI/IMAGE_MODEL_GEMINIでモデルIDを変更できます(既定値はデプロイ先の無料枠で検証済みのもの)。 - 上限と検証 — 指示文400文字、保存するデータURL 400,000文字(≈300KB)、許可形式は PNG / JPEG / WebP / SVG。
<script>やonload=を含むSVGはunsafe_payloadとして拒否し、画像未指定時は名前のモノグラムを表示します。 - 記録 — 生成のたびに
ai_usageへrole='image'で記録されるので、無料枠の消費がログ画面で確認できます。 - スキーマ — 追加されたカラム(
avatar_url/avatar_source/avatar_prompt/avatar_model/avatar_updated_at)はensureSchema()の加算マイグレーションで自動適用されます。既存DBはそのまま動きます。
複数エージェントの同時実行(エージェント艦隊)
「エージェント」画面から、役割の違うエージェントを何体でも編成でき、1サイクルで同時に前進させられます。
- 1エージェント = 1つの担当ミッション。未割当ミッションは稼働中のエージェントが自動で引き受けます。この引き受けは
UPDATE … WHERE agent_id IS NULLの条件付き更新で行うため、同時実行中に2体が同じミッションを二重取りすることはありません。 - 進捗の保存単位は1ステップ。実測で、1サイクルの所要時間の大半はネットワーク待ち(例: 3.7秒のうち3.6秒)で、CPUはほとんど使いません。そのため Cloudflare Workers の無料枠(呼び出しあたりCPU 10ms)でも、待ち時間の長い処理を多数並行させる形でスループットを出せます。
- 上限で暴走を防ぐ —
FLEET_MAX_CONCURRENT(既定3体/サイクル)、FLEET_STEPS_PER_AGENT(既定1ステップ)。どちらも環境変数で変更できます。CPU使用率を見ながら上げてください。 - 監督(supervisor) — 遊んでいるエージェントに未割当ミッションを割り当て、必要なら1件だけ新しいミッションを起こします(無限に仕事を作りません)。
- 記録 —
missions.agent_id/tasks.agent_id/runs.agent_idで担当が追え、実行ログをエージェント別に絞れます。 - 停止の連鎖 — エンジン本体を停止すると、エージェントは全員止まります(暴走を防ぐため)。
画像生成の設定(画像設定)
「設定」画面の画像設定カードで以下を保存できます(サーバー側の settings.image:config に保存、指示文によるアイコン生成へ即反映)。
| 項目 | 内容 |
|---|---|
| エンジン有効/無効 | workersai / gemini / local を個別に切替。全て無効にすると all_engines_disabled を返し、黙って何もしない状態にはなりません |
| 既定の画風 | フラット / 線画 / アニメ調 / 写真調 / 3Dレンダー / ドット絵 |
| 保存サイズ | 128 / 256 / 384 / 512 px(それ以外は受理せず既定値を維持) |
| JPEG品質 | 0.5〜0.95 |
| 常時付ける指示 | 200字まで。既存プロンプトの後ろに付加 |
| モデルID | Workers AI・Gemini を個別に差し替え(空欄ならビルド時の既定値) |
GitHub へ公開する
このリポジトリは GitHub Actions(ci.yml)つきで初期化済みです。次の1コマンドで公開できます。
export GITHUB_TOKEN=ghp_... # fine-grained token(Contents: read/write)
scripts/publish-github.sh <owner>/<repo> main
DEPLOY.md には Cloudflare Workers + D1 へ本番デプロイする手順(wrangler login → D1作成 → secret登録 → wrangler deploy)をまとめています。