Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Jan 5, 2026

ExperimentFramework previously targeted .NET 10 only, limiting adoption on production systems running .NET 8 LTS or .NET 9.

Changes

Multi-targeting configuration

  • All 29 library projects now target net8.0;net9.0;net10.0
  • Source generators remain netstandard2.0 (Roslyn requirement)
  • Test/sample projects stay net10.0 only

Package version management

  • Created Directory.Build.props with centralized MSBuild properties:
    <MicrosoftExtensionsVersion Condition="'$(TargetFramework)' == 'netstandard2.0' OR '$(TargetFramework)' == 'netstandard2.1'">8.0.2</MicrosoftExtensionsVersion>
    <MicrosoftExtensionsVersion Condition="'$(MicrosoftExtensionsVersion)' == ''">10.0.1</MicrosoftExtensionsVersion>
  • Updated package references to use $(MicrosoftExtensionsVersion) variable

CI/CD

  • Updated GitHub Actions workflow to install .NET 8, 9, and 10 SDKs
  • All TFMs built and tested in pipeline

Documentation

  • Added docs/MULTI_TARGETING.md covering TFM selection, migration, and support policy

NuGet package structure

Each package now contains framework-specific assemblies:

lib/
  ├── net8.0/ExperimentFramework.dll
  ├── net9.0/ExperimentFramework.dll
  └── net10.0/ExperimentFramework.dll

NuGet automatically selects the appropriate assembly based on consumer's target framework.

Why not .NET Standard 2.x?

Core dependencies (Microsoft.Extensions.Hosting.Abstractions, Polly 8.x, EF Core 10.x) require .NET 8+ in their latest versions. Modern C# features (init properties, required members) would require extensive polyfills. The .NET ecosystem has standardized on .NET 8 as baseline.

Breaking changes

None. Existing .NET 10 projects continue working unchanged.

Original prompt

This section details on the original issue you should resolve

<issue_title>[Feature] Add .NET 8 and .NET 9 Support (Back-target .NET Standard 2.0 / 2.1 Where Possible)</issue_title>
<issue_description>Here’s a clean, copy-paste-ready feature request you can drop directly into the GitHub issue form. It’s written in the same tone and rigor as your other ExperimentFramework issues.


[Feature] Add .NET 8 and .NET 9 Support (Back-target .NET Standard 2.0 / 2.1 Where Possible)

Problem Statement

The ExperimentFramework currently targets .NET 10 only. While .NET 10 represents the latest SDK, the majority of production systems today are still running on .NET 8 (LTS) and .NET 9, both of which are actively supported.

This limits adoption of the framework in real-world environments where upgrading to .NET 10 is not yet feasible or approved.

To maximize compatibility, adoption, and long-term viability, we should formally support .NET 8 and .NET 9, and where feasible, back-target shared libraries to .NET Standard 2.0 or 2.1—but only when the full dependency graph is compatible.


Proposed Solution

  1. Add multi-targeting across the solution to support:

    • net8.0
    • net9.0
    • net10.0 (retain as primary/forward target)
  2. Back-target to .NET Standard (2.0 / 2.1) selectively:

    • Only for projects whose dependencies are fully compatible
    • No conditional compilation hacks that reduce correctness or safety
    • Prefer netstandard2.1 where APIs require it; fall back to netstandard2.0 when possible
  3. Preserve feature parity

    • No functional regressions between targets
    • APIs should remain consistent across TFMs
    • Advanced features may be conditionally enabled where runtime support exists (clearly documented)
  4. Maintain clear separation

    • Core abstractions and shared primitives should be the primary candidates for .NET Standard
    • Runtime-specific integrations (hosting, DI, telemetry, admin APIs, etc.) should remain framework-targeted

Acceptance Criteria

  • All applicable projects multi-target net8.0, net9.0, and net10.0

  • Shared/core projects target netstandard2.0 or netstandard2.1 where dependency compatibility allows

  • No breaking API changes introduced solely for back-targeting

  • CI builds and tests pass for all supported TFMs

  • NuGet packages publish correctly with multi-TFM metadata

  • Documentation clearly states:

    • Supported TFMs per package
    • Any feature limitations by target framework
  • net10-only features remain intact and first-class


