半自動トポロジー進化(D5、human-gated)
DuDuClaw の自律進化(GVU / AEE。v3 以降はデフォルトで AEE playbook エントリを
使い、SOUL.md 全体を書き換える方式ではなくなっています。詳細は
docs/architecture/evolution-engine.md の第 12 章を参照)が最適化するのは
「ノード」、つまり各 agent の prompt / 振る舞いルールだけです。agent 間の
「エッジ」、すなわち reports_to 階層があるタスククラスを誰にルーティングする
かは、これまでずっとハードコードされてきました。D5 はこのエッジを進化可能な
対象に変えますが、変更のたびに必ず人間の承認を通す必要があり、機械が担当する
のは提案と証拠収集だけです。
設計の系譜:GPTSwarm(arXiv:2402.16823、トポロジーを学習可能なオブジェクトとして 扱う)、AFlow(2410.10762)、ADAS(2408.08435。制御フローの完全自動書き換えは runaway リスクが最も高い能力であり、D5 が意図的に完全自動化を避けている理由でも ある)。
デフォルトは無効です。この仕組み全体は
config.tomlで[topology_evolution] enabled = trueを設定した場合にのみ動作します。無効時の 派工パスは、純粋なFixedHierarchyと完全に同一(byte-identical)です。
-
証拠分析(純粋関数、単体テスト可能) バックグラウンドドライバーが
tick_secsごとに task store をスキャンし、直近lookback_days日間の各(agent, task_class)の品質シグナルを集計します: MAV/review の却下率、needs_human へのエスカレーション率、goal-loop の 無進捗(oscillation)回数。task_classはタスクの最初の tag を採用し(D4 の RoundRobin と同じ基準)、tag がない場合は priority にフォールバックします。 サンプルの母集団は「確定済みの goal-mode タスク」(状態が done / needs_human / failed)で、needs_human・failed、またはretry_count > 0はそれぞれ 1 回の 却下としてカウントされます。 -
提案(直接の変更ではない) あるタスククラスについて、あるエージェントのサンプル数が
min_samples以上 かつ却下率がreject_rate_threshold以上であり、同じreports_to親の下にいる sibling の誰かが同じタスククラスをより良くこなしている(却下率が低く、 サンプル数も十分にある)場合、ドライバーは 1 件のreroute提案を生成し、 証拠(サンプル数、却下率、最大 10 件の sample task id)を添付します。条件を 満たす sibling がいなければ提案は行いません。空の結果は偽の結果に勝るから です。1 tick あたり最大 1 件の提案。 -
人間のゲート(迂回不可) すべての提案は
ApprovalBroker(action_kind = "topology_reroute")を経由 します。これは ActionGuard の意味論では always-human に相当し、LLM judge は介在せず、autonomy_levelによる緩和も受けません。コード上はrequest+pollしか呼ばれず、自動承認の経路は一切存在しません。TTL 切れ は DENY として扱われます(broker は fail-closed)。人間は dashboard のapprovals.decideまたはチャンネルのボタンで承認・却下できます。 -
反映と観察期間 承認されると
~/.duduclaw/routing_overrides.jsonに書き込まれます (advisory lock + アトミックな temp/rename)。FixedHierarchyは派工時に まず active な override を確認し、(task_class, from_agent)に一致すればto_agentに振り替えます。override ファイルが存在しない、または壊れている 場合は常に override なしとみなされ、ルーティングは現状に戻ります (fail-safe)。反映後はobserve_hours(デフォルト 24h)の観察期間に入ります。 -
自動ロールバック 観察期間中に
to_agentの当該タスククラスにおける却下率がfrom_agentの 過去の基準値以上になった場合、override は直ちにrolled_backとなり、 ルーティングは自動的に元に戻ります。観察期間を通過し、実際に基準値を上回ればconfirmedになります。サンプル不足の場合は観察期間を 1 回だけ延長し、それ でも不足していればrolled_backになります(保守的な収束)。 -
提案の乱発防止 同一の
(task_class, from_agent)はproposal_cooldown_days(デフォルト 7 日)以内では最大 1 件しか提案できません(却下されたものを含む)。これは override ファイルの proposal log に記録されます。active な override や pending の提案がすでにある場合も重複提案はされません。dispatch_guardの スライディングウィンドウも通常どおり適用され、D5 によって迂回されることは ありません。
すべての提案/承認/ロールバック/確認は events.db のイベントと dashboard の
Activity Feed に書き込まれます(topology.proposed / topology.approved /
topology.rejected / topology.rolled_back / topology.confirmed /
topology.extended)。
[topology_evolution]enabled = false # 主スイッチ、デフォルトは無効lookback_days = 14 # 証拠の遡及ウィンドウ(日)min_samples = 5 # (agent, task_class) セルに必要な確定済みサンプルの最小数reject_rate_threshold = 0.6 # 提案をトリガーする却下率の閾値observe_hours = 24 # 承認後の観察期間(時間)proposal_cooldown_days = 7 # 同一エッジの提案クールダウン日数tick_secs = 3600 # ドライバーの tick 周期(秒)approval_ttl_secs = 86400 # reroute 承認の TTL(秒)、期限切れ=却下Dashboard RPC
Section titled “Dashboard RPC”topology.list(require_manager)は、現在の routing overrides と pending の
reroute 提案を返し、dashboard が D5 の状態を表示するために使います。承認/却下
は既存の approvals.list / approvals.decide をそのまま利用します。
リスクと境界
Section titled “リスクと境界”- デフォルトで無効であり、起動には
ApprovalBrokerが利用可能である必要が あります。利用できない場合 D5 は起動しません(人間のゲートを持たない提案 メカニズムの存在は許容されません)。 - 機械が行うのは可逆な操作(提案、観察、ロールバック)のみで、不可逆な操作 (実際にルートを変更すること)は常に人間の判断に委ねられます。
- D5 はデフォルトの
FixedHierarchy階層ルーティングの上にのみ重なります。 オペレーターが明示的にRoundRobin/LlmSelect([dispatch] policy)を 選んでいる場合、それは意図的なルーティング選択であり、D5 の override は そのポリシーの roster が空になって hierarchy にフォールバックしたときにしか 効きません。 - override はルーティング層の変更であり、実行中のタスクに遡って適用される ことはありません。すでに振り分けられた in-flight のタスクは元のルートのまま 進み、新しいルート(またはロールバック)は今後の派工にのみ適用されます。
opus-playbook の観察期間規律に従い、D5 は D1–D4 が安定し、eval のサンプル数が 十分に集まってから有効化すべきです。