AWS Builder Center

AI-DLC Workflow V2のオーケストレーター: `/aidlc` の内側で何が起きているか

`/aidlc` と打ったあと、あの一連の流れって誰が仕切っているんだろう? この記事では、オーケストレーターを「コンダクター」と「決定論エンジン」の分業として解きほぐし、`next → 指令 → 実行 → report` というループがどう回るのかを見ていきましょう。シリーズ第24回。

Series: AI-DLC Workflow V2の解説 (31 articles)

  1. …
  2. 24
    AI-DLC Workflow V2のオーケストレーター: `/aidlc` の内側で何が起きているか This article
AWS Japan, Developer Specialist SA

1. はじめに

「オーケストレーター」と一言で言っても、実は1つの部品ではありません。/aidlc の司会役を務める生きた AI セッションと、その裏で routing を静かに決めている決定論的なエンジン。この2者に役割が分かれています。この記事では、その分業と、/aidlc を実行したときに内部を流れる制御の道筋を追っていきます。
この記事を読み終えると、次の2点が分かります。
  • コンダクターと決定論エンジンの分業、つまり「誰が何を決めるか」を自分の言葉で説明できる。
  • /aidlc を実行したとき内部で何が起きているか、next → 指令 → 実行 → report のループを追える。
読者としてはハーネス実装者やコントリビューター寄りの層を想定しています。抽象的な概念紹介ではなく、構造を追える深さで書いていきます。

2. オーケストレーターとは何か

オーケストレーターは、役割の異なる2者の分業として設計されています。
一方はコンダクター(/aidlc の司会役)です。これは実際に会話を進める生きた AI セッションで、エンジンが名指しした「その一手」の中で実行の品質に責任を持ちます。適切なペルソナを与える、良い質問をする、ステージの日誌(memory.md)を書く、矛盾を解消する、そして承認ゲートで判断を人間に差し出す、といった作業です。
もう一方は決定論エンジン(aidlc-orchestrate.ts)です。エンジンはステージ間の routing をすべて所有します。スコープの解決、フラグの優先順位、ステージの順序づけ、ゲートの状態、ワークフローの完了判定などです。コンダクターはこれらを散文で再導出しません。
ここで肝心なのは、エンジンが状態を一切変更しない点です。エンジンへの next 呼び出しは、ワークフローの状態とコンパイル済みステージグラフを読み取り、次に取るべき一手を**ちょうど1つの型付き指令(directive)**として標準出力に返すだけです。状態を変えるのはコンダクターが指令に従って動き、その結果を report で報告したときです。この報告の往復(round-trip)が状態遷移を確定させ、次の next が新鮮な状態を読めるようにします。
言い換えると、エンジンは「決める」役、コンダクターは「その決定の内側で上手にやる」役です。決定論エンジンは同じ入力に対して同じ指令を返すので、routing はハーネスをまたいで再現可能になります。

図1: コンダクター/エンジンの分業図

なお、図中の「人間 → 決定論エンジン」の矢印は、人間がエンジンを直接操作するという意味ではありません。人間が /aidlc を起動することがループの起点になり、その最初の next 呼び出し(実際に発行するのはコンダクター)がエンジンに届く、という起動のトリガーを表しています。

3. フォワーディングループ

コンダクターの制御構造は、/aidlc が呼ばれた瞬間から回り始める1つのループに尽きます。これをフォワーディングループ(forwarding loop)と呼びます。手順は次のとおりです。
  1. next を呼んで指令を1つ受け取る。
  2. 指令の kind(種類)が名指しする一手を実行する。
  3. ステージ作業の指令に対しては、実行後に report で結果を報告する。
  4. 指令の kind が done になるまで繰り返す。
要点を押さえておきます。各 next はちょうど1つの型付き指令を返し、それ自体は状態を変更しません。指令の kind が「次に取る唯一の一手」を名指しし、コンダクターがその一手を実行します。そして report が結果の遷移を確定させるので、次の next は新鮮な状態を読み取れます。この「報告してから次を読む」順序が、ループの各周回で状態が一貫することを保証します。
コマンドとしては、ループの各ステップは次のように実行されます。
1
2
bun .kiro/tools/aidlc-orchestrate.ts next
bun .kiro/tools/aidlc-orchestrate.ts report --stage <スラッグ> --result <outcome> --user-input "<回答>"
なお load-steering の指令だけは例外で、これは「ステージ作業」ではなく rule を運ぶための転送(transport)です。受け取ったら report せず、continue で即座に継続します。

図2: フォワーディングループのフロー図


4. 指令の種類