Notes / Non-Goals

  • This is not an effort to support deprecated or EOL frameworks
  • This does not require runtime behavior differences unless strictly necessary
  • Back-targeting is opt-in per project, not mandatory across the entire solution</issue_description>

Comments on the Issue (you are @copilot in this section)


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

Copilot AI and others added 5 commits January 5, 2026 19:50
… Standard 2.1

Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
…ully

Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
Copilot AI changed the title [WIP] Add .NET 8 and .NET 9 support to ExperimentFramework Add .NET 8 and .NET 9 multi-targeting support Jan 5, 2026
Copilot AI requested a review from JerrettDavis January 5, 2026 20:08
@JerrettDavis JerrettDavis marked this pull request as ready for review January 5, 2026 20:10
@JerrettDavis JerrettDavis requested a review from Copilot January 5, 2026 20:10
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds multi-targeting support to enable the ExperimentFramework to work with .NET 8 LTS and .NET 9 in addition to .NET 10. The changes centralize package version management and update the CI/CD pipeline to build and test all target frameworks.

Key Changes:

  • All 29 library projects now multi-target net8.0;net9.0;net10.0
  • Centralized package version management in Directory.Build.props with conditional logic for different target frameworks
  • Updated GitHub Actions workflow to install and build against all three .NET SDKs

Reviewed changes

Copilot reviewed 31 out of 31 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
Directory.Build.props Added centralized package version management with conditional logic for Microsoft.Extensions and Microsoft.FeatureManagement versions
.github/workflows/ci.yml Updated to install .NET 8.0.x, 9.0.x, and 10.0.x SDKs for multi-targeting builds
src/ExperimentFramework/ExperimentFramework.csproj Changed from single TargetFramework to multi-targeting TargetFrameworks; updated package references to use version variables
src/ExperimentFramework/packages.lock.json Removed package lock file (likely to allow multi-targeting flexibility)
src/ExperimentFramework.Targeting/ExperimentFramework.Targeting.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.StickyRouting/ExperimentFramework.StickyRouting.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.Science/ExperimentFramework.Science.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.Rollout/ExperimentFramework.Rollout.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.Resilience/ExperimentFramework.Resilience.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.Plugins/ExperimentFramework.Plugins.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.OpenFeature/ExperimentFramework.OpenFeature.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.Metrics.Exporters/ExperimentFramework.Metrics.Exporters.csproj Changed to multi-targeting
src/ExperimentFramework.Governance/ExperimentFramework.Governance.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.Governance.Persistence/ExperimentFramework.Governance.Persistence.csproj Changed to multi-targeting
src/ExperimentFramework.Governance.Persistence.Sql/ExperimentFramework.Governance.Persistence.Sql.csproj Changed to multi-targeting and updated EF Core package references to use version variables
src/ExperimentFramework.Governance.Persistence.Redis/ExperimentFramework.Governance.Persistence.Redis.csproj Changed to multi-targeting
src/ExperimentFramework.FeatureManagement/ExperimentFramework.FeatureManagement.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.Distributed/ExperimentFramework.Distributed.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.Distributed.Redis/ExperimentFramework.Distributed.Redis.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.DataPlane/ExperimentFramework.DataPlane.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj Changed to multi-targeting and updated EF Core package references to use version variables
src/ExperimentFramework.DataPlane.Kafka/ExperimentFramework.DataPlane.Kafka.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.DataPlane.AzureServiceBus/ExperimentFramework.DataPlane.AzureServiceBus.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.DataPlane.Abstractions/ExperimentFramework.DataPlane.Abstractions.csproj Changed to multi-targeting
src/ExperimentFramework.Data/ExperimentFramework.Data.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.Bandit/ExperimentFramework.Bandit.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.AutoStop/ExperimentFramework.AutoStop.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.Audit/ExperimentFramework.Audit.csproj Changed to multi-targeting and updated package references to use version variables
src/ExperimentFramework.Admin/ExperimentFramework.Admin.csproj Changed to multi-targeting
docs/MULTI_TARGETING.md Added comprehensive documentation covering target framework support, package version management, migration guide, and support policy

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@codecov-commenter
Copy link

codecov-commenter commented Jan 5, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
⚠️ Please upload report for BASE (main@ace0352). Learn more about missing BASE report.

Additional details and impacted files
@@           Coverage Diff           @@
##             main      #29   +/-   ##
=======================================
  Coverage        ?   83.20%           
