diff --git a/.gitignore b/.gitignore
index 31c7257..b299ff1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
.tasks/
.agile/
+**/bin/
+**/obj/
diff --git a/BuildingBlock.Dispatch.slnx b/BuildingBlock.Dispatch.slnx
new file mode 100644
index 0000000..1893428
--- /dev/null
+++ b/BuildingBlock.Dispatch.slnx
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..fcb3a65
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,10 @@
+
+
+ AgileWebs
+ AgileWebs
+ git
+ http://192.168.68.156:3000/AgileWebs/building-block-dispatch
+ http://192.168.68.156:3000/AgileWebs/building-block-dispatch
+ false
+
+
diff --git a/src/BuildingBlock.Dispatch.Contracts/Abstractions/IDispatchCapabilityContract.cs b/src/BuildingBlock.Dispatch.Contracts/Abstractions/IDispatchCapabilityContract.cs
new file mode 100644
index 0000000..1e58fac
--- /dev/null
+++ b/src/BuildingBlock.Dispatch.Contracts/Abstractions/IDispatchCapabilityContract.cs
@@ -0,0 +1,11 @@
+using BuildingBlock.Dispatch.Contracts.Requests;
+using BuildingBlock.Dispatch.Contracts.Responses;
+
+namespace BuildingBlock.Dispatch.Contracts.Abstractions;
+
+public interface IDispatchCapabilityContract
+{
+ Task EvaluateDispatchAsync(
+ EvaluateDispatchRequest request,
+ CancellationToken cancellationToken);
+}
diff --git a/src/BuildingBlock.Dispatch.Contracts/BuildingBlock.Dispatch.Contracts.csproj b/src/BuildingBlock.Dispatch.Contracts/BuildingBlock.Dispatch.Contracts.csproj
new file mode 100644
index 0000000..b760144
--- /dev/null
+++ b/src/BuildingBlock.Dispatch.Contracts/BuildingBlock.Dispatch.Contracts.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net10.0
+ enable
+ enable
+
+
+
diff --git a/src/BuildingBlock.Dispatch.Contracts/Contracts/DispatchCandidateContract.cs b/src/BuildingBlock.Dispatch.Contracts/Contracts/DispatchCandidateContract.cs
new file mode 100644
index 0000000..d295cd4
--- /dev/null
+++ b/src/BuildingBlock.Dispatch.Contracts/Contracts/DispatchCandidateContract.cs
@@ -0,0 +1,7 @@
+namespace BuildingBlock.Dispatch.Contracts.Contracts;
+
+public sealed record DispatchCandidateContract(
+ string WorkItemId,
+ string QueueName,
+ DispatchPriority Priority,
+ DateTime DeadlineUtc);
diff --git a/src/BuildingBlock.Dispatch.Contracts/Contracts/DispatchPriority.cs b/src/BuildingBlock.Dispatch.Contracts/Contracts/DispatchPriority.cs
new file mode 100644
index 0000000..d7114a5
--- /dev/null
+++ b/src/BuildingBlock.Dispatch.Contracts/Contracts/DispatchPriority.cs
@@ -0,0 +1,9 @@
+namespace BuildingBlock.Dispatch.Contracts.Contracts;
+
+public enum DispatchPriority
+{
+ Low = 0,
+ Normal = 1,
+ High = 2,
+ Critical = 3
+}
diff --git a/src/BuildingBlock.Dispatch.Contracts/Requests/EvaluateDispatchRequest.cs b/src/BuildingBlock.Dispatch.Contracts/Requests/EvaluateDispatchRequest.cs
new file mode 100644
index 0000000..a7a5208
--- /dev/null
+++ b/src/BuildingBlock.Dispatch.Contracts/Requests/EvaluateDispatchRequest.cs
@@ -0,0 +1,8 @@
+using BuildingBlock.Dispatch.Contracts.Contracts;
+
+namespace BuildingBlock.Dispatch.Contracts.Requests;
+
+public sealed record EvaluateDispatchRequest(
+ string DispatchContext,
+ IReadOnlyCollection Candidates,
+ int AvailableCapacity);
diff --git a/src/BuildingBlock.Dispatch.Contracts/Responses/EvaluateDispatchResponse.cs b/src/BuildingBlock.Dispatch.Contracts/Responses/EvaluateDispatchResponse.cs
new file mode 100644
index 0000000..eb2133e
--- /dev/null
+++ b/src/BuildingBlock.Dispatch.Contracts/Responses/EvaluateDispatchResponse.cs
@@ -0,0 +1,6 @@
+namespace BuildingBlock.Dispatch.Contracts.Responses;
+
+public sealed record EvaluateDispatchResponse(
+ IReadOnlyCollection SelectedWorkItemIds,
+ IReadOnlyCollection DeferredWorkItemIds,
+ string SelectionReason);