指令は kind という判別子(discriminator)を持ち、その種類が必要とするフィールドだけを載せた型付きのオブジェクトです。
ここで事実関係を正確に区別しておきます。指令の型を定める契約ファイル .kiro/tools/aidlc-directive.ts の DirectiveKind は10種類を定義しています。一方、オーケストレーター aidlc-orchestrate.ts が next 経路で実際に発行するのは8種類です。残りの dispatch-subagent と present-gate は、ループの形を完全に保つための文書化されたプレースホルダで、今日のエンジンは発行しません。したがって「指令は全部で8種類」ではなく、「実行時に発行=8種類、契約上の定義=10種類」という関係になります。
以下の表は、エンジンが今日発行する8種類の一行の意味です。
指令の kind一行の意味
load-steeringアクティブなステージの rule バンドルを分割して運ぶ転送。適用して即 continue する(report しない)。
run-stage解決済みの rule・ペルソナ・consumes を読み込み、ステージ本体を実行し、produces を書く。承認の要否は gate フィールドに畳み込まれている。
invoke-swarm自律付与下で条件を満たす Construction バッチを、並列ワーカーへ fan-out する。
ask特定の構造化質問を提示する。多くは report で回答を返し、new-work-routing の亜種だけは next へ回答を回す。
printmessage を指示どおりに扱う。terminal / run-then-continue / run-then-stop の3形がある。
errormessage をそのまま提示してループを止める。回復や再試行はしない。
doneワークフロー(または単一ステージ実行)の完了。完了サマリを提示してループを止める。
parkedワークフローがステージ境界で意図的に中断された。再開方法(/aidlc --resume)を伝えて止める。
指令の実際の形は、次のように kind ごとに必要なフィールドだけを持ちます。run-stage の代表的な形は次のとおりです(フィールドは抜粋)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"kind": "run-stage",
"stage": "domain-design",
"phase": "inception",
"lead_agent": "aidlc-architect-agent",
"support_agents": ["aidlc-aws-platform-agent", "aidlc-design-agent"],
"mode": "inline",
"gate": true,
"memory_path": "aidlc-docs/inception/domain-design/memory.md",
"consumes": ["aidlc-docs/inception/requirements/requirements.md"],
"produces": ["aidlc-docs/inception/domain-design/components.md"],
"stage_file": ".kiro/aidlc-common/stages/inception/domain-design.md",
"next_stage": "Units Generation"
}
ask は質問文を運ぶだけの単純な形です。
1
2
3
4
{
"kind": "ask",
"question": "Resume from the last checkpoint, or start fresh?"
}
done はループを止める理由を載せます。
1
2
3
4
{
"kind": "done",
"reason": "Workflow complete — all in-scope stages approved."
}
コンダクターはこれらを標準出力から受け取り、kind を読んで対応する一手だけを行います。指令が壊れていたり実行できない一手を名指ししたりしていれば、その旨を率直に伝えて止めます。routing を散文で改変することはしません。

5. ステージ実行の中身

run-stage の指令を受け取ったあと、コンダクターがステージ内部で行う流れは、おおむね「ロード → ステージ本体 → レビュー → 承認ゲート」の順になります。
まずロードです。run-stage の直前には load-steering の列が届き、アクティブなステージの rule バンドルを順に運びます。コンダクターは rules_content を配列順に適用し、continue で継続します。run-stage を受け取ったら、inline_context_paths の各パス(lead と support のペルソナなど)と stage_file、consumes を読み込み、memory_path の日誌を初期化します。
次にステージ本体を走らせます。どう走らせるかは mode フィールドが決めます。inline(このセッション内で lead ペルソナをまとって実行)、subagent(別のエージェントへ委譲)、pipeline(連鎖)、mob(並列の合議)などの通信トポロジです。ステージが質問を持つ場合は、成果物を書く前に質問チェックポイントを通します。
続いてレビューです。指令が reviewer を持つ場合は、ステージ本体の完了後にレビュアーを別のサブエージェントとして呼び出します(stage-protocol の §12a)。review_class が adversarial なら成果物への反証を試みる修正ループが回り、advisory なら1パスで所見を承認ゲートへそのまま渡します。レビュアーの検証記録は監査台帳(REVIEW_REQUESTED / REVIEW_COMPLETED)に残ります。
最後が承認ゲートです。gate: true のステージでは、学びの儀式(§13)を経てから承認ゲートを構造化質問(Approve / Request Changes)として提示します。ゲートはターンをそこで止め、人間の判断を待ちます。人間が Approve すれば report --result approved、Request Changes なら report --result rejected から修正ループに入り report --result revised を経て再提示します。ゲートが「人間のためにターンを止める」点が、AI-DLC がユーザーの制御を保つ要になっています。
なお gate: false の初期化ステージは Q&A なしで直接完了し、承認や学びの儀式は走りません。

図3: ステージ実行のシーケンス図

ロードから承認までの流れを、コンダクター / エンジン / レビュアー / 人間の間で示します。

6. まとめ

この記事では、オーケストレーターを2つの視点から見てきました。
1つ目は、コンダクターと決定論エンジンの分業です。エンジン(aidlc-orchestrate.ts)はステージ間の routing をすべて所有し、状態を変更せずに next ごとに型付き指令を1つ返します。コンダクター(/aidlc の司会役)は、その指令が名指しした一手の内側で実行の品質に責任を持ち、動いた結果を report で報告します。「誰が何を決めるか」の切り分けが、この分業の核心です。
2つ目は、/aidlc 実行時に内部を流れる制御の道筋、フォワーディングループです。next → 指令 → 実行 → report を done まで繰り返し、report の往復が遷移を確定させて次の next が新鮮な状態を読みます。指令の種類は、実行時に発行される8種類(load-steering / run-stage / invoke-swarm / ask / print / error / done / parked)と、契約上定義される10種類(8種類+未発行の dispatch-subagent / present-gate)という関係で理解できます。
この2点を押さえておけば、次に /aidlc を実行したとき、画面の裏でどんなループが回り、どこで判断が人間に差し出されるのかを追えるはずです。

Series: AI-DLC Workflow V2の解説 (31 articles)

  1. …
  2. 24
    AI-DLC Workflow V2のオーケストレーター: `/aidlc` の内側で何が起きているか This article
Any opinions in this article are those of the individual author and may not reflect the opinions of AWS.
Enjoyed reading this content? Let the author know!

Your likes, comments, shares, and saves help creators reach more builders.

Loading recommendations

Loading article