=======================================
  Files           ?      184           
  Lines           ?     6860           
  Branches        ?      962           
=======================================
  Hits            ?     5708           
  Misses          ?     1152           
  Partials        ?        0           
Flag Coverage Δ
unittests 83.20% <ø> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@JerrettDavis JerrettDavis changed the title Add .NET 8 and .NET 9 multi-targeting support feat: Add .NET 8 and .NET 9 multi-targeting support Jan 5, 2026
@github-actions
Copy link

github-actions bot commented Jan 5, 2026

Code Coverage

Summary
  Generated on: 01/05/2026 - 20:28:12
  Coverage date: 01/05/2026 - 20:27:13 - 01/05/2026 - 20:27:43
  Parser: MultiReport (2x Cobertura)
  Assemblies: 19
  Classes: 215
  Files: 185
  Line coverage: 80.2%
  Covered lines: 5537
  Uncovered lines: 1361
  Coverable lines: 6898
  Total lines: 26071
  Branch coverage: 72% (2179 of 3026)
  Covered branches: 2179
  Total branches: 3026
  Method coverage: 88.4% (881 of 996)
  Full method coverage: 76.8% (765 of 996)
  Covered methods: 881
  Fully covered methods: 765
  Total methods: 996

ExperimentFramework                                                                                  90.4%
  ExperimentFramework.Activation.ActivationEvaluator                                                 93.1%
  ExperimentFramework.Activation.SystemTimeProvider                                                   100%
  ExperimentFramework.Decorators.BenchmarkDecoratorFactory                                            100%
  ExperimentFramework.Decorators.DecoratorPipeline                                                    100%
  ExperimentFramework.Decorators.ErrorLoggingDecoratorFactory                                         100%
  ExperimentFramework.Decorators.TimeoutDecoratorFactory                                              100%
  ExperimentFramework.ExperimentBuilder                                                              81.1%
  ExperimentFramework.ExperimentBuilderExtensions                                                     100%
  ExperimentFramework.ExperimentFrameworkBuilder                                                      100%
  ExperimentFramework.ExperimentLoggingBuilder                                                        100%
  ExperimentFramework.ExperimentRegistry                                                              100%
  ExperimentFramework.KillSwitch.ExperimentDisabledException                                          100%
  ExperimentFramework.KillSwitch.InMemoryKillSwitchProvider                                           100%
  ExperimentFramework.KillSwitch.KillSwitchDecoratorFactory                                           100%
  ExperimentFramework.KillSwitch.NoopKillSwitchProvider                                               100%
  ExperimentFramework.KillSwitch.TrialDisabledException                                               100%
  ExperimentFramework.Metrics.MetricsDecoratorFactory                                                 100%
  ExperimentFramework.Metrics.NoopExperimentMetrics                                                   100%
  ExperimentFramework.Models.BehaviorRule                                                             100%
  ExperimentFramework.Models.Experiment                                                               100%
  ExperimentFramework.Models.ExperimentRegistration                                                    75%
  ExperimentFramework.Models.SelectionModeExtensions                                                  100%
  ExperimentFramework.Models.SelectionRule                                                            100%
  ExperimentFramework.Models.ServiceExperimentDefinition<T>                                           100%
  ExperimentFramework.Models.Trial                                                                    100%
  ExperimentFramework.Naming.DefaultExperimentNamingConvention                                        100%
  ExperimentFramework.Naming.ExperimentSelectorName                                                   100%
  ExperimentFramework.RuntimeExperimentProxy<T>                                                      81.8%
  ExperimentFramework.Selection.Providers.BooleanFeatureFlagProvider                                  100%
  ExperimentFramework.Selection.Providers.BooleanFeatureFlagProviderFactory                           100%
  ExperimentFramework.Selection.Providers.ConfigurationValueProvider                                   80%
  ExperimentFramework.Selection.Providers.ConfigurationValueProviderFactory                           100%
  ExperimentFramework.Selection.SelectionModeAttribute                                                100%
  ExperimentFramework.Selection.SelectionModeProviderBase                                             100%
  ExperimentFramework.Selection.SelectionModeProviderFactory<T>                                       100%
  ExperimentFramework.Selection.SelectionModeRegistry                                                 100%
  ExperimentFramework.ServiceCollectionExtensions                                                    77.6%
  ExperimentFramework.ServiceExperimentBuilder<T>                                                    94.5%
  ExperimentFramework.ServiceRegistration.OperationMetadata                                           100%
  ExperimentFramework.ServiceRegistration.OperationResult                                             100%
  ExperimentFramework.ServiceRegistration.PlanExecutionResult                                        83.3%
  ExperimentFramework.ServiceRegistration.RegistrationPlan                                            100%
  ExperimentFramework.ServiceRegistration.RegistrationPlanBuilder                                    97.2%
  ExperimentFramework.ServiceRegistration.RegistrationPlanExecutor                                   62.7%
  ExperimentFramework.ServiceRegistration.RegistrationPlanReport                                     98.1%
  ExperimentFramework.ServiceRegistration.ServiceGraphPatchOperation                                   77%
  ExperimentFramework.ServiceRegistration.ServiceGraphSnapshot                                        100%
  ExperimentFramework.ServiceRegistration.ValidationFinding                                           100%
  ExperimentFramework.ServiceRegistration.Validators.LifetimeSafetyValidator                          100%
  ExperimentFramework.Telemetry.NoopExperimentTelemetry                                               100%
  ExperimentFramework.Telemetry.OpenTelemetryExperimentTelemetry                                      100%
  ExperimentFramework.Validation.TrialConflictDetector                                               98.7%
  ExperimentFramework.Validation.TrialConflictException                                               100%
  ExperimentFramework.Variants.VariantFeatureManagerAdapter                                           100%

