Summary
Add a DAG orchestration extension: ContextGraphBuilder + ExecuteGraphAsync to declare task dependencies and let the library derive which tasks can run in parallel and which must wait for predecessors.
Goal
Orchestrate many context-scoped tasks with declared dependencies, computing parallelism automatically — as an Extension, not part of Core.
Problem
For fan-out/fan-in flows (fetch → validate → save), manual Task.WhenAll ordering is brittle. There is no declarative dependency model.
Scope
var graph = new ContextGraphBuilder<ShopContext>()
.AddNode("fetch_order", () => FetchOrder(id))
.AddNode("fetch_customer", () => FetchCustomer(id))
.AddNode("validate", ValidateOrder, dependsOn: new[] { "fetch_order", "fetch_customer" })
.Build();
await manager.ExecuteGraphAsync(ctx, graph);
Design Expectations
- Kept minimal; lives at the Extension level (per Core-minimal-primitive rule).
- No core runtime changes; orchestration runs topologically over base primitives.
Acceptance Criteria
Non-Goals
- No workflow-engine features (state, persistence, retry / Polly).
- No multi-process/queue orchestration (adapter-level).
Summary
Add a DAG orchestration extension:
ContextGraphBuilder+ExecuteGraphAsyncto declare task dependencies and let the library derive which tasks can run in parallel and which must wait for predecessors.Goal
Orchestrate many context-scoped tasks with declared dependencies, computing parallelism automatically — as an Extension, not part of Core.
Problem
For fan-out/fan-in flows (fetch → validate → save), manual
Task.WhenAllordering is brittle. There is no declarative dependency model.Scope
dependsOnedges.Design Expectations
Acceptance Criteria
Non-Goals