Skip to content

Commit f056c2d

Browse files
committed
docs(examples): refresh governance queries example
1 parent 1df7609 commit f056c2d

6 files changed

Lines changed: 143 additions & 55 deletions

File tree

‎Examples/Governance/DecisionTaxonomy/Scenarios/GovernanceDecisionTaxonomyScenario.cs‎

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,40 +8,49 @@ internal static class GovernanceDecisionTaxonomyScenario
88
public static void Run()
99
{
1010
PrintSection("Lifecycle Decisions");
11-
PrintDecision(MutationRequestDecision.Create(
12-
MutationRequestDecisionType.Lifecycle(MutationRequestLifecycleDecisionType.Submitted),
11+
12+
PrintDecision(MutationRequestDecision.Lifecycle(
13+
MutationRequestLifecycleDecisionType.Submitted,
1314
MutationContext.User("requester", "Requester", "Submit request"),
1415
reason: "Request was submitted into governance."));
15-
PrintDecision(MutationRequestDecision.Create(
16-
MutationRequestDecisionType.Lifecycle(MutationRequestLifecycleDecisionType.Approved),
16+
17+
PrintDecision(MutationRequestDecision.Lifecycle(
18+
MutationRequestLifecycleDecisionType.Approved,
1719
MutationContext.User("system", "System", "Request reached executable state"),
1820
reason: "Request is now approved for execution."));
1921

22+
2023
PrintSection("Approval Decisions");
21-
PrintDecision(MutationRequestDecision.Create(
22-
MutationRequestDecisionType.Approval(MutationRequestApprovalDecisionType.Requested),
24+
25+
PrintDecision(MutationRequestDecision.Approval(
26+
MutationRequestApprovalDecisionType.Requested,
2327
MutationContext.User("requester", "Requester", "Approval needed for sensitive change"),
2428
reason: "Sensitive change requires explicit sign-off."));
25-
PrintDecision(MutationRequestDecision.Create(
26-
MutationRequestDecisionType.Approval(MutationRequestApprovalDecisionType.Granted),
29+
30+
PrintDecision(MutationRequestDecision.Approval(
31+
MutationRequestApprovalDecisionType.Granted,
2732
MutationContext.User("alice", "Alice", "Manager approved"),
2833
reason: "Manager granted the required approval."));
29-
PrintDecision(MutationRequestDecision.Create(
30-
MutationRequestDecisionType.Approval(MutationRequestApprovalDecisionType.Rejected),
34+
35+
PrintDecision(MutationRequestDecision.Approval(
36+
MutationRequestApprovalDecisionType.Rejected,
3137
MutationContext.User("bob", "Bob", "Security rejected"),
3238
reason: "Security review rejected the request."));
3339

3440
PrintSection("Version Resolution Decisions");
35-
PrintDecision(MutationRequestDecision.Create(
36-
MutationRequestDecisionType.VersionResolution(MutationRequestVersionResolutionDecisionType.Validated),
41+
42+
PrintDecision(MutationRequestDecision.VersionResolution(
43+
MutationRequestVersionResolutionDecisionType.Validated,
3744
MutationContext.User("approver", "Approver", "Version still matches"),
3845
reason: "Current state version still matches the approved request."));
39-
PrintDecision(MutationRequestDecision.Create(
40-
MutationRequestDecisionType.VersionResolution(MutationRequestVersionResolutionDecisionType.RejectedAsStale),
46+
47+
PrintDecision(MutationRequestDecision.VersionResolution(
48+
MutationRequestVersionResolutionDecisionType.RejectedAsStale,
4149
MutationContext.User("approver", "Approver", "State drift invalidated the request"),
4250
reason: "Request was rejected because the approved version is stale."));
43-
PrintDecision(MutationRequestDecision.Create(
44-
MutationRequestDecisionType.VersionResolution(MutationRequestVersionResolutionDecisionType.RenewedApprovalRequired),
51+
52+
PrintDecision(MutationRequestDecision.VersionResolution(
53+
MutationRequestVersionResolutionDecisionType.RenewedApprovalRequired,
4554
MutationContext.User("approver", "Approver", "Re-approval required on latest state"),
4655
reason: "Request must be approved again on the latest state version."));
4756
}
@@ -61,4 +70,4 @@ private static void PrintDecision(MutationRequestDecision decision)
6170
Console.WriteLine($"Reason: {decision.Reason ?? "-"}");
6271
Console.WriteLine();
6372
}
64-
}
73+
}

‎Examples/Governance/Queries/README.md‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ It focuses on listing governed requests, approval work, and decision history wit
77
## What it demonstrates
88

99
- querying governed requests with `MutationRequestQuery`
10+
- filtering by intent tags, intent metadata, request metadata, and blast radius
1011
- listing the pending approval queue through `IMutationRequestQueryStore`
1112
- listing pending requests by `PendingMutationReason`
1213
- querying requests by `StateId` and request category
@@ -25,9 +26,9 @@ It focuses on listing governed requests, approval work, and decision history wit
2526
- [`Scenarios/ApprovalQueryScenario.cs`](Scenarios/ApprovalQueryScenario.cs)
2627
- [`Scenarios/DecisionQueryScenario.cs`](Scenarios/DecisionQueryScenario.cs)
2728
- [`src/Governance/Abstractions/Queries/Contracts/IMutationRequestQueryStore.cs`](../../../src/Governance/Abstractions/Queries/Contracts/IMutationRequestQueryStore.cs)
28-
- [`src/Governance/Abstractions/Queries/Model/MutationRequestQuery.cs`](../../../src/Governance/Abstractions/Queries/Model/MutationRequestQuery.cs)
29-
- [`src/Governance/Abstractions/Queries/Model/MutationApprovalQuery.cs`](../../../src/Governance/Abstractions/Queries/Model/MutationApprovalQuery.cs)
30-
- [`src/Governance/Abstractions/Queries/Model/MutationRequestDecisionQuery.cs`](../../../src/Governance/Abstractions/Queries/Model/MutationRequestDecisionQuery.cs)
29+
- [`src/Governance/Abstractions/Queries/Model/Requests/MutationRequestQuery.cs`](../../../src/Governance/Abstractions/Queries/Model/Requests/MutationRequestQuery.cs)
30+
- [`src/Governance/Abstractions/Queries/Model/Approvals/MutationApprovalQuery.cs`](../../../src/Governance/Abstractions/Queries/Model/Approvals/MutationApprovalQuery.cs)
31+
- [`src/Governance/Abstractions/Queries/Model/Decisions/MutationRequestDecisionQuery.cs`](../../../src/Governance/Abstractions/Queries/Model/Decisions/MutationRequestDecisionQuery.cs)
3132

3233
## Run
3334

@@ -43,6 +44,7 @@ The sample prints:
4344
- pending external-check requests
4445
- requests filtered by request category
4546
- requests filtered by state
47+
- requests filtered by governance metadata
4648
- recent approval-driven requests
4749
- approval views filtered by approver
4850
- recent version-resolution decisions

‎Examples/Governance/Queries/Scenarios/ApprovalQueryScenario.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using ModularityKit.Mutator.Governance.Abstractions.Queries.Contracts;
2-
using ModularityKit.Mutator.Governance.Abstractions.Queries.Model;
2+
using ModularityKit.Mutator.Governance.Abstractions.Queries.Model.Approvals;
33

44
namespace Queries.Scenarios;
55

‎Examples/Governance/Queries/Scenarios/DecisionQueryScenario.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using ModularityKit.Mutator.Governance.Abstractions.Queries.Contracts;
2-
using ModularityKit.Mutator.Governance.Abstractions.Queries.Model;
2+
using ModularityKit.Mutator.Governance.Abstractions.Queries.Model.Decisions;
33

44
namespace Queries.Scenarios;
55

‎Examples/Governance/Queries/Scenarios/GovernanceQueriesSampleData.cs‎

Lines changed: 80 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
using ModularityKit.Mutator.Abstractions.Policies;
44
using ModularityKit.Mutator.Governance.Abstractions.Approval.Model;
55
using ModularityKit.Mutator.Governance.Abstractions.Lifecycle.Model;
6+
using ModularityKit.Mutator.Governance.Abstractions.Queries.Model.Approvals;
7+
using ModularityKit.Mutator.Governance.Abstractions.Queries.Model.Decisions;
68
using ModularityKit.Mutator.Governance.Abstractions.Requests.Decisions;
79
using ModularityKit.Mutator.Governance.Abstractions.Requests.Factory;
810
using ModularityKit.Mutator.Governance.Abstractions.Requests.Model;
@@ -76,7 +78,7 @@ public static void PrintRequests(IReadOnlyList<MutationRequest> requests)
7678
Console.WriteLine("- none");
7779
}
7880

79-
public static void PrintApprovals(IReadOnlyList<ModularityKit.Mutator.Governance.Abstractions.Queries.Model.MutationApprovalView> approvals)
81+
public static void PrintApprovals(IReadOnlyList<MutationApprovalView> approvals)
8082
{
8183
foreach (var approval in approvals)
8284
{
@@ -88,7 +90,7 @@ public static void PrintApprovals(IReadOnlyList<ModularityKit.Mutator.Governance
8890
Console.WriteLine("- none");
8991
}
9092

91-
public static void PrintDecisions(IReadOnlyList<ModularityKit.Mutator.Governance.Abstractions.Queries.Model.MutationRequestDecisionView> decisions)
93+
public static void PrintDecisions(IReadOnlyList<MutationRequestDecisionView> decisions)
9294
{
9395
foreach (var decision in decisions)
9496
{
@@ -114,7 +116,13 @@ private static MutationRequest CreatePendingApprovalRequest(
114116
{
115117
OperationName = "ExampleOperation",
116118
Category = category,
117-
Description = $"Governed request for {category.ToLowerInvariant()} flow"
119+
Description = $"Governed request for {category.ToLowerInvariant()} flow",
120+
Tags = new HashSet<string> { category.ToLowerInvariant(), "approval" },
121+
EstimatedBlastRadius = category == "Security" ? BlastRadius.Module : BlastRadius.Single,
122+
Metadata = new Dictionary<string, object>
123+
{
124+
["risk-owner"] = category == "Security" ? "platform" : "finance"
125+
}
118126
},
119127
context: MutationContext.User("requester", "Requester", "Need governed change"),
120128
requirements:
@@ -126,6 +134,10 @@ private static MutationRequest CreatePendingApprovalRequest(
126134
RequestId = requestId,
127135
CreatedAt = createdAt,
128136
UpdatedAt = createdAt,
137+
Metadata = new Dictionary<string, object>
138+
{
139+
["ticket"] = category == "Security" ? "INC-42" : "BILL-7"
140+
},
129141
ApprovalRequirements =
130142
[
131143
new MutationApprovalRequirement
@@ -150,15 +162,25 @@ private static MutationRequest CreateExternalCheckRequest(
150162
{
151163
OperationName = "ExampleOperation",
152164
Category = category,
153-
Description = "Waiting for dependency validation"
165+
Description = "Waiting for dependency validation",
166+
Tags = new HashSet<string> { "external-check" },
167+
EstimatedBlastRadius = BlastRadius.Single,
168+
Metadata = new Dictionary<string, object>
169+
{
170+
["risk-owner"] = "release"
171+
}
154172
},
155173
context: MutationContext.Service("release-orchestrator", "Waiting for external dependency"),
156174
pendingReason: PendingMutationReason.ExternalCheck)
157175
with
158176
{
159177
RequestId = requestId,
160178
CreatedAt = createdAt,
161-
UpdatedAt = createdAt
179+
UpdatedAt = createdAt,
180+
Metadata = new Dictionary<string, object>
181+
{
182+
["ticket"] = "REL-99"
183+
}
162184
};
163185

164186
private static MutationRequest CreateRecentlyApprovedRequest(
@@ -175,7 +197,13 @@ private static MutationRequest CreateRecentlyApprovedRequest(
175197
{
176198
OperationName = "ExampleOperation",
177199
Category = category,
178-
Description = "Recently approved governed request"
200+
Description = "Recently approved governed request",
201+
Tags = new HashSet<string> { category.ToLowerInvariant(), "approved" },
202+
EstimatedBlastRadius = category == "Security" ? BlastRadius.Module : BlastRadius.Single,
203+
Metadata = new Dictionary<string, object>
204+
{
205+
["risk-owner"] = category == "Security" ? "platform" : "finance"
206+
}
179207
},
180208
context: MutationContext.User("requester", "Requester", "Need privileged change"),
181209
requirements:
@@ -189,6 +217,10 @@ private static MutationRequest CreateRecentlyApprovedRequest(
189217
PendingReason = null,
190218
CreatedAt = approvedAt.AddMinutes(-20),
191219
UpdatedAt = approvedAt,
220+
Metadata = new Dictionary<string, object>
221+
{
222+
["ticket"] = category == "Security" ? "INC-77" : "BILL-9"
223+
},
192224
ApprovalRequirements =
193225
[
194226
new MutationApprovalRequirement
@@ -201,36 +233,36 @@ private static MutationRequest CreateRecentlyApprovedRequest(
201233
],
202234
Decisions =
203235
[
204-
MutationRequestDecision.Create(
205-
MutationRequestDecisionType.Lifecycle(MutationRequestLifecycleDecisionType.Submitted),
236+
MutationRequestDecision.Lifecycle(
237+
MutationRequestLifecycleDecisionType.Submitted,
206238
MutationContext.User("requester", "Requester", "Submitted"))
207239
with
208240
{
209241
Timestamp = approvedAt.AddMinutes(-20)
210242
},
211-
MutationRequestDecision.Create(
212-
MutationRequestDecisionType.Lifecycle(MutationRequestLifecycleDecisionType.Pending),
243+
MutationRequestDecision.Lifecycle(
244+
MutationRequestLifecycleDecisionType.Pending,
213245
MutationContext.User("requester", "Requester", "Pending approval"))
214246
with
215247
{
216248
Timestamp = approvedAt.AddMinutes(-19)
217249
},
218-
MutationRequestDecision.Create(
219-
MutationRequestDecisionType.Approval(MutationRequestApprovalDecisionType.Requested),
250+
MutationRequestDecision.Approval(
251+
MutationRequestApprovalDecisionType.Requested,
220252
MutationContext.User("requester", "Requester", "Approval requested"))
221253
with
222254
{
223255
Timestamp = approvedAt.AddMinutes(-18)
224256
},
225-
MutationRequestDecision.Create(
226-
MutationRequestDecisionType.Approval(MutationRequestApprovalDecisionType.Granted),
257+
MutationRequestDecision.Approval(
258+
MutationRequestApprovalDecisionType.Granted,
227259
MutationContext.User(approverId, approverId, "Approved"))
228260
with
229261
{
230262
Timestamp = approvedAt
231263
},
232-
MutationRequestDecision.Create(
233-
MutationRequestDecisionType.Lifecycle(MutationRequestLifecycleDecisionType.Approved),
264+
MutationRequestDecision.Lifecycle(
265+
MutationRequestLifecycleDecisionType.Approved,
234266
MutationContext.User(approverId, approverId, "Approved"))
235267
with
236268
{
@@ -252,7 +284,13 @@ private static MutationRequest CreateResolvedRequest(
252284
{
253285
OperationName = "ExampleOperation",
254286
Category = category,
255-
Description = "Resolved governed request"
287+
Description = "Resolved governed request",
288+
Tags = new HashSet<string> { category.ToLowerInvariant(), "resolution" },
289+
EstimatedBlastRadius = BlastRadius.Single,
290+
Metadata = new Dictionary<string, object>
291+
{
292+
["risk-owner"] = "governance"
293+
}
256294
},
257295
context: MutationContext.Service("governance-runtime", "Resolve stale request"))
258296
with
@@ -261,18 +299,21 @@ private static MutationRequest CreateResolvedRequest(
261299
Status = MutationRequestStatus.Approved,
262300
CreatedAt = decisionTimestamp.AddMinutes(-30),
263301
UpdatedAt = decisionTimestamp,
302+
Metadata = new Dictionary<string, object>
303+
{
304+
["ticket"] = "CFG-5"
305+
},
264306
Decisions =
265307
[
266-
MutationRequestDecision.Create(
267-
MutationRequestDecisionType.Lifecycle(MutationRequestLifecycleDecisionType.Submitted),
308+
MutationRequestDecision.Lifecycle(
309+
MutationRequestLifecycleDecisionType.Submitted,
268310
MutationContext.Service("governance-runtime", "Submitted"))
269311
with
270312
{
271313
Timestamp = decisionTimestamp.AddMinutes(-30)
272314
},
273-
MutationRequestDecision.Create(
274-
MutationRequestDecisionType.VersionResolution(
275-
MutationRequestVersionResolutionDecisionType.Validated),
315+
MutationRequestDecision.VersionResolution(
316+
MutationRequestVersionResolutionDecisionType.Validated,
276317
MutationContext.Service("governance-runtime", "Validated current version"))
277318
with
278319
{
@@ -294,7 +335,13 @@ private static MutationRequest CreateExecutedRequest(
294335
{
295336
OperationName = "ExampleOperation",
296337
Category = category,
297-
Description = "Executed governed request"
338+
Description = "Executed governed request",
339+
Tags = new HashSet<string> { category.ToLowerInvariant(), "executed" },
340+
EstimatedBlastRadius = BlastRadius.Single,
341+
Metadata = new Dictionary<string, object>
342+
{
343+
["risk-owner"] = "finance"
344+
}
298345
},
299346
context: MutationContext.Service("governance-runtime", "Execute approved request"))
300347
with
@@ -304,24 +351,28 @@ private static MutationRequest CreateExecutedRequest(
304351
CreatedAt = executedAt.AddMinutes(-15),
305352
UpdatedAt = executedAt,
306353
ExecutedAt = executedAt,
354+
Metadata = new Dictionary<string, object>
355+
{
356+
["ticket"] = "BILL-22"
357+
},
307358
Decisions =
308359
[
309-
MutationRequestDecision.Create(
310-
MutationRequestDecisionType.Lifecycle(MutationRequestLifecycleDecisionType.Submitted),
360+
MutationRequestDecision.Lifecycle(
361+
MutationRequestLifecycleDecisionType.Submitted,
311362
MutationContext.Service("governance-runtime", "Submitted"))
312363
with
313364
{
314365
Timestamp = executedAt.AddMinutes(-15)
315366
},
316-
MutationRequestDecision.Create(
317-
MutationRequestDecisionType.Lifecycle(MutationRequestLifecycleDecisionType.Approved),
367+
MutationRequestDecision.Lifecycle(
368+
MutationRequestLifecycleDecisionType.Approved,
318369
MutationContext.Service("governance-runtime", "Approved"))
319370
with
320371
{
321372
Timestamp = executedAt.AddMinutes(-5)
322373
},
323-
MutationRequestDecision.Create(
324-
MutationRequestDecisionType.Lifecycle(MutationRequestLifecycleDecisionType.Executed),
374+
MutationRequestDecision.Lifecycle(
375+
MutationRequestLifecycleDecisionType.Executed,
325376
MutationContext.Service("governance-runtime", "Executed"))
326377
with
327378
{

0 commit comments

Comments
 (0)