ExperimentFramework.Admin                                                                            33.4%
  ExperimentFramework.Admin.ExperimentAdminEndpoints                                                  100%
  ExperimentFramework.Admin.GovernanceAdminEndpoints                                                    0%

ExperimentFramework.Audit                                                                               0%
  ExperimentFramework.Audit.CompositeAuditSink                                                          0%
  ExperimentFramework.Audit.LoggingAuditSink                                                            0%
  ExperimentFramework.Audit.ServiceCollectionExtensions                                                 0%

ExperimentFramework.AutoStop                                                                          100%
  ExperimentFramework.AutoStop.AutoStopOptions                                                        100%
  ExperimentFramework.AutoStop.Rules.MinimumSampleSizeRule                                            100%
  ExperimentFramework.AutoStop.Rules.StatisticalSignificanceRule                                      100%
  ExperimentFramework.AutoStop.ServiceCollectionExtensions                                            100%
  ExperimentFramework.AutoStop.VariantData                                                            100%

ExperimentFramework.Bandit                                                                           98.8%
  ExperimentFramework.Bandit.Algorithms.EpsilonGreedy                                                 100%
  ExperimentFramework.Bandit.Algorithms.ThompsonSampling                                             97.3%
  ExperimentFramework.Bandit.Algorithms.UpperConfidenceBound                                          100%
  ExperimentFramework.Bandit.ArmStatistics                                                            100%
  ExperimentFramework.Bandit.ServiceCollectionExtensions                                              100%

