Graph スキル
宣言的なJSON記述子から決定論的なオーケストレーショングラフを実行します。
このランタイムは、src/graph/* 内の sealed-descriptor および pure-scheduler コントラクトを消費し、独立したOSプロセス (omc graph run) を通じて実行されるため、クラッシュリカバリ(実行中の強制終了、再実行、ジャーナルからの再開)が実際に機能します。
使用方法
/oh-my-claudecode:graph <descriptor.json>
/oh-my-claudecode:graph "build then test then ask me before deploy" (最初に記述子を作成してください)
実行インターフェースは常にCLIサブコマンドです:
omc graph run <descriptor.json> [--runs-root <dir>]
非対話型グラフの場合は Bash ツールを介して実行します。進捗状況は [run]、[node]、[ok]、[fail]、[join]、[done] としてストリーム出力されます。
使用すべき場合
- 明示的な依存関係を持つ反復可能なマルチステップパイプライン (DAG)
- 中断に耐えなければならない処理:強制終了/再起動はジャーナルから再開します
- 監査可能な実行:
.omc/graph-runs/<run_id>/下の OCC ジャーナル + プロジェクションスナップショット
使用すべきでない場合:探索的な単発作業(会話または /team を使用);実行中に適応的な再計画が必要なもの(グラフは決定論的です)。
ワークフロー
-
記述子が指定された場合 -> ステップ3に進みます。
-
パイプラインが記述された場合 -> 記述子JSON(スキーマは以下)を作成し、プロジェクトの隣(
.omc/graphs/<name>.jsonを推奨)に書き込み、実行前にユーザーに表示します。run_idは論理パイプラインごとに一意である必要があります。同じrun_idで再実行すると再開され、再起動はされません。 -
承認ノード:記述子に
"kind": "human-approval"ノードが含まれている場合は、Bash ツールで実行しないでください(標準入力が対話的でなく、EOF は拒否として閉じます)。代わりに、ユーザーに対話的に実行するように指示してください:! omc graph run <file>!プレフィックスは、このセッション内でライブ標準入力を使って実行するため、y/n が機能します。 -
実行して進捗を中継します。終了コード(標準): 0 成功 | 1 致命的な失敗 | 19 別のライターがこの実行を所有しています(ビジー) 20 破損/改ざんされたジャーナル(フェイルクローズ)| 21 再開時に記述子のずれが発生 | 70 ランタイムクラッシュ(未マップのエラー)
-
再開:クラッシュ後に同じコマンドを再実行すると、コミットされた遷移が再生され、続行されます。完了したノードは決して再実行されません。
記述子スキーマ(最小限)
{
"descriptor_version": 1,
"run_id": "unique-pipeline-id",
"revision_id": "rev-1",
"goal": "one line",
"nodes": [
{ "id": "n1", "kind": "command", "title": "...", "timeout_ms": 60000,
"max_attempts": 2, "effect_policy": { "policy": "side_effect_free" },
"command": "npm test" },
{ "id": "a1", "kind": "agent", "title": "...", "timeout_ms": 300000,
"max_attempts": 1, "effect_policy": { "policy": "side_effect_free" },
"instructions": "..." },
{ "id": "gate", "kind": "human-approval", "title": "...",
"prompt": "Proceed?" }
],
"edges": [ { "id": "e1", "kind": "fixed", "from": "n1", "to": "a1" } ],
"entry_node_ids": ["n1"],
"concurrency_limit": 2,
"terminal_verification_node_id": "a1"
}
エッジの種類: fixed | conditional | fan_out/join ペア
| back_edge (max_traversals による制限付き再試行)。決定版の Zod スキーマについては src/graph/schema.ts を参照してください。また、上記の「機能境界」セクションを読んで、今日実際に実行できる組み込みエグゼキュータを確認してください。
機能境界とセマンティクス(作成前に読んでください)
- エッジサポート: 組み込みの command/agent エグゼキュータは
fixedエッジとfan_out/joinペアをカバーします。conditionalエッジとback_edgeルートはランタイムとスケジューラコントラクトで完全にサポートされていますが、結果にrouteを出力するカスタム NodeExecutor が必要です。組み込みエグゼキュータはルートを生成しないため、それらに依存するグラフは推測する代わりにroute_requiredで即座に失敗します。 - クラッシュリカバリの保証は、コマンドノードに対して 少なくとも1回の実行です。外部の副作用とそのジャーナル追記の間にクラッシュが発生すると、再開時にそのノードが再実行されます。
idempotentコマンドの場合、解決されたキーは開始前にGRAPH_IDEMPOTENCY_KEYとしてコマンドに利用可能になり、後続の重複排除のために記録されます。組み込みエグゼキュータはreconcileを拒否します。調整には、実際の外部調整機関を持つカスタムエグゼキュータが必要です。外部副作用に対する正確に1回の実行は v1 の範囲外です。 - コマンド信頼境界: コマンドノードは、カレントワーキングディレクトリ内でプロセス権限を持つ任意のシェル行です。自分で作成した、または信頼する記述子のみを実行してください。コマンド子プロセスは、許可リストに登録された環境(PATH、HOME/USERPROFILE、TEMP/TMP、ロケール/タイムゾーン、USER 識別子、
GRAPH_*、およびオプションの冪等性キー)を受け取ります。ホストの完全なシークレットは受け取りません。コマンドはファイルシステム/プロセスサンドボックス化されていません。 - エージェント権限境界: 組み込みのエージェントノードは明示的に読み取り専用です。カレントワーキングディレクトリで実行され、追加のディレクトリはなく、
Read、Glob、Grepのみ、permissionMode: dontAsk、セッションパーシスタンスは無効、プロバイダ固有の環境許可リストが使用されます。エージェントのタイムアウトは SDK クエリを中断します。変更や外部効果が必要なエージェントにはカスタムエグゼキュータを使用してください。.omc/graph-runs/<run_id>/descriptor.jsonを実行可能コンテンツとして扱ってください。