自己改善システム
SelfImprovementDaemon · Tier1/2 · CodeAgentLoop · Nightly maintenance
このページでわかること
シャノンはタスク失敗をエピソードとして蓄積し、条件が揃うとバックグラウンドで失敗パターンの分析と改善案の生成・適用を行います。 さらにマインクラフト用の JSON 自己テスト、ゲーム内から叩けるコーディングエージェント、夜間バッチ(レポート保存が主・高コスト処理は opt-in)が同じ系統のサブシステムとして動きます。
実装の中心は Shannon バックエンド(Node.js)の backend/src/services/llm/graph/cognitive/selfImprove/ 配下です。公開サイトのコードではなく、ボット稼働サーバー上のリポジトリが対象になります。
リアクタイム(失敗駆動)の流れ
タスク完了時に ParallelExecutor から SelfImprovementDaemon.onEpisodeSaved が呼ばれます。
- 成功したエピソードは失敗バッファに入れない。効果測定(EffectivenessTracker)やプロアクティブなスキル発想(SkillIdeator)には使われる。
- 失敗は
FailureRecordとしてバッファに追加(上限で古いものから捨てる)。 - トリガー条件(例: バッファが一定件数以上、クールダウン経過、1 時間あたり実行上限内、メタ認知シグナルや同一失敗タイプの繰り返しなど)を満たすと、非同期で
executeImprovementが走る。 - FailureAnalyzer がクラスタ化・要約し、ImprovementGenerator が Tier1 ルール案または Tier2 コード案を出す。
- ImprovementApplier が適用: Tier1 は JSON 追記、Tier2 は mutable ポリシーと検証を通したうえでファイル更新または pending。
Tier 1 と Tier 2 の違い
Tier 1
プロンプト/Forward Model ルール
JSON(self_improvement_rules.json)に動的ルールを追加。ホットリロードで認知パイプラインに反映。
コスト: 比較的軽い(分析・生成で LLM 利用)
リスク: ルールの質次第。コードは書き換えない。
Tier 2
コード変更(mutable 範囲内)
失敗クラスタに対し、対象ファイルへのパッチ案を生成。CodeValidator で検証後に適用または保留。
コスト: 生成・検証で LLM / ビルドコストあり
リスク: 誤った差分のリスク。delete は SELF_IMPROVE_ALLOW_DELETE=true のときのみ。
コードを触ってよい範囲(mutableCodePolicy)
原則として backend パッケージ直下のソースは編集候補になり得ますが、次のようなパスは変更禁止または対象外です。
禁止・スキップの例
- src/config/
- package.json
- 各種 lock ファイル
- tsconfig*
- .env
- node_modules / dist / .git / coverage
Tier2 のプロンプト設計では src/services/minebot/ や src/services/llm/ が優先されやすい、という運用目安があります。
CodeAgentLoop(コーディングエージェント)
Anthropic SDK を用いた ReAct 型ループです。モデル構成はコード上で Opus / Sonnet 系が使い分けられます。 ファイル探索・差分適用・run_tsc などで、人間のコーディングエージェントに近いツール群を持ちます。
主なツール(概略)
- read_file / edit_file / create_file / delete_file
- search_code / glob_files / semantic_search
- web_search / web_fetch
- shell_exec / run_tsc / run_vitest / read_lints
- task_plan / task_update
- spawn_agent / check_agent(サブエージェント)
- finish
マインクラ内から: ..agent-fix <説明> で、説明に基づき CodeAgentLoop が起動します(Minebot のチャットコマンド経由)。
Tier2 の適用経路でも ImprovementApplier.applyWithAgent から同じループを呼べます。
マイクラ自己テストと SkillPatcher
SelfTestRunner が saves/minecraft/self_test_cases/*.json のスイートを実行します。失敗時、オプションで SkillPatcher がスキルコードを読み、LLM で修正を試みて再テストする PDCA になります。
チャットから: ..test-all / ..test-smoke / ..test <suite> [--fix]
自然言語やパスに self_test_cases を含む文でも同ランナーが起動する意図検知があります。ゴール形式のテスト(chain / goal モード)も自己改善ラインと連携し得ます。
夜間メンテナンス(Nightly)
SELF_IMPROVE_NIGHTLY_ENABLED=true のとき、サーバ起動中に 1 分おきの tick で UTC 指定の窓内かつ「その UTC 日で未実行」なら runNightlyMaintenance が 1 回走ります。 既定では高コストな LLM 処理はスキップされ、レポートに「スキップ」と理由が並ぶ動きがベースです(課金抑制設計)。
SELF_IMPROVE_NIGHTLY_RUN_REACTIVE=true
失敗エピソードバッファがあれば、分析→改善パイプラインを 1 回実行(LLM を複数回消費)。既定はオフ。
SELF_IMPROVE_NIGHTLY_MINECRAFT_SUITES=...
カンマ区切りでスイート名を指定(例: smoke-skills)。ボット接続時のみ実行。SELF_IMPROVE_NIGHTLY_MINECRAFT_AUTOFIX で失敗時 SkillPatcher(追加 LLM)。
SELF_IMPROVE_NIGHTLY_CODE_AGENT=true
Anthropic API で CodeAgentLoop を実行。ANTHROPIC_API_KEY 必須。SELF_IMPROVE_NIGHTLY_CODE_AGENT_TASK / MAX_ITER で指示・深さ調整。
主な環境変数(抜粋)
| SELF_IMPROVE_AUTO_APPLY_TIER2 | true なら Tier2 が検証通過後に即ファイル反映。false は pending_review 中心。--dev / IS_DEV でも有効になり得る。 |
| SELF_IMPROVE_ALLOW_DELETE | true のときのみ Tier2 の delete を許可(本番では原則オフ)。 |
| SELF_IMPROVE_NIGHTLY_ENABLED | true で夜間スケジューラ起動(1 日 1 回・UTC 日付で重複防止)。 |
| SELF_IMPROVE_NIGHTLY_HOUR_UTC / MINUTE_UTC | 実行目安時刻(既定 3:00 UTC)。 |
| SELF_IMPROVE_NIGHTLY_WINDOW_MINUTES | その時刻±の分幅内で最初の tick で発火(既定 15)。 |
| SELF_IMPROVE_MORNING_WEBHOOK_URL | 任意。夜間レポート Markdown を JSON body { content } で POST(Discord Incoming Webhook 等)。 |
レポートの保存先
backend/saves/self_improve/morning_reports/にタイムスタンプ付きの *_nightly.json と *_nightly.md が書き出されます。
SELF_IMPROVE_MORNING_WEBHOOK_URL を設定すると、同じ Markdown を要約投稿先(Discord Incoming Webhook 等)へ POST できます(長い場合は切り詰め)。

失敗から学び、コードとルールを更新し続ける仕組み