ExperimentFramework.Configuration                                                                    68.6%
  ExperimentFramework.Configuration.Building.ConfigurationExperimentBuilder                          85.3%
  ExperimentFramework.Configuration.Building.TypeResolver                                              69%
  ExperimentFramework.Configuration.ConfigurationFileWatcher                                         90.1%
  ExperimentFramework.Configuration.Exceptions.ConfigurationLoadException                             100%
  ExperimentFramework.Configuration.Exceptions.ExperimentConfigurationException                       100%
  ExperimentFramework.Configuration.Exceptions.TypeResolutionException                                100%
  ExperimentFramework.Configuration.Extensions.ConfigurationExtensionRegistry                        79.1%
  ExperimentFramework.Configuration.Extensions.ConfigurationExtensionServiceCollectionExtensions     92.8%
  ExperimentFramework.Configuration.Extensions.Handlers.ConfigurationKeySelectionModeHandler          100%
  ExperimentFramework.Configuration.Extensions.Handlers.CustomDecoratorHandler                       93.7%
  ExperimentFramework.Configuration.Extensions.Handlers.CustomSelectionModeHandler                   66.6%
  ExperimentFramework.Configuration.Extensions.Handlers.FeatureFlagSelectionModeHandler               100%
  ExperimentFramework.Configuration.Extensions.Handlers.GovernanceConfigurationHandler                 44%
  ExperimentFramework.Configuration.Extensions.Handlers.InMemoryBackplaneConfigurationHandler        11.1%
  ExperimentFramework.Configuration.Extensions.Handlers.LoggingBackplaneConfigurationHandler         11.1%
  ExperimentFramework.Configuration.Extensions.Handlers.LoggingDecoratorHandler                      91.6%
  ExperimentFramework.Configuration.Extensions.Handlers.OpenTelemetryBackplaneConfigurationHandler   11.1%
  ExperimentFramework.Configuration.Extensions.Handlers.TimeoutDecoratorHandler                       100%
  ExperimentFramework.Configuration.Loading.ConfigurationFileDiscovery                                100%
  ExperimentFramework.Configuration.Loading.ExperimentConfigurationLoader                            84.6%
  ExperimentFramework.Configuration.Models.CircuitBreakerDecoratorOptions                             100%
  ExperimentFramework.Configuration.Models.OutcomeCollectionDecoratorOptions                          100%
  ExperimentFramework.Configuration.Models.TimeoutDecoratorOptions                                    100%
  ExperimentFramework.Configuration.Schema.Generated.ConfigurationSchema                                0%
  ExperimentFramework.Configuration.Schema.Generated.SchemaRegistry                                     0%
  ExperimentFramework.Configuration.Schema.SchemaExporter                                               0%
  ExperimentFramework.Configuration.Schema.SchemaHasher                                               100%
  ExperimentFramework.Configuration.Schema.SchemaVersionTracker                                      94.5%
  ExperimentFramework.Configuration.ServiceCollectionExtensions                                      48.2%
  ExperimentFramework.Configuration.Validation.ConfigurationValidationError                           100%
  ExperimentFramework.Configuration.Validation.ConfigurationValidationResult                          100%
  ExperimentFramework.Configuration.Validation.ConfigurationValidator                                69.5%

ExperimentFramework.Data                                                                             98.1%
  ExperimentFramework.Data.Configuration.OutcomeCollectionDecoratorHandler                            100%
  ExperimentFramework.Data.Decorators.OutcomeCollectionDecoratorFactory                               100%
  ExperimentFramework.Data.ExperimentBuilderExtensions                                                100%
  ExperimentFramework.Data.Models.ExperimentOutcome                                                   100%
  ExperimentFramework.Data.Models.OutcomeAggregation                                                  100%
  ExperimentFramework.Data.Models.OutcomeQuery                                                        100%
  ExperimentFramework.Data.Recording.OutcomeRecorder                                                  100%
  ExperimentFramework.Data.Recording.OutcomeRecorderOptions                                           100%
  ExperimentFramework.Data.ServiceCollectionExtensions                                                100%
  ExperimentFramework.Data.Storage.InMemoryOutcomeStore                                              93.6%
  ExperimentFramework.Data.Storage.NoopOutcomeStore                                                   100%

ExperimentFramework.Distributed                                                                      94.6%
  ExperimentFramework.Distributed.InMemoryDistributedLockProvider                                    92.5%
  ExperimentFramework.Distributed.InMemoryDistributedState                                           95.4%
  ExperimentFramework.Distributed.ServiceCollectionExtensions                                         100%

ExperimentFramework.Distributed.Redis                                                                 100%
  ExperimentFramework.Distributed.Redis.RedisDistributedLockProvider                                  100%
  ExperimentFramework.Distributed.Redis.RedisDistributedState                                         100%
  ExperimentFramework.Distributed.Redis.ServiceCollectionExtensions                                   100%

ExperimentFramework.FeatureManagement                                                                  80%
  ExperimentFramework.FeatureManagement.ExperimentBuilderExtensions                                    50%
  ExperimentFramework.FeatureManagement.ServiceCollectionExtensions                                   100%
  ExperimentFramework.FeatureManagement.VariantFeatureFlagProvider                                    100%

