Skip to content

Commit 0caba57

Browse files
committed
Feat: composed governance policy for feature flags
1 parent b3a05a2 commit 0caba57

3 files changed

Lines changed: 38 additions & 4 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using FeatureFlags.State;
2+
using ModularityKit.Mutator.Abstractions.Policies;
3+
4+
namespace FeatureFlags.Policies;
5+
6+
/// <summary>
7+
/// Reusable policy compositions for sensitive feature flag changes.
8+
/// </summary>
9+
internal static class FeatureFlagGovernancePolicies
10+
{
11+
/// <summary>
12+
/// Composed governance policy set for critical feature flag changes.
13+
/// </summary>
14+
public static IMutationPolicy<FeatureFlagsState> CriticalChanges() =>
15+
PolicyComposition.AllOf(
16+
name: "CriticalFeatureFlagGovernance",
17+
policies:
18+
[
19+
new BusinessHoursPolicy(),
20+
new RequireTwoManApprovalPolicy()
21+
],
22+
priority: 200,
23+
description: "Requires business-hours execution and two-man approval for critical feature flag changes.");
24+
}

Examples/Core/FeatureFlags/Program.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ private static async Task Main()
1717
var provider = services.BuildServiceProvider();
1818
var engine = provider.GetRequiredService<IMutationEngine>();
1919

20-
//engine.RegisterPolicy(new BusinessHoursPolicy());
21-
engine.RegisterPolicy(new RequireTwoManApprovalPolicy());
20+
engine.RegisterPolicy(FeatureFlagGovernancePolicies.CriticalChanges());
2221

2322
Console.WriteLine("=== ModularityKit.Mutators - Complete Example ===\n");
2423

@@ -41,4 +40,4 @@ private static async Task Main()
4140
Console.WriteLine($" Median execution time: {stats.MedianExecutionTime.TotalMilliseconds:F2} ms");
4241
Console.WriteLine($" P95 execution time: {stats.P95ExecutionTime.TotalMilliseconds:F2} ms");
4342
}
44-
}
43+
}

Examples/Core/FeatureFlags/README.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ The example covers three workflows:
3131
- [`Mutations/DisableFeatureMutation.cs`](Mutations/DisableFeatureMutation.cs)
3232
- [`Policies/BusinessHoursPolicy.cs`](Policies/BusinessHoursPolicy.cs)
3333
- [`Policies/RequireTwoManApprovalPolicy.cs`](Policies/RequireTwoManApprovalPolicy.cs)
34+
- [`Policies/FeatureFlagGovernancePolicies.cs`](Policies/FeatureFlagGovernancePolicies.cs)
3435
- [`Scenarios/EnableNewCheckoutScenario.cs`](Scenarios/EnableNewCheckoutScenario.cs)
3536
- [`Scenarios/DisableLegacyCheckoutScenario.cs`](Scenarios/DisableLegacyCheckoutScenario.cs)
3637
- [`Scenarios/BatchFeatureToggleScenario.cs`](Scenarios/BatchFeatureToggleScenario.cs)
@@ -41,7 +42,7 @@ The example covers three workflows:
4142

4243
1. registers the engine with strict options
4344
2. resolves `IMutationEngine`
44-
3. registers `RequireTwoManApprovalPolicy`
45+
3. registers the composed `CriticalFeatureFlagGovernance` policy set
4546
4. runs the example scenarios
4647
5. prints history for the main state
4748
6. prints engine statistics
@@ -84,6 +85,16 @@ It demonstrates:
8485

8586
Use it as reference if you want to restrict rollout windows.
8687

88+
### Composed governance set
89+
90+
[`FeatureFlagGovernancePolicies.CriticalChanges`](Policies/FeatureFlagGovernancePolicies.cs) combines business-hours restrictions and two-man approval into one reusable policy set.
91+
92+
It demonstrates:
93+
94+
- `PolicyComposition.AllOf(...)`
95+
- explicit policy merge behavior
96+
- registering one composed policy instead of multiple hand-wired policy classes
97+
8798
## Scenarios
8899

89100
### Enable new checkout

0 commit comments

Comments
 (0)