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.Policy.slnx b/BuildingBlock.Policy.slnx
new file mode 100644
index 0000000..0e00073
--- /dev/null
+++ b/BuildingBlock.Policy.slnx
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..bfa3664
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,10 @@
+
+
+ AgileWebs
+ AgileWebs
+ git
+ http://192.168.68.156:3000/AgileWebs/building-block-policy
+ http://192.168.68.156:3000/AgileWebs/building-block-policy
+ false
+
+
diff --git a/src/BuildingBlock.Policy.Contracts/Abstractions/IPolicyCapabilityContract.cs b/src/BuildingBlock.Policy.Contracts/Abstractions/IPolicyCapabilityContract.cs
new file mode 100644
index 0000000..71aea78
--- /dev/null
+++ b/src/BuildingBlock.Policy.Contracts/Abstractions/IPolicyCapabilityContract.cs
@@ -0,0 +1,11 @@
+using BuildingBlock.Policy.Contracts.Requests;
+using BuildingBlock.Policy.Contracts.Responses;
+
+namespace BuildingBlock.Policy.Contracts.Abstractions;
+
+public interface IPolicyCapabilityContract
+{
+ Task EvaluatePolicyAsync(
+ EvaluatePolicyRequest request,
+ CancellationToken cancellationToken);
+}
diff --git a/src/BuildingBlock.Policy.Contracts/BuildingBlock.Policy.Contracts.csproj b/src/BuildingBlock.Policy.Contracts/BuildingBlock.Policy.Contracts.csproj
new file mode 100644
index 0000000..b760144
--- /dev/null
+++ b/src/BuildingBlock.Policy.Contracts/BuildingBlock.Policy.Contracts.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net10.0
+ enable
+ enable
+
+
+
diff --git a/src/BuildingBlock.Policy.Contracts/Contracts/PolicyFactContract.cs b/src/BuildingBlock.Policy.Contracts/Contracts/PolicyFactContract.cs
new file mode 100644
index 0000000..665b4f5
--- /dev/null
+++ b/src/BuildingBlock.Policy.Contracts/Contracts/PolicyFactContract.cs
@@ -0,0 +1,3 @@
+namespace BuildingBlock.Policy.Contracts.Contracts;
+
+public sealed record PolicyFactContract(string Key, string Value);
diff --git a/src/BuildingBlock.Policy.Contracts/Contracts/PolicyOutcome.cs b/src/BuildingBlock.Policy.Contracts/Contracts/PolicyOutcome.cs
new file mode 100644
index 0000000..36804a5
--- /dev/null
+++ b/src/BuildingBlock.Policy.Contracts/Contracts/PolicyOutcome.cs
@@ -0,0 +1,8 @@
+namespace BuildingBlock.Policy.Contracts.Contracts;
+
+public enum PolicyOutcome
+{
+ Allowed = 0,
+ Denied = 1,
+ RequiresApproval = 2
+}
diff --git a/src/BuildingBlock.Policy.Contracts/Requests/EvaluatePolicyRequest.cs b/src/BuildingBlock.Policy.Contracts/Requests/EvaluatePolicyRequest.cs
new file mode 100644
index 0000000..dc9578b
--- /dev/null
+++ b/src/BuildingBlock.Policy.Contracts/Requests/EvaluatePolicyRequest.cs
@@ -0,0 +1,8 @@
+using BuildingBlock.Policy.Contracts.Contracts;
+
+namespace BuildingBlock.Policy.Contracts.Requests;
+
+public sealed record EvaluatePolicyRequest(
+ string PolicyName,
+ IReadOnlyCollection Facts,
+ DateTime EvaluationAtUtc);
diff --git a/src/BuildingBlock.Policy.Contracts/Responses/EvaluatePolicyResponse.cs b/src/BuildingBlock.Policy.Contracts/Responses/EvaluatePolicyResponse.cs
new file mode 100644
index 0000000..62d7fd9
--- /dev/null
+++ b/src/BuildingBlock.Policy.Contracts/Responses/EvaluatePolicyResponse.cs
@@ -0,0 +1,8 @@
+using BuildingBlock.Policy.Contracts.Contracts;
+
+namespace BuildingBlock.Policy.Contracts.Responses;
+
+public sealed record EvaluatePolicyResponse(
+ PolicyOutcome Outcome,
+ string Explanation,
+ IReadOnlyCollection AppliedRules);