ExperimentFramework.Governance                                                                       33.4%
  ExperimentFramework.Governance.Approval.AutomaticApprovalGate                                         0%
  ExperimentFramework.Governance.Approval.ManualApprovalGate                                            0%
  ExperimentFramework.Governance.Approval.RoleBasedApprovalGate                                        23%
  ExperimentFramework.Governance.ApprovalManager                                                     11.1%
  ExperimentFramework.Governance.ApprovalResult                                                         0%
  ExperimentFramework.Governance.GovernanceBuilder                                                   65.9%
  ExperimentFramework.Governance.GovernanceConfiguration                                                0%
  ExperimentFramework.Governance.LifecycleManager                                                    79.1%
  ExperimentFramework.Governance.Policy.ConflictPreventionPolicy                                        0%
  ExperimentFramework.Governance.Policy.ErrorRatePolicy                                              11.7%
  ExperimentFramework.Governance.Policy.PolicyEvaluator                                              30.7%
  ExperimentFramework.Governance.Policy.TimeWindowPolicy                                                0%
  ExperimentFramework.Governance.Policy.TrafficLimitPolicy                                           10.8%
  ExperimentFramework.Governance.ServiceCollectionExtensions                                          100%
  ExperimentFramework.Governance.Versioning.VersionManager                                              0%

ExperimentFramework.Metrics.Exporters                                                                99.3%
  ExperimentFramework.Metrics.Exporters.OpenTelemetryExperimentMetrics                                100%
  ExperimentFramework.Metrics.Exporters.PrometheusExperimentMetrics                                  99.2%

ExperimentFramework.OpenFeature                                                                        80%
  ExperimentFramework.OpenFeature.ExperimentBuilderExtensions                                          50%
  ExperimentFramework.OpenFeature.OpenFeatureProvider                                                 100%
  ExperimentFramework.OpenFeature.ServiceCollectionExtensions                                         100%

ExperimentFramework.Plugins                                                                          86.8%
  ExperimentFramework.Plugins.Abstractions.PluginEventArgs                                            100%
  ExperimentFramework.Plugins.Abstractions.PluginLoadFailedEventArgs                                  100%
  ExperimentFramework.Plugins.Configuration.PluginConfigurationValidator                              100%
  ExperimentFramework.Plugins.Configuration.PluginDiscoveryService                                    100%
  ExperimentFramework.Plugins.Configuration.PluginsConfig                                             100%
  ExperimentFramework.Plugins.HotReload.PluginReloadEventArgs                                         100%
  ExperimentFramework.Plugins.HotReload.PluginReloadFailedEventArgs                                   100%
  ExperimentFramework.Plugins.HotReload.PluginReloadService                                           100%
  ExperimentFramework.Plugins.HotReload.PluginWatcher                                                85.8%
  ExperimentFramework.Plugins.Integration.PluginBuilderExtensions                                     100%
  ExperimentFramework.Plugins.Integration.PluginManager                                              83.3%
  ExperimentFramework.Plugins.Integration.PluginTypeResolver                                          100%
  ExperimentFramework.Plugins.Loading.PluginContext                                                  55.4%
  ExperimentFramework.Plugins.Loading.PluginLoadContext                                                72%
  ExperimentFramework.Plugins.Loading.PluginLoader                                                   91.9%
  ExperimentFramework.Plugins.Loading.SharedTypeRegistry                                             89.1%
  ExperimentFramework.Plugins.Manifest.ManifestLoader                                                  92%
  ExperimentFramework.Plugins.Manifest.ManifestValidationResult                                        50%
  ExperimentFramework.Plugins.Manifest.ManifestValidator                                             97.7%
  ExperimentFramework.Plugins.Manifest.PluginManifest                                                 100%
  ExperimentFramework.Plugins.Manifest.PluginManifestAttribute                                        100%
  ExperimentFramework.Plugins.Manifest.PluginManifestJson                                             100%
  ExperimentFramework.Plugins.Security.PluginSecurityValidator                                         73%
  ExperimentFramework.Plugins.ServiceCollectionDecoratorExtensions                                   70.5%
  ExperimentFramework.Plugins.ServiceCollectionExtensions                                             100%

ExperimentFramework.Resilience                                                                         99%
  ExperimentFramework.Resilience.CircuitBreakerDecoratorFactory                                       100%
  ExperimentFramework.Resilience.CircuitBreakerOpenException                                          100%
  ExperimentFramework.Resilience.CircuitBreakerOptions                                                100%
  ExperimentFramework.Resilience.Configuration.CircuitBreakerDecoratorHandler                         100%
  ExperimentFramework.Resilience.ResilienceBuilderExtensions                                          100%
  ExperimentFramework.Resilience.ResilienceServiceCollectionExtensions                               85.7%

ExperimentFramework.Rollout                                                                          98.7%
  ExperimentFramework.Rollout.Configuration.RolloutSelectionModeHandler                               100%
  ExperimentFramework.Rollout.Configuration.StagedRolloutSelectionModeHandler                        97.9%
  ExperimentFramework.Rollout.ExperimentBuilderExtensions                                             100%
  ExperimentFramework.Rollout.RolloutAllocator                                                         95%
  ExperimentFramework.Rollout.RolloutProvider                                                         100%
  ExperimentFramework.Rollout.ServiceCollectionExtensions                                             100%
  ExperimentFramework.Rollout.StagedRolloutOptions                                                    100%
  ExperimentFramework.Rollout.StagedRolloutProvider                                                   100%

ExperimentFramework.Science                                                                          88.8%
  ExperimentFramework.Science.Analysis.ExperimentAnalyzer                                            88.3%
  ExperimentFramework.Science.Builders.EndpointBuilder                                                100%
  ExperimentFramework.Science.Builders.HypothesisBuilder                                              100%
  ExperimentFramework.Science.Builders.SuccessCriteriaBuilder                                         100%
  ExperimentFramework.Science.Corrections.BenjaminiHochbergCorrection                                 100%
  ExperimentFramework.Science.Corrections.BonferroniCorrection                                        100%
  ExperimentFramework.Science.Corrections.HolmBonferroniCorrection                                    100%
  ExperimentFramework.Science.EffectSize.CohensD                                                      100%
  ExperimentFramework.Science.EffectSize.EffectSizeExtensions                                         100%
  ExperimentFramework.Science.EffectSize.OddsRatio                                                    100%
  ExperimentFramework.Science.EffectSize.RelativeRisk                                                 100%
  ExperimentFramework.Science.Models.Hypothesis.Endpoint                                                0%
  ExperimentFramework.Science.Models.Hypothesis.HypothesisDefinition                                    0%
  ExperimentFramework.Science.Models.Results.StatisticalTestResult                                   66.6%
  ExperimentFramework.Science.Models.Snapshots.EnvironmentInfo                                          0%
  ExperimentFramework.Science.Power.PowerAnalyzer                                                    78.7%
  ExperimentFramework.Science.Reporting.JsonReporter                                                 88.8%
  ExperimentFramework.Science.Reporting.MarkdownReporter                                             72.8%
  ExperimentFramework.Science.ServiceCollectionExtensions                                             100%
  ExperimentFramework.Science.Snapshots.InMemorySnapshotStore                                        90.1%
  ExperimentFramework.Science.Statistics.ChiSquareTest                                               79.1%
  ExperimentFramework.Science.Statistics.MannWhitneyUTest                                            97.3%
  ExperimentFramework.Science.Statistics.OneWayAnova                                                 98.4%
  ExperimentFramework.Science.Statistics.PairedTTest                                                 81.5%
  ExperimentFramework.Science.Statistics.TwoSampleTTest                                              88.4%

ExperimentFramework.StickyRouting                                                                    92.5%
  ExperimentFramework.StickyRouting.ExperimentBuilderExtensions                                       100%
  ExperimentFramework.StickyRouting.ServiceCollectionExtensions                                       100%
  ExperimentFramework.StickyRouting.StickyRoutingProvider                                            86.6%
  ExperimentFramework.StickyRouting.StickyTrialRouter                                                 100%

ExperimentFramework.Targeting                                                                         100%
  ExperimentFramework.Targeting.Configuration.TargetingSelectionModeHandler                           100%
  ExperimentFramework.Targeting.InMemoryTargetingConfiguration                                        100%
  ExperimentFramework.Targeting.ServiceCollectionExtensions                                           100%
  ExperimentFramework.Targeting.SimpleTargetingContext                                                100%
  ExperimentFramework.Targeting.TargetingProvider                                                     100%
  ExperimentFramework.Targeting.TargetingRules                                                        100%

@JerrettDavis JerrettDavis merged commit b5fe818 into main Jan 5, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Add .NET 8 and .NET 9 Support (Back-target .NET Standard 2.0 / 2.1 Where Possible)

3 participants